docs: 功能分級 + 垂懸字 + 標點懸掛(同步 main §6.5 落地)
changelog 增「功能分級 + 垂懸字 + 標點懸掛」條目(2026-06-09):功能分級 (文本/段落級)、垂懸字 orphan(方案 C,預設開)、標點懸掛 hanging(按類凸出量、 headless 校準、需 justifyAtoms:false)、行歸屬 bug 修正、兩階段防自我應驗、demo 增區。 index 功能表增 orphan/hanging/level 三列、選項示例與 md twin 同步、各功能標級別。 重建 index.html/changelog.html。
This commit is contained in:
+25
-2
@@ -4,7 +4,7 @@
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>變更紀錄(Changelog)</title>
|
||||
<meta name="generated-at" content="2026-06-02">
|
||||
<meta name="generated-at" content="2026-06-09">
|
||||
<meta name="source" content="cjk-autospace · 變更紀錄">
|
||||
<!-- RUNTIME_CSS -->
|
||||
</head>
|
||||
@@ -14,7 +14,7 @@
|
||||
<div class="meta">
|
||||
<h1>變更紀錄(Changelog)</h1>
|
||||
<p class="subtitle">聚珍(Juzhen)/cjk-autospace 之版本變更紀錄。</p>
|
||||
<p class="timestamp"><time>2026-06-02</time> · <span>cjk-autospace · 變更紀錄</span></p>
|
||||
<p class="timestamp"><time>2026-06-09</time> · <span>cjk-autospace · 變更紀錄</span></p>
|
||||
</div>
|
||||
<div class="actions">
|
||||
<!-- ACTIONS -->
|
||||
@@ -25,6 +25,29 @@
|
||||
<!-- BODY -->
|
||||
<p class="lede">聚珍(Juzhen)/cjk-autospace 變更紀錄。<a href="./index.html">← 回文檔</a></p>
|
||||
|
||||
<h2>功能分級 + 垂懸字 + 標點懸掛 <span class="badge accent">2026-06-09</span></h2>
|
||||
<p>ARCHITECTURE §6.5 整體計劃落地(功能分級前置 → 垂懸字 → 行端模式重構 → 標點懸掛),共 87 單元測試全綠,懸掛經 headless Chrome 校準。</p>
|
||||
<h3>新增</h3>
|
||||
<ul>
|
||||
<li><strong>功能分級(文本級 vs 段落級)</strong>:把已實作功能切為兩級——<strong>文本級</strong>(中西間隙 <code>spacing</code>、標點擠壓 <code>jiya</code>,任意文本片段適用)與<strong>段落級</strong>(禁則 <code>jinze</code>、垂懸字 <code>orphan</code>、標點懸掛 <code>hanging</code>、長詞 <code>longWord</code>,需行/段布局)。塊級元素預設全功能;<code>data-jz-level="text"</code> 子樹(最近祖先勝)或選項 <code>level:{text:"選擇器"}</code> 標記之元素(標題/按鈕/UI)僅跑文本級。實作為 <code>Finder.levelFor</code>/<code>levelAllows</code> + 各 pass <code>level</code> 元數據;段落級 pass(含 charify 之 longWord)逐元素受閘。<code>spacing</code> 補單元素 root 支援(行內/非塊 root 亦處理)。</li>
|
||||
<li><strong>垂懸字避免 <code>orphan</code>(方案 C,斷行層無測量,order 70)</strong>:段末行 CJK 實義字 ≥ N(預設 2;標點/符號不計)。把段末「第 N 個實義字起至段末」(含尾隨標點)包入 <code>jz-orphan</code>(<code>white-space:nowrap</code>),整體不可斷 → 末行恒含之 ⇒ 末行實義字 ≥ N,任意寬度/字型成立、無需量測。邊界字落於行內元素內時綁定整個塊級直接子(跨 <code>jz-jinze</code> 攀爬、不切割)。<strong>預設開 chars=2</strong>(<code>orphan:false</code> 關);段落級,<code>data-jz-level="text"</code> 跳過。</li>
|
||||
<li><strong>標點懸掛 <code>hanging</code>(渲染層 layout,§6.5.2)</strong>:行尾點號/閉類右凸、行首開類左凸出版心,令正文格線齊邊(自管負 margin)。凸出量按類校準(headless 實測,Noto Sans CJK SC):點號近全形 <code>--jz-hang-stop</code>(1em)、括號半形 <code>--jz-hang-bracket</code>(0.5em),CSS 變數可逐字型調。逐 lang 閘:繁體橫排預設不懸掛(降回 squeeze,clreq)。<strong>預設關</strong>;已 baseline 半形之標點不懸掛。lineedge 行端處理升級為可配模式 <code>squeeze|hang|none</code>(抽出共用偵測碼,squeeze 行為不變)。</li>
|
||||
</ul>
|
||||
<h3>修復</h3>
|
||||
<ul>
|
||||
<li><strong>行歸屬判定 bug(連帶改善 squeeze)</strong>:原以「行盒 <code>top</code> 差 > EPS=4px」判同/異行,但 <code>jz-char</code> 為 inline-block,其行盒 <code>top</code> 與相鄰純文本字形 <code>top</code> 因基線差約 5px、遠小於行高卻超舊容差,致同行誤判為下一行(懸掛句末標點過度觸發之根因)。改判「垂直區間」:下一行=<code>b.top ≥ a.bottom</code>、上一行=<code>b.bottom ≤ a.top</code>(容 2px)。</li>
|
||||
<li><strong>懸掛自我應驗</strong>:<code>relayout</code> 改兩階段——先清全部行端效果、於自然佈局量測全部標點、再一次性套用(仿 gapTrim 教訓),終態穩定。</li>
|
||||
</ul>
|
||||
<h3>已知限制</h3>
|
||||
<ul>
|
||||
<li><strong>懸掛與 inline-block 對齊原子互斥</strong>(headless 實測):預設 <code>justifyAtoms:true</code>(<code>jz-char</code> inline-block)下,懸掛之負 margin 被 justify 重分配吸收、標點不凸出;欲懸掛須設 <code>justifyAtoms:false</code>(<code>jz-char</code> 改 inline)。容器宜留左右 padding ≥1em 容納凸出標點。</li>
|
||||
<li><strong>懸掛凸出量逐字型校準</strong>:現預設依 Noto Sans CJK SC;他字型留白比例略異,經 CSS 變數調校。繁體若日後欲開懸掛須另校。</li>
|
||||
</ul>
|
||||
<h3>工具</h3>
|
||||
<ul>
|
||||
<li><code>demo/resize-check.html</code> 增垂懸字(<code>jz-orphan</code> 描框 + 關閉對照)與標點懸掛(獨立實例、句號密集文本、版心虛線)兩檢查區,工具列增對應顯示開關。</li>
|
||||
</ul>
|
||||
|
||||
<h2>標點挤压一致性 <span class="badge accent">2026-06-04</span></h2>
|
||||
<h3>新增/修復</h3>
|
||||
<ul>
|
||||
|
||||
Reference in New Issue
Block a user