@roughen/core 0.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.
Files changed (82) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +17 -0
  3. package/dist/baselines.d.ts +55 -0
  4. package/dist/baselines.js +42 -0
  5. package/dist/baselines.js.map +1 -0
  6. package/dist/brief.d.ts +45 -0
  7. package/dist/brief.js +110 -0
  8. package/dist/brief.js.map +1 -0
  9. package/dist/document.d.ts +5 -0
  10. package/dist/document.js +531 -0
  11. package/dist/document.js.map +1 -0
  12. package/dist/editorial.d.ts +53 -0
  13. package/dist/editorial.js +252 -0
  14. package/dist/editorial.js.map +1 -0
  15. package/dist/fixes.d.ts +8 -0
  16. package/dist/fixes.js +53 -0
  17. package/dist/fixes.js.map +1 -0
  18. package/dist/index.d.ts +73 -0
  19. package/dist/index.js +232 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/markdown-links.d.ts +12 -0
  22. package/dist/markdown-links.js +130 -0
  23. package/dist/markdown-links.js.map +1 -0
  24. package/dist/preserve.d.ts +36 -0
  25. package/dist/preserve.js +83 -0
  26. package/dist/preserve.js.map +1 -0
  27. package/dist/protected-tokens.d.ts +7 -0
  28. package/dist/protected-tokens.js +103 -0
  29. package/dist/protected-tokens.js.map +1 -0
  30. package/dist/ranges.d.ts +13 -0
  31. package/dist/ranges.js +35 -0
  32. package/dist/ranges.js.map +1 -0
  33. package/dist/rules.d.ts +12 -0
  34. package/dist/rules.js +336 -0
  35. package/dist/rules.js.map +1 -0
  36. package/dist/sentences.d.ts +3 -0
  37. package/dist/sentences.js +95 -0
  38. package/dist/sentences.js.map +1 -0
  39. package/dist/types.d.ts +140 -0
  40. package/dist/types.js +2 -0
  41. package/dist/types.js.map +1 -0
  42. package/dist-cjs/baselines.d.ts +55 -0
  43. package/dist-cjs/baselines.js +45 -0
  44. package/dist-cjs/baselines.js.map +1 -0
  45. package/dist-cjs/brief.d.ts +45 -0
  46. package/dist-cjs/brief.js +114 -0
  47. package/dist-cjs/brief.js.map +1 -0
  48. package/dist-cjs/document.d.ts +5 -0
  49. package/dist-cjs/document.js +535 -0
  50. package/dist-cjs/document.js.map +1 -0
  51. package/dist-cjs/editorial.d.ts +53 -0
  52. package/dist-cjs/editorial.js +263 -0
  53. package/dist-cjs/editorial.js.map +1 -0
  54. package/dist-cjs/fixes.d.ts +8 -0
  55. package/dist-cjs/fixes.js +57 -0
  56. package/dist-cjs/fixes.js.map +1 -0
  57. package/dist-cjs/index.d.ts +73 -0
  58. package/dist-cjs/index.js +258 -0
  59. package/dist-cjs/index.js.map +1 -0
  60. package/dist-cjs/markdown-links.d.ts +12 -0
  61. package/dist-cjs/markdown-links.js +134 -0
  62. package/dist-cjs/markdown-links.js.map +1 -0
  63. package/dist-cjs/package.json +1 -0
  64. package/dist-cjs/preserve.d.ts +36 -0
  65. package/dist-cjs/preserve.js +87 -0
  66. package/dist-cjs/preserve.js.map +1 -0
  67. package/dist-cjs/protected-tokens.d.ts +7 -0
  68. package/dist-cjs/protected-tokens.js +106 -0
  69. package/dist-cjs/protected-tokens.js.map +1 -0
  70. package/dist-cjs/ranges.d.ts +13 -0
  71. package/dist-cjs/ranges.js +41 -0
  72. package/dist-cjs/ranges.js.map +1 -0
  73. package/dist-cjs/rules.d.ts +12 -0
  74. package/dist-cjs/rules.js +340 -0
  75. package/dist-cjs/rules.js.map +1 -0
  76. package/dist-cjs/sentences.d.ts +3 -0
  77. package/dist-cjs/sentences.js +98 -0
  78. package/dist-cjs/sentences.js.map +1 -0
  79. package/dist-cjs/types.d.ts +140 -0
  80. package/dist-cjs/types.js +3 -0
  81. package/dist-cjs/types.js.map +1 -0
  82. package/package.json +45 -0
