chaffjs 0.7.0 → 0.9.0

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