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.
Files changed (190) hide show
  1. package/dist/address-chain.d.ts +9 -0
  2. package/dist/address-chain.d.ts.map +1 -0
  3. package/dist/address-chain.js +105 -0
  4. package/dist/address-chain.js.map +1 -0
  5. package/dist/cli-args.d.ts.map +1 -1
  6. package/dist/cli-args.js +1 -1
  7. package/dist/cli-args.js.map +1 -1
  8. package/dist/cli-text.d.ts.map +1 -1
  9. package/dist/cli-text.js +4 -0
  10. package/dist/cli-text.js.map +1 -1
  11. package/dist/cli.d.ts.map +1 -1
  12. package/dist/cli.js +19 -1
  13. package/dist/cli.js.map +1 -1
  14. package/dist/commands/eval.d.ts.map +1 -1
  15. package/dist/commands/eval.js +2 -1
  16. package/dist/commands/eval.js.map +1 -1
  17. package/dist/commands/feedback.d.ts +35 -0
  18. package/dist/commands/feedback.d.ts.map +1 -0
  19. package/dist/commands/feedback.js +157 -0
  20. package/dist/commands/feedback.js.map +1 -0
  21. package/dist/commands/test.d.ts.map +1 -1
  22. package/dist/commands/test.js +3 -2
  23. package/dist/commands/test.js.map +1 -1
  24. package/dist/commands/tree.d.ts.map +1 -1
  25. package/dist/commands/tree.js +3 -1
  26. package/dist/commands/tree.js.map +1 -1
  27. package/dist/config/by-path.d.ts +5 -1
  28. package/dist/config/by-path.d.ts.map +1 -1
  29. package/dist/config/by-path.js +1 -4
  30. package/dist/config/by-path.js.map +1 -1
  31. package/dist/config/load.d.ts +2 -0
  32. package/dist/config/load.d.ts.map +1 -1
  33. package/dist/config/load.js +3 -1
  34. package/dist/config/load.js.map +1 -1
  35. package/dist/detectors/char-shape.d.ts.map +1 -1
  36. package/dist/detectors/char-shape.js +3 -2
  37. package/dist/detectors/char-shape.js.map +1 -1
  38. package/dist/detectors/index.d.ts.map +1 -1
  39. package/dist/detectors/index.js +4 -1
  40. package/dist/detectors/index.js.map +1 -1
  41. package/dist/detectors/lexicon.d.ts.map +1 -1
  42. package/dist/detectors/lexicon.js +8 -1
  43. package/dist/detectors/lexicon.js.map +1 -1
  44. package/dist/detectors/structure-tree.d.ts +5 -0
  45. package/dist/detectors/structure-tree.d.ts.map +1 -1
  46. package/dist/detectors/structure-tree.js +50 -1
  47. package/dist/detectors/structure-tree.js.map +1 -1
  48. package/dist/detectors/team.d.ts.map +1 -1
  49. package/dist/detectors/team.js +7 -2
  50. package/dist/detectors/team.js.map +1 -1
  51. package/dist/detectors/word-list.d.ts +3 -0
  52. package/dist/detectors/word-list.d.ts.map +1 -0
  53. package/dist/detectors/word-list.js +3 -0
  54. package/dist/detectors/word-list.js.map +1 -0
  55. package/dist/document.d.ts +2 -2
  56. package/dist/document.d.ts.map +1 -1
  57. package/dist/document.js +4 -2
  58. package/dist/document.js.map +1 -1
  59. package/dist/feedback/draft.d.ts +28 -0
  60. package/dist/feedback/draft.d.ts.map +1 -0
  61. package/dist/feedback/draft.js +66 -0
  62. package/dist/feedback/draft.js.map +1 -0
  63. package/dist/feedback/excerpt.d.ts +10 -0
  64. package/dist/feedback/excerpt.d.ts.map +1 -0
  65. package/dist/feedback/excerpt.js +20 -0
  66. package/dist/feedback/excerpt.js.map +1 -0
  67. package/dist/legal-address.d.ts +2 -0
  68. package/dist/legal-address.d.ts.map +1 -0
  69. package/dist/legal-address.js +16 -0
  70. package/dist/legal-address.js.map +1 -0
  71. package/dist/orthography.d.ts.map +1 -1
  72. package/dist/orthography.js +15 -0
  73. package/dist/orthography.js.map +1 -1
  74. package/dist/plugin.d.ts +98 -0
  75. package/dist/plugin.d.ts.map +1 -1
  76. package/dist/profile/for-file.d.ts +7 -0
  77. package/dist/profile/for-file.d.ts.map +1 -0
  78. package/dist/profile/for-file.js +6 -0
  79. package/dist/profile/for-file.js.map +1 -0
  80. package/dist/profile/load.d.ts +4 -0
  81. package/dist/profile/load.d.ts.map +1 -0
  82. package/dist/profile/load.js +25 -0
  83. package/dist/profile/load.js.map +1 -0
  84. package/dist/profile/parse.d.ts +19 -0
  85. package/dist/profile/parse.d.ts.map +1 -0
  86. package/dist/profile/parse.js +95 -0
  87. package/dist/profile/parse.js.map +1 -0
  88. package/dist/profile/select.d.ts +22 -0
  89. package/dist/profile/select.d.ts.map +1 -0
  90. package/dist/profile/select.js +21 -0
  91. package/dist/profile/select.js.map +1 -0
  92. package/dist/reasons.d.ts +1 -0
  93. package/dist/reasons.d.ts.map +1 -1
  94. package/dist/reasons.js +2 -0
  95. package/dist/reasons.js.map +1 -1
  96. package/dist/render/compact.d.ts.map +1 -1
  97. package/dist/render/compact.js +3 -1
  98. package/dist/render/compact.js.map +1 -1
  99. package/dist/run.d.ts.map +1 -1
  100. package/dist/run.js +40 -7
  101. package/dist/run.js.map +1 -1
  102. package/dist/structure/build.d.ts +2 -1
  103. package/dist/structure/build.d.ts.map +1 -1
  104. package/dist/structure/build.js +105 -11
  105. package/dist/structure/build.js.map +1 -1
  106. package/dist/structure/date-order.d.ts +12 -0
  107. package/dist/structure/date-order.d.ts.map +1 -0
  108. package/dist/structure/date-order.js +30 -0
  109. package/dist/structure/date-order.js.map +1 -0
  110. package/dist/structure/issues.d.ts.map +1 -1
  111. package/dist/structure/issues.js +9 -2
  112. package/dist/structure/issues.js.map +1 -1
  113. package/dist/structure/of.d.ts +2 -1
  114. package/dist/structure/of.d.ts.map +1 -1
  115. package/dist/structure/of.js +7 -1
  116. package/dist/structure/of.js.map +1 -1
  117. package/dist/structure/relative-find.d.ts +8 -0
  118. package/dist/structure/relative-find.d.ts.map +1 -0
  119. package/dist/structure/relative-find.js +190 -0
  120. package/dist/structure/relative-find.js.map +1 -0
  121. package/dist/structure/relative-resolve.d.ts +3 -0
  122. package/dist/structure/relative-resolve.d.ts.map +1 -0
  123. package/dist/structure/relative-resolve.js +175 -0
  124. package/dist/structure/relative-resolve.js.map +1 -0
  125. package/dist/structure/runs.d.ts +20 -0
  126. package/dist/structure/runs.d.ts.map +1 -0
  127. package/dist/structure/runs.js +63 -0
  128. package/dist/structure/runs.js.map +1 -0
  129. package/dist/structure/total.d.ts +14 -0
  130. package/dist/structure/total.d.ts.map +1 -0
  131. package/dist/structure/total.js +119 -0
  132. package/dist/structure/total.js.map +1 -0
  133. package/dist/structure/unnumbered.d.ts +15 -0
  134. package/dist/structure/unnumbered.d.ts.map +1 -0
  135. package/dist/structure/unnumbered.js +28 -0
  136. package/dist/structure/unnumbered.js.map +1 -0
  137. package/dist/structure/unread.d.ts +8 -0
  138. package/dist/structure/unread.d.ts.map +1 -0
  139. package/dist/structure/unread.js +34 -0
  140. package/dist/structure/unread.js.map +1 -0
  141. package/dist/structure/weekday.d.ts +7 -0
  142. package/dist/structure/weekday.d.ts.map +1 -0
  143. package/dist/structure/weekday.js +21 -0
  144. package/dist/structure/weekday.js.map +1 -0
  145. package/package.json +4 -3
  146. package/profiles/statute.yaml +66 -0
  147. package/rules/date-order.yaml +26 -0
  148. package/rules/date-weekday-mismatch.yaml +26 -0
  149. package/rules/internal-jargon.yaml +1 -1
  150. package/rules/total-mismatch.yaml +26 -0
  151. package/skills/chaff/SKILL.md +24 -4
  152. package/src/address-chain.ts +113 -0
  153. package/src/cli-args.ts +1 -1
  154. package/src/cli-text.ts +4 -0
  155. package/src/cli.ts +20 -1
  156. package/src/commands/eval.ts +2 -1
  157. package/src/commands/feedback.ts +210 -0
  158. package/src/commands/test.ts +3 -2
  159. package/src/commands/tree.ts +3 -1
  160. package/src/config/by-path.ts +11 -3
  161. package/src/config/load.ts +5 -1
  162. package/src/detectors/char-shape.ts +5 -4
  163. package/src/detectors/index.ts +4 -1
  164. package/src/detectors/lexicon.ts +11 -1
  165. package/src/detectors/structure-tree.ts +67 -1
  166. package/src/detectors/team.ts +7 -2
  167. package/src/detectors/word-list.ts +2 -0
  168. package/src/document.ts +11 -3
  169. package/src/feedback/draft.ts +102 -0
  170. package/src/feedback/excerpt.ts +23 -0
  171. package/src/orthography.ts +15 -0
  172. package/src/plugin.ts +95 -0
  173. package/src/profile/for-file.ts +11 -0
  174. package/src/profile/load.ts +26 -0
  175. package/src/profile/parse.ts +119 -0
  176. package/src/profile/select.ts +35 -0
  177. package/src/reasons.ts +5 -0
  178. package/src/render/compact.ts +4 -1
  179. package/src/run.ts +42 -7
  180. package/src/structure/build.ts +135 -15
  181. package/src/structure/date-order.ts +44 -0
  182. package/src/structure/issues.ts +10 -2
  183. package/src/structure/of.ts +15 -3
  184. package/src/structure/relative-find.ts +237 -0
  185. package/src/structure/relative-resolve.ts +209 -0
  186. package/src/structure/runs.ts +71 -0
  187. package/src/structure/total.ts +157 -0
  188. package/src/structure/unnumbered.ts +33 -0
  189. package/src/structure/unread.ts +39 -0
  190. 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
  };
