test: 三分類優先序契約——pill 行為覆蓋 isolate(兩端補隙同口徑、雙命中 pill 勝出)

實證後鎖定契約:pill 與 isolate 之邊界口徑完全相同(同一段 processPills 邊界處理,
兩端補隙/斷 run/斷相鄰/不可切分),差異僅在內部(pill 不可見、isolate 照常);
同一元素同時命中兩選擇器時 pill 語義勝出(collectRuns/jiyaAdjacency 均 pill 先判)。
新增契約測試(113 全綠);README 三分類要點+types.ts 選項註記補優先序說明。
This commit is contained in:
2026-06-12 17:23:11 +08:00
parent c4e8c6cfd5
commit 65a9df561e
4 changed files with 17 additions and 2 deletions
+2
View File
@@ -123,6 +123,8 @@ createJuzhen({
- **判定以元素為準、非標籤名**:KaTeX 全樹皆 `<span>`,但 `.katex` 命中 `pillSelector`
即為整體邊界——舊版按標籤名判透明曾整棵下潛、把公式內側末字連同殼層克隆切出(肢解)。
- **pill 行為覆蓋 isolate**:兩者邊界口徑完全相同(兩端補隙、斷 run/斷相鄰、不可切分,
同一段邊界處理代碼),差異僅在內部;同一元素同時命中兩選擇器時 **pill 勝出**(內部不可見)。
- **禁則之整體綁定**:pill 緊鄰禁則標點時(`…$公式$`),整個 pill 作為原子鄰字單位
綁入 `jz-jinze`(公式本不可斷,無額外代價);隔離元素同樣整綁(切分背景盒有可見接縫)。
- **`scope.avoid``skipAttribute``data-jz-skip` 以自身判定**:命中元素自身即邊界、
+2 -1
View File
@@ -78,7 +78,8 @@ export interface JuzhenOptions {
styleInlines?: string[];
blockTags?: string[];
skipTags?: string[];
/** 整體(pill)元素選擇器(預設 "code, kbd")。 */
/** 整體(pill)元素選擇器(預設 "code, kbd")。pill 之邊界口徑與 isolate 完全
* 相同(行為覆蓋),差異僅在內部不可見;同元素雙選擇器命中時 pill 勝出。 */
pillSelector?: string;
/** 內外隔離元素選擇器(預設 "mark")。傳 "" 停用(mark 回歸透明)。 */
isolateSelector?: string;
+2 -1
View File
@@ -107,7 +107,8 @@ export interface JuzhenOptions
styleInlines?: string[];
blockTags?: string[];
skipTags?: string[];
/** 整體(pill)元素選擇器(預設 "code, kbd")。 */
/** 整體(pill)元素選擇器(預設 "code, kbd")。pill 之邊界口徑與 isolate 完全
* 相同(行為覆蓋),差異僅在內部不可見;同元素雙選擇器命中時 pill 勝出。 */
pillSelector?: string;
/** 內外隔離元素選擇器(預設 "mark")。傳 "" 停用(mark 回歸透明)。 */
isolateSelector?: string;
+11
View File
@@ -1093,6 +1093,17 @@ test("isolate revertmark 整綁+邊界間隙還原——DOM 回原樣", ()
assert.equal(document.querySelector("p").innerHTML, before, "render→revert 還原一致(I6");
});
test("三分類優先序:pill 行為覆蓋 isolate——兩端補隙同口徑,雙選擇器同命中時 pill 勝出", () =>
{
// pill 之邊界口徑=isolate(兩端補隙),差異僅在內部;同一元素同時命中
// pillSelector 與 isolateSelector 時,pill 語義(內部不可見)勝出。
const { document } = setupDom('<p lang="zh-Hans">前文<mark class="x">內,文</mark>後文</p>');
createJuzhen({ pillSelector: ".x", isolateSelector: "mark", jinze: false })
.render(document.body);
assert.equal(countTag(document.body, "jz-hws"), 2, "兩端各一間隙(同 isolate 口徑)");
assert.equal(countTag(document.body, "mark jz-char"), 0, "內部不可見(pill 勝出,標點不 charify");
});
// ----- v1 相容層移除 -----
test("v1 相容層已移除:createCjkAutospace 不再導出(消費端已全數遷移 v2 API)", async () =>