79fee8481f
實 Chromium 定位並修復下游回饋(Peek.nvim,commit 96f5ac3 基線)之全部間隙問題,
另完成現代漢語標點之誤隙稽核。jsdom 不可信(TreeWalker/offset 失真),結論均以
真實 Chromium 量測。
B 全角省略號誤隙:DOTS_CJK 之 alternation `|…` 誤把全角省略號 U+2026 納入,致
`……` 後接 CJK 冒出中西隙。移除 `|…`,僅留 ASCII `...`。
C+E gapTrim 自我應驗誤判(容器寬相關「最後一個間隙消失」、pill 跨行右隙消失):
間隙之 margin-right 參與斷行;依「後字是否在更低行」判行末,而後字落點又被
margin 推擠 → 間隙自身 margin 把後字擠到次行 → 判行末 → trim 去 margin → 後字
回同行,自相矛盾、卡死於「已 trim、後字同行、間隙消失」。污染雙向:下游間隙之
margin 亦令夾在中間之內容放不下其行。修法:trimGaps 改「起始全部 trim、由左至右
逐一定案」——量測時前方已定案、自身與其後皆 trim,後字落點不受任何 margin 污染。
以 lastRect 為準兼顧跨行 pill。實測 8–22em(ragged/justify)偽 trim 歸零、真行末
仍 trim(justify 齊右不變)。
D 西文字集完整化(列舉法,2016/Windows 10 相容、\uXXXX 無需 flag):補入貨幣
U+20A0–20BF(€ 等)、拉丁擴充 A/B(拼音聲調 ā ǎ ē)、西里爾、數學運算符
U+2200–22FF;並把希臘由原 U+0370–037D 補全至整塊(原漏 α-ω 本身)。€ 鄰接 CJK
之手工空格遂正規化、邊界補隙。
標點稽核:實 Chromium 全部常用中文標點 × 簡繁共 104 例,CJK 間皆 0 誤隙。修正
唯一偏例——收尾彎引號 `”`(pangu QUOTE_AN 令其後接拉丁/數字補隙,為唯一會補隙
之收尾標點,與 」』)》】〕 不一致;clreq 下全角收尾標點字身已含右側留白)。移除
QUOTE_AN。
- src/core/unicode.ts:WEST_SHARED 列舉補全(\uXXXX、區塊註記)。
- src/typeset/spacing.ts:DOTS_CJK 去 `|…`;移除 QUOTE_AN。
- src/typeset/lineedge.ts:trimGaps 起始全 trim、左→右逐一定案;新增 lastRect。
- test/juzhen.test.mjs:B/D/標點稽核/彎引號 回歸(56 測試通過)。
- demo/resize-check.html:可拖曳容器檢查頁(各寬度間隙穩定性、標點無誤隙)。
- README.md 目視驗證、ARCHITECTURE.md §6.1/§6.1a 自我應驗/§6.1b 標點稽核。
- dist/ 重建(juzhen.css 不變,僅 JS 邏輯)。
53 lines
2.8 KiB
TypeScript
53 lines
2.8 KiB
TypeScript
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 ANY_CJK: RegExp;
|
||
/** CJK 之後可接間隙之西文集(含 @)。 */
|
||
export declare const ANS_AFTER_CJK: string;
|
||
/** CJK 之前可接間隙之西文集(去 @)。 */
|
||
export declare const ANS_BEFORE_CJK: string;
|
||
/** 句末點號:。!?(開明式與全角式皆保持全形,不擠壓)。 */
|
||
export declare const BD_STOP = "\u3002\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";
|
||
/** 全體標點字元(供 charify 走訪偵測)。 */
|
||
export declare const BD_ALL: string;
|
||
/**
|
||
* 將單一標點字元歸入其 bd-* 子類;非標點回傳 null。
|
||
* 供 jiya 之 charify 為 jz-char 標記 class。
|
||
*/
|
||
export declare function classifyBiaodian(ch: string): string | null;
|
||
/** 全體 bd-* 子類名(DOM 端讀取 jz-char 之 bd class 用)。 */
|
||
export declare const BD_CLASS_NAMES: readonly ["bd-stop", "bd-pause", "bd-open", "bd-close", "bd-middle", "bd-liga"];
|
||
/**
|
||
* 標點之「可壓縮空白」側(橫排)。字面偏左者空白在右(句內/句末/閉類),
|
||
* 開類字面偏右、空白在左。間隔號/連接號不壓縮。擠壓即收掉對應側之半形空白。
|
||
*/
|
||
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;
|