chaffjs 0.8.0 → 0.10.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/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.map +1 -1
- package/dist/cli-args.js +1 -1
- package/dist/cli-args.js.map +1 -1
- package/dist/cli-text.d.ts.map +1 -1
- package/dist/cli-text.js +4 -0
- package/dist/cli-text.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +19 -1
- package/dist/cli.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/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.map +1 -1
- package/dist/commands/tree.js +3 -1
- 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/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/detectors/index.d.ts.map +1 -1
- package/dist/detectors/index.js +4 -1
- package/dist/detectors/index.js.map +1 -1
- package/dist/detectors/lexicon.d.ts.map +1 -1
- package/dist/detectors/lexicon.js +8 -1
- package/dist/detectors/lexicon.js.map +1 -1
- package/dist/detectors/structure-tree.d.ts +5 -0
- package/dist/detectors/structure-tree.d.ts.map +1 -1
- package/dist/detectors/structure-tree.js +50 -1
- package/dist/detectors/structure-tree.js.map +1 -1
- package/dist/detectors/team.d.ts.map +1 -1
- package/dist/detectors/team.js +7 -2
- package/dist/detectors/team.js.map +1 -1
- package/dist/detectors/word-list.d.ts +3 -0
- package/dist/detectors/word-list.d.ts.map +1 -0
- package/dist/detectors/word-list.js +3 -0
- package/dist/detectors/word-list.js.map +1 -0
- 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/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 +98 -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 +95 -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 +1 -0
- package/dist/reasons.d.ts.map +1 -1
- package/dist/reasons.js +2 -0
- package/dist/reasons.js.map +1 -1
- package/dist/render/compact.d.ts.map +1 -1
- package/dist/render/compact.js +3 -1
- package/dist/render/compact.js.map +1 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +40 -7
- 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 +105 -11
- package/dist/structure/build.js.map +1 -1
- package/dist/structure/date-order.d.ts +12 -0
- package/dist/structure/date-order.d.ts.map +1 -0
- package/dist/structure/date-order.js +30 -0
- package/dist/structure/date-order.js.map +1 -0
- package/dist/structure/issues.d.ts.map +1 -1
- package/dist/structure/issues.js +9 -2
- package/dist/structure/issues.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 +8 -0
- package/dist/structure/relative-find.d.ts.map +1 -0
- package/dist/structure/relative-find.js +190 -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/runs.d.ts +20 -0
- package/dist/structure/runs.d.ts.map +1 -0
- package/dist/structure/runs.js +63 -0
- package/dist/structure/runs.js.map +1 -0
- package/dist/structure/total.d.ts +14 -0
- package/dist/structure/total.d.ts.map +1 -0
- package/dist/structure/total.js +119 -0
- package/dist/structure/total.js.map +1 -0
- package/dist/structure/unnumbered.d.ts +15 -0
- package/dist/structure/unnumbered.d.ts.map +1 -0
- package/dist/structure/unnumbered.js +28 -0
- package/dist/structure/unnumbered.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/structure/weekday.d.ts +7 -0
- package/dist/structure/weekday.d.ts.map +1 -0
- package/dist/structure/weekday.js +21 -0
- package/dist/structure/weekday.js.map +1 -0
- package/package.json +4 -3
- package/profiles/statute.yaml +66 -0
- package/rules/date-order.yaml +26 -0
- package/rules/date-weekday-mismatch.yaml +26 -0
- package/rules/internal-jargon.yaml +1 -1
- package/rules/total-mismatch.yaml +26 -0
- package/skills/chaff/SKILL.md +24 -4
- package/src/address-chain.ts +113 -0
- package/src/cli-args.ts +1 -1
- package/src/cli-text.ts +4 -0
- package/src/cli.ts +20 -1
- package/src/commands/eval.ts +2 -1
- package/src/commands/feedback.ts +210 -0
- package/src/commands/test.ts +3 -2
- package/src/commands/tree.ts +3 -1
- package/src/config/by-path.ts +11 -3
- package/src/config/load.ts +5 -1
- package/src/detectors/char-shape.ts +5 -4
- package/src/detectors/index.ts +4 -1
- package/src/detectors/lexicon.ts +11 -1
- package/src/detectors/structure-tree.ts +67 -1
- package/src/detectors/team.ts +7 -2
- package/src/detectors/word-list.ts +2 -0
- package/src/document.ts +11 -3
- package/src/feedback/draft.ts +102 -0
- package/src/feedback/excerpt.ts +23 -0
- package/src/orthography.ts +15 -0
- package/src/plugin.ts +95 -0
- package/src/profile/for-file.ts +11 -0
- package/src/profile/load.ts +26 -0
- package/src/profile/parse.ts +119 -0
- package/src/profile/select.ts +35 -0
- package/src/reasons.ts +5 -0
- package/src/render/compact.ts +4 -1
- package/src/run.ts +42 -7
- package/src/structure/build.ts +135 -15
- package/src/structure/date-order.ts +44 -0
- package/src/structure/issues.ts +10 -2
- package/src/structure/of.ts +15 -3
- package/src/structure/relative-find.ts +237 -0
- package/src/structure/relative-resolve.ts +209 -0
- package/src/structure/runs.ts +71 -0
- package/src/structure/total.ts +157 -0
- package/src/structure/unnumbered.ts +33 -0
- package/src/structure/unread.ts +39 -0
- package/src/structure/weekday.ts +25 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
2
|
+
const strings = (value) => (Array.isArray(value) ? value.filter((entry) => typeof entry === "string" && entry !== "") : []);
|
|
3
|
+
const texts = (value) => isRecord(value) ? Object.fromEntries(Object.entries(value).filter((entry) => typeof entry[1] === "string")) : {};
|
|
4
|
+
/** 空でない文字列だけ。空の正規表現は何にでも当たる。 */
|
|
5
|
+
const text = (value) => (typeof value === "string" && value !== "" ? value : undefined);
|
|
6
|
+
const detectOf = (value) => {
|
|
7
|
+
if (!isRecord(value) || typeof value["line"] !== "string")
|
|
8
|
+
return undefined;
|
|
9
|
+
const minLines = value["min_lines"];
|
|
10
|
+
return { line: value["line"], minLines: typeof minLines === "number" && minLines > 0 ? minLines : 1 };
|
|
11
|
+
};
|
|
12
|
+
const unitsOf = (value) => isRecord(value) ? Object.fromEntries(Object.entries(value).filter((entry) => entry[0] !== "" && Number.isInteger(entry[1]))) : {};
|
|
13
|
+
const asideOf = (value) => {
|
|
14
|
+
if (!isRecord(value))
|
|
15
|
+
return undefined;
|
|
16
|
+
const [open, close] = [text(value["open"]), text(value["close"])];
|
|
17
|
+
return open === undefined || close === undefined ? undefined : { open, close };
|
|
18
|
+
};
|
|
19
|
+
/** 括弧の開き・閉じと、目印が一つも無ければ読まない。 */
|
|
20
|
+
const substitutionOf = (value) => {
|
|
21
|
+
if (!isRecord(value))
|
|
22
|
+
return undefined;
|
|
23
|
+
const [open, close] = [text(value["open"]), text(value["close"])];
|
|
24
|
+
const [after, before] = [strings(value["after"]), strings(value["before"])];
|
|
25
|
+
return open === undefined || close === undefined || after.length + before.length === 0
|
|
26
|
+
? undefined
|
|
27
|
+
: { open, close, after, before, document: text(value["document"]) };
|
|
28
|
+
};
|
|
29
|
+
/** 字下げと、どの種類の中か、どの深さかのどれかが無ければ読まない。 */
|
|
30
|
+
const unnumberedOf = (value) => {
|
|
31
|
+
if (!isRecord(value))
|
|
32
|
+
return undefined;
|
|
33
|
+
const [indent, inside, depth] = [text(value["indent"]), text(value["inside"]), value["depth"]];
|
|
34
|
+
return indent === undefined || inside === undefined || !Number.isInteger(depth) || typeof depth !== "number" ? undefined : { indent, inside, depth };
|
|
35
|
+
};
|
|
36
|
+
/** 単位が一つも無ければ読まない。何を指すのか決められない。 */
|
|
37
|
+
const relativeOf = (value) => {
|
|
38
|
+
if (!isRecord(value))
|
|
39
|
+
return undefined;
|
|
40
|
+
const units = unitsOf(value["units"]);
|
|
41
|
+
if (Object.keys(units).length === 0)
|
|
42
|
+
return undefined;
|
|
43
|
+
return {
|
|
44
|
+
before: strings(value["before"]),
|
|
45
|
+
after: strings(value["after"]),
|
|
46
|
+
same: strings(value["same"]),
|
|
47
|
+
current: strings(value["current"]),
|
|
48
|
+
every: strings(value["every"]),
|
|
49
|
+
count: text(value["count"]) ?? "(?!)",
|
|
50
|
+
units,
|
|
51
|
+
suffixPrefix: text(value["suffix_prefix"]) ?? "",
|
|
52
|
+
implicitFirst: typeof value["implicit_first"] === "string" ? units[value["implicit_first"]] : undefined,
|
|
53
|
+
notAfter: text(value["not_after"]),
|
|
54
|
+
substitution: substitutionOf(value["substitution"]),
|
|
55
|
+
inside: strings(value["inside"]).filter((unit) => units[unit] !== undefined),
|
|
56
|
+
joiners: strings(value["joiners"]),
|
|
57
|
+
aside: asideOf(value["aside"]),
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
const LANGUAGE_KEYS = new Set(["id", "name", "why", "detect"]);
|
|
61
|
+
const languagesOf = (id, raw) => Object.fromEntries(Object.entries(raw)
|
|
62
|
+
.filter(([key, value]) => !LANGUAGE_KEYS.has(key) && isRecord(value))
|
|
63
|
+
.map(([language, value]) => {
|
|
64
|
+
const section = isRecord(value) ? value : {};
|
|
65
|
+
const addressEnd = text(section["address_end"]);
|
|
66
|
+
const caption = text(section["caption"]);
|
|
67
|
+
const relative = relativeOf(section["relative"]);
|
|
68
|
+
const unnumbered = unnumberedOf(section["unnumbered"]);
|
|
69
|
+
return [
|
|
70
|
+
language,
|
|
71
|
+
{ id, addresses: strings(section["addresses"]), connectives: strings(section["connectives"]), addressEnd, caption, relative, unnumbered },
|
|
72
|
+
];
|
|
73
|
+
}));
|
|
74
|
+
/** id の無いものは読まない。どの設定から選ばれたのか言えなくなるため。 */
|
|
75
|
+
export const parseProfile = (raw) => {
|
|
76
|
+
if (!isRecord(raw) || typeof raw["id"] !== "string" || raw["id"] === "")
|
|
77
|
+
return undefined;
|
|
78
|
+
const id = raw["id"];
|
|
79
|
+
const detect = isRecord(raw["detect"])
|
|
80
|
+
? Object.fromEntries(Object.entries(raw["detect"]).flatMap(([language, value]) => {
|
|
81
|
+
const found = detectOf(value);
|
|
82
|
+
return found === undefined ? [] : [[language, found]];
|
|
83
|
+
}))
|
|
84
|
+
: {};
|
|
85
|
+
return { id, name: texts(raw["name"]), detect, languages: languagesOf(id, raw) };
|
|
86
|
+
};
|
|
87
|
+
/** 行頭から数える。source 全体に m フラグで当てれば、行ごとに分けずに数えられる。 */
|
|
88
|
+
export const detected = (definition, source, language) => {
|
|
89
|
+
const detect = definition.detect[language];
|
|
90
|
+
if (detect === undefined)
|
|
91
|
+
return false;
|
|
92
|
+
const count = [...source.matchAll(new RegExp(detect.line, "gmu"))].length;
|
|
93
|
+
return count >= detect.minLines;
|
|
94
|
+
};
|
|
95
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/profile/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { DocumentProfile } from "../plugin.ts";
|
|
2
|
+
import { type ProfileDefinition } from "./parse.ts";
|
|
3
|
+
/** 設定で書いた「使わない」。内容から選ぶのも止める。 */
|
|
4
|
+
export declare const NO_PROFILE = "none";
|
|
5
|
+
type ProfileSource = "by-path" | "config" | "content";
|
|
6
|
+
export type ChosenProfile = {
|
|
7
|
+
readonly profile: DocumentProfile;
|
|
8
|
+
readonly from: ProfileSource;
|
|
9
|
+
};
|
|
10
|
+
export type ProfileRequest = {
|
|
11
|
+
readonly byPath: string | undefined;
|
|
12
|
+
readonly config: string | undefined;
|
|
13
|
+
readonly source: string;
|
|
14
|
+
readonly language: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* 強いものから: by_path、chaff.yaml の profile、内容。どれかが none と書けばそこで止め、内容からも選ばない。
|
|
18
|
+
* 名前で選んだ種類にその言語の中身が無ければ選ばない。黙って別の種類にしない。
|
|
19
|
+
*/
|
|
20
|
+
export declare const chooseProfile: (definitions: readonly ProfileDefinition[], request: ProfileRequest) => ChosenProfile | undefined;
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=select.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.d.ts","sourceRoot":"","sources":["../../src/profile/select.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAY,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE9D,gCAAgC;AAChC,eAAO,MAAM,UAAU,SAAS,CAAC;AAEjC,KAAK,aAAa,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtD,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAEhG,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AAKF;;;GAGG;AACH,eAAO,MAAM,aAAa,GAAI,aAAa,SAAS,iBAAiB,EAAE,EAAE,SAAS,cAAc,KAAG,aAAa,GAAG,SAUlH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { detected } from "./parse.js";
|
|
2
|
+
/** 設定で書いた「使わない」。内容から選ぶのも止める。 */
|
|
3
|
+
export const NO_PROFILE = "none";
|
|
4
|
+
const named = (definitions, id, language) => definitions.find((definition) => definition.id === id)?.languages[language];
|
|
5
|
+
/**
|
|
6
|
+
* 強いものから: by_path、chaff.yaml の profile、内容。どれかが none と書けばそこで止め、内容からも選ばない。
|
|
7
|
+
* 名前で選んだ種類にその言語の中身が無ければ選ばない。黙って別の種類にしない。
|
|
8
|
+
*/
|
|
9
|
+
export const chooseProfile = (definitions, request) => {
|
|
10
|
+
const written = request.byPath ?? request.config;
|
|
11
|
+
if (written === NO_PROFILE)
|
|
12
|
+
return undefined;
|
|
13
|
+
if (written !== undefined) {
|
|
14
|
+
const profile = named(definitions, written, request.language);
|
|
15
|
+
return profile === undefined ? undefined : { profile, from: request.byPath === undefined ? "config" : "by-path" };
|
|
16
|
+
}
|
|
17
|
+
const found = definitions.find((definition) => detected(definition, request.source, request.language));
|
|
18
|
+
const profile = found?.languages[request.language];
|
|
19
|
+
return profile === undefined ? undefined : { profile, from: "content" };
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=select.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"select.js","sourceRoot":"","sources":["../../src/profile/select.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAA0B,MAAM,YAAY,CAAC;AAE9D,gCAAgC;AAChC,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AAajC,MAAM,KAAK,GAAG,CAAC,WAAyC,EAAE,EAAU,EAAE,QAAgB,EAA+B,EAAE,CACrH,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE9E;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,WAAyC,EAAE,OAAuB,EAA6B,EAAE;IAC7H,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IACjD,IAAI,OAAO,KAAK,UAAU;QAAE,OAAO,SAAS,CAAC;IAC7C,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC9D,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACpH,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvG,MAAM,OAAO,GAAG,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnD,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;AAC1E,CAAC,CAAC"}
|
package/dist/reasons.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export type Reasons = {
|
|
|
8
8
|
readonly experimental: string;
|
|
9
9
|
readonly turnedOff: string;
|
|
10
10
|
readonly noStructure: (language: string) => string;
|
|
11
|
+
readonly unreadStructure: (clauses: number, units: number) => string;
|
|
11
12
|
readonly noDetector: (name: string) => string;
|
|
12
13
|
readonly noLexicon: (language: string, list: string) => string;
|
|
13
14
|
};
|
package/dist/reasons.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reasons.d.ts","sourceRoot":"","sources":["../src/reasons.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,4HAA4H;AAC5H,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACrD,QAAQ,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAChE,CAAC;AAOF,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,OAAO,
|
|
1
|
+
{"version":3,"file":"reasons.d.ts","sourceRoot":"","sources":["../src/reasons.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,4HAA4H;AAC5H,MAAM,MAAM,OAAO,GAAG;IACpB,QAAQ,CAAC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACrD,QAAQ,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IACtD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACnD,QAAQ,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACrE,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAChE,CAAC;AAOF,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,OAAO,CA2BlC,CAAC"}
|
package/dist/reasons.js
CHANGED
|
@@ -11,6 +11,7 @@ export const REASONS = {
|
|
|
11
11
|
experimental: "まだ試験中のため",
|
|
12
12
|
turnedOff: "設定で止めているため",
|
|
13
13
|
noStructure: (language) => `${language} のパッケージは文書の構造を読めないため`,
|
|
14
|
+
unreadStructure: (clauses, units) => `条項の番号が本文に ${String(clauses)} 個あるのに、番号として読めたのは ${String(units)} 個のため(深い字下げや、行が本文につながった文書)`,
|
|
14
15
|
noDetector: (name) => `検出器 ${name} がないため`,
|
|
15
16
|
noLexicon: (language, list) => `${language} の語彙表 ${list} が無いため`,
|
|
16
17
|
},
|
|
@@ -22,6 +23,7 @@ export const REASONS = {
|
|
|
22
23
|
experimental: "still experimental",
|
|
23
24
|
turnedOff: "turned off in the settings",
|
|
24
25
|
noStructure: (language) => `the ${language} package cannot read a document's structure`,
|
|
26
|
+
unreadStructure: (clauses, units) => `the text has ${String(clauses)} clause numbers but only ${String(units)} were read as numbered lines (deep indents, or lines run into the text)`,
|
|
25
27
|
noDetector: (name) => `no detector named ${name}`,
|
|
26
28
|
noLexicon: (language, list) => `the ${language} package has no word list ${list}`,
|
|
27
29
|
},
|
package/dist/reasons.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reasons.js","sourceRoot":"","sources":["../src/reasons.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"reasons.js","sourceRoot":"","sources":["../src/reasons.ts"],"names":[],"mappings":"AAgBA,MAAM,eAAe,GAA4C;IAC/D,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE;IAChC,EAAE,EAAE,EAAE,GAAG,EAAE,wBAAwB,EAAE,KAAK,EAAE,QAAQ,EAAE;CACvD,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAmB;IACrC,EAAE,EAAE;QACF,aAAa,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,QAAQ,kBAAkB;QAC1D,YAAY,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,eAAe,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,UAAU,SAAS;QAC5F,MAAM,EAAE,kBAAkB;QAC1B,QAAQ,EAAE,kCAAkC;QAC5C,YAAY,EAAE,UAAU;QACxB,SAAS,EAAE,YAAY;QACvB,WAAW,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,QAAQ,sBAAsB;QAC5D,eAAe,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAClC,aAAa,MAAM,CAAC,OAAO,CAAC,qBAAqB,MAAM,CAAC,KAAK,CAAC,4BAA4B;QAC5F,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,QAAQ;QACzC,SAAS,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,QAAQ,SAAS,IAAI,QAAQ;KAChE;IACD,EAAE,EAAE;QACF,aAAa,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,kBAAkB,QAAQ,EAAE;QACzD,YAAY,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,UAAU,qCAAqC;QAClH,MAAM,EAAE,kDAAkD;QAC1D,QAAQ,EAAE,0CAA0C;QACpD,YAAY,EAAE,oBAAoB;QAClC,SAAS,EAAE,4BAA4B;QACvC,WAAW,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,QAAQ,6CAA6C;QACvF,eAAe,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAClC,gBAAgB,MAAM,CAAC,OAAO,CAAC,4BAA4B,MAAM,CAAC,KAAK,CAAC,yEAAyE;QACnJ,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,IAAI,EAAE;QACjD,SAAS,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,QAAQ,6BAA6B,IAAI,EAAE;KAClF;CACF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compact.d.ts","sourceRoot":"","sources":["../../src/render/compact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"compact.d.ts","sourceRoot":"","sources":["../../src/render/compact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAM3C,uBAAuB;AACvB,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,EAAE,QAAQ,SAAS,EAAE,OAAO,SAAS,cAAc,EAAE,EAAE,UAAU,MAAM,KAAG,MAYrH,CAAC"}
|
package/dist/render/compact.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { messageOf } from "./text.js";
|
|
2
|
+
/** 「1 finding」「2 findings」。 */
|
|
3
|
+
const counted = (count, noun) => `${String(count)} ${noun}${count === 1 ? "" : "s"}`;
|
|
2
4
|
/** エンジニア向け。1 件 2 行。 */
|
|
3
5
|
export const renderCompact = (header, result, rules, language) => {
|
|
4
6
|
const byId = new Map(rules.map((rule) => [rule.id, rule]));
|
|
@@ -9,7 +11,7 @@ export const renderCompact = (header, result, rules, language) => {
|
|
|
9
11
|
const at = `${finding.line}:${finding.column}`.padEnd(8);
|
|
10
12
|
return [` ${at}${finding.severity.padEnd(8)}${messageOf(rule, finding, language)}`, ` ${" ".repeat(8)}${finding.rule}`];
|
|
11
13
|
});
|
|
12
|
-
const tail = [
|
|
14
|
+
const tail = [counted(result.findings.length, "finding"), result.skipped.length > 0 ? `${counted(result.skipped.length, "rule")} not run` : undefined].filter((part) => part !== undefined);
|
|
13
15
|
return ["", header, "", ...lines, "", tail.join(", "), ""].join("\n");
|
|
14
16
|
};
|
|
15
17
|
//# sourceMappingURL=compact.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compact.js","sourceRoot":"","sources":["../../src/render/compact.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,uBAAuB;AACvB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,MAAiB,EAAE,KAAgC,EAAE,QAAgB,EAAU,EAAE;IAC7H,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,aAAa,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACpI,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"compact.js","sourceRoot":"","sources":["../../src/render/compact.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,+BAA+B;AAC/B,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,IAAY,EAAU,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;AAE7G,uBAAuB;AACvB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,MAAiB,EAAE,KAAgC,EAAE,QAAgB,EAAU,EAAE;IAC7H,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAChD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,aAAa,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACpI,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAC3J,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAC7B,CAAC;IACF,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxE,CAAC,CAAC"}
|
package/dist/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAQ/F,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IACrC,+DAA+D;IAC/D,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AA+EvD;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,SAAS,cAAc,EAAE,EAAE,UAAU,QAAQ,EAAE,cAAc,OAAO,EAAE,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,YAKtI,CAAC;AA+BH,+CAA+C;AAC/C,MAAM,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAItD,eAAO,MAAM,QAAQ,GACnB,KAAK,aAAa,EAClB,OAAO,SAAS,cAAc,EAAE,EAChC,UAAU,QAAQ,EAClB,cAAc,OAAO,EACrB,OAAO,MAAM,EACb,SAAQ,MAAW,KAClB,SAiDF,CAAC"}
|
package/dist/run.js
CHANGED
|
@@ -2,6 +2,9 @@ import { DETECTORS } from "./detectors/index.js";
|
|
|
2
2
|
import { resolve } from "./levels.js";
|
|
3
3
|
import { lineStarts, placeOf } from "./position.js";
|
|
4
4
|
import { REASONS } from "./reasons.js";
|
|
5
|
+
import { joinWords } from "./detectors/word-list.js";
|
|
6
|
+
import { unreadStructure } from "./structure/unread.js";
|
|
7
|
+
import { isMarkdownPath } from "./structure/markdown-path.js";
|
|
5
8
|
import { uiLanguageOf } from "./ui.js";
|
|
6
9
|
const levelFor = (rule, settings, experimental) => {
|
|
7
10
|
const explicit = settings[rule.id];
|
|
@@ -13,6 +16,36 @@ const levelFor = (rule, settings, experimental) => {
|
|
|
13
16
|
return "normal";
|
|
14
17
|
};
|
|
15
18
|
const reasonsFor = (doc) => REASONS[uiLanguageOf(doc.language)];
|
|
19
|
+
/**
|
|
20
|
+
* 構造の rule が動けない理由。木を作れない言語か、番号の行を読めなかった文書。
|
|
21
|
+
* 読めなかった文書で「参照先が無い」が 0 件なのは、確かめた結果ではないので、読めなかったと言う。
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* 木を読む rule の要求。structure は番号の並びを読む(読めなかった文書では動かない)。dates と quantities は木の日付と数量だけを
|
|
25
|
+
* 読むので、番号を読めなかった文書でも動く。どちらも capability ではなく、adapter が木を作れるかで決まる。
|
|
26
|
+
*/
|
|
27
|
+
const TREE_NEEDS = new Set(["structure", "dates", "quantities"]);
|
|
28
|
+
const VALUE_NEEDS = ["dates", "quantities"];
|
|
29
|
+
const treeNeed = (rule, doc) => {
|
|
30
|
+
if (rule.requires.includes("structure"))
|
|
31
|
+
return treeProblem(doc);
|
|
32
|
+
return rule.requires.some((need) => VALUE_NEEDS.includes(need)) && doc.structure === undefined ? reasonsFor(doc).noStructure(doc.language) : undefined;
|
|
33
|
+
};
|
|
34
|
+
const treeProblem = (doc) => {
|
|
35
|
+
if (doc.structure === undefined)
|
|
36
|
+
return reasonsFor(doc).noStructure(doc.language);
|
|
37
|
+
const unread = unreadOf(doc);
|
|
38
|
+
return unread === undefined ? undefined : reasonsFor(doc).unreadStructure(unread.clauses, unread.units);
|
|
39
|
+
};
|
|
40
|
+
/** 木が読んだのと同じ本文。Markdown はコードを覆ったもの、.txt はそのまま(.txt の字下げはコードではない)。 */
|
|
41
|
+
const textTheTreeRead = (doc) => (isMarkdownPath(doc.path) ? (doc.prose ?? doc.source) : doc.source);
|
|
42
|
+
const unreadByDocument = new WeakMap();
|
|
43
|
+
/** 文書ごとに一度だけ数える。構造の rule が三つあっても、本文を三度なめない。 */
|
|
44
|
+
const unreadOf = (doc) => {
|
|
45
|
+
if (!unreadByDocument.has(doc))
|
|
46
|
+
unreadByDocument.set(doc, doc.structure === undefined ? undefined : unreadStructure(textTheTreeRead(doc), doc.structure));
|
|
47
|
+
return unreadByDocument.get(doc);
|
|
48
|
+
};
|
|
16
49
|
/** 知らない要求は満たされていないものとして扱う。黙って無視すると、要求なしで動いてしまう。 */
|
|
17
50
|
const has = (capabilities, need) => {
|
|
18
51
|
if (need === "pos")
|
|
@@ -33,7 +66,7 @@ const hasTokens = (doc) => doc.sentences.length === 0 || doc.sentences.some((sen
|
|
|
33
66
|
const unmet = (rule, doc) => {
|
|
34
67
|
if (rule.languages !== undefined && !rule.languages.includes(doc.language))
|
|
35
68
|
return reasonsFor(doc).otherLanguage(doc.language);
|
|
36
|
-
const missing = rule.requires.filter((need) => need
|
|
69
|
+
const missing = rule.requires.filter((need) => !TREE_NEEDS.has(need)).find((need) => !has(doc.capabilities, need));
|
|
37
70
|
if (missing !== undefined)
|
|
38
71
|
return reasonsFor(doc).noCapability(missing);
|
|
39
72
|
return undefined;
|
|
@@ -66,7 +99,7 @@ const place = (starts, finding) => {
|
|
|
66
99
|
* 元の指摘は消さない。`padded-intro` のように単独でも正しい指摘が混ざっており、
|
|
67
100
|
* まとめるために消すと本物の指摘が見えなくなる。
|
|
68
101
|
*/
|
|
69
|
-
const compositeOf = (rule, found, limit, starts) => {
|
|
102
|
+
const compositeOf = (rule, found, limit, starts, language) => {
|
|
70
103
|
const fired = rule.from.filter((id) => found.some((finding) => finding.rule === id));
|
|
71
104
|
if (fired.length < limit)
|
|
72
105
|
return [];
|
|
@@ -78,7 +111,7 @@ const compositeOf = (rule, found, limit, starts) => {
|
|
|
78
111
|
line: 0,
|
|
79
112
|
column: 0,
|
|
80
113
|
quote: first?.quote ?? "",
|
|
81
|
-
values: { word: fired
|
|
114
|
+
values: { word: joinWords(fired, language), count: fired.length, limit, offset: first === undefined ? 0 : Number(first.values["offset"] ?? 0) },
|
|
82
115
|
}),
|
|
83
116
|
];
|
|
84
117
|
};
|
|
@@ -107,9 +140,9 @@ export const runRules = (doc, rules, settings, experimental, genre, limits = {})
|
|
|
107
140
|
return { findings: acc.findings, skipped: [...acc.skipped, { rule: rule.id, why: noTags }] };
|
|
108
141
|
// 木は capability ではなく、adapter が structure を持つかで決まる。持たない言語で動かすと「参照先が無い」が 0 件に見える。
|
|
109
142
|
// 段階を見た後で聞く。doc.structure は触れたときに木を作るので、止めている rule のために作らない。
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
143
|
+
const noTree = treeNeed(rule, doc);
|
|
144
|
+
if (noTree !== undefined)
|
|
145
|
+
return { findings: acc.findings, skipped: [...acc.skipped, { rule: rule.id, why: noTree }] };
|
|
113
146
|
// 複合シグナルは二段目で扱う。一段目では「検出器が無い」と言わせない。
|
|
114
147
|
if (rule.from.length > 0)
|
|
115
148
|
return acc;
|
|
@@ -130,7 +163,7 @@ export const runRules = (doc, rules, settings, experimental, genre, limits = {})
|
|
|
130
163
|
}, { findings: [], skipped: [] });
|
|
131
164
|
const composites = applicable
|
|
132
165
|
.filter((rule) => rule.from.length > 0 && levelFor(rule, settings, experimental) !== "off")
|
|
133
|
-
.flatMap((rule) => compositeOf(rule, outcome.findings, limitFor(rule, levelFor(rule, settings, experimental), genre, limits), starts));
|
|
166
|
+
.flatMap((rule) => compositeOf(rule, outcome.findings, limitFor(rule, levelFor(rule, settings, experimental), genre, limits), starts, doc.language));
|
|
134
167
|
const all = [...outcome.findings, ...composites];
|
|
135
168
|
return { ...outcome, findings: [...all].sort((left, right) => left.line - right.line), forcedExperimental: forced };
|
|
136
169
|
};
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,OAAO,EAAgB,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAavC,MAAM,QAAQ,GAAG,CAAC,IAAoB,EAAE,QAAkB,EAAE,YAAqB,EAAS,EAAE;IAC1F,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,6CAA6C;IAC7C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAClE,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,GAAkB,EAAW,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;AAExF,mDAAmD;AACnD,MAAM,GAAG,GAAG,CAAC,YAA2C,EAAE,IAAY,EAAW,EAAE;IACjF,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,YAAY,CAAC,GAAG,CAAC;IAC5C,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,YAAY,CAAC,KAAK,CAAC;IAChD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,SAAS,GAAG,CAAC,GAAkB,EAAW,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;AAEjJ,uDAAuD;AACvD,MAAM,KAAK,GAAG,CAAC,IAAoB,EAAE,GAAkB,EAAsB,EAAE;IAC7E,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC/H,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Heading } from "../document.ts";
|
|
2
|
-
import type { Span, StructureNode, StructurePatterns } from "../plugin.ts";
|
|
2
|
+
import type { DocumentProfile, Span, StructureNode, StructurePatterns } from "../plugin.ts";
|
|
3
3
|
/** Markdown から取った手がかり。見出しと、中を読まない範囲(コード)。.txt はどちらも空。 */
|
|
4
4
|
export type Outline = {
|
|
5
5
|
readonly headings: readonly Heading[];
|
|
@@ -11,6 +11,7 @@ export type StructureInput = {
|
|
|
11
11
|
readonly source: string;
|
|
12
12
|
readonly language: string;
|
|
13
13
|
readonly outline: Outline;
|
|
14
|
+
readonly profile?: DocumentProfile | undefined;
|
|
14
15
|
};
|
|
15
16
|
/**
|
|
16
17
|
* 文書を番地の付いた木にする。番号の書き方は言語パッケージが読み、ここは入れ子と番地だけを決める。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/structure/build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/structure/build.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAM9C,OAAO,KAAK,EAAE,eAAe,EAA2C,IAAI,EAAiB,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAyNpJ,yDAAyD;AACzD,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE,CAAA;CAAE,CAAC;AAElG,eAAO,MAAM,UAAU,EAAE,OAAsC,CAAC;AAEhE,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;CAChD,CAAC;AAqEF;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,OAAO,cAAc,EAAE,UAAU,iBAAiB,KAAG,aAyB9E,CAAC"}
|
package/dist/structure/build.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { atxHeadingText, headingText } from "../heading-text.js";
|
|
2
|
+
import { addressSpans } from "../address-chain.js";
|
|
3
|
+
import { relativeMentions, substitutedDocuments } from "./relative-find.js";
|
|
4
|
+
import { resolveRelative } from "./relative-resolve.js";
|
|
2
5
|
import { maskSpans } from "../mask.js";
|
|
3
6
|
import { lineNumberAt, linesOf } from "./lines.js";
|
|
4
7
|
import { dottedNumber } from "./universal.js";
|
|
8
|
+
import { unnumberedUnit } from "./unnumbered.js";
|
|
5
9
|
/**
|
|
6
10
|
* 見出しは深さ 1〜6 を rank にする。番号のまとまりは必ず見出しの内側に入るので、
|
|
7
11
|
* それより大きい rank から数える。「## 第3条」の下の番号だけの項は、見出しに閉じられずに条の中へ入る。
|
|
@@ -55,7 +59,7 @@ const headingAddress = (state, depth) => {
|
|
|
55
59
|
* 見出しに書いた番号(「## 第3条」)は、見出しの深さで入れ子にする。本文の番号は見出しの内側に入る。
|
|
56
60
|
* 見出しの深さを捨てると、「## 第3条」の下の「### 詳細」が条の外に出てしまう。
|
|
57
61
|
*/
|
|
58
|
-
const openNumbered = (state, line, numbered, headingDepth) => {
|
|
62
|
+
const openNumbered = (state, line, numbered, headingDepth, bodyOnLine) => {
|
|
59
63
|
const attrs = { label: numbered.label, ...(numbered.heading === "" ? {} : { heading: numbered.heading }) };
|
|
60
64
|
const rank = headingDepth ?? NUMBERED_RANK + numbered.depth;
|
|
61
65
|
// 番地は、自分と同じか内側を閉じてから決める。閉じる前だと、同じ深さの前の条を親と取り違える。
|
|
@@ -66,19 +70,34 @@ const openNumbered = (state, line, numbered, headingDepth) => {
|
|
|
66
70
|
ordinal: numbered.ordinal,
|
|
67
71
|
level: numbered.depth,
|
|
68
72
|
ordinalTo: numbered.ordinalTo,
|
|
73
|
+
numbering: numbered.numbering,
|
|
69
74
|
};
|
|
70
|
-
open(state, { draft, rank, numbered });
|
|
75
|
+
open(state, { draft, rank, numbered, bodyOnLine });
|
|
71
76
|
};
|
|
72
77
|
const openSection = (state, line, heading) => {
|
|
73
78
|
while (state.stack.length > 1 && top(state).rank >= heading.depth)
|
|
74
79
|
state.stack.pop();
|
|
75
80
|
open(state, { draft: draftOf("section", headingAddress(state, heading.depth), line, { heading: heading.text }), rank: heading.depth });
|
|
76
81
|
};
|
|
82
|
+
/** 番地(文書の種類が決める「前二項」など)の中の数は、数量ではない。 */
|
|
83
|
+
const outsideAddresses = (mentions, text, profile) => {
|
|
84
|
+
const spans = addressSpans(text, profile);
|
|
85
|
+
return spans.length === 0 ? mentions : mentions.filter((mention) => !spans.some((span) => span.start <= mention.start && mention.end <= span.end));
|
|
86
|
+
};
|
|
87
|
+
/** 番地を名指しした参照(第百五十七条第一項)の一部は、相対の参照ではない。 */
|
|
88
|
+
const withoutAbsolute = (relative, absolute) => relative.filter((mention) => !absolute.some((other) => mention.start < other.end && other.start < mention.end));
|
|
77
89
|
const LEAVES = [
|
|
78
90
|
{ kind: "definition", find: (patterns, text) => patterns.definitions(text) },
|
|
79
|
-
{ kind: "reference", find: (patterns, text) => patterns.references(text) },
|
|
91
|
+
{ kind: "reference", find: (patterns, text, profile) => substitutedDocuments(patterns.references(text), text, profile) },
|
|
92
|
+
{
|
|
93
|
+
kind: "reference",
|
|
94
|
+
find: (patterns, text, profile) => {
|
|
95
|
+
const absolute = patterns.references(text);
|
|
96
|
+
return withoutAbsolute(relativeMentions(text, profile, patterns.number, absolute), absolute);
|
|
97
|
+
},
|
|
98
|
+
},
|
|
80
99
|
{ kind: "obligation", find: (patterns, text) => patterns.obligations(text) },
|
|
81
|
-
{ kind: "quantity", find: (patterns, text) => patterns.quantities(text) },
|
|
100
|
+
{ kind: "quantity", find: (patterns, text, profile) => outsideAddresses(patterns.quantities(text), text, profile) },
|
|
82
101
|
{ kind: "date", find: (patterns, text) => patterns.dates?.(text) ?? [] },
|
|
83
102
|
];
|
|
84
103
|
/** 言語を問わない通し番号。後ろが単位なら数量なので番号にしない。 */
|
|
@@ -87,10 +106,49 @@ const universalNumber = (patterns, text, context) => {
|
|
|
87
106
|
return dotted !== undefined && patterns.countedAfter?.(dotted.number, dotted.rest) === true ? undefined : dotted;
|
|
88
107
|
};
|
|
89
108
|
/** 行の中の定義・参照・義務・数量を、いま開いている最も内側の節点の子にする。 */
|
|
109
|
+
const enclosingArticle = (state) => [...state.stack].reverse().find((frame) => frame.draft.kind === "article")?.draft;
|
|
110
|
+
/** 条より広い範囲(「In this Part」)なら、その深さの開いているまとまり。開いていなければ(Part の見出しの無い文書)無い。 */
|
|
111
|
+
const widerScope = (state, patterns, text) => {
|
|
112
|
+
const depth = patterns.definitionScopeDepth?.(text);
|
|
113
|
+
return depth === undefined ? undefined : [...state.stack].reverse().find((frame) => frame.numbered?.depth === depth)?.draft;
|
|
114
|
+
};
|
|
115
|
+
/** 範囲を宣言した行を持つまとまり。条の中なら条、条の外(Markdown の見出しの下、Part の直下)なら開いている一番内側のもの。 */
|
|
116
|
+
const holderOf = (state) => enclosingArticle(state) ?? top(state).draft;
|
|
117
|
+
/**
|
|
118
|
+
* 定義の範囲。範囲を宣言した行(In this section— / In this Part—)を含むまとまりの定義が対象。宣言が Part なら、比べるのは
|
|
119
|
+
* その Part の中(within に番地を残す)。条の外で宣言したものは、そのまとまりの中。宣言の無いところの定義は、文書全体で比べる。
|
|
120
|
+
*/
|
|
121
|
+
const scopeOf = (state, patterns, text) => {
|
|
122
|
+
const holder = holderOf(state);
|
|
123
|
+
if (patterns.opensDefinitionScope?.(text) === true) {
|
|
124
|
+
state.scopedArticles.add(holder);
|
|
125
|
+
const wider = widerScope(state, patterns, text);
|
|
126
|
+
if (wider !== undefined)
|
|
127
|
+
state.widerScopes.set(holder, wider);
|
|
128
|
+
}
|
|
129
|
+
if (!state.scopedArticles.has(holder))
|
|
130
|
+
return {};
|
|
131
|
+
const within = state.widerScopes.get(holder) ?? (holder.kind === "article" ? undefined : holder);
|
|
132
|
+
return within === undefined ? { scope: "local" } : { scope: "local", within: within.address };
|
|
133
|
+
};
|
|
90
134
|
const addLeaves = (state, patterns, line, text, offset) => {
|
|
91
135
|
const parent = top(state).draft;
|
|
92
|
-
const
|
|
93
|
-
leaves
|
|
136
|
+
const scope = scopeOf(state, patterns, text);
|
|
137
|
+
const leaves = LEAVES.flatMap(({ kind, find }) => find(patterns, text, state.profile).map((mention) => ({
|
|
138
|
+
kind,
|
|
139
|
+
start: line.start + offset + mention.start,
|
|
140
|
+
end: line.start + offset + mention.end,
|
|
141
|
+
attrs: mention.attrs,
|
|
142
|
+
}))).sort((left, right) => left.start - right.start);
|
|
143
|
+
leaves.forEach((leaf) => parent.children.push({
|
|
144
|
+
kind: leaf.kind,
|
|
145
|
+
address: "",
|
|
146
|
+
start: leaf.start,
|
|
147
|
+
end: leaf.end,
|
|
148
|
+
line: line.number,
|
|
149
|
+
attrs: leaf.kind === "definition" ? { ...leaf.attrs, ...scope } : leaf.attrs,
|
|
150
|
+
children: [],
|
|
151
|
+
}));
|
|
94
152
|
};
|
|
95
153
|
const extend = (state, end) => {
|
|
96
154
|
state.stack.forEach((frame) => {
|
|
@@ -107,6 +165,7 @@ const freeze = (draft) => ({
|
|
|
107
165
|
...(draft.ordinal === undefined ? {} : { ordinal: draft.ordinal }),
|
|
108
166
|
...(draft.level === undefined ? {} : { level: draft.level }),
|
|
109
167
|
...(draft.ordinalTo === undefined ? {} : { ordinalTo: draft.ordinalTo }),
|
|
168
|
+
...(draft.numbering === undefined ? {} : { numbering: draft.numbering }),
|
|
110
169
|
});
|
|
111
170
|
export const NO_OUTLINE = { headings: [], opaque: [] };
|
|
112
171
|
/** 見出しのある行を、行番号から引けるようにする。見出しごとに全行を探し直さない。 */
|
|
@@ -127,16 +186,41 @@ const headingLineText = (text) => {
|
|
|
127
186
|
return headingText(line);
|
|
128
187
|
return atxHeadingText(line.replace(/^#{1,6}(?=[ \t]|$)/u, "").trim());
|
|
129
188
|
};
|
|
189
|
+
const captionPatterns = new WeakMap();
|
|
190
|
+
/** 文書の種類が決めた見出しだけの行なら、その言葉(最初の括弧の中、括弧が無ければ行全体)。 */
|
|
191
|
+
const captionOf = (profile, text) => {
|
|
192
|
+
if (profile === undefined)
|
|
193
|
+
return undefined;
|
|
194
|
+
if (!captionPatterns.has(profile))
|
|
195
|
+
captionPatterns.set(profile, profile.caption === undefined ? undefined : new RegExp(profile.caption, "u"));
|
|
196
|
+
const found = captionPatterns.get(profile)?.exec(text);
|
|
197
|
+
const words = (found?.[1] ?? found?.[0])?.trim();
|
|
198
|
+
return words === "" ? undefined : words;
|
|
199
|
+
};
|
|
200
|
+
const openUnits = (state) => state.stack.flatMap((frame) => (frame.numbered === undefined ? [] : [{ numbered: frame.numbered, bodyOnLine: frame.bodyOnLine === true }]));
|
|
201
|
+
/** 言語の番号の読み方、文書の種類の番号を書かない単位、言語を問わない通し番号の順に読む。 */
|
|
202
|
+
const numberedLine = (state, patterns, text, context) => patterns.numbered(text, context) ?? unnumberedUnit(text, openUnits(state), state.profile?.unnumbered) ?? universalNumber(patterns, text, context);
|
|
203
|
+
/** 番号の後ろが見出しでなく本文か。前の行から見出しが付く前の、行そのもので決める。 */
|
|
204
|
+
const carriesBody = (found) => found !== undefined && found.heading === "" && found.rest !== "";
|
|
205
|
+
/** 見出しの無い条のすぐ前の行が見出しだけの行なら、それを条の見出しにする。 */
|
|
206
|
+
const withCaption = (state, line, numbered) => {
|
|
207
|
+
const caption = numbered?.kind === "article" && numbered.heading === "" ? state.captions.get(line.number - 1) : undefined;
|
|
208
|
+
return numbered === undefined || caption === undefined ? numbered : { ...numbered, heading: caption };
|
|
209
|
+
};
|
|
130
210
|
const readLine = (state, patterns, line, heading) => {
|
|
131
211
|
const text = heading === undefined ? line.text : headingLineText(line.text);
|
|
132
212
|
const openNumbers = state.stack.flatMap((frame) => (frame.numbered === undefined ? [] : [frame.numbered]));
|
|
133
213
|
const context = { open: openNumbers, isHeading: heading !== undefined };
|
|
134
|
-
const
|
|
214
|
+
const found = numberedLine(state, patterns, text, context);
|
|
215
|
+
const numbered = withCaption(state, line, found);
|
|
216
|
+
const caption = numbered === undefined && heading === undefined ? captionOf(state.profile, text) : undefined;
|
|
217
|
+
if (caption !== undefined)
|
|
218
|
+
state.captions.set(line.number, caption);
|
|
135
219
|
// 番号付きの見出しも見出しの通し番号を進める。進めないと、その下の「### 詳細」が前の見出しの番地を名乗る。
|
|
136
220
|
if (numbered !== undefined && heading !== undefined)
|
|
137
221
|
headingAddress(state, heading.depth);
|
|
138
222
|
if (numbered !== undefined)
|
|
139
|
-
openNumbered(state, line, numbered, heading?.depth);
|
|
223
|
+
openNumbered(state, line, numbered, heading?.depth, carriesBody(found));
|
|
140
224
|
else if (heading !== undefined)
|
|
141
225
|
openSection(state, line, heading);
|
|
142
226
|
extend(state, line.start + line.text.length);
|
|
@@ -156,9 +240,17 @@ export const buildTree = (input, patterns) => {
|
|
|
156
240
|
// 文中の `第99条` は参照として拾われない。位置は元の文書のまま。
|
|
157
241
|
const lines = linesOf(maskSpans(input.source, outline.opaque));
|
|
158
242
|
const headings = headingsByLine(lines, outline.headings);
|
|
159
|
-
const
|
|
243
|
+
const attrs = { path: input.path, language: input.language, ...(input.profile === undefined ? {} : { profile: input.profile.id }) };
|
|
244
|
+
const doc = draftOf("doc", "", { text: "", start: 0, number: 1 }, attrs);
|
|
160
245
|
doc.end = input.source.length;
|
|
161
|
-
const state = {
|
|
246
|
+
const state = {
|
|
247
|
+
stack: [{ draft: doc, rank: 0 }],
|
|
248
|
+
headingCounts: [],
|
|
249
|
+
scopedArticles: new Set(),
|
|
250
|
+
widerScopes: new Map(),
|
|
251
|
+
profile: input.profile,
|
|
252
|
+
captions: new Map(),
|
|
253
|
+
};
|
|
162
254
|
lines.forEach((line) => {
|
|
163
255
|
if (line.text.trim() !== "")
|
|
164
256
|
readLine(state, patterns, line, headings.get(line.number));
|
|
@@ -166,6 +258,8 @@ export const buildTree = (input, patterns) => {
|
|
|
166
258
|
else if (input.source.slice(line.start, line.start + line.text.length).trim() !== "")
|
|
167
259
|
extend(state, line.start + line.text.length);
|
|
168
260
|
});
|
|
169
|
-
|
|
261
|
+
const tree = freeze(doc);
|
|
262
|
+
const relative = input.profile?.relative;
|
|
263
|
+
return relative === undefined ? tree : resolveRelative(tree, relative.implicitFirst);
|
|
170
264
|
};
|
|
171
265
|
//# sourceMappingURL=build.js.map
|