119 lines
8.0 KiB
Markdown
119 lines
8.0 KiB
Markdown
# 聚珍消費端更新
|
||
|
||
目前用法與標記契約以 [README](./README.md#用法) 為準;本檔只記錄升級影響與所需動作。
|
||
|
||
## 2026-10-02:Web 模組邊界、半形模式與局部生命週期修復
|
||
|
||
- **基線/範圍**:以 `1c2fb0e`(套件 2.0.0、ruleset 1.0.0)為修復前基線;本次為
|
||
Web/CSS adapter 修復,公開入口、選項與共享規則版本不變。
|
||
- **交付狀態**:本次維護變更隨 Git 提交交付,未進行 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。
|
||
|
||
### 消費端動作與驗證
|
||
|
||
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`。本地維護候選已通過
|
||
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 個組合通過。
|
||
真實下游頁面仍須自行驗證其字型與版面。
|