import type { Finder } from "./core/finder.js"; import type { LangClass, LocaleConfig, PunctStyle } from "./core/locale.js"; export type { LangClass, PunctStyle }; /** 長英文詞包裝設定。 */ export interface LongWordOptions { minLength?: number; lang?: string; } /** 分塊功能選擇:選擇器 → 該塊內生效之功能集(覆寫全域)。 */ export interface BlockRule { selector: string; features: string[]; } /** createJuzhen 之公開選項。所有欄位皆可選;預設見 normalizeOptions。 */ export interface JuzhenOptions { /** 語言與全角/開明政策。 */ lang?: { /** 無 lang 祖先時之預設語言標籤(預設 "zh-Hant")。 */ default?: string; /** 全域標點擠壓預設:quanjiao(全角式)|kaiming(開明式)| * banjiao(半角式)。覆寫內建逐語言預設,可被 policy 逐 lang 覆寫。 */ style?: PunctStyle; /** 逐 lang 覆寫(最高優先)。 */ policy?: Partial>; }; /** 間隙標記沿用之 class(v1 相容;預設無額外 class)。 */ autospaceClass?: string; /** 作用域限定(§3.6)。 */ scope?: { root?: Element | string; include?: string | null; avoid?: string; }; spacing?: boolean; longWord?: boolean | LongWordOptions; jiya?: boolean; jinze?: boolean; hanging?: boolean; biaodian?: boolean; emphasis?: boolean; ruby?: boolean; /** 分塊功能選擇(§3.6)。 */ blocks?: BlockRule[]; styleInlines?: string[]; blockTags?: string[]; skipTags?: string[]; pillSelector?: string; skipAttribute?: string; isSkipped?: (node: Node) => boolean; } /** 正規化後之內部選項。 */ export interface ResolvedOptions { locale: LocaleConfig; autospaceClass: string; scope: { root: Element | string | null; include: string | null; avoid: string | null; }; features: { spacing: boolean; longWord: boolean; jiya: boolean; jinze: boolean; hanging: boolean; biaodian: boolean; emphasis: boolean; ruby: boolean; }; longWord: { minLength: number; lang: string; }; blocks: BlockRule[]; finder: { styleInlines: Set; blockTags: Set; skipTags: Set; pillSelector: string; skipAttribute: string | null; isSkipped: ((node: Node) => boolean) | null; }; } /** render/revert 之統一上下文(§3.3)。 */ export interface RenderContext { root: Element; options: ResolvedOptions; finder: Finder; } /** * charify 階段之包裝請求:把 node.data[start, end) 包進 build() 造出之元素。 * 同階段各 pass 之請求須互不重疊(標點/字母段天然不交集)。 */ export interface WrapRequest { start: number; end: number; build: (text: string) => HTMLElement; pass: string; } /** pass 種類。 */ export type PassKind = "charify" | "standalone"; interface BasePass { name: string; order: number; kind: PassKind; enabled: (options: ResolvedOptions) => boolean; revert: (ctx: RenderContext) => void; } /** 共享 P1 走訪之字元包裝 pass。 */ export interface CharifyPass extends BasePass { kind: "charify"; collect: (node: Text, ctx: RenderContext) => WrapRequest[]; } /** 自跑走訪/版面後處理之 pass。 */ export interface StandalonePass extends BasePass { kind: "standalone"; render: (ctx: RenderContext) => void; } export type Pass = CharifyPass | StandalonePass;