punctilio 3.7.0 → 3.7.2
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.ts +1 -1
- package/dist/nbsp.d.ts.map +1 -1
- package/dist/nbsp.js +5 -2
- package/dist/nbsp.js.map +1 -1
- package/dist/rehype.d.ts +2 -1
- package/dist/rehype.d.ts.map +1 -1
- package/dist/rehype.js +15 -26
- package/dist/rehype.js.map +1 -1
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +19 -9
- package/dist/symbols.js.map +1 -1
- package/dist/tests/test-helpers.d.ts +5 -4
- package/dist/tests/test-helpers.d.ts.map +1 -1
- package/dist/tests/test-helpers.js +31 -14
- package/dist/tests/test-helpers.js.map +1 -1
- package/package.json +6 -6
- package/src/index.ts +1 -1
- package/src/nbsp.ts +5 -2
- package/src/rehype.ts +18 -28
- package/src/symbols.ts +23 -9
- package/src/tests/rehype.test.ts +23 -1
- package/src/tests/symbols.test.ts +61 -0
- package/src/tests/test-helpers.ts +34 -14
package/dist/index.d.ts
CHANGED
|
@@ -49,7 +49,7 @@ export interface TransformOptions {
|
|
|
49
49
|
* Example: "Hello". and "Hello",
|
|
50
50
|
* - `"german"`: German style. Uses low-9 quote characters: „..." and ‚...'
|
|
51
51
|
* (U+201E/U+201C double, U+201A/U+2018 single). Punctuation outside quotes.
|
|
52
|
-
* - `"french"`: French style. Uses guillemets with
|
|
52
|
+
* - `"french"`: French style. Uses guillemets with NNBSP padding: «\u202F...\u202F»
|
|
53
53
|
* Single quotes remain as curly quotes. Punctuation outside quotes.
|
|
54
54
|
* - `"none"`: Skip all quote and punctuation transforms entirely.
|
|
55
55
|
* Straight quotes, apostrophes, and prime marks are left unmodified.
|
package/dist/nbsp.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nbsp.d.ts","sourceRoot":"","sources":["../src/nbsp.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAajD,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;AAO1D;;;GAGG;AACH,eAAO,MAAM,KAAK,UAqCjB,CAAA;AAED,eAAO,MAAM,UAAU,UActB,CAAA;AAED,eAAO,MAAM,uBAAuB,UASnC,CAAA;
|
|
1
|
+
{"version":3,"file":"nbsp.d.ts","sourceRoot":"","sources":["../src/nbsp.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAajD,MAAM,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAA;AAO1D;;;GAGG;AACH,eAAO,MAAM,KAAK,UAqCjB,CAAA;AAED,eAAO,MAAM,UAAU,UActB,CAAA;AAED,eAAO,MAAM,uBAAuB,UASnC,CAAA;AAYD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAOnF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAQxF;AAUD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAQlF;AAED;;;;;GAKG;AACH,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAO/F;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAOvF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAOnF;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAOzF;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAOnF;AAsBD,gEAAgE;AAChE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAS7E"}
|
package/dist/nbsp.js
CHANGED
|
@@ -79,8 +79,11 @@ export const REFERENCE_ABBREVIATIONS = [
|
|
|
79
79
|
// Romance (Spanish / Portuguese / Italian)
|
|
80
80
|
"Cap",
|
|
81
81
|
];
|
|
82
|
-
// Precomputed regex fragments
|
|
83
|
-
|
|
82
|
+
// Precomputed regex fragments — sorted longest-first so the regex alternation
|
|
83
|
+
// matches the most specific unit before a shorter prefix (e.g. "mbar" before "m").
|
|
84
|
+
const UNIT_PATTERN = [...UNITS].sort((a, b) => b.length - a.length).join("|");
|
|
85
|
+
// Honorifics and abbreviations don't need longest-first sorting because
|
|
86
|
+
// the mandatory trailing `\.` disambiguates prefix overlaps (e.g. Mr\. vs Mrs\.).
|
|
84
87
|
const HONORIFIC_PATTERN = HONORIFICS.map((h) => `${h}\\.`).join("|");
|
|
85
88
|
const ABBREVIATION_PATTERN = REFERENCE_ABBREVIATIONS.map((a) => `${a}\\.`).join("|");
|
|
86
89
|
const PUNCTUATION_OR_QUOTE = `[.,!?:;)(${LEFT_DOUBLE_QUOTE}${RIGHT_DOUBLE_QUOTE}\u00AB\u00BB${LEFT_SINGLE_QUOTE}${RIGHT_SINGLE_QUOTE}"]`;
|
package/dist/nbsp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nbsp.js","sourceRoot":"","sources":["../src/nbsp.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"nbsp.js","sourceRoot":"","sources":["../src/nbsp.ts"],"names":[],"mappings":"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"}
|
package/dist/rehype.d.ts
CHANGED
|
@@ -170,9 +170,10 @@ export declare function transformElement(node: Element, transformFn: TextTransfo
|
|
|
170
170
|
* @param node - The root element to search from
|
|
171
171
|
* @param shouldSkip - Function to determine which elements to skip
|
|
172
172
|
* @param depth - Current recursion depth (internal use)
|
|
173
|
+
* @param alreadyTransformed - Elements already processed; skipped during traversal to avoid redundant work
|
|
173
174
|
* @returns Array of elements that contain transformable text
|
|
174
175
|
*/
|
|
175
|
-
export declare function collectTransformableElements(node: Element, shouldSkip: ElementPredicate, depth?: number): Element[];
|
|
176
|
+
export declare function collectTransformableElements(node: Element, shouldSkip: ElementPredicate, depth?: number, alreadyTransformed?: ReadonlySet<Element>): Element[];
|
|
176
177
|
/**
|
|
177
178
|
* Rehype plugin that applies punctilio typography transformations to HTML.
|
|
178
179
|
*
|
package/dist/rehype.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rehype.d.ts","sourceRoot":"","sources":["../src/rehype.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAI1C,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAI7D,8FAA8F;AAC9F,KAAK,gBAAgB,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAA;AAElD,gFAAgF;AAChF,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;AAEhD;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAClC,QAAQ,EAAE,IAAI,EACd,SAAS,EAAE,SAAS,OAAO,EAAE,KAC1B,OAAO,CAAA;AAEZ;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;;OAKG;IACH,cAAc,CAAC,EAAE,qBAAqB,CAAA;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,sBACf,SAAQ,gBAAgB,EACtB,uBAAuB;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IAEnB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;
|
|
1
|
+
{"version":3,"file":"rehype.d.ts","sourceRoot":"","sources":["../src/rehype.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,MAAM,CAAA;AACpF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAI1C,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAI7D,8FAA8F;AAC9F,KAAK,gBAAgB,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAA;AAElD,gFAAgF;AAChF,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;AAEhD;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAClC,QAAQ,EAAE,IAAI,EACd,SAAS,EAAE,SAAS,OAAO,EAAE,KAC1B,OAAO,CAAA;AAEZ;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC;;;;;OAKG;IACH,cAAc,CAAC,EAAE,qBAAqB,CAAA;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,sBACf,SAAQ,gBAAgB,EACtB,uBAAuB;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IAEnB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CACvB;AAmBD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,OAAO,GAAG,cAAc,EAC9B,UAAU,EAAE,gBAAgB,EAC5B,OAAO,CAAC,EAAE,uBAAuB,GAChC,IAAI,EAAE,CAMR;AAuCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,IAAI,EAAE,OAAO,EACb,UAAU,GAAE,gBAA8B,GACzC,MAAM,CAIR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,GAAG,WAAW,EAC1B,KAAK,GAAE,MAAU,GAChB,IAAI,GAAG,IAAI,CAeb;AAKD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAoB1D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,OAAO,EACb,WAAW,EAAE,eAAe,EAC5B,UAAU,EAAE,gBAAgB,EAC5B,SAAS,EAAE,MAAM,EACjB,eAAe,GAAE,OAAe,EAChC,OAAO,CAAC,EAAE,uBAAuB,GAChC,IAAI,CAgCN;AAwGD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,EACb,UAAU,EAAE,gBAAgB,EAC5B,KAAK,GAAE,MAAU,EACjB,kBAAkB,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,GACxC,OAAO,EAAE,CAsCX;AAqBD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,eAAe,CAC7B,OAAO,GAAE,sBAA2B,GACnC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CA0EzB;AAED,eAAe,eAAe,CAAA"}
|
package/dist/rehype.js
CHANGED
|
@@ -11,20 +11,6 @@ import { transform } from "./index.js";
|
|
|
11
11
|
import { DEFAULT_SEPARATOR, MAX_RECURSION_DEPTH } from "./constants.js";
|
|
12
12
|
import { transformTextNodes, formatErrorString } from "./utils.js";
|
|
13
13
|
const DEFAULT_SKIP_TAGS = ["code", "pre", "script", "style", "kbd", "var", "samp"];
|
|
14
|
-
/**
|
|
15
|
-
* Check if an element has a specific CSS class.
|
|
16
|
-
*/
|
|
17
|
-
function hasClass(node, className) {
|
|
18
|
-
const classNames = node.properties?.className;
|
|
19
|
-
if (Array.isArray(classNames)) {
|
|
20
|
-
return classNames.includes(className);
|
|
21
|
-
}
|
|
22
|
-
/* istanbul ignore next -- rehype-parse always produces arrays, but handle strings defensively */
|
|
23
|
-
if (typeof classNames === "string") {
|
|
24
|
-
return classNames.split(/\s+/).includes(className);
|
|
25
|
-
}
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
14
|
/**
|
|
29
15
|
* Check if any ancestor of a node matches a predicate.
|
|
30
16
|
*/
|
|
@@ -339,15 +325,16 @@ function hasTextDescendant(node, shouldSkip, depth = 0) {
|
|
|
339
325
|
* @param node - The root element to search from
|
|
340
326
|
* @param shouldSkip - Function to determine which elements to skip
|
|
341
327
|
* @param depth - Current recursion depth (internal use)
|
|
328
|
+
* @param alreadyTransformed - Elements already processed; skipped during traversal to avoid redundant work
|
|
342
329
|
* @returns Array of elements that contain transformable text
|
|
343
330
|
*/
|
|
344
|
-
export function collectTransformableElements(node, shouldSkip, depth = 0) {
|
|
331
|
+
export function collectTransformableElements(node, shouldSkip, depth = 0, alreadyTransformed) {
|
|
345
332
|
/* istanbul ignore if -- defensive: prevents stack overflow from malicious HTML */
|
|
346
333
|
if (depth > MAX_RECURSION_DEPTH) {
|
|
347
334
|
return [];
|
|
348
335
|
}
|
|
349
336
|
const results = [];
|
|
350
|
-
if (shouldSkip(node)) {
|
|
337
|
+
if (shouldSkip(node) || alreadyTransformed?.has(node)) {
|
|
351
338
|
return [];
|
|
352
339
|
}
|
|
353
340
|
const hasDirectText = node.children.some((child) => child.type === "text");
|
|
@@ -365,7 +352,7 @@ export function collectTransformableElements(node, shouldSkip, depth = 0) {
|
|
|
365
352
|
// children that should be independent, or has no text to transform.
|
|
366
353
|
for (const child of node.children) {
|
|
367
354
|
if (child.type === "element") {
|
|
368
|
-
const childResults = collectTransformableElements(child, shouldSkip, depth + 1);
|
|
355
|
+
const childResults = collectTransformableElements(child, shouldSkip, depth + 1, alreadyTransformed);
|
|
369
356
|
for (const r of childResults)
|
|
370
357
|
results.push(r);
|
|
371
358
|
}
|
|
@@ -420,15 +407,17 @@ function markDescendants(node, set, depth = 0) {
|
|
|
420
407
|
export function rehypePunctilio(options = {}) {
|
|
421
408
|
const { skipTags = DEFAULT_SKIP_TAGS, skipClasses = [], separator = DEFAULT_SEPARATOR, shouldSkipText, ...transformOptions } = options;
|
|
422
409
|
const skipTagSet = new Set(skipTags);
|
|
423
|
-
const
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
410
|
+
const skipClassSet = new Set(skipClasses);
|
|
411
|
+
const hasSkipClass = (node) => {
|
|
412
|
+
if (skipClassSet.size === 0)
|
|
413
|
+
return false;
|
|
414
|
+
const classNames = node.properties?.className;
|
|
415
|
+
const classes = Array.isArray(classNames)
|
|
416
|
+
? classNames.filter((c) => typeof c === "string")
|
|
417
|
+
: typeof classNames === "string" ? classNames.split(/\s+/) : [];
|
|
418
|
+
return classes.some((cls) => skipClassSet.has(cls));
|
|
431
419
|
};
|
|
420
|
+
const shouldSkip = (node) => skipTagSet.has(node.tagName) || hasSkipClass(node);
|
|
432
421
|
// Default idempotency check to false in plugin context — the separator
|
|
433
422
|
// count check already guards against corruption, and the double-pass
|
|
434
423
|
// penalty compounds across every block-level element.
|
|
@@ -462,7 +451,7 @@ export function rehypePunctilio(options = {}) {
|
|
|
462
451
|
return;
|
|
463
452
|
}
|
|
464
453
|
// Collect and transform elements with text content
|
|
465
|
-
const elementsToTransform = collectTransformableElements(node, shouldSkip);
|
|
454
|
+
const elementsToTransform = collectTransformableElements(node, shouldSkip, 0, transformed);
|
|
466
455
|
for (const elt of elementsToTransform) {
|
|
467
456
|
if (!transformed.has(elt)) {
|
|
468
457
|
transformElement(elt, transformFn, shouldSkip, separator, false, elementOptions);
|
package/dist/rehype.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rehype.js","sourceRoot":"","sources":["../src/rehype.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAEvD,OAAO,EAAE,SAAS,EAAyB,MAAM,YAAY,CAAA;AAC7D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AACvE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AA2DlE,MAAM,iBAAiB,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;AAElF;;GAEG;AACH,SAAS,
|
|
1
|
+
{"version":3,"file":"rehype.js","sourceRoot":"","sources":["../src/rehype.ts"],"names":[],"mappings":"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"}
|
package/dist/symbols.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uDAAuD;IACvD,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AA6BD,uCAAuC;AACvC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAc1E;AAED,gDAAgD;AAChD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,uDAAuD;IACvD,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AA6BD,uCAAuC;AACvC,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAc1E;AAED,gDAAgD;AAChD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAmEhF;AAmBD,0DAA0D;AAC1D,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAQ7E;AAuCD,yCAAyC;AACzC,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAsB9E;AAkBD,oCAAoC;AACpC,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAYxE;AAED,kFAAkF;AAClF,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAazE;AA2FD,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAe5E;AA6BD,0EAA0E;AAC1E,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CA2B3E;AASD,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAgBpF;AAED,sGAAsG;AACtG,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAInD;AAiBD,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAYtF;AAED,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CASjF"}
|
package/dist/symbols.js
CHANGED
|
@@ -39,7 +39,12 @@ export function multiplication(text, options = {}) {
|
|
|
39
39
|
const digitSuffix = `(?:${primeAlt}|${unitAlt})?`;
|
|
40
40
|
// Match entire multiplication chains in one pass: "5 x 5 x 5" or "5x5x5"
|
|
41
41
|
// Pattern matches: digit(s), then one or more (operator, digit(s)) groups
|
|
42
|
-
|
|
42
|
+
// The (?<!\d[eE]) lookbehind prevents matching inside ambiguous unsigned
|
|
43
|
+
// scientific notation (1e5x3 — could also be a model SKU). Signed exponents
|
|
44
|
+
// (1e-5x3, 3.5E+10x2) are unambiguously scientific so the multiplication
|
|
45
|
+
// is converted. The Latin-letter lookbehind blocks model-name identifiers
|
|
46
|
+
// (Surface5x3, RTX3060x2).
|
|
47
|
+
const chainPattern = cachedRegExp(`(?<!\\d[eE])(?<![${LATIN_LETTERS}\\d])(?<firstNum>\\d+${digitSuffix})(?<rest>(?:${chr}?\\s*[xX*]\\s*${chr}?\\d+${digitSuffix})+)`, "g");
|
|
43
48
|
text = text.replace(chainPattern, (...args) => {
|
|
44
49
|
const { firstNum, rest } = args.at(-1);
|
|
45
50
|
// Skip hexadecimal: 0x... or 0X...
|
|
@@ -58,7 +63,7 @@ export function multiplication(text, options = {}) {
|
|
|
58
63
|
});
|
|
59
64
|
// Trailing multiplier: 5x (followed by word boundary - space, punctuation, etc.)
|
|
60
65
|
const wbe = wordBoundaryEnd(chr);
|
|
61
|
-
const trailingPattern = cachedRegExp(`(?<!\\d)(?<num>\\d+${chr}?)[xX*]${wbe}`, "g");
|
|
66
|
+
const trailingPattern = cachedRegExp(`(?<!\\d[eE])(?<![${LATIN_LETTERS}\\d])(?<num>\\d+${chr}?)[xX*]${wbe}`, "g");
|
|
62
67
|
text = text.replace(trailingPattern, (match, num) => {
|
|
63
68
|
// Skip if this looks like start of hexadecimal
|
|
64
69
|
if (num === "0")
|
|
@@ -96,6 +101,8 @@ export function mathSymbols(text, options = {}) {
|
|
|
96
101
|
* stays cheap on long inputs.
|
|
97
102
|
*/
|
|
98
103
|
const LEGAL_SYMBOL_CONTEXT_WINDOW = 25;
|
|
104
|
+
/** Returns true when the context window ends with a path-like fragment (slash + non-whitespace). */
|
|
105
|
+
const isPathContext = (before) => /\/\S+$/.test(before);
|
|
99
106
|
/**
|
|
100
107
|
* Context-aware replacement for legal symbols like (c), (r), (tm).
|
|
101
108
|
* Extracts surrounding text, strips separator characters from the context
|
|
@@ -116,11 +123,12 @@ function contextAwareLegalReplace(text, pattern, replacement, shouldConvert, sep
|
|
|
116
123
|
export function legalSymbols(text, options = {}) {
|
|
117
124
|
const separator = options.separator ?? DEFAULT_SEPARATOR;
|
|
118
125
|
// (c) → © only with positive copyright evidence (year or "copyright" keyword)
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
126
|
+
// and not in a path context (e.g., example.com/path(c))
|
|
127
|
+
text = contextAwareLegalReplace(text, /\(c\)/gi, COPYRIGHT, (before, after) => !isPathContext(before) && (/^\s*(?:19|20)\d{2}\b/.test(after) || /\bcopyright\s*$/i.test(before)), separator);
|
|
128
|
+
// (r) → ® unless in enumeration "(q), (r)", legal citation "(r)(1)", or path context
|
|
129
|
+
text = contextAwareLegalReplace(text, /\(r\)/gi, REGISTERED, (before, after) => !/\([a-z]\)[,;]\s*$/i.test(before) && !/^\(\d/.test(after) && !isPathContext(before), separator);
|
|
130
|
+
// (tm) → ™ unless in a path context
|
|
131
|
+
text = contextAwareLegalReplace(text, /\(tm\)/gi, TRADEMARK, (before) => !isPathContext(before), separator);
|
|
124
132
|
return text;
|
|
125
133
|
}
|
|
126
134
|
/** Arrow pattern map: shape builder → Unicode symbol */
|
|
@@ -150,7 +158,9 @@ export function degrees(text, options = {}) {
|
|
|
150
158
|
// Handles separator between digit and unit
|
|
151
159
|
// Uses marker-aware boundary to avoid false matches like "20C\uE000elsius"
|
|
152
160
|
const wbe = wordBoundaryEnd(chr);
|
|
153
|
-
|
|
161
|
+
// Reject C/F followed by hyphen+letter ("C-compiler"), +/# ("C++", "F#")
|
|
162
|
+
const notCompound = `(?!-[${LATIN_LETTERS}]|[+#])`;
|
|
163
|
+
return text.replace(cachedRegExp(`(?<num>\\d${chr}?) ?(?<unit>[CF])${notCompound}${wbe}`, "g"), (_, num, unit) => `${num} ${DEGREE}${unit}`);
|
|
154
164
|
}
|
|
155
165
|
/**
|
|
156
166
|
* Build a regex that matches all quote characters in priority order:
|
|
@@ -184,7 +194,7 @@ function balancedPrimeReplacer(primeChar, escapedSeparator) {
|
|
|
184
194
|
// Matches when the text before a prime candidate ends with ′ followed by
|
|
185
195
|
// any mix of digits and separators (e.g., "5′1" before the "0" in 5′10").
|
|
186
196
|
const feetInchesContext = primeChar === DOUBLE_PRIME
|
|
187
|
-
?
|
|
197
|
+
? cachedRegExp(`${PRIME}(?:${escapedSeparator}|\\d)*$`, "")
|
|
188
198
|
: null;
|
|
189
199
|
let balance = 0;
|
|
190
200
|
// Replace callback: (match, ...captures, offset, fullString, namedGroups)
|
package/dist/symbols.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbols.js","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"symbols.js","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,10 +19,11 @@ export declare function buildMixedContent(charCount: number, seed?: string): str
|
|
|
19
19
|
* Default startingN of 5000 produces inputs from ~5K to ~40K chars, which is
|
|
20
20
|
* past V8's string allocation overhead inflection point where ms/char stabilizes.
|
|
21
21
|
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
22
|
+
* Each trial measures `fn` and a known-linear baseline back-to-back at both
|
|
23
|
+
* sizes, then divides `fn`'s 8x/4x ratio by the baseline's. Shared platform
|
|
24
|
+
* noise (CPU contention, scheduler jitter) inflates both numerator and
|
|
25
|
+
* denominator and cancels out; only `fn`-specific super-linear growth pushes
|
|
26
|
+
* the normalized ratio past 1. Min across trials picks the cleanest sample.
|
|
26
27
|
*
|
|
27
28
|
* @param fn - The function to benchmark
|
|
28
29
|
* @param buildInput - Builds an input string of approximately `n` units
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../src/tests/test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgCH;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,MAAa,GAAG,MAAM,CAQhF;
|
|
1
|
+
{"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../src/tests/test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAgCH;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,MAAa,GAAG,MAAM,CAQhF;AAUD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CACjC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,EAC9B,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,EACjC,SAAS,GAAE,MAAa,GACvB,IAAI,CAwCN"}
|
|
@@ -45,6 +45,13 @@ export function buildMixedContent(charCount, seed = "42") {
|
|
|
45
45
|
}
|
|
46
46
|
return result;
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Provably linear baseline: a single regex pass that touches every char and
|
|
50
|
+
* exercises the same V8 String.replace path the production transforms use.
|
|
51
|
+
* Its ms/char ratio is the platform's "what linear looks like right now"
|
|
52
|
+
* fingerprint — we divide fn's ratio by it to cancel shared CPU/GC noise.
|
|
53
|
+
*/
|
|
54
|
+
const linearBaseline = (s) => s.replace(/[a-z]/gi, "x");
|
|
48
55
|
/**
|
|
49
56
|
* Asserts that a function scales linearly (not quadratically) with input size.
|
|
50
57
|
*
|
|
@@ -55,10 +62,11 @@ export function buildMixedContent(charCount, seed = "42") {
|
|
|
55
62
|
* Default startingN of 5000 produces inputs from ~5K to ~40K chars, which is
|
|
56
63
|
* past V8's string allocation overhead inflection point where ms/char stabilizes.
|
|
57
64
|
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
65
|
+
* Each trial measures `fn` and a known-linear baseline back-to-back at both
|
|
66
|
+
* sizes, then divides `fn`'s 8x/4x ratio by the baseline's. Shared platform
|
|
67
|
+
* noise (CPU contention, scheduler jitter) inflates both numerator and
|
|
68
|
+
* denominator and cancels out; only `fn`-specific super-linear growth pushes
|
|
69
|
+
* the normalized ratio past 1. Min across trials picks the cleanest sample.
|
|
62
70
|
*
|
|
63
71
|
* @param fn - The function to benchmark
|
|
64
72
|
* @param buildInput - Builds an input string of approximately `n` units
|
|
@@ -67,26 +75,35 @@ export function buildMixedContent(charCount, seed = "42") {
|
|
|
67
75
|
export function assertLinearScaling(fn, buildInput, startingN = 5000) {
|
|
68
76
|
const input4x = buildInput(startingN * 4);
|
|
69
77
|
const input8x = buildInput(startingN * 8);
|
|
70
|
-
// Warmup with the largest input so JIT compiles all code paths
|
|
78
|
+
// Warmup both with the largest input so JIT compiles all code paths.
|
|
71
79
|
fn(input8x);
|
|
72
|
-
|
|
73
|
-
const
|
|
80
|
+
linearBaseline(input8x);
|
|
81
|
+
const minTrials = 8;
|
|
82
|
+
const minElapsedMs = 200;
|
|
74
83
|
let bestRatio = Infinity;
|
|
75
84
|
let totalElapsed = 0;
|
|
76
85
|
let trials = 0;
|
|
77
86
|
while (trials < minTrials || totalElapsed < minElapsedMs) {
|
|
78
|
-
const
|
|
87
|
+
const startFn4 = performance.now();
|
|
79
88
|
fn(input4x);
|
|
80
|
-
const
|
|
81
|
-
const
|
|
89
|
+
const fnTime4 = performance.now() - startFn4;
|
|
90
|
+
const startBase4 = performance.now();
|
|
91
|
+
linearBaseline(input4x);
|
|
92
|
+
const baseTime4 = performance.now() - startBase4;
|
|
93
|
+
const startFn8 = performance.now();
|
|
82
94
|
fn(input8x);
|
|
83
|
-
const
|
|
84
|
-
const
|
|
95
|
+
const fnTime8 = performance.now() - startFn8;
|
|
96
|
+
const startBase8 = performance.now();
|
|
97
|
+
linearBaseline(input8x);
|
|
98
|
+
const baseTime8 = performance.now() - startBase8;
|
|
99
|
+
const fnRatio = (fnTime8 / input8x.length) / (fnTime4 / input4x.length);
|
|
100
|
+
const baseRatio = (baseTime8 / input8x.length) / (baseTime4 / input4x.length);
|
|
101
|
+
const ratio = fnRatio / baseRatio;
|
|
85
102
|
bestRatio = Math.min(bestRatio, ratio);
|
|
86
|
-
totalElapsed +=
|
|
103
|
+
totalElapsed += fnTime4 + fnTime8 + baseTime4 + baseTime8;
|
|
87
104
|
trials++;
|
|
88
105
|
}
|
|
89
|
-
//
|
|
106
|
+
// After baseline-normalization: linear ≈ 1, quadratic ≈ 2.
|
|
90
107
|
expect(bestRatio).toBeLessThan(1.5);
|
|
91
108
|
}
|
|
92
109
|
//# sourceMappingURL=test-helpers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../src/tests/test-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,UAAU,MAAM,YAAY,CAAA;AAEnC;;;;GAIG;AACH,MAAM,SAAS,GAAG;IAChB,qBAAqB;IACrB,oCAAoC;IACpC,UAAU;IACV,4BAA4B;IAC5B,aAAa;IACb,eAAe;IACf,mBAAmB;IACnB,sBAAsB;IACtB,yBAAyB;IACzB,qBAAqB;IACrB,wBAAwB;IACxB,uBAAuB;IACvB,oBAAoB;IACpB,mBAAmB;IACnB,sCAAsC;IACtC,0BAA0B;IAC1B,mBAAmB;IACnB,uCAAuC;IACvC,0BAA0B;IAC1B,mBAAmB;CACpB,CAAA;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,OAAe,IAAI;IACtE,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;IAC/B,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,OAAO,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,CAAA;QACrD,MAAM,IAAI,SAAS,CAAC,KAAK,CAAC,CAAA;IAC5B,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../src/tests/test-helpers.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "punctilio",
|
|
3
|
-
"version": "3.7.
|
|
3
|
+
"version": "3.7.2",
|
|
4
4
|
"description": "Smart typography transformations: curly quotes, em-dashes, en-dashes, and more",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -71,10 +71,10 @@
|
|
|
71
71
|
"@types/node": "20.19.30",
|
|
72
72
|
"@types/seedrandom": "3.0.8",
|
|
73
73
|
"eslint": "9.39.2",
|
|
74
|
-
"eslint-plugin-regexp": "3.
|
|
74
|
+
"eslint-plugin-regexp": "3.1.0",
|
|
75
75
|
"hastscript": "9.0.1",
|
|
76
76
|
"jest": "29.7.0",
|
|
77
|
-
"lint-staged": "16.
|
|
77
|
+
"lint-staged": "16.4.0",
|
|
78
78
|
"rehype-parse": "9.0.1",
|
|
79
79
|
"rehype-stringify": "10.0.1",
|
|
80
80
|
"remark-gfm": "4.0.1",
|
|
@@ -86,11 +86,11 @@
|
|
|
86
86
|
"smartquotes": "2.3.2",
|
|
87
87
|
"smartypants": "0.2.2",
|
|
88
88
|
"tipograph": "0.7.4",
|
|
89
|
-
"ts-jest": "29.4.
|
|
89
|
+
"ts-jest": "29.4.9",
|
|
90
90
|
"tsx": "4.21.0",
|
|
91
91
|
"typescript": "5.9.3",
|
|
92
|
-
"typescript-eslint": "8.
|
|
93
|
-
"typograf": "7.
|
|
92
|
+
"typescript-eslint": "8.59.0",
|
|
93
|
+
"typograf": "7.7.0",
|
|
94
94
|
"unified": "11.0.5"
|
|
95
95
|
},
|
|
96
96
|
"peerDependencies": {
|
package/src/index.ts
CHANGED
|
@@ -91,7 +91,7 @@ export interface TransformOptions {
|
|
|
91
91
|
* Example: "Hello". and "Hello",
|
|
92
92
|
* - `"german"`: German style. Uses low-9 quote characters: „..." and ‚...'
|
|
93
93
|
* (U+201E/U+201C double, U+201A/U+2018 single). Punctuation outside quotes.
|
|
94
|
-
* - `"french"`: French style. Uses guillemets with
|
|
94
|
+
* - `"french"`: French style. Uses guillemets with NNBSP padding: «\u202F...\u202F»
|
|
95
95
|
* Single quotes remain as curly quotes. Punctuation outside quotes.
|
|
96
96
|
* - `"none"`: Skip all quote and punctuation transforms entirely.
|
|
97
97
|
* Straight quotes, apostrophes, and prime marks are left unmodified.
|
package/src/nbsp.ts
CHANGED
|
@@ -99,8 +99,11 @@ export const REFERENCE_ABBREVIATIONS = [
|
|
|
99
99
|
"Cap",
|
|
100
100
|
]
|
|
101
101
|
|
|
102
|
-
// Precomputed regex fragments
|
|
103
|
-
|
|
102
|
+
// Precomputed regex fragments — sorted longest-first so the regex alternation
|
|
103
|
+
// matches the most specific unit before a shorter prefix (e.g. "mbar" before "m").
|
|
104
|
+
const UNIT_PATTERN = [...UNITS].sort((a, b) => b.length - a.length).join("|")
|
|
105
|
+
// Honorifics and abbreviations don't need longest-first sorting because
|
|
106
|
+
// the mandatory trailing `\.` disambiguates prefix overlaps (e.g. Mr\. vs Mrs\.).
|
|
104
107
|
const HONORIFIC_PATTERN = HONORIFICS.map((h) => `${h}\\.`).join("|")
|
|
105
108
|
const ABBREVIATION_PATTERN = REFERENCE_ABBREVIATIONS.map((a) => `${a}\\.`).join("|")
|
|
106
109
|
const PUNCTUATION_OR_QUOTE = `[.,!?:;)(${LEFT_DOUBLE_QUOTE}${RIGHT_DOUBLE_QUOTE}\u00AB\u00BB${LEFT_SINGLE_QUOTE}${RIGHT_SINGLE_QUOTE}"]`
|
package/src/rehype.ts
CHANGED
|
@@ -75,21 +75,6 @@ export interface RehypePunctilioOptions
|
|
|
75
75
|
|
|
76
76
|
const DEFAULT_SKIP_TAGS = ["code", "pre", "script", "style", "kbd", "var", "samp"]
|
|
77
77
|
|
|
78
|
-
/**
|
|
79
|
-
* Check if an element has a specific CSS class.
|
|
80
|
-
*/
|
|
81
|
-
function hasClass(node: Element, className: string): boolean {
|
|
82
|
-
const classNames = node.properties?.className
|
|
83
|
-
if (Array.isArray(classNames)) {
|
|
84
|
-
return classNames.includes(className)
|
|
85
|
-
}
|
|
86
|
-
/* istanbul ignore next -- rehype-parse always produces arrays, but handle strings defensively */
|
|
87
|
-
if (typeof classNames === "string") {
|
|
88
|
-
return classNames.split(/\s+/).includes(className)
|
|
89
|
-
}
|
|
90
|
-
return false
|
|
91
|
-
}
|
|
92
|
-
|
|
93
78
|
/**
|
|
94
79
|
* Check if any ancestor of a node matches a predicate.
|
|
95
80
|
*/
|
|
@@ -461,12 +446,14 @@ function hasTextDescendant(
|
|
|
461
446
|
* @param node - The root element to search from
|
|
462
447
|
* @param shouldSkip - Function to determine which elements to skip
|
|
463
448
|
* @param depth - Current recursion depth (internal use)
|
|
449
|
+
* @param alreadyTransformed - Elements already processed; skipped during traversal to avoid redundant work
|
|
464
450
|
* @returns Array of elements that contain transformable text
|
|
465
451
|
*/
|
|
466
452
|
export function collectTransformableElements(
|
|
467
453
|
node: Element,
|
|
468
454
|
shouldSkip: ElementPredicate,
|
|
469
|
-
depth: number = 0
|
|
455
|
+
depth: number = 0,
|
|
456
|
+
alreadyTransformed?: ReadonlySet<Element>
|
|
470
457
|
): Element[] {
|
|
471
458
|
/* istanbul ignore if -- defensive: prevents stack overflow from malicious HTML */
|
|
472
459
|
if (depth > MAX_RECURSION_DEPTH) {
|
|
@@ -475,7 +462,7 @@ export function collectTransformableElements(
|
|
|
475
462
|
|
|
476
463
|
const results: Element[] = []
|
|
477
464
|
|
|
478
|
-
if (shouldSkip(node)) {
|
|
465
|
+
if (shouldSkip(node) || alreadyTransformed?.has(node)) {
|
|
479
466
|
return []
|
|
480
467
|
}
|
|
481
468
|
|
|
@@ -498,7 +485,7 @@ export function collectTransformableElements(
|
|
|
498
485
|
// children that should be independent, or has no text to transform.
|
|
499
486
|
for (const child of node.children) {
|
|
500
487
|
if (child.type === "element") {
|
|
501
|
-
const childResults = collectTransformableElements(child, shouldSkip, depth + 1)
|
|
488
|
+
const childResults = collectTransformableElements(child, shouldSkip, depth + 1, alreadyTransformed)
|
|
502
489
|
for (const r of childResults) results.push(r)
|
|
503
490
|
}
|
|
504
491
|
}
|
|
@@ -565,17 +552,20 @@ export function rehypePunctilio(
|
|
|
565
552
|
} = options
|
|
566
553
|
|
|
567
554
|
const skipTagSet = new Set(skipTags)
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
return
|
|
555
|
+
const skipClassSet = new Set(skipClasses)
|
|
556
|
+
|
|
557
|
+
const hasSkipClass = (node: Element): boolean => {
|
|
558
|
+
if (skipClassSet.size === 0) return false
|
|
559
|
+
const classNames = node.properties?.className
|
|
560
|
+
const classes = Array.isArray(classNames)
|
|
561
|
+
? classNames.filter((c): c is string => typeof c === "string")
|
|
562
|
+
: typeof classNames === "string" ? classNames.split(/\s+/) : []
|
|
563
|
+
return classes.some((cls) => skipClassSet.has(cls))
|
|
577
564
|
}
|
|
578
565
|
|
|
566
|
+
const shouldSkip = (node: Element): boolean =>
|
|
567
|
+
skipTagSet.has(node.tagName) || hasSkipClass(node)
|
|
568
|
+
|
|
579
569
|
// Default idempotency check to false in plugin context — the separator
|
|
580
570
|
// count check already guards against corruption, and the double-pass
|
|
581
571
|
// penalty compounds across every block-level element.
|
|
@@ -615,7 +605,7 @@ export function rehypePunctilio(
|
|
|
615
605
|
}
|
|
616
606
|
|
|
617
607
|
// Collect and transform elements with text content
|
|
618
|
-
const elementsToTransform = collectTransformableElements(node, shouldSkip)
|
|
608
|
+
const elementsToTransform = collectTransformableElements(node, shouldSkip, 0, transformed)
|
|
619
609
|
for (const elt of elementsToTransform) {
|
|
620
610
|
if (!transformed.has(elt)) {
|
|
621
611
|
transformElement(elt, transformFn, shouldSkip, separator, false, elementOptions)
|
package/src/symbols.ts
CHANGED
|
@@ -80,8 +80,13 @@ export function multiplication(text: string, options: SymbolOptions = {}): strin
|
|
|
80
80
|
|
|
81
81
|
// Match entire multiplication chains in one pass: "5 x 5 x 5" or "5x5x5"
|
|
82
82
|
// Pattern matches: digit(s), then one or more (operator, digit(s)) groups
|
|
83
|
+
// The (?<!\d[eE]) lookbehind prevents matching inside ambiguous unsigned
|
|
84
|
+
// scientific notation (1e5x3 — could also be a model SKU). Signed exponents
|
|
85
|
+
// (1e-5x3, 3.5E+10x2) are unambiguously scientific so the multiplication
|
|
86
|
+
// is converted. The Latin-letter lookbehind blocks model-name identifiers
|
|
87
|
+
// (Surface5x3, RTX3060x2).
|
|
83
88
|
const chainPattern = cachedRegExp(
|
|
84
|
-
`(?<!\\d)(?<firstNum>\\d+${digitSuffix})(?<rest>(?:${chr}?\\s*[xX*]\\s*${chr}?\\d+${digitSuffix})+)`,
|
|
89
|
+
`(?<!\\d[eE])(?<![${LATIN_LETTERS}\\d])(?<firstNum>\\d+${digitSuffix})(?<rest>(?:${chr}?\\s*[xX*]\\s*${chr}?\\d+${digitSuffix})+)`,
|
|
85
90
|
"g"
|
|
86
91
|
)
|
|
87
92
|
|
|
@@ -110,7 +115,7 @@ export function multiplication(text: string, options: SymbolOptions = {}): strin
|
|
|
110
115
|
|
|
111
116
|
// Trailing multiplier: 5x (followed by word boundary - space, punctuation, etc.)
|
|
112
117
|
const wbe = wordBoundaryEnd(chr)
|
|
113
|
-
const trailingPattern = cachedRegExp(`(?<!\\d)(?<num>\\d+${chr}?)[xX*]${wbe}`, "g")
|
|
118
|
+
const trailingPattern = cachedRegExp(`(?<!\\d[eE])(?<![${LATIN_LETTERS}\\d])(?<num>\\d+${chr}?)[xX*]${wbe}`, "g")
|
|
114
119
|
text = text.replace(trailingPattern, (match, num: string) => {
|
|
115
120
|
// Skip if this looks like start of hexadecimal
|
|
116
121
|
if (num === "0") return match
|
|
@@ -159,6 +164,9 @@ type ContextPredicate = (before: string, after: string) => boolean
|
|
|
159
164
|
*/
|
|
160
165
|
const LEGAL_SYMBOL_CONTEXT_WINDOW = 25
|
|
161
166
|
|
|
167
|
+
/** Returns true when the context window ends with a path-like fragment (slash + non-whitespace). */
|
|
168
|
+
const isPathContext = (before: string): boolean => /\/\S+$/.test(before)
|
|
169
|
+
|
|
162
170
|
/**
|
|
163
171
|
* Context-aware replacement for legal symbols like (c), (r), (tm).
|
|
164
172
|
* Extracts surrounding text, strips separator characters from the context
|
|
@@ -186,19 +194,23 @@ function contextAwareLegalReplace(
|
|
|
186
194
|
export function legalSymbols(text: string, options: SymbolOptions = {}): string {
|
|
187
195
|
const separator = options.separator ?? DEFAULT_SEPARATOR
|
|
188
196
|
// (c) → © only with positive copyright evidence (year or "copyright" keyword)
|
|
197
|
+
// and not in a path context (e.g., example.com/path(c))
|
|
189
198
|
text = contextAwareLegalReplace(text, /\(c\)/gi, COPYRIGHT, (before, after) =>
|
|
190
|
-
/^\s*(?:19|20)\d{2}\b/.test(after) || /\bcopyright\s*$/i.test(before),
|
|
199
|
+
!isPathContext(before) && (/^\s*(?:19|20)\d{2}\b/.test(after) || /\bcopyright\s*$/i.test(before)),
|
|
191
200
|
separator
|
|
192
201
|
)
|
|
193
202
|
|
|
194
|
-
// (r) → ® unless in enumeration "(q), (r)"
|
|
203
|
+
// (r) → ® unless in enumeration "(q), (r)", legal citation "(r)(1)", or path context
|
|
195
204
|
text = contextAwareLegalReplace(text, /\(r\)/gi, REGISTERED, (before, after) =>
|
|
196
|
-
!/\([a-z]\)[,;]\s*$/i.test(before) && !/^\(\d/.test(after),
|
|
205
|
+
!/\([a-z]\)[,;]\s*$/i.test(before) && !/^\(\d/.test(after) && !isPathContext(before),
|
|
197
206
|
separator
|
|
198
207
|
)
|
|
199
208
|
|
|
200
|
-
// (tm) → ™
|
|
201
|
-
text = text
|
|
209
|
+
// (tm) → ™ unless in a path context
|
|
210
|
+
text = contextAwareLegalReplace(text, /\(tm\)/gi, TRADEMARK, (before) =>
|
|
211
|
+
!isPathContext(before),
|
|
212
|
+
separator
|
|
213
|
+
)
|
|
202
214
|
|
|
203
215
|
return text
|
|
204
216
|
}
|
|
@@ -242,8 +254,10 @@ export function degrees(text: string, options: SymbolOptions = {}): string {
|
|
|
242
254
|
// Handles separator between digit and unit
|
|
243
255
|
// Uses marker-aware boundary to avoid false matches like "20C\uE000elsius"
|
|
244
256
|
const wbe = wordBoundaryEnd(chr)
|
|
257
|
+
// Reject C/F followed by hyphen+letter ("C-compiler"), +/# ("C++", "F#")
|
|
258
|
+
const notCompound = `(?!-[${LATIN_LETTERS}]|[+#])`
|
|
245
259
|
return text.replace(
|
|
246
|
-
cachedRegExp(`(?<num>\\d${chr}?) ?(?<unit>[CF])${wbe}`, "g"),
|
|
260
|
+
cachedRegExp(`(?<num>\\d${chr}?) ?(?<unit>[CF])${notCompound}${wbe}`, "g"),
|
|
247
261
|
(_, num, unit) => `${num} ${DEGREE}${unit}`
|
|
248
262
|
)
|
|
249
263
|
}
|
|
@@ -287,7 +301,7 @@ function balancedPrimeReplacer(primeChar: string, escapedSeparator: string) {
|
|
|
287
301
|
// Matches when the text before a prime candidate ends with ′ followed by
|
|
288
302
|
// any mix of digits and separators (e.g., "5′1" before the "0" in 5′10").
|
|
289
303
|
const feetInchesContext = primeChar === DOUBLE_PRIME
|
|
290
|
-
?
|
|
304
|
+
? cachedRegExp(`${PRIME}(?:${escapedSeparator}|\\d)*$`, "")
|
|
291
305
|
: null
|
|
292
306
|
|
|
293
307
|
let balance = 0
|
package/src/tests/rehype.test.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Element, Parent, Text, ElementContent } from "hast"
|
|
1
|
+
import type { Element, Parent, Root, Text, ElementContent } from "hast"
|
|
2
2
|
import { h } from "hastscript"
|
|
3
3
|
import { unified } from "unified"
|
|
4
4
|
import rehypeParse from "rehype-parse"
|
|
@@ -619,6 +619,28 @@ describe("rehypePunctilio", () => {
|
|
|
619
619
|
)
|
|
620
620
|
})
|
|
621
621
|
|
|
622
|
+
it("handles string className property (non-standard AST)", async () => {
|
|
623
|
+
// rehype-parse always produces array classNames, but hand-crafted ASTs
|
|
624
|
+
// may use strings. The plugin should handle both.
|
|
625
|
+
const tree: Root = {
|
|
626
|
+
type: "root",
|
|
627
|
+
children: [{
|
|
628
|
+
type: "element",
|
|
629
|
+
tagName: "p",
|
|
630
|
+
// Cast to bypass hast's typed className (which expects string[])
|
|
631
|
+
properties: { className: "no-transform" as unknown as string[] },
|
|
632
|
+
children: [{ type: "text", value: '"Hello"' }],
|
|
633
|
+
}],
|
|
634
|
+
}
|
|
635
|
+
const processor = unified()
|
|
636
|
+
.use(rehypePunctilio, { skipClasses: ["no-transform"] })
|
|
637
|
+
.use(rehypeStringify)
|
|
638
|
+
await processor.run(tree)
|
|
639
|
+
// Text should remain untransformed because the class matches
|
|
640
|
+
const textNode = (tree.children[0] as Element).children[0] as Text
|
|
641
|
+
expect(textNode.value).toBe('"Hello"')
|
|
642
|
+
})
|
|
643
|
+
|
|
622
644
|
it("handles mixed skip and non-skip siblings", async () => {
|
|
623
645
|
expect(await processHtml('<article><p>"Hello"</p><pre>"Code"</pre><p>"World"</p></article>', { nbsp: false })).toEqual(
|
|
624
646
|
`<article><p>${LDQ}Hello${RDQ}</p><pre>"Code"</pre><p>${LDQ}World${RDQ}</p></article>`
|
|
@@ -202,6 +202,16 @@ describe("legalSymbols", () => {
|
|
|
202
202
|
expect(legalSymbols(input)).toBe(expected)
|
|
203
203
|
})
|
|
204
204
|
|
|
205
|
+
it.each([
|
|
206
|
+
// Legal symbols in URL/path contexts
|
|
207
|
+
["example.com/path(c) 2024", "example.com/path(c) 2024"],
|
|
208
|
+
["example.com/path(tm)", "example.com/path(tm)"],
|
|
209
|
+
["example.com/path(r)", "example.com/path(r)"],
|
|
210
|
+
["/usr/local/bin(r)", "/usr/local/bin(r)"],
|
|
211
|
+
])('preserves legal symbols in path context "%s"', (input, expected) => {
|
|
212
|
+
expect(legalSymbols(input)).toBe(expected)
|
|
213
|
+
})
|
|
214
|
+
|
|
205
215
|
it("detects copyright year across separator boundary", () => {
|
|
206
216
|
const sep = DEFAULT_SEPARATOR
|
|
207
217
|
expect(legalSymbols(`(c)${sep} 2024`, { separator: sep })).toBe(`${UNICODE_SYMBOLS.COPYRIGHT}${sep} 2024`)
|
|
@@ -247,6 +257,12 @@ describe("degrees", () => {
|
|
|
247
257
|
["68 f", "68 f"],
|
|
248
258
|
["20c", "20c"],
|
|
249
259
|
["68f", "68f"],
|
|
260
|
+
// Compound suffixes: C/F followed by hyphen+letter or +/# are not temperatures
|
|
261
|
+
["20 C-compiler", "20 C-compiler"],
|
|
262
|
+
["5 F-score", "5 F-score"],
|
|
263
|
+
["20 C++", "20 C++"],
|
|
264
|
+
["20 C#", "20 C#"],
|
|
265
|
+
["100 F#", "100 F#"],
|
|
250
266
|
])('converts "%s" to "%s"', (input, expected) => {
|
|
251
267
|
expect(degrees(input)).toBe(expected)
|
|
252
268
|
})
|
|
@@ -551,6 +567,51 @@ describe("hexadecimal preservation", () => {
|
|
|
551
567
|
})
|
|
552
568
|
})
|
|
553
569
|
|
|
570
|
+
describe("model name / identifier preservation", () => {
|
|
571
|
+
it.each([
|
|
572
|
+
"Surface5x3",
|
|
573
|
+
"iPhone5x case",
|
|
574
|
+
"RTX3060x2",
|
|
575
|
+
"RX580x4",
|
|
576
|
+
"Pixel8x",
|
|
577
|
+
])('preserves "%s"', (input) => {
|
|
578
|
+
expect(multiplication(input)).toBe(input)
|
|
579
|
+
})
|
|
580
|
+
})
|
|
581
|
+
|
|
582
|
+
describe("scientific notation preservation", () => {
|
|
583
|
+
it.each([
|
|
584
|
+
"1e5x3",
|
|
585
|
+
"3.5e10x2",
|
|
586
|
+
"1E5x3",
|
|
587
|
+
"2.5E8x100",
|
|
588
|
+
"The value 1e5x is unchanged",
|
|
589
|
+
])('preserves unsigned-exponent "%s"', (input) => {
|
|
590
|
+
expect(multiplication(input)).toBe(input)
|
|
591
|
+
})
|
|
592
|
+
|
|
593
|
+
it("preserves unspaced chains attached to scientific notation", () => {
|
|
594
|
+
expect(multiplication("1e5x3x2")).toBe("1e5x3x2")
|
|
595
|
+
})
|
|
596
|
+
|
|
597
|
+
it("converts spaced operands after scientific notation prefix", () => {
|
|
598
|
+
// Spaced form: "3" is preceded by space, so it starts a new chain
|
|
599
|
+
expect(multiplication("1e5 x 3 x 2")).toBe(`1e5 x 3 ${UNICODE_SYMBOLS.MULTIPLICATION} 2`)
|
|
600
|
+
})
|
|
601
|
+
|
|
602
|
+
// Signed exponents (e+/e-/E+/E-) are unambiguously scientific notation:
|
|
603
|
+
// model names and SKUs essentially never use signed exponents, so the
|
|
604
|
+
// ambiguity that protects "1e5x3" doesn't apply here.
|
|
605
|
+
it.each([
|
|
606
|
+
["1e-5x3", `1e-5${UNICODE_SYMBOLS.MULTIPLICATION}3`],
|
|
607
|
+
["1e+5x3", `1e+5${UNICODE_SYMBOLS.MULTIPLICATION}3`],
|
|
608
|
+
["3.5E-10x2", `3.5E-10${UNICODE_SYMBOLS.MULTIPLICATION}2`],
|
|
609
|
+
["2.5E+8x100", `2.5E+8${UNICODE_SYMBOLS.MULTIPLICATION}100`],
|
|
610
|
+
])('converts signed-exponent "%s" → "%s"', (input, expected) => {
|
|
611
|
+
expect(multiplication(input)).toBe(expected)
|
|
612
|
+
})
|
|
613
|
+
})
|
|
614
|
+
|
|
554
615
|
// Tests derived from competitor libraries and typography guidelines
|
|
555
616
|
describe("competitor-derived edge cases", () => {
|
|
556
617
|
// From retext-smartypants: ellipsis variations
|
|
@@ -49,6 +49,14 @@ export function buildMixedContent(charCount: number, seed: string = "42"): strin
|
|
|
49
49
|
return result
|
|
50
50
|
}
|
|
51
51
|
|
|
52
|
+
/**
|
|
53
|
+
* Provably linear baseline: a single regex pass that touches every char and
|
|
54
|
+
* exercises the same V8 String.replace path the production transforms use.
|
|
55
|
+
* Its ms/char ratio is the platform's "what linear looks like right now"
|
|
56
|
+
* fingerprint — we divide fn's ratio by it to cancel shared CPU/GC noise.
|
|
57
|
+
*/
|
|
58
|
+
const linearBaseline = (s: string): string => s.replace(/[a-z]/gi, "x")
|
|
59
|
+
|
|
52
60
|
/**
|
|
53
61
|
* Asserts that a function scales linearly (not quadratically) with input size.
|
|
54
62
|
*
|
|
@@ -59,10 +67,11 @@ export function buildMixedContent(charCount: number, seed: string = "42"): strin
|
|
|
59
67
|
* Default startingN of 5000 produces inputs from ~5K to ~40K chars, which is
|
|
60
68
|
* past V8's string allocation overhead inflection point where ms/char stabilizes.
|
|
61
69
|
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
65
|
-
*
|
|
70
|
+
* Each trial measures `fn` and a known-linear baseline back-to-back at both
|
|
71
|
+
* sizes, then divides `fn`'s 8x/4x ratio by the baseline's. Shared platform
|
|
72
|
+
* noise (CPU contention, scheduler jitter) inflates both numerator and
|
|
73
|
+
* denominator and cancels out; only `fn`-specific super-linear growth pushes
|
|
74
|
+
* the normalized ratio past 1. Min across trials picks the cleanest sample.
|
|
66
75
|
*
|
|
67
76
|
* @param fn - The function to benchmark
|
|
68
77
|
* @param buildInput - Builds an input string of approximately `n` units
|
|
@@ -76,29 +85,40 @@ export function assertLinearScaling(
|
|
|
76
85
|
const input4x = buildInput(startingN * 4)
|
|
77
86
|
const input8x = buildInput(startingN * 8)
|
|
78
87
|
|
|
79
|
-
// Warmup with the largest input so JIT compiles all code paths
|
|
88
|
+
// Warmup both with the largest input so JIT compiles all code paths.
|
|
80
89
|
fn(input8x)
|
|
90
|
+
linearBaseline(input8x)
|
|
81
91
|
|
|
82
|
-
const minTrials =
|
|
83
|
-
const minElapsedMs =
|
|
92
|
+
const minTrials = 8
|
|
93
|
+
const minElapsedMs = 200
|
|
84
94
|
let bestRatio = Infinity
|
|
85
95
|
let totalElapsed = 0
|
|
86
96
|
let trials = 0
|
|
87
97
|
while (trials < minTrials || totalElapsed < minElapsedMs) {
|
|
88
|
-
const
|
|
98
|
+
const startFn4 = performance.now()
|
|
89
99
|
fn(input4x)
|
|
90
|
-
const
|
|
100
|
+
const fnTime4 = performance.now() - startFn4
|
|
91
101
|
|
|
92
|
-
const
|
|
102
|
+
const startBase4 = performance.now()
|
|
103
|
+
linearBaseline(input4x)
|
|
104
|
+
const baseTime4 = performance.now() - startBase4
|
|
105
|
+
|
|
106
|
+
const startFn8 = performance.now()
|
|
93
107
|
fn(input8x)
|
|
94
|
-
const
|
|
108
|
+
const fnTime8 = performance.now() - startFn8
|
|
109
|
+
|
|
110
|
+
const startBase8 = performance.now()
|
|
111
|
+
linearBaseline(input8x)
|
|
112
|
+
const baseTime8 = performance.now() - startBase8
|
|
95
113
|
|
|
96
|
-
const
|
|
114
|
+
const fnRatio = (fnTime8 / input8x.length) / (fnTime4 / input4x.length)
|
|
115
|
+
const baseRatio = (baseTime8 / input8x.length) / (baseTime4 / input4x.length)
|
|
116
|
+
const ratio = fnRatio / baseRatio
|
|
97
117
|
bestRatio = Math.min(bestRatio, ratio)
|
|
98
|
-
totalElapsed +=
|
|
118
|
+
totalElapsed += fnTime4 + fnTime8 + baseTime4 + baseTime8
|
|
99
119
|
trials++
|
|
100
120
|
}
|
|
101
121
|
|
|
102
|
-
//
|
|
122
|
+
// After baseline-normalization: linear ≈ 1, quadratic ≈ 2.
|
|
103
123
|
expect(bestRatio).toBeLessThan(1.5)
|
|
104
124
|
}
|