Files
cjk-autospace/dist/core/unicode.d.ts
T
admin 30a11b5d6e refactor: 專案整理階段一——確認缺陷修復(jinze 冪等/pill 自身 avoid)+死代碼清理
下游審計(4 路並行測繪 + 逐條源碼複驗)之階段一:落地已複驗確認之缺陷與低風險
清理;架構統一(透明判定單一真相源)與文檔重整留待階段二/三。

修復(複驗確認):
・jinze 二次 render(未 revert)產生巢狀 jz-jinze、違反 I6 冪等——守衛改判 parent
  自身即本 pass 產物(isJz(parent, PASS)),已綁定內容不再重包(實測 jz-jinze 3→6 已修)。
・processPills 漏檢 avoidsSelf——自身命中 avoid(如 <code data-jz-skip>)之 pill 仍被補
  間隙(isAvoided 只查祖先、不含自身,同「下游問題六」型)。processPills + root 自處理
  分支補 avoidsSelf 檢查。
・三分類互斥:CODE/KBD 自 DEFAULT_SKIP_TAGS 移除——二者已由預設 pillSelector
  "code, kbd" 以 pill 機制涵蓋(內部不可見+兩端補隙+斷 run/相鄰),再列 skipTags 致
  同元素既 pill 又 avoid、pill 兩端間隙被 avoid 抹掉(違反互斥,且令上一項修復誤傷普通
  code)。移除後普通 code 為純 pill、正常補隙;唯自身 data-jz-skip 者不補(即上項修復)。

清理:
・刪零引用死代碼 createMarker/ANY_CJK/BD_ALL/BD_CLASS_NAMES/CreateOptions.attrs;
  isJz 由 jinze 冪等守衛啟用、脫離死代碼。
・死旗標 biaodian/emphasis/ruby 補 @reserved 註記(比照 hanging;點明與
  charClass.biaodian 撞名異義,避免混淆)。
・JzKind 補註 data-jz-kind 第三值 "splitoff"(split.ts 直接設、不經 createJz);
  longWord/orphan 冗餘 ===false 特判簡化(feature() 已對 false 回 false)。

複驗後重新定性(不照單全收):
・jinze 跨透明元素邊界避頭尾漏綁(你好<strong>。世界</strong> 之句末點號漏綁)——**真
  缺陷**,但正解須改 jinze 之父級處理模型(穿越透明包裹上攀評估跨層綁定),與階段二
  「透明判定單一真相源」一併處理更穩;forbiddenBreak 下探草稿已還原、缺口以註解標記。
・lineedge edgeRect 攀穿 isolate——**非缺陷**:edgeRect 為物理版面測量(getClientRects),
  isolate 斷的是邏輯 run/相鄰,其內部字元之物理行首/行尾判定須跨 <mark> 找真實相鄰
  內容(否則「文字<mark>「引」</mark>」之 「 誤判行首而錯收左半)。初評誤判、已還原並補註。

新增 3 回歸測試(jinze 冪等、預設 code 為 pill 非 skipTags、自身 avoid 之 pill 不補隙);
119 測試全綠、tsc + esbuild 構建乾淨。
2026-07-07 20:28:11 +08:00

