@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,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.segmentSentences = segmentSentences;
4
+ const protected_tokens_js_1 = require("./protected-tokens.js");
5
+ const abbreviations = new Set([
6
+ 'dr', 'mr', 'mrs', 'ms', 'prof', 'sr', 'jr', 'st',
7
+ 'e.g', 'i.e', 'etc', 'cf', 'vs', 'al',
8
+ 'inc', 'ltd', 'co', 'corp', 'dept', 'est',
9
+ ]);
10
+ /** Width of the letter code point ending at `end`, or 0. Surrogate pairs decode as `/u` does. */
11
+ function letterBefore(text, end) {
12
+ const low = text.charCodeAt(end - 1);
13
+ const high = text.charCodeAt(end - 2);
14
+ const width = low >= 0xDC00 && low <= 0xDFFF && high >= 0xD800 && high <= 0xDBFF ? 2 : end > 0 ? 1 : 0;
15
+ return width && /^\p{L}$/u.test(text.slice(end - width, end)) ? width : 0;
16
+ }
17
+ /**
18
+ * The chain `/([\p{L}]+(?:\.[\p{L}]+)*)$/u` matches on `text.slice(0, end)`,
19
+ * scanned backward in time proportional to the chain instead of the text.
20
+ */
21
+ function precedingChain(text, end) {
22
+ let start = end;
23
+ for (let width = 0;;) {
24
+ if ((width = letterBefore(text, start)))
25
+ start -= width;
26
+ else if (start < end && text[start - 1] === '.' && letterBefore(text, start - 1))
27
+ start--;
28
+ else
29
+ return text.slice(start, end);
30
+ }
31
+ }
32
+ /** Deterministic segmentation with original UTF-16 ranges; it does not infer authorship. */
33
+ function segmentSentences(text, offset = 0) {
34
+ if (!Number.isSafeInteger(offset) || offset < 0)
35
+ throw new RangeError('Sentence offset must be a non-negative safe integer.');
36
+ const result = [];
37
+ const protectedRanges = (0, protected_tokens_js_1.protectedTokenRanges)(text);
38
+ const push = (start, end) => {
39
+ while (start < end && /\s/.test(text[start]))
40
+ start++;
41
+ while (end > start && /\s/.test(text[end - 1]))
42
+ end--;
43
+ if (end <= start)
44
+ return;
45
+ const sentence = text.slice(start, end);
46
+ const wordCount = (sentence.match(/[\p{L}\p{N}]+(?:['’.-][\p{L}\p{N}]+)*/gu) ?? []).length;
47
+ if (wordCount)
48
+ result.push({ text: sentence, range: [offset + start, offset + end], wordCount });
49
+ };
50
+ let start = 0;
51
+ let protectedIndex = 0;
52
+ // Every mark before `settled` shares a terminal group already found not to end a sentence.
53
+ let settled = 0;
54
+ const opener = /[\p{Lu}\p{Lt}\p{N}"'“‘([{]/uy;
55
+ for (let i = 0; i < text.length; i++) {
56
+ const char = text[i];
57
+ if (!/[.!?]/.test(char) || i < settled)
58
+ continue;
59
+ while (protectedIndex < protectedRanges.length && protectedRanges[protectedIndex][1] <= i)
60
+ protectedIndex++;
61
+ const protectedRange = protectedRanges[protectedIndex];
62
+ if (protectedRange && i >= protectedRange[0] && i < protectedRange[1])
63
+ continue;
64
+ if (char === '.') {
65
+ if (text[i - 1] === '.' || text[i + 1] === '.')
66
+ continue;
67
+ if (/\d/.test(text[i - 1] ?? '') && /\d/.test(text[i + 1] ?? ''))
68
+ continue;
69
+ }
70
+ let end = i + 1;
71
+ while (/[.!?]/.test(text[end] ?? '') && end < text.length)
72
+ end++;
73
+ while (/["'”’\])}]/.test(text[end] ?? '') && end < text.length)
74
+ end++;
75
+ let next = end;
76
+ while (next < text.length && /\s/.test(text[next]))
77
+ next++;
78
+ opener.lastIndex = next;
79
+ if (!(next === text.length || (next > end && opener.test(text)))) {
80
+ settled = end;
81
+ continue;
82
+ }
83
+ // The abbreviation lookback runs last, so only a real boundary candidate pays for it.
84
+ if (char === '.') {
85
+ const preceding = precedingChain(text, i);
86
+ if (abbreviations.has(preceding.toLowerCase()))
87
+ continue;
88
+ if (/^(?:\p{Lu}\.)*\p{Lu}$/u.test(preceding))
89
+ continue;
90
+ }
91
+ push(start, end);
92
+ start = next;
93
+ i = next - 1;
94
+ }
95
+ push(start, text.length);
96
+ return result;
97
+ }
98
+ //# sourceMappingURL=sentences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentences.js","sourceRoot":"","sources":["../src/sentences.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ /** All ranges are half-open UTF-16 offsets into the untouched source string. */
2
+ export type Range = [number, number];
3
+ export type Format = 'text' | 'md' | 'mdx' | 'html' | 'source';
4
+ export type Severity = 'error' | 'warn' | 'info';
5
+ export type FixSafety = 'safe' | 'careful' | 'manual';
6
+ export interface Block {
7
+ kind: 'paragraph' | 'heading' | 'listItem' | 'blockquote' | 'code' | 'html';
8
+ /** A length-preserving prose view. Protected syntax is replaced with spaces. */
9
+ text: string;
10
+ sourceRange: Range;
11
+ depth?: number;
12
+ skip: boolean;
13
+ }
14
+ export interface Document {
15
+ source: string;
16
+ format: Format;
17
+ blocks: Block[];
18
+ protectedRanges: Range[];
19
+ /** Code: fences, spans, frontmatter, raw HTML code and expressions. A subset of protectedRanges. */
20
+ codeRanges: Range[];
21
+ /** Verbatim quotations and blockquotes. A subset of protectedRanges. */
22
+ quoteRanges: Range[];
23
+ }
24
+ export interface MarkdownLinkTarget {
25
+ /** Exact source spelling, including any Markdown backslash escapes. */
26
+ target: string;
27
+ sourceRange: Range;
28
+ kind: 'inline' | 'reference-definition';
29
+ }
30
+ export interface Sentence {
31
+ text: string;
32
+ range: Range;
33
+ wordCount: number;
34
+ }
35
+ export interface Finding {
36
+ ruleId: string;
37
+ severity: Severity;
38
+ message: string;
39
+ why: string;
40
+ range: Range;
41
+ loc: {
42
+ line: number;
43
+ column: number;
44
+ endLine: number;
45
+ endColumn: number;
46
+ };
47
+ fix?: {
48
+ range: Range;
49
+ text: string;
50
+ };
51
+ fixSafety: FixSafety;
52
+ /** Confidence in the described mechanical match, never authorship probability. */
53
+ confidence: number;
54
+ evidence?: Record<string, number | string>;
55
+ }
56
+ export type RuleFinding = Omit<Finding, 'ruleId' | 'severity' | 'loc'>;
57
+ export type RuleSetting = Severity | 'off' | [Severity | 'off', Record<string, unknown>];
58
+ /**
59
+ * Which human baseline the density rules measure against. 'article' is the
60
+ * 110 human articles every threshold was fit on; 'marketing' swaps in the
61
+ * thresholds fit on human marketing pages where they differ (list saturation).
62
+ */
63
+ export type Register = 'article' | 'marketing';
64
+ /** A character the project bans outright in copy, reported at every occurrence. */
65
+ export interface BannedCharacter {
66
+ character: string;
67
+ use?: string;
68
+ why?: string;
69
+ }
70
+ /** A pattern (a regular expression source) the project bans outright in copy. */
71
+ export interface BannedPattern {
72
+ pattern: string;
73
+ flags?: string;
74
+ message?: string;
75
+ use?: string;
76
+ }
77
+ export interface Config {
78
+ format?: Format;
79
+ fix?: boolean;
80
+ careful?: boolean;
81
+ register?: Register;
82
+ rules?: Record<string, RuleSetting>;
83
+ voice?: {
84
+ banned?: {
85
+ term: string;
86
+ use?: string;
87
+ }[];
88
+ required?: string[];
89
+ /** Absolute bans, whatever the density: em dashes on a site that forbids them, say. */
90
+ bannedCharacters?: (string | BannedCharacter)[];
91
+ bannedPatterns?: BannedPattern[];
92
+ };
93
+ }
94
+ export type DensityFamily = 'series' | 'contrast' | 'generalizer' | 'reveal' | 'emDash' | 'semicolon';
95
+ /** Instances of each structural habit in editable body prose, with the words they're measured against. */
96
+ export interface DensityProfile {
97
+ words: number;
98
+ instances: Record<DensityFamily, Range[]>;
99
+ }
100
+ export interface RuleContext {
101
+ document: Document;
102
+ config: Config;
103
+ register: Register;
104
+ options: Record<string, unknown>;
105
+ /** Sentences of editable body prose (paragraphs and list items), in source order. */
106
+ sentences: Sentence[];
107
+ profile: DensityProfile;
108
+ }
109
+ export interface Rule {
110
+ id: string;
111
+ severity: Severity;
112
+ description: string;
113
+ /** Registry order is the stable tie-breaker for overlapping fixes. */
114
+ check(context: RuleContext): RuleFinding[];
115
+ }
116
+ export interface Metrics {
117
+ sentenceWords: number[];
118
+ sentenceCount: number;
119
+ wordCount: number;
120
+ meanSentenceLength: number | null;
121
+ sentenceLengthCV: number | null;
122
+ meanAbsoluteSuccessiveDifference: number | null;
123
+ }
124
+ export interface Result {
125
+ /** With fix:true these findings refer to fixed, otherwise to the input. */
126
+ findings: Finding[];
127
+ /** No calibrated corpus exists yet. Never invent a texture or AI score. */
128
+ score: null;
129
+ calibration: {
130
+ status: 'unavailable';
131
+ reason: string;
132
+ };
133
+ metrics: Metrics;
134
+ fixed?: string;
135
+ fixes?: {
136
+ applied: number;
137
+ passes: number;
138
+ converged: boolean;
139
+ };
140
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@roughen/core",
3
+ "version": "0.3.0",
4
+ "description": "Deterministic, local prose linting with explained findings and safe fixes.",
5
+ "license": "MIT",
6
+ "keywords": [
7
+ "prose",
8
+ "linter",
9
+ "writing",
10
+ "ai-writing",
11
+ "copy",
12
+ "editing",
13
+ "style",
14
+ "deterministic"
15
+ ],
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "type": "module",
20
+ "main": "./dist-cjs/index.js",
21
+ "module": "./dist/index.js",
22
+ "types": "./dist/index.d.ts",
23
+ "exports": {
24
+ ".": {
25
+ "import": {
26
+ "types": "./dist/index.d.ts",
27
+ "default": "./dist/index.js"
28
+ },
29
+ "require": {
30
+ "types": "./dist-cjs/index.d.ts",
31
+ "default": "./dist-cjs/index.js"
32
+ }
33
+ }
34
+ },
35
+ "files": [
36
+ "dist",
37
+ "dist-cjs",
38
+ "README.md",
39
+ "LICENSE"
40
+ ],
41
+ "sideEffects": false,
42
+ "scripts": {
43
+ "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json && node scripts/cjs.mjs"
44
+ }
45
+ }