@chaffjs/lang-en 0.6.0 → 0.7.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/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/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/structure.d.ts +0 -2
- package/dist/structure.d.ts.map +1 -1
- package/dist/structure.js +72 -42
- package/dist/structure.js.map +1 -1
- package/package.json +1 -1
- package/src/citation.ts +48 -4
- package/src/definitions.ts +43 -0
- package/src/depth.ts +3 -0
- package/src/reference-list.ts +66 -0
- package/src/roman.ts +9 -0
- package/src/structure.ts +75 -48
package/README.md
CHANGED
|
@@ -7,6 +7,6 @@ It provides:
|
|
|
7
7
|
- Sentence splitting (handles `Dr.`, `e.g.`, `U.S.`, `$3.50` without breaking the sentence)
|
|
8
8
|
- L2 lexicons (empty intensifiers, padded openings, cliched closings)
|
|
9
9
|
|
|
10
|
-
To add a language: official adapters are `@chaffjs
|
|
10
|
+
To add a language: official adapters are `@chaffjs/lang-<lang>`, third-party ones are `chaff-lang-<lang>` — the same split as `@typescript-eslint/*` and `eslint-plugin-*`.
|
|
11
11
|
|
|
12
12
|
MIT
|
package/dist/citation.d.ts
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
export type ListMember = {
|
|
2
|
+
readonly start: number;
|
|
3
|
+
readonly text: string;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* The members after a reference, "2" and "9" in "Sections 1, 2 and 9". After a plural ("Sections") every listed number
|
|
7
|
+
* is one; after a singular ("Section 3 and 4 days") only one where the list goes on or ends.
|
|
8
|
+
*/
|
|
9
|
+
export declare const listMembers: (rest: string, plural: boolean) => ListMember[];
|
|
1
10
|
/**
|
|
2
11
|
* The document named right after a reference, or undefined when the reference is into this document.
|
|
3
12
|
* "of this Agreement" and "of the Agreement" are this document; "of the Master Agreement" is another.
|
package/dist/citation.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"citation.d.ts","sourceRoot":"","sources":["../src/citation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"citation.d.ts","sourceRoot":"","sources":["../src/citation.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAmB3E;;;GAGG;AACH,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,EAAE,QAAQ,OAAO,KAAG,UAAU,EAGtB,CAAC;AA2BjD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,MAAM,MAAM,EAAE,KAAK,MAAM,KAAG,MAAM,GAAG,SAUvE,CAAC"}
|
package/dist/citation.js
CHANGED
|
@@ -1,5 +1,39 @@
|
|
|
1
1
|
// A reference into another document: "Section 9 of the Master Agreement" is not this document's Section 9.
|
|
2
|
-
const OF = /^,? of (?:the )?/u;
|
|
2
|
+
const OF = /^,? of (?:the |that |those )?/u;
|
|
3
|
+
/** "section 4(2)(a) (exception to liability …) of the Damages (Scotland) Act 2011": the gloss sits between the number and the name. */
|
|
4
|
+
const GLOSS = /^ \([^()]{1,100}\)/u;
|
|
5
|
+
const CONNECTOR = /^(?:,? (?:to|and|or)|,) /u;
|
|
6
|
+
/** "9", "29(2)", "(g)", and a roman "V" for a list of Articles. The roman numeral must end the word: "VIII", not "Vendor". */
|
|
7
|
+
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];
|
|
8
|
+
const listedNumber = (text) => LISTED_NUMBERS.map((pattern) => pattern.exec(text)?.[0]).find((found) => found !== undefined);
|
|
9
|
+
/**
|
|
10
|
+
* 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." —
|
|
11
|
+
* not "Section 3 and 4 days", where the 4 counts days.
|
|
12
|
+
*/
|
|
13
|
+
const MEMBER_END = /^(?:$|[,;.:)]|\s(?:to|and|or|of)\b|\s\()/u;
|
|
14
|
+
/** Every number listed after a reference, with where it ends. `start` is from the start of `rest`. */
|
|
15
|
+
const listed = (rest) => {
|
|
16
|
+
const found = [];
|
|
17
|
+
let end = 0;
|
|
18
|
+
for (;;) {
|
|
19
|
+
const connector = CONNECTOR.exec(rest.slice(end))?.[0];
|
|
20
|
+
const number = connector === undefined ? undefined : listedNumber(rest.slice(end + connector.length));
|
|
21
|
+
if (connector === undefined || number === undefined)
|
|
22
|
+
return found;
|
|
23
|
+
const start = end + connector.length;
|
|
24
|
+
end = start + number.length;
|
|
25
|
+
found.push({ start, text: number, end });
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
/** "Article 58(2)(c) to (g) and (j) of the UK GDPR": the list runs on to the name that governs all of it. */
|
|
29
|
+
const listEnd = (rest) => listed(rest).at(-1)?.end ?? 0;
|
|
30
|
+
/**
|
|
31
|
+
* The members after a reference, "2" and "9" in "Sections 1, 2 and 9". After a plural ("Sections") every listed number
|
|
32
|
+
* is one; after a singular ("Section 3 and 4 days") only one where the list goes on or ends.
|
|
33
|
+
*/
|
|
34
|
+
export const listMembers = (rest, plural) => listed(rest)
|
|
35
|
+
.filter((member) => plural || MEMBER_END.test(rest.slice(member.end)))
|
|
36
|
+
.map(({ start, text }) => ({ start, text }));
|
|
3
37
|
const CAPITALISED = /^[A-Z][\w'’-]*/u;
|
|
4
38
|
/**
|
|
5
39
|
* How a document names itself. "Section 3 of the Agreement" in an agreement means this one.
|
|
@@ -30,11 +64,13 @@ const titleWords = (rest) => {
|
|
|
30
64
|
* "of this Agreement" and "of the Agreement" are this document; "of the Master Agreement" is another.
|
|
31
65
|
*/
|
|
32
66
|
export const citedDocumentAfter = (text, end) => {
|
|
33
|
-
const rest = text.slice(end, end +
|
|
34
|
-
const
|
|
67
|
+
const rest = text.slice(end, end + 200);
|
|
68
|
+
const afterList = listEnd(rest);
|
|
69
|
+
const listed = afterList + (GLOSS.exec(rest.slice(afterList))?.[0].length ?? 0);
|
|
70
|
+
const of = OF.exec(rest.slice(listed));
|
|
35
71
|
if (of === null)
|
|
36
72
|
return undefined;
|
|
37
|
-
const words = titleWords(rest.slice(of[0].length));
|
|
73
|
+
const words = titleWords(rest.slice(listed + of[0].length));
|
|
38
74
|
if (words.length === 0)
|
|
39
75
|
return undefined;
|
|
40
76
|
const name = words.join(" ");
|
package/dist/citation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"citation.js","sourceRoot":"","sources":["../src/citation.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAE3G,MAAM,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"citation.js","sourceRoot":"","sources":["../src/citation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Mention } from "chaffjs/plugin";
|
|
2
|
+
export declare const opensDefinitionScope: (text: string) => boolean;
|
|
3
|
+
export declare const definitionScopeDepth: (text: string) => number | undefined;
|
|
4
|
+
export declare const definitions: (text: string) => Mention[];
|
|
5
|
+
//# sourceMappingURL=definitions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.d.ts","sourceRoot":"","sources":["../src/definitions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAwB9C,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,KAAG,OAAsC,CAAC;AAE3F,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,SACuC,CAAC;AAMrG,eAAO,MAAM,WAAW,GAAI,MAAM,MAAM,KAAG,OAAO,EAS/C,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { CHAPTER_DEPTH, PART_DEPTH } from "./depth.js";
|
|
2
|
+
// Definitions in English documents, and how far a definition holds.
|
|
3
|
+
const DEFINITIONS = [
|
|
4
|
+
/["“](?<term>[^"”\n]{1,60})["”] (?:means|shall mean|refers to|has the meaning)\b/gu,
|
|
5
|
+
/\((?:the |hereinafter )?["“](?<term>[^"”\n]{1,60})["”]\)/gu,
|
|
6
|
+
/\(hereinafter referred to as ["“](?<term>[^"”\n]{1,60})["”]\)/gu,
|
|
7
|
+
];
|
|
8
|
+
/**
|
|
9
|
+
* "In this Part—" and "This section applies where a person ("the seller")…": a statute defines the same word again
|
|
10
|
+
* in the next Part. A Part's definitions are compared within the Part, a section's within the section.
|
|
11
|
+
*/
|
|
12
|
+
const DEFINITION_SCOPE = /\b(?:In this (?:section|subsection|Part|Chapter|Schedule|Article)\b|This (?:section|Part|Chapter) defines\b)/u;
|
|
13
|
+
/** "This section applies where a person ("the seller") …" names a party in parentheses for this section only. */
|
|
14
|
+
const APPLIES = /\bThis section applies\b/u;
|
|
15
|
+
/** "In this Part" and "This Part defines" hold in the Part; "In this Chapter" in the Chapter; the rest in the section. */
|
|
16
|
+
const WIDER_SCOPE = [
|
|
17
|
+
[/\b(?:In this|This) Part\b/u, PART_DEPTH],
|
|
18
|
+
[/\b(?:In this|This) Chapter\b/u, CHAPTER_DEPTH],
|
|
19
|
+
];
|
|
20
|
+
export const opensDefinitionScope = (text) => DEFINITION_SCOPE.test(text);
|
|
21
|
+
export const definitionScopeDepth = (text) => DEFINITION_SCOPE.test(text) ? WIDER_SCOPE.find(([pattern]) => pattern.test(text))?.[1] : undefined;
|
|
22
|
+
/** "has the meaning given in section 3" points at a definition elsewhere instead of making one. */
|
|
23
|
+
const POINTER = /^ has the meaning given (?:in|by)\b/u;
|
|
24
|
+
const isPointer = (text, end) => POINTER.test(text.slice(end - " has the meaning".length));
|
|
25
|
+
export const definitions = (text) => DEFINITIONS.flatMap((pattern) => [...text.matchAll(pattern)].flatMap((match) => {
|
|
26
|
+
const term = match.groups?.["term"];
|
|
27
|
+
if (term === undefined)
|
|
28
|
+
return [];
|
|
29
|
+
const end = match.index + match[0].length;
|
|
30
|
+
const namesAParty = match[0].startsWith("(") && APPLIES.test(text);
|
|
31
|
+
return [{ start: match.index, end, attrs: { term, ...(isPointer(text, end) || namesAParty ? { scope: "local" } : {}) } }];
|
|
32
|
+
}));
|
|
33
|
+
//# sourceMappingURL=definitions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"definitions.js","sourceRoot":"","sources":["../src/definitions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvD,oEAAoE;AAEpE,MAAM,WAAW,GAAG;IAClB,mFAAmF;IACnF,4DAA4D;IAC5D,iEAAiE;CAClE,CAAC;AAEF;;;GAGG;AACH,MAAM,gBAAgB,GAAG,+GAA+G,CAAC;AACzI,iHAAiH;AACjH,MAAM,OAAO,GAAG,2BAA2B,CAAC;AAC5C,0HAA0H;AAC1H,MAAM,WAAW,GAA2C;IAC1D,CAAC,4BAA4B,EAAE,UAAU,CAAC;IAC1C,CAAC,+BAA+B,EAAE,aAAa,CAAC;CACjD,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE3F,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,IAAY,EAAsB,EAAE,CACvE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AAErG,mGAAmG;AACnG,MAAM,OAAO,GAAG,sCAAsC,CAAC;AACvD,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,GAAW,EAAW,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;AAEpH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAa,EAAE,CACrD,WAAW,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC9B,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IAClC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1C,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC5H,CAAC,CAAC,CACH,CAAC"}
|
package/dist/depth.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"depth.d.ts","sourceRoot":"","sources":["../src/depth.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,eAAO,MAAM,UAAU,KAAK,CAAC;AAC7B,eAAO,MAAM,aAAa,KAAK,CAAC"}
|
package/dist/depth.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"depth.js","sourceRoot":"","sources":["../src/depth.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC;AAC7B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Mention } from "chaffjs/plugin";
|
|
2
|
+
/**
|
|
3
|
+
* "Sections 1, 2 and 9" → 2 and 9 as references too, with the list's numbering and document (`shared`).
|
|
4
|
+
* `first` is the address of the reference that opens the list, and `end` where it ends in `text`.
|
|
5
|
+
*/
|
|
6
|
+
export declare const membersAfter: (text: string, end: number, first: readonly string[], shared: Readonly<Record<string, string>>, plural: boolean, romanList: boolean) => Mention[];
|
|
7
|
+
//# sourceMappingURL=reference-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-list.d.ts","sourceRoot":"","sources":["../src/reference-list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AA4C9C;;;GAGG;AACH,eAAO,MAAM,YAAY,GACvB,MAAM,MAAM,EACZ,KAAK,MAAM,EACX,OAAO,SAAS,MAAM,EAAE,EACxB,QAAQ,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACxC,QAAQ,OAAO,EACf,WAAW,OAAO,KACjB,OAAO,EAUT,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { listMembers } from "./citation.js";
|
|
2
|
+
import { parseRoman } from "./roman.js";
|
|
3
|
+
// The later members of a reference list: "Sections 1, 2 and 9" names Section 9 too.
|
|
4
|
+
/**
|
|
5
|
+
* A member is a number, as in the reference itself ("45A" is not read there either), a roman numeral in a list that
|
|
6
|
+
* began with one ("Articles IV, V and VI"), or only parentheses.
|
|
7
|
+
*/
|
|
8
|
+
const MEMBER = /^(?:(?<main>\d{1,3})|(?<roman>[IVXLC]{1,7}))?(?<parens>(?:\([a-z0-9]{1,4}\))*)$/u;
|
|
9
|
+
const PAREN = /\(([a-z0-9]{1,4})\)/gu;
|
|
10
|
+
const isDigits = (part) => /^\d+$/u.test(part);
|
|
11
|
+
/**
|
|
12
|
+
* The part of the address before that a parenthesised member stands beside: the last one written the same way
|
|
13
|
+
* (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.
|
|
14
|
+
*/
|
|
15
|
+
const replaceLast = (previous, parens) => {
|
|
16
|
+
const first = parens[0];
|
|
17
|
+
if (previous === undefined || first === undefined)
|
|
18
|
+
return undefined;
|
|
19
|
+
const at = previous.findLastIndex((part, index) => index > 0 && isDigits(part) === isDigits(first));
|
|
20
|
+
return at === -1 ? undefined : [...previous.slice(0, at), ...parens];
|
|
21
|
+
};
|
|
22
|
+
/** The main number of a member: digits as written, a roman numeral as its value, but only in a roman list. */
|
|
23
|
+
const mainOf = (groups, romanList) => {
|
|
24
|
+
const roman = groups["roman"];
|
|
25
|
+
if (roman === undefined)
|
|
26
|
+
return groups["main"];
|
|
27
|
+
const value = romanList ? parseRoman(roman) : undefined;
|
|
28
|
+
return value === undefined ? undefined : String(value);
|
|
29
|
+
};
|
|
30
|
+
/** A member's address, from the member before it when it is only parentheses. */
|
|
31
|
+
const addressOf = (member, previous, romanList) => {
|
|
32
|
+
const groups = MEMBER.exec(member)?.groups ?? {};
|
|
33
|
+
const parens = [...(groups["parens"] ?? "").matchAll(PAREN)].map((part) => part[1] ?? "");
|
|
34
|
+
const written = groups["main"] ?? groups["roman"];
|
|
35
|
+
if (written === undefined)
|
|
36
|
+
return replaceLast(previous, parens);
|
|
37
|
+
const main = mainOf(groups, romanList);
|
|
38
|
+
return main === undefined ? undefined : [main, ...parens];
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* "Sections 1, 2 and 9" → 2 and 9 as references too, with the list's numbering and document (`shared`).
|
|
42
|
+
* `first` is the address of the reference that opens the list, and `end` where it ends in `text`.
|
|
43
|
+
*/
|
|
44
|
+
export const membersAfter = (text, end, first, shared, plural, romanList) => {
|
|
45
|
+
const mentions = [];
|
|
46
|
+
let previous = first;
|
|
47
|
+
listMembers(text.slice(end), plural).forEach((member) => {
|
|
48
|
+
previous = addressOf(member.text, previous, romanList);
|
|
49
|
+
if (previous === undefined)
|
|
50
|
+
return;
|
|
51
|
+
const start = end + member.start;
|
|
52
|
+
mentions.push({ start, end: start + member.text.length, attrs: { target: previous.join("."), label: member.text, ...shared } });
|
|
53
|
+
});
|
|
54
|
+
return mentions;
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=reference-list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-list.js","sourceRoot":"","sources":["../src/reference-list.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,oFAAoF;AAEpF;;;GAGG;AACH,MAAM,MAAM,GAAG,kFAAkF,CAAC;AAClG,MAAM,KAAK,GAAG,uBAAuB,CAAC;AAEtC,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,GAAG,CAAC,QAAuC,EAAE,MAAyB,EAAwB,EAAE;IAC/G,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACpE,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IACpG,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC;AACvE,CAAC,CAAC;AAEF,8GAA8G;AAC9G,MAAM,MAAM,GAAG,CAAC,MAAoD,EAAE,SAAkB,EAAsB,EAAE;IAC9G,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF,iFAAiF;AACjF,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,QAAuC,EAAE,SAAkB,EAAwB,EAAE;IACtH,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACvC,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC;AAC5D,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,IAAY,EACZ,GAAW,EACX,KAAwB,EACxB,MAAwC,EACxC,MAAe,EACf,SAAkB,EACP,EAAE;IACb,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,QAAQ,GAAkC,KAAK,CAAC;IACpD,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACtD,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACvD,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO;QACnC,MAAM,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;QACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC;IAClI,CAAC,CAAC,CAAC;IACH,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC"}
|
package/dist/roman.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roman.d.ts","sourceRoot":"","sources":["../src/roman.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,KAAG,MAAM,GAAG,SAKlD,CAAC"}
|
package/dist/roman.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const ROMAN = { i: 1, v: 5, x: 10, l: 50, c: 100 };
|
|
2
|
+
/** "IV" → 4, "xii" → 12. Undefined for anything that is not a roman numeral. */
|
|
3
|
+
export const parseRoman = (text) => {
|
|
4
|
+
const values = [...text.toLowerCase()].map((char) => ROMAN[char]);
|
|
5
|
+
if (values.length === 0 || values.some((value) => value === undefined))
|
|
6
|
+
return undefined;
|
|
7
|
+
const known = values.filter((value) => value !== undefined);
|
|
8
|
+
return known.reduce((total, value, index) => ((known[index + 1] ?? 0) > value ? total - value : total + value), 0);
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=roman.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roman.js","sourceRoot":"","sources":["../src/roman.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAqC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;AAErF,gFAAgF;AAChF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAsB,EAAE;IAC7D,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAClE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IACzF,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC;IAC5D,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACrH,CAAC,CAAC"}
|
package/dist/structure.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
1
|
import type { StructurePatterns } from "chaffjs/plugin";
|
|
2
|
-
/** "IV" → 4, "xii" → 12. Undefined for anything that is not a roman numeral. */
|
|
3
|
-
export declare const parseRoman: (text: string) => number | undefined;
|
|
4
2
|
export declare const structure: StructurePatterns;
|
|
5
3
|
//# sourceMappingURL=structure.d.ts.map
|
package/dist/structure.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../src/structure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2C,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../src/structure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2C,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AA8XjG,eAAO,MAAM,SAAS,EAAE,iBAUvB,CAAC"}
|
package/dist/structure.js
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
import { citedDocumentAfter } from "./citation.js";
|
|
2
|
+
import { membersAfter } from "./reference-list.js";
|
|
3
|
+
import { parseRoman } from "./roman.js";
|
|
4
|
+
import { definitionScopeDepth, definitions, opensDefinitionScope } from "./definitions.js";
|
|
5
|
+
import { CHAPTER_DEPTH, PART_DEPTH } from "./depth.js";
|
|
2
6
|
// Contracts, specifications and statutes in English. core nests what this reads; it does not know
|
|
3
7
|
// 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
8
|
const numberOf = (text) => {
|
|
14
9
|
if (text === undefined)
|
|
15
10
|
return undefined;
|
|
@@ -30,9 +25,15 @@ const titleOf = (rest) => {
|
|
|
30
25
|
};
|
|
31
26
|
const ARTICLE = /^\s{0,3}(?:ARTICLE|Article)\s+(?<n>\d{1,3}|[IVXLC]{1,7})\b(?<rest>.*)$/u;
|
|
32
27
|
const SECTION = /^\s{0,3}(?:SECTION|Section|§)\s*(?<n>\d{1,3}(?:\.\d{1,3}){0,5})\b(?<rest>.*)$/u;
|
|
33
|
-
|
|
28
|
+
/**
|
|
29
|
+
* An amendment inserts a subsection between two others and numbers it "(A1)" or "(2A)". It is a subsection, written
|
|
30
|
+
* outside the sequence: it has no ordinal, so "(1)" after "(A1)" is still the first.
|
|
31
|
+
*/
|
|
32
|
+
const INSERTED = "\\d{1,3}[A-Z]{1,2}|[A-Z]{1,2}\\d{1,3}";
|
|
33
|
+
const LETTERED = new RegExp(`^\\s{0,6}\\((?<n>[a-z]{1,4}|\\d{1,3}|${INSERTED})\\)\\s+(?<rest>\\S.*)$`, "u");
|
|
34
|
+
const IS_INSERTED = new RegExp(`^(?:${INSERTED})$`, "u");
|
|
34
35
|
const MULTI_ROMAN = /^(?:ii|iii|iv|vi|vii|viii|ix)$/u;
|
|
35
|
-
const headed = (pattern, line, label) => {
|
|
36
|
+
const headed = (pattern, line, numbering, label) => {
|
|
36
37
|
const groups = pattern.exec(line)?.groups;
|
|
37
38
|
const number = numberOf(groups?.["n"]);
|
|
38
39
|
const heading = titleOf(groups?.["rest"] ?? "");
|
|
@@ -48,6 +49,7 @@ const headed = (pattern, line, label) => {
|
|
|
48
49
|
heading,
|
|
49
50
|
rest: heading,
|
|
50
51
|
ordinal: Number(parts.at(-1)),
|
|
52
|
+
numbering,
|
|
51
53
|
};
|
|
52
54
|
};
|
|
53
55
|
/**
|
|
@@ -55,10 +57,10 @@ const headed = (pattern, line, label) => {
|
|
|
55
57
|
* 開いたときの読みを覚えておく代わりに、一つ上に英字が開いていたかで決め直す。
|
|
56
58
|
*/
|
|
57
59
|
const styleOfLabel = (open, index, all) => {
|
|
58
|
-
const inner = /^\((?<n>[
|
|
60
|
+
const inner = /^\((?<n>[A-Za-z0-9]{1,5})\)$/u.exec(open.label)?.groups?.["n"];
|
|
59
61
|
if (inner === undefined)
|
|
60
62
|
return undefined;
|
|
61
|
-
if (/^\d+$/u.test(inner))
|
|
63
|
+
if (/^\d+$/u.test(inner) || IS_INSERTED.test(inner))
|
|
62
64
|
return "digit";
|
|
63
65
|
if (MULTI_ROMAN.test(inner))
|
|
64
66
|
return "roman";
|
|
@@ -70,7 +72,7 @@ const styles = (context) => context.open.map((open, index, all) => styleOfLabel(
|
|
|
70
72
|
const followsLetter = (raw, context) => context.open.some((open, index) => styles(context)[index] === "letter" && open.number.charCodeAt(0) + 1 === raw.charCodeAt(0));
|
|
71
73
|
/** "(i)" is a roman numeral right under "(a)", or when a roman list is already open; the letter i otherwise. */
|
|
72
74
|
const styleOf = (raw, context) => {
|
|
73
|
-
if (/^\d+$/u.test(raw))
|
|
75
|
+
if (/^\d+$/u.test(raw) || IS_INSERTED.test(raw))
|
|
74
76
|
return "digit";
|
|
75
77
|
if (MULTI_ROMAN.test(raw))
|
|
76
78
|
return "roman";
|
|
@@ -92,7 +94,7 @@ const LETTER_BEFORE_A = "a".charCodeAt(0) - 1;
|
|
|
92
94
|
/** "(b)" は 2 番目、"(ii)" も 2 番目。二文字以上の英字("(aa)")は並びが決まらないので付けない。 */
|
|
93
95
|
const ordinalOf = (raw, style) => {
|
|
94
96
|
if (style === "digit")
|
|
95
|
-
return Number(raw);
|
|
97
|
+
return IS_INSERTED.test(raw) ? undefined : Number(raw);
|
|
96
98
|
if (style === "roman")
|
|
97
99
|
return parseRoman(raw);
|
|
98
100
|
return raw.length === 1 ? raw.charCodeAt(0) - LETTER_BEFORE_A : undefined;
|
|
@@ -127,23 +129,16 @@ const chapter = (pattern, line, depth, prefix, word) => {
|
|
|
127
129
|
const label = `${word} ${groups["n"] ?? ""}`;
|
|
128
130
|
return { kind: "chapter", depth, number: prefix + number, absolute: false, label, heading, rest: heading, ordinal: Number(number) };
|
|
129
131
|
};
|
|
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}`) ??
|
|
132
|
+
const numbered = (line, context) => chapter(PART, line, PART_DEPTH, "pt", "Part") ??
|
|
133
|
+
chapter(CHAPTER, line, CHAPTER_DEPTH, "ch", "Chapter") ??
|
|
134
|
+
headed(ARTICLE, line, "article", (n) => `Article ${n}`) ??
|
|
135
|
+
headed(SECTION, line, "section", (n) => `Section ${n}`) ??
|
|
134
136
|
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;
|
|
137
|
+
const REFERENCE = /(?<word>\b[Ss]ections?|\b[Aa]rticles?|§) ?(?<n>\d{1,3}(?:\.\d{1,3}){0,5}|[IVXLC]{1,7})\b/gu;
|
|
138
|
+
/** "(a)", "(ii)", "(3)", and an inserted "(A1)" or "(2A)": the same labels the tree reads. */
|
|
139
|
+
const SUBDIVISION = new RegExp(`^\\((?<p>[a-z0-9]{1,4}|${INSERTED})\\)`, "u");
|
|
140
|
+
/** The longest label, with its parentheses: "(ZZ999)". */
|
|
141
|
+
const MAX_SUBDIVISION_LENGTH = 7;
|
|
147
142
|
/** "(a)(ii)(3)" is as deep as a reference goes; more parentheses are text, not a deeper address. */
|
|
148
143
|
const MAX_SUBDIVISIONS = 4;
|
|
149
144
|
/**
|
|
@@ -154,7 +149,7 @@ const subdivisions = (text, from) => {
|
|
|
154
149
|
const parts = [];
|
|
155
150
|
let end = from;
|
|
156
151
|
while (parts.length < MAX_SUBDIVISIONS) {
|
|
157
|
-
const part = SUBDIVISION.exec(text.slice(end, end +
|
|
152
|
+
const part = SUBDIVISION.exec(text.slice(end, end + MAX_SUBDIVISION_LENGTH))?.groups?.["p"];
|
|
158
153
|
if (part === undefined)
|
|
159
154
|
break;
|
|
160
155
|
parts.push(part);
|
|
@@ -162,19 +157,44 @@ const subdivisions = (text, from) => {
|
|
|
162
157
|
}
|
|
163
158
|
return { parts, end };
|
|
164
159
|
};
|
|
160
|
+
/** Parentheses opened and not yet closed in `between`. */
|
|
161
|
+
const PAREN_STEP = { "(": 1, ")": -1 };
|
|
162
|
+
const advance = (gloss, text, to) => {
|
|
163
|
+
for (let index = gloss.scanned; index < to; index += 1) {
|
|
164
|
+
gloss.depth += PAREN_STEP[text[index] ?? ""] ?? 0;
|
|
165
|
+
while ((gloss.anchors.at(-1)?.depth ?? -Infinity) > gloss.depth)
|
|
166
|
+
gloss.anchors.pop();
|
|
167
|
+
}
|
|
168
|
+
gloss.scanned = Math.max(gloss.scanned, to);
|
|
169
|
+
};
|
|
170
|
+
const glossedDocument = (gloss) => {
|
|
171
|
+
const anchor = gloss.anchors.at(-1);
|
|
172
|
+
return anchor !== undefined && gloss.depth > anchor.depth ? anchor.document : undefined;
|
|
173
|
+
};
|
|
165
174
|
/**
|
|
166
175
|
* "Section 4.2(a)" → 4.2.a, "Article III" → 3. The same addresses the tree gives.
|
|
167
176
|
* "Section 9 of the Master Agreement" carries the other document's name, and is not looked up in this tree.
|
|
168
177
|
*/
|
|
169
|
-
const references = (text) =>
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
+
const references = (text) => {
|
|
179
|
+
const gloss = { depth: 0, scanned: 0, anchors: [] };
|
|
180
|
+
return [...text.matchAll(REFERENCE)].flatMap((match) => {
|
|
181
|
+
const main = numberOf(match.groups?.["n"]);
|
|
182
|
+
if (main === undefined)
|
|
183
|
+
return [];
|
|
184
|
+
const { parts, end } = subdivisions(text, match.index + match[0].length);
|
|
185
|
+
advance(gloss, text, match.index);
|
|
186
|
+
const cited = citedDocumentAfter(text, end);
|
|
187
|
+
const document = cited ?? glossedDocument(gloss);
|
|
188
|
+
gloss.scanned = Math.max(gloss.scanned, end);
|
|
189
|
+
if (cited !== undefined)
|
|
190
|
+
gloss.anchors.push({ document: cited, depth: gloss.depth });
|
|
191
|
+
const numbering = /^[Aa]/u.test(match.groups?.["word"] ?? "") ? "article" : "section";
|
|
192
|
+
const shared = { numbering, ...(document === undefined ? {} : { document }) };
|
|
193
|
+
const first = { start: match.index, end, attrs: { target: [main, ...parts].join("."), label: text.slice(match.index, end), ...shared } };
|
|
194
|
+
const [plural, roman] = [/s$/u.test(match.groups?.["word"] ?? ""), /^[IVXLC]+$/u.test(match.groups?.["n"] ?? "")];
|
|
195
|
+
return [first, ...membersAfter(text, end, [main, ...parts], shared, plural, roman)];
|
|
196
|
+
});
|
|
197
|
+
};
|
|
178
198
|
/** Longest first, and never inside a word: "shall not" is not also "shall", "mayor" is not "may". */
|
|
179
199
|
const MARKERS = [
|
|
180
200
|
["is required to", "must"],
|
|
@@ -325,5 +345,15 @@ const isoDate = (match) => ({
|
|
|
325
345
|
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
346
|
/** "2.5 days" and "1.5 times" are amounts, not section 2.5 titled "days". */
|
|
327
347
|
const countedAfter = (_number, rest) => unitAfter(` ${rest}`, 0) !== undefined;
|
|
328
|
-
export const structure = {
|
|
348
|
+
export const structure = {
|
|
349
|
+
numbered,
|
|
350
|
+
definitions,
|
|
351
|
+
references,
|
|
352
|
+
obligations,
|
|
353
|
+
quantities,
|
|
354
|
+
dates,
|
|
355
|
+
countedAfter,
|
|
356
|
+
opensDefinitionScope,
|
|
357
|
+
definitionScopeDepth,
|
|
358
|
+
};
|
|
329
359
|
//# 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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"}
|
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;
|
|
@@ -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
|
@@ -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
|
+
};
|
package/src/roman.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const ROMAN: Readonly<Record<string, number>> = { i: 1, v: 5, x: 10, l: 50, c: 100 };
|
|
2
|
+
|
|
3
|
+
/** "IV" → 4, "xii" → 12. Undefined for anything that is not a roman numeral. */
|
|
4
|
+
export const parseRoman = (text: string): number | undefined => {
|
|
5
|
+
const values = [...text.toLowerCase()].map((char) => ROMAN[char]);
|
|
6
|
+
if (values.length === 0 || values.some((value) => value === undefined)) return undefined;
|
|
7
|
+
const known = values.filter((value) => value !== undefined);
|
|
8
|
+
return known.reduce((total, value, index) => ((known[index + 1] ?? 0) > value ? total - value : total + value), 0);
|
|
9
|
+
};
|
package/src/structure.ts
CHANGED
|
@@ -1,19 +1,13 @@
|
|
|
1
1
|
import type { Mention, NumberedLine, NumberingContext, StructurePatterns } from "chaffjs/plugin";
|
|
2
2
|
import { citedDocumentAfter } from "./citation.ts";
|
|
3
|
+
import { membersAfter } from "./reference-list.ts";
|
|
4
|
+
import { parseRoman } from "./roman.ts";
|
|
5
|
+
import { definitionScopeDepth, definitions, opensDefinitionScope } from "./definitions.ts";
|
|
6
|
+
import { CHAPTER_DEPTH, PART_DEPTH } from "./depth.ts";
|
|
3
7
|
|
|
4
8
|
// Contracts, specifications and statutes in English. core nests what this reads; it does not know
|
|
5
9
|
// how English numbers its articles.
|
|
6
10
|
|
|
7
|
-
const ROMAN: Readonly<Record<string, number>> = { i: 1, v: 5, x: 10, l: 50, c: 100 };
|
|
8
|
-
|
|
9
|
-
/** "IV" → 4, "xii" → 12. Undefined for anything that is not a roman numeral. */
|
|
10
|
-
export const parseRoman = (text: string): number | undefined => {
|
|
11
|
-
const values = [...text.toLowerCase()].map((char) => ROMAN[char]);
|
|
12
|
-
if (values.length === 0 || values.some((value) => value === undefined)) return undefined;
|
|
13
|
-
const known = values.filter((value) => value !== undefined);
|
|
14
|
-
return known.reduce((total, value, index) => ((known[index + 1] ?? 0) > value ? total - value : total + value), 0);
|
|
15
|
-
};
|
|
16
|
-
|
|
17
11
|
const numberOf = (text: string | undefined): string | undefined => {
|
|
18
12
|
if (text === undefined) return undefined;
|
|
19
13
|
if (/^\d{1,3}(?:\.\d{1,3}){0,5}$/u.test(text)) return text;
|
|
@@ -33,10 +27,16 @@ const titleOf = (rest: string): string | undefined => {
|
|
|
33
27
|
|
|
34
28
|
const ARTICLE = /^\s{0,3}(?:ARTICLE|Article)\s+(?<n>\d{1,3}|[IVXLC]{1,7})\b(?<rest>.*)$/u;
|
|
35
29
|
const SECTION = /^\s{0,3}(?:SECTION|Section|§)\s*(?<n>\d{1,3}(?:\.\d{1,3}){0,5})\b(?<rest>.*)$/u;
|
|
36
|
-
|
|
30
|
+
/**
|
|
31
|
+
* An amendment inserts a subsection between two others and numbers it "(A1)" or "(2A)". It is a subsection, written
|
|
32
|
+
* outside the sequence: it has no ordinal, so "(1)" after "(A1)" is still the first.
|
|
33
|
+
*/
|
|
34
|
+
const INSERTED = "\\d{1,3}[A-Z]{1,2}|[A-Z]{1,2}\\d{1,3}";
|
|
35
|
+
const LETTERED = new RegExp(`^\\s{0,6}\\((?<n>[a-z]{1,4}|\\d{1,3}|${INSERTED})\\)\\s+(?<rest>\\S.*)$`, "u");
|
|
36
|
+
const IS_INSERTED = new RegExp(`^(?:${INSERTED})$`, "u");
|
|
37
37
|
const MULTI_ROMAN = /^(?:ii|iii|iv|vi|vii|viii|ix)$/u;
|
|
38
38
|
|
|
39
|
-
const headed = (pattern: RegExp, line: string, label: (n: string) => string): NumberedLine | undefined => {
|
|
39
|
+
const headed = (pattern: RegExp, line: string, numbering: string, label: (n: string) => string): NumberedLine | undefined => {
|
|
40
40
|
const groups = pattern.exec(line)?.groups;
|
|
41
41
|
const number = numberOf(groups?.["n"]);
|
|
42
42
|
const heading = titleOf(groups?.["rest"] ?? "");
|
|
@@ -51,6 +51,7 @@ const headed = (pattern: RegExp, line: string, label: (n: string) => string): Nu
|
|
|
51
51
|
heading,
|
|
52
52
|
rest: heading,
|
|
53
53
|
ordinal: Number(parts.at(-1)),
|
|
54
|
+
numbering,
|
|
54
55
|
};
|
|
55
56
|
};
|
|
56
57
|
|
|
@@ -61,9 +62,9 @@ type Style = "letter" | "roman" | "digit";
|
|
|
61
62
|
* 開いたときの読みを覚えておく代わりに、一つ上に英字が開いていたかで決め直す。
|
|
62
63
|
*/
|
|
63
64
|
const styleOfLabel = (open: NumberedLine, index: number, all: readonly NumberedLine[]): Style | undefined => {
|
|
64
|
-
const inner = /^\((?<n>[
|
|
65
|
+
const inner = /^\((?<n>[A-Za-z0-9]{1,5})\)$/u.exec(open.label)?.groups?.["n"];
|
|
65
66
|
if (inner === undefined) return undefined;
|
|
66
|
-
if (/^\d+$/u.test(inner)) return "digit";
|
|
67
|
+
if (/^\d+$/u.test(inner) || IS_INSERTED.test(inner)) return "digit";
|
|
67
68
|
if (MULTI_ROMAN.test(inner)) return "roman";
|
|
68
69
|
const above = all[index - 1];
|
|
69
70
|
return /^[ivx]$/u.test(inner) && above !== undefined && styleOfLabel(above, index - 1, all) === "letter" && above.depth < open.depth ? "roman" : "letter";
|
|
@@ -77,7 +78,7 @@ const followsLetter = (raw: string, context: NumberingContext): boolean =>
|
|
|
77
78
|
|
|
78
79
|
/** "(i)" is a roman numeral right under "(a)", or when a roman list is already open; the letter i otherwise. */
|
|
79
80
|
const styleOf = (raw: string, context: NumberingContext): Style => {
|
|
80
|
-
if (/^\d+$/u.test(raw)) return "digit";
|
|
81
|
+
if (/^\d+$/u.test(raw) || IS_INSERTED.test(raw)) return "digit";
|
|
81
82
|
if (MULTI_ROMAN.test(raw)) return "roman";
|
|
82
83
|
if (!/^[ivx]$/u.test(raw) || followsLetter(raw, context)) return "letter";
|
|
83
84
|
const open = styles(context);
|
|
@@ -98,7 +99,7 @@ const LETTER_BEFORE_A = "a".charCodeAt(0) - 1;
|
|
|
98
99
|
|
|
99
100
|
/** "(b)" は 2 番目、"(ii)" も 2 番目。二文字以上の英字("(aa)")は並びが決まらないので付けない。 */
|
|
100
101
|
const ordinalOf = (raw: string, style: Style): number | undefined => {
|
|
101
|
-
if (style === "digit") return Number(raw);
|
|
102
|
+
if (style === "digit") return IS_INSERTED.test(raw) ? undefined : Number(raw);
|
|
102
103
|
if (style === "roman") return parseRoman(raw);
|
|
103
104
|
return raw.length === 1 ? raw.charCodeAt(0) - LETTER_BEFORE_A : undefined;
|
|
104
105
|
};
|
|
@@ -135,33 +136,17 @@ const chapter = (pattern: RegExp, line: string, depth: number, prefix: string, w
|
|
|
135
136
|
};
|
|
136
137
|
|
|
137
138
|
const numbered = (line: string, context: NumberingContext): NumberedLine | undefined =>
|
|
138
|
-
chapter(PART, line,
|
|
139
|
-
chapter(CHAPTER, line,
|
|
140
|
-
headed(ARTICLE, line, (n) => `Article ${n}`) ??
|
|
141
|
-
headed(SECTION, line, (n) => `Section ${n}`) ??
|
|
139
|
+
chapter(PART, line, PART_DEPTH, "pt", "Part") ??
|
|
140
|
+
chapter(CHAPTER, line, CHAPTER_DEPTH, "ch", "Chapter") ??
|
|
141
|
+
headed(ARTICLE, line, "article", (n) => `Article ${n}`) ??
|
|
142
|
+
headed(SECTION, line, "section", (n) => `Section ${n}`) ??
|
|
142
143
|
lettered(line, context);
|
|
143
144
|
|
|
144
|
-
const
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
[...text.matchAll(pattern)].flatMap((match) => {
|
|
150
|
-
const found = attrs(match.groups ?? {}, match[0]);
|
|
151
|
-
return found === undefined ? [] : [{ start: match.index, end: match.index + match[0].length, attrs: found }];
|
|
152
|
-
});
|
|
153
|
-
|
|
154
|
-
const DEFINITIONS = [
|
|
155
|
-
/["“](?<term>[^"”\n]{1,60})["”] (?:means|shall mean|refers to|has the meaning)\b/gu,
|
|
156
|
-
/\((?:the |hereinafter )?["“](?<term>[^"”\n]{1,60})["”]\)/gu,
|
|
157
|
-
/\(hereinafter referred to as ["“](?<term>[^"”\n]{1,60})["”]\)/gu,
|
|
158
|
-
];
|
|
159
|
-
|
|
160
|
-
const definitions = (text: string): Mention[] =>
|
|
161
|
-
DEFINITIONS.flatMap((pattern) => mentions(pattern, text, (groups) => (groups["term"] === undefined ? undefined : { term: groups["term"] })));
|
|
162
|
-
|
|
163
|
-
const REFERENCE = /\b(?:Sections?|Articles?|§) ?(?<n>\d{1,3}(?:\.\d{1,3}){0,5}|[IVXLC]{1,7})\b/gu;
|
|
164
|
-
const SUBDIVISION = /^\((?<p>[a-z0-9]{1,4})\)/u;
|
|
145
|
+
const REFERENCE = /(?<word>\b[Ss]ections?|\b[Aa]rticles?|§) ?(?<n>\d{1,3}(?:\.\d{1,3}){0,5}|[IVXLC]{1,7})\b/gu;
|
|
146
|
+
/** "(a)", "(ii)", "(3)", and an inserted "(A1)" or "(2A)": the same labels the tree reads. */
|
|
147
|
+
const SUBDIVISION = new RegExp(`^\\((?<p>[a-z0-9]{1,4}|${INSERTED})\\)`, "u");
|
|
148
|
+
/** The longest label, with its parentheses: "(ZZ999)". */
|
|
149
|
+
const MAX_SUBDIVISION_LENGTH = 7;
|
|
165
150
|
|
|
166
151
|
/** "(a)(ii)(3)" is as deep as a reference goes; more parentheses are text, not a deeper address. */
|
|
167
152
|
const MAX_SUBDIVISIONS = 4;
|
|
@@ -174,7 +159,7 @@ const subdivisions = (text: string, from: number): { readonly parts: readonly st
|
|
|
174
159
|
const parts: string[] = [];
|
|
175
160
|
let end = from;
|
|
176
161
|
while (parts.length < MAX_SUBDIVISIONS) {
|
|
177
|
-
const part = SUBDIVISION.exec(text.slice(end, end +
|
|
162
|
+
const part = SUBDIVISION.exec(text.slice(end, end + MAX_SUBDIVISION_LENGTH))?.groups?.["p"];
|
|
178
163
|
if (part === undefined) break;
|
|
179
164
|
parts.push(part);
|
|
180
165
|
end += part.length + 2;
|
|
@@ -182,19 +167,51 @@ const subdivisions = (text: string, from: number): { readonly parts: readonly st
|
|
|
182
167
|
return { parts, end };
|
|
183
168
|
};
|
|
184
169
|
|
|
170
|
+
/** Parentheses opened and not yet closed in `between`. */
|
|
171
|
+
const PAREN_STEP: Readonly<Record<string, number>> = { "(": 1, ")": -1 };
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* "section 120(3) of the Communications Act 2003 (conditions under section 120 …)": a gloss in parentheses after
|
|
175
|
+
* a reference into another document describes that document, so the references in it are into it too — until the
|
|
176
|
+
* parenthesis the reference stood in closes. One pass over the line, however many references it holds.
|
|
177
|
+
*/
|
|
178
|
+
type Gloss = { depth: number; scanned: number; readonly anchors: { readonly document: string; readonly depth: number }[] };
|
|
179
|
+
|
|
180
|
+
const advance = (gloss: Gloss, text: string, to: number): void => {
|
|
181
|
+
for (let index = gloss.scanned; index < to; index += 1) {
|
|
182
|
+
gloss.depth += PAREN_STEP[text[index] ?? ""] ?? 0;
|
|
183
|
+
while ((gloss.anchors.at(-1)?.depth ?? -Infinity) > gloss.depth) gloss.anchors.pop();
|
|
184
|
+
}
|
|
185
|
+
gloss.scanned = Math.max(gloss.scanned, to);
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
const glossedDocument = (gloss: Gloss): string | undefined => {
|
|
189
|
+
const anchor = gloss.anchors.at(-1);
|
|
190
|
+
return anchor !== undefined && gloss.depth > anchor.depth ? anchor.document : undefined;
|
|
191
|
+
};
|
|
192
|
+
|
|
185
193
|
/**
|
|
186
194
|
* "Section 4.2(a)" → 4.2.a, "Article III" → 3. The same addresses the tree gives.
|
|
187
195
|
* "Section 9 of the Master Agreement" carries the other document's name, and is not looked up in this tree.
|
|
188
196
|
*/
|
|
189
|
-
const references = (text: string): Mention[] =>
|
|
190
|
-
[
|
|
197
|
+
const references = (text: string): Mention[] => {
|
|
198
|
+
const gloss: Gloss = { depth: 0, scanned: 0, anchors: [] };
|
|
199
|
+
return [...text.matchAll(REFERENCE)].flatMap((match) => {
|
|
191
200
|
const main = numberOf(match.groups?.["n"]);
|
|
192
201
|
if (main === undefined) return [];
|
|
193
202
|
const { parts, end } = subdivisions(text, match.index + match[0].length);
|
|
194
|
-
|
|
195
|
-
const
|
|
196
|
-
|
|
203
|
+
advance(gloss, text, match.index);
|
|
204
|
+
const cited = citedDocumentAfter(text, end);
|
|
205
|
+
const document = cited ?? glossedDocument(gloss);
|
|
206
|
+
gloss.scanned = Math.max(gloss.scanned, end);
|
|
207
|
+
if (cited !== undefined) gloss.anchors.push({ document: cited, depth: gloss.depth });
|
|
208
|
+
const numbering = /^[Aa]/u.test(match.groups?.["word"] ?? "") ? "article" : "section";
|
|
209
|
+
const shared = { numbering, ...(document === undefined ? {} : { document }) };
|
|
210
|
+
const first = { start: match.index, end, attrs: { target: [main, ...parts].join("."), label: text.slice(match.index, end), ...shared } };
|
|
211
|
+
const [plural, roman] = [/s$/u.test(match.groups?.["word"] ?? ""), /^[IVXLC]+$/u.test(match.groups?.["n"] ?? "")];
|
|
212
|
+
return [first, ...membersAfter(text, end, [main, ...parts], shared, plural, roman)];
|
|
197
213
|
});
|
|
214
|
+
};
|
|
198
215
|
|
|
199
216
|
/** Longest first, and never inside a word: "shall not" is not also "shall", "mayor" is not "may". */
|
|
200
217
|
const MARKERS: readonly (readonly [string, "must" | "must-not" | "may"])[] = [
|
|
@@ -363,4 +380,14 @@ const dates = (text: string): Mention[] =>
|
|
|
363
380
|
/** "2.5 days" and "1.5 times" are amounts, not section 2.5 titled "days". */
|
|
364
381
|
const countedAfter = (_number: string, rest: string): boolean => unitAfter(` ${rest}`, 0) !== undefined;
|
|
365
382
|
|
|
366
|
-
export const structure: StructurePatterns = {
|
|
383
|
+
export const structure: StructurePatterns = {
|
|
384
|
+
numbered,
|
|
385
|
+
definitions,
|
|
386
|
+
references,
|
|
387
|
+
obligations,
|
|
388
|
+
quantities,
|
|
389
|
+
dates,
|
|
390
|
+
countedAfter,
|
|
391
|
+
opensDefinitionScope,
|
|
392
|
+
definitionScopeDepth,
|
|
393
|
+
};
|