docs: 字符分類規則集 charClass(同步 main b821cd1)
使用文檔增「自定義字符分類:charClass」節(規則集擴充、英文全角句號 . 用例、向下兼容 與追加語義要點);changelog 增「字符分類規則集(2026-06-04)」。HTML 與 Markdown 孿生 同步、manifest 重建。
This commit is contained in:
+16
-38
@@ -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 之 TreeWalker/offset 失真,不可信)。</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.charClass(cjk/western/biaodian{stop,pause,open,close,middle,liga})追加擴充,覆寫 spacing/jiya/jinze 判定。例:英文全角句號 .(U+FF0E)預設未分類,以 biaodian.stop 歸全寬句末標點即比照 。。向下兼容(不傳則行為不變、實例隔離);v1 追加語義、不重分類內置;結構性 ASCII 不開放。spacing 間隙正則改由規則集 per-instance 編譯。測試 66 通過。
|
||||
|
||||
## 下游回饋修復批次(2026-06-03)
|
||||
|
||||
皆以真實 Chromium 量測驗證(jsdom 不可信)。
|
||||
|
||||
@@ -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 之 TreeWalker/offset 失真,不可信)。</p>
|
||||
|
||||
@@ -112,6 +118,11 @@
|
||||
<script type="text/markdown" id="md-source">
|
||||
# 變更紀錄(Changelog)— 聚珍(Juzhen)/cjk-autospace
|
||||
|
||||
## 字符分類規則集(2026-06-04)
|
||||
|
||||
### 新增
|
||||
- 可配置字符分類 charClass:硬編碼分類(中文/西文/全寬標點子類)統一抽象為規則集,內置默認,消費端經 options.charClass(cjk/western/biaodian{stop,pause,open,close,middle,liga})追加擴充,覆寫 spacing/jiya/jinze 判定。例:英文全角句號 .(U+FF0E)預設未分類,以 biaodian.stop 歸全寬句末標點即比照 。。向下兼容(不傳則行為不變、實例隔離);v1 追加語義、不重分類內置;結構性 ASCII 不開放。spacing 間隙正則改由規則集 per-instance 編譯。測試 66 通過。
|
||||
|
||||
## 下游回饋修復批次(2026-06-03)
|
||||
|
||||
皆以真實 Chromium 量測驗證(jsdom 不可信)。
|
||||
|
||||
+24
-38
@@ -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 追加擴充,覆寫 spacing/jiya/jinze 之判定。`charClass: { cjk?, western?, biaodian?:{stop,pause,open,close,middle,liga} }`。例:英文全角句號 .(U+FF0E)預設未分類,以 biaodian.stop:"." 歸為全寬句末標點即比照 。處理。向下兼容(不傳則行為不變、實例隔離);v1 為追加語義,不重分類內置;結構性 ASCII 不開放。
|
||||
|
||||
## v1 相容
|
||||
|
||||
`createCjkAutospace(opts).apply(root)` 經相容層映射至 createJuzhen,零改動可跑。
|
||||
|
||||
@@ -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 追加擴充,覆寫 spacing/jiya/jinze 之判定。`charClass: { cjk?, western?, biaodian?:{stop,pause,open,close,middle,liga} }`。例:英文全角句號 .(U+FF0E)預設未分類,以 biaodian.stop:"." 歸為全寬句末標點即比照 。處理。向下兼容(不傳則行為不變、實例隔離);v1 為追加語義,不重分類內置;結構性 ASCII 不開放。
|
||||
|
||||
## v1 相容
|
||||
|
||||
`createCjkAutospace(opts).apply(root)` 經相容層映射至 createJuzhen,零改動可跑。
|
||||
|
||||
Reference in New Issue
Block a user