Files
cjk-autospace/UPDATES.md
T
admin 3a4fa1c932 fix: 修复行缘、切分还原与语言解析并同步文档
保留逐字 margin/jiya.bias 字体后备方案;补齐 demo 重排、量测边界说明及共享规则 1.0.1 反例向量。

验证:完整构建通过,Node 376 项、WKWebView 64 项及原生 demo 9 项通过;Firefox 仍暂缓。
2026-10-03 21:15:54 +08:00

172 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 聚珍消費端更新
目前用法與標記契約以 [README](./README.md#用法) 為準;本檔只記錄升級影響與所需動作。
## 2026-10-03:全專案掃描後的行緣、回退與語言修復
- **基線/範圍**:以 `024ad5d`(套件 2.0.0、ruleset 1.0.0)為掃描基線,修復
Web adapter、demo、量測工具及文件。套件版本仍為 2.0.0。
- **交付狀態**:本次修復已提交並推送至 `main`,倉庫含配套 JS/CSS 與型別宣告。
未進行 npm 發佈、下游更新或部署;既有安裝及網站不會自動更新。
### 可見行為與升級影響
1. **物理行緣**:`jz-orphan` 包裹不再把同行開括號誤當行首;自訂 isolate/opaque
的實際 inline/inline-block/contents 盒可攀出,block 仍是邊界。可見 `br` 作為
強制行緣,隱藏 `br` 可穿越。修正影響行端半形及同行/行末間隙判斷,邏輯隔離政策不變。
2. **切分回退**:splitoff 不再只憑前兄弟標籤合併。私有切分/合併鏈證明同源、仍相鄰
且作者屬性一致時才併回,支援多實例再次切分;外部插入、替換來源或改樣式時保留
片段元素、樣式及字序並撤銷本庫標記/憑證。受外部干預後不承諾恢復歷史 DOM 快照。
3. **語言**:自身及祖先最近的 `lang=""` 表示未知(`other`),僅屬性缺失才繼承/回退;
`lang.default: ""` 亦表示未知。script/region 只按 BCP 47 的位置判讀,私用或擴展
內容不再冒充腳本,如 `zh-Hans-x-hant` 為簡體、`zh-TW-x-hans` 為繁體。四個分類鍵、
裸 `zh` 預設繁體及逐元素樣式優先序不變。依賴舊錯誤行為者須改成明確語言或樣式。
4. **demo 控制**:主 demo 對齊/寬度切換顯式重排,revert 後控制保持停用;拖曳頁
八個框各自作為 render 根,寬度觀察及對齊刷新不再只依賴 body 尺寸變化。
5. **字型後備**:`margin`+逐語言分類/逐字 `jiya.bias`(left/center/right/full)
完整保留。工具補量 `.`(U+FF0E),並明示只量預設 cmap、未做 shaping/`locl`;
語言參數僅選 JSON 分類鍵,`halt` 特性存在不保證逐字覆蓋。目標字型與語言下仍須目視微調。
共享規則升為 **1.0.1 patch**:澄清既有 explicit-script/region 契約並新增七個反例向量,
原有 55 個向量結果、字符集合、政策、schema 及 adapter 義務均不變。Web 修正違反既有
契約的解析錯誤,不另立 Web 專用分類政策;其他 adapter 須核對全部 62 個向量。
本次未驗收 XeLaTeX 或其他 adapter。版本依據見 [共享規則](./rules/README.md#101-語言契約澄清)。
取用本次倉庫修改時,一起更新配套 JS/CSS/型別及共享規則;公開入口與選項名稱不變。
文件另修正 Finder 快取生命週期、no-op 懸掛說明、功能級別預設、樣式優先序及
`charClass` 輸入格式:cjk/western 是 regex 字元類片段,biaodian 是逐碼點字串,
`"①-③"` 不代表三個圈碼,應寫 `"①②③"`。
### 本地驗證
- `npm run build`:JS/CSS 與 TypeScript 型別宣告完整構建通過。
- `npm test`:**376/376 通過,0 失敗、0 跳過**;含 strict schema/常數對照、
全部 62 個語義向量、外部插入/替換/改樣式、observer 回退及多實例切分 36 個組合。
- `npm run test:wkwebview`:最終構建 **64/64 通過**,failures 為空;新增行緣、
語言、外部同標籤兄弟及多實例切分用例均在真實 WKWebView 執行。
- 最終產物另以原生宿主載入兩個 demo 副本:主頁 4 項、拖曳頁 5 項通過,核對
對齊後與手動重排一致、revert 停用,以及框寬變化實際改變行端決策。
以上是本地 DOM/原生幾何及控制驗證,不代表三引擎目視、所有字型地域字形或真實下游
頁面驗收。本次未重新驗收 Chrome/Edge;**Firefox 依用戶要求暫緩**,不安裝或作相容性結論。
## 2026-10-02:Web 模組邊界、半形模式與局部生命週期修復
- **基線/範圍**:以 `1c2fb0e`(套件 2.0.0、ruleset 1.0.0)為修復前基線;本次為
Web/CSS adapter 修復,公開入口、選項與共享規則版本不變。
- **交付狀態**:修復已以 [`b1a16c4`](https://git.commilitia.net/admin/cjk-autospace/commit/b1a16c49698dc418aa733e41a04bdbc9922927be)
提交並推送至 `main`,可從倉庫取得配套 JS、CSS 與型別宣告。未進行 npm 發佈;
既有 npm 安裝或任何下游網站不會因此自動更新。
### 半形模式
舊版以後代選擇器切換 `data-jz-halfwidth`,外層 halt 會蓋過內層 margin;從 margin
切回 halt 也會殘留 inline-block 內盒。現在由最近有效標記決定模式,可交替巢狀,
切回 halt 同時復原內盒與偏移。margin 的偏側位移僅作用於已壓縮標點;全形標點不再偏移。
既有缺半形特性字型的逐字相容方案仍保留:`margin` 後備搭配 `jiya.bias`,可按語言分類、
逐標點選 `left`/`center`/`right`/`full`;字型量測與目視微調流程見 README。
**受影響者**:混用含 halt 與缺 halt 字型、巢狀半形模式,或 margin 區域含全形標點的消費端。
標記與呼叫方式無需更換。若曾加 CSS workaround 抵銷舊版行為,更新後須確認其是否仍需要。
### 局部回退與觀察更新
舊版局部 `revert` 子樹含獨立 render 根時,可能只還原子根而漏掉由祖根處理的兄弟內容。
現在撤回完整請求子樹中本實例的產物,保留作者及其他實例的所有權。
舊版手動 `render`/`revert`/`rerender` 暫停 observer 時會丟掉未交付的變更。
現在先結算待交付更新,再執行手動操作;兄弟區塊仍更新,手動回退不被舊記錄重新打開。
**時機注意**:手動操作可能先處理其他已變動區塊,因此消費端的 `isSkipped` 等鉤子也可能
在該呼叫期間執行。observer 結算失敗仍走宿主非同步錯誤通道,不成為手動 API 的同步例外。
增量更新按目前觀察根的包含關係判定,未掛入 document 的根仍可更新;同批新增後
移到根外,或舊記錄目標已離開根時不再排版。舊版分別會漏掉前者、誤處理後者。
### 元素參與、Unicode 原子與源文本
舊版 standalone 遍歷可能進入 pill 內部的塊;禁則與避孤字也可能把 avoid、text 或
關閉該功能的內容帶入 `nowrap`。現在 pill 內部保持原樣,禁則同時檢查兩側及整綁
範圍,行內 render 根不向外綁定。避孤字只計算排除邊界之後的合法段末區域;不足
N 字,或不可切容器還含排除內容時不綁。pill 仍可作完整單元參與外部交界。
跨透明文本節點的 surrogate pair 及 base+VS 現在共用完整原子映射,間隙建於完整
字符之後,禁則不在原子內造斷點,避孤字只計一字。pill 兩側隔著一個 ASCII 作者
空格的鄰字也以完整原子查找;第二個空格、換行或排除邊界仍中斷。
標點 charify 也先將跨透明 Text 的 base+VS/surrogate 合為一個標點載體,讓鄰接
擠壓作用於完整字符。作者元素與監聽器保留,回退任一來源端會還原完整原子的分布。
作者克隆/刪除載體或替換來源父節點後,舊回退記錄不會復活已移除文字。
自訂標點集合含非 BMP 字符時,孤立 surrogate 不再被錯認為該字符;被排除的空 Text
也會中斷標點鄰接,普通空 Text 仍透明。
舊版固定內部標記可能把原文私用區字符(如 U+E000~U+E003)或貌似 placeholder
的內容誤當排版指令。現在每個 run 選擇源文本未使用、且字符規則不會匹配的標記,
原文保持作者內容。若自訂字符規則/源文本用盡全部候選,間隙回放前報錯。
**受影響者**:pill 中有塊級內容、混用參與標記、Unicode 字符被模板拆到不同節點,
或源文本含私用區字符的消費端。API 與標記無需變更;依賴舊版越界綁定的頁面,
須重新檢查段末斷行。
### 語言腳本匹配
`Hans`/`Hant` 以完整子標籤匹配,避免 `zh-CN-x-shant`/`zh-TW-x-hansford` 等
標籤被局部字串誤判為相反腳本。一般 `zh-Hans`/`zh-Hant`、地區回退及共享規則不變。
### 混合字號的行末去隙及 layout 生命週期
舊版去隙以相鄰矩形 top 差判斷換行,同行小字或下標也可能被判為下一行,導致
中西間隙消失。現在與行端標點一致,以垂直區間判斷;實際下一行仍去隙。
重排/回退也使舊 layout 安裝的字型完成及已排隊回調失效,避免再次掃描新產物。
**受影響者**:正文中混合字號、下標,或字型仍在載入時反覆重排的消費端。
有效選項與呼叫方式無需變更;曾以額外空格或 CSS 補償間隙的頁面須檢查原 workaround。
### 數值選項防護
`longWord.minLength` 現在要求 ≥2 的有限安全整數,無效值回退既有預設 6;舊版
小數/Infinity 等可能被拼成無效計數量詞,讓長詞功能靜默失效。`orphan.chars`
排除非有限值,無效值回退 2;合法小數仍照既有行為向下取整。
使用合法選項的消費端無需修改。若由外部設定輸入閾值,請依 README 的範圍檢查。
### 系統交互補查
已排版塊搬到不同級別/功能/語言的祖先後,舊版可能保留原產物與祖先快取。
現在觀察器先撤回搬入塊的舊效果,再按目前環境排版;純新增塊仍只處理自身範圍。
舊版 spacing 只按 block 門控,普通行內白名單/黑名單仍會被補隙或刪作者空格,
禁用塊中的子白名單也未能恢復間隙。現在以逐來源功能邊界處理;pill 鄰字查詢也
遵守兩側門控。空功能禁用元素會中斷 spacing/jiya,重新啟用的子樹自成脈絡。
`scope.include` 選到行內子樹時,間隙不再因父塊未命中而漏處理。
跨節點間隙載體被作者克隆/刪除、來源父被替換後,舊版回退可能重複或復活文字;
現在保留作者當前內容。這也修正舊回歸中「刪除載體後回退另一端便恢復整顆字」的
預期:**刪除載體即刪除其中原文,revert 不補回**。若要撤回排版再編輯原文,先 revert,
再修改;整根脫離文檔與正常搬移的恢復仍保留。
其他實例合法解包來源父時,本庫現在透過私有受控解包鏈更新記錄;兩/三實例
任意回退次序不再因舊父已撤回而丟 VS。作者自行解包或可偽造屬性不會獲得此憑證。
重用已撤回容器會使舊位置記錄失效;重定向鏈有環檢測,不能以循環來源指引恢復。
**受影響者**:搬移已排版 DOM、行內功能標記/opt-in、外部替換載體及多實例
疊加的消費端。公開入口、選項及共享規則不變;段落搬移仍使用既有 observe 或 rerender。
### 消費端動作與驗證
1. 透過既有安裝/打包方式一併更新 JS 與 CSS;只換 JS 不會得到半形模式修復。
2. 保留既有 pill/isolate/avoid、text/paragraph 及半形模式標記。
3. 自訂 `scope.include` 的容器仍須加 `.juzhen` 以使用內建原生間距禁用樣式,
如 `class="prose juzhen"`;JS 選擇器不會自動改寫 CSS 作用域。
4. 用 [E2E 頁面](./demo/e2e.html) 檢查嵌套模式、全形偏移、混合根回退與待交付更新;
macOS 原生入口為 `npm run test:wkwebview`。DOM 回歸見 `test/observer-recovery.test.mjs`
與 `test/revert-ownership.test.mjs`;模組邊界見 `test/participation-boundaries.test.mjs`、
`test/spacing-boundaries.test.mjs` 與 `test/shared-rules.test.mjs`。修復提交 `b1a16c4` 已通過
353 項 Node 測試、發佈構建及原生 WKWebView 53 項驗收;layout/數值回歸見
`test/layout-lifecycle.test.mjs` 與 `test/numeric-options.test.mjs`;觀察根及跨節點標點
回歸見 `test/observer-boundaries.test.mjs` 與 `test/punctuation-atoms.test.mjs`。
系統交互新增 42 項回歸見 `test/systematic-interactions.test.mjs`。修復過程中的中間快照
另通過 32 組功能開關×10 類結構共 320 個 DOM 組合及 splitoff 多實例 36 個組合;
這兩組為調查階段證據,不列為最終提交的獨立復驗。最終快照驗收為上述 353/53 項。
真實下游頁面仍須自行驗證其字型與版面。