punctilio 0.2.0 → 0.2.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/constants.d.ts +59 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +59 -0
- package/dist/constants.js.map +1 -0
- package/dist/dashes.d.ts.map +1 -1
- package/dist/dashes.js +14 -21
- package/dist/dashes.js.map +1 -1
- package/dist/quotes.d.ts.map +1 -1
- package/dist/quotes.js +19 -42
- package/dist/quotes.js.map +1 -1
- package/dist/symbols.d.ts +7 -23
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +91 -105
- package/dist/symbols.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Unicode constants used throughout the punctilio package.
|
|
3
|
+
*
|
|
4
|
+
* This module provides a centralized location for all Unicode symbols
|
|
5
|
+
* used in typography transformations, making the codebase more maintainable
|
|
6
|
+
* and self-documenting.
|
|
7
|
+
*
|
|
8
|
+
* @module constants
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Unicode symbols for typography transformations.
|
|
12
|
+
*/
|
|
13
|
+
export declare const UNICODE_SYMBOLS: {
|
|
14
|
+
readonly ELLIPSIS: "…";
|
|
15
|
+
readonly MULTIPLICATION: "×";
|
|
16
|
+
readonly NOT_EQUAL: "≠";
|
|
17
|
+
readonly PLUS_MINUS: "±";
|
|
18
|
+
readonly COPYRIGHT: "©";
|
|
19
|
+
readonly REGISTERED: "®";
|
|
20
|
+
readonly TRADEMARK: "™";
|
|
21
|
+
readonly DEGREE: "°";
|
|
22
|
+
readonly ARROW_RIGHT: "→";
|
|
23
|
+
readonly ARROW_LEFT: "←";
|
|
24
|
+
readonly ARROW_LEFT_RIGHT: "↔";
|
|
25
|
+
readonly APPROXIMATE: "≈";
|
|
26
|
+
readonly LESS_EQUAL: "≤";
|
|
27
|
+
readonly GREATER_EQUAL: "≥";
|
|
28
|
+
readonly PRIME: "′";
|
|
29
|
+
readonly DOUBLE_PRIME: "″";
|
|
30
|
+
readonly FRACTION_1_4: "¼";
|
|
31
|
+
readonly FRACTION_1_2: "½";
|
|
32
|
+
readonly FRACTION_3_4: "¾";
|
|
33
|
+
readonly FRACTION_1_3: "⅓";
|
|
34
|
+
readonly FRACTION_2_3: "⅔";
|
|
35
|
+
readonly FRACTION_1_5: "⅕";
|
|
36
|
+
readonly FRACTION_2_5: "⅖";
|
|
37
|
+
readonly FRACTION_3_5: "⅗";
|
|
38
|
+
readonly FRACTION_4_5: "⅘";
|
|
39
|
+
readonly FRACTION_1_6: "⅙";
|
|
40
|
+
readonly FRACTION_5_6: "⅚";
|
|
41
|
+
readonly FRACTION_1_8: "⅛";
|
|
42
|
+
readonly FRACTION_3_8: "⅜";
|
|
43
|
+
readonly FRACTION_5_8: "⅝";
|
|
44
|
+
readonly FRACTION_7_8: "⅞";
|
|
45
|
+
readonly EM_DASH: "—";
|
|
46
|
+
readonly EN_DASH: "–";
|
|
47
|
+
readonly MINUS: "−";
|
|
48
|
+
readonly LEFT_DOUBLE_QUOTE: "“";
|
|
49
|
+
readonly RIGHT_DOUBLE_QUOTE: "”";
|
|
50
|
+
readonly LEFT_SINGLE_QUOTE: "‘";
|
|
51
|
+
readonly RIGHT_SINGLE_QUOTE: "’";
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Default separator character for text spanning HTML elements.
|
|
55
|
+
* Uses Unicode Private Use Area character U+E000.
|
|
56
|
+
*/
|
|
57
|
+
export declare const DEFAULT_SEPARATOR = "\uE000";
|
|
58
|
+
export declare const ESCAPED_DEFAULT_SEPARATOR: string;
|
|
59
|
+
//# sourceMappingURL=constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuClB,CAAA;AAEV;;;GAGG;AACH,eAAO,MAAM,iBAAiB,WAAW,CAAA;AACzC,eAAO,MAAM,yBAAyB,QAA2D,CAAA"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Unicode constants used throughout the punctilio package.
|
|
3
|
+
*
|
|
4
|
+
* This module provides a centralized location for all Unicode symbols
|
|
5
|
+
* used in typography transformations, making the codebase more maintainable
|
|
6
|
+
* and self-documenting.
|
|
7
|
+
*
|
|
8
|
+
* @module constants
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Unicode symbols for typography transformations.
|
|
12
|
+
*/
|
|
13
|
+
export const UNICODE_SYMBOLS = {
|
|
14
|
+
ELLIPSIS: "\u2026",
|
|
15
|
+
MULTIPLICATION: "\u00D7",
|
|
16
|
+
NOT_EQUAL: "\u2260",
|
|
17
|
+
PLUS_MINUS: "\u00B1",
|
|
18
|
+
COPYRIGHT: "\u00A9",
|
|
19
|
+
REGISTERED: "\u00AE",
|
|
20
|
+
TRADEMARK: "\u2122",
|
|
21
|
+
DEGREE: "\u00B0",
|
|
22
|
+
ARROW_RIGHT: "\u2192",
|
|
23
|
+
ARROW_LEFT: "\u2190",
|
|
24
|
+
ARROW_LEFT_RIGHT: "\u2194",
|
|
25
|
+
APPROXIMATE: "\u2248",
|
|
26
|
+
LESS_EQUAL: "\u2264",
|
|
27
|
+
GREATER_EQUAL: "\u2265",
|
|
28
|
+
PRIME: "\u2032",
|
|
29
|
+
DOUBLE_PRIME: "\u2033",
|
|
30
|
+
FRACTION_1_4: "\u00BC",
|
|
31
|
+
FRACTION_1_2: "\u00BD",
|
|
32
|
+
FRACTION_3_4: "\u00BE",
|
|
33
|
+
FRACTION_1_3: "\u2153",
|
|
34
|
+
FRACTION_2_3: "\u2154",
|
|
35
|
+
FRACTION_1_5: "\u2155",
|
|
36
|
+
FRACTION_2_5: "\u2156",
|
|
37
|
+
FRACTION_3_5: "\u2157",
|
|
38
|
+
FRACTION_4_5: "\u2158",
|
|
39
|
+
FRACTION_1_6: "\u2159",
|
|
40
|
+
FRACTION_5_6: "\u215A",
|
|
41
|
+
FRACTION_1_8: "\u215B",
|
|
42
|
+
FRACTION_3_8: "\u215C",
|
|
43
|
+
FRACTION_5_8: "\u215D",
|
|
44
|
+
FRACTION_7_8: "\u215E",
|
|
45
|
+
EM_DASH: "\u2014",
|
|
46
|
+
EN_DASH: "\u2013",
|
|
47
|
+
MINUS: "\u2212",
|
|
48
|
+
LEFT_DOUBLE_QUOTE: "\u201C",
|
|
49
|
+
RIGHT_DOUBLE_QUOTE: "\u201D",
|
|
50
|
+
LEFT_SINGLE_QUOTE: "\u2018",
|
|
51
|
+
RIGHT_SINGLE_QUOTE: "\u2019",
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Default separator character for text spanning HTML elements.
|
|
55
|
+
* Uses Unicode Private Use Area character U+E000.
|
|
56
|
+
*/
|
|
57
|
+
export const DEFAULT_SEPARATOR = "\uE000";
|
|
58
|
+
export const ESCAPED_DEFAULT_SEPARATOR = DEFAULT_SEPARATOR.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
59
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +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;CACpB,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.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashes.d.ts","sourceRoot":"","sources":["../src/dashes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"dashes.d.ts","sourceRoot":"","sources":["../src/dashes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,MAAM,WAAW,WAAW;IAC1B;;;;;;;OAOG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAID;;GAEG;AACH,eAAO,MAAM,MAAM,QAyBR,CAAA;AAEX;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CASjF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAM/E;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAI5E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,MAAM,CAwC7E"}
|
package/dist/dashes.js
CHANGED
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* Converts hyphens and dashes to typographically correct em-dashes,
|
|
5
5
|
* en-dashes, and minus signs based on context.
|
|
6
6
|
*/
|
|
7
|
-
|
|
7
|
+
import { UNICODE_SYMBOLS, DEFAULT_SEPARATOR } from "./constants.js";
|
|
8
|
+
const { EN_DASH, EM_DASH, MINUS } = UNICODE_SYMBOLS;
|
|
8
9
|
/**
|
|
9
10
|
* List of month names (full and abbreviated) for date range detection
|
|
10
11
|
*/
|
|
@@ -59,7 +60,7 @@ export const months = [
|
|
|
59
60
|
*/
|
|
60
61
|
export function enDashNumberRange(text, options = {}) {
|
|
61
62
|
const chr = options.separator ?? DEFAULT_SEPARATOR;
|
|
62
|
-
return text.replace(new RegExp(`\\b(?<![a-zA-Z.])((?:p\\.?|\\$)?\\d[\\d.,]*${chr}?)-(${chr}?\\$?\\d[\\d.,]*)(?!\\.\\d)\\b`, "g"),
|
|
63
|
+
return text.replace(new RegExp(`\\b(?<![a-zA-Z.])((?:p\\.?|\\$)?\\d[\\d.,]*${chr}?)-(${chr}?\\$?\\d[\\d.,]*)(?!\\.\\d)\\b`, "g"), `$1${EN_DASH}$2`);
|
|
63
64
|
}
|
|
64
65
|
/**
|
|
65
66
|
* Replaces hyphens with en-dashes in month/date ranges.
|
|
@@ -80,7 +81,7 @@ export function enDashNumberRange(text, options = {}) {
|
|
|
80
81
|
*/
|
|
81
82
|
export function enDashDateRange(text, options = {}) {
|
|
82
83
|
const chr = options.separator ?? DEFAULT_SEPARATOR;
|
|
83
|
-
return text.replace(new RegExp(`\\b(${months}${chr}?)-(${chr}?(?:${months}))\\b`, "g"),
|
|
84
|
+
return text.replace(new RegExp(`\\b(${months}${chr}?)-(${chr}?(?:${months}))\\b`, "g"), `$1${EN_DASH}$2`);
|
|
84
85
|
}
|
|
85
86
|
/**
|
|
86
87
|
* Replaces hyphens with proper minus signs (−) in numerical contexts.
|
|
@@ -104,7 +105,7 @@ export function enDashDateRange(text, options = {}) {
|
|
|
104
105
|
export function minusReplace(text, options = {}) {
|
|
105
106
|
const chr = options.separator ?? DEFAULT_SEPARATOR;
|
|
106
107
|
const minusRegex = new RegExp(`(^|[\\s\\(${chr}""])-(\\s?\\d*\\.?\\d+)`, "gm");
|
|
107
|
-
return text.replaceAll(minusRegex,
|
|
108
|
+
return text.replaceAll(minusRegex, `$1${MINUS}$2`);
|
|
108
109
|
}
|
|
109
110
|
/**
|
|
110
111
|
* Comprehensive dash replacement for typographic correctness.
|
|
@@ -146,25 +147,17 @@ export function hyphenReplace(text, options = {}) {
|
|
|
146
147
|
// Being right after chr is a sufficient condition for being an em
|
|
147
148
|
// dash, as it indicates the start of a new line
|
|
148
149
|
const preDash = new RegExp(`((?<markerBeforeTwo>${chr}?)[ ]+|(?<markerBeforeThree>${chr}))`);
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
text = text.replace(
|
|
153
|
-
|
|
154
|
-
const
|
|
155
|
-
text = text.replace(
|
|
156
|
-
// Handle dashes at the start of a line
|
|
157
|
-
text = text.replace(new RegExp(`^(${chr})?[-]+ `, "gm"), "$1— ");
|
|
158
|
-
// Create a regex for spaces around em dashes, allowing for optional spaces around the em dash
|
|
159
|
-
const spacesAroundEM = new RegExp(`(?<markerBefore>${chr}?)[ ]*—[ ]*(?<markerAfter>${chr}?)[ ]*`, "g");
|
|
160
|
-
// Remove spaces around em dashes
|
|
161
|
-
text = text.replace(spacesAroundEM, "$<markerBefore>—$<markerAfter>");
|
|
162
|
-
// Handle special case after quotation marks
|
|
150
|
+
const surroundedDash = new RegExp(`(?<=[^\\s>]|^)${preDash.source}[~${EN_DASH}${EM_DASH}-]+[ ]*(?<markerAfter>${chr}?)([ ]+|$)`, "g");
|
|
151
|
+
text = text.replace(surroundedDash, `$<markerBeforeTwo>$<markerBeforeThree>${EM_DASH}$<markerAfter>`);
|
|
152
|
+
const multipleDashInWords = new RegExp(`(?<=[A-Za-z\\d])(?<markerBefore>${chr}?)[~${EN_DASH}${EM_DASH}-]{2,}(?<markerAfter>${chr}?)(?=[A-Za-z\\d ])`, "g");
|
|
153
|
+
text = text.replace(multipleDashInWords, `$<markerBefore>${EM_DASH}$<markerAfter>`);
|
|
154
|
+
text = text.replace(new RegExp(`^(${chr})?[-]+ `, "gm"), `$1${EM_DASH} `);
|
|
155
|
+
const spacesAroundEM = new RegExp(`(?<markerBefore>${chr}?)[ ]*${EM_DASH}[ ]*(?<markerAfter>${chr}?)[ ]*`, "g");
|
|
156
|
+
text = text.replace(spacesAroundEM, `$<markerBefore>${EM_DASH}$<markerAfter>`);
|
|
163
157
|
const postQuote = new RegExp(`(?<quote>[.!?]${chr}?['"'"]${chr}?|…)${spacesAroundEM.source}`, "g");
|
|
164
|
-
text = text.replace(postQuote,
|
|
165
|
-
// Handle em dashes at the start of a line
|
|
158
|
+
text = text.replace(postQuote, `$<quote> $<markerBefore>${EM_DASH}$<markerAfter> `);
|
|
166
159
|
const startOfLine = new RegExp(`^${spacesAroundEM.source}(?<after>[A-Z0-9])`, "gm");
|
|
167
|
-
text = text.replace(startOfLine,
|
|
160
|
+
text = text.replace(startOfLine, `$<markerBefore>${EM_DASH}$<markerAfter> $<after>`);
|
|
168
161
|
text = enDashNumberRange(text, options);
|
|
169
162
|
text = enDashDateRange(text, options);
|
|
170
163
|
return text;
|
package/dist/dashes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashes.js","sourceRoot":"","sources":["../src/dashes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
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;AAcnE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,eAAe,CAAA;AAEnD;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,SAAS;IACT,UAAU;IACV,OAAO;IACP,OAAO;IACP,KAAK;IACL,MAAM;IACN,MAAM;IACN,QAAQ;IACR,WAAW;IACX,SAAS;IACT,UAAU;IACV,UAAU;IACV,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAEX;;;;;;;;;;;;;;;;;;;;;;GAsBG;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,8CAA8C,GAAG,OAAO,GAAG,gCAAgC,EAC3F,GAAG,CACJ,EACD,KAAK,OAAO,IAAI,CACjB,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,UAAuB,EAAE;IACrE,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,iBAAiB,CAAA;IAClD,OAAO,IAAI,CAAC,OAAO,CACjB,IAAI,MAAM,CAAC,OAAO,MAAM,GAAG,GAAG,OAAO,GAAG,OAAO,MAAM,OAAO,EAAE,GAAG,CAAC,EAClE,KAAK,OAAO,IAAI,CACjB,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,UAAuB,EAAE;IAClE,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,iBAAiB,CAAA;IAClD,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,aAAa,GAAG,yBAAyB,EAAE,IAAI,CAAC,CAAA;IAC9E,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,KAAK,KAAK,IAAI,CAAC,CAAA;AACpD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,UAAuB,EAAE;IACnE,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,IAAI,iBAAiB,CAAA;IAElD,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAElC,oEAAoE;IACpE,mEAAmE;IACnE,iDAAiD;IACjD,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,uBAAuB,GAAG,+BAA+B,GAAG,IAAI,CAAC,CAAA;IAC5F,MAAM,cAAc,GAAG,IAAI,MAAM,CAC/B,iBAAiB,OAAO,CAAC,MAAM,KAAK,OAAO,GAAG,OAAO,yBAAyB,GAAG,YAAY,EAC7F,GAAG,CACJ,CAAA;IAED,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,yCAAyC,OAAO,gBAAgB,CAAC,CAAA;IAErG,MAAM,mBAAmB,GAAG,IAAI,MAAM,CACpC,mCAAmC,GAAG,OAAO,OAAO,GAAG,OAAO,wBAAwB,GAAG,oBAAoB,EAC7G,GAAG,CACJ,CAAA;IACD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,kBAAkB,OAAO,gBAAgB,CAAC,CAAA;IAEnF,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,SAAS,EAAE,IAAI,CAAC,EAAE,KAAK,OAAO,GAAG,CAAC,CAAA;IAEzE,MAAM,cAAc,GAAG,IAAI,MAAM,CAC/B,mBAAmB,GAAG,SAAS,OAAO,sBAAsB,GAAG,QAAQ,EACvE,GAAG,CACJ,CAAA;IACD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,kBAAkB,OAAO,gBAAgB,CAAC,CAAA;IAE9E,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,iBAAiB,GAAG,UAAU,GAAG,OAAO,cAAc,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,CAAA;IAClG,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,2BAA2B,OAAO,iBAAiB,CAAC,CAAA;IAEnF,MAAM,WAAW,GAAG,IAAI,MAAM,CAAC,IAAI,cAAc,CAAC,MAAM,oBAAoB,EAAE,IAAI,CAAC,CAAA;IACnF,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,kBAAkB,OAAO,yBAAyB,CAAC,CAAA;IAEpF,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACvC,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAErC,OAAO,IAAI,CAAA;AACb,CAAC"}
|
package/dist/quotes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quotes.d.ts","sourceRoot":"","sources":["../src/quotes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"quotes.d.ts","sourceRoot":"","sources":["../src/quotes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,MAAM,WAAW,YAAY;IAC3B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,MAAM,CA8C3E"}
|
package/dist/quotes.js
CHANGED
|
@@ -4,14 +4,8 @@
|
|
|
4
4
|
* Converts straight quotes to typographically correct curly quotes,
|
|
5
5
|
* handling contractions, possessives, and nested quotes.
|
|
6
6
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const EM_DASH = "\u2014"; // —
|
|
10
|
-
const LEFT_DOUBLE = "\u201C"; // "
|
|
11
|
-
const RIGHT_DOUBLE = "\u201D"; // "
|
|
12
|
-
const LEFT_SINGLE = "\u2018"; // '
|
|
13
|
-
const RIGHT_SINGLE = "\u2019"; // '
|
|
14
|
-
const ELLIPSIS = "\u2026"; // …
|
|
7
|
+
import { UNICODE_SYMBOLS, DEFAULT_SEPARATOR } from "./constants.js";
|
|
8
|
+
const { EM_DASH, LEFT_DOUBLE_QUOTE, RIGHT_DOUBLE_QUOTE, LEFT_SINGLE_QUOTE, RIGHT_SINGLE_QUOTE, ELLIPSIS, } = UNICODE_SYMBOLS;
|
|
15
9
|
/**
|
|
16
10
|
* Converts standard quotes to typographic smart quotes.
|
|
17
11
|
*
|
|
@@ -21,45 +15,28 @@ const ELLIPSIS = "\u2026"; // …
|
|
|
21
15
|
*/
|
|
22
16
|
export function niceQuotes(text, options = {}) {
|
|
23
17
|
const chr = options.separator ?? DEFAULT_SEPARATOR;
|
|
24
|
-
// Single quotes //
|
|
25
|
-
// Ending comes first so as to not mess with the open quote
|
|
26
18
|
const afterEndingSinglePatterns = `\\s\\.!?;,\\)${EM_DASH}\\-\\]"`;
|
|
27
19
|
const afterEndingSingle = `(?=${chr}?(?:s${chr}?)?(?:[${afterEndingSinglePatterns}]|$))`;
|
|
28
|
-
const endingSingle = `(?<=[^\\s${
|
|
29
|
-
text = text.replace(new RegExp(endingSingle, "gm"),
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
// Note: The character class uses LEFT_SINGLE and ASCII straight quote (U+0027)
|
|
39
|
-
// NOT RIGHT_SINGLE - this is intentional for the algorithm to work correctly
|
|
40
|
-
const apostropheRegex = new RegExp(`(?<=^|[^\\w])'(${apostropheWhitelist}|(?![^${LEFT_SINGLE}'\\n]*${endQuoteNotContraction}))`, "gm");
|
|
41
|
-
text = text.replace(apostropheRegex, RIGHT_SINGLE);
|
|
42
|
-
// Beginning single quotes
|
|
43
|
-
const beginningSingle = `((?:^|[\\s${LEFT_DOUBLE}${RIGHT_DOUBLE}\\-\\(])${chr}?)['](?=${chr}?\\S)`;
|
|
44
|
-
text = text.replace(new RegExp(beginningSingle, "gm"), `$1${LEFT_SINGLE}`);
|
|
45
|
-
// Double quotes //
|
|
20
|
+
const endingSingle = `(?<=[^\\s${LEFT_DOUBLE_QUOTE}'])[']${afterEndingSingle}`;
|
|
21
|
+
text = text.replace(new RegExp(endingSingle, "gm"), RIGHT_SINGLE_QUOTE);
|
|
22
|
+
const contraction = `(?<=[A-Za-z])['${RIGHT_SINGLE_QUOTE}](?=${chr}?[a-zA-Z])`;
|
|
23
|
+
text = text.replace(new RegExp(contraction, "gm"), RIGHT_SINGLE_QUOTE);
|
|
24
|
+
const apostropheWhitelist = `(?=n${RIGHT_SINGLE_QUOTE} )`;
|
|
25
|
+
const endQuoteNotContraction = `(?!${contraction})${RIGHT_SINGLE_QUOTE}${afterEndingSingle}`;
|
|
26
|
+
const apostropheRegex = new RegExp(`(?<=^|[^\\w])'(${apostropheWhitelist}|(?![^${LEFT_SINGLE_QUOTE}'\\n]*${endQuoteNotContraction}))`, "gm");
|
|
27
|
+
text = text.replace(apostropheRegex, RIGHT_SINGLE_QUOTE);
|
|
28
|
+
const beginningSingle = `((?:^|[\\s${LEFT_DOUBLE_QUOTE}${RIGHT_DOUBLE_QUOTE}\\-\\(])${chr}?)['](?=${chr}?\\S)`;
|
|
29
|
+
text = text.replace(new RegExp(beginningSingle, "gm"), `$1${LEFT_SINGLE_QUOTE}`);
|
|
46
30
|
const beginningDouble = new RegExp(`(?<=^|[\\s\\(\\/\\[\\{\\-${EM_DASH}${chr}])(?<beforeChr>${chr}?)["](?<afterChr>(${chr}[ .,])|(?=${chr}?\\.{3}|${chr}?[^\\s\\)\\${EM_DASH},!?${chr};:.\\}]))`, "gm");
|
|
47
|
-
text = text.replace(beginningDouble, `$<beforeChr>${
|
|
48
|
-
|
|
49
|
-
text = text.replace(new RegExp(`(?<=\\{)(${chr}? )?["]`, "g"), `$1${LEFT_DOUBLE}`);
|
|
50
|
-
// note: Allowing 2 chrs in a row
|
|
31
|
+
text = text.replace(beginningDouble, `$<beforeChr>${LEFT_DOUBLE_QUOTE}$<afterChr>`);
|
|
32
|
+
text = text.replace(new RegExp(`(?<=\\{)(${chr}? )?["]`, "g"), `$1${LEFT_DOUBLE_QUOTE}`);
|
|
51
33
|
const endingDouble = `([^\\s\\(])["](${chr}?)(?=${chr}|[\\s/\\).,;${EM_DASH}:\\-\\}!?s]|$)`;
|
|
52
|
-
text = text.replace(new RegExp(endingDouble, "g"), `$1${
|
|
53
|
-
|
|
54
|
-
text = text.replace(new RegExp(`
|
|
55
|
-
|
|
56
|
-
text = text.replace(new RegExp(`'(?=${RIGHT_DOUBLE})`, "gu"), RIGHT_SINGLE);
|
|
57
|
-
// Punctuation //
|
|
58
|
-
// Periods inside quotes
|
|
59
|
-
const periodRegex = new RegExp(`(?<![!?:\\.${ELLIPSIS}])(${chr}?)([${RIGHT_SINGLE}${RIGHT_DOUBLE}])(${chr}?)(?!\\.\\.\\.)\\.`, "g");
|
|
34
|
+
text = text.replace(new RegExp(endingDouble, "g"), `$1${RIGHT_DOUBLE_QUOTE}$2`);
|
|
35
|
+
text = text.replace(new RegExp(`["](${chr}?)$`, "g"), `${RIGHT_DOUBLE_QUOTE}$1`);
|
|
36
|
+
text = text.replace(new RegExp(`'(?=${RIGHT_DOUBLE_QUOTE})`, "gu"), RIGHT_SINGLE_QUOTE);
|
|
37
|
+
const periodRegex = new RegExp(`(?<![!?:\\.${ELLIPSIS}])(${chr}?)([${RIGHT_SINGLE_QUOTE}${RIGHT_DOUBLE_QUOTE}])(${chr}?)(?!\\.\\.\\.)\\.`, "g");
|
|
60
38
|
text = text.replace(periodRegex, "$1.$2$3");
|
|
61
|
-
|
|
62
|
-
const commaRegex = new RegExp(`(?<![!?]),(${chr}?[${RIGHT_DOUBLE}${RIGHT_SINGLE}])`, "g");
|
|
39
|
+
const commaRegex = new RegExp(`(?<![!?]),(${chr}?[${RIGHT_DOUBLE_QUOTE}${RIGHT_SINGLE_QUOTE}])`, "g");
|
|
63
40
|
text = text.replace(commaRegex, "$1,");
|
|
64
41
|
return text;
|
|
65
42
|
}
|
package/dist/quotes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quotes.js","sourceRoot":"","sources":["../src/quotes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"quotes.js","sourceRoot":"","sources":["../src/quotes.ts"],"names":[],"mappings":"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"}
|
package/dist/symbols.d.ts
CHANGED
|
@@ -12,6 +12,11 @@ export interface SymbolOptions {
|
|
|
12
12
|
* Default: "\uE000" (Unicode Private Use Area)
|
|
13
13
|
*/
|
|
14
14
|
separator?: string;
|
|
15
|
+
/**
|
|
16
|
+
* Whether to include arrow transformations (-> to →, etc.).
|
|
17
|
+
* Default: true
|
|
18
|
+
*/
|
|
19
|
+
includeArrows?: boolean;
|
|
15
20
|
}
|
|
16
21
|
/**
|
|
17
22
|
* Converts three periods to a proper ellipsis character.
|
|
@@ -44,13 +49,6 @@ export declare function multiplication(text: string, options?: SymbolOptions): s
|
|
|
44
49
|
/**
|
|
45
50
|
* Converts ASCII mathematical symbols to proper Unicode equivalents.
|
|
46
51
|
*
|
|
47
|
-
* Handles:
|
|
48
|
-
* - "!=" → "≠"
|
|
49
|
-
* - "+-" or "+/-" → "±"
|
|
50
|
-
* - "<=" → "≤"
|
|
51
|
-
* - ">=" → "≥"
|
|
52
|
-
* - "~=" or "=~" → "≈"
|
|
53
|
-
*
|
|
54
52
|
* @example
|
|
55
53
|
* ```ts
|
|
56
54
|
* mathSymbols("x != y and a <= b")
|
|
@@ -64,20 +62,6 @@ export declare function mathSymbols(text: string): string;
|
|
|
64
62
|
/**
|
|
65
63
|
* Converts ASCII representations of copyright, registered, and trademark
|
|
66
64
|
* symbols to proper Unicode characters.
|
|
67
|
-
*
|
|
68
|
-
* Handles:
|
|
69
|
-
* - "(c)" or "(C)" → "©"
|
|
70
|
-
* - "(r)" or "(R)" → "®"
|
|
71
|
-
* - "(tm)" or "(TM)" → "™"
|
|
72
|
-
*
|
|
73
|
-
* @example
|
|
74
|
-
* ```ts
|
|
75
|
-
* legalSymbols("Copyright (c) 2024 Acme Inc.")
|
|
76
|
-
* // → "Copyright © 2024 Acme Inc."
|
|
77
|
-
*
|
|
78
|
-
* legalSymbols("Brand Name(tm)")
|
|
79
|
-
* // → "Brand Name™"
|
|
80
|
-
* ```
|
|
81
65
|
*/
|
|
82
66
|
export declare function legalSymbols(text: string): string;
|
|
83
67
|
/**
|
|
@@ -120,7 +104,7 @@ export declare function arrows(text: string, options?: SymbolOptions): string;
|
|
|
120
104
|
* // → "Water boils at 212 °F"
|
|
121
105
|
* ```
|
|
122
106
|
*/
|
|
123
|
-
export declare function degrees(text: string): string;
|
|
107
|
+
export declare function degrees(text: string, options?: SymbolOptions): string;
|
|
124
108
|
/**
|
|
125
109
|
* Converts straight quotes after numbers to prime marks.
|
|
126
110
|
*
|
|
@@ -159,7 +143,7 @@ export declare function primeMarks(text: string, options?: SymbolOptions): strin
|
|
|
159
143
|
* // → "About ¾ complete"
|
|
160
144
|
* ```
|
|
161
145
|
*/
|
|
162
|
-
export declare function fractions(text: string): string;
|
|
146
|
+
export declare function fractions(text: string, options?: SymbolOptions): string;
|
|
163
147
|
/**
|
|
164
148
|
* Applies all symbol transformations.
|
|
165
149
|
*
|
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;
|
|
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;AA4BD;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAW1E;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;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CASjF"}
|
package/dist/symbols.js
CHANGED
|
@@ -6,30 +6,14 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module symbols
|
|
8
8
|
*/
|
|
9
|
-
|
|
9
|
+
import { UNICODE_SYMBOLS, ESCAPED_DEFAULT_SEPARATOR } from "./constants.js";
|
|
10
10
|
/**
|
|
11
11
|
* Escapes special regex characters in a string.
|
|
12
12
|
*/
|
|
13
13
|
function escapeRegex(str) {
|
|
14
14
|
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
15
15
|
}
|
|
16
|
-
|
|
17
|
-
const ELLIPSIS = "\u2026"; // …
|
|
18
|
-
const MULTIPLICATION = "\u00D7"; // ×
|
|
19
|
-
const NOT_EQUAL = "\u2260"; // ≠
|
|
20
|
-
const PLUS_MINUS = "\u00B1"; // ±
|
|
21
|
-
const COPYRIGHT = "\u00A9"; // ©
|
|
22
|
-
const REGISTERED = "\u00AE"; // ®
|
|
23
|
-
const TRADEMARK = "\u2122"; // ™
|
|
24
|
-
const DEGREE = "\u00B0"; // °
|
|
25
|
-
const ARROW_RIGHT = "\u2192"; // →
|
|
26
|
-
const ARROW_LEFT = "\u2190"; // ←
|
|
27
|
-
const ARROW_LEFT_RIGHT = "\u2194"; // ↔
|
|
28
|
-
const APPROXIMATE = "\u2248"; // ≈
|
|
29
|
-
const LESS_EQUAL = "\u2264"; // ≤
|
|
30
|
-
const GREATER_EQUAL = "\u2265"; // ≥
|
|
31
|
-
const PRIME = "\u2032"; // ′
|
|
32
|
-
const DOUBLE_PRIME = "\u2033"; // ″
|
|
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;
|
|
33
17
|
/**
|
|
34
18
|
* Converts three periods to a proper ellipsis character.
|
|
35
19
|
*
|
|
@@ -40,11 +24,11 @@ const DOUBLE_PRIME = "\u2033"; // ″
|
|
|
40
24
|
* ```
|
|
41
25
|
*/
|
|
42
26
|
export function ellipsis(text, options = {}) {
|
|
43
|
-
const chr =
|
|
44
|
-
|
|
27
|
+
const chr = options.separator
|
|
28
|
+
? escapeRegex(options.separator)
|
|
29
|
+
: ESCAPED_DEFAULT_SEPARATOR;
|
|
45
30
|
const pattern = new RegExp(`\\.${chr}?\\.${chr}?\\.`, "g");
|
|
46
31
|
text = text.replace(pattern, ELLIPSIS);
|
|
47
|
-
// Add space after ellipsis when followed by a word character
|
|
48
32
|
text = text.replace(new RegExp(`${ELLIPSIS}(?=\\w)`, "gu"), `${ELLIPSIS} `);
|
|
49
33
|
return text;
|
|
50
34
|
}
|
|
@@ -66,10 +50,15 @@ export function ellipsis(text, options = {}) {
|
|
|
66
50
|
* ```
|
|
67
51
|
*/
|
|
68
52
|
export function multiplication(text, options = {}) {
|
|
69
|
-
const chr =
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
53
|
+
const chr = options.separator
|
|
54
|
+
? escapeRegex(options.separator)
|
|
55
|
+
: ESCAPED_DEFAULT_SEPARATOR;
|
|
56
|
+
// Dimensions with spaces: preserve spacing
|
|
57
|
+
const loosePattern = new RegExp(`(\\d${chr}?)\\s+[xX*]\\s+(${chr}?\\d)`, "g");
|
|
58
|
+
text = text.replace(loosePattern, `$1 ${MULTIPLICATION} $2`);
|
|
59
|
+
// Dimensions without spaces: keep tight
|
|
60
|
+
const tightPattern = new RegExp(`(\\d${chr}?)[xX*](${chr}?\\d)`, "g");
|
|
61
|
+
text = text.replace(tightPattern, `$1${MULTIPLICATION}$2`);
|
|
73
62
|
// Trailing multiplier: 5x (followed by space or end, not letters or numbers)
|
|
74
63
|
const trailingPattern = new RegExp(`(\\d${chr}?)[xX*](?=${chr}?(?:\\s|$))`, "g");
|
|
75
64
|
text = text.replace(trailingPattern, `$1${MULTIPLICATION}`);
|
|
@@ -78,13 +67,6 @@ export function multiplication(text, options = {}) {
|
|
|
78
67
|
/**
|
|
79
68
|
* Converts ASCII mathematical symbols to proper Unicode equivalents.
|
|
80
69
|
*
|
|
81
|
-
* Handles:
|
|
82
|
-
* - "!=" → "≠"
|
|
83
|
-
* - "+-" or "+/-" → "±"
|
|
84
|
-
* - "<=" → "≤"
|
|
85
|
-
* - ">=" → "≥"
|
|
86
|
-
* - "~=" or "=~" → "≈"
|
|
87
|
-
*
|
|
88
70
|
* @example
|
|
89
71
|
* ```ts
|
|
90
72
|
* mathSymbols("x != y and a <= b")
|
|
@@ -95,46 +77,24 @@ export function multiplication(text, options = {}) {
|
|
|
95
77
|
* ```
|
|
96
78
|
*/
|
|
97
79
|
export function mathSymbols(text) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
text = text.replace(/>=/g, GREATER_EQUAL);
|
|
107
|
-
// Approximately equal
|
|
108
|
-
text = text.replace(/~=/g, APPROXIMATE);
|
|
109
|
-
text = text.replace(/=~/g, APPROXIMATE);
|
|
110
|
-
return text;
|
|
80
|
+
return text
|
|
81
|
+
.replace(/!=/g, NOT_EQUAL)
|
|
82
|
+
.replace(/\+\/-/g, PLUS_MINUS)
|
|
83
|
+
.replace(/\+-/g, PLUS_MINUS)
|
|
84
|
+
.replace(/<=/g, LESS_EQUAL)
|
|
85
|
+
.replace(/>=/g, GREATER_EQUAL)
|
|
86
|
+
.replace(/~=/g, APPROXIMATE)
|
|
87
|
+
.replace(/=~/g, APPROXIMATE);
|
|
111
88
|
}
|
|
112
89
|
/**
|
|
113
90
|
* Converts ASCII representations of copyright, registered, and trademark
|
|
114
91
|
* symbols to proper Unicode characters.
|
|
115
|
-
*
|
|
116
|
-
* Handles:
|
|
117
|
-
* - "(c)" or "(C)" → "©"
|
|
118
|
-
* - "(r)" or "(R)" → "®"
|
|
119
|
-
* - "(tm)" or "(TM)" → "™"
|
|
120
|
-
*
|
|
121
|
-
* @example
|
|
122
|
-
* ```ts
|
|
123
|
-
* legalSymbols("Copyright (c) 2024 Acme Inc.")
|
|
124
|
-
* // → "Copyright © 2024 Acme Inc."
|
|
125
|
-
*
|
|
126
|
-
* legalSymbols("Brand Name(tm)")
|
|
127
|
-
* // → "Brand Name™"
|
|
128
|
-
* ```
|
|
129
92
|
*/
|
|
130
93
|
export function legalSymbols(text) {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
// Trademark
|
|
136
|
-
text = text.replace(/\(tm\)/gi, TRADEMARK);
|
|
137
|
-
return text;
|
|
94
|
+
return text
|
|
95
|
+
.replace(/\(c\)/gi, COPYRIGHT)
|
|
96
|
+
.replace(/\(r\)/gi, REGISTERED)
|
|
97
|
+
.replace(/\(tm\)/gi, TRADEMARK);
|
|
138
98
|
}
|
|
139
99
|
/**
|
|
140
100
|
* Converts arrow character sequences to Unicode arrows.
|
|
@@ -157,12 +117,15 @@ export function legalSymbols(text) {
|
|
|
157
117
|
* ```
|
|
158
118
|
*/
|
|
159
119
|
export function arrows(text, options = {}) {
|
|
160
|
-
const chr =
|
|
120
|
+
const chr = options.separator
|
|
121
|
+
? escapeRegex(options.separator)
|
|
122
|
+
: ESCAPED_DEFAULT_SEPARATOR;
|
|
161
123
|
// Bidirectional arrow first (to avoid partial matches)
|
|
162
|
-
|
|
163
|
-
|
|
124
|
+
// Matches <-> or <--> with optional separator, requires boundary context
|
|
125
|
+
text = text.replace(new RegExp(`(?<=[\\s${chr}]|^)<-{1,2}${chr}?>(?=[\\s${chr}]|$)`, "g"), ARROW_LEFT_RIGHT);
|
|
126
|
+
// Right arrow: -> or --> with boundary context
|
|
164
127
|
text = text.replace(new RegExp(`(?<=[\\s${chr}]|^)-{1,2}>(?=[\\s${chr}]|$)`, "g"), ARROW_RIGHT);
|
|
165
|
-
// Left arrow
|
|
128
|
+
// Left arrow: <- or <-- with boundary context
|
|
166
129
|
text = text.replace(new RegExp(`(?<=[\\s${chr}]|^)<-{1,2}(?=[\\s${chr}]|$)`, "g"), ARROW_LEFT);
|
|
167
130
|
return text;
|
|
168
131
|
}
|
|
@@ -185,12 +148,13 @@ export function arrows(text, options = {}) {
|
|
|
185
148
|
* // → "Water boils at 212 °F"
|
|
186
149
|
* ```
|
|
187
150
|
*/
|
|
188
|
-
export function degrees(text) {
|
|
151
|
+
export function degrees(text, options = {}) {
|
|
152
|
+
const chr = options.separator
|
|
153
|
+
? escapeRegex(options.separator)
|
|
154
|
+
: ESCAPED_DEFAULT_SEPARATOR;
|
|
189
155
|
// Temperature with optional space before C or F
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
});
|
|
193
|
-
return text;
|
|
156
|
+
// Handles separator between digit and unit
|
|
157
|
+
return text.replace(new RegExp(`(\\d${chr}?) ?([CF])\\b`, "gi"), (_, num, unit) => `${num} ${DEGREE}${unit.toUpperCase()}`);
|
|
194
158
|
}
|
|
195
159
|
/**
|
|
196
160
|
* Converts straight quotes after numbers to prime marks.
|
|
@@ -212,17 +176,48 @@ export function degrees(text) {
|
|
|
212
176
|
* ```
|
|
213
177
|
*/
|
|
214
178
|
export function primeMarks(text, options = {}) {
|
|
215
|
-
const chr =
|
|
216
|
-
|
|
217
|
-
|
|
179
|
+
const chr = options.separator
|
|
180
|
+
? escapeRegex(options.separator)
|
|
181
|
+
: ESCAPED_DEFAULT_SEPARATOR;
|
|
182
|
+
// Single prime: Matches digit + optional separator + apostrophe
|
|
183
|
+
// Lookahead ensures it's followed by: another digit, double quote, end of string, or punctuation
|
|
184
|
+
// Examples: 5' (feet), 30' (arcminutes)
|
|
218
185
|
const singlePrimePattern = new RegExp(`(\\d${chr}?)'(?=${chr}?(?:\\d|"|$|[\\s.,;:!?)]))`, "g");
|
|
219
186
|
text = text.replace(singlePrimePattern, `$1${PRIME}`);
|
|
220
|
-
// Double prime
|
|
221
|
-
//
|
|
222
|
-
|
|
223
|
-
|
|
187
|
+
// Double prime Pattern 1: Feet-inches pattern
|
|
188
|
+
// Matches: prime symbol + optional separator + digit + optional separator + double quote
|
|
189
|
+
// Examples: 5′10" or 5'10" → 5′10″
|
|
190
|
+
const feetInchesPattern = new RegExp(`(${PRIME}${chr}?\\d${chr}?)"`, "g");
|
|
191
|
+
text = text.replace(feetInchesPattern, `$1${DOUBLE_PRIME}`);
|
|
192
|
+
// Double prime Pattern 2: Standalone inches
|
|
193
|
+
// Negative lookbehind: ensures no opening quote within 20 chars before the digit
|
|
194
|
+
// Negative lookahead: ensures not followed by word characters
|
|
195
|
+
// Matches: 12" wide ✓, but not: "Term 1" ✗
|
|
196
|
+
const standaloneInchesPattern = new RegExp(`(?<!["\u201C]${chr}?[^"${chr}]{0,20})(\\d${chr}?)"(?!${chr}?[\\w])`, "g");
|
|
197
|
+
text = text.replace(standaloneInchesPattern, `$1${DOUBLE_PRIME}`);
|
|
224
198
|
return text;
|
|
225
199
|
}
|
|
200
|
+
/**
|
|
201
|
+
* Map of ASCII fractions to Unicode fraction characters.
|
|
202
|
+
* Pre-computed to avoid repeated object allocation.
|
|
203
|
+
*/
|
|
204
|
+
const FRACTION_MAP = {
|
|
205
|
+
"1/4": UNICODE_SYMBOLS.FRACTION_1_4,
|
|
206
|
+
"1/2": UNICODE_SYMBOLS.FRACTION_1_2,
|
|
207
|
+
"3/4": UNICODE_SYMBOLS.FRACTION_3_4,
|
|
208
|
+
"1/3": UNICODE_SYMBOLS.FRACTION_1_3,
|
|
209
|
+
"2/3": UNICODE_SYMBOLS.FRACTION_2_3,
|
|
210
|
+
"1/5": UNICODE_SYMBOLS.FRACTION_1_5,
|
|
211
|
+
"2/5": UNICODE_SYMBOLS.FRACTION_2_5,
|
|
212
|
+
"3/5": UNICODE_SYMBOLS.FRACTION_3_5,
|
|
213
|
+
"4/5": UNICODE_SYMBOLS.FRACTION_4_5,
|
|
214
|
+
"1/6": UNICODE_SYMBOLS.FRACTION_1_6,
|
|
215
|
+
"5/6": UNICODE_SYMBOLS.FRACTION_5_6,
|
|
216
|
+
"1/8": UNICODE_SYMBOLS.FRACTION_1_8,
|
|
217
|
+
"3/8": UNICODE_SYMBOLS.FRACTION_3_8,
|
|
218
|
+
"5/8": UNICODE_SYMBOLS.FRACTION_5_8,
|
|
219
|
+
"7/8": UNICODE_SYMBOLS.FRACTION_7_8,
|
|
220
|
+
};
|
|
226
221
|
/**
|
|
227
222
|
* Converts common fractions to Unicode fraction characters.
|
|
228
223
|
*
|
|
@@ -241,28 +236,17 @@ export function primeMarks(text, options = {}) {
|
|
|
241
236
|
* // → "About ¾ complete"
|
|
242
237
|
* ```
|
|
243
238
|
*/
|
|
244
|
-
export function fractions(text) {
|
|
245
|
-
const
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
"1/6": "\u2159", // ⅙
|
|
256
|
-
"5/6": "\u215A", // ⅚
|
|
257
|
-
"1/8": "\u215B", // ⅛
|
|
258
|
-
"3/8": "\u215C", // ⅜
|
|
259
|
-
"5/8": "\u215D", // ⅝
|
|
260
|
-
"7/8": "\u215E", // ⅞
|
|
261
|
-
};
|
|
262
|
-
for (const [ascii, unicode] of Object.entries(fractionMap)) {
|
|
263
|
-
// Match fraction at word boundaries, not inside numbers like "21/4"
|
|
264
|
-
const pattern = new RegExp(`(?<!\\d)${ascii.replace("/", "\\/")}(?!\\d)`, "g");
|
|
265
|
-
text = text.replace(pattern, unicode);
|
|
239
|
+
export function fractions(text, options = {}) {
|
|
240
|
+
const chr = options.separator
|
|
241
|
+
? escapeRegex(options.separator)
|
|
242
|
+
: ESCAPED_DEFAULT_SEPARATOR;
|
|
243
|
+
for (const [ascii, unicode] of Object.entries(FRACTION_MAP)) {
|
|
244
|
+
// Negative lookbehind/lookahead: ensures fraction is not part of a larger number
|
|
245
|
+
// Named captures preserve separators before and after the slash
|
|
246
|
+
const [numerator, denominator] = ascii.split("/");
|
|
247
|
+
const pattern = new RegExp(`(?<!\\d)${numerator}(?<sepBefore>${chr}?)/(?<sepAfter>${chr}?)${denominator}(?!\\d)`, "g");
|
|
248
|
+
// Preserve separators around the fraction Unicode character
|
|
249
|
+
text = text.replace(pattern, `$<sepBefore>${unicode}$<sepAfter>`);
|
|
266
250
|
}
|
|
267
251
|
return text;
|
|
268
252
|
}
|
|
@@ -290,7 +274,9 @@ export function symbolTransform(text, options = {}) {
|
|
|
290
274
|
text = multiplication(text, options);
|
|
291
275
|
text = mathSymbols(text);
|
|
292
276
|
text = legalSymbols(text);
|
|
293
|
-
|
|
277
|
+
if (options.includeArrows !== false) {
|
|
278
|
+
text = arrows(text, options);
|
|
279
|
+
}
|
|
294
280
|
return text;
|
|
295
281
|
}
|
|
296
282
|
//# sourceMappingURL=symbols.js.map
|
package/dist/symbols.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"symbols.js","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"symbols.js","sourceRoot":"","sources":["../src/symbols.ts"],"names":[],"mappings":"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"}
|