754b00da42
段末行 CJK 實義字數 ≥ N(預設 2;標點/符號不計)。standalone 段落級 pass:
自段末向前數 N 個實義字,把「第 N 字起至段末」(含其間/尾隨標點)包入
<jz-orphan>(white-space:nowrap)。該整體不可斷 → 末行恒含之 ⇒ 末行實義字 ≥ N,
任意寬度/字型/瀏覽器成立,無需量測 layout。
要點:
- 邊界字定位跨 jz-jinze/行內元素攀爬:實義字落於行內元素內時綁定整個塊級
直接子(不切割 nowrap 群、revert 乾淨);僅裸文本直接子才精確切分(最小綁定)。
- 僅處理葉段落(無塊級後代);段落實義字 < N 不綁;單行段方案 C 本就無害。
- 選項 orphan?: boolean | { chars? };**預設開 chars=2**(§6.5.6 建議);
下游可 orphan:false 關閉。段落級,data-jz-level=text 子樹自動跳過。
- order=70:jinze(40)/spacing(50)/longWord(60) 後、layout pass(90/92) 前。
新增 _orphan.css(jz-orphan{white-space:nowrap});JzTag 加 jz-orphan。
9 項單元測試(末 N+尾標點、chars 選項、標點不計、實義字<N 不綁、跨 jinze、
關閉、冪等、revert、段落級閘)。共 85 測試全綠。
窄容器拖動「末行恒 ≥N」之 layout 驗證留待 demo(Step 4-5,瀏覽器)。
26 lines
1.3 KiB
TypeScript
26 lines
1.3 KiB
TypeScript
/** jz-* 自訂元素名(皆含連字號,合法 custom element,預設 inline)。 */
|
|
export type JzTag = "jz-hws" | "jz-char" | "jz-inner" | "jz-cs" | "jz-jinze" | "jz-orphan" | "jz-em" | "jz-ruby" | "jz-rb" | "jz-rt";
|
|
type JzKind = "marker" | "wrap";
|
|
export interface CreateOptions {
|
|
/** 追加之 class(空白分隔或陣列)。 */
|
|
classes?: string | string[];
|
|
/** 文本內容。 */
|
|
text?: string;
|
|
/** 其餘屬性。 */
|
|
attrs?: Record<string, string>;
|
|
}
|
|
/** 造一個帶 pass 標記之 jz-* 元素。 */
|
|
export declare function createJz(tag: JzTag, pass: string, kind: JzKind, opts?: CreateOptions): HTMLElement;
|
|
/** 造一個 copy-clean 間隙標記(內含真實空白,user-select 由 CSS 關閉)。 */
|
|
export declare function createMarker(tag: JzTag, pass: string): HTMLElement;
|
|
/**
|
|
* 還原某 pass 之全部產物(I6)。以 data-jz 定址,逆文件序處理(先內層後
|
|
* 外層),marker 移除、wrap 解包,最後 normalize 受影響父節點合併文本。
|
|
*/
|
|
export declare function revertPass(pass: string, root: ParentNode): void;
|
|
/** 讀取 jz-char 之 bd-* 子類(無則 null)。 */
|
|
export declare function bdClassOf(el: Element): string | null;
|
|
/** 該元素是否為某/任一 pass 之 jz 產物。 */
|
|
export declare function isJz(node: Node | null, pass?: string): boolean;
|
|
export {};
|