punctilio 5.0.9 → 5.0.10

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 CHANGED
@@ -230,7 +230,7 @@ A `.pre-commit-hooks.yaml` ships in the package, so [pre-commit](https://pre-com
230
230
  # .pre-commit-config.yaml
231
231
  repos:
232
232
  - repo: https://github.com/alexander-turner/punctilio
233
- rev: v5.0.8
233
+ rev: v5.0.9
234
234
  hooks:
235
235
  - id: punctilio # rewrites *.md / *.html in place
236
236
  - id: punctilio-check # or: fail without writing (CI-friendly)
@@ -1 +1 @@
1
- {"version":3,"file":"nbsp.d.ts","sourceRoot":"","sources":["../src/nbsp.ts"],"names":[],"mappings":"AACA,OAAO,EAAoE,KAAK,SAAS,EAAoB,MAAM,iBAAiB,CAAA;AAiBpI,wEAAwE;AACxE,eAAO,MAAM,KAAK,EAAE,SAAS,MAAM,EAqClC,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAcvC,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EASpD,CAAA;AAoCD,eAAO,MAAM,mBAAmB,qCAA6C,CAAA;AAoC7E,eAAO,MAAM,wBAAwB,qCAAkD,CAAA;AAwDvF,eAAO,MAAM,kBAAkB,qCAA4C,CAAA;AA6G3E,eAAO,MAAM,+BAA+B,qCAAyD,CAAA;AAErG,eAAO,MAAM,uBAAuB,qCAAiD,CAAA;AAErF,eAAO,MAAM,mBAAmB,qCAA6C,CAAA;AAE7E,eAAO,MAAM,yBAAyB,qCAAmD,CAAA;AAEzF,eAAO,MAAM,mBAAmB,qCAA6C,CAAA;AAc7E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;AACpD,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA"}
1
+ {"version":3,"file":"nbsp.d.ts","sourceRoot":"","sources":["../src/nbsp.ts"],"names":[],"mappings":"AACA,OAAO,EAAoE,KAAK,SAAS,EAAoB,MAAM,iBAAiB,CAAA;AAiBpI,wEAAwE;AACxE,eAAO,MAAM,KAAK,EAAE,SAAS,MAAM,EAqClC,CAAA;AAED,eAAO,MAAM,UAAU,EAAE,SAAS,MAAM,EAcvC,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,SAAS,MAAM,EASpD,CAAA;AAoCD,eAAO,MAAM,mBAAmB,qCAA6C,CAAA;AAoC7E,eAAO,MAAM,wBAAwB,qCAAkD,CAAA;AAgFvF,eAAO,MAAM,kBAAkB,qCAA4C,CAAA;AAkH3E,eAAO,MAAM,+BAA+B,qCAAyD,CAAA;AAErG,eAAO,MAAM,uBAAuB,qCAAiD,CAAA;AAErF,eAAO,MAAM,mBAAmB,qCAA6C,CAAA;AAE7E,eAAO,MAAM,yBAAyB,qCAAmD,CAAA;AAEzF,eAAO,MAAM,mBAAmB,qCAA6C,CAAA;AAc7E,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;AACpD,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAA"}
package/dist/nbsp.js CHANGED
@@ -150,15 +150,15 @@ function nbspBetweenNumberAndUnitOverView(view) {
150
150
  view.commit();
151
151
  }
152
152
  const MAX_LAST_WORD_LENGTH = 10;
153
- // Bounded so the lookbehind stays ReDoS-safe.
153
+ // Bounds the backward second-to-last-word scan so it stays linear.
154
154
  const MAX_MIDDLE_WORD_LENGTH = 15;
155
155
  /**
156
- * The cascade lookbehind `(?<![NBSP][LATIN]{1,15})` over clean text: blocks
157
- * when an NBSP/NNBSP is followed by 1..15 Latin letters ending at the space. A
158
- * node boundary anywhere in that backward run breaks the run, re-enabling the
159
- * match.
156
+ * Walks back over the second-to-last word to the NBSP gluing it to the word
157
+ * before it; returns that NBSP's index, or -1 when the word isn't glued
158
+ * backwards (so the last word is free to bind). A node boundary anywhere in the
159
+ * backward run breaks the run. Bounded so the scan stays ReDoS-safe.
160
160
  */
161
- function cascadeBlocksLastWord(view, spaceOffset) {
161
+ function precedingGlueNbsp(view, spaceOffset) {
162
162
  const text = view.text;
163
163
  let j = spaceOffset - 1;
164
164
  let run = 0;
@@ -167,14 +167,38 @@ function cascadeBlocksLastWord(view, spaceOffset) {
167
167
  run++;
168
168
  }
169
169
  if (run === 0 || view.hasBoundary(j + 1))
170
+ return -1;
171
+ return j >= 0 && NBSP_CHARS.includes(text[j]) ? j : -1;
172
+ }
173
+ /**
174
+ * True when the word immediately before the NBSP at `nbspIndex` is a 1–2 letter
175
+ * Latin word whose own left edge is a word boundary — an aesthetic short-word
176
+ * glue that yields to last-word protection. Semantic glues (honorific `Dr.`,
177
+ * abbreviation, unit `12`) carry a "."/digit/symbol right before the NBSP, so
178
+ * the backward letter scan finds zero letters and returns false. The scan is
179
+ * capped at three letters so it stays bounded on a long preceding word.
180
+ */
181
+ function isShortWordGlue(view, nbspIndex) {
182
+ const text = view.text;
183
+ let k = nbspIndex - 1;
184
+ let letters = 0;
185
+ while (k >= 0 && letters <= 2 && !view.hasBoundary(k + 1) && LATIN_LETTER_RE.test(text[k])) {
186
+ k--;
187
+ letters++;
188
+ }
189
+ if (letters === 0 || letters > 2 || view.hasBoundary(k + 1))
170
190
  return false;
171
- return j >= 0 && NBSP_CHARS.includes(text[j]);
191
+ // The short word's left edge must be a real word boundary, matching
192
+ // nbspAfterShortWords' lookbehind — not another NBSP.
193
+ return !(k >= 0 && NBSP_CHARS.includes(text[k]));
172
194
  }
173
- // Skips when the second-to-last word is already glued backwards via NBSP.
195
+ // When the second-to-last word is already glued backwards, an aesthetic
196
+ // short-word glue yields (reverts to a space) so the last word binds instead,
197
+ // keeping the non-breaking run to two words; a semantic glue there blocks.
174
198
  export const nbspBeforeLastWord = makeProsePass(nbspBeforeLastWordOverView);
175
199
  function nbspBeforeLastWordOverView(view) {
176
- // The `(?<=\w|boundary)` lookbehind and the `[NBSP][LATIN]{1,15}` cascade
177
- // lookbehind are enforced in the replacer, where boundaries are visible.
200
+ // The `(?<=\w|boundary)` lookbehind and the preceding-glue resolution are
201
+ // enforced in the replacer, where boundaries are visible.
178
202
  const pattern = cachedRegExp(`${SPACE}(?<lastWord>(?:(?!\\s).){1,${MAX_LAST_WORD_LENGTH}})(?<ending>\\n\\n|$)`, "g");
179
203
  {
180
204
  const clean = view.text;
@@ -185,8 +209,13 @@ function nbspBeforeLastWordOverView(view) {
185
209
  const precededByWord = start > 0 && /\w/.test(clean[start - 1]);
186
210
  if (!precededByWord && !view.hasBoundary(start))
187
211
  return null;
188
- if (cascadeBlocksLastWord(v, start))
189
- return null;
212
+ const glueNbsp = precedingGlueNbsp(v, start);
213
+ if (glueNbsp >= 0) {
214
+ if (!isShortWordGlue(v, glueNbsp))
215
+ return null;
216
+ // Revert the short word's glue so the last word binds in its place.
217
+ v.replace(glueNbsp, glueNbsp + 1, " ");
218
+ }
190
219
  // The `ending` group tolerates exactly one boundary at the slot before
191
220
  // `\n\n`/end-of-text; two adjacent boundaries block the match. The
192
221
  // end-of-text slot sits at the match end (never an interior boundary),
package/dist/nbsp.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"nbsp.js","sourceRoot":"","sources":["../src/nbsp.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"nbsp.js","sourceRoot":"","sources":["../src/nbsp.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "punctilio",
3
- "version": "5.0.9",
3
+ "version": "5.0.10",
4
4
  "description": "Smart typography transformations: curly quotes, em-dashes, en-dashes, and more",
5
5
  "type": "module",
6
6
  "sideEffects": false,
package/src/nbsp.ts CHANGED
@@ -187,16 +187,16 @@ function nbspBetweenNumberAndUnitOverView(view: ProseView): void {
187
187
 
188
188
  const MAX_LAST_WORD_LENGTH = 10
189
189
 
190
- // Bounded so the lookbehind stays ReDoS-safe.
190
+ // Bounds the backward second-to-last-word scan so it stays linear.
191
191
  const MAX_MIDDLE_WORD_LENGTH = 15
192
192
 
193
193
  /**
194
- * The cascade lookbehind `(?<![NBSP][LATIN]{1,15})` over clean text: blocks
195
- * when an NBSP/NNBSP is followed by 1..15 Latin letters ending at the space. A
196
- * node boundary anywhere in that backward run breaks the run, re-enabling the
197
- * match.
194
+ * Walks back over the second-to-last word to the NBSP gluing it to the word
195
+ * before it; returns that NBSP's index, or -1 when the word isn't glued
196
+ * backwards (so the last word is free to bind). A node boundary anywhere in the
197
+ * backward run breaks the run. Bounded so the scan stays ReDoS-safe.
198
198
  */
199
- function cascadeBlocksLastWord(view: ProseView, spaceOffset: number): boolean {
199
+ function precedingGlueNbsp(view: ProseView, spaceOffset: number): number {
200
200
  const text = view.text
201
201
  let j = spaceOffset - 1
202
202
  let run = 0
@@ -204,16 +204,40 @@ function cascadeBlocksLastWord(view: ProseView, spaceOffset: number): boolean {
204
204
  j--
205
205
  run++
206
206
  }
207
- if (run === 0 || view.hasBoundary(j + 1)) return false
208
- return j >= 0 && NBSP_CHARS.includes(text[j])
207
+ if (run === 0 || view.hasBoundary(j + 1)) return -1
208
+ return j >= 0 && NBSP_CHARS.includes(text[j]) ? j : -1
209
209
  }
210
210
 
211
- // Skips when the second-to-last word is already glued backwards via NBSP.
211
+ /**
212
+ * True when the word immediately before the NBSP at `nbspIndex` is a 1–2 letter
213
+ * Latin word whose own left edge is a word boundary — an aesthetic short-word
214
+ * glue that yields to last-word protection. Semantic glues (honorific `Dr.`,
215
+ * abbreviation, unit `12`) carry a "."/digit/symbol right before the NBSP, so
216
+ * the backward letter scan finds zero letters and returns false. The scan is
217
+ * capped at three letters so it stays bounded on a long preceding word.
218
+ */
219
+ function isShortWordGlue(view: ProseView, nbspIndex: number): boolean {
220
+ const text = view.text
221
+ let k = nbspIndex - 1
222
+ let letters = 0
223
+ while (k >= 0 && letters <= 2 && !view.hasBoundary(k + 1) && LATIN_LETTER_RE.test(text[k])) {
224
+ k--
225
+ letters++
226
+ }
227
+ if (letters === 0 || letters > 2 || view.hasBoundary(k + 1)) return false
228
+ // The short word's left edge must be a real word boundary, matching
229
+ // nbspAfterShortWords' lookbehind — not another NBSP.
230
+ return !(k >= 0 && NBSP_CHARS.includes(text[k]))
231
+ }
232
+
233
+ // When the second-to-last word is already glued backwards, an aesthetic
234
+ // short-word glue yields (reverts to a space) so the last word binds instead,
235
+ // keeping the non-breaking run to two words; a semantic glue there blocks.
212
236
  export const nbspBeforeLastWord = makeProsePass(nbspBeforeLastWordOverView)
213
237
 
214
238
  function nbspBeforeLastWordOverView(view: ProseView): void {
215
- // The `(?<=\w|boundary)` lookbehind and the `[NBSP][LATIN]{1,15}` cascade
216
- // lookbehind are enforced in the replacer, where boundaries are visible.
239
+ // The `(?<=\w|boundary)` lookbehind and the preceding-glue resolution are
240
+ // enforced in the replacer, where boundaries are visible.
217
241
  const pattern = cachedRegExp(
218
242
  `${SPACE}(?<lastWord>(?:(?!\\s).){1,${MAX_LAST_WORD_LENGTH}})(?<ending>\\n\\n|$)`,
219
243
  "g"
@@ -229,7 +253,12 @@ function nbspBeforeLastWordOverView(view: ProseView): void {
229
253
  // `(?<=\w|sep)`: a word char before the space, or a boundary there.
230
254
  const precededByWord = start > 0 && /\w/.test(clean[start - 1])
231
255
  if (!precededByWord && !view.hasBoundary(start)) return null
232
- if (cascadeBlocksLastWord(v, start)) return null
256
+ const glueNbsp = precedingGlueNbsp(v, start)
257
+ if (glueNbsp >= 0) {
258
+ if (!isShortWordGlue(v, glueNbsp)) return null
259
+ // Revert the short word's glue so the last word binds in its place.
260
+ v.replace(glueNbsp, glueNbsp + 1, " ")
261
+ }
233
262
  // The `ending` group tolerates exactly one boundary at the slot before
234
263
  // `\n\n`/end-of-text; two adjacent boundaries block the match. The
235
264
  // end-of-text slot sits at the match end (never an interior boundary),