From 2d42c7ecf2075c1c292cc5c44993a04e1611f046 Mon Sep 17 00:00:00 2001 From: commilitia Date: Mon, 1 Jun 2026 21:31:07 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=81=9A=E7=8F=8D=E5=88=87=E7=89=87=20?= =?UTF-8?q?1=20=E2=80=94=20=E4=B8=AD=E8=A5=BF=E9=96=93=E9=9A=99=EF=BC=8F?= =?UTF-8?q?=E6=A8=99=E9=BB=9E=E6=93=A0=E5=A3=93=EF=BC=8F=E7=A6=81=E5=89=87?= =?UTF-8?q?=20+=20v1=20=E7=9B=B8=E5=AE=B9=E5=B1=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 從零重寫之第一垂直切片(依 ARCHITECTURE.md 契約),涵蓋並超越 v1 全部功能。 核心基座(src/core):unicode 字元表+標點子類+字形側位;locale 語言與 全角/開明政策(全域 lang.style +逐 lang policy);dom(jz-* 工廠+可還原 標記);finder 遍歷引擎(avoid/scope.include/邏輯 run/pill 鄰字/分塊閘); pass 聚合管線。 功能 pass(src/typeset): - spacing:中西間隙採 margin 模型——包裹邊界左側字、以 margin-right 留隙, 不注入空白字元(textContent 完全不變、複製緊湊、justify 不暴增、不撐框、 行首乾淨)。含跨樣式邊界、pill、原檔空格移除。 - gapTrim(lineedge):layout pass,行末去隙,修正 justify 右緣內縮。 - longword:長英文詞 + hyphens。 - jiya:標點 charify + 全角/開明/半角(全域 + 逐 lang);半形以字型 OpenType halt 渲染(按字形正確定位、不重疊,居中字形 !? 與繁體 locl 句逗點號皆正確); 行內連續擠壓。 - jinze:行首行末避頭尾(閉類/點號綁前字、開類綁後字,以詞元為邊界、長引文 中段可斷);亦為 justify 綁定載體。 - lineedge:行端擠壓 layout pass(括號引號;ResizeObserver 重算,瀏覽器專用)。 §8 justify:jz-char inline-block 原子,句末標點單份間距。 v1 相容層(compat/v1):createCjkAutospace().apply 映射,IIFE 全域別名。 構建:esbuild → ESM/IIFE/CSS;tsc → d.ts。測試:39 個 jsdom 案例。 demo:簡繁並列+justify+強制繁體開明+標點寬度量測,載 Noto webfont 作參考 (擠壓依賴字型 halt)。間隔號 · 不觸發中西間隙;200% 等詞元不被禁則切斷。 --- ARCHITECTURE.md | 84 +- README.md | 139 ++++ build.mjs | 68 ++ demo/index.html | 175 ++++ dist/compat/v1.d.ts | 29 + dist/core/dom.d.ts | 25 + dist/core/finder.d.ts | 60 ++ dist/core/locale.d.ts | 29 + dist/core/pass.d.ts | 5 + dist/core/unicode.d.ts | 41 + dist/index.d.ts | 12 + dist/juzhen.css | 79 ++ dist/juzhen.iife.js | 1462 ++++++++++++++++++++++++++++++++++ dist/juzhen.mjs | 1436 +++++++++++++++++++++++++++++++++ dist/types.d.ts | 119 +++ dist/typeset/jinze.d.ts | 2 + dist/typeset/jiya.d.ts | 3 + dist/typeset/lineedge.d.ts | 3 + dist/typeset/longword.d.ts | 2 + dist/typeset/spacing.d.ts | 2 + package-lock.json | 1335 +++++++++++++++++++++++++++++++ package.json | 43 + src/compat/v1.ts | 96 +++ src/core/dom.ts | 136 ++++ src/core/finder.ts | 332 ++++++++ src/core/locale.ts | 84 ++ src/core/pass.ts | 94 +++ src/core/unicode.ts | 120 +++ src/css/_jinze.css | 10 + src/css/_jiya.css | 32 + src/css/_lang.css | 30 + src/css/_normalize.css | 30 + src/css/_spacing.css | 20 + src/css/juzhen.css | 9 + src/index.ts | 145 ++++ src/types.ts | 146 ++++ src/typeset/jinze.ts | 161 ++++ src/typeset/jiya.ts | 149 ++++ src/typeset/lineedge.ts | 196 +++++ src/typeset/longword.ts | 62 ++ src/typeset/spacing.ts | 280 +++++++ test/diag.mjs | 35 + test/helpers.mjs | 26 + test/juzhen.test.mjs | 318 ++++++++ test/spacing-detail.test.mjs | 80 ++ tsconfig.json | 20 + 46 files changed, 7737 insertions(+), 27 deletions(-) create mode 100644 README.md create mode 100644 build.mjs create mode 100644 demo/index.html create mode 100644 dist/compat/v1.d.ts create mode 100644 dist/core/dom.d.ts create mode 100644 dist/core/finder.d.ts create mode 100644 dist/core/locale.d.ts create mode 100644 dist/core/pass.d.ts create mode 100644 dist/core/unicode.d.ts create mode 100644 dist/index.d.ts create mode 100644 dist/juzhen.css create mode 100644 dist/juzhen.iife.js create mode 100644 dist/juzhen.mjs create mode 100644 dist/types.d.ts create mode 100644 dist/typeset/jinze.d.ts create mode 100644 dist/typeset/jiya.d.ts create mode 100644 dist/typeset/lineedge.d.ts create mode 100644 dist/typeset/longword.d.ts create mode 100644 dist/typeset/spacing.d.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 src/compat/v1.ts create mode 100644 src/core/dom.ts create mode 100644 src/core/finder.ts create mode 100644 src/core/locale.ts create mode 100644 src/core/pass.ts create mode 100644 src/core/unicode.ts create mode 100644 src/css/_jinze.css create mode 100644 src/css/_jiya.css create mode 100644 src/css/_lang.css create mode 100644 src/css/_normalize.css create mode 100644 src/css/_spacing.css create mode 100644 src/css/juzhen.css create mode 100644 src/index.ts create mode 100644 src/types.ts create mode 100644 src/typeset/jinze.ts create mode 100644 src/typeset/jiya.ts create mode 100644 src/typeset/lineedge.ts create mode 100644 src/typeset/longword.ts create mode 100644 src/typeset/spacing.ts create mode 100644 test/diag.mjs create mode 100644 test/helpers.mjs create mode 100644 test/juzhen.test.mjs create mode 100644 test/spacing-detail.test.mjs create mode 100644 tsconfig.json diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 9c6095d..6b00a6f 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -76,8 +76,9 @@ jz.revert(root?); // 還原 ``` { - // 全域 - lang: { default: "zh-Hant", policy: { "zh-Hant": "quanjiao", "zh-Hans": "kaiming" } }, + // 全域。style = 全域擠壓預設(quanjiao|kaiming|banjiao);policy = 逐 lang + // 覆寫。優先序:policy[lang] > style > 內建預設(繁→全角、簡→開明)。 + lang: { default: "zh-Hant", style: "kaiming", policy: { "zh-Hant": "quanjiao" } }, classPrefix: "jz", // 作用域限定(§3.6) @@ -313,13 +314,28 @@ class 約定:`bd`(標點)、`bd-open/close/cop/stop/sep/liga`、`cjk`、`j - **Han**:插入 `