docs: 字符分類規則集 charClass(同步 main b821cd1)

使用文檔增「自定義字符分類:charClass」節(規則集擴充、英文全角句號 . 用例、向下兼容
與追加語義要點);changelog 增「字符分類規則集(2026-06-04)」。HTML 與 Markdown 孿生
同步、manifest 重建。
This commit is contained in:
2026-06-04 16:24:40 +08:00
parent 0f49ba8ecc
commit 309bc358a8
4 changed files with 70 additions and 76 deletions
+16 -38
View File
@@ -1,4 +1,4 @@
<!-- built with theme=dracula, mode=report, at=2026-06-02T18:02:11Z -->
<!-- built with theme=dracula, mode=report, at=2026-06-04T08:24:26Z -->
<!DOCTYPE html>
<html lang="zh-Hant">
<head>
@@ -876,39 +876,6 @@ jz-jinze {
text-decoration: inherit;
}
/* src/css/_lang.css */
:where(.juzhen:lang(zh-Hans)),
:where(.juzhen [lang]:lang(zh-Hans)) {
font-family:
"Noto Serif SC",
"Noto Serif CJK SC",
"Source Han Serif SC",
serif;
}
:where(.juzhen:lang(zh-Hant)),
:where(.juzhen [lang]:lang(zh-Hant)) {
font-family:
"Noto Serif TC",
"Noto Serif CJK TC",
"Source Han Serif TC",
serif;
}
:where(.juzhen:lang(zh-HK)),
:where(.juzhen [lang]:lang(zh-HK)) {
font-family:
"Noto Serif HK",
"Noto Serif CJK HK",
"Noto Serif TC",
serif;
}
:where(.juzhen:lang(ja)),
:where(.juzhen [lang]:lang(ja)) {
font-family:
"Noto Serif JP",
"Noto Serif CJK JP",
serif;
}
/* src/css/_spacing.css */
jz-hws {
margin-right: 0.25em;
@@ -930,8 +897,8 @@ jz-inner {
}
jz-char.jz-half jz-inner,
jz-char.jz-half-le jz-inner {
font-feature-settings: "halt" 1;
-webkit-font-feature-settings: "halt" 1;
font-feature-settings: "locl" 1, "halt" 1;
-webkit-font-feature-settings: "locl" 1, "halt" 1;
}
[data-jz-halfwidth=margin] jz-char.jz-half jz-inner,
[data-jz-halfwidth=margin] jz-char.jz-half-le jz-inner {
@@ -966,8 +933,8 @@ jz-char.jz-half-le jz-inner {
}
[data-jz-halfwidth=halt] jz-char.jz-half jz-inner,
[data-jz-halfwidth=halt] jz-char.jz-half-le jz-inner {
font-feature-settings: "halt" 1;
-webkit-font-feature-settings: "halt" 1;
font-feature-settings: "locl" 1, "halt" 1;
-webkit-font-feature-settings: "locl" 1, "halt" 1;
margin-left: 0;
}
[data-jz-halfwidth=halt] jz-char.jz-half,
@@ -2542,6 +2509,12 @@ main > *:nth-child(n+6) { animation-delay: 0.46s; }
<!-- BODY -->
<p class="lede">聚珍(Juzhen)/cjk-autospace 變更紀錄。<a href="./index.html">← 回文檔</a></p>
<h2>字符分類規則集 <span class="badge accent">2026-06-04</span></h2>
<h3>新增</h3>
<ul>
<li><strong>可配置字符分類(<code>charClass</code></strong>:把散落各 pass 之硬編碼分類(中文 CJK/西文 ANS/全寬標點 BD_* 子類)統一抽象為<strong>規則集</strong>,內置默認即現狀值,消費端經 <code>options.charClass</code><code>{ cjk?, western?, biaodian?:{stop,pause,open,close,middle,liga} }</code><strong>追加擴充</strong>,覆寫 <code>spacing</code><code>jiya</code><code>jinze</code> 之分類判定。動機:英文全角句號 <code></code>U+FF0E,異於中文句號 <code></code>)實證為未分類——不 charify/不挤/不補隙;以 <code>charClass:{biaodian:{stop:""}}</code> 即比照 <code></code><strong>向下兼容</strong>:不傳則行為與內置完全一致、各實例隔離(覆寫不污染默認)。v1 為追加語義(不重分類/移除內置);結構性 ASCII 不開放。<code>spacing</code> 之間隙正則改由規則集 per-instance 編譯。測試 66 通過(含 9 條 charClass)。</li>
</ul>
<h2>下游回饋修復批次 <span class="badge accent">2026-06-03</span></h2>
<p>聚焦 Peek.nvim 等下游回饋之原子透明與中西間隙正確性,皆以真實 Chromium 量測驗證(jsdom 之 TreeWalkeroffset 失真,不可信)。</p>
@@ -2645,6 +2618,11 @@ main > *:nth-child(n+6) { animation-delay: 0.46s; }
<script type="text/markdown" id="md-source">
# 變更紀錄(Changelog)— 聚珍(Juzhen)/cjk-autospace
## 字符分類規則集(2026-06-04
### 新增
- 可配置字符分類 charClass:硬編碼分類(中文/西文/全寬標點子類)統一抽象為規則集,內置默認,消費端經 options.charClasscjkwesternbiaodian{stop,pause,open,close,middle,liga})追加擴充,覆寫 spacingjiya/jinze 判定。例:英文全角句號 .(U+FF0E)預設未分類,以 biaodian.stop 歸全寬句末標點即比照 。。向下兼容(不傳則行為不變、實例隔離);v1 追加語義、不重分類內置;結構性 ASCII 不開放。spacing 間隙正則改由規則集 per-instance 編譯。測試 66 通過。
## 下游回饋修復批次(2026-06-03)
皆以真實 Chromium 量測驗證(jsdom 不可信)。
+11
View File
@@ -25,6 +25,12 @@
<!-- BODY -->
<p class="lede">聚珍(Juzhen)/cjk-autospace 變更紀錄。<a href="./index.html">← 回文檔</a></p>
<h2>字符分類規則集 <span class="badge accent">2026-06-04</span></h2>
<h3>新增</h3>
<ul>
<li><strong>可配置字符分類(<code>charClass</code></strong>:把散落各 pass 之硬編碼分類(中文 CJK/西文 ANS/全寬標點 BD_* 子類)統一抽象為<strong>規則集</strong>,內置默認即現狀值,消費端經 <code>options.charClass</code><code>{ cjk?, western?, biaodian?:{stop,pause,open,close,middle,liga} }</code><strong>追加擴充</strong>,覆寫 <code>spacing</code><code>jiya</code><code>jinze</code> 之分類判定。動機:英文全角句號 <code></code>U+FF0E,異於中文句號 <code></code>)實證為未分類——不 charify/不挤/不補隙;以 <code>charClass:{biaodian:{stop:""}}</code> 即比照 <code></code><strong>向下兼容</strong>:不傳則行為與內置完全一致、各實例隔離(覆寫不污染默認)。v1 為追加語義(不重分類/移除內置);結構性 ASCII 不開放。<code>spacing</code> 之間隙正則改由規則集 per-instance 編譯。測試 66 通過(含 9 條 charClass)。</li>
</ul>
<h2>下游回饋修復批次 <span class="badge accent">2026-06-03</span></h2>
<p>聚焦 Peek.nvim 等下游回饋之原子透明與中西間隙正確性,皆以真實 Chromium 量測驗證(jsdom 之 TreeWalkeroffset 失真,不可信)。</p>
@@ -112,6 +118,11 @@
<script type="text/markdown" id="md-source">
# 變更紀錄Changelog 聚珍Juzhencjk-autospace
## 字符分類規則集2026-06-04
### 新增
- 可配置字符分類 charClass硬編碼分類中文西文全寬標點子類統一抽象為規則集內置默認消費端經 options.charClasscjkwesternbiaodian{stop,pause,open,close,middle,liga}追加擴充覆寫 spacingjiyajinze 判定英文全角句號 U+FF0E預設未分類 biaodian.stop 歸全寬句末標點即比照 向下兼容不傳則行為不變實例隔離v1 追加語義不重分類內置結構性 ASCII 不開放spacing 間隙正則改由規則集 per-instance 編譯測試 66 通過
## 下游回饋修復批次2026-06-03
皆以真實 Chromium 量測驗證jsdom 不可信
+24 -38
View File
@@ -1,4 +1,4 @@
<!-- built with theme=dracula, mode=report, at=2026-06-02T18:02:11Z -->
<!-- built with theme=dracula, mode=report, at=2026-06-04T08:24:26Z -->
<!DOCTYPE html>
<html lang="zh-Hant">
<head>
@@ -876,39 +876,6 @@ jz-jinze {
text-decoration: inherit;
}
/* src/css/_lang.css */
:where(.juzhen:lang(zh-Hans)),
:where(.juzhen [lang]:lang(zh-Hans)) {
font-family:
"Noto Serif SC",
"Noto Serif CJK SC",
"Source Han Serif SC",
serif;
}
:where(.juzhen:lang(zh-Hant)),
:where(.juzhen [lang]:lang(zh-Hant)) {
font-family:
"Noto Serif TC",
"Noto Serif CJK TC",
"Source Han Serif TC",
serif;
}
:where(.juzhen:lang(zh-HK)),
:where(.juzhen [lang]:lang(zh-HK)) {
font-family:
"Noto Serif HK",
"Noto Serif CJK HK",
"Noto Serif TC",
serif;
}
:where(.juzhen:lang(ja)),
:where(.juzhen [lang]:lang(ja)) {
font-family:
"Noto Serif JP",
"Noto Serif CJK JP",
serif;
}
/* src/css/_spacing.css */
jz-hws {
margin-right: 0.25em;
@@ -930,8 +897,8 @@ jz-inner {
}
jz-char.jz-half jz-inner,
jz-char.jz-half-le jz-inner {
font-feature-settings: "halt" 1;
-webkit-font-feature-settings: "halt" 1;
font-feature-settings: "locl" 1, "halt" 1;
-webkit-font-feature-settings: "locl" 1, "halt" 1;
}
[data-jz-halfwidth=margin] jz-char.jz-half jz-inner,
[data-jz-halfwidth=margin] jz-char.jz-half-le jz-inner {
@@ -966,8 +933,8 @@ jz-char.jz-half-le jz-inner {
}
[data-jz-halfwidth=halt] jz-char.jz-half jz-inner,
[data-jz-halfwidth=halt] jz-char.jz-half-le jz-inner {
font-feature-settings: "halt" 1;
-webkit-font-feature-settings: "halt" 1;
font-feature-settings: "locl" 1, "halt" 1;
-webkit-font-feature-settings: "locl" 1, "halt" 1;
margin-left: 0;
}
[data-jz-halfwidth=halt] jz-char.jz-half,
@@ -2666,6 +2633,21 @@ createJuzhen({ lang: { default: "zh-Hant" } }).render(document.querySelector("ma
<p>預設 <code>jz-char</code><code>jz-jinze</code><code>inline-block</code>,作 <code>justify</code> 之單一對齊原子。但<strong>分頁器</strong>(如 Paged.js)之對齊引擎會把每個 inline-block 邊界當伸縮點、與 CJK inter-ideograph 疊加,於窄欄混排時字距失控、整段散架。此時設 <code>justifyAtoms: false</code>——<code>jz-char</code><code>jz-jinze</code><code>display:inline</code>(半形 <code>halt</code> 與禁則 <code>nowrap</code> 綁定均保留)。常規流式版面無需設定。</p>
<div class="callout warn"><span class="label">注意</span> <code>margin</code> 後備半形依賴 <code>inline-block</code><code>width:0.5em</code>),故 <code>justifyAtoms:false</code><code>margin</code> 模式不可兼得——分頁器場景請用含 <code>halt</code> 之字型。</div>
<h2>自定義字符分類:<code>charClass</code></h2>
<p>每個字符之分類(中文/西文、全寬標點各子類)抽象為<strong>規則集</strong>:內置默認即聚珍分類表,消費端經 <code>options.charClass</code> <strong>擴充</strong>,以覆寫 <code>spacing</code><code>jiya</code><code>jinze</code> 對特定字符之判定。語義為<strong>追加</strong>——把當前未分類字符或新符號歸入對應類。</p>
<pre><code>createJuzhen({
charClass: {
cjk: "", // 追加為中文:與西文邊界補間隙、禁則/justify 視為單字
western: "★☆", // 追加為西文(半寬標點亦歸此):與 CJK 邊界補間隙
biaodian: { // 追加為全寬標點,按子類:jiya charify/擠壓、禁則避頭尾
stop: "", // 句末(。!?類) pause 句內(,、;:類)
open: "", close: "", middle: "", liga: "",
},
},
});</code></pre>
<p><strong>典型用例</strong>:英文全角句號 <code></code>U+FF0E,異於中文句號 <code></code> U+3002)預設<strong>未分類</strong>——不 charify、不挤壓、與 CJK 間不補隙。以 <code>charClass:{ biaodian:{ stop:"" } }</code> 歸為全寬句末標點,即比照 <code></code> 處理(開明式挤半形、全角式佔全形、行首避頭尾)。</p>
<div class="callout"><span class="label">要點</span> <strong>向下兼容</strong>:不傳 <code>charClass</code> 時分類與行為與內置完全一致、且各實例隔離(覆寫不污染默認)。<strong>追加語義(v1</strong>:擴充內置類,不支援重分類/移除內置字符。結構性 ASCII(字母數字/運算符)為固定集、不開放。<code>margin</code> 模式下新增開/閉括號之墨色偏側可一併以 <code>jiya.bias</code> 指定。</div>
<h2>v1 向下相容</h2>
<pre><code>const cjk = createCjkAutospace({ pillSelector: "code, kbd" });
cjk.apply(document.body); // → render</code></pre>
@@ -2744,6 +2726,10 @@ JS 只注入 `jz-*` 結構,所有視覺尺寸在 juzhen.css,缺一不可。
`justifyAtoms: false` → jz-char/jz-jinze 改 display:inline,相容 Paged.js。margin 後備與 justifyAtoms:false 不可兼得。
## 自定義字符分類 charClass
字符分類(中/西文、全寬標點各子類)抽象為規則集,內置默認,消費端經 options.charClass 追加擴充,覆寫 spacingjiyajinze 之判定。`charClass: { cjk?, western?, biaodian?:{stop,pause,open,close,middle,liga} }`。例:英文全角句號 .(U+FF0E)預設未分類,以 biaodian.stop:"" 歸為全寬句末標點即比照 。處理。向下兼容(不傳則行為不變、實例隔離);v1 為追加語義,不重分類內置;結構性 ASCII 不開放。
## v1 相容
`createCjkAutospace(opts).apply(root)` 經相容層映射至 createJuzhen,零改動可跑。
+19
View File
@@ -149,6 +149,21 @@ createJuzhen({ lang: { default: "zh-Hant" } }).render(document.querySelector("ma
<p>預設 <code>jz-char</code><code>jz-jinze</code><code>inline-block</code>,作 <code>justify</code> 之單一對齊原子。但<strong>分頁器</strong>(如 Paged.js)之對齊引擎會把每個 inline-block 邊界當伸縮點、與 CJK inter-ideograph 疊加,於窄欄混排時字距失控、整段散架。此時設 <code>justifyAtoms: false</code>——<code>jz-char</code><code>jz-jinze</code><code>display:inline</code>(半形 <code>halt</code> 與禁則 <code>nowrap</code> 綁定均保留)。常規流式版面無需設定。</p>
<div class="callout warn"><span class="label">注意</span> <code>margin</code> 後備半形依賴 <code>inline-block</code><code>width:0.5em</code>),故 <code>justifyAtoms:false</code><code>margin</code> 模式不可兼得——分頁器場景請用含 <code>halt</code> 之字型。</div>
<h2>自定義字符分類:<code>charClass</code></h2>
<p>每個字符之分類(中文/西文、全寬標點各子類)抽象為<strong>規則集</strong>:內置默認即聚珍分類表,消費端經 <code>options.charClass</code> <strong>擴充</strong>,以覆寫 <code>spacing</code><code>jiya</code><code>jinze</code> 對特定字符之判定。語義為<strong>追加</strong>——把當前未分類字符或新符號歸入對應類。</p>
<pre><code>createJuzhen({
charClass: {
cjk: "", // 追加為中文:與西文邊界補間隙、禁則/justify 視為單字
western: "★☆", // 追加為西文(半寬標點亦歸此):與 CJK 邊界補間隙
biaodian: { // 追加為全寬標點,按子類:jiya charify/擠壓、禁則避頭尾
stop: "", // 句末(。!?類) pause 句內(,、;:類)
open: "", close: "", middle: "", liga: "",
},
},
});</code></pre>
<p><strong>典型用例</strong>:英文全角句號 <code></code>U+FF0E,異於中文句號 <code></code> U+3002)預設<strong>未分類</strong>——不 charify、不挤壓、與 CJK 間不補隙。以 <code>charClass:{ biaodian:{ stop:"" } }</code> 歸為全寬句末標點,即比照 <code></code> 處理(開明式挤半形、全角式佔全形、行首避頭尾)。</p>
<div class="callout"><span class="label">要點</span> <strong>向下兼容</strong>:不傳 <code>charClass</code> 時分類與行為與內置完全一致、且各實例隔離(覆寫不污染默認)。<strong>追加語義(v1</strong>:擴充內置類,不支援重分類/移除內置字符。結構性 ASCII(字母數字/運算符)為固定集、不開放。<code>margin</code> 模式下新增開/閉括號之墨色偏側可一併以 <code>jiya.bias</code> 指定。</div>
<h2>v1 向下相容</h2>
<pre><code>const cjk = createCjkAutospace({ pillSelector: "code, kbd" });
cjk.apply(document.body); // → render</code></pre>
@@ -211,6 +226,10 @@ JS 只注入 `jz-*` 結構,所有視覺尺寸在 juzhen.css,缺一不可。
`justifyAtoms: false` → jz-char/jz-jinze 改 display:inline,相容 Paged.js。margin 後備與 justifyAtoms:false 不可兼得。
## 自定義字符分類 charClass
字符分類(中/西文、全寬標點各子類)抽象為規則集,內置默認,消費端經 options.charClass 追加擴充,覆寫 spacingjiyajinze 之判定。`charClass: { cjk?, western?, biaodian?:{stop,pause,open,close,middle,liga} }`。例:英文全角句號 .(U+FF0E)預設未分類,以 biaodian.stop:"" 歸為全寬句末標點即比照 。處理。向下兼容(不傳則行為不變、實例隔離);v1 為追加語義,不重分類內置;結構性 ASCII 不開放。
## v1 相容
`createCjkAutospace(opts).apply(root)` 經相容層映射至 createJuzhen,零改動可跑。