2d42c7ecf2
從零重寫之第一垂直切片(依 ARCHITECTURE.md 契約),涵蓋並超越 v1 全部功能。 核心基座(src/core):unicode 字元表+標點子類+字形側位;locale 語言與 全角/開明政策(全域 lang.style +逐 lang policy);dom(jz-* 工廠+可還原 標記);finder 遍歷引擎(avoid/scope.include/邏輯 run/pill 鄰字/分塊閘); pass 聚合管線。 功能 pass(src/typeset): - spacing:中西間隙採 margin 模型——包裹邊界左側字、以 margin-right 留隙, 不注入空白字元(textContent 完全不變、複製緊湊、justify 不暴增、不撐框、 行首乾淨)。含跨樣式邊界、pill、原檔空格移除。 - gapTrim(lineedge):layout pass,行末去隙,修正 justify 右緣內縮。 - longword:長英文詞 <span lang> + hyphens。 - jiya:標點 charify + 全角/開明/半角(全域 + 逐 lang);半形以字型 OpenType halt 渲染(按字形正確定位、不重疊,居中字形 !? 與繁體 locl 句逗點號皆正確); 行內連續擠壓。 - jinze:行首行末避頭尾(閉類/點號綁前字、開類綁後字,以詞元為邊界、長引文 中段可斷);亦為 justify 綁定載體。 - lineedge:行端擠壓 layout pass(括號引號;ResizeObserver 重算,瀏覽器專用)。 §8 justify:jz-char inline-block 原子,句末標點單份間距。 v1 相容層(compat/v1):createCjkAutospace().apply 映射,IIFE 全域別名。 構建:esbuild → ESM/IIFE/CSS;tsc → d.ts。測試:39 個 jsdom 案例。 demo:簡繁並列+justify+強制繁體開明+標點寬度量測,載 Noto webfont 作參考 (擠壓依賴字型 halt)。間隔號 · 不觸發中西間隙;200% 等詞元不被禁則切斷。
36 lines
1.6 KiB
JavaScript
36 lines
1.6 KiB
JavaScript
// 診斷:印出指定句子 charify 後每個 jz-char 的碼位與 class(ASCII 輸出,
|
||
// 不受 Bash 非 ASCII 正規化影響)。非單元測試,手動執行。
|
||
|
||
import { setupDom } from "./helpers.mjs";
|
||
import { createJuzhen } from "../dist/juzhen.mjs";
|
||
|
||
function dump(label, lang, text)
|
||
{
|
||
const { document } = setupDom('<p lang="' + lang + '">' + text + "</p>");
|
||
createJuzhen({ spacing: false, longWord: false }).render(document.body);
|
||
console.log("=== " + label + " (lang=" + lang + ") ===");
|
||
document.querySelectorAll("jz-char").forEach((c) =>
|
||
{
|
||
const cp = "U+" + c.textContent.codePointAt(0).toString(16).toUpperCase().padStart(4, "0");
|
||
const cls = Array.from(c.classList).join(" ");
|
||
console.log(" " + cp + " [" + cls + "]");
|
||
});
|
||
}
|
||
|
||
dump("简体开明", "zh-Hans", "完了……怎么办?!真是的——他竟然走了。");
|
||
dump("繁体全角", "zh-Hant", "完了……怎麼辦?!真是的——他竟然走了。");
|
||
|
||
// #3:200% 是否被拆斷。印出 jinze 後 <p> 的子節點序列。
|
||
function dumpKids(label, lang, text)
|
||
{
|
||
const { document } = setupDom('<p lang="' + lang + '">' + text + "</p>");
|
||
createJuzhen({ spacing: true }).render(document.body);
|
||
console.log("=== kids " + label + " ===");
|
||
document.querySelector("p").childNodes.forEach((n) =>
|
||
{
|
||
if (n.nodeType === 3) { console.log(" text: " + JSON.stringify(n.data)); }
|
||
else { console.log(" <" + n.nodeName.toLowerCase() + "> " + JSON.stringify(n.textContent)); }
|
||
});
|
||
}
|
||
dumpKids("百分号", "zh-Hans", "效率提升了 200%,达到约 3.5 倍。");
|