punctilio 0.3.0 → 0.4.0
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/README.md +4 -0
- package/dist/constants.d.ts +1 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/dashes.d.ts +7 -0
- package/dist/dashes.d.ts.map +1 -1
- package/dist/dashes.js +36 -7
- package/dist/dashes.js.map +1 -1
- package/dist/index.d.ts +24 -16
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -10
- package/dist/index.js.map +1 -1
- package/dist/quotes.js +15 -15
- package/dist/quotes.js.map +1 -1
- package/dist/symbols.d.ts +19 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +41 -16
- package/dist/symbols.js.map +1 -1
- package/dist/utils.d.ts +18 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +32 -0
- package/dist/utils.js.map +1 -0
- package/package.json +7 -2
package/README.md
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
# punctilio
|
|
2
2
|
|
|
3
|
+
[](https://github.com/alexander-turner/punctilio/actions/workflows/test.yml)
|
|
4
|
+
[](https://github.com/alexander-turner/punctilio/actions/workflows/lint.yml)
|
|
5
|
+
[](https://github.com/alexander-turner/punctilio)
|
|
6
|
+
|
|
3
7
|
> *punctilio* (n.): a fine point of conduct or procedure
|
|
4
8
|
|
|
5
9
|
Smart typography transformations for JavaScript/TypeScript. Converts ASCII punctuation to typographically correct Unicode characters. Originally built for [my personal website](https://turntrout.com/design).
|
package/dist/constants.d.ts
CHANGED
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwClB,CAAA;AAEV;;;GAGG;AACH,eAAO,MAAM,iBAAiB,WAAW,CAAA;AACzC,eAAO,MAAM,yBAAyB,QAA2D,CAAA"}
|
package/dist/constants.js
CHANGED
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ,EAAE,QAAQ;IAClB,cAAc,EAAE,QAAQ;IACxB,SAAS,EAAE,QAAQ;IACnB,UAAU,EAAE,QAAQ;IACpB,SAAS,EAAE,QAAQ;IACnB,UAAU,EAAE,QAAQ;IACpB,SAAS,EAAE,QAAQ;IACnB,MAAM,EAAE,QAAQ;IAChB,WAAW,EAAE,QAAQ;IACrB,UAAU,EAAE,QAAQ;IACpB,gBAAgB,EAAE,QAAQ;IAC1B,WAAW,EAAE,QAAQ;IACrB,UAAU,EAAE,QAAQ;IACpB,aAAa,EAAE,QAAQ;IACvB,KAAK,EAAE,QAAQ;IACf,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,QAAQ;IACjB,KAAK,EAAE,QAAQ;IACf,iBAAiB,EAAE,QAAQ;IAC3B,kBAAkB,EAAE,QAAQ;IAC5B,iBAAiB,EAAE,QAAQ;IAC3B,kBAAkB,EAAE,QAAQ;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ,EAAE,QAAQ;IAClB,cAAc,EAAE,QAAQ;IACxB,SAAS,EAAE,QAAQ;IACnB,UAAU,EAAE,QAAQ;IACpB,SAAS,EAAE,QAAQ;IACnB,UAAU,EAAE,QAAQ;IACpB,SAAS,EAAE,QAAQ;IACnB,MAAM,EAAE,QAAQ;IAChB,WAAW,EAAE,QAAQ;IACrB,UAAU,EAAE,QAAQ;IACpB,gBAAgB,EAAE,QAAQ;IAC1B,WAAW,EAAE,QAAQ;IACrB,UAAU,EAAE,QAAQ;IACpB,aAAa,EAAE,QAAQ;IACvB,KAAK,EAAE,QAAQ;IACf,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,YAAY,EAAE,QAAQ;IACtB,OAAO,EAAE,QAAQ;IACjB,OAAO,EAAE,QAAQ;IACjB,KAAK,EAAE,QAAQ;IACf,iBAAiB,EAAE,QAAQ;IAC3B,kBAAkB,EAAE,QAAQ;IAC5B,iBAAiB,EAAE,QAAQ;IAC3B,kBAAkB,EAAE,QAAQ;IAC5B,IAAI,EAAE,QAAQ;CACN,CAAA;AAEV;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAA;AACzC,MAAM,CAAC,MAAM,yBAAyB,GAAG,iBAAiB,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA"}
|
package/dist/dashes.d.ts
CHANGED
|
@@ -36,6 +36,13 @@ export declare const months: string;
|
|
|
36
36
|
export declare function enDashNumberRange(text: string, options?: DashOptions): string;
|
|
37
37
|
/**
|
|
38
38
|
* Replaces hyphens with en-dashes in month/date ranges.
|
|
39
|
+
* Supports formats like "January-March", "Jan-Mar", "February-April 2024",
|
|
40
|
+
* and "October 2012 - December 2014".
|
|
41
|
+
*
|
|
42
|
+
* Spacing around the en-dash is controlled by dashStyle:
|
|
43
|
+
* - "american" (default): No spaces (October 2012–December 2014)
|
|
44
|
+
* - "british": Spaced (October 2012 – December 2014)
|
|
45
|
+
* - "none": Preserve original spacing
|
|
39
46
|
*/
|
|
40
47
|
export declare function enDashDateRange(text: string, options?: DashOptions): string;
|
|
41
48
|
/**
|
package/dist/dashes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashes.d.ts","sourceRoot":"","sources":["../src/dashes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAA;AAEvD,MAAM,WAAW,WAAW;IAC1B;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAID;;GAEG;AACH,eAAO,MAAM,MAAM,QAKR,CAAA;AAEX;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CASjF;AAED
|
|
1
|
+
{"version":3,"file":"dashes.d.ts","sourceRoot":"","sources":["../src/dashes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAA;AAEvD,MAAM,WAAW,WAAW;IAC1B;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAID;;GAEG;AACH,eAAO,MAAM,MAAM,QAKR,CAAA;AAEX;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CASjF;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CA8B/E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAI5E;AAuDD;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAe7E"}
|
package/dist/dashes.js
CHANGED
|
@@ -20,22 +20,51 @@ export const months = [
|
|
|
20
20
|
*/
|
|
21
21
|
export function enDashNumberRange(text, options = {}) {
|
|
22
22
|
const chr = options.separator ?? DEFAULT_SEPARATOR;
|
|
23
|
-
return text.replace(new RegExp(`\\b(?<![a-zA-Z.])((?:p\\.?|\\$)?\\d[\\d.,]*${chr}?)-(
|
|
23
|
+
return text.replace(new RegExp(`\\b(?<![a-zA-Z.])(?<startNum>(?:p\\.?|\\$)?\\d[\\d.,]*${chr}?)-(?<endNum>${chr}?\\$?\\d[\\d.,]*)(?!\\.\\d)\\b`, "g"), `$<startNum>${EN_DASH}$<endNum>`);
|
|
24
24
|
}
|
|
25
25
|
/**
|
|
26
26
|
* Replaces hyphens with en-dashes in month/date ranges.
|
|
27
|
+
* Supports formats like "January-March", "Jan-Mar", "February-April 2024",
|
|
28
|
+
* and "October 2012 - December 2014".
|
|
29
|
+
*
|
|
30
|
+
* Spacing around the en-dash is controlled by dashStyle:
|
|
31
|
+
* - "american" (default): No spaces (October 2012–December 2014)
|
|
32
|
+
* - "british": Spaced (October 2012 – December 2014)
|
|
33
|
+
* - "none": Preserve original spacing
|
|
27
34
|
*/
|
|
28
35
|
export function enDashDateRange(text, options = {}) {
|
|
29
36
|
const chr = options.separator ?? DEFAULT_SEPARATOR;
|
|
30
|
-
|
|
37
|
+
const dashStyle = options.dashStyle ?? "american";
|
|
38
|
+
const startPattern = `(?<startMonth>${months})(?<startYear>${chr}? \\d{4})?(?<preSep>${chr}?)`;
|
|
39
|
+
const endPattern = `(?<postSep>${chr}?)(?<endMonth>${months})(?<endYear> \\d{4})?`;
|
|
40
|
+
const dateRangeRegex = new RegExp(`\\b${startPattern}(?<preSpace> ?)-(?<postSpace> ?)${endPattern}\\b`, "g");
|
|
41
|
+
return text.replace(dateRangeRegex, (...args) => {
|
|
42
|
+
const groups = args.at(-1);
|
|
43
|
+
const { startMonth, startYear = "", preSep, postSep, endMonth, endYear = "", preSpace, postSpace } = groups;
|
|
44
|
+
let pre, post;
|
|
45
|
+
if (dashStyle === "british") {
|
|
46
|
+
pre = " ";
|
|
47
|
+
post = " ";
|
|
48
|
+
}
|
|
49
|
+
else if (dashStyle === "none") {
|
|
50
|
+
pre = preSpace;
|
|
51
|
+
post = postSpace;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
// american (default)
|
|
55
|
+
pre = "";
|
|
56
|
+
post = "";
|
|
57
|
+
}
|
|
58
|
+
return `${startMonth}${startYear}${preSep}${pre}${EN_DASH}${post}${postSep}${endMonth}${endYear}`;
|
|
59
|
+
});
|
|
31
60
|
}
|
|
32
61
|
/**
|
|
33
62
|
* Replaces hyphens with proper minus signs (−) in numerical contexts.
|
|
34
63
|
*/
|
|
35
64
|
export function minusReplace(text, options = {}) {
|
|
36
65
|
const chr = options.separator ?? DEFAULT_SEPARATOR;
|
|
37
|
-
const minusRegex = new RegExp(`(
|
|
38
|
-
return text.replaceAll(minusRegex,
|
|
66
|
+
const minusRegex = new RegExp(`(?<beforeMinus>^|[\\s\\(${chr}""])-(?<number>\\s?\\d*\\.?\\d+)`, "gm");
|
|
67
|
+
return text.replaceAll(minusRegex, `$<beforeMinus>${MINUS}$<number>`);
|
|
39
68
|
}
|
|
40
69
|
/** Convert surrounded dashes and multiple dashes to em/en dashes */
|
|
41
70
|
function convertParentheticalDashes(text, sep, style) {
|
|
@@ -44,8 +73,8 @@ function convertParentheticalDashes(text, sep, style) {
|
|
|
44
73
|
const dash = style === "british" ? EN_DASH : EM_DASH;
|
|
45
74
|
const spaced = style === "british";
|
|
46
75
|
// Handle dashes with potential spaces
|
|
47
|
-
const preDash = new RegExp(`((?<markerBeforeTwo>${sep}?)[ ]+|(?<markerBeforeThree>${sep}))`);
|
|
48
|
-
const surroundedDash = new RegExp(`(?<=[^\\s>]|^)${preDash.source}[~${EN_DASH}${EM_DASH}-]+[ ]*(?<markerAfter>${sep}?)([ ]+|$)`, "g");
|
|
76
|
+
const preDash = new RegExp(`(?:(?<markerBeforeTwo>${sep}?)[ ]+|(?<markerBeforeThree>${sep}))`);
|
|
77
|
+
const surroundedDash = new RegExp(`(?<=[^\\s>]|^)${preDash.source}[~${EN_DASH}${EM_DASH}-]+[ ]*(?<markerAfter>${sep}?)(?<trailingSpace>[ ]+|$)`, "g");
|
|
49
78
|
const replacement = spaced
|
|
50
79
|
? `$<markerBeforeTwo>$<markerBeforeThree> ${dash} $<markerAfter>`
|
|
51
80
|
: `$<markerBeforeTwo>$<markerBeforeThree>${dash}$<markerAfter>`;
|
|
@@ -57,7 +86,7 @@ function convertParentheticalDashes(text, sep, style) {
|
|
|
57
86
|
: `$<markerBefore>${dash}$<markerAfter>`;
|
|
58
87
|
text = text.replace(multipleDashInWords, multiReplacement);
|
|
59
88
|
// Handle dashes at start of line
|
|
60
|
-
text = text.replace(new RegExp(`^(
|
|
89
|
+
text = text.replace(new RegExp(`^(?<sepStart>${sep})?[-]+ `, "gm"), `$<sepStart>${dash} `);
|
|
61
90
|
return text;
|
|
62
91
|
}
|
|
63
92
|
/** Normalize spacing around em dashes for American style */
|
package/dist/dashes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashes.js","sourceRoot":"","sources":["../src/dashes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AA2BnE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,eAAe,CAAA;AAEnD;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;IACtD,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU;IAChE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;IACxC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK;CACzC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAEX;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,UAAuB,EAAE;IACvE,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,iBAAiB,CAAA;IAClD,OAAO,IAAI,CAAC,OAAO,CACjB,IAAI,MAAM,CACR,
|
|
1
|
+
{"version":3,"file":"dashes.js","sourceRoot":"","sources":["../src/dashes.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,7 +11,7 @@ export { niceQuotes, type QuoteOptions, type PunctuationStyle } from "./quotes.j
|
|
|
11
11
|
import type { PunctuationStyle } from "./quotes.js";
|
|
12
12
|
export { hyphenReplace, enDashNumberRange, enDashDateRange, minusReplace, months, type DashOptions, type DashStyle, } from "./dashes.js";
|
|
13
13
|
import type { DashStyle } from "./dashes.js";
|
|
14
|
-
export { ellipsis, multiplication, mathSymbols, legalSymbols, arrows, degrees, fractions, primeMarks, symbolTransform, type SymbolOptions, } from "./symbols.js";
|
|
14
|
+
export { ellipsis, multiplication, mathSymbols, legalSymbols, arrows, degrees, fractions, primeMarks, collapseSpaces, symbolTransform, type SymbolOptions, } from "./symbols.js";
|
|
15
15
|
export interface TransformOptions {
|
|
16
16
|
/**
|
|
17
17
|
* A boundary marker character used when transforming text that spans
|
|
@@ -28,15 +28,15 @@ export interface TransformOptions {
|
|
|
28
28
|
*/
|
|
29
29
|
symbols?: boolean;
|
|
30
30
|
/**
|
|
31
|
-
* Whether to
|
|
32
|
-
*
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
*
|
|
37
|
-
* Default:
|
|
31
|
+
* Whether to collapse multiple consecutive spaces (including non-breaking
|
|
32
|
+
* spaces) into a single space. Keeps the first space in the sequence.
|
|
33
|
+
*
|
|
34
|
+
* - `true` (default): "hello world" → "hello world"
|
|
35
|
+
* - `false`: Preserve multiple spaces
|
|
36
|
+
*
|
|
37
|
+
* Default: true
|
|
38
38
|
*/
|
|
39
|
-
|
|
39
|
+
collapseSpaces?: boolean;
|
|
40
40
|
/**
|
|
41
41
|
* How to handle punctuation placement around quotation marks.
|
|
42
42
|
*
|
|
@@ -59,7 +59,19 @@ export interface TransformOptions {
|
|
|
59
59
|
* Default: "american"
|
|
60
60
|
*/
|
|
61
61
|
dashStyle?: DashStyle;
|
|
62
|
+
/**
|
|
63
|
+
* Whether to include fraction transforms (1/2 → ½)
|
|
64
|
+
* Default: false (can be aggressive)
|
|
65
|
+
*/
|
|
66
|
+
fractions?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Whether to include degree symbol transforms (20 C → 20 °C)
|
|
69
|
+
* Default: false (can be aggressive)
|
|
70
|
+
*/
|
|
71
|
+
degrees?: boolean;
|
|
62
72
|
}
|
|
73
|
+
export { assertSeparatorCountPreserved, countSeparators } from "./utils.js";
|
|
74
|
+
export { DEFAULT_SEPARATOR } from "./constants.js";
|
|
63
75
|
/**
|
|
64
76
|
* Applies all typography transformations: smart quotes, proper dashes,
|
|
65
77
|
* and symbol improvements.
|
|
@@ -69,8 +81,9 @@ export interface TransformOptions {
|
|
|
69
81
|
* 2. primeMarks (feet/inches, arcminutes/arcseconds)
|
|
70
82
|
* 3. niceQuotes (smart quotes)
|
|
71
83
|
* 4. symbolTransform (ellipses, multiplication, math symbols, legal symbols, arrows)
|
|
72
|
-
* 5.
|
|
73
|
-
* 6.
|
|
84
|
+
* 5. collapseSpaces (collapses multiple spaces into one)
|
|
85
|
+
* 6. fractions (disabled by default)
|
|
86
|
+
* 7. degrees (disabled by default)
|
|
74
87
|
*
|
|
75
88
|
* @param text - The text to transform
|
|
76
89
|
* @param options - Configuration options
|
|
@@ -91,9 +104,4 @@ export interface TransformOptions {
|
|
|
91
104
|
* ```
|
|
92
105
|
*/
|
|
93
106
|
export declare function transform(text: string, options?: TransformOptions): string;
|
|
94
|
-
/**
|
|
95
|
-
* Default separator character for boundary marking.
|
|
96
|
-
* Uses Unicode Private Use Area character U+E000.
|
|
97
|
-
*/
|
|
98
|
-
export declare const DEFAULT_SEPARATOR = "\uE000";
|
|
99
107
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,MAAM,EACN,KAAK,WAAW,EAChB,KAAK,SAAS,GACf,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EACL,QAAQ,EACR,cAAc,EACd,WAAW,EACX,YAAY,EACZ,MAAM,EACN,OAAO,EACP,SAAS,EACT,UAAU,EACV,eAAe,EACf,KAAK,aAAa,GACnB,MAAM,cAAc,CAAA;AAErB,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAClF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AACnD,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,MAAM,EACN,KAAK,WAAW,EAChB,KAAK,SAAS,GACf,MAAM,aAAa,CAAA;AACpB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EACL,QAAQ,EACR,cAAc,EACd,WAAW,EACX,YAAY,EACZ,MAAM,EACN,OAAO,EACP,SAAS,EACT,UAAU,EACV,cAAc,EACd,eAAe,EACf,KAAK,aAAa,GACnB,MAAM,cAAc,CAAA;AAErB,MAAM,WAAW,gBAAgB;IAC/B;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAElB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;IAEjB;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;IAExB;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;IAEnC;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,SAAS,CAAA;IAErB;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAQD,OAAO,EAAE,6BAA6B,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CA4B9E"}
|
package/dist/index.js
CHANGED
|
@@ -9,10 +9,14 @@
|
|
|
9
9
|
*/
|
|
10
10
|
export { niceQuotes } from "./quotes.js";
|
|
11
11
|
export { hyphenReplace, enDashNumberRange, enDashDateRange, minusReplace, months, } from "./dashes.js";
|
|
12
|
-
export { ellipsis, multiplication, mathSymbols, legalSymbols, arrows, degrees, fractions, primeMarks, symbolTransform, } from "./symbols.js";
|
|
12
|
+
export { ellipsis, multiplication, mathSymbols, legalSymbols, arrows, degrees, fractions, primeMarks, collapseSpaces, symbolTransform, } from "./symbols.js";
|
|
13
13
|
import { niceQuotes } from "./quotes.js";
|
|
14
14
|
import { hyphenReplace } from "./dashes.js";
|
|
15
|
-
import { symbolTransform, fractions as fractionsTransform, degrees as degreesTransform, primeMarks } from "./symbols.js";
|
|
15
|
+
import { symbolTransform, fractions as fractionsTransform, degrees as degreesTransform, primeMarks, collapseSpaces as collapseSpacesTransform } from "./symbols.js";
|
|
16
|
+
import { assertSeparatorCountPreserved } from "./utils.js";
|
|
17
|
+
import { DEFAULT_SEPARATOR } from "./constants.js";
|
|
18
|
+
export { assertSeparatorCountPreserved, countSeparators } from "./utils.js";
|
|
19
|
+
export { DEFAULT_SEPARATOR } from "./constants.js";
|
|
16
20
|
/**
|
|
17
21
|
* Applies all typography transformations: smart quotes, proper dashes,
|
|
18
22
|
* and symbol improvements.
|
|
@@ -22,8 +26,9 @@ import { symbolTransform, fractions as fractionsTransform, degrees as degreesTra
|
|
|
22
26
|
* 2. primeMarks (feet/inches, arcminutes/arcseconds)
|
|
23
27
|
* 3. niceQuotes (smart quotes)
|
|
24
28
|
* 4. symbolTransform (ellipses, multiplication, math symbols, legal symbols, arrows)
|
|
25
|
-
* 5.
|
|
26
|
-
* 6.
|
|
29
|
+
* 5. collapseSpaces (collapses multiple spaces into one)
|
|
30
|
+
* 6. fractions (disabled by default)
|
|
31
|
+
* 7. degrees (disabled by default)
|
|
27
32
|
*
|
|
28
33
|
* @param text - The text to transform
|
|
29
34
|
* @param options - Configuration options
|
|
@@ -44,7 +49,9 @@ import { symbolTransform, fractions as fractionsTransform, degrees as degreesTra
|
|
|
44
49
|
* ```
|
|
45
50
|
*/
|
|
46
51
|
export function transform(text, options = {}) {
|
|
47
|
-
const
|
|
52
|
+
const separator = options.separator ?? DEFAULT_SEPARATOR;
|
|
53
|
+
const original = text;
|
|
54
|
+
const { symbols = true, fractions = false, degrees = false, collapseSpaces = true, ...separatorOpts } = options;
|
|
48
55
|
text = hyphenReplace(text, separatorOpts);
|
|
49
56
|
text = primeMarks(text, separatorOpts);
|
|
50
57
|
text = niceQuotes(text, separatorOpts);
|
|
@@ -57,11 +64,10 @@ export function transform(text, options = {}) {
|
|
|
57
64
|
if (degrees) {
|
|
58
65
|
text = degreesTransform(text);
|
|
59
66
|
}
|
|
67
|
+
if (collapseSpaces) {
|
|
68
|
+
text = collapseSpacesTransform(text);
|
|
69
|
+
}
|
|
70
|
+
assertSeparatorCountPreserved(original, text, separator, "transform");
|
|
60
71
|
return text;
|
|
61
72
|
}
|
|
62
|
-
/**
|
|
63
|
-
* Default separator character for boundary marking.
|
|
64
|
-
* Uses Unicode Private Use Area character U+E000.
|
|
65
|
-
*/
|
|
66
|
-
export const DEFAULT_SEPARATOR = "\uE000";
|
|
67
73
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAA4C,MAAM,aAAa,CAAA;AAElF,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,MAAM,GAGP,MAAM,aAAa,CAAA;AAEpB,OAAO,EACL,QAAQ,EACR,cAAc,EACd,WAAW,EACX,YAAY,EACZ,MAAM,EACN,OAAO,EACP,SAAS,EACT,UAAU,EACV,eAAe,GAEhB,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,UAAU,EAA4C,MAAM,aAAa,CAAA;AAElF,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,MAAM,GAGP,MAAM,aAAa,CAAA;AAEpB,OAAO,EACL,QAAQ,EACR,cAAc,EACd,WAAW,EACX,YAAY,EACZ,MAAM,EACN,OAAO,EACP,SAAS,EACT,UAAU,EACV,cAAc,EACd,eAAe,GAEhB,MAAM,cAAc,CAAA;AAmErB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC3C,OAAO,EAAE,eAAe,EAAE,SAAS,IAAI,kBAAkB,EAAE,OAAO,IAAI,gBAAgB,EAAE,UAAU,EAAE,cAAc,IAAI,uBAAuB,EAAE,MAAM,cAAc,CAAA;AACnK,OAAO,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD,OAAO,EAAE,6BAA6B,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAC3E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,UAA4B,EAAE;IACpE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,iBAAiB,CAAA;IACxD,MAAM,QAAQ,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,SAAS,GAAG,KAAK,EAAE,OAAO,GAAG,KAAK,EAAE,cAAc,GAAG,IAAI,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,CAAA;IAE/G,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;IACzC,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;IACtC,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;IAEtC,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,aAAa,CAAC,CAAA;IAC7C,CAAC;IAED,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,IAAI,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAA;IACtC,CAAC;IAED,6BAA6B,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;IAErE,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/dist/quotes.js
CHANGED
|
@@ -18,18 +18,18 @@ function convertSingleQuotes(text, sep) {
|
|
|
18
18
|
const endQuoteNotContraction = `(?!${contraction})${RIGHT_SINGLE_QUOTE}${afterEndingSingle}`;
|
|
19
19
|
const apostropheRegex = new RegExp(`(?<=^|[^\\w])'(${apostropheWhitelist}|(?![^${LEFT_SINGLE_QUOTE}'\\n]*${endQuoteNotContraction}))`, "gm");
|
|
20
20
|
text = text.replace(apostropheRegex, RIGHT_SINGLE_QUOTE);
|
|
21
|
-
const beginningSingle = `((?:^|[\\s${LEFT_DOUBLE_QUOTE}${RIGHT_DOUBLE_QUOTE}\\-\\(])${sep}?)['](?=${sep}?\\S)`;
|
|
22
|
-
text = text.replace(new RegExp(beginningSingle, "gm"),
|
|
21
|
+
const beginningSingle = `(?<beforeContext>(?:^|[\\s${LEFT_DOUBLE_QUOTE}${RIGHT_DOUBLE_QUOTE}\\-\\(])${sep}?)['](?=${sep}?\\S)`;
|
|
22
|
+
text = text.replace(new RegExp(beginningSingle, "gm"), `$<beforeContext>${LEFT_SINGLE_QUOTE}`);
|
|
23
23
|
return text;
|
|
24
24
|
}
|
|
25
25
|
/** Convert straight double quotes to curly quotes */
|
|
26
26
|
function convertDoubleQuotes(text, sep) {
|
|
27
|
-
const beginningDouble = new RegExp(`(?<=^|[\\s\\(\\/\\[\\{\\-${EM_DASH}${sep}])(?<beforeChr>${sep}?)["](?<afterChr>(
|
|
27
|
+
const beginningDouble = new RegExp(`(?<=^|[\\s\\(\\/\\[\\{\\-${EM_DASH}${sep}])(?<beforeChr>${sep}?)["](?<afterChr>(?<sepWithPunct>${sep}[ .,])|(?=${sep}?\\.{3}|${sep}?[^\\s\\)\\${EM_DASH},!?${sep};:.\\}]))`, "gm");
|
|
28
28
|
text = text.replace(beginningDouble, `$<beforeChr>${LEFT_DOUBLE_QUOTE}$<afterChr>`);
|
|
29
|
-
text = text.replace(new RegExp(`(?<=\\{)(
|
|
30
|
-
const endingDouble = `([^\\s\\(])["](
|
|
31
|
-
text = text.replace(new RegExp(endingDouble, "g"),
|
|
32
|
-
text = text.replace(new RegExp(`["](
|
|
29
|
+
text = text.replace(new RegExp(`(?<=\\{)(?<sepSpace>${sep}? )?["]`, "g"), `$<sepSpace>${LEFT_DOUBLE_QUOTE}`);
|
|
30
|
+
const endingDouble = `(?<beforeQuote>[^\\s\\(])["]((?<sepAfter>${sep})?)(?=${sep}|[\\s/\\).,;${EM_DASH}:\\-\\}!?s]|$)`;
|
|
31
|
+
text = text.replace(new RegExp(endingDouble, "g"), `$<beforeQuote>${RIGHT_DOUBLE_QUOTE}$<sepAfter>`);
|
|
32
|
+
text = text.replace(new RegExp(`["](?<sepEnd>${sep}?)$`, "g"), `${RIGHT_DOUBLE_QUOTE}$<sepEnd>`);
|
|
33
33
|
text = text.replace(new RegExp(`'(?=${RIGHT_DOUBLE_QUOTE})`, "gu"), RIGHT_SINGLE_QUOTE);
|
|
34
34
|
return text;
|
|
35
35
|
}
|
|
@@ -37,19 +37,19 @@ function convertDoubleQuotes(text, sep) {
|
|
|
37
37
|
function applyPunctuationStyle(text, sep, style) {
|
|
38
38
|
if (style === "american") {
|
|
39
39
|
// Period outside → inside: "Hello". → "Hello."
|
|
40
|
-
const periodOutsideRegex = new RegExp(`(?<![!?:\\.${ELLIPSIS}])(
|
|
41
|
-
text = text.replace(periodOutsideRegex, "
|
|
40
|
+
const periodOutsideRegex = new RegExp(`(?<![!?:\\.${ELLIPSIS}])(?<sepBefore>${sep}?)(?<quote>[${RIGHT_SINGLE_QUOTE}${RIGHT_DOUBLE_QUOTE}])(?<sepAfter>${sep}?)(?!\\.\\.\\.)\\.`, "g");
|
|
41
|
+
text = text.replace(periodOutsideRegex, "$<sepBefore>.$<quote>$<sepAfter>");
|
|
42
42
|
// Comma outside → inside: "Hello", → "Hello,"
|
|
43
|
-
const commaOutsideRegex = new RegExp(`(
|
|
44
|
-
text = text.replace(commaOutsideRegex, "
|
|
43
|
+
const commaOutsideRegex = new RegExp(`(?<sepBefore>${sep}?)(?<quote>[${RIGHT_SINGLE_QUOTE}${RIGHT_DOUBLE_QUOTE}])(?<sepAfter>${sep}?),`, "g");
|
|
44
|
+
text = text.replace(commaOutsideRegex, "$<sepBefore>,$<quote>$<sepAfter>");
|
|
45
45
|
}
|
|
46
46
|
else if (style === "british") {
|
|
47
47
|
// Period inside → outside: "Hello." → "Hello".
|
|
48
|
-
const periodInsideRegex = new RegExp(`(?<![!?:\\.${ELLIPSIS}])(
|
|
49
|
-
text = text.replace(periodInsideRegex, "
|
|
48
|
+
const periodInsideRegex = new RegExp(`(?<![!?:\\.${ELLIPSIS}])(?<sepBefore>${sep}?)\\.(?<sepMiddle>${sep}?)(?<quote>[${RIGHT_SINGLE_QUOTE}${RIGHT_DOUBLE_QUOTE}])`, "g");
|
|
49
|
+
text = text.replace(periodInsideRegex, "$<sepBefore>$<sepMiddle>$<quote>.");
|
|
50
50
|
// Comma inside → outside: "Hello," → "Hello",
|
|
51
|
-
const commaInsideRegex = new RegExp(`(?<![!?]),(
|
|
52
|
-
text = text.replace(commaInsideRegex, "
|
|
51
|
+
const commaInsideRegex = new RegExp(`(?<![!?]),(?<sepAndQuote>${sep}?[${RIGHT_DOUBLE_QUOTE}${RIGHT_SINGLE_QUOTE}])`, "g");
|
|
52
|
+
text = text.replace(commaInsideRegex, "$<sepAndQuote>,");
|
|
53
53
|
}
|
|
54
54
|
return text;
|
|
55
55
|
}
|
package/dist/quotes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quotes.js","sourceRoot":"","sources":["../src/quotes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEnE,MAAM,EACJ,OAAO,EACP,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,QAAQ,GACT,GAAG,eAAe,CAAA;AA8BnB,qEAAqE;AACrE,SAAS,mBAAmB,CAAC,IAAY,EAAE,GAAW;IACpD,MAAM,yBAAyB,GAAG,gBAAgB,OAAO,SAAS,CAAA;IAClE,MAAM,iBAAiB,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,yBAAyB,OAAO,CAAA;IACxF,MAAM,YAAY,GAAG,YAAY,iBAAiB,SAAS,iBAAiB,EAAE,CAAA;IAC9E,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,kBAAkB,CAAC,CAAA;IAEvE,MAAM,WAAW,GAAG,kBAAkB,kBAAkB,OAAO,GAAG,YAAY,CAAA;IAC9E,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,EAAE,kBAAkB,CAAC,CAAA;IAEtE,MAAM,mBAAmB,GAAG,OAAO,kBAAkB,IAAI,CAAA;IACzD,MAAM,sBAAsB,GAAG,MAAM,WAAW,IAAI,kBAAkB,GAAG,iBAAiB,EAAE,CAAA;IAC5F,MAAM,eAAe,GAAG,IAAI,MAAM,CAChC,kBAAkB,mBAAmB,SAAS,iBAAiB,SAAS,sBAAsB,IAAI,EAClG,IAAI,CACL,CAAA;IACD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,kBAAkB,CAAC,CAAA;IAExD,MAAM,eAAe,GAAG,
|
|
1
|
+
{"version":3,"file":"quotes.js","sourceRoot":"","sources":["../src/quotes.ts"],"names":[],"mappings":"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"}
|
package/dist/symbols.d.ts
CHANGED
|
@@ -144,6 +144,25 @@ export declare function primeMarks(text: string, options?: SymbolOptions): strin
|
|
|
144
144
|
* ```
|
|
145
145
|
*/
|
|
146
146
|
export declare function fractions(text: string, options?: SymbolOptions): string;
|
|
147
|
+
/**
|
|
148
|
+
* Collapses multiple consecutive spaces (including non-breaking spaces) into a single space.
|
|
149
|
+
*
|
|
150
|
+
* When multiple spaces or non-breaking spaces appear in sequence, this function
|
|
151
|
+
* keeps only the first space character, preserving its type.
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* ```ts
|
|
155
|
+
* collapseSpaces("hello world")
|
|
156
|
+
* // → "hello world"
|
|
157
|
+
*
|
|
158
|
+
* collapseSpaces("foo\u00A0\u00A0bar") // two nbsp
|
|
159
|
+
* // → "foo\u00A0bar" // single nbsp
|
|
160
|
+
*
|
|
161
|
+
* collapseSpaces("a \u00A0b") // space followed by nbsp
|
|
162
|
+
* // → "a b" // keeps the first (regular space)
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
export declare function collapseSpaces(text: string): string;
|
|
147
166
|
/**
|
|
148
167
|
* Applies all symbol transformations.
|
|
149
168
|
*
|
package/dist/symbols.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;
|
|
1
|
+
{"version":3,"file":"symbols.d.ts","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,WAAW,aAAa;IAC5B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;CACxB;AA6BD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAe1E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAkBhF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAShD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKjD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAyBxE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAWzE;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CA+B5E;AAwBD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAkB3E;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CASjF"}
|
package/dist/symbols.js
CHANGED
|
@@ -13,7 +13,7 @@ import { UNICODE_SYMBOLS, ESCAPED_DEFAULT_SEPARATOR } from "./constants.js";
|
|
|
13
13
|
function escapeRegex(str) {
|
|
14
14
|
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
15
15
|
}
|
|
16
|
-
const { ELLIPSIS, MULTIPLICATION, NOT_EQUAL, PLUS_MINUS, COPYRIGHT, REGISTERED, TRADEMARK, DEGREE, ARROW_RIGHT, ARROW_LEFT, ARROW_LEFT_RIGHT, APPROXIMATE, LESS_EQUAL, GREATER_EQUAL, PRIME, DOUBLE_PRIME, } = UNICODE_SYMBOLS;
|
|
16
|
+
const { ELLIPSIS, MULTIPLICATION, NOT_EQUAL, PLUS_MINUS, COPYRIGHT, REGISTERED, TRADEMARK, DEGREE, ARROW_RIGHT, ARROW_LEFT, ARROW_LEFT_RIGHT, APPROXIMATE, LESS_EQUAL, GREATER_EQUAL, PRIME, DOUBLE_PRIME, NBSP, } = UNICODE_SYMBOLS;
|
|
17
17
|
/**
|
|
18
18
|
* Converts three periods to a proper ellipsis character.
|
|
19
19
|
*
|
|
@@ -27,8 +27,12 @@ export function ellipsis(text, options = {}) {
|
|
|
27
27
|
const chr = options.separator
|
|
28
28
|
? escapeRegex(options.separator)
|
|
29
29
|
: ESCAPED_DEFAULT_SEPARATOR;
|
|
30
|
-
|
|
31
|
-
|
|
30
|
+
// Capture groups preserve separators: .(sep1)?.(sep2)?.
|
|
31
|
+
const pattern = new RegExp(`\\.(${chr})?\\.(${chr})?\\.`, "g");
|
|
32
|
+
text = text.replace(pattern, (_match, sep1, sep2) => {
|
|
33
|
+
// Preserve separators by appending them after the ellipsis
|
|
34
|
+
return ELLIPSIS + (sep1 || "") + (sep2 || "");
|
|
35
|
+
});
|
|
32
36
|
text = text.replace(new RegExp(`${ELLIPSIS}(?=\\w)`, "gu"), `${ELLIPSIS} `);
|
|
33
37
|
return text;
|
|
34
38
|
}
|
|
@@ -54,14 +58,14 @@ export function multiplication(text, options = {}) {
|
|
|
54
58
|
? escapeRegex(options.separator)
|
|
55
59
|
: ESCAPED_DEFAULT_SEPARATOR;
|
|
56
60
|
// Dimensions with spaces: preserve spacing
|
|
57
|
-
const loosePattern = new RegExp(`(
|
|
58
|
-
text = text.replace(loosePattern,
|
|
61
|
+
const loosePattern = new RegExp(`(?<leftNum>\\d${chr}?)\\s+[xX*]\\s+(?<rightNum>${chr}?\\d)`, "g");
|
|
62
|
+
text = text.replace(loosePattern, `$<leftNum> ${MULTIPLICATION} $<rightNum>`);
|
|
59
63
|
// Dimensions without spaces: keep tight
|
|
60
|
-
const tightPattern = new RegExp(`(
|
|
61
|
-
text = text.replace(tightPattern,
|
|
64
|
+
const tightPattern = new RegExp(`(?<leftNum>\\d${chr}?)[xX*](?<rightNum>${chr}?\\d)`, "g");
|
|
65
|
+
text = text.replace(tightPattern, `$<leftNum>${MULTIPLICATION}$<rightNum>`);
|
|
62
66
|
// Trailing multiplier: 5x (followed by word boundary - space, punctuation, etc.)
|
|
63
|
-
const trailingPattern = new RegExp(`(
|
|
64
|
-
text = text.replace(trailingPattern,
|
|
67
|
+
const trailingPattern = new RegExp(`(?<num>\\d${chr}?)[xX*]\\b`, "g");
|
|
68
|
+
text = text.replace(trailingPattern, `$<num>${MULTIPLICATION}`);
|
|
65
69
|
return text;
|
|
66
70
|
}
|
|
67
71
|
/**
|
|
@@ -154,7 +158,7 @@ export function degrees(text, options = {}) {
|
|
|
154
158
|
: ESCAPED_DEFAULT_SEPARATOR;
|
|
155
159
|
// Temperature with optional space before C or F
|
|
156
160
|
// Handles separator between digit and unit
|
|
157
|
-
return text.replace(new RegExp(`(
|
|
161
|
+
return text.replace(new RegExp(`(?<num>\\d${chr}?) ?(?<unit>[CF])\\b`, "gi"), (_, num, unit) => `${num} ${DEGREE}${unit.toUpperCase()}`);
|
|
158
162
|
}
|
|
159
163
|
/**
|
|
160
164
|
* Converts straight quotes after numbers to prime marks.
|
|
@@ -182,19 +186,19 @@ export function primeMarks(text, options = {}) {
|
|
|
182
186
|
// Single prime: Matches digit + optional separator + apostrophe
|
|
183
187
|
// Lookahead ensures it's followed by: another digit, double quote, end of string, or punctuation
|
|
184
188
|
// Examples: 5' (feet), 30' (arcminutes)
|
|
185
|
-
const singlePrimePattern = new RegExp(`(
|
|
186
|
-
text = text.replace(singlePrimePattern,
|
|
189
|
+
const singlePrimePattern = new RegExp(`(?<numWithSep>\\d${chr}?)'(?=${chr}?(?:\\d|"|$|[\\s.,;:!?)]))`, "g");
|
|
190
|
+
text = text.replace(singlePrimePattern, `$<numWithSep>${PRIME}`);
|
|
187
191
|
// Double prime Pattern 1: Feet-inches pattern
|
|
188
192
|
// Matches: prime symbol + optional separator + digit + optional separator + double quote
|
|
189
193
|
// Examples: 5′10" or 5'10" → 5′10″
|
|
190
|
-
const feetInchesPattern = new RegExp(`(
|
|
191
|
-
text = text.replace(feetInchesPattern,
|
|
194
|
+
const feetInchesPattern = new RegExp(`(?<primeAndNum>${PRIME}${chr}?\\d${chr}?)"`, "g");
|
|
195
|
+
text = text.replace(feetInchesPattern, `$<primeAndNum>${DOUBLE_PRIME}`);
|
|
192
196
|
// Double prime Pattern 2: Standalone inches
|
|
193
197
|
// Negative lookbehind: ensures no opening quote within 20 chars before the digit
|
|
194
198
|
// Negative lookahead: ensures not followed by word characters
|
|
195
199
|
// Matches: 12" wide ✓, but not: "Term 1" ✗
|
|
196
|
-
const standaloneInchesPattern = new RegExp(`(?<!["\u201C]${chr}?[^"${chr}]{0,20})(
|
|
197
|
-
text = text.replace(standaloneInchesPattern,
|
|
200
|
+
const standaloneInchesPattern = new RegExp(`(?<!["\u201C]${chr}?[^"${chr}]{0,20})(?<numWithSep>\\d${chr}?)"(?!${chr}?[\\w])`, "g");
|
|
201
|
+
text = text.replace(standaloneInchesPattern, `$<numWithSep>${DOUBLE_PRIME}`);
|
|
198
202
|
return text;
|
|
199
203
|
}
|
|
200
204
|
/**
|
|
@@ -250,6 +254,27 @@ export function fractions(text, options = {}) {
|
|
|
250
254
|
}
|
|
251
255
|
return text;
|
|
252
256
|
}
|
|
257
|
+
/**
|
|
258
|
+
* Collapses multiple consecutive spaces (including non-breaking spaces) into a single space.
|
|
259
|
+
*
|
|
260
|
+
* When multiple spaces or non-breaking spaces appear in sequence, this function
|
|
261
|
+
* keeps only the first space character, preserving its type.
|
|
262
|
+
*
|
|
263
|
+
* @example
|
|
264
|
+
* ```ts
|
|
265
|
+
* collapseSpaces("hello world")
|
|
266
|
+
* // → "hello world"
|
|
267
|
+
*
|
|
268
|
+
* collapseSpaces("foo\u00A0\u00A0bar") // two nbsp
|
|
269
|
+
* // → "foo\u00A0bar" // single nbsp
|
|
270
|
+
*
|
|
271
|
+
* collapseSpaces("a \u00A0b") // space followed by nbsp
|
|
272
|
+
* // → "a b" // keeps the first (regular space)
|
|
273
|
+
* ```
|
|
274
|
+
*/
|
|
275
|
+
export function collapseSpaces(text) {
|
|
276
|
+
return text.replace(new RegExp(`(?<first>[ ${NBSP}])[ ${NBSP}]+`, "g"), "$<first>");
|
|
277
|
+
}
|
|
253
278
|
/**
|
|
254
279
|
* Applies all symbol transformations.
|
|
255
280
|
*
|
package/dist/symbols.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbols.js","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,gBAAgB,CAAA;AAe3E;;GAEG;AACH,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;AACnD,CAAC;AAED,MAAM,EACJ,QAAQ,EACR,cAAc,EACd,SAAS,EACT,UAAU,EACV,SAAS,EACT,UAAU,EACV,SAAS,EACT,MAAM,EACN,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,aAAa,EACb,KAAK,EACL,YAAY,
|
|
1
|
+
{"version":3,"file":"symbols.js","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for text transformation validation.
|
|
3
|
+
*
|
|
4
|
+
* @module utils
|
|
5
|
+
*/
|
|
6
|
+
export declare function countSeparators(text: string, separator?: string): number;
|
|
7
|
+
/**
|
|
8
|
+
* Validates that a transformation preserved the separator count.
|
|
9
|
+
* Throws an error if separators were added or removed.
|
|
10
|
+
*
|
|
11
|
+
* @param original - The original text before transformation
|
|
12
|
+
* @param transformed - The text after transformation
|
|
13
|
+
* @param separator - The separator character to check (default: DEFAULT_SEPARATOR)
|
|
14
|
+
* @param transformName - Name of the transform for error messages (default: "transform")
|
|
15
|
+
* @throws Error if separator count changed
|
|
16
|
+
*/
|
|
17
|
+
export declare function assertSeparatorCountPreserved(original: string, transformed: string, separator?: string, transformName?: string): void;
|
|
18
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,MAA0B,GAAG,MAAM,CAM3F;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EACnB,SAAS,GAAE,MAA0B,EACrC,aAAa,GAAE,MAAoB,GAClC,IAAI,CAQN"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for text transformation validation.
|
|
3
|
+
*
|
|
4
|
+
* @module utils
|
|
5
|
+
*/
|
|
6
|
+
import { DEFAULT_SEPARATOR } from "./constants.js";
|
|
7
|
+
export function countSeparators(text, separator = DEFAULT_SEPARATOR) {
|
|
8
|
+
let count = 0;
|
|
9
|
+
for (const char of text) {
|
|
10
|
+
if (char === separator)
|
|
11
|
+
count++;
|
|
12
|
+
}
|
|
13
|
+
return count;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Validates that a transformation preserved the separator count.
|
|
17
|
+
* Throws an error if separators were added or removed.
|
|
18
|
+
*
|
|
19
|
+
* @param original - The original text before transformation
|
|
20
|
+
* @param transformed - The text after transformation
|
|
21
|
+
* @param separator - The separator character to check (default: DEFAULT_SEPARATOR)
|
|
22
|
+
* @param transformName - Name of the transform for error messages (default: "transform")
|
|
23
|
+
* @throws Error if separator count changed
|
|
24
|
+
*/
|
|
25
|
+
export function assertSeparatorCountPreserved(original, transformed, separator = DEFAULT_SEPARATOR, transformName = "transform") {
|
|
26
|
+
const originalCount = countSeparators(original, separator);
|
|
27
|
+
const transformedCount = countSeparators(transformed, separator);
|
|
28
|
+
if (originalCount !== transformedCount) {
|
|
29
|
+
throw new Error(`${transformName} altered separator count: expected ${originalCount}, got ${transformedCount}`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAElD,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,YAAoB,iBAAiB;IACjF,IAAI,KAAK,GAAG,CAAC,CAAA;IACb,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,EAAE,CAAA;IACjC,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,6BAA6B,CAC3C,QAAgB,EAChB,WAAmB,EACnB,YAAoB,iBAAiB,EACrC,gBAAwB,WAAW;IAEnC,MAAM,aAAa,GAAG,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;IAC1D,MAAM,gBAAgB,GAAG,eAAe,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;IAChE,IAAI,aAAa,KAAK,gBAAgB,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CACb,GAAG,aAAa,sCAAsC,aAAa,SAAS,gBAAgB,EAAE,CAC/F,CAAA;IACH,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "punctilio",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Smart typography transformations: curly quotes, em-dashes, en-dashes, and more",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -38,15 +38,20 @@
|
|
|
38
38
|
"node": ">=18.0.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
|
+
"@eslint/js": "^9.39.2",
|
|
41
42
|
"@types/jest": "^29.5.12",
|
|
42
43
|
"@types/node": "^20.11.0",
|
|
44
|
+
"eslint": "^9.39.2",
|
|
45
|
+
"eslint-plugin-regexp": "^3.0.0",
|
|
43
46
|
"jest": "^29.7.0",
|
|
44
47
|
"ts-jest": "^29.1.2",
|
|
45
|
-
"typescript": "^5.3.3"
|
|
48
|
+
"typescript": "^5.3.3",
|
|
49
|
+
"typescript-eslint": "^8.54.0"
|
|
46
50
|
},
|
|
47
51
|
"scripts": {
|
|
48
52
|
"build": "tsc",
|
|
49
53
|
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
|
|
54
|
+
"lint": "eslint src",
|
|
50
55
|
"postinstall": "bash scripts/install-hooks.sh || true",
|
|
51
56
|
"install-hooks": "bash scripts/install-hooks.sh"
|
|
52
57
|
}
|