2026-05-26 — 補 ESM export(四種消費形式並存)
下游 Vite / Rollup / TypeScript 之靜態 ESM 解析需要真正之 export 關鍵字;原 UMD-ish(module.exports + globalThis)對 ESM 消費端仍須走「副作用導入 + 從 global 取 factory」之 workaround。檔尾在既有 CJS / globalThis 兩塊後加 export { createCjkAutospace },順序刻意如此 —— 讓 IIFE 串接端(Claude 模板 build.sh / Nvim peek build hook)只需以 sed '/^export {/d' 剝最後一行。
四種消費形式並存:ESM import / CommonJS require / browser globalThis / IIFE 串接(後者需剝 export 行)。
2026-05-26 — Pass C:長英文段 lang 包裝(預設啟用)
解決 CJK 兩端對齊正文中行末長英文詞之斷行問題。原模板於 runtime 端用 <wbr> 每 6 字元亂插斷詞機會,產生兩個觀感問題:(1)位置與音節邊界無關,斷在怪位;(2)<wbr> 為 zero-width,斷處不顯連字符,讀者無法辨認「上行末是被斷開的詞」。
Pass C 走另一條路:把 [A-Za-z]{N,}(預設 N=6)之長英文段包進 <span lang="en">,配合消費端 CSS:
[lang|="en"] {
hyphens: auto;
-webkit-hyphens: auto;
hyphenate-limit-chars: 6 3 3;
hyphenate-character: "-"; /* 強制 U+002D 而非預設 U+2010 */
-webkit-hyphenate-character: "-";
}
- 瀏覽器原生
hyphens: auto用 en 字典做斷詞 + 渲染連字符;連字符純由 CSS 渲染,DOM 內不存在 → 選取 / 複製返回原文無污染(符合「斷字符僅供渲染」之核心約束) - 冪等:parent 為
<span lang>直接跳過,重跑或 MutationObserver 觸發不會重複包裝 - skip 鏈與 Pass A / B 共用
isSkipped:CODE / KBD / PRE / SAMP / TT / VAR / SCRIPT / STYLE / TEXTAREA / INPUT / SVG / contentEditable /data-md-key皆跳過 - 預設啟用。
longWordWrap: false顯式關閉;{ minLength, lang }自訂粒度與標語
字型陷阱:U+2010 之全形 CJK 設計
瀏覽器 hyphens: auto 預設在斷處插 U+2010 HYPHEN。Noto Serif CJK SC 等 CJK serif 字型把 U+2010 設計為 全形 1 em(與一個漢字同寬),以服務 CJK 範圍表達(1月—3月);而 U+002D HYPHEN-MINUS 在同字型內為窄拉丁(約 0.35 em)。直接吃預設會看到「全形連字符」突兀地接在英文詞末。
解法是消費端 CSS 加 hyphenate-character: "-",強制使用 U+002D;仍為純視覺渲染,DOM 與剪貼簿不受影響。lib 不涉入字型決策,僅在文檔中提示。
2026-05-22 — 初始發布
- 工廠函式
createCjkAutospace(options),回傳{ apply(root?) }。Port 自 Pangu.js v7.2.1 規則表(MIT 授權),覆寫架構為雙 pass:- Pass A — per-block Pangu on tag-stripped text:對每個 BLOCK 走 DFS 收集邏輯文本(樣式標籤透明、PILL 與子 BLOCK 中斷 run),整段套
panguSpace,把 MARK 反映射回 textNode/offset 並插入.cjk-autospacemarker span。 - Pass B — pill boundary, style-inline aware:對每個 PILL 透過樣式鏈遞迴找邏輯鄰字(
adjacentLogicalChar),按 0/1/多+特殊規則處理空白。
- Pass A — per-block Pangu on tag-stripped text:對每個 BLOCK 走 DFS 收集邏輯文本(樣式標籤透明、PILL 與子 BLOCK 中斷 run),整段套
- 標籤三分類:STYLE_INLINES / PILL / BLOCK,皆可由消費端配置。
- UMD-ish export:同時支援 ESM
import、CommonJSrequire、browser globalglobalThis.createCjkAutospace與 inline<script>函式宣告形式。 - TS 宣告:
cjk-autospace.d.ts提供完整CjkAutospaceOptions與CjkAutospaceInstance型別。 - 初始消費者:
- Claude HTML 模板(
Base/templates/html/runtime/lib/cjk-autospace/,pillSelector"code, kbd") - Peek.nvim Markdown 預覽 shim(
Nvim/lua/user/lib/cjk-autospace/,pillSelector"code, kbd, mark, samp") - cdrop(
cdrop/web/src/lib/cjk-autospace/,pillSelector"code, kbd, .cjk-pill")
- Claude HTML 模板(
- docs 分支:
index.html(架構詳細文檔)+CHANGELOG.html(本檔)。
<strong>是</strong> Neovim 此類邊界無法被識別)。