@xsynaptic/rehype-wrap-cjk 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +4 -4
- package/dist/index.mjs +12 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -3,11 +3,11 @@ import { Plugin } from "unified";
|
|
|
3
3
|
|
|
4
4
|
//#region src/index.d.ts
|
|
5
5
|
interface RehypeWrapCjkOptions {
|
|
6
|
-
element?: string;
|
|
7
6
|
attribute?: string;
|
|
8
|
-
|
|
7
|
+
element?: string;
|
|
9
8
|
regex?: RegExp;
|
|
10
9
|
skipTags?: Array<string>;
|
|
10
|
+
value?: string;
|
|
11
11
|
}
|
|
12
12
|
/**
|
|
13
13
|
* Script-based ranges using Unicode Script Extensions property
|
|
@@ -23,10 +23,10 @@ declare const cjkScriptRange: string;
|
|
|
23
23
|
*/
|
|
24
24
|
declare const fullwidthAsciiRange: string;
|
|
25
25
|
declare const cjkRegexPresets: {
|
|
26
|
-
|
|
26
|
+
cjk: RegExp;
|
|
27
27
|
ja: RegExp;
|
|
28
28
|
ko: RegExp;
|
|
29
|
-
|
|
29
|
+
zh: RegExp;
|
|
30
30
|
};
|
|
31
31
|
declare const rehypeWrapCjk: Plugin<[RehypeWrapCjkOptions?], Root>;
|
|
32
32
|
//#endregion
|
package/dist/index.mjs
CHANGED
|
@@ -32,20 +32,26 @@ const cjkScriptRange = String.raw`\p{scx=Han}\p{scx=Hiragana}\p{scx=Katakana}\p{
|
|
|
32
32
|
*/
|
|
33
33
|
const fullwidthAsciiRange = String.raw`\uFF01-\uFF5E`;
|
|
34
34
|
const cjkRegexPresets = {
|
|
35
|
-
|
|
35
|
+
cjk: new RegExp(`[${cjkScriptRange}${fullwidthAsciiRange}]+`, "gu"),
|
|
36
36
|
ja: new RegExp(`[${jaScriptRange}${fullwidthAsciiRange}]+`, "gu"),
|
|
37
37
|
ko: new RegExp(`[${koScriptRange}${fullwidthAsciiRange}]+`, "gu"),
|
|
38
|
-
|
|
38
|
+
zh: new RegExp(`[${zhScriptRange}${fullwidthAsciiRange}]+`, "gu")
|
|
39
39
|
};
|
|
40
|
+
function presetFor(value) {
|
|
41
|
+
if (value === "cjk") return cjkRegexPresets.cjk;
|
|
42
|
+
if (value === "ja") return cjkRegexPresets.ja;
|
|
43
|
+
if (value === "ko") return cjkRegexPresets.ko;
|
|
44
|
+
if (value === "zh") return cjkRegexPresets.zh;
|
|
45
|
+
}
|
|
40
46
|
const rehypeWrapCjk = (options) => {
|
|
41
47
|
const settings = {
|
|
42
|
-
element: options?.element ?? "span",
|
|
43
48
|
attribute: options?.attribute ?? "class",
|
|
44
|
-
|
|
49
|
+
element: options?.element ?? "span",
|
|
45
50
|
regex: options?.regex,
|
|
46
|
-
skipTags: options?.skipTags ?? defaultSkipTags
|
|
51
|
+
skipTags: options?.skipTags ?? defaultSkipTags,
|
|
52
|
+
value: options?.value ?? "cjk"
|
|
47
53
|
};
|
|
48
|
-
const baseRegex = settings.regex ?? (settings.value
|
|
54
|
+
const baseRegex = settings.regex ?? presetFor(settings.value) ?? cjkRegexPresets.cjk;
|
|
49
55
|
const flags = baseRegex.flags.includes("g") ? baseRegex.flags : baseRegex.flags + "g";
|
|
50
56
|
const regex = new RegExp(baseRegex.source, flags);
|
|
51
57
|
function transformer(tree) {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import type { Element, Root, Text } from 'hast';\nimport type { Plugin, Transformer } from 'unified';\n\nimport { h } from 'hastscript';\nimport { visitParents } from 'unist-util-visit-parents';\n\nexport interface RehypeWrapCjkOptions {\n\
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["import type { Element, Root, Text } from 'hast';\nimport type { Plugin, Transformer } from 'unified';\n\nimport { h } from 'hastscript';\nimport { visitParents } from 'unist-util-visit-parents';\n\nexport interface RehypeWrapCjkOptions {\n\tattribute?: string;\n\telement?: string;\n\tregex?: RegExp;\n\tskipTags?: Array<string>;\n\tvalue?: string;\n}\n\nconst defaultSkipTags = ['code', 'pre', 'kbd', 'samp', 'script', 'style'];\n\nfunction isAncestorWrapped(ancestor: Element, attribute: string, value: string): boolean {\n\tif (attribute === 'class' || attribute === 'className') {\n\t\tconst classes = ancestor.properties.className;\n\n\t\tif (Array.isArray(classes)) return classes.includes(value);\n\n\t\tif (typeof classes === 'string') return classes.split(/\\s+/).includes(value);\n\n\t\treturn false;\n\t}\n\treturn ancestor.properties[attribute] === value;\n}\n\n/**\n * Script-based ranges using Unicode Script Extensions property\n * Authoritative and auto-updates with the JS engine's Unicode version\n */\nexport const zhScriptRange = String.raw`\\p{scx=Han}\\p{scx=Bopomofo}`;\nexport const jaScriptRange = String.raw`\\p{scx=Hiragana}\\p{scx=Katakana}\\p{scx=Han}`;\nexport const koScriptRange = String.raw`\\p{scx=Hangul}\\p{scx=Han}`;\nexport const cjkScriptRange = String.raw`\\p{scx=Han}\\p{scx=Hiragana}\\p{scx=Katakana}\\p{scx=Hangul}\\p{scx=Bopomofo}`;\n\n/**\n * Full-width ASCII variants (FF01-FF5E): digits,letters, punctuation\n * Not covered by script extensions but sometimes used in CJK contexts\n */\nexport const fullwidthAsciiRange = String.raw`\\uFF01-\\uFF5E`;\n\nexport const cjkRegexPresets = {\n\tcjk: new RegExp(`[${cjkScriptRange}${fullwidthAsciiRange}]+`, 'gu'),\n\tja: new RegExp(`[${jaScriptRange}${fullwidthAsciiRange}]+`, 'gu'),\n\tko: new RegExp(`[${koScriptRange}${fullwidthAsciiRange}]+`, 'gu'),\n\tzh: new RegExp(`[${zhScriptRange}${fullwidthAsciiRange}]+`, 'gu'),\n};\n\nfunction presetFor(value: string): RegExp | undefined {\n\tif (value === 'cjk') return cjkRegexPresets.cjk;\n\tif (value === 'ja') return cjkRegexPresets.ja;\n\tif (value === 'ko') return cjkRegexPresets.ko;\n\tif (value === 'zh') return cjkRegexPresets.zh;\n\treturn undefined;\n}\n\nexport const rehypeWrapCjk: Plugin<[RehypeWrapCjkOptions?], Root> = (options) => {\n\tconst settings = {\n\t\tattribute: options?.attribute ?? 'class',\n\t\telement: options?.element ?? 'span',\n\t\tregex: options?.regex,\n\t\tskipTags: options?.skipTags ?? defaultSkipTags,\n\t\tvalue: options?.value ?? 'cjk',\n\t};\n\n\tconst baseRegex = settings.regex ?? presetFor(settings.value) ?? cjkRegexPresets.cjk;\n\n\t// always clone so a caller-supplied global regex never carries its lastIndex into matchAll\n\tconst flags = baseRegex.flags.includes('g') ? baseRegex.flags : baseRegex.flags + 'g';\n\tconst regex = new RegExp(baseRegex.source, flags);\n\n\tfunction transformer(tree: Root) {\n\t\tvisitParents(tree, 'text', function visitor(node, ancestors) {\n\t\t\tconst parent = ancestors.at(-1);\n\t\t\tif (!parent || !('children' in parent) || typeof node.value !== 'string') return;\n\n\t\t\t// Skip text inside excluded tags (code, pre, script, etc.)\n\t\t\tif (\n\t\t\t\tancestors.some(\n\t\t\t\t\t(ancestor) => ancestor.type === 'element' && settings.skipTags.includes(ancestor.tagName),\n\t\t\t\t)\n\t\t\t)\n\t\t\t\treturn;\n\n\t\t\t// Skip if any ancestor is already wrapped\n\t\t\tif (\n\t\t\t\tancestors.some(\n\t\t\t\t\t(ancestor) =>\n\t\t\t\t\t\tancestor.type === 'element' &&\n\t\t\t\t\t\tisAncestorWrapped(ancestor, settings.attribute, settings.value),\n\t\t\t\t)\n\t\t\t)\n\t\t\t\treturn;\n\n\t\t\tconst index = parent.children.indexOf(node);\n\t\t\tif (index === -1) return;\n\n\t\t\tconst parts: Array<Element | Text> = [];\n\t\t\tlet lastIndex = 0;\n\n\t\t\tfor (const match of node.value.matchAll(regex)) {\n\t\t\t\tconst matchIndex = match.index;\n\n\t\t\t\tif (matchIndex > lastIndex) {\n\t\t\t\t\tparts.push({\n\t\t\t\t\t\ttype: 'text',\n\t\t\t\t\t\tvalue: node.value.slice(lastIndex, matchIndex),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tparts.push(h(settings.element, { [settings.attribute]: settings.value }, [match[0]]));\n\t\t\t\tlastIndex = matchIndex + match[0].length;\n\t\t\t}\n\n\t\t\tif (lastIndex < node.value.length) {\n\t\t\t\tparts.push({ type: 'text', value: node.value.slice(lastIndex) });\n\t\t\t}\n\n\t\t\tparent.children.splice(index, 1, ...parts);\n\t\t});\n\n\t\treturn tree;\n\t}\n\n\treturn transformer satisfies Transformer<Root>;\n};\n"],"mappings":";;;AAcA,MAAM,kBAAkB;CAAC;CAAQ;CAAO;CAAO;CAAQ;CAAU;AAAO;AAExE,SAAS,kBAAkB,UAAmB,WAAmB,OAAwB;CACxF,IAAI,cAAc,WAAW,cAAc,aAAa;EACvD,MAAM,UAAU,SAAS,WAAW;EAEpC,IAAI,MAAM,QAAQ,OAAO,GAAG,OAAO,QAAQ,SAAS,KAAK;EAEzD,IAAI,OAAO,YAAY,UAAU,OAAO,QAAQ,MAAM,KAAK,CAAC,CAAC,SAAS,KAAK;EAE3E,OAAO;CACR;CACA,OAAO,SAAS,WAAW,eAAe;AAC3C;;;;;AAMA,MAAa,gBAAgB,OAAO,GAAG;AACvC,MAAa,gBAAgB,OAAO,GAAG;AACvC,MAAa,gBAAgB,OAAO,GAAG;AACvC,MAAa,iBAAiB,OAAO,GAAG;;;;;AAMxC,MAAa,sBAAsB,OAAO,GAAG;AAE7C,MAAa,kBAAkB;CAC9B,KAAK,IAAI,OAAO,IAAI,iBAAiB,oBAAoB,KAAK,IAAI;CAClE,IAAI,IAAI,OAAO,IAAI,gBAAgB,oBAAoB,KAAK,IAAI;CAChE,IAAI,IAAI,OAAO,IAAI,gBAAgB,oBAAoB,KAAK,IAAI;CAChE,IAAI,IAAI,OAAO,IAAI,gBAAgB,oBAAoB,KAAK,IAAI;AACjE;AAEA,SAAS,UAAU,OAAmC;CACrD,IAAI,UAAU,OAAO,OAAO,gBAAgB;CAC5C,IAAI,UAAU,MAAM,OAAO,gBAAgB;CAC3C,IAAI,UAAU,MAAM,OAAO,gBAAgB;CAC3C,IAAI,UAAU,MAAM,OAAO,gBAAgB;AAE5C;AAEA,MAAa,iBAAwD,YAAY;CAChF,MAAM,WAAW;EAChB,WAAW,SAAS,aAAa;EACjC,SAAS,SAAS,WAAW;EAC7B,OAAO,SAAS;EAChB,UAAU,SAAS,YAAY;EAC/B,OAAO,SAAS,SAAS;CAC1B;CAEA,MAAM,YAAY,SAAS,SAAS,UAAU,SAAS,KAAK,KAAK,gBAAgB;CAGjF,MAAM,QAAQ,UAAU,MAAM,SAAS,GAAG,IAAI,UAAU,QAAQ,UAAU,QAAQ;CAClF,MAAM,QAAQ,IAAI,OAAO,UAAU,QAAQ,KAAK;CAEhD,SAAS,YAAY,MAAY;EAChC,aAAa,MAAM,QAAQ,SAAS,QAAQ,MAAM,WAAW;GAC5D,MAAM,SAAS,UAAU,GAAG,EAAE;GAC9B,IAAI,CAAC,UAAU,EAAE,cAAc,WAAW,OAAO,KAAK,UAAU,UAAU;GAG1E,IACC,UAAU,MACR,aAAa,SAAS,SAAS,aAAa,SAAS,SAAS,SAAS,SAAS,OAAO,CACzF,GAEA;GAGD,IACC,UAAU,MACR,aACA,SAAS,SAAS,aAClB,kBAAkB,UAAU,SAAS,WAAW,SAAS,KAAK,CAChE,GAEA;GAED,MAAM,QAAQ,OAAO,SAAS,QAAQ,IAAI;GAC1C,IAAI,UAAU,IAAI;GAElB,MAAM,QAA+B,CAAC;GACtC,IAAI,YAAY;GAEhB,KAAK,MAAM,SAAS,KAAK,MAAM,SAAS,KAAK,GAAG;IAC/C,MAAM,aAAa,MAAM;IAEzB,IAAI,aAAa,WAChB,MAAM,KAAK;KACV,MAAM;KACN,OAAO,KAAK,MAAM,MAAM,WAAW,UAAU;IAC9C,CAAC;IAEF,MAAM,KAAK,EAAE,SAAS,SAAS,GAAG,SAAS,YAAY,SAAS,MAAM,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACpF,YAAY,aAAa,MAAM,EAAE,CAAC;GACnC;GAEA,IAAI,YAAY,KAAK,MAAM,QAC1B,MAAM,KAAK;IAAE,MAAM;IAAQ,OAAO,KAAK,MAAM,MAAM,SAAS;GAAE,CAAC;GAGhE,OAAO,SAAS,OAAO,OAAO,GAAG,GAAG,KAAK;EAC1C,CAAC;EAED,OAAO;CACR;CAEA,OAAO;AACR"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xsynaptic/rehype-wrap-cjk",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.1",
|
|
4
4
|
"description": "Rehype plugin for wrapping CJK character sequences in an HTML element with a configurable attribute for styling or language tagging.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|