refactor: 元素分類單一入口 finder.category + ResizeObserver 派發序不變量確認

承階段二之兩件收尾:確認 lineedge 雙 ResizeObserver 之派發序(審計唯一未闭環項),並把散落
各遍歷原語之元素分類優先序收斂為單一 finder.category。

ResizeObserver 派發序——**確認為非缺陷**(Chrome headless 實測):resize 時回調按 observer
**創建順序**派發(ResizeObserver 規範遍歷 observers 之插入序,非 observe 序;實測 seq=12——
反向 observe 仍按創建序)。lineEdgePass(order 90)之 observer 先於 gapTrimPass(order 92)建、
故每次 resize 皆先派發,gapTrim 之行末去隙判定恆基於 lineEdge **已套用**之半形版面(非陳舊態)。
以註解鎖為不變量(勿調換兩 pass 之 order/創建序),不需改碼。

元素分類單一入口:新增 `Finder.category(el): InlineCategory`——一元素恰屬 avoid/pill/isolate/
block/transparent/opaque 之一,優先序 `avoid > pill > isolate > block > transparent > opaque`
集中一處(原散落 collectRuns/jiyaAdjacency/canSplit/isTransparent 各自短路、易漂移)。
・isTransparent = `category === "transparent"`;collectRuns/jiyaAdjacency 改 `switch(category)`;
  canSplit = `SPLITTABLE ∩ transparent`(結構切分為獨立層、白名單更窄)。
・行為等價(121 全綠);多命中優先序(data-jz-skip pill→avoid、pill+isolate→pill、未知行內
  →opaque 邊界)由既有行為測試覆蓋。
・README 三分類要點+ARCHITECTURE §4.1 補優先序與 category 說明。
This commit is contained in:
2026-07-07 21:45:06 +08:00
parent 3e57c2c2cf
commit 4f84d31785
9 changed files with 271 additions and 143 deletions
+9 -1
View File
@@ -250,7 +250,15 @@ Nvim peekClaude 模板等 v1 消費端之過渡期。**最後一批 v1 消費
過濾 `insidePill`,不 charify/不插間隙/不切分/不下潛),禁則時作為原子鄰字
單位**整體綁入** `jz-jinze`。典型:`code``kbd`、行內公式 `.katex`
判定**以元素為準、非標籤名**`isTransparent(el)`,先排除 pillisolateavoid
**單一分類 `finder.category(el)`(優先序)**:一元素恰屬六類之一,多選擇器同命中時依序短路
定案——`avoid pill isolate block transparent opaque``opaque`=未在 styleInlines
之未知行內標籤,嚴格白名單下當隔離式邊界)。故帶 `data-jz-skip` 之 pillisolate 判為 avoid
同命中 pill 與 isolate 判為 pillpill 覆蓋 isolate)。邏輯文本流之遍歷原語(`collectRuns`
`jiyaAdjacency``isTransparent`)皆 `switch(category)` 分派,`canSplit` `SPLITTABLE ∩ transparent`
——分類集中一處、優先序不再散落各原語各自短路(階段二後之清晰化)。
判定**以元素為準、非標籤名**`isTransparent(el) category(el)==="transparent"`,前置排除 pill
isolateavoid
再查標籤集):KaTeX 全樹皆 `<span>`,舊版按標籤名判透明曾令 `canSplit``descend`
整棵下潛——禁則把公式內側末字連同完整殼層逐層克隆切出(`splitoff`),上標漂移錯位
(下游問題六);`pillSelector``skipAttribute``scope.avoid` 三層防護全被刺穿。