From 82c2d2253503d02452d97907d400e636976b6ae7 Mon Sep 17 00:00:00 2001 From: commilitia Date: Mon, 1 Jun 2026 18:53:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20Pass=20D=20=E9=96=8B=E6=98=8E=E5=BC=8F?= =?UTF-8?q?=E6=A8=99=E9=BB=9E=E6=93=A0=E5=A3=93=EF=BC=88=E5=8F=A5=E5=85=A7?= =?UTF-8?q?=E9=BB=9E=E8=99=9F=E5=8D=8A=E5=BD=A2=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 句內點號(,、;:)逐字包進 ,配合消費端 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 測試。 --- README.md | 31 +++++++++- cjk-autospace.d.ts | 36 ++++++++++++ cjk-autospace.js | 144 +++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 204 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9a3abd3..481047f 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # cjk-autospace -CJK ↔ Latin / 數字 / 標點 / 引號 / 括號 / 運算子等邊界之自動間距 shim。Pangu.js v7.2.1 規則之 ES5 端口,加上「跨樣式標籤透明 + 行內塊邊界」兩 pass 架構,再加 Pass C 長英文段 `` 包裝(讓瀏覽器原生連字斷詞)。工廠模式,由消費端注入配置。 +CJK ↔ Latin / 數字 / 標點 / 引號 / 括號 / 運算子等邊界之自動間距 shim。Pangu.js v7.2.1 規則之 ES5 端口,加上「跨樣式標籤透明 + 行內塊邊界」兩 pass 架構,再加 Pass C 長英文段 `` 包裝(讓瀏覽器原生連字斷詞)、Pass D 開明式標點擠壓(句內點號半形)。工廠模式,由消費端注入配置。 > **詳細文檔 + Changelog 位於 `docs` 分支**:架構解析、雙 pass 流程、整合範例見 [`index.html`](https://git.commilitia.net/admin/cjk-autospace/src/branch/docs/index.html);變更記錄見 [`CHANGELOG.html`](https://git.commilitia.net/admin/cjk-autospace/src/branch/docs/CHANGELOG.html)。本機並列檢出:`git worktree add ../cjk-autospace-docs docs`。 @@ -27,13 +27,31 @@ autospace.apply(document.body); `user-select: none` 讓選取與剪貼板跳過 marker;marker 內含真實 ASCII space(layout 視為 whitespace:行末 collapse、容許換行、justify 可拉伸)。 +開明式標點擠壓(Pass D)另需: + +```css +/* 句內點號半形——CSS 表達不了「只擠句內、不擠句末」,故由 lib 逐字包裝, + 此處只負責把被包裝者擠成半形。需字型具 halt(Noto Sans/Serif CJK 皆有)。 */ +.cjk-squeeze { + font-feature-settings: "halt" 1; +} + +/* 連續標點擠壓 + 行端壓縮(clreq)——原生 layout-aware,套在正文容器上。 + Chrome 123+ 預設即 normal,明確標注以防被 reset;同樣要求字型具 halt/chws。 */ +.article { + text-spacing-trim: normal; +} +``` + +不加 `.cjk-squeeze` 規則則 span 惰性(DOM 變更但無視覺效果)。`text-spacing-trim` 於 Chromium 不支援時優雅降級(句內半角仍由 `halt` 生效)。 + ## 標籤三分類 - **STYLE_INLINES**(`` / `` / `` / `` / `` / `` / `` / `` / `` / `` / `` / `` / `` / `` / `` / `` / `` / `` / `` / `` / `