feat: 標點半形 margin 後備模式+下游回饋修復
margin 後備(供缺 OpenType halt 之字型): - 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 實測,consumer 可經 jiya.bias 逐 lang 逐字覆寫。 - _lang.css 字型堆疊僅作後備(全包 :where 零特異度、只命中帶 lang 屬性之元素、 不直接覆寫 jz-inner)→ 消費端 font-family 恆優先,標點隨之以消費端字型渲染。 - 新增 tools/measure-bias.py(量 glyph ink 中心、產偏側建議表)+ README 「字型適配工作流」。demo/fallback.html:方正書宋 GBK 對照 halt 失效 vs margin。 下游回饋修復: - 1a:adjacentLogicalChar 透明穿越 jz-jinze(同 jz-hws/樣式行內)→ pill 緊鄰 CJK 標點時,左緣間隙與作者空格剝除復原(jinze 先於 spacing 之交互)。 - 1b:CJK↔CJK 贅餘作者空格(含跨 inline 標籤)剝除、不留隙,與 CJK↔Latin 之 邊界正規化一致(DEL 哨符,全形空格 U+3000 不動)。 - 問題二:新增 justifyAtoms 選項;false → jz-char/jz-jinze 改 display:inline, 相容分頁器(Paged.js)對齊引擎(halt 半形與禁則 nowrap 保留)。 測試 43→49 全通過;dist 重建;README/ARCHITECTURE 同步更新契約。
This commit is contained in:
+39
-3
@@ -328,6 +328,16 @@ class 約定:`bd`(標點)、`bd-open/close/cop/stop/sep/liga`、`cjk`、`j
|
||||
語義字元,剪貼板得緊湊原文。
|
||||
- **切片**:涵蓋 v1 Pass A、Pass B(pill `code/kbd` 邊界亦走同一機制——左字或
|
||||
pill 元素包入 `jz-hws`;pill 由 avoid 與鄰接判定處理)。
|
||||
- **邊界正規化一致性(下游回饋 1a/1b 修)**:
|
||||
- **1a pill 穿越 jz-jinze**:jinze(order 40)先於 spacing(order 50),會把尾隨
|
||||
標點之 pill 納入 `jz-jinze`。`adjacentLogicalChar` 須**透明穿越 `jz-jinze`**
|
||||
(與 `jz-hws`、樣式行內同列,見 `finder.isTransparentInline`),否則 pill 左鄰字
|
||||
不可達、左緣間隙與作者空格剝除雙失。
|
||||
- **1b CJK↔CJK 贅餘空格**:中文不用詞間空格,故 CJK 表意字之間的單一 ASCII 作者
|
||||
空格(含跨樣式行內標籤,`collectRuns` 已透明合併)一律**剝除、不留隙**(以
|
||||
`DEL` 哨符 1:1 替換空格保持對齊,`processBlock` 據此刪空格而不插 `jz-hws`)。
|
||||
與 CJK↔Latin 之剝除一致——凡 inline 邊界之贅餘作者空格皆統一處理。全形空格
|
||||
U+3000 不動。
|
||||
|
||||
### 6.1a 行末去隙(gapTrim,justify 修正)— 切片 1
|
||||
|
||||
@@ -363,8 +373,25 @@ class 約定:`bd`(標點)、`bd-open/close/cop/stop/sep/liga`、`cjk`、`j
|
||||
不重疊。`font-feature-settings:"halt"` 各引擎一致(當初疑慮之不一致者為**自動**
|
||||
的 `text-spacing-trim`/`chws`,非顯式 `halt`);缺 `halt` 之字型優雅降級為全形。
|
||||
鄰接/行端之「收哪一字」之**決策**仍由 `blankSides` 邏輯定,渲染統一為 `halt`。
|
||||
- **`margin` 後備模式(.feedback 增補)**:消費端字型未必含 `halt`(多數系統字型、
|
||||
GBK 老字型,實測**方正書宋 GBK 僅含 `vert`、無 `halt`** → halt 模式不擠)。故提供
|
||||
後備:`jiya: { halfWidth: "margin" }`。**機制**(演進後):把 `jz-char` 之 inline-block
|
||||
寬收為 `width:0.5em`(真半形 advance——相鄰兩標點各 0.5em、合 1em,無負 margin 之
|
||||
鄰接疊加/單側重疊問題),字身 `jz-inner` 以 `overflow` 溢出、再依墨色偏側左移
|
||||
(right −0.5em/center −0.25em/left 0),使墨色落入 0.5em 盒、空白溢向外側——即以
|
||||
CSS 盒模型重現 `halt`。偏側由 `core/unicode.ts` 之 `inkBias(ch, langClass, overrides)`
|
||||
依**字身墨色中心**給出 `left|center|right|full`(簡體點號偏左、繁體居中;彎引號
|
||||
`“”`/角括號 `「」`/尖括號 `〈〉` 墨強偏一側→開 right、閉 left;圓方書名括號
|
||||
`()【】《》…` 近中→center),charify 時標為 `jz-ink-{left,center,right}`。消費端可
|
||||
經 `jiya.bias` 逐 lang 逐字覆寫;配字工作流與量測工具 `tools/measure-bias.py` 見 README。
|
||||
- **激活與粒度(I3/I10)**:模式由 `data-jz-halfwidth` 屬性**所在子樹**決定(CSS
|
||||
後代選擇器)——`render()` 在全域 margin 時自動掛於 root;亦可手寫於任一祖先作逐區塊
|
||||
/逐語言控制(含 `margin` 頁中嵌 `halt` 島之 halt-reset,憑來源順序勝出)。bias
|
||||
class 恆於 charify 標記,halt 模式不讀,故模式切換為純 CSS、無需重 render。實測:
|
||||
方正書宋 GBK 下同句行寬 `24.0em(halt 無效)→ 19.7em(margin 生效)`、單標點
|
||||
`1.0em → 0.5em`。
|
||||
- **切片**:涵蓋並超越 v1 Pass D(開明式),加入全角式、lang 切換、行內連續與
|
||||
行端擠壓。
|
||||
行端擠壓、`halt`/`margin` 雙渲染。
|
||||
|
||||
### 6.4 禁則(Jinze,避頭尾)+ justify 綁定 — 切片 1(基礎)/後續(完整)
|
||||
|
||||
@@ -462,6 +489,14 @@ class 約定:`bd`(標點)、`bd-open/close/cop/stop/sep/liga`、`cjk`、`j
|
||||
> inline-block 影響基線對齊與行內換行,須以 CSS 校正(`vertical-align`、行高),
|
||||
> 並**跨 Chrome/Safari/FF 目視驗證**(§12);此為切片 1 的重點驗證項。
|
||||
|
||||
**分頁器相容(下游回饋問題二)**:常規流式版面 inline-block 原子正常,但**分頁器**
|
||||
(Paged.js)之對齊引擎會把每個 inline-block 邊界當伸縮點、與 CJK inter-ideograph
|
||||
疊加,於窄欄混排散架。故提供 `options.justifyAtoms`(預設 true);設 false 時 render
|
||||
於 root 掛 `data-jz-atoms="inline"`,CSS 令 `jz-char`/`jz-jinze` 改 `display:inline`
|
||||
(halt 半形與 jinze nowrap 仍保留)。此即 R1 預案之一(解耦對齊原子化),切換僅 CSS、
|
||||
不動 JS。注意:`margin` 後備半形依賴 inline-block 之 `width:0.5em`,與
|
||||
`justifyAtoms:false` 不可兼得——分頁器場景須用含 `halt` 字型。
|
||||
|
||||
---
|
||||
|
||||
## 9. 跨瀏覽器策略
|
||||
@@ -470,8 +505,9 @@ class 約定:`bd`(標點)、`bd-open/close/cop/stop/sep/liga`、`cjk`、`j
|
||||
`user-select`、`white-space`、`:where()`、`hyphens`,及字型 OpenType
|
||||
`font-feature-settings:"halt"`(標點半形;各引擎一致,效果僅依字型是否含 halt,
|
||||
Noto CJK 具備,缺則優雅降級為全形)——三大引擎(Blink/WebKit/Gecko)皆穩定
|
||||
支援。**注意**:標點半形不用負 `margin`(對居中字形會重疊),改用 `halt`(見
|
||||
§6.3 修訂)。
|
||||
支援。**注意**:標點半形預設不用負 `margin`(對居中字形會重疊),改用 `halt`(見
|
||||
§6.3 修訂)。**缺 `halt` 字型之後備**:`jiya.halfWidth:"margin"` 以 `width:0.5em`+
|
||||
字身依偏側(`jz-ink-*`)溢出定位,於 CSS 重現 halt、真半形 advance(見 §6.3)。
|
||||
- **漸進增強(非必要)**:`text-spacing-trim`(Blink)、`hanging-punctuation`
|
||||
(WebKit)、`text-emphasis`、`text-autospace`——僅在支援時錦上添花,缺席不影響
|
||||
基本排版(I4)。
|
||||
|
||||
Reference in New Issue
Block a user