chaffjs 0.7.0 → 0.9.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 +11 -4
- package/dist/adapter-load.d.ts +12 -1
- package/dist/adapter-load.d.ts.map +1 -1
- package/dist/adapter-load.js +37 -13
- package/dist/adapter-load.js.map +1 -1
- package/dist/address-chain.d.ts +9 -0
- package/dist/address-chain.d.ts.map +1 -0
- package/dist/address-chain.js +105 -0
- package/dist/address-chain.js.map +1 -0
- package/dist/cli-args.d.ts +8 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +8 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli-text.d.ts +26 -0
- package/dist/cli-text.d.ts.map +1 -0
- package/dist/cli-text.js +155 -0
- package/dist/cli-text.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +94 -87
- package/dist/cli.js.map +1 -1
- package/dist/commands/cite.d.ts +2 -1
- package/dist/commands/cite.d.ts.map +1 -1
- package/dist/commands/cite.js +39 -18
- package/dist/commands/cite.js.map +1 -1
- package/dist/commands/eval.d.ts.map +1 -1
- package/dist/commands/eval.js +2 -1
- package/dist/commands/eval.js.map +1 -1
- package/dist/commands/feedback.d.ts +35 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +157 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/skill.d.ts +22 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +68 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/test.d.ts.map +1 -1
- package/dist/commands/test.js +3 -2
- package/dist/commands/test.js.map +1 -1
- package/dist/commands/tree.d.ts +11 -1
- package/dist/commands/tree.d.ts.map +1 -1
- package/dist/commands/tree.js +21 -7
- package/dist/commands/tree.js.map +1 -1
- package/dist/config/by-path.d.ts +5 -1
- package/dist/config/by-path.d.ts.map +1 -1
- package/dist/config/by-path.js +1 -4
- package/dist/config/by-path.js.map +1 -1
- package/dist/config/load.d.ts +2 -0
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +3 -1
- package/dist/config/load.js.map +1 -1
- package/dist/config/rule-problems.d.ts +2 -1
- package/dist/config/rule-problems.d.ts.map +1 -1
- package/dist/config/rule-problems.js +17 -6
- package/dist/config/rule-problems.js.map +1 -1
- package/dist/config/write.d.ts.map +1 -1
- package/dist/config/write.js +29 -9
- package/dist/config/write.js.map +1 -1
- package/dist/detectors/char-shape.d.ts.map +1 -1
- package/dist/detectors/char-shape.js +3 -2
- package/dist/detectors/char-shape.js.map +1 -1
- package/dist/document.d.ts +2 -2
- package/dist/document.d.ts.map +1 -1
- package/dist/document.js +4 -2
- package/dist/document.js.map +1 -1
- package/dist/feedback/draft.d.ts +28 -0
- package/dist/feedback/draft.d.ts.map +1 -0
- package/dist/feedback/draft.js +66 -0
- package/dist/feedback/draft.js.map +1 -0
- package/dist/feedback/excerpt.d.ts +10 -0
- package/dist/feedback/excerpt.d.ts.map +1 -0
- package/dist/feedback/excerpt.js +20 -0
- package/dist/feedback/excerpt.js.map +1 -0
- package/dist/genre.d.ts +1 -1
- package/dist/genre.d.ts.map +1 -1
- package/dist/genre.js +3 -3
- package/dist/genre.js.map +1 -1
- package/dist/init.d.ts +2 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +62 -13
- package/dist/init.js.map +1 -1
- package/dist/legal-address.d.ts +2 -0
- package/dist/legal-address.d.ts.map +1 -0
- package/dist/legal-address.js +16 -0
- package/dist/legal-address.js.map +1 -0
- package/dist/orthography.d.ts.map +1 -1
- package/dist/orthography.js +15 -0
- package/dist/orthography.js.map +1 -1
- package/dist/plugin.d.ts +94 -0
- package/dist/plugin.d.ts.map +1 -1
- package/dist/profile/for-file.d.ts +7 -0
- package/dist/profile/for-file.d.ts.map +1 -0
- package/dist/profile/for-file.js +6 -0
- package/dist/profile/for-file.js.map +1 -0
- package/dist/profile/load.d.ts +4 -0
- package/dist/profile/load.d.ts.map +1 -0
- package/dist/profile/load.js +25 -0
- package/dist/profile/load.js.map +1 -0
- package/dist/profile/parse.d.ts +19 -0
- package/dist/profile/parse.d.ts.map +1 -0
- package/dist/profile/parse.js +82 -0
- package/dist/profile/parse.js.map +1 -0
- package/dist/profile/select.d.ts +22 -0
- package/dist/profile/select.d.ts.map +1 -0
- package/dist/profile/select.js +21 -0
- package/dist/profile/select.js.map +1 -0
- package/dist/reasons.d.ts +16 -0
- package/dist/reasons.d.ts.map +1 -0
- package/dist/reasons.js +31 -0
- package/dist/reasons.js.map +1 -0
- package/dist/render/explain.d.ts.map +1 -1
- package/dist/render/explain.js +36 -12
- package/dist/render/explain.js.map +1 -1
- package/dist/render/friendly.d.ts.map +1 -1
- package/dist/render/friendly.js +32 -9
- package/dist/render/friendly.js.map +1 -1
- package/dist/render/rules-json.d.ts.map +1 -1
- package/dist/render/rules-json.js +47 -27
- package/dist/render/rules-json.js.map +1 -1
- package/dist/render/summary.d.ts +3 -2
- package/dist/render/summary.d.ts.map +1 -1
- package/dist/render/summary.js +24 -9
- package/dist/render/summary.js.map +1 -1
- package/dist/render/suppressions.d.ts +2 -1
- package/dist/render/suppressions.d.ts.map +1 -1
- package/dist/render/suppressions.js +34 -10
- package/dist/render/suppressions.js.map +1 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +41 -12
- package/dist/run.js.map +1 -1
- package/dist/structure/build.d.ts +2 -1
- package/dist/structure/build.d.ts.map +1 -1
- package/dist/structure/build.js +102 -9
- package/dist/structure/build.js.map +1 -1
- package/dist/structure/cite.d.ts.map +1 -1
- package/dist/structure/cite.js +3 -1
- package/dist/structure/cite.js.map +1 -1
- package/dist/structure/issues.d.ts +5 -2
- package/dist/structure/issues.d.ts.map +1 -1
- package/dist/structure/issues.js +35 -10
- package/dist/structure/issues.js.map +1 -1
- package/dist/structure/numbering.d.ts.map +1 -1
- package/dist/structure/numbering.js +11 -6
- package/dist/structure/numbering.js.map +1 -1
- package/dist/structure/of.d.ts +2 -1
- package/dist/structure/of.d.ts.map +1 -1
- package/dist/structure/of.js +7 -1
- package/dist/structure/of.js.map +1 -1
- package/dist/structure/relative-find.d.ts +6 -0
- package/dist/structure/relative-find.d.ts.map +1 -0
- package/dist/structure/relative-find.js +179 -0
- package/dist/structure/relative-find.js.map +1 -0
- package/dist/structure/relative-resolve.d.ts +3 -0
- package/dist/structure/relative-resolve.d.ts.map +1 -0
- package/dist/structure/relative-resolve.js +175 -0
- package/dist/structure/relative-resolve.js.map +1 -0
- package/dist/structure/unread.d.ts +8 -0
- package/dist/structure/unread.d.ts.map +1 -0
- package/dist/structure/unread.js +34 -0
- package/dist/structure/unread.js.map +1 -0
- package/dist/ui.d.ts +14 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +14 -0
- package/dist/ui.js.map +1 -0
- package/dist/watch.d.ts +1 -1
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +2 -2
- package/dist/watch.js.map +1 -1
- package/package.json +5 -3
- package/profiles/statute.yaml +62 -0
- package/skills/chaff/SKILL.md +81 -0
- package/src/adapter-load.ts +41 -10
- package/src/address-chain.ts +113 -0
- package/src/cli-args.ts +9 -0
- package/src/cli-text.ts +186 -0
- package/src/cli.ts +111 -90
- package/src/commands/cite.ts +51 -18
- package/src/commands/eval.ts +2 -1
- package/src/commands/feedback.ts +210 -0
- package/src/commands/skill.ts +74 -0
- package/src/commands/test.ts +3 -2
- package/src/commands/tree.ts +30 -8
- package/src/config/by-path.ts +11 -3
- package/src/config/load.ts +5 -1
- package/src/config/rule-problems.ts +24 -5
- package/src/config/write.ts +33 -9
- package/src/detectors/char-shape.ts +5 -4
- package/src/document.ts +11 -3
- package/src/feedback/draft.ts +102 -0
- package/src/feedback/excerpt.ts +23 -0
- package/src/genre.ts +4 -4
- package/src/init.ts +74 -15
- package/src/orthography.ts +15 -0
- package/src/plugin.ts +88 -0
- package/src/profile/for-file.ts +11 -0
- package/src/profile/load.ts +26 -0
- package/src/profile/parse.ts +106 -0
- package/src/profile/select.ts +35 -0
- package/src/reasons.ts +49 -0
- package/src/render/explain.ts +46 -12
- package/src/render/friendly.ts +42 -10
- package/src/render/rules-json.ts +35 -9
- package/src/render/summary.ts +34 -9
- package/src/render/suppressions.ts +45 -10
- package/src/run.ts +44 -11
- package/src/structure/build.ts +128 -12
- package/src/structure/cite.ts +3 -1
- package/src/structure/issues.ts +42 -15
- package/src/structure/numbering.ts +12 -7
- package/src/structure/of.ts +15 -3
- package/src/structure/relative-find.ts +224 -0
- package/src/structure/relative-resolve.ts +209 -0
- package/src/structure/unread.ts +39 -0
- package/src/ui.ts +23 -0
- package/src/watch.ts +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"numbering.js","sourceRoot":"","sources":["../../src/structure/numbering.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAuB,MAAM,aAAa,CAAC;AAEnE,MAAM,OAAO,GAAG,CAAC,IAAmB,EAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;AAI7F
|
|
1
|
+
{"version":3,"file":"numbering.js","sourceRoot":"","sources":["../../src/structure/numbering.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAuB,MAAM,aAAa,CAAC;AAEnE,MAAM,OAAO,GAAG,CAAC,IAAmB,EAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;AAI7F;;;GAGG;AACH,MAAM,WAAW,GAAG,CAAC,MAAqB,EAAe,EAAE;IACzD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC5C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QAC/B,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS;YAAE,OAAO;QACvC,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QACvD,gCAAgC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;AAC9B,CAAC,CAAC;AAEF,kDAAkD;AAClD,MAAM,QAAQ,GAAG,CAAC,QAA4B,EAAoB,EAAE,CAClE,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;IAClC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACrC,iEAAiE;IACjE,0CAA0C;IAC1C,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,OAAO,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACxG,OAAO;QACL;YACE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;YAC/B,MAAM,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE;SAChI;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAmB,EAAoB,EAAE,CACvE,eAAe,CAAC,IAAI,CAAC;KAClB,OAAO,CAAC,WAAW,CAAC;KACpB,OAAO,CAAC,QAAQ,CAAC;KACjB,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC"}
|
package/dist/structure/of.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import type { StructureNode, StructurePatterns } from "../plugin.ts";
|
|
1
|
+
import type { DocumentProfile, StructureNode, StructurePatterns } from "../plugin.ts";
|
|
2
2
|
export type SourceInput = {
|
|
3
3
|
readonly path: string;
|
|
4
4
|
readonly source: string;
|
|
5
5
|
readonly language: string;
|
|
6
6
|
readonly markdown: boolean;
|
|
7
|
+
readonly profile?: DocumentProfile | undefined;
|
|
7
8
|
};
|
|
8
9
|
/**
|
|
9
10
|
* 文字列から木を作る。Markdown なら見出しとコードの範囲を先に取る。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"of.d.ts","sourceRoot":"","sources":["../../src/structure/of.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"of.d.ts","sourceRoot":"","sources":["../../src/structure/of.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGtF,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;CAChD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,WAAW,EAAE,UAAU,iBAAiB,KAAG,aAU9E,CAAC"}
|
package/dist/structure/of.js
CHANGED
|
@@ -4,5 +4,11 @@ import { buildTree, NO_OUTLINE } from "./build.js";
|
|
|
4
4
|
* 文字列から木を作る。Markdown なら見出しとコードの範囲を先に取る。
|
|
5
5
|
* lint は文書モデルを作るときの解析を使い回すので、ここを通らずに buildTree を呼ぶ。
|
|
6
6
|
*/
|
|
7
|
-
export const buildStructure = (input, patterns) => buildTree({
|
|
7
|
+
export const buildStructure = (input, patterns) => buildTree({
|
|
8
|
+
path: input.path,
|
|
9
|
+
source: input.source,
|
|
10
|
+
language: input.language,
|
|
11
|
+
outline: input.markdown ? markdownOutline(input.source) : NO_OUTLINE,
|
|
12
|
+
profile: input.profile,
|
|
13
|
+
}, patterns);
|
|
8
14
|
//# sourceMappingURL=of.js.map
|
package/dist/structure/of.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"of.js","sourceRoot":"","sources":["../../src/structure/of.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"of.js","sourceRoot":"","sources":["../../src/structure/of.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAUnD;;;GAGG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAkB,EAAE,QAA2B,EAAiB,EAAE,CAC/F,SAAS,CACP;IACE,IAAI,EAAE,KAAK,CAAC,IAAI;IAChB,MAAM,EAAE,KAAK,CAAC,MAAM;IACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;IACxB,OAAO,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU;IACpE,OAAO,EAAE,KAAK,CAAC,OAAO;CACvB,EACD,QAAQ,CACT,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { DocumentProfile, Mention } from "../plugin.ts";
|
|
2
|
+
type NumberReader = (text: string) => number | undefined;
|
|
3
|
+
/** absolute は同じ行の番地を名指しした参照。条を書かない番地が、その続きかどうかを決めるのに使う。 */
|
|
4
|
+
export declare const relativeMentions: (text: string, profile: DocumentProfile | undefined, number: NumberReader | undefined, absolute?: readonly Mention[]) => Mention[];
|
|
5
|
+
export {};
|
|
6
|
+
//# sourceMappingURL=relative-find.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative-find.d.ts","sourceRoot":"","sources":["../../src/structure/relative-find.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAA4B,MAAM,cAAc,CAAC;AAQvF,KAAK,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAqMzD,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,GAC3B,MAAM,MAAM,EACZ,SAAS,eAAe,GAAG,SAAS,EACpC,QAAQ,YAAY,GAAG,SAAS,EAChC,WAAU,SAAS,OAAO,EAAO,KAChC,OAAO,EAYT,CAAC"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
const escape = (word) => word.replace(/[.*+?^${}()|[\]\\]/gu, "\\$&");
|
|
2
|
+
const oneOf = (words) => (words.length === 0 ? "(?!)" : words.map(escape).join("|"));
|
|
3
|
+
const waysOf = (vocabulary) => new Map([
|
|
4
|
+
...vocabulary.before.map((word) => [word, "before"]),
|
|
5
|
+
...vocabulary.after.map((word) => [word, "after"]),
|
|
6
|
+
...vocabulary.same.map((word) => [word, "same"]),
|
|
7
|
+
...vocabulary.current.map((word) => [word, "current"]),
|
|
8
|
+
]);
|
|
9
|
+
/** 後ろの決まり: 番地の並びと同じく、つなぎの語を挟んで address_end。「前条件」の「前条」を参照にしない。 */
|
|
10
|
+
const endOf = (profile) => {
|
|
11
|
+
const connectives = profile.connectives.length === 0 ? "" : `(?:${oneOf(profile.connectives)})*`;
|
|
12
|
+
return profile.addressEnd === undefined ? "" : `(?=${connectives}(?:${profile.addressEnd}))`;
|
|
13
|
+
};
|
|
14
|
+
const compile = (profile, vocabulary) => {
|
|
15
|
+
const units = oneOf(Object.keys(vocabulary.units));
|
|
16
|
+
const suffix = `${escape(vocabulary.suffixPrefix)}(?:${vocabulary.count})(?:${units})`;
|
|
17
|
+
const end = endOf(profile);
|
|
18
|
+
const start = vocabulary.notAfter === undefined ? "" : `(?<!${vocabulary.notAfter})`;
|
|
19
|
+
const way = oneOf([...vocabulary.before, ...vocabulary.after, ...vocabulary.same, ...vocabulary.current]);
|
|
20
|
+
const count = `${oneOf(vocabulary.every)}|${vocabulary.count}`;
|
|
21
|
+
const inside = `${escape(vocabulary.suffixPrefix)}(?:${vocabulary.count})(?:${oneOf(vocabulary.inside)})`;
|
|
22
|
+
return {
|
|
23
|
+
named: new RegExp(`${start}(?<way>${way})(?<count>${count})?(?<unit>${units})(?<suffix>(?:${suffix})*)${end}`, "gu"),
|
|
24
|
+
// 前の文字は見ない。語に続くもの(別表第一第一号)も見つけて、並びの続きを止めるのに使う。
|
|
25
|
+
bare: vocabulary.inside.length === 0 ? undefined : new RegExp(`(?<suffix>${inside}(?:${suffix})*)${end}`, "gu"),
|
|
26
|
+
suffix: new RegExp(`${escape(vocabulary.suffixPrefix)}(?<n>${vocabulary.count})(?<unit>${units})`, "gu"),
|
|
27
|
+
notAfter: vocabulary.notAfter === undefined ? undefined : new RegExp(`(?:${vocabulary.notAfter})$`, "u"),
|
|
28
|
+
joins: new RegExp(`(?:${[...vocabulary.joiners, ...profile.connectives.map(escape)].join("|") || "(?!)"})`, "gu"),
|
|
29
|
+
ways: waysOf(vocabulary),
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
const compiled = new WeakMap();
|
|
33
|
+
/** 「第二項第三号」を「2:2,3:3」(深さ:番号)にする。読めない数があれば undefined。 */
|
|
34
|
+
const suffixOf = (text, patterns, vocabulary, number) => {
|
|
35
|
+
const parts = [...text.matchAll(patterns.suffix)].map((match) => {
|
|
36
|
+
const value = number(match.groups?.["n"] ?? "");
|
|
37
|
+
const depth = vocabulary.units[match.groups?.["unit"] ?? ""];
|
|
38
|
+
return value === undefined || depth === undefined ? undefined : `${String(depth)}:${String(value)}`;
|
|
39
|
+
});
|
|
40
|
+
return parts.includes(undefined) ? undefined : parts.join(",");
|
|
41
|
+
};
|
|
42
|
+
/** 「各」は前の全部(0)、数が無ければ 1。 */
|
|
43
|
+
const countOf = (count, vocabulary, number) => {
|
|
44
|
+
if (count === undefined)
|
|
45
|
+
return 1;
|
|
46
|
+
return vocabulary.every.includes(count) ? 0 : number(count);
|
|
47
|
+
};
|
|
48
|
+
/** 文字と、その位置(UTF-16 の単位で)。絵文字のような 2 単位の文字も 1 文字として読む。 */
|
|
49
|
+
const characters = (text) => {
|
|
50
|
+
const found = [];
|
|
51
|
+
let at = 0;
|
|
52
|
+
for (const char of text) {
|
|
53
|
+
found.push({ char, at });
|
|
54
|
+
at += char.length;
|
|
55
|
+
}
|
|
56
|
+
return found;
|
|
57
|
+
};
|
|
58
|
+
/** 一番外側の括弧の範囲。閉じの無い開きは捨てる。 */
|
|
59
|
+
const outerQuotes = (text, quote) => {
|
|
60
|
+
const spans = [];
|
|
61
|
+
const opens = [];
|
|
62
|
+
characters(text).forEach(({ char, at }) => {
|
|
63
|
+
if (char === quote.open)
|
|
64
|
+
opens.push(at);
|
|
65
|
+
const start = char === quote.close ? opens.pop() : undefined;
|
|
66
|
+
if (start !== undefined && opens.length === 0)
|
|
67
|
+
spans.push({ start, end: at + char.length });
|
|
68
|
+
});
|
|
69
|
+
return spans;
|
|
70
|
+
};
|
|
71
|
+
/** 読み替えの括弧(閉じの直後か開きの直前に目印があるもの)の範囲。 */
|
|
72
|
+
const substitutionSpans = (text, quote) => quote === undefined
|
|
73
|
+
? []
|
|
74
|
+
: outerQuotes(text, quote).filter((span) => quote.after.some((marker) => text.startsWith(marker, span.end)) || quote.before.some((marker) => text.slice(0, span.start).endsWith(marker)));
|
|
75
|
+
/** 閉じた括弧書きを内側から外す。 */
|
|
76
|
+
const withoutAsides = (gap, aside) => {
|
|
77
|
+
if (aside === undefined)
|
|
78
|
+
return gap;
|
|
79
|
+
const inner = new RegExp(`${escape(aside.open)}[^${escape(aside.open)}${escape(aside.close)}]*${escape(aside.close)}`, "gu");
|
|
80
|
+
const once = gap.replace(inner, "");
|
|
81
|
+
return once === gap ? gap : withoutAsides(once, aside);
|
|
82
|
+
};
|
|
83
|
+
/** あいだが、並びをつなぐもの・つなぎの語・閉じた括弧書き・空白だけか。 */
|
|
84
|
+
const onlyJoins = (gap, patterns, vocabulary) => withoutAsides(gap, vocabulary.aside).replace(patterns.joins, "").trim() === "";
|
|
85
|
+
const overlaps = (start, end, others) => others.some((other) => start < other.end && other.start < end);
|
|
86
|
+
/** 行き先を決められない番地。並びの続きを止めるためだけに覚え、参照にはしない。 */
|
|
87
|
+
const OPAQUE = "opaque";
|
|
88
|
+
/** すぐ前が not_after に当たる(「別表第一」の「一」に続く「第一号」)。 */
|
|
89
|
+
const glued = (text, start, patterns) => patterns.notAfter?.test(text.slice(0, start)) === true;
|
|
90
|
+
const bareCandidates = (text, patterns, vocabulary, number) => patterns.bare === undefined
|
|
91
|
+
? []
|
|
92
|
+
: [...text.matchAll(patterns.bare)].flatMap((match) => {
|
|
93
|
+
const suffix = suffixOf(match.groups?.["suffix"] ?? "", patterns, vocabulary, number);
|
|
94
|
+
const first = Number(suffix?.split(":")[0]);
|
|
95
|
+
return suffix === undefined || !Number.isInteger(first)
|
|
96
|
+
? []
|
|
97
|
+
: [{ start: match.index, end: match.index + match[0].length, label: match[0], suffix, first }];
|
|
98
|
+
});
|
|
99
|
+
/** 並びの中での扱い: 前の参照の続きか、今いるところの中か、行き先を決められないか。続きなら、どの参照の続きか。 */
|
|
100
|
+
const wayOfBare = (text, bare, known, patterns, vocabulary) => {
|
|
101
|
+
if (glued(text, bare.start, patterns))
|
|
102
|
+
return { way: OPAQUE };
|
|
103
|
+
const depth = openAsides(text, bare.start, vocabulary).length;
|
|
104
|
+
const sameDepth = known.filter((other) => other.end <= bare.start && openAsides(text, other.end, vocabulary).length === depth);
|
|
105
|
+
const previous = sameDepth.toSorted((left, right) => left.end - right.end).at(-1);
|
|
106
|
+
const joined = previous !== undefined && onlyJoins(text.slice(previous.end, bare.start), patterns, vocabulary) ? previous : undefined;
|
|
107
|
+
const continues = joined ?? ownerOfAside(text, bare.start, known, vocabulary);
|
|
108
|
+
if (continues === undefined)
|
|
109
|
+
return { way: "current" };
|
|
110
|
+
return continues.attrs["relative"] === OPAQUE ? { way: OPAQUE } : { way: "continue", continues };
|
|
111
|
+
};
|
|
112
|
+
/** at の位置で開いたままの括弧書きの開きの位置。並びは同じ深さの参照どうしでつながる。 */
|
|
113
|
+
const openAsides = (text, at, vocabulary) => {
|
|
114
|
+
const aside = vocabulary.aside;
|
|
115
|
+
const opens = [];
|
|
116
|
+
if (aside === undefined)
|
|
117
|
+
return opens;
|
|
118
|
+
characters(text.slice(0, at)).forEach(({ char, at: position }) => {
|
|
119
|
+
if (char === aside.open)
|
|
120
|
+
opens.push(position);
|
|
121
|
+
if (char === aside.close)
|
|
122
|
+
opens.pop();
|
|
123
|
+
});
|
|
124
|
+
return opens;
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* 参照の直後に開いた括弧書きの中なら、その参照。「第二十七条(第四項を除き、第五項及び第六項の規定を…)」の番地は、どれも第二十七条の中。
|
|
128
|
+
*/
|
|
129
|
+
const ownerOfAside = (text, at, known, vocabulary) => {
|
|
130
|
+
const open = openAsides(text, at, vocabulary).at(-1);
|
|
131
|
+
return open === undefined ? undefined : known.find((other) => other.end === open);
|
|
132
|
+
};
|
|
133
|
+
/**
|
|
134
|
+
* 条を書かない「第一項」。すぐ前の参照とのあいだがつなぎの語だけなら、その参照の続き(continue)。
|
|
135
|
+
* そうでなければ、書いた場所を含む一つ上のまとまり(current)の中。
|
|
136
|
+
*/
|
|
137
|
+
const bareMentions = (text, patterns, vocabulary, number, before) => {
|
|
138
|
+
const found = [];
|
|
139
|
+
bareCandidates(text, patterns, vocabulary, number).forEach((bare) => {
|
|
140
|
+
const known = [...before, ...found];
|
|
141
|
+
if (overlaps(bare.start, bare.end, known))
|
|
142
|
+
return;
|
|
143
|
+
const { way, continues } = wayOfBare(text, bare, known, patterns, vocabulary);
|
|
144
|
+
// 条を書かない番地は、その一つ上(level)ではなく、書いた単位(level + 1)から名指しする。「第一項」は「同条」の行き先を変えない。
|
|
145
|
+
// continues は、続きの元の参照がどれだけ前から始まるか。木の中で、その参照を位置で引く。
|
|
146
|
+
const back = continues === undefined ? {} : { continues: bare.start - continues.start };
|
|
147
|
+
const attrs = { label: bare.label, relative: way, level: bare.first - 1, count: 1, suffix: bare.suffix, names: bare.first, ...back };
|
|
148
|
+
found.push({ start: bare.start, end: bare.end, attrs });
|
|
149
|
+
});
|
|
150
|
+
return found.filter((mention) => mention.attrs["relative"] !== OPAQUE);
|
|
151
|
+
};
|
|
152
|
+
const namedMentions = (text, patterns, vocabulary, number) => [...text.matchAll(patterns.named)].flatMap((match) => {
|
|
153
|
+
const groups = match.groups ?? {};
|
|
154
|
+
const way = patterns.ways.get(groups["way"] ?? "");
|
|
155
|
+
const level = vocabulary.units[groups["unit"] ?? ""];
|
|
156
|
+
const count = countOf(groups["count"], vocabulary, number);
|
|
157
|
+
const suffix = suffixOf(groups["suffix"] ?? "", patterns, vocabulary, number);
|
|
158
|
+
if (way === undefined || level === undefined || count === undefined || suffix === undefined)
|
|
159
|
+
return [];
|
|
160
|
+
return [{ start: match.index, end: match.index + match[0].length, attrs: { label: match[0], relative: way, level, count, suffix } }];
|
|
161
|
+
});
|
|
162
|
+
/** absolute は同じ行の番地を名指しした参照。条を書かない番地が、その続きかどうかを決めるのに使う。 */
|
|
163
|
+
export const relativeMentions = (text, profile, number, absolute = []) => {
|
|
164
|
+
const vocabulary = profile?.relative;
|
|
165
|
+
if (profile === undefined || vocabulary === undefined || number === undefined)
|
|
166
|
+
return [];
|
|
167
|
+
if (!compiled.has(profile))
|
|
168
|
+
compiled.set(profile, compile(profile, vocabulary));
|
|
169
|
+
const patterns = compiled.get(profile);
|
|
170
|
+
if (patterns === undefined)
|
|
171
|
+
return [];
|
|
172
|
+
const substituted = substitutionSpans(text, vocabulary.substitution);
|
|
173
|
+
const named = namedMentions(text, patterns, vocabulary, number);
|
|
174
|
+
const bare = bareMentions(text, patterns, vocabulary, number, [...absolute, ...named]);
|
|
175
|
+
return [...named, ...bare]
|
|
176
|
+
.filter((mention) => !substituted.some((span) => span.start <= mention.start && mention.start < span.end))
|
|
177
|
+
.sort((left, right) => left.start - right.start);
|
|
178
|
+
};
|
|
179
|
+
//# sourceMappingURL=relative-find.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative-find.js","sourceRoot":"","sources":["../../src/structure/relative-find.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative-resolve.d.ts","sourceRoot":"","sources":["../../src/structure/relative-resolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AA6MlD,eAAO,MAAM,eAAe,GAAI,MAAM,aAAa,EAAE,eAAe,MAAM,GAAG,SAAS,KAAG,aAGxF,CAAC"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
const NUMBERED = new Set(["chapter", "article", "item"]);
|
|
2
|
+
const placeOf = (node) => NUMBERED.has(node.kind) && node.level !== undefined ? { address: node.address, level: node.level, range: node.ordinalTo !== undefined } : undefined;
|
|
3
|
+
/** 番号の付いた子。Markdown の見出し(section)は番号の外なので、その中まで見る。 */
|
|
4
|
+
const numberedChildren = (node, level) => node.children.flatMap((child) => {
|
|
5
|
+
if (NUMBERED.has(child.kind))
|
|
6
|
+
return child.level === level ? [child] : [];
|
|
7
|
+
return child.kind === "section" ? numberedChildren(child, level) : [];
|
|
8
|
+
});
|
|
9
|
+
/** 同じ親の下で同じ深さのもの。番号の無い最初のもの(法令の第 1 項)があるなら、それを先頭に足す。 */
|
|
10
|
+
const siblingsUnder = (parent, level, implicitLevel) => {
|
|
11
|
+
const children = numberedChildren(parent, level);
|
|
12
|
+
const explicit = children.flatMap((child) => {
|
|
13
|
+
const place = placeOf(child);
|
|
14
|
+
return place === undefined ? [] : [place];
|
|
15
|
+
});
|
|
16
|
+
const firstOrdinal = children[0]?.ordinal;
|
|
17
|
+
const implicit = level === implicitLevel && parent.level === level - 1 && firstOrdinal !== 1;
|
|
18
|
+
return implicit ? [{ address: `${parent.address}.1`, level }, ...explicit] : explicit;
|
|
19
|
+
};
|
|
20
|
+
/** 書いた場所を含む、その深さのまとまり。第 1 項の本文にいて項が開いていなければ、番号の無い第 1 項。 */
|
|
21
|
+
const anchorAt = (path, level, context) => {
|
|
22
|
+
const index = path.findLastIndex((node) => NUMBERED.has(node.kind) && node.level === level);
|
|
23
|
+
const node = path[index];
|
|
24
|
+
if (node !== undefined) {
|
|
25
|
+
const place = placeOf(node);
|
|
26
|
+
// 親は番号の付いた一つ上のまとまり。あいだの Markdown の見出しは飛ばす。無ければ文書(条より外のまとまり)。
|
|
27
|
+
const parent = path.slice(0, index).findLast((candidate) => NUMBERED.has(candidate.kind) && (candidate.level ?? 0) < level) ?? path[0];
|
|
28
|
+
if (place === undefined || parent === undefined)
|
|
29
|
+
return undefined;
|
|
30
|
+
return { place, siblings: node.kind === "article" ? context.articles : siblingsUnder(parent, level, context.implicitLevel) };
|
|
31
|
+
}
|
|
32
|
+
const parent = path.findLast((candidate) => NUMBERED.has(candidate.kind) && candidate.level === level - 1);
|
|
33
|
+
if (level !== context.implicitLevel || parent === undefined)
|
|
34
|
+
return undefined;
|
|
35
|
+
const siblings = siblingsUnder(parent, level, context.implicitLevel);
|
|
36
|
+
const first = siblings[0];
|
|
37
|
+
return first === undefined ? undefined : { place: first, siblings };
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* by だけ前後にずらす。範囲の行(第四十三条から第五十五条まで 削除)は中の条を一つずつ持たないので、数えてまたげば行き先がずれる。
|
|
41
|
+
* 前に数えて範囲をまたぐか範囲に当たる、後ろに数えて範囲をまたぐなら決めない。後ろに数えて範囲に当たるのは、その最初の条なので正しい。
|
|
42
|
+
*/
|
|
43
|
+
const shifted = (anchor, by) => {
|
|
44
|
+
const index = anchor.siblings.findIndex((place) => place.address === anchor.place.address);
|
|
45
|
+
if (index === -1)
|
|
46
|
+
return undefined;
|
|
47
|
+
const crossed = by > 0 ? anchor.siblings.slice(index + 1, index + by) : anchor.siblings.slice(Math.max(0, index + by), index);
|
|
48
|
+
return crossed.some((place) => place.range === true) ? undefined : anchor.siblings[index + by];
|
|
49
|
+
};
|
|
50
|
+
/** 前の全部(前各項)は、前に一つでもあれば最初のもの。 */
|
|
51
|
+
const allBefore = (anchor) => (shifted(anchor, -1) === undefined ? undefined : anchor.siblings[0]);
|
|
52
|
+
/**
|
|
53
|
+
* 前・次・本で決まる場所。「各」(count 0)は前の全部なので、最初のものを指す。
|
|
54
|
+
*/
|
|
55
|
+
const byPosition = (way, count, anchor) => {
|
|
56
|
+
if (way === "current")
|
|
57
|
+
return anchor.place;
|
|
58
|
+
if (way === "after")
|
|
59
|
+
return shifted(anchor, Math.max(count, 1));
|
|
60
|
+
return count === 0 ? allBefore(anchor) : shifted(anchor, -count);
|
|
61
|
+
};
|
|
62
|
+
/** 同: その前の参照の番地を、この深さまで切る。条より外のまとまりは番地の形が違うので扱わない。 */
|
|
63
|
+
const bySame = (level, last) => (last === undefined ? undefined : { address: last.target, level });
|
|
64
|
+
/** 並びの続き: 元の参照の番地を、この深さまで切る。元の参照の番地が決まらなければ決めない。 */
|
|
65
|
+
const continued = (level, node, context) => {
|
|
66
|
+
const origin = context.byStart.get(node.span.start - Number(node.attrs["continues"]));
|
|
67
|
+
if (origin === undefined || context.articleLevel === undefined || level < context.articleLevel)
|
|
68
|
+
return undefined;
|
|
69
|
+
const parts = origin.target.split(".");
|
|
70
|
+
const kept = level - context.articleLevel + 1;
|
|
71
|
+
return parts.length < kept ? undefined : { target: parts.slice(0, kept).join("."), document: origin.document };
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* 参照が名指しした深さを覚える。名指しは、書き出しの深さ(第〇条なら条、前項なら項)から番地の深さまで。
|
|
75
|
+
* 番地を深さで切る起点は条。条より外のまとまりは番地の形が違うので覚えない。
|
|
76
|
+
*/
|
|
77
|
+
const remember = (context, target, document, from) => {
|
|
78
|
+
const articleLevel = context.articleLevel;
|
|
79
|
+
// 章・節は番地の形(ch1)が条から始まらないので覚えない。覚えると「同条」が章を指してしまう。
|
|
80
|
+
if (articleLevel === undefined || from < articleLevel)
|
|
81
|
+
return;
|
|
82
|
+
const parts = target.split(".");
|
|
83
|
+
parts.forEach((_, index) => {
|
|
84
|
+
const level = articleLevel + index;
|
|
85
|
+
if (level >= from)
|
|
86
|
+
context.last.set(level, { target: parts.slice(0, index + 1).join("."), document });
|
|
87
|
+
});
|
|
88
|
+
};
|
|
89
|
+
/** 「第二項第三号」を足す。一つ深いものは続け、二つ深い号は番号の無い第 1 項の中(x.1.n)に置く。 */
|
|
90
|
+
const withSuffix = (place, suffix, implicitLevel) => suffix
|
|
91
|
+
.split(",")
|
|
92
|
+
.filter((part) => part !== "")
|
|
93
|
+
.reduce((current, part) => {
|
|
94
|
+
const [depth, value] = part.split(":").map(Number);
|
|
95
|
+
if (current === undefined || depth === undefined || value === undefined)
|
|
96
|
+
return undefined;
|
|
97
|
+
if (depth === current.level + 1)
|
|
98
|
+
return { address: `${current.address}.${String(value)}`, level: depth };
|
|
99
|
+
if (implicitLevel === current.level + 1 && depth === current.level + 2)
|
|
100
|
+
return { address: `${current.address}.1.${String(value)}`, level: depth };
|
|
101
|
+
return undefined;
|
|
102
|
+
}, place);
|
|
103
|
+
/** 番号の無い第 1 項(x.1)は、条そのものでもある。 */
|
|
104
|
+
const fallbackOf = (place, implicitLevel) => place.level === implicitLevel && place.address.endsWith(".1") ? place.address.slice(0, -".1".length) : undefined;
|
|
105
|
+
const baseOf = (way, node, anchor, last, context) => {
|
|
106
|
+
const level = Number(node.attrs["level"]);
|
|
107
|
+
if (way === "same")
|
|
108
|
+
return bySame(level, last);
|
|
109
|
+
if (way === "continue") {
|
|
110
|
+
const origin = continued(level, node, context);
|
|
111
|
+
return origin === undefined ? undefined : { address: origin.target, level };
|
|
112
|
+
}
|
|
113
|
+
return anchor === undefined ? undefined : byPosition(way, Number(node.attrs["count"]), anchor);
|
|
114
|
+
};
|
|
115
|
+
/** 同と並びの続きは、元の参照が他の文書を指していれば、それを引き継ぐ。前・次・本はこの文書の中。 */
|
|
116
|
+
const documentOf = (way, node, last, context) => {
|
|
117
|
+
if (way === "same")
|
|
118
|
+
return last?.document;
|
|
119
|
+
return way === "continue" ? continued(Number(node.attrs["level"]), node, context)?.document : undefined;
|
|
120
|
+
};
|
|
121
|
+
const resolveOne = (node, path, context) => {
|
|
122
|
+
const way = String(node.attrs["relative"]);
|
|
123
|
+
const level = Number(node.attrs["level"]);
|
|
124
|
+
const last = context.last.get(level);
|
|
125
|
+
const anchor = way === "same" || way === "continue" ? undefined : anchorAt(path, level, context);
|
|
126
|
+
const base = baseOf(way, node, anchor, last, context);
|
|
127
|
+
const place = base === undefined ? undefined : withSuffix(base, String(node.attrs["suffix"] ?? ""), context.implicitLevel);
|
|
128
|
+
if (place === undefined)
|
|
129
|
+
return undefined;
|
|
130
|
+
const fallback = fallbackOf(place, context.implicitLevel);
|
|
131
|
+
const document = documentOf(way, node, last, context);
|
|
132
|
+
const attrs = {
|
|
133
|
+
target: place.address,
|
|
134
|
+
label: String(node.attrs["label"]),
|
|
135
|
+
...(fallback === undefined ? {} : { fallback }),
|
|
136
|
+
...(document === undefined ? {} : { document }),
|
|
137
|
+
};
|
|
138
|
+
return { ...node, attrs };
|
|
139
|
+
};
|
|
140
|
+
const isRelative = (node) => node.kind === "reference" && node.attrs["relative"] !== undefined;
|
|
141
|
+
/** 文書の順に読み、参照ごとに「その前の参照」を覚える。 */
|
|
142
|
+
const walk = (node, path, context) => {
|
|
143
|
+
if (isRelative(node)) {
|
|
144
|
+
const resolved = resolveOne(node, path, context);
|
|
145
|
+
const target = resolved === undefined ? undefined : String(resolved.attrs["target"]);
|
|
146
|
+
const document = optional(resolved?.attrs["document"]);
|
|
147
|
+
if (target !== undefined)
|
|
148
|
+
context.byStart.set(node.span.start, { target, document });
|
|
149
|
+
if (target !== undefined)
|
|
150
|
+
remember(context, target, document, Number(node.attrs["names"] ?? node.attrs["level"]));
|
|
151
|
+
return resolved;
|
|
152
|
+
}
|
|
153
|
+
if (node.kind === "reference") {
|
|
154
|
+
const target = String(node.attrs["target"]);
|
|
155
|
+
const document = optional(node.attrs["document"]);
|
|
156
|
+
context.byStart.set(node.span.start, { target, document });
|
|
157
|
+
remember(context, target, document, context.articleLevel ?? 0);
|
|
158
|
+
}
|
|
159
|
+
const inside = [...path, node];
|
|
160
|
+
const children = node.children.flatMap((child) => {
|
|
161
|
+
const kept = walk(child, inside, context);
|
|
162
|
+
return kept === undefined ? [] : [kept];
|
|
163
|
+
});
|
|
164
|
+
return { ...node, children };
|
|
165
|
+
};
|
|
166
|
+
const optional = (value) => (value === undefined ? undefined : String(value));
|
|
167
|
+
const articlesOf = (node) => {
|
|
168
|
+
const place = node.kind === "article" ? placeOf(node) : undefined;
|
|
169
|
+
return [...(place === undefined ? [] : [place]), ...node.children.flatMap(articlesOf)];
|
|
170
|
+
};
|
|
171
|
+
export const resolveRelative = (tree, implicitLevel) => {
|
|
172
|
+
const articles = articlesOf(tree);
|
|
173
|
+
return walk(tree, [], { articles, articleLevel: articles[0]?.level, implicitLevel, last: new Map(), byStart: new Map() }) ?? tree;
|
|
174
|
+
};
|
|
175
|
+
//# sourceMappingURL=relative-resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relative-resolve.js","sourceRoot":"","sources":["../../src/structure/relative-resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { StructureNode } from "../plugin.ts";
|
|
2
|
+
export type Unread = {
|
|
3
|
+
readonly clauses: number;
|
|
4
|
+
readonly units: number;
|
|
5
|
+
};
|
|
6
|
+
/** 読めていなければ、本文の条項番号の数と木の番号の数。読めていれば undefined。 */
|
|
7
|
+
export declare const unreadStructure: (source: string, tree: StructureNode) => Unread | undefined;
|
|
8
|
+
//# sourceMappingURL=unread.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unread.d.ts","sourceRoot":"","sources":["../../src/structure/unread.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAoBlD,MAAM,MAAM,MAAM,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAY1E,kDAAkD;AAClD,eAAO,MAAM,eAAe,GAAI,QAAQ,MAAM,EAAE,MAAM,aAAa,KAAG,MAAM,GAAG,SAK9E,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 番号の付いた条項が本文にあるのに、木にほとんど入っていない文書。PDF から取り出した契約書は、字下げが深かったり
|
|
3
|
+
* 行が本文につながったりして、番号の行として読めないことが多い。そのとき構造の rule は「0 件」ではなく「読めなかった」と言う。
|
|
4
|
+
*/
|
|
5
|
+
const NUMBERED = new Set(["chapter", "article", "item"]);
|
|
6
|
+
/**
|
|
7
|
+
* 「11.3. Liability Cap」「2.1 Term」: 二段以上の番号と、大文字で始まる語。行頭か、文の区切り(「. 12.10. Waiver」)の後ろ。
|
|
8
|
+
* 語の後ろの番号(「Version 1.2 Released」「Figure 2.1 Revenue」)は条項ではない。
|
|
9
|
+
* 「1. TERM OF CONTRACT」: 行頭の一段の番号と、大文字だけの語。本文の箇条書き(「1. First」)とは分ける。
|
|
10
|
+
*/
|
|
11
|
+
const CLAUSE_NUMBERS = [/(?:^[ \t]{0,20}|[.;:][ \t]{1,10})\d{1,3}(?:\.\d{1,3}){1,4}\.?[ \t]{1,10}\p{Lu}/gmu, /^[ \t]{0,20}\d{1,3}\.[ \t]{1,10}\p{Lu}{2}/gmu];
|
|
12
|
+
/** 本文の条項番号がこれ以上あれば、番号で組んだ文書。 */
|
|
13
|
+
const MIN_CLAUSES = 5;
|
|
14
|
+
/** 木に入った番号が本文の条項番号のこの割合に届かなければ、読めていない。 */
|
|
15
|
+
const READ_SHARE = 0.25;
|
|
16
|
+
const numberedUnits = (tree) => {
|
|
17
|
+
let count = 0;
|
|
18
|
+
const pending = [tree];
|
|
19
|
+
for (let node = pending.pop(); node !== undefined; node = pending.pop()) {
|
|
20
|
+
if (NUMBERED.has(node.kind))
|
|
21
|
+
count += 1;
|
|
22
|
+
pending.push(...node.children);
|
|
23
|
+
}
|
|
24
|
+
return count;
|
|
25
|
+
};
|
|
26
|
+
/** 読めていなければ、本文の条項番号の数と木の番号の数。読めていれば undefined。 */
|
|
27
|
+
export const unreadStructure = (source, tree) => {
|
|
28
|
+
const clauses = CLAUSE_NUMBERS.reduce((total, pattern) => total + [...source.matchAll(pattern)].length, 0);
|
|
29
|
+
if (clauses < MIN_CLAUSES)
|
|
30
|
+
return undefined;
|
|
31
|
+
const units = numberedUnits(tree);
|
|
32
|
+
return units < clauses * READ_SHARE ? { clauses, units } : undefined;
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=unread.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unread.js","sourceRoot":"","sources":["../../src/structure/unread.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;AAEzD;;;;GAIG;AACH,MAAM,cAAc,GAAG,CAAC,mFAAmF,EAAE,8CAA8C,CAAC,CAAC;AAE7J,gCAAgC;AAChC,MAAM,WAAW,GAAG,CAAC,CAAC;AACtB,0CAA0C;AAC1C,MAAM,UAAU,GAAG,IAAI,CAAC;AAIxB,MAAM,aAAa,GAAG,CAAC,IAAmB,EAAU,EAAE;IACpD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,OAAO,GAAoB,CAAC,IAAI,CAAC,CAAC;IACxC,KAAK,IAAI,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,KAAK,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC;QACxE,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,kDAAkD;AAClD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAc,EAAE,IAAmB,EAAsB,EAAE;IACzF,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC3G,IAAI,OAAO,GAAG,WAAW;QAAE,OAAO,SAAS,CAAC;IAC5C,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,KAAK,GAAG,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC,CAAC"}
|
package/dist/ui.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The language chaff speaks in. Japanese for Japanese, English for everything else: English is the language a
|
|
3
|
+
* reader of any other language is likeliest to read, and every message has an English text.
|
|
4
|
+
*/
|
|
5
|
+
export type UiLanguage = "ja" | "en";
|
|
6
|
+
export declare const uiLanguageOf: (language: string | undefined) => UiLanguage;
|
|
7
|
+
/**
|
|
8
|
+
* The language for output that is not about one document (--help, genres, init, explain, relax, warnings):
|
|
9
|
+
* the language `chaff.yaml` sets, else the terminal's locale, else English. Pure: `env` is passed in.
|
|
10
|
+
*/
|
|
11
|
+
export declare const hostLanguage: (configLanguage: string | undefined, env: Readonly<Record<string, string | undefined>>) => UiLanguage;
|
|
12
|
+
/** Text in both languages. Each module keeps its own, next to where it is used. */
|
|
13
|
+
export type Texts<T> = Readonly<Record<UiLanguage, T>>;
|
|
14
|
+
//# sourceMappingURL=ui.d.ts.map
|
package/dist/ui.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC;AAErC,eAAO,MAAM,YAAY,GAAI,UAAU,MAAM,GAAG,SAAS,KAAG,UAA+C,CAAC;AAK5G;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,gBAAgB,MAAM,GAAG,SAAS,EAAE,KAAK,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,KAAG,UAIpH,CAAC;AAEF,mFAAmF;AACnF,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/ui.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const uiLanguageOf = (language) => (language === "ja" ? "ja" : "en");
|
|
2
|
+
/** Locale variables in the order POSIX gives them precedence. */
|
|
3
|
+
const LOCALE_VARIABLES = ["LC_ALL", "LC_MESSAGES", "LANG"];
|
|
4
|
+
/**
|
|
5
|
+
* The language for output that is not about one document (--help, genres, init, explain, relax, warnings):
|
|
6
|
+
* the language `chaff.yaml` sets, else the terminal's locale, else English. Pure: `env` is passed in.
|
|
7
|
+
*/
|
|
8
|
+
export const hostLanguage = (configLanguage, env) => {
|
|
9
|
+
if (configLanguage !== undefined)
|
|
10
|
+
return uiLanguageOf(configLanguage);
|
|
11
|
+
const locale = LOCALE_VARIABLES.map((name) => env[name]).find((value) => value !== undefined && value !== "");
|
|
12
|
+
return locale !== undefined && locale.toLowerCase().startsWith("ja") ? "ja" : "en";
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=ui.js.map
|
package/dist/ui.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAA4B,EAAc,EAAE,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAE5G,iEAAiE;AACjE,MAAM,gBAAgB,GAAsB,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,cAAkC,EAAE,GAAiD,EAAc,EAAE;IAChI,IAAI,cAAc,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC,cAAc,CAAC,CAAC;IACtE,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC;IAC9G,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACrF,CAAC,CAAC"}
|
package/dist/watch.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ export declare const snapshotOf: (findings: readonly Finding[]) => Snapshot;
|
|
|
5
5
|
* 差分だけを出す。書いている最中に全件を出し直されると、何が変わったのか分からない。
|
|
6
6
|
* workflow spec §11。
|
|
7
7
|
*/
|
|
8
|
-
export declare const describeChange: (before: Snapshot, after: Snapshot) => string | undefined;
|
|
8
|
+
export declare const describeChange: (before: Snapshot, after: Snapshot, unit?: string) => string | undefined;
|
|
9
9
|
export declare const clock: () => string;
|
|
10
10
|
/** 変更が落ち着いてから 1 度だけ呼ぶ。 */
|
|
11
11
|
export declare const watchPaths: (paths: readonly string[], onChange: (path: string) => void) => (() => void);
|
package/dist/watch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAK3C,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAExD,eAAO,MAAM,UAAU,GAAI,UAAU,SAAS,OAAO,EAAE,KAAG,QACiE,CAAC;AAI5H;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,KAAG,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAK3C,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAExD,eAAO,MAAM,UAAU,GAAI,UAAU,SAAS,OAAO,EAAE,KAAG,QACiE,CAAC;AAI5H;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,EAAE,aAAW,KAAG,MAAM,GAAG,SAUxF,CAAC;AAEF,eAAO,MAAM,KAAK,QAAO,MAA+C,CAAC;AAEzE,0BAA0B;AAC1B,eAAO,MAAM,UAAU,GAAI,OAAO,SAAS,MAAM,EAAE,EAAE,UAAU,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAAG,CAAC,MAAM,IAAI,CAmBlG,CAAC"}
|
package/dist/watch.js
CHANGED
|
@@ -7,7 +7,7 @@ const total = (snapshot) => Object.values(snapshot).reduce((sum, count) => sum +
|
|
|
7
7
|
* 差分だけを出す。書いている最中に全件を出し直されると、何が変わったのか分からない。
|
|
8
8
|
* workflow spec §11。
|
|
9
9
|
*/
|
|
10
|
-
export const describeChange = (before, after) => {
|
|
10
|
+
export const describeChange = (before, after, unit = " 件") => {
|
|
11
11
|
const rules = [...new Set([...Object.keys(before), ...Object.keys(after)])];
|
|
12
12
|
const moved = rules
|
|
13
13
|
.map((rule) => ({ rule, delta: (after[rule] ?? 0) - (before[rule] ?? 0) }))
|
|
@@ -17,7 +17,7 @@ export const describeChange = (before, after) => {
|
|
|
17
17
|
return undefined;
|
|
18
18
|
const detail = moved.map((entry) => `${entry.delta > 0 ? "+" : ""}${entry.delta} ${entry.rule}`).join(", ");
|
|
19
19
|
const mark = total(after) < total(before) ? "✓" : "✗";
|
|
20
|
-
return `${mark} ${total(before)} → ${total(after)}
|
|
20
|
+
return `${mark} ${total(before)} → ${total(after)}${unit} (${detail})`;
|
|
21
21
|
};
|
|
22
22
|
export const clock = () => new Date().toTimeString().slice(0, 8);
|
|
23
23
|
/** 変更が落ち着いてから 1 度だけ呼ぶ。 */
|