Files
admin c4e8c6cfd5 fix: 行內元素三分類(透明/隔離/整體)——jinze 下潛肢解 KaTeX 修復(下游問題六);v1 相容層移除
下游問題六:行內公式緊鄰禁則標點時,jinze 為綁鄰字透明下潛 .katex(全樹皆 SPAN,
僅憑標籤名判透明),把公式內側末字連同完整殼層逐層克隆切出(splitoff),上標漂移
錯位;pillSelector/skipAttribute/scope.avoid 三層防護全被刺穿。復現另揭兩向量:
相鄰 pill 時 descend 刺穿致 jz-hws 插入公式內部;pill 內部標點被 jiya charify。

確立三分類(§4.1,所有遍歷原語共用同一判定):
  透明(styleInlines+jz-*)— 穿越/run 延續/可克隆切分;
  隔離(isolateSelector,預設 "mark",新增選項)— 邊界斷 run/斷相鄰/不可切分、
    兩端補隙(同 pill),內部照常處理(自成脈絡);
  整體(pillSelector)— 內部對一切 pass 不可見(insidePill 過濾),禁則時作為
    原子鄰字單位整體綁入 jz-jinze。

機制修復:
  finder — transparentInline 改以元素判定(先排除 pill/isolate/avoid 再查標籤集);
    avoidsSelf 自身判定(isAvoided 僅查祖先,自身命中 avoid 曾被穿越);descend 三態
    (邊界字/無內容續找兄弟/blocked 終止——不可越界跳找更遠之字);eachTextNode
    過濾 pill 內部;collectRuns 隔離元素內部自成 run。
  core/split — canSplit 諮詢 finder(pill/isolate/avoid 不可切 → 退化整綁);
    MARK 移出 SPLITTABLE(背景盒切分有可見接縫)。
  jiyaAdjacency — pill/avoid(自身判定)斷相鄰不下探;isolate 斷而內部自成脈絡。
  spacing Pass B — 邊界選擇器擴為 pill ∪ isolate;巢於 pill 內者跳過。
  orphan — avoidsSelf 邊界;avoid 塊不綁(舊漏判:avoid 子樹內裸文本曾被計數包綁)。

v1 相容層移除(消費端已全數遷移 v2 API):src/compat/v1.ts、IIFE 全域別名
createCjkAutospace、死選項 autospaceClass(經查從未被任何 pass 讀取)一併刪;
I8 退役。dist/compat 殘留聲明清除、dist/core/split.d.ts 補入庫(前次遺漏)。

測試 112 全綠(問題六 ×7、isolate ×6、compat 移除 ×1);headless Chrome 實證
公式完整(splitoff=0、內部無 jz-hws/jz-char)、mark 與公式整體入 jz-jinze。
文檔:README 三分類節+選項示例+功能表(hanging 行補「已移除」);ARCHITECTURE
§4.1 三分類/§3.5 相容層移除/§6.1/§6.3/§6.4/I8 退役。
2026-06-12 17:15:24 +08:00

66 lines
1.5 KiB
JavaScript
Raw Permalink 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.
// 構建腳本:esbuild 產出 ESM / IIFE / CSSd.ts 由 `tsc --emitDeclarationOnly`
// 另行產出(見 package.json scripts)。
//
// dist/juzhen.mjs ESM,供打包器/TypeScriptjsdom 測試。
// dist/juzhen.iife.js IIFE,全域 `Juzhen`,原生 <script> 直跑。
// dist/juzhen.css 合併之樣式(css/juzhen.css 之 @import 展開)。
import { build } from "esbuild";
const ENTRY = "src/index.ts";
const SHARED = (
{
bundle: true,
target: [ "es2020", "chrome111", "safari16", "firefox115" ],
logLevel: "info",
}
);
// IIFE:把 Juzhen 掛上 globalThisv1 全域別名已隨相容層移除)。
const IIFE_FOOTER = (
"if(typeof globalThis!=='undefined'){"
+ "globalThis.Juzhen=Juzhen;"
+ "}"
);
async function main()
{
await build(
{
...SHARED,
entryPoints: [ ENTRY ],
format: "esm",
outfile: "dist/juzhen.mjs",
}
);
await build(
{
...SHARED,
entryPoints: [ ENTRY ],
format: "iife",
globalName: "Juzhen",
outfile: "dist/juzhen.iife.js",
footer: { js: IIFE_FOOTER },
}
);
await build(
{
...SHARED,
entryPoints: [ "src/css/juzhen.css" ],
outfile: "dist/juzhen.css",
loader: { ".css": "css" },
}
);
}
main().catch(
(err) =>
{
console.error(err);
process.exit(1);
}
);