@chaffjs/lang-en 0.6.0 → 0.8.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/README.md +1 -1
- package/dist/citation.d.ts +9 -0
- package/dist/citation.d.ts.map +1 -1
- package/dist/citation.js +40 -4
- package/dist/citation.js.map +1 -1
- package/dist/dates.d.ts +3 -0
- package/dist/dates.d.ts.map +1 -0
- package/dist/dates.js +84 -0
- package/dist/dates.js.map +1 -0
- package/dist/definitions.d.ts +5 -0
- package/dist/definitions.d.ts.map +1 -0
- package/dist/definitions.js +33 -0
- package/dist/definitions.js.map +1 -0
- package/dist/depth.d.ts +4 -0
- package/dist/depth.d.ts.map +1 -0
- package/dist/depth.js +4 -0
- package/dist/depth.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -4
- package/dist/index.js.map +1 -1
- package/dist/reference-list.d.ts +7 -0
- package/dist/reference-list.d.ts.map +1 -0
- package/dist/reference-list.js +56 -0
- package/dist/reference-list.js.map +1 -0
- package/dist/roman.d.ts +3 -0
- package/dist/roman.d.ts.map +1 -0
- package/dist/roman.js +10 -0
- package/dist/roman.js.map +1 -0
- package/dist/sentence-split.d.ts +6 -0
- package/dist/sentence-split.d.ts.map +1 -0
- package/dist/sentence-split.js +114 -0
- package/dist/sentence-split.js.map +1 -0
- package/dist/structure.d.ts +0 -2
- package/dist/structure.d.ts.map +1 -1
- package/dist/structure.js +73 -90
- package/dist/structure.js.map +1 -1
- package/lexicons/total-label.yaml +9 -0
- package/lexicons/weekday.yaml +11 -0
- package/package.json +1 -1
- package/src/citation.ts +48 -4
- package/src/dates.ts +93 -0
- package/src/definitions.ts +43 -0
- package/src/depth.ts +3 -0
- package/src/index.ts +2 -4
- package/src/reference-list.ts +66 -0
- package/src/roman.ts +9 -0
- package/src/sentence-split.ts +131 -0
- package/src/structure.ts +76 -104
package/dist/structure.js
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import { citedDocumentAfter } from "./citation.js";
|
|
2
|
+
import { membersAfter } from "./reference-list.js";
|
|
3
|
+
import { parseRoman } from "./roman.js";
|
|
4
|
+
import { dates } from "./dates.js";
|
|
5
|
+
import { definitionScopeDepth, definitions, opensDefinitionScope } from "./definitions.js";
|
|
6
|
+
import { CHAPTER_DEPTH, PART_DEPTH } from "./depth.js";
|
|
2
7
|
// Contracts, specifications and statutes in English. core nests what this reads; it does not know
|
|
3
8
|
// how English numbers its articles.
|
|
4
|
-
const ROMAN = { i: 1, v: 5, x: 10, l: 50, c: 100 };
|
|
5
|
-
/** "IV" → 4, "xii" → 12. Undefined for anything that is not a roman numeral. */
|
|
6
|
-
export const parseRoman = (text) => {
|
|
7
|
-
const values = [...text.toLowerCase()].map((char) => ROMAN[char]);
|
|
8
|
-
if (values.length === 0 || values.some((value) => value === undefined))
|
|
9
|
-
return undefined;
|
|
10
|
-
const known = values.filter((value) => value !== undefined);
|
|
11
|
-
return known.reduce((total, value, index) => ((known[index + 1] ?? 0) > value ? total - value : total + value), 0);
|
|
12
|
-
};
|
|
13
9
|
const numberOf = (text) => {
|
|
14
10
|
if (text === undefined)
|
|
15
11
|
return undefined;
|
|
@@ -30,9 +26,15 @@ const titleOf = (rest) => {
|
|
|
30
26
|
};
|
|
31
27
|
const ARTICLE = /^\s{0,3}(?:ARTICLE|Article)\s+(?<n>\d{1,3}|[IVXLC]{1,7})\b(?<rest>.*)$/u;
|
|
32
28
|
const SECTION = /^\s{0,3}(?:SECTION|Section|§)\s*(?<n>\d{1,3}(?:\.\d{1,3}){0,5})\b(?<rest>.*)$/u;
|
|
33
|
-
|
|
29
|
+
/**
|
|
30
|
+
* An amendment inserts a subsection between two others and numbers it "(A1)" or "(2A)". It is a subsection, written
|
|
31
|
+
* outside the sequence: it has no ordinal, so "(1)" after "(A1)" is still the first.
|
|
32
|
+
*/
|
|
33
|
+
const INSERTED = "\\d{1,3}[A-Z]{1,2}|[A-Z]{1,2}\\d{1,3}";
|
|
34
|
+
const LETTERED = new RegExp(`^\\s{0,6}\\((?<n>[a-z]{1,4}|\\d{1,3}|${INSERTED})\\)\\s+(?<rest>\\S.*)$`, "u");
|
|
35
|
+
const IS_INSERTED = new RegExp(`^(?:${INSERTED})$`, "u");
|
|
34
36
|
const MULTI_ROMAN = /^(?:ii|iii|iv|vi|vii|viii|ix)$/u;
|
|
35
|
-
const headed = (pattern, line, label) => {
|
|
37
|
+
const headed = (pattern, line, numbering, label) => {
|
|
36
38
|
const groups = pattern.exec(line)?.groups;
|
|
37
39
|
const number = numberOf(groups?.["n"]);
|
|
38
40
|
const heading = titleOf(groups?.["rest"] ?? "");
|
|
@@ -48,6 +50,7 @@ const headed = (pattern, line, label) => {
|
|
|
48
50
|
heading,
|
|
49
51
|
rest: heading,
|
|
50
52
|
ordinal: Number(parts.at(-1)),
|
|
53
|
+
numbering,
|
|
51
54
|
};
|
|
52
55
|
};
|
|
53
56
|
/**
|
|
@@ -55,10 +58,10 @@ const headed = (pattern, line, label) => {
|
|
|
55
58
|
* 開いたときの読みを覚えておく代わりに、一つ上に英字が開いていたかで決め直す。
|
|
56
59
|
*/
|
|
57
60
|
const styleOfLabel = (open, index, all) => {
|
|
58
|
-
const inner = /^\((?<n>[
|
|
61
|
+
const inner = /^\((?<n>[A-Za-z0-9]{1,5})\)$/u.exec(open.label)?.groups?.["n"];
|
|
59
62
|
if (inner === undefined)
|
|
60
63
|
return undefined;
|
|
61
|
-
if (/^\d+$/u.test(inner))
|
|
64
|
+
if (/^\d+$/u.test(inner) || IS_INSERTED.test(inner))
|
|
62
65
|
return "digit";
|
|
63
66
|
if (MULTI_ROMAN.test(inner))
|
|
64
67
|
return "roman";
|
|
@@ -70,7 +73,7 @@ const styles = (context) => context.open.map((open, index, all) => styleOfLabel(
|
|
|
70
73
|
const followsLetter = (raw, context) => context.open.some((open, index) => styles(context)[index] === "letter" && open.number.charCodeAt(0) + 1 === raw.charCodeAt(0));
|
|
71
74
|
/** "(i)" is a roman numeral right under "(a)", or when a roman list is already open; the letter i otherwise. */
|
|
72
75
|
const styleOf = (raw, context) => {
|
|
73
|
-
if (/^\d+$/u.test(raw))
|
|
76
|
+
if (/^\d+$/u.test(raw) || IS_INSERTED.test(raw))
|
|
74
77
|
return "digit";
|
|
75
78
|
if (MULTI_ROMAN.test(raw))
|
|
76
79
|
return "roman";
|
|
@@ -92,7 +95,7 @@ const LETTER_BEFORE_A = "a".charCodeAt(0) - 1;
|
|
|
92
95
|
/** "(b)" は 2 番目、"(ii)" も 2 番目。二文字以上の英字("(aa)")は並びが決まらないので付けない。 */
|
|
93
96
|
const ordinalOf = (raw, style) => {
|
|
94
97
|
if (style === "digit")
|
|
95
|
-
return Number(raw);
|
|
98
|
+
return IS_INSERTED.test(raw) ? undefined : Number(raw);
|
|
96
99
|
if (style === "roman")
|
|
97
100
|
return parseRoman(raw);
|
|
98
101
|
return raw.length === 1 ? raw.charCodeAt(0) - LETTER_BEFORE_A : undefined;
|
|
@@ -127,23 +130,16 @@ const chapter = (pattern, line, depth, prefix, word) => {
|
|
|
127
130
|
const label = `${word} ${groups["n"] ?? ""}`;
|
|
128
131
|
return { kind: "chapter", depth, number: prefix + number, absolute: false, label, heading, rest: heading, ordinal: Number(number) };
|
|
129
132
|
};
|
|
130
|
-
const numbered = (line, context) => chapter(PART, line,
|
|
131
|
-
chapter(CHAPTER, line,
|
|
132
|
-
headed(ARTICLE, line, (n) => `Article ${n}`) ??
|
|
133
|
-
headed(SECTION, line, (n) => `Section ${n}`) ??
|
|
133
|
+
const numbered = (line, context) => chapter(PART, line, PART_DEPTH, "pt", "Part") ??
|
|
134
|
+
chapter(CHAPTER, line, CHAPTER_DEPTH, "ch", "Chapter") ??
|
|
135
|
+
headed(ARTICLE, line, "article", (n) => `Article ${n}`) ??
|
|
136
|
+
headed(SECTION, line, "section", (n) => `Section ${n}`) ??
|
|
134
137
|
lettered(line, context);
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
const
|
|
140
|
-
/["“](?<term>[^"”\n]{1,60})["”] (?:means|shall mean|refers to|has the meaning)\b/gu,
|
|
141
|
-
/\((?:the |hereinafter )?["“](?<term>[^"”\n]{1,60})["”]\)/gu,
|
|
142
|
-
/\(hereinafter referred to as ["“](?<term>[^"”\n]{1,60})["”]\)/gu,
|
|
143
|
-
];
|
|
144
|
-
const definitions = (text) => DEFINITIONS.flatMap((pattern) => mentions(pattern, text, (groups) => (groups["term"] === undefined ? undefined : { term: groups["term"] })));
|
|
145
|
-
const REFERENCE = /\b(?:Sections?|Articles?|§) ?(?<n>\d{1,3}(?:\.\d{1,3}){0,5}|[IVXLC]{1,7})\b/gu;
|
|
146
|
-
const SUBDIVISION = /^\((?<p>[a-z0-9]{1,4})\)/u;
|
|
138
|
+
const REFERENCE = /(?<word>\b[Ss]ections?|\b[Aa]rticles?|§) ?(?<n>\d{1,3}(?:\.\d{1,3}){0,5}|[IVXLC]{1,7})\b/gu;
|
|
139
|
+
/** "(a)", "(ii)", "(3)", and an inserted "(A1)" or "(2A)": the same labels the tree reads. */
|
|
140
|
+
const SUBDIVISION = new RegExp(`^\\((?<p>[a-z0-9]{1,4}|${INSERTED})\\)`, "u");
|
|
141
|
+
/** The longest label, with its parentheses: "(ZZ999)". */
|
|
142
|
+
const MAX_SUBDIVISION_LENGTH = 7;
|
|
147
143
|
/** "(a)(ii)(3)" is as deep as a reference goes; more parentheses are text, not a deeper address. */
|
|
148
144
|
const MAX_SUBDIVISIONS = 4;
|
|
149
145
|
/**
|
|
@@ -154,7 +150,7 @@ const subdivisions = (text, from) => {
|
|
|
154
150
|
const parts = [];
|
|
155
151
|
let end = from;
|
|
156
152
|
while (parts.length < MAX_SUBDIVISIONS) {
|
|
157
|
-
const part = SUBDIVISION.exec(text.slice(end, end +
|
|
153
|
+
const part = SUBDIVISION.exec(text.slice(end, end + MAX_SUBDIVISION_LENGTH))?.groups?.["p"];
|
|
158
154
|
if (part === undefined)
|
|
159
155
|
break;
|
|
160
156
|
parts.push(part);
|
|
@@ -162,19 +158,44 @@ const subdivisions = (text, from) => {
|
|
|
162
158
|
}
|
|
163
159
|
return { parts, end };
|
|
164
160
|
};
|
|
161
|
+
/** Parentheses opened and not yet closed in `between`. */
|
|
162
|
+
const PAREN_STEP = { "(": 1, ")": -1 };
|
|
163
|
+
const advance = (gloss, text, to) => {
|
|
164
|
+
for (let index = gloss.scanned; index < to; index += 1) {
|
|
165
|
+
gloss.depth += PAREN_STEP[text[index] ?? ""] ?? 0;
|
|
166
|
+
while ((gloss.anchors.at(-1)?.depth ?? -Infinity) > gloss.depth)
|
|
167
|
+
gloss.anchors.pop();
|
|
168
|
+
}
|
|
169
|
+
gloss.scanned = Math.max(gloss.scanned, to);
|
|
170
|
+
};
|
|
171
|
+
const glossedDocument = (gloss) => {
|
|
172
|
+
const anchor = gloss.anchors.at(-1);
|
|
173
|
+
return anchor !== undefined && gloss.depth > anchor.depth ? anchor.document : undefined;
|
|
174
|
+
};
|
|
165
175
|
/**
|
|
166
176
|
* "Section 4.2(a)" → 4.2.a, "Article III" → 3. The same addresses the tree gives.
|
|
167
177
|
* "Section 9 of the Master Agreement" carries the other document's name, and is not looked up in this tree.
|
|
168
178
|
*/
|
|
169
|
-
const references = (text) =>
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
179
|
+
const references = (text) => {
|
|
180
|
+
const gloss = { depth: 0, scanned: 0, anchors: [] };
|
|
181
|
+
return [...text.matchAll(REFERENCE)].flatMap((match) => {
|
|
182
|
+
const main = numberOf(match.groups?.["n"]);
|
|
183
|
+
if (main === undefined)
|
|
184
|
+
return [];
|
|
185
|
+
const { parts, end } = subdivisions(text, match.index + match[0].length);
|
|
186
|
+
advance(gloss, text, match.index);
|
|
187
|
+
const cited = citedDocumentAfter(text, end);
|
|
188
|
+
const document = cited ?? glossedDocument(gloss);
|
|
189
|
+
gloss.scanned = Math.max(gloss.scanned, end);
|
|
190
|
+
if (cited !== undefined)
|
|
191
|
+
gloss.anchors.push({ document: cited, depth: gloss.depth });
|
|
192
|
+
const numbering = /^[Aa]/u.test(match.groups?.["word"] ?? "") ? "article" : "section";
|
|
193
|
+
const shared = { numbering, ...(document === undefined ? {} : { document }) };
|
|
194
|
+
const first = { start: match.index, end, attrs: { target: [main, ...parts].join("."), label: text.slice(match.index, end), ...shared } };
|
|
195
|
+
const [plural, roman] = [/s$/u.test(match.groups?.["word"] ?? ""), /^[IVXLC]+$/u.test(match.groups?.["n"] ?? "")];
|
|
196
|
+
return [first, ...membersAfter(text, end, [main, ...parts], shared, plural, roman)];
|
|
197
|
+
});
|
|
198
|
+
};
|
|
178
199
|
/** Longest first, and never inside a word: "shall not" is not also "shall", "mayor" is not "may". */
|
|
179
200
|
const MARKERS = [
|
|
180
201
|
["is required to", "must"],
|
|
@@ -275,55 +296,17 @@ const quantities = (text) => [...text.matchAll(NUMBER_RUN)].flatMap((match) => {
|
|
|
275
296
|
const unit = unitAfter(text, end) ?? currencyBefore(text, match.index);
|
|
276
297
|
return unit === undefined || Number.isNaN(value) || isWordChar(text[match.index - 1]) ? [] : [{ start: match.index, end, attrs: { value, unit } }];
|
|
277
298
|
});
|
|
278
|
-
const MONTHS = ["january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"];
|
|
279
|
-
const MONTH_WORD = /\b(?<month>[A-Z][a-z]{2,8})\b/gu;
|
|
280
|
-
const ISO_DATE = /\b(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})\b/gu;
|
|
281
|
-
const DAY_BEFORE = /(?<d>\d{1,2})(?:st|nd|rd|th)? $/u;
|
|
282
|
-
const DAY_YEAR_AFTER = /^ (?<d>\d{1,2})(?:st|nd|rd|th)?,? (?<y>\d{4})\b/u;
|
|
283
|
-
const YEAR_AFTER = /^,? (?<y>\d{4})\b/u;
|
|
284
|
-
const pad = (value) => value.padStart(2, "0");
|
|
285
|
-
/** "1 April 2024": the day written before the month. */
|
|
286
|
-
const dayBefore = (text, at) => {
|
|
287
|
-
const found = DAY_BEFORE.exec(text.slice(Math.max(0, at - 6), at));
|
|
288
|
-
const day = found?.groups?.["d"];
|
|
289
|
-
return found === null || day === undefined ? undefined : { day, start: at - found[0].length };
|
|
290
|
-
};
|
|
291
|
-
/** "April 1, 2024" → 2024-04-01. */
|
|
292
|
-
const monthDayYear = (text, at, end, month) => {
|
|
293
|
-
const found = DAY_YEAR_AFTER.exec(text.slice(end, end + 16));
|
|
294
|
-
if (found?.groups === undefined)
|
|
295
|
-
return undefined;
|
|
296
|
-
const value = `${found.groups["y"] ?? ""}-${pad(String(month))}-${pad(found.groups["d"] ?? "")}`;
|
|
297
|
-
return { start: at, end: end + found[0].length, attrs: { value } };
|
|
298
|
-
};
|
|
299
|
-
/** "1 April 2024" → 2024-04-01, "April 2024" → 2024-04. */
|
|
300
|
-
const monthYear = (text, at, end, month) => {
|
|
301
|
-
const found = YEAR_AFTER.exec(text.slice(end, end + 8));
|
|
302
|
-
const year = found?.groups?.["y"];
|
|
303
|
-
if (found === null || year === undefined)
|
|
304
|
-
return undefined;
|
|
305
|
-
const before = dayBefore(text, at);
|
|
306
|
-
const value = [year, pad(String(month)), ...(before === undefined ? [] : [pad(before.day)])].join("-");
|
|
307
|
-
return { start: before?.start ?? at, end: end + found[0].length, attrs: { value } };
|
|
308
|
-
};
|
|
309
|
-
/**
|
|
310
|
-
* A month name alone is not a date: "May" is also the modal verb, so it counts only with a year beside it.
|
|
311
|
-
* The month is found first and its neighbours read with anchored patterns, never one long alternation.
|
|
312
|
-
*/
|
|
313
|
-
const namedDate = (text, match) => {
|
|
314
|
-
const month = MONTHS.indexOf((match.groups?.["month"] ?? "").toLowerCase()) + 1;
|
|
315
|
-
if (month === 0)
|
|
316
|
-
return undefined;
|
|
317
|
-
const end = match.index + match[0].length;
|
|
318
|
-
return monthDayYear(text, match.index, end, month) ?? monthYear(text, match.index, end, month);
|
|
319
|
-
};
|
|
320
|
-
const isoDate = (match) => ({
|
|
321
|
-
start: match.index,
|
|
322
|
-
end: match.index + match[0].length,
|
|
323
|
-
attrs: { value: `${match.groups?.["y"] ?? ""}-${match.groups?.["m"] ?? ""}-${match.groups?.["d"] ?? ""}` },
|
|
324
|
-
});
|
|
325
|
-
const dates = (text) => [...[...text.matchAll(MONTH_WORD)].flatMap((match) => namedDate(text, match) ?? []), ...[...text.matchAll(ISO_DATE)].map(isoDate)].sort((left, right) => left.start - right.start);
|
|
326
299
|
/** "2.5 days" and "1.5 times" are amounts, not section 2.5 titled "days". */
|
|
327
300
|
const countedAfter = (_number, rest) => unitAfter(` ${rest}`, 0) !== undefined;
|
|
328
|
-
export const structure = {
|
|
301
|
+
export const structure = {
|
|
302
|
+
numbered,
|
|
303
|
+
definitions,
|
|
304
|
+
references,
|
|
305
|
+
obligations,
|
|
306
|
+
quantities,
|
|
307
|
+
dates,
|
|
308
|
+
countedAfter,
|
|
309
|
+
opensDefinitionScope,
|
|
310
|
+
definitionScopeDepth,
|
|
311
|
+
};
|
|
329
312
|
//# sourceMappingURL=structure.js.map
|
package/dist/structure.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structure.js","sourceRoot":"","sources":["../src/structure.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"structure.js","sourceRoot":"","sources":["../src/structure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Words that mark a total line. A line (or a table's first column) starting with one is compared with the amounts above it.
|
|
2
|
+
id: total-label
|
|
3
|
+
language: en
|
|
4
|
+
entries:
|
|
5
|
+
- pattern: Total
|
|
6
|
+
- pattern: Subtotal
|
|
7
|
+
- pattern: Sub-total
|
|
8
|
+
- pattern: Grand total
|
|
9
|
+
- pattern: Sum
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# The names of the days, Sunday first. Used to say which day a date really falls on.
|
|
2
|
+
id: weekday
|
|
3
|
+
language: en
|
|
4
|
+
entries:
|
|
5
|
+
- pattern: Sunday
|
|
6
|
+
- pattern: Monday
|
|
7
|
+
- pattern: Tuesday
|
|
8
|
+
- pattern: Wednesday
|
|
9
|
+
- pattern: Thursday
|
|
10
|
+
- pattern: Friday
|
|
11
|
+
- pattern: Saturday
|
package/package.json
CHANGED
package/src/citation.ts
CHANGED
|
@@ -1,6 +1,48 @@
|
|
|
1
1
|
// A reference into another document: "Section 9 of the Master Agreement" is not this document's Section 9.
|
|
2
2
|
|
|
3
|
-
const OF = /^,? of (?:the )?/u;
|
|
3
|
+
const OF = /^,? of (?:the |that |those )?/u;
|
|
4
|
+
/** "section 4(2)(a) (exception to liability …) of the Damages (Scotland) Act 2011": the gloss sits between the number and the name. */
|
|
5
|
+
const GLOSS = /^ \([^()]{1,100}\)/u;
|
|
6
|
+
const CONNECTOR = /^(?:,? (?:to|and|or)|,) /u;
|
|
7
|
+
/** "9", "29(2)", "(g)", and a roman "V" for a list of Articles. The roman numeral must end the word: "VIII", not "Vendor". */
|
|
8
|
+
const LISTED_NUMBERS = [/^\d{1,3}[A-Z]{0,2}(?:\([a-z0-9]{1,4}\))*/u, /^(?:\([a-z0-9]{1,4}\))+/u, /^[IVXLC]{1,7}\b/u];
|
|
9
|
+
|
|
10
|
+
const listedNumber = (text: string): string | undefined => LISTED_NUMBERS.map((pattern) => pattern.exec(text)?.[0]).find((found) => found !== undefined);
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A listed number is a reference only where the list goes on or ends: "Sections 1, 2 and 9 of" or "Section 3 and 4." —
|
|
14
|
+
* not "Section 3 and 4 days", where the 4 counts days.
|
|
15
|
+
*/
|
|
16
|
+
const MEMBER_END = /^(?:$|[,;.:)]|\s(?:to|and|or|of)\b|\s\()/u;
|
|
17
|
+
|
|
18
|
+
export type ListMember = { readonly start: number; readonly text: string };
|
|
19
|
+
|
|
20
|
+
/** Every number listed after a reference, with where it ends. `start` is from the start of `rest`. */
|
|
21
|
+
const listed = (rest: string): (ListMember & { readonly end: number })[] => {
|
|
22
|
+
const found: (ListMember & { end: number })[] = [];
|
|
23
|
+
let end = 0;
|
|
24
|
+
for (;;) {
|
|
25
|
+
const connector = CONNECTOR.exec(rest.slice(end))?.[0];
|
|
26
|
+
const number = connector === undefined ? undefined : listedNumber(rest.slice(end + connector.length));
|
|
27
|
+
if (connector === undefined || number === undefined) return found;
|
|
28
|
+
const start = end + connector.length;
|
|
29
|
+
end = start + number.length;
|
|
30
|
+
found.push({ start, text: number, end });
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/** "Article 58(2)(c) to (g) and (j) of the UK GDPR": the list runs on to the name that governs all of it. */
|
|
35
|
+
const listEnd = (rest: string): number => listed(rest).at(-1)?.end ?? 0;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* The members after a reference, "2" and "9" in "Sections 1, 2 and 9". After a plural ("Sections") every listed number
|
|
39
|
+
* is one; after a singular ("Section 3 and 4 days") only one where the list goes on or ends.
|
|
40
|
+
*/
|
|
41
|
+
export const listMembers = (rest: string, plural: boolean): ListMember[] =>
|
|
42
|
+
listed(rest)
|
|
43
|
+
.filter((member) => plural || MEMBER_END.test(rest.slice(member.end)))
|
|
44
|
+
.map(({ start, text }) => ({ start, text }));
|
|
45
|
+
|
|
4
46
|
const CAPITALISED = /^[A-Z][\w'’-]*/u;
|
|
5
47
|
/**
|
|
6
48
|
* How a document names itself. "Section 3 of the Agreement" in an agreement means this one.
|
|
@@ -31,10 +73,12 @@ const titleWords = (rest: string): string[] => {
|
|
|
31
73
|
* "of this Agreement" and "of the Agreement" are this document; "of the Master Agreement" is another.
|
|
32
74
|
*/
|
|
33
75
|
export const citedDocumentAfter = (text: string, end: number): string | undefined => {
|
|
34
|
-
const rest = text.slice(end, end +
|
|
35
|
-
const
|
|
76
|
+
const rest = text.slice(end, end + 200);
|
|
77
|
+
const afterList = listEnd(rest);
|
|
78
|
+
const listed = afterList + (GLOSS.exec(rest.slice(afterList))?.[0].length ?? 0);
|
|
79
|
+
const of = OF.exec(rest.slice(listed));
|
|
36
80
|
if (of === null) return undefined;
|
|
37
|
-
const words = titleWords(rest.slice(of[0].length));
|
|
81
|
+
const words = titleWords(rest.slice(listed + of[0].length));
|
|
38
82
|
if (words.length === 0) return undefined;
|
|
39
83
|
const name = words.join(" ");
|
|
40
84
|
return words.length === 1 && SELF.has(name) ? undefined : name;
|
package/src/dates.ts
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { Mention } from "chaffjs/plugin";
|
|
2
|
+
|
|
3
|
+
// Dates in English text, and the weekday written beside one.
|
|
4
|
+
|
|
5
|
+
const MONTHS = ["january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"];
|
|
6
|
+
const MONTH_WORD = /\b(?<month>[A-Z][a-z]{2,8})\b/gu;
|
|
7
|
+
const ISO_DATE = /\b(?<y>\d{4})-(?<m>\d{2})-(?<d>\d{2})\b/gu;
|
|
8
|
+
const DAY_BEFORE = /(?<d>\d{1,2})(?:st|nd|rd|th)? $/u;
|
|
9
|
+
const DAY_YEAR_AFTER = /^ (?<d>\d{1,2})(?:st|nd|rd|th)?,? (?<y>\d{4})\b/u;
|
|
10
|
+
const YEAR_AFTER = /^,? (?<y>\d{4})\b/u;
|
|
11
|
+
|
|
12
|
+
const pad = (value: string): string => value.padStart(2, "0");
|
|
13
|
+
|
|
14
|
+
/** "1 April 2024": the day written before the month. */
|
|
15
|
+
const dayBefore = (text: string, at: number): { readonly day: string; readonly start: number } | undefined => {
|
|
16
|
+
const found = DAY_BEFORE.exec(text.slice(Math.max(0, at - 6), at));
|
|
17
|
+
const day = found?.groups?.["d"];
|
|
18
|
+
return found === null || day === undefined ? undefined : { day, start: at - found[0].length };
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/** "April 1, 2024" → 2024-04-01. */
|
|
22
|
+
const monthDayYear = (text: string, at: number, end: number, month: number): Mention | undefined => {
|
|
23
|
+
const found = DAY_YEAR_AFTER.exec(text.slice(end, end + 16));
|
|
24
|
+
if (found?.groups === undefined) return undefined;
|
|
25
|
+
const value = `${found.groups["y"] ?? ""}-${pad(String(month))}-${pad(found.groups["d"] ?? "")}`;
|
|
26
|
+
return { start: at, end: end + found[0].length, attrs: { value } };
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/** "1 April 2024" → 2024-04-01, "April 2024" → 2024-04. */
|
|
30
|
+
const monthYear = (text: string, at: number, end: number, month: number): Mention | undefined => {
|
|
31
|
+
const found = YEAR_AFTER.exec(text.slice(end, end + 8));
|
|
32
|
+
const year = found?.groups?.["y"];
|
|
33
|
+
if (found === null || year === undefined) return undefined;
|
|
34
|
+
const before = dayBefore(text, at);
|
|
35
|
+
const value = [year, pad(String(month)), ...(before === undefined ? [] : [pad(before.day)])].join("-");
|
|
36
|
+
return { start: before?.start ?? at, end: end + found[0].length, attrs: { value } };
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A month name alone is not a date: "May" is also the modal verb, so it counts only with a year beside it.
|
|
41
|
+
* The month is found first and its neighbours read with anchored patterns, never one long alternation.
|
|
42
|
+
*/
|
|
43
|
+
const namedDate = (text: string, match: RegExpExecArray): Mention | undefined => {
|
|
44
|
+
const month = MONTHS.indexOf((match.groups?.["month"] ?? "").toLowerCase()) + 1;
|
|
45
|
+
if (month === 0) return undefined;
|
|
46
|
+
const end = match.index + match[0].length;
|
|
47
|
+
return monthDayYear(text, match.index, end, month) ?? monthYear(text, match.index, end, month);
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const isoDate = (match: RegExpExecArray): Mention => ({
|
|
51
|
+
start: match.index,
|
|
52
|
+
end: match.index + match[0].length,
|
|
53
|
+
attrs: { value: `${match.groups?.["y"] ?? ""}-${match.groups?.["m"] ?? ""}-${match.groups?.["d"] ?? ""}` },
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
/** Day names and their usual abbreviations, Sunday first. */
|
|
57
|
+
const WEEKDAYS: readonly RegExp[] = [
|
|
58
|
+
/^sun(?:day)?$/iu,
|
|
59
|
+
/^mon(?:day)?$/iu,
|
|
60
|
+
/^tue(?:s|sday)?$/iu,
|
|
61
|
+
/^wed(?:nesday)?$/iu,
|
|
62
|
+
/^thu(?:r|rs|rsday)?$/iu,
|
|
63
|
+
/^fri(?:day)?$/iu,
|
|
64
|
+
/^sat(?:urday)?$/iu,
|
|
65
|
+
];
|
|
66
|
+
const DAY_WORD = "[A-Z][a-z]{2,8}";
|
|
67
|
+
const WEEKDAY_BEFORE = new RegExp(`(?<day>${DAY_WORD})\\.?,?\\s+$`, "u");
|
|
68
|
+
/** After the date, only a weekday in parentheses: "(Thursday)". A bare word there may start the next sentence ("Sat down"). */
|
|
69
|
+
const WEEKDAY_AFTER = new RegExp(`^,?\\s*\\((?<day>${DAY_WORD})\\)`, "u");
|
|
70
|
+
/**
|
|
71
|
+
* The end of a range or a pair, "1-3 October 2026", "1 to 3 October", "1 and 3 October": a weekday beside it could
|
|
72
|
+
* belong to either day, so it is not read.
|
|
73
|
+
*/
|
|
74
|
+
/** The number before the connecting word must be a day, not the end of a year ("1 October 2026 and 3 October 2026"). */
|
|
75
|
+
const RANGE_BEFORE = /(?<!\d)\d{1,2}(?:st|nd|rd|th)?\s*(?:[-–—]|to|through|until|till|and|or)\s*$/u;
|
|
76
|
+
|
|
77
|
+
const weekdayOf = (word: string | undefined): number | undefined => {
|
|
78
|
+
const index = word === undefined ? -1 : WEEKDAYS.findIndex((pattern) => pattern.test(word));
|
|
79
|
+
return index === -1 ? undefined : index;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/** The weekday written right before or after a date. Sunday is 0. */
|
|
83
|
+
const withWeekday = (text: string, date: Mention): Mention => {
|
|
84
|
+
if (RANGE_BEFORE.test(text.slice(Math.max(0, date.start - 14), date.start))) return date;
|
|
85
|
+
const before = weekdayOf(WEEKDAY_BEFORE.exec(text.slice(Math.max(0, date.start - 16), date.start))?.groups?.["day"]);
|
|
86
|
+
const weekday = before ?? weekdayOf(WEEKDAY_AFTER.exec(text.slice(date.end, date.end + 16))?.groups?.["day"]);
|
|
87
|
+
return weekday === undefined ? date : { ...date, attrs: { ...date.attrs, weekday } };
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
export const dates = (text: string): Mention[] =>
|
|
91
|
+
[...[...text.matchAll(MONTH_WORD)].flatMap((match) => namedDate(text, match) ?? []), ...[...text.matchAll(ISO_DATE)].map(isoDate)]
|
|
92
|
+
.sort((left, right) => left.start - right.start)
|
|
93
|
+
.map((date) => withWeekday(text, date));
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Mention } from "chaffjs/plugin";
|
|
2
|
+
import { CHAPTER_DEPTH, PART_DEPTH } from "./depth.ts";
|
|
3
|
+
|
|
4
|
+
// Definitions in English documents, and how far a definition holds.
|
|
5
|
+
|
|
6
|
+
const DEFINITIONS = [
|
|
7
|
+
/["“](?<term>[^"”\n]{1,60})["”] (?:means|shall mean|refers to|has the meaning)\b/gu,
|
|
8
|
+
/\((?:the |hereinafter )?["“](?<term>[^"”\n]{1,60})["”]\)/gu,
|
|
9
|
+
/\(hereinafter referred to as ["“](?<term>[^"”\n]{1,60})["”]\)/gu,
|
|
10
|
+
];
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* "In this Part—" and "This section applies where a person ("the seller")…": a statute defines the same word again
|
|
14
|
+
* in the next Part. A Part's definitions are compared within the Part, a section's within the section.
|
|
15
|
+
*/
|
|
16
|
+
const DEFINITION_SCOPE = /\b(?:In this (?:section|subsection|Part|Chapter|Schedule|Article)\b|This (?:section|Part|Chapter) defines\b)/u;
|
|
17
|
+
/** "This section applies where a person ("the seller") …" names a party in parentheses for this section only. */
|
|
18
|
+
const APPLIES = /\bThis section applies\b/u;
|
|
19
|
+
/** "In this Part" and "This Part defines" hold in the Part; "In this Chapter" in the Chapter; the rest in the section. */
|
|
20
|
+
const WIDER_SCOPE: readonly (readonly [RegExp, number])[] = [
|
|
21
|
+
[/\b(?:In this|This) Part\b/u, PART_DEPTH],
|
|
22
|
+
[/\b(?:In this|This) Chapter\b/u, CHAPTER_DEPTH],
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
export const opensDefinitionScope = (text: string): boolean => DEFINITION_SCOPE.test(text);
|
|
26
|
+
|
|
27
|
+
export const definitionScopeDepth = (text: string): number | undefined =>
|
|
28
|
+
DEFINITION_SCOPE.test(text) ? WIDER_SCOPE.find(([pattern]) => pattern.test(text))?.[1] : undefined;
|
|
29
|
+
|
|
30
|
+
/** "has the meaning given in section 3" points at a definition elsewhere instead of making one. */
|
|
31
|
+
const POINTER = /^ has the meaning given (?:in|by)\b/u;
|
|
32
|
+
const isPointer = (text: string, end: number): boolean => POINTER.test(text.slice(end - " has the meaning".length));
|
|
33
|
+
|
|
34
|
+
export const definitions = (text: string): Mention[] =>
|
|
35
|
+
DEFINITIONS.flatMap((pattern) =>
|
|
36
|
+
[...text.matchAll(pattern)].flatMap((match) => {
|
|
37
|
+
const term = match.groups?.["term"];
|
|
38
|
+
if (term === undefined) return [];
|
|
39
|
+
const end = match.index + match[0].length;
|
|
40
|
+
const namesAParty = match[0].startsWith("(") && APPLIES.test(text);
|
|
41
|
+
return [{ start: match.index, end, attrs: { term, ...(isPointer(text, end) || namesAParty ? { scope: "local" } : {}) } }];
|
|
42
|
+
}),
|
|
43
|
+
);
|
package/src/depth.ts
ADDED
package/src/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { split, SentenceSplitterSyntax } from "sentence-splitter";
|
|
2
1
|
import { loadLexicons } from "./lexicons.ts";
|
|
2
|
+
import { sentenceSpans } from "./sentence-split.ts";
|
|
3
3
|
import { structure } from "./structure.ts";
|
|
4
4
|
import { isReady, prepare, tokenize } from "./pos.ts";
|
|
5
5
|
import type { AdapterNeeds, LanguageAdapter, Segmentation, Sentence } from "chaffjs/plugin";
|
|
@@ -51,9 +51,7 @@ export const adapter: LanguageAdapter = {
|
|
|
51
51
|
lexicons: loadLexicons(),
|
|
52
52
|
structure,
|
|
53
53
|
segment: (text: string): Segmentation => {
|
|
54
|
-
const sentences: Sentence[] =
|
|
55
|
-
.filter((node) => node.type === SentenceSplitterSyntax.Sentence)
|
|
56
|
-
.map((node) => ({ span: { start: node.range[0], end: node.range[1] }, text: text.slice(node.range[0], node.range[1]) }));
|
|
54
|
+
const sentences: Sentence[] = sentenceSpans(text).map((span) => ({ span, text: text.slice(span.start, span.end) }));
|
|
57
55
|
return { sentences: isReady() ? sentences.map(withTokens) : sentences };
|
|
58
56
|
},
|
|
59
57
|
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { Mention } from "chaffjs/plugin";
|
|
2
|
+
import { listMembers } from "./citation.ts";
|
|
3
|
+
import { parseRoman } from "./roman.ts";
|
|
4
|
+
|
|
5
|
+
// The later members of a reference list: "Sections 1, 2 and 9" names Section 9 too.
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A member is a number, as in the reference itself ("45A" is not read there either), a roman numeral in a list that
|
|
9
|
+
* began with one ("Articles IV, V and VI"), or only parentheses.
|
|
10
|
+
*/
|
|
11
|
+
const MEMBER = /^(?:(?<main>\d{1,3})|(?<roman>[IVXLC]{1,7}))?(?<parens>(?:\([a-z0-9]{1,4}\))*)$/u;
|
|
12
|
+
const PAREN = /\(([a-z0-9]{1,4})\)/gu;
|
|
13
|
+
|
|
14
|
+
const isDigits = (part: string): boolean => /^\d+$/u.test(part);
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The part of the address before that a parenthesised member stands beside: the last one written the same way
|
|
18
|
+
* (digits with digits, letters with letters). 45.3.b and (5) → 45.5; 58.2.c and (g) → 58.2.g. The main number stays.
|
|
19
|
+
*/
|
|
20
|
+
const replaceLast = (previous: readonly string[] | undefined, parens: readonly string[]): string[] | undefined => {
|
|
21
|
+
const first = parens[0];
|
|
22
|
+
if (previous === undefined || first === undefined) return undefined;
|
|
23
|
+
const at = previous.findLastIndex((part, index) => index > 0 && isDigits(part) === isDigits(first));
|
|
24
|
+
return at === -1 ? undefined : [...previous.slice(0, at), ...parens];
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/** The main number of a member: digits as written, a roman numeral as its value, but only in a roman list. */
|
|
28
|
+
const mainOf = (groups: Readonly<Record<string, string | undefined>>, romanList: boolean): string | undefined => {
|
|
29
|
+
const roman = groups["roman"];
|
|
30
|
+
if (roman === undefined) return groups["main"];
|
|
31
|
+
const value = romanList ? parseRoman(roman) : undefined;
|
|
32
|
+
return value === undefined ? undefined : String(value);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/** A member's address, from the member before it when it is only parentheses. */
|
|
36
|
+
const addressOf = (member: string, previous: readonly string[] | undefined, romanList: boolean): string[] | undefined => {
|
|
37
|
+
const groups = MEMBER.exec(member)?.groups ?? {};
|
|
38
|
+
const parens = [...(groups["parens"] ?? "").matchAll(PAREN)].map((part) => part[1] ?? "");
|
|
39
|
+
const written = groups["main"] ?? groups["roman"];
|
|
40
|
+
if (written === undefined) return replaceLast(previous, parens);
|
|
41
|
+
const main = mainOf(groups, romanList);
|
|
42
|
+
return main === undefined ? undefined : [main, ...parens];
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* "Sections 1, 2 and 9" → 2 and 9 as references too, with the list's numbering and document (`shared`).
|
|
47
|
+
* `first` is the address of the reference that opens the list, and `end` where it ends in `text`.
|
|
48
|
+
*/
|
|
49
|
+
export const membersAfter = (
|
|
50
|
+
text: string,
|
|
51
|
+
end: number,
|
|
52
|
+
first: readonly string[],
|
|
53
|
+
shared: Readonly<Record<string, string>>,
|
|
54
|
+
plural: boolean,
|
|
55
|
+
romanList: boolean,
|
|
56
|
+
): Mention[] => {
|
|
57
|
+
const mentions: Mention[] = [];
|
|
58
|
+
let previous: readonly string[] | undefined = first;
|
|
59
|
+
listMembers(text.slice(end), plural).forEach((member) => {
|
|
60
|
+
previous = addressOf(member.text, previous, romanList);
|
|
61
|
+
if (previous === undefined) return;
|
|
62
|
+
const start = end + member.start;
|
|
63
|
+
mentions.push({ start, end: start + member.text.length, attrs: { target: previous.join("."), label: member.text, ...shared } });
|
|
64
|
+
});
|
|
65
|
+
return mentions;
|
|
66
|
+
};
|