聚珍(Juzhen)/cjk-autospace 變更紀錄。← 回文檔
下游回饋修復批次 2026-06-03
聚焦 Peek.nvim 等下游回饋之原子透明與中西間隙正確性,皆以真實 Chromium 量測驗證(jsdom 之 TreeWalker/offset 失真,不可信)。
修復
- 原子透明(段落繼承屬性漏溢):
jz-*inline-block 原子對消費端段落樣式透明——歸零會被原子重複套用之text-indent/hanging-punctuation(過套用),並令原子text-decoration: inherit以接續段落下劃線(欠套用)。段落首行縮排正常、下劃線連續不斷,消費端無需配置。 - 中西間隙 ·
gapTrim自我應驗:行末去隙原依「後字是否在更低行」判定,而後字落點受間隙自身(及下游間隙)之margin推擠,致行中間隙被誤 trim——表現為容器寬相關之「最後一個間隙消失」、行內codepill 跨行時右側間隙消失。改為「起始全部 trim、由左至右逐一定案」,量測不受任何margin污染。 - 中西間隙 · 西文字集完整化:補入貨幣符號(
€等 U+20A0–20BF)、拉丁擴充 A/B(拼音聲調 ā ǎ ē)、西里爾、數學運算符,並把希臘補全至含 α-ω。鄰接 CJK 之手工空格遂正規化、邊界補隙。列舉法以\uXXXX表示、無需 regex flag,相容 2016/Windows 10 時代瀏覽器。 - 標點誤隙:全角省略號 …… 後接 CJK 不再誤補隙(
DOTS_CJK移除|…);收尾彎引號 ” 後接拉丁/數字不再補隙(移除 panguQUOTE_AN偏例,與 」』)》】〕 等所有收尾標點一致)。全部常用中文標點 × 簡繁共 104 例稽核,CJK 間皆 0 誤隙。
變更
- 字型移出聚珍管理:字型屬消費端領域,聚珍不再內建任何
font-family/字型堆疊(移除_lang.css,dist/juzhen.css零字型規則)。逐語言字型完全由消費端 CSS 設定(範式見文檔「字型與 locl」)。聚珍僅守三項非管理性本分:jz-* { font: inherit }使原子繼承消費端字型、不強加;半形font-feature-settings顯式併入"locl" 1(連同halt)確保泛 CJK 字型之地域標點字形不因設 halt 而失;render 只讀不改lang。halt/margin 兩模式皆已驗證字型繼承與 locl 正常。
工具
demo/resize-check.html:可拖曳容器檢查頁——拖動方框寬度,驗證中西間隙在各寬度下恆穩、標點無誤隙;可切justify與「顯示間隙」描邊。
v2 切片 1 · 增補 2026-06
切片 1 之上的修補與強化,聚焦標點半形對缺 halt 字型之支援,及下游回饋之邊界/分頁器修復。
新增
- 標點半形
margin後備模式(缺 OpenTypehalt之字型):jiya.halfWidth: "halt"(預設)|"margin"。margin以width:0.5em+字身依墨色偏側溢出定位,於 CSS 盒模型重現halt之半形 advance(真 0.5em;相鄰標點各 0.5em、合佔 1em,無負 margin 之鄰接疊加/單側重疊)。模式由data-jz-halfwidth子樹屬性決定,可逐區塊/逐lang(含 halt-island 反置)。 - 字形偏側表
inkBias:依字身墨色中心給left/center/right/full;彎引號/角括號/尖括號偏一側、圓方括號近中。參考表據方正書宋 GBK 實測,可經jiya.bias逐lang逐字覆寫。 - 字型適配工具與工作流:
tools/measure-bias.py(量 glyph ink 中心、產偏側建議表)+文檔之「字型適配工作流」。demo/fallback.html:方正書宋 GBK 對照 halt 失效 vs margin 生效。 justifyAtoms選項:預設true;設false時jz-char/jz-jinze改display:inline,相容分頁器(Paged.js)之對齊引擎(halt半形與禁則nowrap保留)。
修復
- 字型不覆寫消費端:
_lang.css之 Noto 字型堆疊改為純後備——全包:where()零特異度、只命中帶lang屬性之元素、不直接覆寫標點字面容器jz-inner。消費端font-family恆優先,標點隨之以消費端字型渲染(修正先前標點被強制換成 Noto 之缺陷)。 - pill 緊鄰標點之左緣間隙:
adjacentLogicalChar透明穿越jz-jinze(同jz-hws/樣式行內)→ pill 後接 CJK 標點時,左緣jz-hws與作者空格剝除復原。 - CJK↔CJK 贅餘作者空格:含跨 inline 標籤者一律剝除、不留隙,與 CJK↔西文之邊界正規化一致(全形空格 U+3000 不動)。
已知限制
margin後備半形依賴inline-block(width:0.5em),與justifyAtoms:false不可兼得——分頁器場景請用含halt之字型。margin偏側為三檔量化(0/0.25/0.5em)之近似;字形極端者須以jiya.bias逐字微調。
v2.0.0 切片 1 · 從零重寫
依 ARCHITECTURE.md 契約,從零重寫為「現代簡/繁中文網頁排版套件」。倉庫名 cjk-autospace 不變;公開 API 為 createJuzhen /全域 Juzhen;自訂元素前綴 jz-。v1 完整保留於 v1-autospace 分支。
新增
- 核心引擎:
finder(遍歷/avoid/scope.include/邏輯 run/pill 鄰字/分塊閘featureEnabledFor)、unicode(字元表+標點子類+字形側位)、locale(語言分類+全角/開明政策)、dom(jz-*工廠+可還原標記)、pass聚合管線。 - 中西間隙(margin 模型):包裹邊界左側字、以
margin-right留隙,不注入空白字元 →textContent完全不變、複製緊湊、justify不暴增、不撐框、行首乾淨。gapTrimlayout pass 行末去隙以齊右。 - 標點擠壓:全角式/開明式/半角式,三機制(baseline 政策+行內連續擠壓+行端擠壓)。半形以字型 OpenType
halt渲染。全域lang.style+逐langpolicy。 - 禁則(避頭尾):閉類/點號綁前一字、開類綁後一字,以詞元為邊界、長引文中段可斷;兼作
justify綁定。 - 長英文詞:
<span lang>+hyphens原生斷詞。 - justify 句末單份間距:
jz-charinline-block 原子化。 - v1 相容層:
createCjkAutospace().apply()映射;IIFE 全域別名。 - 構建/測試:esbuild(ESM/IIFE/CSS)+ tsc(d.ts);jsdom 測試;
demo/簡繁並列+justify+標點寬度量測。
相對 v1 之改進
- 中西間隙複製乾淨(
textContent不變;v1 之<span>真實空格會被選取)。 - 擠壓由「
halt套整段=半角式」進化為依lang之全角/開明/半角,且加入行內連續與行端擠壓。 - 新增禁則避頭尾、justify 句末單份間距、跨瀏覽器一致策略與顯式禁用層。
v1(cjk-autospace) · v1-autospace 分支
Pangu.js v7.2.1 風格之 CJK↔Latin 邊界自動間距 shim,工廠 createCjkAutospace(options).apply(root)。
- Pass A:跨樣式邊界中西間隙(marker span 含真實空格 +
user-select:none)。 - Pass B:pill(
code/kbd)邊界間隙。 - Pass C:長英文詞
<span lang>+hyphens。 - Pass D:開明式標點擠壓(句內點號
font-feature-settings:"halt"半形)。