punctilio 4.1.5 → 4.3.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/dist/symbols.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { cachedRegExp, DEFAULT_SEPARATOR, getEscapedSeparator, LATIN_LETTERS, SPACE_CHARS, UNICODE_SYMBOLS, wordBoundaryEnd } from "./constants.js";
2
- import { namedGroups, replaceCallbackContext } from "./utils.js";
2
+ import { convertPrimeMarks } from "./quote-classifier.js";
3
+ import { namedGroups } from "./utils.js";
3
4
  const { ELLIPSIS, MULTIPLICATION, NOT_EQUAL, PLUS_MINUS, COPYRIGHT, REGISTERED, TRADEMARK, DEGREE, ARROW_RIGHT, ARROW_LEFT, ARROW_LEFT_RIGHT, APPROXIMATE, LESS_EQUAL, GREATER_EQUAL, NBSP, PRIME, DOUBLE_PRIME, SUPERSCRIPT_ST, SUPERSCRIPT_ND, SUPERSCRIPT_RD, SUPERSCRIPT_TH, DOUBLE_QUESTION, QUESTION_EXCLAMATION, EXCLAMATION_QUESTION, } = UNICODE_SYMBOLS;
4
5
  /** Convert "..." or ". . ." to "…". */
5
6
  export function ellipsis(text, options = {}) {
@@ -171,85 +172,9 @@ export function degrees(text, options = {}) {
171
172
  const notCompound = `(?!-[${LATIN_LETTERS}]|[+#])`;
172
173
  return text.replace(cachedRegExp(`(?<num>\\d${chr}?) ?(?<unit>[CF])${notCompound}${wbe}`, "g"), (_, num, unit) => `${num} ${DEGREE}${unit}`);
173
174
  }
174
- /**
175
- * Matches quote characters in priority order:
176
- * 1. Prime candidate: digit + quote + non-letter (e.g., 5', 12")
177
- * 2. Contraction: letter + quote + letter (e.g., it's, don't, O'Brien)
178
- * 3. Trailing apostrophe: letter + quote + non-letter (e.g., dogs')
179
- * 4. Bare quote: anything else (typically preceded by space/start)
180
- */
181
- function buildQuoteClassificationPattern(escapedQuote, escapedSeparator) {
182
- const primeCandidate = `(?<digit>\\d)(?<sep>${escapedSeparator}?)${escapedQuote}(?<afterSep>${escapedSeparator}?)(?![${LATIN_LETTERS}])`;
183
- const contraction = `(?<=[${LATIN_LETTERS}]${escapedSeparator}?)(?<contraction>${escapedQuote})(?=${escapedSeparator}?[${LATIN_LETTERS}])`;
184
- const trailingApostrophe = `(?<=[${LATIN_LETTERS}]${escapedSeparator}?)(?<trailing>${escapedQuote})`;
185
- const bareQuote = escapedQuote;
186
- return cachedRegExp(`${primeCandidate}|${contraction}|${trailingApostrophe}|${bareQuote}`, "g");
187
- }
188
- // Converts prime candidates while tracking quote balance. A prime after a
189
- // digit converts only when no unmatched opener precedes it. Inside balanced
190
- // quotes, a ′+digits context (feet-inches like 5′10") still converts.
191
- function balancedPrimeReplacer(primeChar, escapedSeparator) {
192
- // Pre-compile the feet-inches context pattern for the double-prime pass.
193
- // Matches when the text before a prime candidate ends with ′ followed by
194
- // any mix of digits and separators (e.g., "5′1" before the "0" in 5′10").
195
- const feetInchesContext = primeChar === DOUBLE_PRIME
196
- ? cachedRegExp(`${PRIME}(?:${escapedSeparator}|\\d)*$`, "")
197
- : null;
198
- let balance = 0;
199
- // Replace callback: (match, ...captures, offset, fullString, namedGroups)
200
- return (...args) => {
201
- const fullMatch = args[0];
202
- const groups = namedGroups(args);
203
- // Contraction (letter + quote + letter): skip entirely
204
- if (groups.contraction !== undefined) {
205
- return fullMatch;
206
- }
207
- // Trailing apostrophe (letter + quote + non-letter): close if opener exists, else skip
208
- if (groups.trailing !== undefined) {
209
- if (balance > 0)
210
- balance--;
211
- return fullMatch;
212
- }
213
- const { digit, sep, afterSep } = groups;
214
- if (digit !== undefined) {
215
- // Prime candidate: convert only if no unmatched opening quote
216
- if (balance <= 0) {
217
- return `${digit}${sep}${primeChar}${afterSep}`;
218
- }
219
- // Inside balanced quotes: check if this is feet-inches notation
220
- // (e.g., 5′10" where ″ is inches, not a closing quote)
221
- if (feetInchesContext) {
222
- const { offset: matchOffset, input: fullString } = replaceCallbackContext(args);
223
- if (feetInchesContext.test(fullString.substring(0, matchOffset))) {
224
- return `${digit}${sep}${primeChar}${afterSep}`;
225
- }
226
- }
227
- balance--;
228
- return fullMatch;
229
- }
230
- // Bare quote (preceded by space/start): opener or closer
231
- if (balance <= 0) {
232
- balance = 1;
233
- }
234
- else {
235
- balance--;
236
- }
237
- return fullMatch;
238
- };
239
- }
240
175
  /** Convert 5'10" to 5′10″ (prime marks). Call before smart quotes. */
241
176
  export function primeMarks(text, options = {}) {
242
- const escapedSeparator = getEscapedSeparator(options);
243
- const quotePrimePairs = [
244
- ["'", PRIME],
245
- ['"', DOUBLE_PRIME],
246
- ];
247
- for (const [quote, primeChar] of quotePrimePairs) {
248
- // ' and " are not regex-special, so they can be used directly as patterns
249
- const pattern = buildQuoteClassificationPattern(quote, escapedSeparator);
250
- text = text.replace(pattern, balancedPrimeReplacer(primeChar, escapedSeparator));
251
- }
252
- return text;
177
+ return convertPrimeMarks(text, options.separator ?? DEFAULT_SEPARATOR);
253
178
  }
254
179
  const FRACTION_TUPLES = [
255
180
  ["1", "4", UNICODE_SYMBOLS.FRACTION_1_4],
@@ -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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "punctilio",
3
- "version": "4.1.5",
3
+ "version": "4.3.0",
4
4
  "description": "Smart typography transformations: curly quotes, em-dashes, en-dashes, and more",
5
5
  "type": "module",
6
6
  "sideEffects": false,
package/src/index.ts CHANGED
@@ -27,6 +27,14 @@ export {
27
27
  REFERENCE_ABBREVIATIONS,
28
28
  UNITS,
29
29
  } from "./nbsp.js"
30
+ export {
31
+ buildProseView,
32
+ type ProseNode,
33
+ type ProseView,
34
+ replaceAllInView,
35
+ type ReplaceAllOptions,
36
+ runLegacyPass,
37
+ } from "./prose-view.js"
30
38
  export { classifyApostrophes, niceQuotes, PUNCTUATION_STYLES, type PunctuationStyle, type QuoteOptions } from "./quotes.js"
31
39
 
32
40
  export interface TransformOptions {
@@ -0,0 +1,295 @@
1
+ import { DEFAULT_SEPARATOR } from "./constants.js"
2
+ import { transformTextNodes } from "./utils.js"
3
+
4
+ export interface ProseNode {
5
+ value: string
6
+ }
7
+
8
+ export interface ProseView {
9
+ /** Concatenation of the nodes' values. No markers, ever. */
10
+ readonly text: string
11
+ /** Offsets in `text` where one source node ends and the next begins (interior boundaries only; length = nodes.length - 1; may contain duplicates when nodes are empty). */
12
+ readonly boundaries: readonly number[]
13
+ /** True iff a node edge falls at exactly this offset. O(log n) binary search. */
14
+ hasBoundary(offset: number): boolean
15
+ /** Queue an edit replacing [start, end) with `text`. Edits must not overlap; enforced at commit. */
16
+ replace(start: number, end: number, text: string, opts?: { bind?: "left" | "right" }): void
17
+ /** Apply queued edits back onto the source nodes (mutating their `value`s), then recompute `text`/`boundaries`. The view supports arbitrarily many queue/commit cycles. */
18
+ commit(): void
19
+ }
20
+
21
+ interface QueuedEdit {
22
+ start: number
23
+ end: number
24
+ text: string
25
+ bind: "left" | "right"
26
+ }
27
+
28
+ /** True iff the offset falls between a high surrogate and its low surrogate. */
29
+ function splitsSurrogatePair(text: string, offset: number): boolean {
30
+ if (offset <= 0 || offset >= text.length) return false
31
+ const high = text.charCodeAt(offset - 1)
32
+ const low = text.charCodeAt(offset)
33
+ return high >= 0xd800 && high <= 0xdbff && low >= 0xdc00 && low <= 0xdfff
34
+ }
35
+
36
+ class ProseViewImpl implements ProseView {
37
+ private readonly nodes: ProseNode[]
38
+ private cachedText: string
39
+ private cachedBoundaries: number[]
40
+ private edits: QueuedEdit[] = []
41
+
42
+ constructor(nodes: ProseNode[]) {
43
+ this.nodes = nodes
44
+ this.cachedText = ""
45
+ this.cachedBoundaries = []
46
+ this.refresh()
47
+ }
48
+
49
+ get text(): string {
50
+ return this.cachedText
51
+ }
52
+
53
+ get boundaries(): readonly number[] {
54
+ return this.cachedBoundaries
55
+ }
56
+
57
+ /** Recompute `text` and `boundaries` from the current node values. @internal */
58
+ refresh(): void {
59
+ let text = ""
60
+ const boundaries: number[] = []
61
+ this.nodes.forEach((node, index) => {
62
+ text += node.value
63
+ if (index < this.nodes.length - 1) {
64
+ boundaries.push(text.length)
65
+ }
66
+ })
67
+ this.cachedText = text
68
+ this.cachedBoundaries = boundaries
69
+ }
70
+
71
+ /** @internal */
72
+ hasQueuedEdits(): boolean {
73
+ return this.edits.length > 0
74
+ }
75
+
76
+ /** @internal */
77
+ getNodes(): ProseNode[] {
78
+ return this.nodes
79
+ }
80
+
81
+ hasBoundary(offset: number): boolean {
82
+ const boundaries = this.cachedBoundaries
83
+ let low = 0
84
+ let high = boundaries.length - 1
85
+ while (low <= high) {
86
+ const mid = (low + high) >>> 1
87
+ const value = boundaries[mid]
88
+ if (value === offset) return true
89
+ if (value < offset) {
90
+ low = mid + 1
91
+ } else {
92
+ high = mid - 1
93
+ }
94
+ }
95
+ return false
96
+ }
97
+
98
+ replace(start: number, end: number, text: string, opts?: { bind?: "left" | "right" }): void {
99
+ if (!Number.isInteger(start) || !Number.isInteger(end)) {
100
+ throw new Error(`replace() offsets must be integers, got start=${start}, end=${end}.`)
101
+ }
102
+ if (start < 0 || start > end || end > this.cachedText.length) {
103
+ throw new Error(
104
+ `replace() requires 0 <= start <= end <= text.length (${this.cachedText.length}), ` +
105
+ `got start=${start}, end=${end}.`
106
+ )
107
+ }
108
+ if (splitsSurrogatePair(this.cachedText, start)) {
109
+ throw new Error(`replace() start=${start} splits a UTF-16 surrogate pair.`)
110
+ }
111
+ if (splitsSurrogatePair(this.cachedText, end)) {
112
+ throw new Error(`replace() end=${end} splits a UTF-16 surrogate pair.`)
113
+ }
114
+ this.edits.push({ start, end, text, bind: opts?.bind ?? "left" })
115
+ }
116
+
117
+ /**
118
+ * Apply queued edits to the source nodes. Edits are ordered by start offset,
119
+ * tie-breaking shorter spans first so a zero-length edit sorts before a
120
+ * spanning edit at the same start. A pure insertion may therefore coexist
121
+ * with a replacement starting at the same offset: the insertion's text lands
122
+ * before the replaced span's text. Overlapping spans (and two pure
123
+ * insertions at the same offset) are rejected.
124
+ *
125
+ * All edits are distributed in a single left-to-right pass that rebuilds
126
+ * each node's value once — per-edit string surgery would be quadratic on
127
+ * edit-dense input.
128
+ */
129
+ commit(): void {
130
+ if (this.edits.length === 0) {
131
+ return
132
+ }
133
+
134
+ const sorted = [...this.edits].sort(
135
+ (a, b) => a.start - b.start || (a.end - a.start) - (b.end - b.start)
136
+ )
137
+ for (let i = 1; i < sorted.length; i++) {
138
+ const prev = sorted[i - 1]
139
+ const curr = sorted[i]
140
+ if (prev.end > curr.start) {
141
+ throw new Error(
142
+ `Overlapping edits: [${prev.start}, ${prev.end}) and [${curr.start}, ${curr.end}).`
143
+ )
144
+ }
145
+ if (prev.end === curr.start && prev.start === prev.end && curr.start === curr.end) {
146
+ throw new Error(
147
+ `Two pure insertions at the same offset ${curr.start} are ambiguous; combine them.`
148
+ )
149
+ }
150
+ }
151
+
152
+ // Node spans in `text` via cumulative lengths.
153
+ const starts: number[] = []
154
+ const ends: number[] = []
155
+ let cursor = 0
156
+ for (const node of this.nodes) {
157
+ starts.push(cursor)
158
+ cursor += node.value.length
159
+ ends.push(cursor)
160
+ }
161
+
162
+ const text = this.cachedText
163
+ const parts: string[][] = this.nodes.map(() => [])
164
+
165
+ // Rolling copy state: kept text in [0, copiedUpTo) has been distributed.
166
+ let copiedUpTo = 0
167
+ let copyNode = 0
168
+ const copyUpTo = (target: number): void => {
169
+ while (copiedUpTo < target) {
170
+ while (copyNode < this.nodes.length - 1 && ends[copyNode] <= copiedUpTo) copyNode++
171
+ const sliceEnd = Math.min(target, ends[copyNode])
172
+ parts[copyNode].push(text.slice(copiedUpTo, sliceEnd))
173
+ copiedUpTo = sliceEnd
174
+ }
175
+ }
176
+
177
+ for (const edit of sorted) {
178
+ copyUpTo(edit.start)
179
+ // Deleted spans are simply never copied; replacement/insertion text
180
+ // lands in the target node, whose parts are filled exactly up to
181
+ // `edit.start` at this point.
182
+ if (edit.text.length > 0) {
183
+ const targetIndex = edit.end > edit.start
184
+ ? this.nodeContainingChar(edit.start, ends)
185
+ : this.targetNodeForInsertion(edit, ends)
186
+ parts[targetIndex].push(edit.text)
187
+ }
188
+ if (edit.end > copiedUpTo) copiedUpTo = edit.end
189
+ }
190
+ copyUpTo(text.length)
191
+
192
+ this.nodes.forEach((node, index) => {
193
+ node.value = parts[index].join("")
194
+ })
195
+
196
+ this.edits = []
197
+ this.refresh()
198
+ }
199
+
200
+ /**
201
+ * Index of the node whose span contains the character at `offset`: the
202
+ * first node whose end lies past the offset (binary search; empty nodes at
203
+ * the offset are skipped, matching a first-containing-span linear scan).
204
+ */
205
+ private nodeContainingChar(offset: number, ends: number[]): number {
206
+ let low = 0
207
+ let high = ends.length - 1
208
+ while (low < high) {
209
+ const mid = (low + high) >>> 1
210
+ if (ends[mid] <= offset) {
211
+ low = mid + 1
212
+ } else {
213
+ high = mid
214
+ }
215
+ }
216
+ return low
217
+ }
218
+
219
+ private targetNodeForInsertion(edit: QueuedEdit, ends: number[]): number {
220
+ if (edit.bind === "left") {
221
+ if (edit.start === 0) return 0
222
+ return this.nodeContainingChar(edit.start - 1, ends)
223
+ }
224
+ if (edit.start === this.cachedText.length) return this.nodes.length - 1
225
+ return this.nodeContainingChar(edit.start, ends)
226
+ }
227
+ }
228
+
229
+ export function buildProseView(nodes: ProseNode[]): ProseView {
230
+ return new ProseViewImpl(nodes)
231
+ }
232
+
233
+ export interface ReplaceAllOptions {
234
+ /** Opt-in: allow a match that contains an interior node boundary. Default: such matches are skipped. */
235
+ allowBoundaries?: (match: RegExpExecArray, view: ProseView) => boolean
236
+ /** For pure-insertion edits produced by the replacer (rare), bind side. */
237
+ bind?: "left" | "right"
238
+ }
239
+
240
+ /** True iff some interior boundary falls strictly inside the match span. */
241
+ function matchContainsBoundary(match: RegExpExecArray, view: ProseView): boolean {
242
+ const matchStart = match.index
243
+ const matchEnd = match.index + match[0].length
244
+ for (const boundary of view.boundaries) {
245
+ if (boundary > matchStart && boundary < matchEnd) return true
246
+ }
247
+ return false
248
+ }
249
+
250
+ export function replaceAllInView(
251
+ view: ProseView,
252
+ regex: RegExp,
253
+ replacer: (match: RegExpExecArray, view: ProseView) => string | null,
254
+ options?: ReplaceAllOptions,
255
+ ): void {
256
+ if (!regex.global) {
257
+ throw new Error("replaceAllInView() requires a regex with the global (g) flag.")
258
+ }
259
+
260
+ const allowBoundaries = options?.allowBoundaries
261
+ const bind = options?.bind
262
+ const text = view.text
263
+ regex.lastIndex = 0
264
+
265
+ let match: RegExpExecArray | null
266
+ while ((match = regex.exec(text)) !== null) {
267
+ if (match[0].length === 0) {
268
+ regex.lastIndex += 1
269
+ }
270
+
271
+ if (matchContainsBoundary(match, view) && !allowBoundaries?.(match, view)) {
272
+ continue
273
+ }
274
+
275
+ const replacement = replacer(match, view)
276
+ if (replacement === null) {
277
+ continue
278
+ }
279
+
280
+ view.replace(match.index, match.index + match[0].length, replacement, bind ? { bind } : undefined)
281
+ }
282
+ }
283
+
284
+ export function runLegacyPass(
285
+ view: ProseView,
286
+ passFn: (markedText: string) => string,
287
+ separator: string = DEFAULT_SEPARATOR,
288
+ ): void {
289
+ const impl = view as ProseViewImpl
290
+ if (impl.hasQueuedEdits()) {
291
+ throw new Error("runLegacyPass() cannot run while the view has uncommitted queued edits.")
292
+ }
293
+ transformTextNodes(impl.getNodes(), passFn, separator)
294
+ impl.refresh()
295
+ }