@@ -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,CAuBlC,CAAC"}
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
  },
@@ -1 +1 @@
1
- {"version":3,"file":"reasons.js","sourceRoot":"","sources":["../src/reasons.ts"],"names":[],"mappings":"AAeA,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,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,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
+ {"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;AAG3C,uBAAuB;AACvB,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,EAAE,QAAQ,SAAS,EAAE,OAAO,SAAS,cAAc,EAAE,EAAE,UAAU,MAAM,KAAG,MAYrH,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"}
@@ -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 = [`${result.findings.length} findings`, result.skipped.length > 0 ? `${result.skipped.length} rules not run` : undefined].filter((part) => part !== undefined);
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,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAC1I,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"}
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;AAK/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;AA8CvD;;;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,SAkDF,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 !== "structure").find((need) => !has(doc.capabilities, 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.join("、"), count: fired.length, limit, offset: first === undefined ? 0 : Number(first.values["offset"] ?? 0) },
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
- if (rule.requires.includes("structure") && doc.structure === undefined) {
111
- return { findings: acc.findings, skipped: [...acc.skipped, { rule: rule.id, why: reasonsFor(doc).noStructure(doc.language) }] };
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":"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"}
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;AAG9C,OAAO,KAAK,EAA2C,IAAI,EAAiB,aAAa,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAkJnI,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;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC;AAuCtI;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,OAAO,cAAc,EAAE,UAAU,iBAAiB,KAAG,aAe9E,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"}
@@ -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 leaves = LEAVES.flatMap(({ kind, find }) => find(patterns, text).map((mention) => ({ kind, start: line.start + offset + mention.start, end: line.start + offset + mention.end, attrs: mention.attrs }))).sort((left, right) => left.start - right.start);
93
- leaves.forEach((leaf) => parent.children.push({ kind: leaf.kind, address: "", start: leaf.start, end: leaf.end, line: line.number, attrs: leaf.attrs, children: [] }));
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 numbered = patterns.numbered(text, context) ?? universalNumber(patterns, text, context);
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 doc = draftOf("doc", "", { text: "", start: 0, number: 1 }, { path: input.path, language: input.language });
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 = { stack: [{ draft: doc, rank: 0 }], headingCounts: [] };
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
- return freeze(doc);
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