test+docs: 逐元素標點樣式覆寫——回歸測試(6 例)+ README/ARCHITECTURE 說明
承 c00fb3e(data-jz-style/lang.stylePolicy 之設置格式已推送)。補 e2e 回歸與文檔。 測試(6 例,127 全綠):屬性 banjiao/選擇器 banjiao/屬性優先於選擇器/最近祖先勝/非法值 回退 lang/revert 還原(作者屬性保留)。 文檔:README 設置速查補 lang.stylePolicy + data-jz-style 兩行、新增「逐元素標點樣式」小節 (非段落用半角之選擇器與屬性兩範式);ARCHITECTURE §4.3 補 resolveStyle 優先序(逐元素覆寫 > policy > style > 內建)。
This commit is contained in:
@@ -192,6 +192,74 @@ test("jiya:全角式(zh-Hant)baseline 一律不收(孤立標點無 jz-ha
|
||||
assert.equal(countTag(document.querySelector("p"), "jz-char.jz-half"), 0, "全角式不擠(無相鄰標點)");
|
||||
});
|
||||
|
||||
// ----- 逐元素標點樣式覆寫(data-jz-style 屬性 / lang.stylePolicy 選擇器)-----
|
||||
|
||||
test("樣式覆寫:data-jz-style=\"banjiao\" 令該子樹句末點號半形,p 仍走 lang 之全角", () =>
|
||||
{
|
||||
const { document } = setupDom(
|
||||
'<div lang="zh-Hant"><h1 data-jz-style="banjiao">甲。乙</h1><p>丙。丁</p></div>',
|
||||
);
|
||||
createJuzhen({ spacing: false, longWord: false, jinze: false }).render(document.body);
|
||||
assert.ok(document.querySelector("h1 jz-char.bd-stop").classList.contains("jz-half"),
|
||||
"h1(banjiao)句末點號半形");
|
||||
assert.ok(!document.querySelector("p jz-char.bd-stop").classList.contains("jz-half"),
|
||||
"p(zh-Hant 全角式)句末點號不收");
|
||||
});
|
||||
|
||||
test("樣式覆寫:lang.stylePolicy 選擇器命中之元素用指定樣式(h2→banjiao)", () =>
|
||||
{
|
||||
const { document } = setupDom('<div lang="zh-Hans"><h2>甲。乙</h2><p>丙。丁</p></div>');
|
||||
createJuzhen({
|
||||
spacing: false, longWord: false, jinze: false,
|
||||
lang: { default: "zh-Hant", stylePolicy: [ { selector: "h2", style: "banjiao" } ] },
|
||||
}).render(document.body);
|
||||
assert.ok(document.querySelector("h2 jz-char.bd-stop").classList.contains("jz-half"),
|
||||
"h2(stylePolicy banjiao)句末點號半形");
|
||||
assert.ok(!document.querySelector("p jz-char.bd-stop").classList.contains("jz-half"),
|
||||
"p(zh-Hans 開明式)句末點號不收");
|
||||
});
|
||||
|
||||
test("樣式覆寫:屬性優先於選擇器(data-jz-style=\"quanjiao\" 覆蓋 stylePolicy 之 banjiao)", () =>
|
||||
{
|
||||
const { document } = setupDom('<h1 lang="zh-Hant" data-jz-style="quanjiao">甲。乙</h1>');
|
||||
createJuzhen({
|
||||
spacing: false, longWord: false, jinze: false,
|
||||
lang: { stylePolicy: [ { selector: "h1", style: "banjiao" } ] },
|
||||
}).render(document.body);
|
||||
assert.ok(!document.querySelector("jz-char.bd-stop").classList.contains("jz-half"),
|
||||
"屬性 quanjiao 勝出、句末點號不收");
|
||||
});
|
||||
|
||||
test("樣式覆寫:最近祖先勝(內層 data-jz-style 覆蓋外層)", () =>
|
||||
{
|
||||
const { document } = setupDom(
|
||||
'<div lang="zh-Hant" data-jz-style="banjiao"><span data-jz-style="quanjiao">甲。乙</span></div>',
|
||||
);
|
||||
createJuzhen({ spacing: false, longWord: false, jinze: false }).render(document.body);
|
||||
assert.ok(!document.querySelector("jz-char.bd-stop").classList.contains("jz-half"),
|
||||
"內層 span quanjiao 勝過外層 div banjiao、不收");
|
||||
});
|
||||
|
||||
test("樣式覆寫:非法屬性值忽略、回退 lang", () =>
|
||||
{
|
||||
const { document } = setupDom('<p lang="zh-Hans" data-jz-style="bogus">甲,乙</p>');
|
||||
createJuzhen({ spacing: false, longWord: false, jinze: false }).render(document.body);
|
||||
assert.ok(document.querySelector("jz-char.bd-pause").classList.contains("jz-half"),
|
||||
"非法值忽略、回退 zh-Hans 開明式(句內點號 ,半形)");
|
||||
});
|
||||
|
||||
test("樣式覆寫 revert:data-jz-style 為作者屬性,render→revert 文字與屬性還原", () =>
|
||||
{
|
||||
const { document } = setupDom('<h1 lang="zh-Hant" data-jz-style="banjiao">標題。內容</h1>');
|
||||
const jz = createJuzhen({ spacing: false, longWord: false, jinze: false });
|
||||
jz.render(document.body);
|
||||
jz.revert(document.body);
|
||||
const h1 = document.querySelector("h1");
|
||||
assert.equal(h1.textContent, "標題。內容");
|
||||
assert.equal(h1.getAttribute("data-jz-style"), "banjiao", "作者屬性保留");
|
||||
assert.equal(countTag(document.body, "jz-char"), 0);
|
||||
});
|
||||
|
||||
test("jiya 機制 A:句末標點後接閉引號,前者半形(。」→ 。jz-half,全角亦然)", () =>
|
||||
{
|
||||
const { document } = setupDom('<p lang="zh-Hant">好。」嗎</p>');
|
||||
|
||||
Reference in New Issue
Block a user