@@ -0,0 +1,535 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseDocument = parseDocument;
4
+ exports.collectMarkdownLinkTargets = collectMarkdownLinkTargets;
5
+ const protected_tokens_js_1 = require("./protected-tokens.js");
6
+ const ranges_js_1 = require("./ranges.js");
7
+ const markdown_links_js_1 = require("./markdown-links.js");
8
+ const blockTags = /^(?:address|article|aside|div|footer|h[1-6]|header|hr|li|main|nav|ol|p|section|table|td|th|tr|ul|br)$/i;
9
+ /** Single source of truth for the lossless prose view used by every rule. */
10
+ function parseDocument(source, format = 'text') {
11
+ return parseDocumentInternal(source, format);
12
+ }
13
+ /** Literal Markdown targets outside canonical code/verbatim-quotation ranges. */
14
+ function collectMarkdownLinkTargets(source, format = 'md') {
15
+ const targets = [];
16
+ parseDocumentInternal(source, format, targets);
17
+ return targets;
18
+ }
19
+ function parseDocumentInternal(source, format, targets) {
20
+ if (!['text', 'md', 'mdx', 'html', 'source'].includes(format))
21
+ throw new TypeError(`Unsupported document format: ${format}`);
22
+ if (format === 'source')
23
+ throw new Error('The source format is not supported yet: JavaScript string extraction requires a syntax parser. Use text, md, mdx, or html.');
24
+ const ranges = [];
25
+ const codeRanges = [];
26
+ const quoteRanges = [];
27
+ const candidateTargets = [];
28
+ const target = (range, kind) => {
29
+ if (targets && range && range[0] < range[1])
30
+ candidateTargets.push({ target: source.slice(...range), sourceRange: range, kind });
31
+ };
32
+ const htmlKinds = new Map();
33
+ const boundaries = new Set([0, source.length]);
34
+ const mask = source.split('');
35
+ const protect = (start, end, kind) => {
36
+ if (end <= start)
37
+ return;
38
+ ranges.push([start, end]);
39
+ if (kind === 'code')
40
+ codeRanges.push([start, end]);
41
+ if (kind === 'quote')
42
+ quoteRanges.push([start, end]);
43
+ for (let i = start; i < end; i++)
44
+ if (source[i] !== '\n' && source[i] !== '\r')
45
+ mask[i] = ' ';
46
+ };
47
+ const lines = [];
48
+ for (let start = 0; start < source.length;) {
49
+ const newline = source.indexOf('\n', start);
50
+ const end = newline < 0 ? source.length : newline + 1;
51
+ lines.push({ start, end, text: source.slice(start, end).replace(/\r?\n$/, '') });
52
+ boundaries.add(start);
53
+ boundaries.add(end);
54
+ start = end;
55
+ }
56
+ const markdown = format === 'md' || format === 'mdx';
57
+ const blockStarts = [];
58
+ if (markdown || format === 'text') {
59
+ if (markdown && lines[0] && /^\uFEFF?---\s*$/.test(lines[0].text)) {
60
+ const close = lines.findIndex((line, i) => i > 0 && /^(?:---|\.\.\.)\s*$/.test(line.text));
61
+ protect(0, close < 0 ? source.length : lines[close].end, 'code');
62
+ }
63
+ for (let i = 0; i < lines.length; i++) {
64
+ const line = lines[i];
65
+ if (!mask.slice(line.start, line.end).join('').trim())
66
+ continue;
67
+ const fence = /^ {0,3}(`{3,}|~{3,})/.exec(line.text);
68
+ if (fence) {
69
+ const marker = fence[1];
70
+ let j = i + 1;
71
+ for (; j < lines.length; j++) {
72
+ if (new RegExp(`^ {0,3}${marker[0]}{${marker.length},}\\s*$`).test(lines[j].text))
73
+ break;
74
+ }
75
+ protect(line.start, j < lines.length ? lines[j].end : source.length, 'code');
76
+ i = j;
77
+ continue;
78
+ }
79
+ if (!markdown)
80
+ continue;
81
+ if (/^(?: {4}|\t)/.test(line.text)) {
82
+ protect(line.start, line.end, 'code');
83
+ continue;
84
+ }
85
+ if (/^ {0,3}>/.test(line.text)) {
86
+ let j = i + 1;
87
+ // Include lazy blockquote continuation: an unmarked line can still be quoted prose.
88
+ while (j < lines.length && lines[j].text.trim())
89
+ j++;
90
+ protect(line.start, lines[j - 1].end, 'quote');
91
+ i = j - 1;
92
+ continue;
93
+ }
94
+ const reference = /^ {0,3}\[[^\]]+\]:/.exec(line.text);
95
+ if (reference) {
96
+ if (targets)
97
+ target((0, markdown_links_js_1.markdownReferenceDestination)(source, line.start + reference[0].length), 'reference-definition');
98
+ protect(line.start, line.end);
99
+ continue;
100
+ }
101
+ const nextLine = lines[i + 1];
102
+ const tableHeader = markdownTableCells(line.text);
103
+ const tableDelimiter = nextLine && markdownTableCells(nextLine.text);
104
+ if (!markdownTableBoundary(line.text) && tableHeader && tableDelimiter
105
+ && tableHeader.length === tableDelimiter.length
106
+ && tableDelimiter.every((cell) => /^:?-+:?$/.test(cell.trim()))) {
107
+ let j = i + 2;
108
+ // GFM permits ragged body rows, including rows without a pipe.
109
+ while (j < lines.length && !markdownTableBoundary(lines[j].text))
110
+ j++;
111
+ // Single source of truth for table opacity: rules and prose metrics both
112
+ // exclude cells until a table-aware parser can preserve their structure.
113
+ protect(line.start, lines[j - 1].end);
114
+ i = j - 1;
115
+ continue;
116
+ }
117
+ const heading = /^ {0,3}(#{1,6})\s+/.exec(line.text);
118
+ if (heading || /^\s{0,3}(?:[-+*]|\d+[.)])\s+/.test(line.text))
119
+ blockStarts.push(line.start);
120
+ if (heading) {
121
+ protect(line.start, line.start + heading[0].length);
122
+ const close = /\s+#+\s*$/.exec(line.text);
123
+ if (close)
124
+ protect(line.start + close.index, line.start + line.text.length);
125
+ }
126
+ const item = /^\s{0,3}(?:[-+*]|\d+[.)])\s+/.exec(line.text);
127
+ if (item)
128
+ protect(line.start, line.start + item[0].length);
129
+ if (/^\s{0,3}(?:[-*_]\s*){3,}$/.test(line.text) || /^\s{0,3}(?:=+|-+)\s*$/.test(line.text))
130
+ protect(line.start, line.end);
131
+ if (format === 'mdx' && /^\s*(?:import|export)\s/.test(line.text)) {
132
+ // ESM in MDX is opaque: preserve the entire paragraph rather than guess JavaScript grammar.
133
+ let j = i + 1;
134
+ while (j < lines.length && lines[j].text.trim())
135
+ j++;
136
+ protect(line.start, lines[j - 1].end, 'code');
137
+ i = j - 1;
138
+ }
139
+ }
140
+ }
141
+ // Single source of truth for paragraph extent: inline code and straight quotes
142
+ // never pair across a blank line or a line owned by a block construct (a fence,
143
+ // table, blockquote, heading or list item). HTML block tags are added below.
144
+ const breaks = lines.filter((line) => !mask.slice(line.start, line.end).join('').trim()).map((line) => line.start);
145
+ breaks.push(...blockStarts);
146
+ const paragraphEnd = (from, limit) => {
147
+ const text = source.slice(from, limit);
148
+ return from + text.length - (/\r?\n$/.exec(text)?.[0].length ?? 0);
149
+ };
150
+ if (markdown || format === 'text') {
151
+ breaks.sort((a, b) => a - b);
152
+ // Code spans match a run of exactly the same number of backticks in one paragraph.
153
+ let next = 0;
154
+ const firstPair = new Map();
155
+ for (let i = 0; i < source.length; i++) {
156
+ if (mask[i] !== '`')
157
+ continue;
158
+ if (next < breaks.length && breaks[next] <= i) {
159
+ while (next < breaks.length && breaks[next] <= i)
160
+ next++;
161
+ firstPair.clear();
162
+ }
163
+ const limit = breaks[next] ?? source.length;
164
+ let runEnd = i + 1;
165
+ while (mask[runEnd] === '`')
166
+ runEnd++;
167
+ const count = runEnd - i;
168
+ let close = runEnd;
169
+ for (; close < limit; close++) {
170
+ if (mask[close] !== '`')
171
+ continue;
172
+ let closeEnd = close + 1;
173
+ while (mask[closeEnd] === '`')
174
+ closeEnd++;
175
+ if (closeEnd - close === count)
176
+ break;
177
+ close = closeEnd - 1;
178
+ }
179
+ if (close < limit) {
180
+ if (!firstPair.has(count))
181
+ firstPair.set(count, i);
182
+ protect(i, close + count, 'code');
183
+ i = close + count - 1;
184
+ continue;
185
+ }
186
+ // CommonMark prints an unclosed run literally, but it may be a truncated span,
187
+ // and any earlier same-length run in the paragraph may be the stray one. Protect
188
+ // from the first possible opener to the paragraph end; never pair past it.
189
+ const end = paragraphEnd(i, limit);
190
+ protect(firstPair.get(count) ?? i, end, 'code');
191
+ i = end - 1;
192
+ }
193
+ }
194
+ if (format !== 'text') {
195
+ // Tags are scanned with quote awareness: > inside an attribute is not a tag boundary.
196
+ for (let i = 0; i < source.length; i++) {
197
+ if (mask[i] !== '<')
198
+ continue;
199
+ if (source.startsWith('<!--', i)) {
200
+ const end = source.indexOf('-->', i + 4);
201
+ protect(i, end < 0 ? source.length : end + 3, 'code');
202
+ i = end < 0 ? source.length : end + 2;
203
+ continue;
204
+ }
205
+ const match = /^<\/?([A-Za-z][\w:.-]*)(?=[\s/>])/.exec(source.slice(i));
206
+ const autolink = /^<(?:https?:\/\/|mailto:)[^>\r\n]*>/.exec(source.slice(i));
207
+ if (autolink) {
208
+ protect(i, i + autolink[0].length);
209
+ i += autolink[0].length - 1;
210
+ continue;
211
+ }
212
+ if (!match && !/^<(?:!|\?|>)/.test(source.slice(i)) && !source.startsWith('</>', i))
213
+ continue;
214
+ const end = tagEnd(source, i, format === 'mdx');
215
+ const name = match?.[1]?.toLowerCase();
216
+ if (name && /^(?:code|pre|script|style|blockquote)$/.test(name) && source[i + 1] !== '/' && !/\/\s*>$/.test(source.slice(i, end))) {
217
+ const closing = new RegExp(`</${name}\\s*>`, 'ig');
218
+ closing.lastIndex = end;
219
+ const found = closing.exec(source);
220
+ const rawEnd = name === 'blockquote' ? blockquoteEnd(source, end, format === 'mdx')
221
+ : found ? found.index + found[0].length : source.length;
222
+ protect(i, rawEnd, name === 'blockquote' ? 'quote' : 'code');
223
+ if (name === 'pre' || name === 'blockquote')
224
+ breaks.push(i);
225
+ boundaries.add(i);
226
+ boundaries.add(rawEnd);
227
+ i = rawEnd - 1;
228
+ continue;
229
+ }
230
+ protect(i, end);
231
+ if (name && blockTags.test(name)) {
232
+ boundaries.add(i);
233
+ boundaries.add(end);
234
+ if (name !== 'br')
235
+ breaks.push(i);
236
+ }
237
+ if (name && /^(?:h[1-6]|li)$/.test(name)) {
238
+ if (source[i + 1] === '/')
239
+ htmlKinds.set(i, null);
240
+ else
241
+ htmlKinds.set(end, name === 'li' ? { kind: 'listItem' } : { kind: 'heading', depth: Number(name[1]) });
242
+ }
243
+ i = end - 1;
244
+ }
245
+ for (const match of source.matchAll(/&(?:#\d+|#x[\da-fA-F]+|[A-Za-z][A-Za-z\d]+);/g))
246
+ protect(match.index, match.index + match[0].length);
247
+ }
248
+ if (markdown) {
249
+ for (let i = 0; i < source.length; i++) {
250
+ if (mask[i] === '\\') {
251
+ protect(i, Math.min(source.length, i + 2));
252
+ i++;
253
+ continue;
254
+ }
255
+ if (mask[i] !== '[')
256
+ continue;
257
+ const close = source.indexOf(']', i + 1);
258
+ if (close < 0 || source.slice(i, close).includes('\n'))
259
+ continue;
260
+ let end = close + 1;
261
+ if (source[end] === '(') {
262
+ const link = (0, markdown_links_js_1.markdownLinkSyntax)(source, end);
263
+ end = link.end;
264
+ target(link.destinationRange, 'inline');
265
+ protect(close, end);
266
+ }
267
+ else if (source[end] === '[') {
268
+ const refEnd = source.indexOf(']', end + 1);
269
+ end = refEnd < 0 ? end : refEnd + 1;
270
+ protect(close, end);
271
+ }
272
+ else
273
+ protect(close, close + 1);
274
+ protect(i, i + 1);
275
+ if (source[i - 1] === '!')
276
+ protect(i - 1, end);
277
+ i = close;
278
+ }
279
+ for (let i = 0; i < source.length; i++)
280
+ if (mask[i] && /[*_~]/.test(mask[i]))
281
+ protect(i, i + 1);
282
+ }
283
+ if (format === 'mdx') {
284
+ for (let i = 0; i < source.length; i++) {
285
+ if (mask[i] !== '{')
286
+ continue;
287
+ const end = expressionEnd(source, i);
288
+ protect(i, end, 'code');
289
+ i = end - 1;
290
+ }
291
+ }
292
+ // Verbatim quotations are opaque to all automatic cleanup, including artifact rules.
293
+ // Straight quotes are symmetric: a stray one would re-pair every later quotation
294
+ // onto prose, so it must close in its own paragraph or stay literal. Curly quotes
295
+ // are directional and may span paragraphs, as multi-paragraph quotations do; a
296
+ // stray curly opener can only over-protect. Closers are never protected text.
297
+ breaks.sort((a, b) => a - b);
298
+ let next = 0;
299
+ const searched = new Map();
300
+ for (let i = 0; i < source.length; i++) {
301
+ if (mask[i] === ' ' || mask[i] === undefined)
302
+ continue;
303
+ const open = source[i];
304
+ const close = open === '“' ? '”' : open === '‘' ? '’' : open;
305
+ if (!['"', "'", '“', '‘'].includes(open))
306
+ continue;
307
+ if ((open === "'" || open === '‘') && /[\p{L}\p{N}]/u.test(source[i - 1] ?? ''))
308
+ continue;
309
+ // 27" is an inch or seconds mark, not an opening quote.
310
+ if (open === '"' && /\d/.test(source[i - 1] ?? ''))
311
+ continue;
312
+ while (next < breaks.length && breaks[next] <= i)
313
+ next++;
314
+ const limit = open === close ? breaks[next] ?? source.length : source.length;
315
+ // A closer search that failed also fails from any later opener with its limit.
316
+ if (searched.get(close) === limit)
317
+ continue;
318
+ let end = i + 1;
319
+ for (; end < limit; end++) {
320
+ if (mask[end] === '\\') {
321
+ end++;
322
+ continue;
323
+ }
324
+ if (mask[end] === close && !((close === "'" || close === '’') && /[\p{L}\p{N}]/u.test(source[end + 1] ?? '')))
325
+ break;
326
+ }
327
+ if (end < limit && mask[end] === close) {
328
+ protect(i, end + 1, 'quote');
329
+ i = end;
330
+ }
331
+ else
332
+ searched.set(close, limit);
333
+ }
334
+ for (const [start, end] of (0, protected_tokens_js_1.protectedTokenRanges)(source))
335
+ protect(start, end);
336
+ const points = [...boundaries].sort((a, b) => a - b);
337
+ const blocks = [];
338
+ let canJoin = false;
339
+ let htmlKind = null;
340
+ for (let i = 0; i < points.length - 1; i++) {
341
+ const start = points[i];
342
+ const end = points[i + 1];
343
+ if (htmlKinds.has(start))
344
+ htmlKind = htmlKinds.get(start);
345
+ const raw = source.slice(start, end);
346
+ const prose = mask.slice(start, end).join('');
347
+ const code = codeRanges.some(([a, b]) => start >= a && end <= b);
348
+ const quoted = quoteRanges.some(([a, b]) => start >= a && end <= b);
349
+ if (!raw.trim()) {
350
+ canJoin = false;
351
+ continue;
352
+ }
353
+ if (!prose.trim() && !code && !quoted)
354
+ continue;
355
+ let kind = code ? 'code' : quoted ? 'blockquote' : 'paragraph';
356
+ let depth;
357
+ if (markdown && !code && !quoted) {
358
+ const heading = /^ {0,3}(#{1,6})\s/.exec(raw);
359
+ if (heading) {
360
+ kind = 'heading';
361
+ depth = heading[1].length;
362
+ }
363
+ else if (/^ {0,3}(?:[-+*]|\d+[.)])\s/.test(raw))
364
+ kind = 'listItem';
365
+ }
366
+ if (htmlKind && !code && !quoted) {
367
+ kind = htmlKind.kind;
368
+ depth = htmlKind.depth;
369
+ }
370
+ const previous = blocks[blocks.length - 1];
371
+ const skip = code || quoted || !prose.trim();
372
+ if (canJoin && kind === 'paragraph' && previous?.kind === 'paragraph' && previous.sourceRange[1] === start && !skip) {
373
+ previous.sourceRange[1] = end;
374
+ previous.text += prose;
375
+ }
376
+ else
377
+ blocks.push({ kind, text: prose, sourceRange: [start, end], ...(depth ? { depth } : {}), skip });
378
+ canJoin = kind === 'paragraph' && !skip && /\n$/.test(raw);
379
+ }
380
+ if (targets)
381
+ targets.push(...candidateTargets.filter(({ sourceRange }) => ![...codeRanges, ...quoteRanges].some((range) => (0, ranges_js_1.rangesIntersect)(range, sourceRange))).sort((a, b) => a.sourceRange[0] - b.sourceRange[0]));
382
+ return { source, format, blocks, protectedRanges: mergeRanges(ranges), codeRanges: mergeRanges(codeRanges), quoteRanges: mergeRanges(quoteRanges) };
383
+ }
384
+ /** GFM cell separators are unescaped pipes, including within code spans. */
385
+ function markdownTableCells(text) {
386
+ const cells = [];
387
+ let start = 0;
388
+ for (let i = 0; i < text.length; i++) {
389
+ if (text[i] === '\\') {
390
+ i++;
391
+ continue;
392
+ }
393
+ if (text[i] !== '|')
394
+ continue;
395
+ cells.push(text.slice(start, i));
396
+ start = i + 1;
397
+ }
398
+ if (!cells.length)
399
+ return null;
400
+ cells.push(text.slice(start));
401
+ if (!cells[0].trim())
402
+ cells.shift();
403
+ if (!cells[cells.length - 1]?.trim())
404
+ cells.pop();
405
+ return cells.length ? cells : null;
406
+ }
407
+ /** Stop tables at blank lines or a new Markdown block; plain pipes alone are not tables. */
408
+ function markdownTableBoundary(text) {
409
+ if (!text.trim() || /^(?: {4}|\t)/.test(text))
410
+ return true;
411
+ if (/^ {0,3}(?:#{1,6}(?:\s|$)|>|`{3,}|~{3,}|[-+*]\s|\d+[.)]\s|\[[^\]]+\]:)/.test(text))
412
+ return true;
413
+ if (/^ {0,3}(?:[-*_]\s*){3,}$/.test(text))
414
+ return true;
415
+ const tag = /^ {0,3}<\/?([A-Za-z][\w:.-]*)(?=[\s/>])/.exec(text);
416
+ return /^ {0,3}<!--/.test(text) || Boolean(tag && blockTags.test(tag[1]));
417
+ }
418
+ function mergeRanges(ranges) {
419
+ const merged = [];
420
+ for (const [start, end] of ranges.sort((a, b) => a[0] - b[0] || a[1] - b[1])) {
421
+ const previous = merged[merged.length - 1];
422
+ if (previous && start <= previous[1])
423
+ previous[1] = Math.max(previous[1], end);
424
+ else
425
+ merged.push([start, end]);
426
+ }
427
+ return merged;
428
+ }
429
+ /** Single source of truth for HTML tag boundaries, including quoted attributes. */
430
+ function tagEnd(source, start, mdx) {
431
+ let quote = '';
432
+ for (let end = start + 1; end < source.length; end++) {
433
+ const char = source[end];
434
+ if (quote) {
435
+ if (char === quote)
436
+ quote = '';
437
+ continue;
438
+ }
439
+ if (char === '"' || char === "'") {
440
+ quote = char;
441
+ continue;
442
+ }
443
+ if (mdx && char === '{') {
444
+ end = expressionEnd(source, end) - 1;
445
+ continue;
446
+ }
447
+ if (char === '>')
448
+ return end + 1;
449
+ }
450
+ return source.length;
451
+ }
452
+ function blockquoteEnd(source, start, mdx) {
453
+ let depth = 1;
454
+ for (let i = start; i < source.length; i++) {
455
+ if (source[i] !== '<')
456
+ continue;
457
+ if (source.startsWith('<!--', i)) {
458
+ const close = source.indexOf('-->', i + 4);
459
+ if (close < 0)
460
+ return source.length;
461
+ i = close + 2;
462
+ continue;
463
+ }
464
+ const match = /^<(\/?)([A-Za-z][\w:.-]*)(?=[\s/>])/.exec(source.slice(i));
465
+ if (!match)
466
+ continue;
467
+ const end = tagEnd(source, i, mdx);
468
+ const name = match[2].toLowerCase();
469
+ if (name === 'blockquote') {
470
+ if (match[1] === '/') {
471
+ if (--depth === 0)
472
+ return end;
473
+ }
474
+ else if (!/\/\s*>$/.test(source.slice(i, end)))
475
+ depth++;
476
+ }
477
+ else if (/^(?:code|pre|script|style)$/.test(name) && match[1] !== '/') {
478
+ const closing = new RegExp(`</${name}\\s*>`, 'ig');
479
+ closing.lastIndex = end;
480
+ const found = closing.exec(source);
481
+ if (!found)
482
+ return source.length;
483
+ i = found.index + found[0].length - 1;
484
+ continue;
485
+ }
486
+ i = end - 1;
487
+ }
488
+ return source.length;
489
+ }
490
+ /** Conservative expression scanner. Unterminated syntax protects the remaining document. */
491
+ function expressionEnd(source, start) {
492
+ let depth = 0;
493
+ for (let i = start; i < source.length; i++) {
494
+ const char = source[i];
495
+ if (char === '"' || char === "'" || char === '`') {
496
+ const quote = char;
497
+ for (i++; i < source.length; i++) {
498
+ if (source[i] === '\\') {
499
+ i++;
500
+ continue;
501
+ }
502
+ if (quote === '`' && source[i] === '$' && source[i + 1] === '{') {
503
+ i = expressionEnd(source, i + 1) - 1;
504
+ continue;
505
+ }
506
+ if (source[i] === quote)
507
+ break;
508
+ }
509
+ if (i >= source.length)
510
+ return source.length;
511
+ }
512
+ else if (char === '/' && source[i + 1] === '/') {
513
+ const newline = source.indexOf('\n', i + 2);
514
+ if (newline < 0)
515
+ return source.length;
516
+ i = newline;
517
+ }
518
+ else if (char === '/' && source[i + 1] === '*') {
519
+ const close = source.indexOf('*/', i + 2);
520
+ if (close < 0)
521
+ return source.length;
522
+ i = close + 1;
523
+ }
524
+ else if (char === '/') {
525
+ // Regex/division ambiguity needs a full JS parser. Protect the rest rather than expose code.
526
+ return source.length;
527
+ }
528
+ else if (char === '{')
529
+ depth++;
530
+ else if (char === '}' && --depth === 0)
531
+ return i + 1;
532
+ }
533
+ return source.length;
534
+ }
535
+ //# sourceMappingURL=document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.js","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { Config, DensityFamily, DensityProfile, Document, Register, Rule, Sentence } from './types.js';
2
+ /**
3
+ * Editable body prose: paragraphs and list items. Headings are deliberate
4
+ * (question headings match search queries), so they're never measured.
5
+ * Single source of truth for what the density rules and their baselines count.
6
+ */
7
+ export declare function bodyBlocks(document: Document): import("./types.js").Block[];
8
+ /** Words are the body sentences' word counts, the same measure the metrics report. */
9
+ export declare function densityProfile(document: Document, sentences: readonly Sentence[]): DensityProfile;
10
+ /** Rule id for each density family, for callers that measure instances with profileText. */
11
+ export declare const densityRuleIds: Record<DensityFamily, string>;
12
+ /** Shorter bodies are too small to measure a rate. */
13
+ export declare const densityMinimumWords = 300;
14
+ /** One or two instances are ordinary writing whatever the rate; repetition is the tell. */
15
+ export declare const densityMinimumInstances = 3;
16
+ /**
17
+ * The human baseline a density family is measured against in a register:
18
+ * the register's own threshold where one was fit, otherwise the article one.
19
+ */
20
+ export declare function densityBaseline(name: DensityFamily, register?: Register): {
21
+ p95: number;
22
+ documents: number;
23
+ register: Register;
24
+ };
25
+ /**
26
+ * Single source of truth for when a density rule fires, used by the rules and
27
+ * by the baseline report so the published exceedance matches what ships.
28
+ */
29
+ export declare function densityVerdict(profile: DensityProfile, name: DensityFamily, register?: Register): {
30
+ count: number;
31
+ per1k: number;
32
+ threshold: number;
33
+ fires: boolean;
34
+ rewriteAtLeast: number;
35
+ };
36
+ /** Characters the project bans outright, normalized from the voice config. Single source of truth for the ban rule and the density rules it supersedes. */
37
+ export declare function bannedCharacters(config: Config): import("./types.js").BannedCharacter[];
38
+ /** Sentences longer than 90% of human sentences, the ones a split helps most. */
39
+ export declare function longSentences(sentences: readonly Sentence[]): Sentence[];
40
+ /** Single source of truth for when the long-sentence rule fires, shared with the baseline report. */
41
+ export declare function longSentenceVerdict(words: number, sentences: readonly Sentence[]): {
42
+ mean: number;
43
+ long: Sentence[];
44
+ fires: boolean;
45
+ rewriteAtLeast: number;
46
+ };
47
+ /**
48
+ * Instances of the given rules' habits in a text, whether or not they fire.
49
+ * Single source of truth for "did a rewrite reduce what was flagged", used by
50
+ * Signal's revision gate and anything else that compares a before and after.
51
+ */
52
+ export declare function flaggedInstances(profile: DensityProfile, sentences: readonly Sentence[], ruleIds: readonly string[]): number;
53
+ export declare const editorialRules: Rule[];