8.1 KiB
聚珍消費端更新
目前用法與標記契約以 README 為準;本檔只記錄升級影響與所需動作。
2026-10-02:Web 模組邊界、半形模式與局部生命週期修復
- 基線/範圍:以
1c2fb0e(套件 2.0.0、ruleset 1.0.0)為修復前基線;本次為 Web/CSS adapter 修復,公開入口、選項與共享規則版本不變。 - 交付狀態:修復已以
b1a16c4提交並推送至main,可從倉庫取得配套 JS、CSS 與型別宣告。未進行 npm 發佈; 既有 npm 安裝或任何下游網站不會因此自動更新。
半形模式
舊版以後代選擇器切換 data-jz-halfwidth,外層 halt 會蓋過內層 margin;從 margin
切回 halt 也會殘留 inline-block 內盒。現在由最近有效標記決定模式,可交替巢狀,
切回 halt 同時復原內盒與偏移。margin 的偏側位移僅作用於已壓縮標點;全形標點不再偏移。
受影響者:混用含 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。
消費端動作與驗證
- 透過既有安裝/打包方式一併更新 JS 與 CSS;只換 JS 不會得到半形模式修復。
- 保留既有 pill/isolate/avoid、text/paragraph 及半形模式標記。
- 自訂
scope.include的容器仍須加.juzhen以使用內建原生間距禁用樣式, 如class="prose juzhen";JS 選擇器不會自動改寫 CSS 作用域。 - 用 E2E 頁面 檢查嵌套模式、全形偏移、混合根回退與待交付更新;
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 個組合通過。 真實下游頁面仍須自行驗證其字型與版面。