admin
|
96f5ac32e1
|
fix: 原子透明——段落繼承屬性漏溢修復(text-indent/hanging-punctuation/text-decoration)
下游回報:段落設 text-indent 時,標點附近冒出巨大間距。根因為聚珍把標點拆成
inline-block 原子,繼承屬性被每個原子重複套用(過套用),且裝飾盒跳過原子(欠套用)。
以「同類問題整體界定」原則統一在庫內修復,使原子對消費端段落樣式透明。
範圍(headless Chrome 逐屬性實測界定,非逐案補丁):
過套用(繼承屬性被 inline-block 原子各自重套),於原子歸零:
- text-indent: 0——段落首行縮排傳入後每原子內部各縮排一次,shrink-to-fit 寬膨脹為
縮排量+字形。實測:歸零後段落首行縮排保持 2em、原子寬由 ~3em 回到 0.5em/1em。
- hanging-punctuation: none——同屬區塊容器首/末行機制;Chrome 未實作、Safari 觸發,
且與規劃中之標點懸掛相衝,按機制一併歸零。
欠套用(text-decoration 非繼承、由段落裝飾盒繪製並跳過原子致下劃線斷缺),令原子
inherit 自繪接續:
- jz-char/jz-jinze 設 text-decoration: inherit;margin 模式 jz-inner 亦為
inline-block,於 _jiya.css 補一條。像素掃描實測:halt/margin 兩模式下劃線
coverage 由 ~0.25 回到 1.0,且 margin 下劃線隨半形收為 0.5em advance。
不處理者(實測不洩漏或本應逐字穿透):letter-spacing/word-spacing/text-align 系/
text-transform/line-height/color/font/word-break/overflow-wrap/hyphens/
white-space/tab-size/text-emphasis/text-shadow/font-variant/font-stretch。
- src/css/_normalize.css:過套用歸零 + text-decoration 透明(含原則與實測依據注釋)。
- src/css/_jiya.css:margin 模式 jz-inner 裝飾接續。
- test/juzhen.test.mjs:三項回歸斷言(51 測試通過)。
- README.md CSS 基礎設定第 8 項、ARCHITECTURE.md「原子透明原則」一節。
- dist/ 重建。
|
2026-06-02 17:18:41 +08:00 |
|
admin
|
7b4a051a1f
|
feat: 標點半形 margin 後備模式+下游回饋修復
margin 後備(供缺 OpenType halt 之字型):
- jiya.halfWidth: "halt"(預設)|"margin"。margin 以 width:0.5em+字身依墨色
偏側溢出定位,於 CSS 盒模型重現 halt 之半形 advance(真 0.5em;相鄰標點各
0.5em、合佔 1em,無負 margin 之鄰接疊加/單側重疊)。模式由 data-jz-halfwidth
子樹屬性決定(可逐區塊/逐 lang,含 halt-island 反置)。
- 偏側 inkBias 依字身墨色中心給 left/center/right/full;參考表據方正書宋 GBK
實測,consumer 可經 jiya.bias 逐 lang 逐字覆寫。
- _lang.css 字型堆疊僅作後備(全包 :where 零特異度、只命中帶 lang 屬性之元素、
不直接覆寫 jz-inner)→ 消費端 font-family 恆優先,標點隨之以消費端字型渲染。
- 新增 tools/measure-bias.py(量 glyph ink 中心、產偏側建議表)+ README
「字型適配工作流」。demo/fallback.html:方正書宋 GBK 對照 halt 失效 vs margin。
下游回饋修復:
- 1a:adjacentLogicalChar 透明穿越 jz-jinze(同 jz-hws/樣式行內)→ pill 緊鄰
CJK 標點時,左緣間隙與作者空格剝除復原(jinze 先於 spacing 之交互)。
- 1b:CJK↔CJK 贅餘作者空格(含跨 inline 標籤)剝除、不留隙,與 CJK↔Latin 之
邊界正規化一致(DEL 哨符,全形空格 U+3000 不動)。
- 問題二:新增 justifyAtoms 選項;false → jz-char/jz-jinze 改 display:inline,
相容分頁器(Paged.js)對齊引擎(halt 半形與禁則 nowrap 保留)。
測試 43→49 全通過;dist 重建;README/ARCHITECTURE 同步更新契約。
|
2026-06-02 01:21:52 +08:00 |
|
admin
|
6834029c31
|
chore: gitignore .docs/ — docs 分支 HTML 文檔之未追蹤本地鏡像
文檔正本只存於 docs 分支;main 留一份未追蹤副本於 .docs/(唯讀)。
舊 docs 分支更名為 docs-legacy。
|
2026-06-01 21:35:34 +08:00 |
|
admin
|
2d42c7ecf2
|
feat: 聚珍切片 1 — 中西間隙/標點擠壓/禁則 + v1 相容層
從零重寫之第一垂直切片(依 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% 等詞元不被禁則切斷。
|
2026-06-01 21:31:07 +08:00 |
|
admin
|
8098991b6b
|
docs: ARCHITECTURE.md — 聚珍(Juzhen)架構契約
從零重寫之實作契約,先於程式碼。涵蓋:
- 設計不變量 I1–I10(複製乾淨、JS/CSS 分離、依 lang、跨瀏覽器一致並顯式禁用
不一致原語、justify 單份間距、冪等可還原、邊界感知、v1 向下相容、遍歷聚合、
作用域與分塊)。
- createJuzhen API;3 階段聚合管線(collect/apply,把 ~9 次走訪壓到 3 次)。
- 核心基座 finder/unicode/locale/dom;jz-* 元素詞彙。
- 對照 Han.css 逐功能點實作方案(間隙/長詞/擠壓/禁則/懸掛/標點修正/著重號/注音)。
- 切片 1=v1 對等之映射;§3.5 v1 相容層;§3.6 作用域與分塊功能選擇。
- §8 justify 句末單份間距解法;§9.1 顯式禁用層;§14 風險+預案。
|
2026-06-01 19:24:03 +08:00 |
|
admin
|
74b24d75d0
|
chore: 清空 main,從零重寫為 聚珍(Juzhen)
移除 v1 的 cjk-autospace 來源(pangu shim + Pass D halt 擠壓)與過早建立
的鷹架。v1 完整保留於 v1-autospace 分支。main 自此作為「現代簡/繁中文
網頁排版套件」之全新重寫起點。保留 .gitignore 作為倉庫基礎設施。
|
2026-06-01 19:04:01 +08:00 |
|
admin
|
82c2d22535
|
feat: Pass D 開明式標點擠壓(句內點號半形)
句內點號(,、;:)逐字包進 <span class="cjk-squeeze">,配合消費端 CSS
`font-feature-settings: "halt"` 擠成半形;句末點號(。?!)保持全形——
此即開明式。span 內含真標點字元,複製不污染原文。
clreq 之「連續標點擠壓」與「行端壓縮」屬 layout-aware 規則,交由原生
`text-spacing-trim` 處理(Chrome 123+ 預設生效,要求字型有 halt/chws),
JS 不涉入以免重複擠壓。真·行尾懸掛(hanging-punctuation)僅 Safari 支援
且繁體橫排不宜,故不納入配方。
預設啟用,支援 `langWhitelist` 依 lang 前綴限定擠壓範圍、`marks` 與
`squeezeClass` 自訂。含 16 項 jsdom DOM 測試。
|
2026-06-01 18:53:50 +08:00 |
|
admin
|
a5faec5abf
|
feat: 補 ESM export { createCjkAutospace }
下游 Vite / Rollup / TypeScript 靜態 ESM 解析需要真正之 `export`
關鍵字;原 UMD-ish(module.exports + globalThis)對 ESM 消費端
仍須走副作用導入 + globalThis 取值之 workaround。
於檔尾既有 CJS / globalThis 兩塊後再加 `export { createCjkAutospace };
順序刻意如此,讓串接端(IIFE 函式體內不能有 module-level export)
只需以 `sed '/^export {/d'` 剝最後一行即安全。
four-form export 同時支援:ESM named import / CommonJS require /
globalThis / IIFE 串接(後者需剝 export 行)。README 同步補上。
|
2026-05-26 17:25:34 +08:00 |
|
admin
|
a0c66ecadc
|
feat: Pass C —— 長英文段 lang 包裝(預設啟用)
把 [A-Za-z]{N,} 之長英文段包進 <span lang="en">,配合消費端 CSS
[lang|="en"] { hyphens: auto; ... } 用瀏覽器原生 en 字典斷詞 + 渲
染連字符。連字符純由 CSS 渲染,DOM 內不存在 → 選取 / 複製返回原文
無污染。冪等:parent 為 <span lang> 直接跳過。
skip 鏈共用 Pass A / B 之 isSkipped(CODE / KBD / PRE / SAMP / TT
/ VAR / SCRIPT / STYLE / TEXTAREA / INPUT / SVG / contentEditable
/ data-md-key)。
預設啟用以解 CJK 兩端對齊正文中行末長英文詞之斷行問題;消費端可傳
longWordWrap: false 顯式關閉,或 { minLength, lang } 自訂粒度與標
語。
README + .d.ts 同步說明,含字型陷阱(CJK serif 把 U+2010 設為全形)
與消費端 CSS 範本(含 hyphenate-character: "-")。
|
2026-05-26 16:54:23 +08:00 |
|
admin
|
1b12a8549d
|
README: 指向 docs 分支(架構詳細文檔 + Changelog)
|
2026-05-22 23:26:52 +08:00 |
|
admin
|
c3defc4054
|
初始:cjk-autospace 工廠函式 + TS 宣告 + README
雙 pass 架構:
- Pass A — 對每個 BLOCK 走 DFS 收集邏輯文本(樣式標籤透明、PILL
與子 BLOCK 中斷 run),套 panguSpace,把 MARK 反映射回
textNode / offset 並插入 .cjk-autospace marker span
- Pass B — 對每個 PILL(pillSelector)透過樣式鏈遞迴找邏輯鄰字,
按 0 / 1 / 多 + 特殊規則處理空白
工廠 createCjkAutospace(options) 接受 pillSelector / styleInlines /
blockTags / skipTags / autospaceClass / skipAttribute / isSkipped 等
配置。UMD-ish export 同時支援 ESM、CommonJS、browser global 與
inline script 形式。
規則表 port 自 Pangu.js v7.2.1(MIT),加上跨樣式邊界透明與行內塊
邊界兩 pass 為原創設計。
|
2026-05-22 22:58:10 +08:00 |
|