83 lines
4.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import type { LangClass } from "./locale.js";
/** CJK 表意文字/假名/注音等範圍(沿用並擴充 v1 之 PANGU_CJK)。 */
export declare const CJK: string;
/** 西文字母與數字。 */
export declare const ALNUM = "A-Za-z0-9";
/** 西文字母。 */
export declare const ALPHA = "A-Za-z";
/** CJK 之後可接間隙之西文集(含 @)。 */
export declare const ANS_AFTER_CJK: string;
/** CJK 之前可接間隙之西文集(去 @)。 */
export declare const ANS_BEFORE_CJK: string;
/** 句末點號:。.!?(開明式與全角式皆保持全形,不擠壓;banjiao 擠半)。
* 含全角句點 .(U+FF0E,異於表意句號 。U+3002)——實測 Noto CJK SCTC 皆有 halt、
* 挤壓收 0.5em,故與 。!? 同列為句末點號(下游回饋)。 */
export declare const BD_STOP = "\u3002\uFF0E\uFF01\uFF1F";
/** 句內點號:,、;:(開明式擠成半形;全角式保持全形)。 */
export declare const BD_PAUSE = "\uFF0C\u3001\uFF1B\uFF1A";
/** 開始括號/引號:「『(《〈【〖〔[{“‘。 */
export declare const BD_OPEN = "\u300C\u300E\uFF08\u300A\u3008\u3010\u3016\u3014\uFF3B\uFF5B\u201C\u2018";
/** 結束括號/引號:」』)》〉】〗〕]}”’。 */
export declare const BD_CLOSE = "\u300D\u300F\uFF09\u300B\u3009\u3011\u3017\u3015\uFF3D\uFF5D\u201D\u2019";
/** 間隔/分隔號:·・‧。 */
export declare const BD_MIDDLE = "\u00B7\u30FB\u2027";
/** 連續省略/破折:…—。 */
export declare const BD_LIGA = "\u2026\u2014";
/** 全寬標點之六子類鍵。 */
export type BdSubclass = "stop" | "pause" | "open" | "close" | "middle" | "liga";
/**
* 字符分類規則集(§4.2):把「中文/西文/全寬標點各子類」各表為 regex 字元類片段。
* 各 passspacing 之 CJKANS 正則、jiya 之 classifyBiaodian、jinze 之 anyCjk)皆由此
* 取分類,不再各自硬編碼。內置默認見 DEFAULT_RULESET;消費端經 options.charClass 擴充
* resolveRuleset)。
*/
export interface Ruleset {
/** 中文(CJK 表意/假名/注音等)——中西間隙之「中」側、禁則/justify 原子。 */
cjk: string;
/** 西文,CJK 之後可接隙者(含 @)。 */
ansAfter: string;
/** 西文,CJK 之前可接隙者(去 @)。 */
ansBefore: string;
/** 全寬標點,按子類——jiya charify/擠壓、禁則避頭尾、行端。 */
biaodian: Record<BdSubclass, string>;
}
/** 消費端字符分類覆寫(追加語義;見 README「自定義字符分類」)。 */
export interface CharClassOverride {
/** 追加為中文(CJK)。 */
cjk?: string;
/** 追加為西文(半寬標點亦歸此,按西文處理間隙);併入 ansAfteransBefore。 */
western?: string;
/** 追加為全寬標點,按子類。 */
biaodian?: Partial<Record<BdSubclass, string>>;
}
/** 內置默認規則集(即現狀硬編碼值)。 */
export declare const DEFAULT_RULESET: Ruleset;
/**
* 合併消費端覆寫,回傳最終規則集。v1 為**追加**語義:把 override 字元併入內置對應類
* (未分類字符→歸類、新符號→納入)。不傳則回傳 DEFAULT_RULESET(零行為變更)。
*/
export declare function resolveRuleset(override?: CharClassOverride): Ruleset;
/**
* 將單一標點字元歸入其 bd-* 子類;非標點回傳 null。供 jiya charify 標記 class。
* biaodian 取自規則集(預設 DEFAULT_RULESET.biaodian,向下兼容無參數呼叫)。
*/
export declare function classifyBiaodian(ch: string, biaodian?: Record<BdSubclass, string>): string | null;
/**
* 標點之「可壓縮空白」側(橫排)。字面偏左者空白在右(句內/句末/閉類),
* 開類字面偏右、空白在左。間隔號/連接號不壓縮。擠壓即收掉對應側之半形空白。
*/
export declare function blankSides(bdClass: string | null): {
left: boolean;
right: boolean;
};
/** 字形墨色偏側。 */
export type Bias = "left" | "center" | "right" | "full";
/** 逐 lang 逐字之偏側覆寫表(消費端傳入,覆寫參考預設)。 */
export type BiasTable = Partial<Record<LangClass, Record<string, Bias>>>;
/**
* 解析標點字元在某語言下之墨色偏側(margin 後備模式用)。
* 優先序:消費端 overrides[langClass][ch] 括號表 內建點號參考表。
* 非可壓縮標點(間隔/連接號等)回傳 null(margin 模式不收)。
*/
export declare function inkBias(ch: string, langClass: LangClass, overrides?: BiasTable): Bias | null;