chaffjs 0.2.0 → 0.4.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 (183) hide show
  1. package/dist/backends/anthropic.d.ts +24 -0
  2. package/dist/backends/anthropic.d.ts.map +1 -0
  3. package/dist/backends/anthropic.js +44 -0
  4. package/dist/backends/anthropic.js.map +1 -0
  5. package/dist/backends/openai.d.ts +29 -0
  6. package/dist/backends/openai.d.ts.map +1 -0
  7. package/dist/backends/openai.js +33 -0
  8. package/dist/backends/openai.js.map +1 -0
  9. package/dist/backends/types.d.ts +32 -0
  10. package/dist/backends/types.d.ts.map +1 -0
  11. package/dist/backends/types.js +18 -0
  12. package/dist/backends/types.js.map +1 -0
  13. package/dist/cli.d.ts.map +1 -1
  14. package/dist/cli.js +9 -5
  15. package/dist/cli.js.map +1 -1
  16. package/dist/commands/eval.d.ts.map +1 -1
  17. package/dist/commands/eval.js +5 -2
  18. package/dist/commands/eval.js.map +1 -1
  19. package/dist/commands/test.d.ts.map +1 -1
  20. package/dist/commands/test.js +62 -16
  21. package/dist/commands/test.js.map +1 -1
  22. package/dist/config/load.d.ts +8 -1
  23. package/dist/config/load.d.ts.map +1 -1
  24. package/dist/config/load.js +16 -3
  25. package/dist/config/load.js.map +1 -1
  26. package/dist/detectors/agentless-passive.d.ts +3 -0
  27. package/dist/detectors/agentless-passive.d.ts.map +1 -0
  28. package/dist/detectors/agentless-passive.js +31 -0
  29. package/dist/detectors/agentless-passive.js.map +1 -0
  30. package/dist/detectors/char-shape.d.ts +12 -0
  31. package/dist/detectors/char-shape.d.ts.map +1 -0
  32. package/dist/detectors/char-shape.js +39 -0
  33. package/dist/detectors/char-shape.js.map +1 -0
  34. package/dist/detectors/en-shape.d.ts +19 -0
  35. package/dist/detectors/en-shape.d.ts.map +1 -0
  36. package/dist/detectors/en-shape.js +176 -0
  37. package/dist/detectors/en-shape.js.map +1 -0
  38. package/dist/detectors/index.d.ts.map +1 -1
  39. package/dist/detectors/index.js +37 -0
  40. package/dist/detectors/index.js.map +1 -1
  41. package/dist/detectors/lexicon.d.ts +15 -0
  42. package/dist/detectors/lexicon.d.ts.map +1 -0
  43. package/dist/detectors/lexicon.js +109 -0
  44. package/dist/detectors/lexicon.js.map +1 -0
  45. package/dist/detectors/repeated-head.d.ts.map +1 -1
  46. package/dist/detectors/repeated-head.js +17 -5
  47. package/dist/detectors/repeated-head.js.map +1 -1
  48. package/dist/detectors/sentence-ending.d.ts +3 -0
  49. package/dist/detectors/sentence-ending.d.ts.map +1 -0
  50. package/dist/detectors/sentence-ending.js +34 -0
  51. package/dist/detectors/sentence-ending.js.map +1 -0
  52. package/dist/detectors/signals.d.ts +6 -0
  53. package/dist/detectors/signals.d.ts.map +1 -0
  54. package/dist/detectors/signals.js +183 -0
  55. package/dist/detectors/signals.js.map +1 -0
  56. package/dist/detectors/structure.d.ts +24 -0
  57. package/dist/detectors/structure.d.ts.map +1 -0
  58. package/dist/detectors/structure.js +111 -0
  59. package/dist/detectors/structure.js.map +1 -0
  60. package/dist/detectors/team.d.ts +17 -0
  61. package/dist/detectors/team.d.ts.map +1 -0
  62. package/dist/detectors/team.js +87 -0
  63. package/dist/detectors/team.js.map +1 -0
  64. package/dist/detectors/token-shape.d.ts +4 -0
  65. package/dist/detectors/token-shape.d.ts.map +1 -0
  66. package/dist/detectors/token-shape.js +62 -0
  67. package/dist/detectors/token-shape.js.map +1 -0
  68. package/dist/document.d.ts +11 -1
  69. package/dist/document.d.ts.map +1 -1
  70. package/dist/document.js +85 -10
  71. package/dist/document.js.map +1 -1
  72. package/dist/env.d.ts +12 -0
  73. package/dist/env.d.ts.map +1 -0
  74. package/dist/env.js +20 -0
  75. package/dist/env.js.map +1 -0
  76. package/dist/init.d.ts.map +1 -1
  77. package/dist/init.js +9 -6
  78. package/dist/init.js.map +1 -1
  79. package/dist/judge.d.ts +14 -16
  80. package/dist/judge.d.ts.map +1 -1
  81. package/dist/judge.js +0 -0
  82. package/dist/judge.js.map +1 -1
  83. package/dist/levels.d.ts +1 -9
  84. package/dist/levels.d.ts.map +1 -1
  85. package/dist/levels.js +15 -3
  86. package/dist/levels.js.map +1 -1
  87. package/dist/look-at.d.ts +18 -0
  88. package/dist/look-at.d.ts.map +1 -0
  89. package/dist/look-at.js +43 -0
  90. package/dist/look-at.js.map +1 -0
  91. package/dist/plugin.d.ts +47 -2
  92. package/dist/plugin.d.ts.map +1 -1
  93. package/dist/render/explain.d.ts +1 -1
  94. package/dist/render/explain.d.ts.map +1 -1
  95. package/dist/render/explain.js +12 -4
  96. package/dist/render/explain.js.map +1 -1
  97. package/dist/render/rules-json.d.ts.map +1 -1
  98. package/dist/render/rules-json.js +13 -5
  99. package/dist/render/rules-json.js.map +1 -1
  100. package/dist/render/semantic.d.ts +2 -1
  101. package/dist/render/semantic.d.ts.map +1 -1
  102. package/dist/render/semantic.js +35 -0
  103. package/dist/render/semantic.js.map +1 -1
  104. package/dist/rule-load.d.ts.map +1 -1
  105. package/dist/rule-load.js +27 -1
  106. package/dist/rule-load.js.map +1 -1
  107. package/dist/run-semantic.d.ts +22 -1
  108. package/dist/run-semantic.d.ts.map +1 -1
  109. package/dist/run-semantic.js +21 -10
  110. package/dist/run-semantic.js.map +1 -1
  111. package/dist/run.d.ts +6 -1
  112. package/dist/run.d.ts.map +1 -1
  113. package/dist/run.js +34 -2
  114. package/dist/run.js.map +1 -1
  115. package/dist/sentence-shape.d.ts +6 -0
  116. package/dist/sentence-shape.d.ts.map +1 -0
  117. package/dist/sentence-shape.js +15 -0
  118. package/dist/sentence-shape.js.map +1 -0
  119. package/package.json +4 -3
  120. package/rules/adverb-overuse.yaml +28 -0
  121. package/rules/agentless-passive.yaml +28 -0
  122. package/rules/ai-tell.yaml +27 -0
  123. package/rules/concrete-evidence-density.yaml +25 -0
  124. package/rules/cushion-phrase-density.yaml +26 -0
  125. package/rules/double-keigo.yaml +27 -0
  126. package/rules/emoji-density.yaml +26 -0
  127. package/rules/excessive-hedging.yaml +26 -0
  128. package/rules/expletive-construction.yaml +27 -0
  129. package/rules/hiragana-fukushi.yaml +27 -0
  130. package/rules/internal-jargon.yaml +27 -0
  131. package/rules/max-kanji-continuous.yaml +26 -0
  132. package/rules/max-paragraph-length.yaml +25 -0
  133. package/rules/max-sentence-length.yaml +22 -0
  134. package/rules/ngram-repetition.yaml +25 -0
  135. package/rules/no-doubled-joshi.yaml +28 -0
  136. package/rules/no-mixed-desumasu.yaml +29 -0
  137. package/rules/no-nakaguro-parallel.yaml +27 -0
  138. package/rules/oxford-comma-consistency.yaml +26 -0
  139. package/rules/paragraph-length-variance.yaml +25 -0
  140. package/rules/preamble-length.yaml +25 -0
  141. package/rules/proper-noun-density.yaml +26 -0
  142. package/rules/repeated-conjunction.yaml +26 -0
  143. package/rules/required-sections.yaml +26 -0
  144. package/rules/rule-of-three.yaml +25 -0
  145. package/rules/sasete-itadaku.yaml +27 -0
  146. package/rules/section-length-uniformity.yaml +25 -0
  147. package/rules/sentence-initial-conjunction-run.yaml +27 -0
  148. package/rules/taigen-dome-in-prose.yaml +27 -0
  149. package/rules/title-case-consistency.yaml +26 -0
  150. package/rules/undefined-acronym.yaml +25 -0
  151. package/rules/unqualified-superlative.yaml +26 -0
  152. package/src/backends/anthropic.ts +61 -0
  153. package/src/backends/openai.ts +46 -0
  154. package/src/backends/types.ts +38 -0
  155. package/src/cli.ts +9 -5
  156. package/src/commands/eval.ts +5 -2
  157. package/src/commands/test.ts +74 -16
  158. package/src/config/load.ts +22 -3
  159. package/src/detectors/agentless-passive.ts +34 -0
  160. package/src/detectors/char-shape.ts +47 -0
  161. package/src/detectors/en-shape.ts +187 -0
  162. package/src/detectors/index.ts +37 -0
  163. package/src/detectors/lexicon.ts +124 -0
  164. package/src/detectors/repeated-head.ts +17 -6
  165. package/src/detectors/sentence-ending.ts +37 -0
  166. package/src/detectors/signals.ts +199 -0
  167. package/src/detectors/structure.ts +119 -0
  168. package/src/detectors/team.ts +90 -0
  169. package/src/detectors/token-shape.ts +81 -0
  170. package/src/document.ts +95 -11
  171. package/src/env.ts +20 -0
  172. package/src/init.ts +9 -6
  173. package/src/judge.ts +0 -0
  174. package/src/levels.ts +16 -4
  175. package/src/look-at.ts +53 -0
  176. package/src/plugin.ts +48 -4
  177. package/src/render/explain.ts +12 -4
  178. package/src/render/rules-json.ts +16 -5
  179. package/src/render/semantic.ts +38 -1
  180. package/src/rule-load.ts +28 -1
  181. package/src/run-semantic.ts +32 -11
  182. package/src/run.ts +36 -3
  183. package/src/sentence-shape.ts +22 -0
@@ -0,0 +1,62 @@
1
+ import { hasParticle, isClosed, lastContent } from "../sentence-shape.js";
2
+ /**
3
+ * 文末が名詞で終わる(体言止め)。箇条書きでは普通だが、本文では文が途中で切れて読める。
4
+ * 実文書で測ったら、指摘の 9 割が箇条書きの項目だった。箇条書きは除く。
5
+ */
6
+ const NOMINAL = new Set(["NOUN", "PROPN"]);
7
+ /** 非自立名詞は単独では何も指さない。「回るのか。」の「の」を体言止めと読まない。 */
8
+ const isDependent = (token) => token.features?.["NounType"] === "Dependent";
9
+ const inside = (span, spans) => spans.some((other) => span.start >= other.start && span.start < other.end);
10
+ export const nounEnding = (doc, options) => {
11
+ const ended = doc.sentences.filter((sentence) => {
12
+ if (inside(sentence.span, doc.listSpans) || !isClosed(sentence) || !hasParticle(sentence))
13
+ return false;
14
+ const last = lastContent(sentence);
15
+ return last !== undefined && NOMINAL.has(last.pos) && !isDependent(last);
16
+ });
17
+ const first = ended[0];
18
+ // 文書全体の数についての指摘なので、1 文ずつ出さない。13 件並べても直す順番が分からない。
19
+ if (first === undefined || ended.length <= options.limit)
20
+ return [];
21
+ return [
22
+ {
23
+ rule: "taigen-dome-in-prose",
24
+ severity: "info",
25
+ line: 0,
26
+ column: 0,
27
+ quote: first.text.trim(),
28
+ values: { count: ended.length, limit: options.limit, offset: first.span.start },
29
+ },
30
+ ];
31
+ };
32
+ const extend = (runs, token) => {
33
+ const last = runs.at(-1);
34
+ if (last !== undefined && last.surface === token.surface)
35
+ return [...runs.slice(0, -1), { surface: last.surface, tokens: [...last.tokens, token] }];
36
+ return [...runs, { surface: token.surface, tokens: [token] }];
37
+ };
38
+ const PARTICLE = new Set(["ADP", "SCONJ", "PART", "CCONJ"]);
39
+ const BREAK = { surface: "", tokens: [] };
40
+ /**
41
+ * 名詞は連なりの中身なので飛ばす。読点と、語彙表に無い助詞は連なりを切る。
42
+ * 「弊社のAはBの」を 2 回続いたと数えないため。「は」でいちど句が閉じている。
43
+ */
44
+ const runsOf = (tokens, nesting) => tokens.reduce((acc, token) => {
45
+ if (nesting.includes(token.surface))
46
+ return extend(acc, token);
47
+ return token.pos === "PUNCT" || PARTICLE.has(token.pos) ? [...acc, BREAK] : acc;
48
+ }, []);
49
+ export const doubledParticle = (doc, options) => {
50
+ const nesting = (options.lexicon ?? []).map((entry) => entry.pattern);
51
+ return doc.sentences.flatMap((sentence) => runsOf(sentence.tokens ?? [], nesting)
52
+ .filter((run) => run.tokens.length > options.limit)
53
+ .map((run) => ({
54
+ rule: "no-doubled-joshi",
55
+ severity: "warning",
56
+ line: 0,
57
+ column: 0,
58
+ quote: sentence.text.trim(),
59
+ values: { word: run.surface, count: run.tokens.length, limit: options.limit, offset: run.tokens[0]?.span.start ?? sentence.span.start },
60
+ })));
61
+ };
62
+ //# sourceMappingURL=token-shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-shape.js","sourceRoot":"","sources":["../../src/detectors/token-shape.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,13 @@
1
1
  import type { LanguageAdapter, ProseDocument } from "./plugin.ts";
2
- export declare const buildDocument: (path: string, source: string, adapter: LanguageAdapter) => ProseDocument;
2
+ /** チームが chaff.yaml に書いたもの。語彙表と同じ器に入れて、detector には出所を見せない。 */
3
+ export type TeamRules = {
4
+ readonly jargon: readonly string[];
5
+ readonly requiredSections: readonly string[];
6
+ };
7
+ /** Config から取り出す。document は Config の形を知らない。 */
8
+ export declare const teamRules: (config: {
9
+ readonly jargon: readonly string[];
10
+ readonly requiredSections: readonly string[];
11
+ }) => TeamRules;
12
+ export declare const buildDocument: (path: string, source: string, adapter: LanguageAdapter, team?: TeamRules) => ProseDocument;
3
13
  //# sourceMappingURL=document.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAA2B,MAAM,aAAa,CAAC;AAqJ3F,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,EAAE,SAAS,eAAe,KAAG,aActF,CAAC"}
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAc,eAAe,EAAa,aAAa,EAA2B,MAAM,aAAa,CAAC;AAoNlH,6DAA6D;AAC7D,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC;AAI7G,+CAA+C;AAC/C,eAAO,MAAM,SAAS,GAAI,QAAQ;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,KAAG,SAGvH,CAAC;AAEH,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,EAAE,SAAS,eAAe,EAAE,OAAM,SAAsB,KAAG,aAwBpH,CAAC"}
package/dist/document.js CHANGED
@@ -35,8 +35,34 @@ const linkChrome = (node) => {
35
35
  { start: inner.end, end: whole.end },
36
36
  ];
37
37
  };
38
- const collectMasks = (root) => {
39
- const spans = [];
38
+ /**
39
+ * 強調の記号(`**` `*` `_` `~~`)だけを覆う。囲まれた文字は本文なので残す。
40
+ *
41
+ * 残すと解析器が `**。` を 1 語の名詞として拾い、文の終わりが消える。
42
+ * 実文書で「文末が名詞」の誤検知を追って見つけた。文長にも同じだけ効いている。
43
+ */
44
+ const MARKER = /^[*_~]+/u;
45
+ const emphasisChrome = (node, source) => {
46
+ const whole = spanOf(node);
47
+ if (whole === undefined)
48
+ return [];
49
+ const width = MARKER.exec(source.slice(whole.start, whole.end))?.[0].length ?? 0;
50
+ if (width === 0)
51
+ return [];
52
+ return [
53
+ { start: whole.start, end: whole.start + width },
54
+ { start: whole.end - width, end: whole.end },
55
+ ];
56
+ };
57
+ const EMPHASIS = new Set(["strong", "emphasis", "delete"]);
58
+ /**
59
+ * `:::note` `:::` のようなディレクティブ。Zenn・Docusaurus・VitePress が使う記法で、
60
+ * 標準の Markdown には無いため段落として解析される。囲みの指定であって文章ではない。
61
+ */
62
+ const DIRECTIVE = /^:::[^\n]*/gmu;
63
+ const directiveSpans = (source) => [...source.matchAll(DIRECTIVE)].map((match) => ({ start: match.index, end: match.index + match[0].length }));
64
+ const collectMasks = (root, source) => {
65
+ const spans = [...directiveSpans(source)];
40
66
  walk(root, (node) => {
41
67
  if (node.type === "link" || node.type === "linkReference") {
42
68
  spans.push(...linkChrome(node));
@@ -50,6 +76,14 @@ const collectMasks = (root) => {
50
76
  });
51
77
  return spans;
52
78
  };
79
+ const emphasisSpans = (root, source) => {
80
+ const spans = [];
81
+ walk(root, (node) => {
82
+ if (EMPHASIS.has(node.type))
83
+ spans.push(...emphasisChrome(node, source));
84
+ });
85
+ return spans;
86
+ };
53
87
  const textOf = (node, source) => {
54
88
  const parts = [];
55
89
  walk(node, (child) => {
@@ -93,10 +127,10 @@ const strongSpans = (root, masked) => {
93
127
  return found;
94
128
  };
95
129
  const within = (span, from, to) => span.start >= from && span.start < to;
96
- const paragraphSpans = (root) => {
130
+ const spansOfType = (root, type) => {
97
131
  const found = [];
98
132
  walk(root, (node) => {
99
- if (node.type !== "paragraph")
133
+ if (node.type !== type)
100
134
  return;
101
135
  const span = spanOf(node);
102
136
  if (span !== undefined)
@@ -111,12 +145,14 @@ const paragraphSpans = (root) => {
111
145
  * 覆った表やコードブロックを越えて次の句点まで飲み込む。段落は文が跨がない境界なので、
112
146
  * ここで切れば構造的に起きない。
113
147
  */
148
+ const shift = (span, by) => ({ start: by + span.start, end: by + span.end });
114
149
  const sentencesOf = (prose, paragraphs, adapter) => paragraphs.flatMap((paragraph) => adapter
115
150
  .segment(prose.slice(paragraph.start, paragraph.end))
116
151
  .sentences.filter((sentence) => sentence.text.trim().length > 0)
117
152
  .map((sentence) => ({
118
- span: { start: paragraph.start + sentence.span.start, end: paragraph.start + sentence.span.end },
153
+ span: shift(sentence.span, paragraph.start),
119
154
  text: sentence.text,
155
+ ...(sentence.tokens === undefined ? {} : { tokens: sentence.tokens.map((token) => ({ ...token, span: shift(token.span, paragraph.start) })) }),
120
156
  })));
121
157
  const sectionsOf = (headings, sentences, strongs, length) => {
122
158
  const bounds = headings.map((heading, index) => ({ heading, from: heading.end, to: headings[index + 1]?.start ?? length }));
@@ -135,19 +171,58 @@ const sectionsOf = (headings, sentences, strongs, length) => {
135
171
  };
136
172
  });
137
173
  };
138
- export const buildDocument = (path, source, adapter) => {
174
+ const paragraphsOf = (spans, sentences, listSpans) => spans
175
+ // 箇条書きの中の段落は「段落」として数えない。項目 1 つを 1 段落と読むと、
176
+ // 段落あたりの文数も長さのばらつきも、箇条書きの多い文書で壊れる。
177
+ .filter((span) => !listSpans.some((list) => span.start >= list.start && span.start < list.end))
178
+ .map((span) => ({ span, sentences: sentences.filter((sentence) => within(sentence.span, span.start, span.end)) }));
179
+ /** 箇条書きは list ノードの直下の項目を数える。入れ子の項目は内側の list のものとして数える。 */
180
+ const listsOf = (root, source) => {
181
+ const found = [];
182
+ walk(root, (node) => {
183
+ if (node.type !== "list")
184
+ return;
185
+ const span = spanOf(node);
186
+ if (span === undefined)
187
+ return;
188
+ const items = (node.children ?? []).flatMap((child) => {
189
+ const item = spanOf(child);
190
+ return child.type === "listItem" && item !== undefined ? [source.slice(item.start, item.end).replace(/\s+/gu, "").length] : [];
191
+ });
192
+ if (items.length > 0)
193
+ found.push({ span, items });
194
+ });
195
+ return found;
196
+ };
197
+ const EMPTY_TEAM = { jargon: [], requiredSections: [] };
198
+ /** Config から取り出す。document は Config の形を知らない。 */
199
+ export const teamRules = (config) => ({
200
+ jargon: config.jargon,
201
+ requiredSections: config.requiredSections,
202
+ });
203
+ export const buildDocument = (path, source, adapter, team = EMPTY_TEAM) => {
139
204
  const root = parse(source);
140
- const masked = collectMasks(root);
205
+ // 強調の記号は「本文でないもの」だが、太字の数を数えるときの「覆われた場所」ではない。
206
+ // 同じ集合にすると、太字が自分の記号のせいで覆われた場所にあることになり、1 つも数えられなくなる。
207
+ const blocks = collectMasks(root, source);
208
+ const masked = [...blocks, ...emphasisSpans(root, source)];
141
209
  const prose = maskSpans(source, masked);
142
- const sentences = sentencesOf(prose, paragraphSpans(root), adapter);
210
+ const paragraphSpans = spansOfType(root, "paragraph");
211
+ const listItems = spansOfType(root, "listItem");
212
+ const sentences = sentencesOf(prose, paragraphSpans, adapter);
143
213
  return {
144
214
  path,
145
215
  source,
146
216
  language: adapter.id,
147
217
  lengthUnit: adapter.capabilities.lengthUnit,
148
- sections: sectionsOf(headingsOf(root, source), sentences, strongSpans(root, masked), source.length),
218
+ capabilities: adapter.capabilities,
219
+ sections: sectionsOf(headingsOf(root, source), sentences, strongSpans(root, blocks), source.length),
149
220
  sentences,
150
- lexicons: adapter.lexicons,
221
+ listSpans: listItems,
222
+ paragraphs: paragraphsOf(paragraphSpans, sentences, listItems),
223
+ lists: listsOf(root, source),
224
+ lexicons: { ...adapter.lexicons, "internal-jargon": team.jargon.map((pattern) => ({ pattern })) },
225
+ requiredSections: team.requiredSections,
151
226
  };
152
227
  };
153
228
  //# sourceMappingURL=document.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"document.js","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"document.js","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAUtC;;;;;;GAMG;AACH,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC;AAE3J,MAAM,MAAM,GAAG,CAAC,IAAU,EAAoB,EAAE;IAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC;IACtC,OAAO,KAAK,KAAK,SAAS,IAAI,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,IAAU,EAAE,KAA2B,EAAQ,EAAE;IAC7D,KAAK,CAAC,IAAI,CAAC,CAAC;IACZ,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AAC/D,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,MAAc,EAAQ,EAAE,CACrC,YAAY,CAAC,MAAM,EAAE,EAAE,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,oBAAoB,EAAE,EAAE,uBAAuB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAE1J,qDAAqD;AACrD,MAAM,UAAU,GAAG,CAAC,IAAU,EAAU,EAAE;IACxC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,KAAK,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IAC9H,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,EAAE,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS;QAAE,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5H,OAAO;QACL,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,EAAE;QACxC,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE;KACrC,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,GAAG,UAAU,CAAC;AAE1B,MAAM,cAAc,GAAG,CAAC,IAAU,EAAE,MAAc,EAAU,EAAE;IAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;IACjF,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3B,OAAO;QACL,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,EAAE;QAChD,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,GAAG,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE;KAC7C,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAE3D;;;GAGG;AACH,MAAM,SAAS,GAAG,eAAe,CAAC;AAElC,MAAM,cAAc,GAAG,CAAC,MAAc,EAAU,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAEhK,MAAM,YAAY,GAAG,CAAC,IAAU,EAAE,MAAc,EAAU,EAAE;IAC1D,MAAM,KAAK,GAAW,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QAClB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO;QACjE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,IAAU,EAAE,MAAc,EAAU,EAAE;IAC3D,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QAClB,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,IAAU,EAAE,MAAc,EAAU,EAAE;IACpD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,EAAE;QACnB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO;QACjE,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxB,CAAC,CAAC;AAIF,MAAM,UAAU,GAAG,CAAC,IAAU,EAAE,MAAc,EAAa,EAAE;IAC3D,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QAClB,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;YAAE,OAAO;QACpC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7G,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACrH,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,IAAU,EAAE,OAAwB,EAAW,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;AAExJ;;;;;;GAMG;AACH,MAAM,WAAW,GAAG,CAAC,IAAU,EAAE,MAAuB,EAAU,EAAE;IAClE,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QAClB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QACnC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,IAAU,EAAE,IAAY,EAAE,EAAU,EAAW,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;AAExG,MAAM,WAAW,GAAG,CAAC,IAAU,EAAE,IAAY,EAAU,EAAE;IACvD,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QAClB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI;YAAE,OAAO;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,IAAI,KAAK,SAAS;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,KAAK,GAAG,CAAC,IAAU,EAAE,EAAU,EAAQ,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AAEjG,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,UAA2B,EAAE,OAAwB,EAAc,EAAE,CACvG,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,EAAE,EAAE,CAC/B,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;KACpD,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;KAC/D,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAClB,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC;IAC3C,IAAI,EAAE,QAAQ,CAAC,IAAI;IACnB,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;CAC/I,CAAC,CAAC,CACN,CAAC;AAEJ,MAAM,UAAU,GAAG,CAAC,QAA4B,EAAE,SAA8B,EAAE,OAAwB,EAAE,MAAc,EAAa,EAAE;IACvI,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5H,MAAM,IAAI,GAAG,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,MAAM,EAAE,CAAC;IAC9G,OAAO,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC;SACrB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;SACxC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/E,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,OAAO,EAAE,OAAO,CAAC,IAAI;YACrB,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE;YAC9B,SAAS,EAAE,MAAM;YACjB,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM;YACpE,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC;SACzB,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,KAAsB,EAAE,SAA8B,EAAE,SAA0B,EAAe,EAAE,CACvH,KAAK;IACH,0CAA0C;IAC1C,mCAAmC;KAClC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;KAC9F,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEvH,0DAA0D;AAC1D,MAAM,OAAO,GAAG,CAAC,IAAU,EAAE,MAAc,EAAgB,EAAE;IAC3D,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE;QAClB,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO;QAC/B,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YACpD,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjI,CAAC,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAKF,MAAM,UAAU,GAAc,EAAE,MAAM,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;AAEnE,+CAA+C;AAC/C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAA4F,EAAa,EAAE,CAAC,CAAC;IACrI,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;CAC1C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,OAAwB,EAAE,OAAkB,UAAU,EAAiB,EAAE;IACnI,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,6CAA6C;IAC7C,oDAAoD;IACpD,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IACtD,MAAM,SAAS,GAAG,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAC9D,OAAO;QACL,IAAI;QACJ,MAAM;QACN,QAAQ,EAAE,OAAO,CAAC,EAAE;QACpB,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,UAAU;QAC3C,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC;QACnG,SAAS;QACT,SAAS,EAAE,SAAS;QACpB,UAAU,EAAE,YAAY,CAAC,cAAc,EAAE,SAAS,EAAE,SAAS,CAAC;QAC9D,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;QAC5B,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE;QACjG,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KACxC,CAAC;AACJ,CAAC,CAAC"}
package/dist/env.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export declare const ENV_FILE = ".env";
2
+ /**
3
+ * 作業ディレクトリの .env を読む。依存は足さない(Node が持っている)。
4
+ *
5
+ * **すでに設定されている環境変数は上書きしない。** シェルで渡したほうが勝つ。
6
+ * 逆にすると、一時的に別の key で試したいときに .env が黙って勝ってしまう。
7
+ *
8
+ * 読んだかどうかを返すのは、鍵がどこから来たのかを人に見せるため。
9
+ * 「設定したのに効かない」を、鍵の置き場所で起こさせない。
10
+ */
11
+ export declare const loadEnvFile: (dir: string) => string | undefined;
12
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,QAAQ,SAAS,CAAC;AAE/B;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,KAAG,MAAM,GAAG,SAKlD,CAAC"}
package/dist/env.js ADDED
@@ -0,0 +1,20 @@
1
+ import { existsSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ export const ENV_FILE = ".env";
4
+ /**
5
+ * 作業ディレクトリの .env を読む。依存は足さない(Node が持っている)。
6
+ *
7
+ * **すでに設定されている環境変数は上書きしない。** シェルで渡したほうが勝つ。
8
+ * 逆にすると、一時的に別の key で試したいときに .env が黙って勝ってしまう。
9
+ *
10
+ * 読んだかどうかを返すのは、鍵がどこから来たのかを人に見せるため。
11
+ * 「設定したのに効かない」を、鍵の置き場所で起こさせない。
12
+ */
13
+ export const loadEnvFile = (dir) => {
14
+ const path = join(dir, ENV_FILE);
15
+ if (!existsSync(path))
16
+ return undefined;
17
+ process.loadEnvFile(path);
18
+ return path;
19
+ };
20
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../src/env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,CAAC,MAAM,QAAQ,GAAG,MAAM,CAAC;AAE/B;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAsB,EAAE;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACjC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC;AACd,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AA+CA,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,EAAE,OAAO,MAAM,KAAG,MAAM,EAiB1D,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,SAAS,MAAM,EAWnC,CAAC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAkDA,eAAO,MAAM,OAAO,GAAI,KAAK,MAAM,EAAE,OAAO,MAAM,KAAG,MAAM,EAiB1D,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,SAAS,MAAM,EAWnC,CAAC"}
package/dist/init.js CHANGED
@@ -24,22 +24,25 @@ genre: ${genre}
24
24
  # 既定から変えたものだけを書く。
25
25
  rules:
26
26
  `;
27
- const GITIGNORE_LINE = ".chaff-cache/";
27
+ /** 判定のキャッシュと、鍵を書くファイル。どちらも commit しない。 */
28
+ const GITIGNORE_LINES = [".chaff-cache/", ".env*"];
28
29
  const writeIfAbsent = (path, body, note) => {
29
30
  if (existsSync(path))
30
31
  return undefined;
31
32
  writeFileSync(path, body, "utf8");
32
33
  return { path, note };
33
34
  };
34
- /** judge のキャッシュは commit しない。init が .gitignore に足す。 */
35
+ /** 判定のキャッシュと .env は commit しない。init が .gitignore に足す。 */
35
36
  const ensureGitignore = (dir) => {
36
37
  const path = join(dir, ".gitignore");
37
38
  if (!existsSync(path))
38
- return writeIfAbsent(path, `${GITIGNORE_LINE}\n`, "作成しました");
39
- if (readFileSync(path, "utf8").includes(GITIGNORE_LINE))
39
+ return writeIfAbsent(path, `${GITIGNORE_LINES.join("\n")}\n`, "作成しました");
40
+ const body = readFileSync(path, "utf8");
41
+ const missing = GITIGNORE_LINES.filter((line) => !body.split("\n").includes(line));
42
+ if (missing.length === 0)
40
43
  return undefined;
41
- appendFileSync(path, `${GITIGNORE_LINE}\n`, "utf8");
42
- return { path, note: `${GITIGNORE_LINE} を追記しました` };
44
+ appendFileSync(path, `${missing.join("\n")}\n`, "utf8");
45
+ return { path, note: `${missing.join(" と ")} を追記しました` };
43
46
  };
44
47
  export const runInit = (dir, genre) => {
45
48
  const made = [writeIfAbsent(join(dir, "chaff.yaml"), CONFIG(genre), "規範の宣言。commit してください"), ensureGitignore(dir)].filter((entry) => entry !== undefined);
package/dist/init.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC;;;;;;;;;;;;;;;;;;;SAmBjC,KAAK;;;;CAIb,CAAC;AAEF,MAAM,cAAc,GAAG,eAAe,CAAC;AAIvC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,IAAY,EAAuB,EAAE;IACtF,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAClC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC,CAAC;AAEF,sDAAsD;AACtD,MAAM,eAAe,GAAG,CAAC,GAAW,EAAuB,EAAE;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,aAAa,CAAC,IAAI,EAAE,GAAG,cAAc,IAAI,EAAE,QAAQ,CAAC,CAAC;IACnF,IAAI,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1E,cAAc,CAAC,IAAI,EAAE,GAAG,cAAc,IAAI,EAAE,MAAM,CAAC,CAAC;IACpD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,cAAc,UAAU,EAAE,CAAC;AACrD,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,KAAa,EAAY,EAAE;IAC9D,MAAM,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,qBAAqB,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CACtH,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAC/B,CAAC;IACF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC/D,OAAO;QACL,EAAE;QACF,SAAS;QACT,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QACxD,EAAE;QACF,SAAS,KAAK,2CAA2C;QACzD,wBAAwB;QACxB,EAAE;QACF,IAAI;QACJ,+CAA+C;QAC/C,EAAE;KACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAsB;IACvC,gBAAgB;IAChB,kBAAkB;IAClB,WAAW;IACX,YAAY;IACZ,kBAAkB;IAClB,mBAAmB;IACnB,iBAAiB;IACjB,gBAAgB;IAChB,wBAAwB;IACxB,wBAAwB;CACzB,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClF,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC;;;;;;;;;;;;;;;;;;;SAmBjC,KAAK;;;;CAIb,CAAC;AAEF,0CAA0C;AAC1C,MAAM,eAAe,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;AAInD,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,IAAY,EAAE,IAAY,EAAuB,EAAE;IACtF,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACvC,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAClC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxB,CAAC,CAAC;AAEF,yDAAyD;AACzD,MAAM,eAAe,GAAG,CAAC,GAAW,EAAuB,EAAE;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,aAAa,CAAC,IAAI,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/F,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IACnF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC;IAC3C,cAAc,CAAC,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;AAC1D,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,KAAa,EAAY,EAAE;IAC9D,MAAM,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,qBAAqB,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CACtH,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,SAAS,CAC/B,CAAC;IACF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC/D,OAAO;QACL,EAAE;QACF,SAAS;QACT,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;QACxD,EAAE;QACF,SAAS,KAAK,2CAA2C;QACzD,wBAAwB;QACxB,EAAE;QACF,IAAI;QACJ,+CAA+C;QAC/C,EAAE;KACH,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAsB;IACvC,gBAAgB;IAChB,kBAAkB;IAClB,WAAW;IACX,YAAY;IACZ,kBAAkB;IAClB,mBAAmB;IACnB,iBAAiB;IACjB,gBAAgB;IAChB,wBAAwB;IACxB,wBAAwB;CACzB,CAAC"}
package/dist/judge.d.ts CHANGED
@@ -1,4 +1,6 @@
1
- import Anthropic from "@anthropic-ai/sdk";
1
+ import type { AnthropicClient } from "./backends/anthropic.ts";
2
+ import type { OpenAIClient } from "./backends/openai.ts";
3
+ import type { BackendName, Failure } from "./backends/types.ts";
2
4
  export declare const CACHE_DIR = ".chaff-cache";
3
5
  /** 判定は必ずこの形で返させる。自由文を後から解釈しない。 */
4
6
  export type Verdict = {
@@ -13,28 +15,24 @@ export type Ask = {
13
15
  readonly candidate: string;
14
16
  readonly language: string;
15
17
  };
16
- /** judge が使うのは messages.create だけ。最小の面だけを要求する。テストで差し替えられる。 */
17
- export type JudgeResponse = {
18
- readonly content: readonly {
19
- readonly type: string;
20
- readonly text?: string | undefined;
21
- }[];
22
- };
23
- export type JudgeClient = {
24
- readonly messages: {
25
- readonly create: (params: Anthropic.MessageCreateParamsNonStreaming) => Promise<JudgeResponse>;
26
- };
27
- };
28
18
  export type JudgeOptions = {
29
19
  readonly model: string;
30
20
  readonly cacheDir: string;
31
- readonly client?: JudgeClient | undefined;
21
+ readonly backend: BackendName;
22
+ /** テストで差し替える口。provider ごとに型が違うので分けて持つ。 */
23
+ readonly anthropicClient?: AnthropicClient | undefined;
24
+ readonly openaiClient?: OpenAIClient | undefined;
32
25
  };
33
- export declare const hasCredentials: (profileDir?: string) => boolean;
34
- export declare const isAuthFailure: (error: unknown) => boolean;
26
+ export declare const defaultModel: (backend: BackendName) => string;
27
+ export declare const hasCredentials: (backend: BackendName) => boolean;
28
+ export declare const isAuthFailure: (backend: BackendName, error: unknown) => boolean;
29
+ export declare const describeFailure: (backend: BackendName, error: unknown) => Failure | undefined;
30
+ export declare const credentialHint: (backend: BackendName) => string;
35
31
  /**
36
32
  * 同じ (model, rule, rubric, candidate) なら 2 度目は問い合わせない。
37
33
  * CI でも使えるよう、キャッシュはファイルに置く。spec §14。
34
+ *
35
+ * 返ってきた形の確かめかたは、provider が増えてもここ 1 箇所のまま。
38
36
  */
39
37
  export declare const ask: (request: Ask, options: JudgeOptions) => Promise<Verdict>;
40
38
  //# sourceMappingURL=judge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../src/judge.ts"],"names":[],"mappings":"AAIA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAE1C,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,kCAAkC;AAClC,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAuB3G,MAAM,MAAM,GAAG,GAAG;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AA6BF,8DAA8D;AAC9D,MAAM,MAAM,aAAa,GAAG;IAAE,QAAQ,CAAC,OAAO,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC;AAE3H,MAAM,MAAM,WAAW,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC,+BAA+B,KAAK,OAAO,CAAC,aAAa,CAAC,CAAA;KAAE,CAAA;CAAE,CAAC;AAEpJ,MAAM,MAAM,YAAY,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,SAAS,CAAA;CAAE,CAAC;AAa5H,eAAO,MAAM,cAAc,GAAI,aAAY,MAAgD,KAAG,OACL,CAAC;AAE1F,eAAO,MAAM,aAAa,GAAI,OAAO,OAAO,KAAG,OACkE,CAAC;AAElH;;;GAGG;AACH,eAAO,MAAM,GAAG,GAAU,SAAS,GAAG,EAAE,SAAS,YAAY,KAAG,OAAO,CAAC,OAAO,CAmB9E,CAAC"}
1
+ {"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../src/judge.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAqB,MAAM,qBAAqB,CAAC;AAEnF,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC,kCAAkC;AAClC,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAuB3G,MAAM,MAAM,GAAG,GAAG;IAChB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B,CAAC;AA0BF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,0CAA0C;IAC1C,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC;CAClD,CAAC;AAKF,eAAO,MAAM,YAAY,GAAI,SAAS,WAAW,KAAG,MAAiF,CAAC;AAEtI,eAAO,MAAM,cAAc,GAAI,SAAS,WAAW,KAAG,OAAwF,CAAC;AAE/I,eAAO,MAAM,aAAa,GAAI,SAAS,WAAW,EAAE,OAAO,OAAO,KAAG,OACgB,CAAC;AAEtF,eAAO,MAAM,eAAe,GAAI,SAAS,WAAW,EAAE,OAAO,OAAO,KAAG,OAAO,GAAG,SACQ,CAAC;AAE1F,eAAO,MAAM,cAAc,GAAI,SAAS,WAAW,KAAG,MAA2E,CAAC;AAElI;;;;;GAKG;AACH,eAAO,MAAM,GAAG,GAAU,SAAS,GAAG,EAAE,SAAS,YAAY,KAAG,OAAO,CAAC,OAAO,CAU9E,CAAC"}
package/dist/judge.js CHANGED
Binary file
package/dist/judge.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"judge.js","sourceRoot":"","sources":["../src/judge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAE1C,MAAM,CAAC,MAAM,SAAS,GAAG,cAAc,CAAC;AAKxC,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,kBAAkB,EAAE;QAC9D,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE;QAC3D,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,yBAAyB,EAAE;KACnE;IACD,QAAQ,EAAE,CAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAC;IAC9C,oBAAoB,EAAE,KAAK;CACnB,CAAC;AAEX,MAAM,MAAM,GAAG;IACb,2CAA2C;IAC3C,EAAE;IACF,OAAO;IACP,yBAAyB;IACzB,mCAAmC;IACnC,mDAAmD;IACnD,4BAA4B;CAC7B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAUb,MAAM,KAAK,GAAG,CAAC,GAAQ,EAAE,KAAa,EAAU,EAAE,CAChD,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAEjH,MAAM,SAAS,GAAG,CAAC,KAAc,EAAoB,EAAE;IACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,MAAM,GAA4B,EAAE,GAAG,KAAK,EAAE,CAAC;IACrD,OAAO,OAAO,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,YAAY,CAAC,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAAC;AACrI,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,GAAW,EAAuB,EAAE;IAClE,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC;IACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IACxC,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC5D,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1C,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,GAAW,EAAE,OAAgB,EAAQ,EAAE;IACtE,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3F,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,KAAc,EAAsC,EAAE,CACzE,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;AAEnG,MAAM,QAAQ,GAAG,CAAC,GAAQ,EAAU,EAAE,CACpC,CAAC,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AASjH;;;;;;;;GAQG;AACH,MAAM,QAAQ,GAAG,CAAC,mBAAmB,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,+BAA+B,CAAC,CAAC;AAE5H,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,aAAqB,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,EAAW,EAAE,CACtG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC;AAE1F,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAW,EAAE,CACvD,KAAK,YAAY,SAAS,CAAC,mBAAmB,IAAI,CAAC,KAAK,YAAY,SAAS,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC;AAElH;;;GAGG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,OAAY,EAAE,OAAqB,EAAoB,EAAE;IACjF,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAChD,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,MAAM,MAAM,GAAgB,OAAO,CAAC,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;IAC9D,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU,EAAE,IAAI;QAChB,MAAM,EAAE,MAAM;QACd,aAAa,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE;QAClE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;KACzD,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAC/H,IAAI,IAAI,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,eAAe,CAAC,CAAC;IACxE,MAAM,MAAM,GAAY,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,aAAa,CAAC,CAAC;IACtE,MAAM,OAAO,GAAG,EAAE,GAAG,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;IACvF,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
1
+ {"version":3,"file":"judge.js","sourceRoot":"","sources":["../src/judge.ts"],"names":[],"mappings":"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"}
package/dist/levels.d.ts CHANGED
@@ -6,15 +6,7 @@ export type Resolved = {
6
6
  readonly limit: number;
7
7
  readonly fellBackToNormal: boolean;
8
8
  };
9
- /**
10
- * 4 語を数値にする。spec §18.1。
11
- *
12
- * 意味のある段が 2 つしかない rule がある(padded-intro は strict と normal が同値)。
13
- * そういう rule は levels に 2 つだけ書き、未定義の段は normal に落ちる。
14
- * 落ちたことを呼ぶ側に伝えるのは、`chaff strict` が「変えたつもりで変わっていない」
15
- * 状態を作らないようにするため。
16
- */
17
- export declare const resolve: (rule: RuleDefinition, level: Level) => Resolved;
9
+ export declare const resolve: (rule: RuleDefinition, level: Level, genre?: string) => Resolved;
18
10
  /** その rule が実際に区別できる段だけを返す。CLI の案内に使う。 */
19
11
  export declare const definedLevels: (rule: RuleDefinition) => Level[];
20
12
  //# sourceMappingURL=levels.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"levels.d.ts","sourceRoot":"","sources":["../src/levels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEzD,eAAO,MAAM,MAAM,EAAE,SAAS,KAAK,EAA2C,CAAC;AAE/E,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,KAA6E,CAAC;AAEhI,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAA;CAAE,CAAC;AAE7G;;;;;;;GAOG;AACH,eAAO,MAAM,OAAO,GAAI,MAAM,cAAc,EAAE,OAAO,KAAK,KAAG,QAO5D,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,aAAa,GAAI,MAAM,cAAc,KAAG,KAAK,EAAmF,CAAC"}
1
+ {"version":3,"file":"levels.d.ts","sourceRoot":"","sources":["../src/levels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAc,cAAc,EAAE,MAAM,aAAa,CAAC;AAErE,eAAO,MAAM,MAAM,EAAE,SAAS,KAAK,EAA2C,CAAC;AAE/E,eAAO,MAAM,OAAO,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,KAA6E,CAAC;AAEhI,MAAM,MAAM,QAAQ,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAA;CAAE,CAAC;AAqB7G,eAAO,MAAM,OAAO,GAAI,MAAM,cAAc,EAAE,OAAO,KAAK,EAAE,QAAQ,MAAM,KAAG,QAQ5E,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,aAAa,GAAI,MAAM,cAAc,KAAG,KAAK,EAAmF,CAAC"}
package/dist/levels.js CHANGED
@@ -8,13 +8,25 @@ export const isLevel = (value) => typeof value === "string" && LEVELS.some((leve
8
8
  * 落ちたことを呼ぶ側に伝えるのは、`chaff strict` が「変えたつもりで変わっていない」
9
9
  * 状態を作らないようにするため。
10
10
  */
11
- export const resolve = (rule, level) => {
11
+ /**
12
+ * ジャンル別の閾値。"business/email" は "business" より細かいので先に当たる。
13
+ * 仕様書の一文と社内メールに同じ文長を課すと、どちらかが必ず間違う。spec §9。
14
+ */
15
+ const tableFor = (rule, genre) => {
16
+ if (genre === undefined)
17
+ return rule.levels;
18
+ const parts = genre.split("/");
19
+ const keys = parts.map((_, index) => parts.slice(0, parts.length - index).join("/"));
20
+ return keys.reduce((found, key) => found ?? rule.by_genre[key], undefined) ?? rule.levels;
21
+ };
22
+ export const resolve = (rule, level, genre) => {
12
23
  if (level === "off")
13
24
  return { level, limit: 0, fellBackToNormal: false };
14
- const direct = rule.levels[level];
25
+ const table = tableFor(rule, genre);
26
+ const direct = table[level];
15
27
  if (direct !== undefined)
16
28
  return { level, limit: direct, fellBackToNormal: false };
17
- const normal = rule.levels.normal;
29
+ const normal = table.normal ?? rule.levels.normal;
18
30
  if (normal === undefined)
19
31
  throw new Error(`rule "${rule.id}" has no normal level`);
20
32
  return { level: "normal", limit: normal, fellBackToNormal: true };
@@ -1 +1 @@
1
- {"version":3,"file":"levels.js","sourceRoot":"","sources":["../src/levels.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAE/E,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAc,EAAkB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AAIhI;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAoB,EAAE,KAAY,EAAY,EAAE;IACtE,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;IACzE,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;IACnF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAClC,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,EAAE,uBAAuB,CAAC,CAAC;IACnF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;AACpE,CAAC,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAoB,EAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"levels.js","sourceRoot":"","sources":["../src/levels.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,MAAM,GAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AAE/E,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAc,EAAkB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AAIhI;;;;;;;GAOG;AACH;;;GAGG;AACH,MAAM,QAAQ,GAAG,CAAC,IAAoB,EAAE,KAAyB,EAAc,EAAE;IAC/E,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IAC5C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrF,OAAO,IAAI,CAAC,MAAM,CAAyB,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC;AACpH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAoB,EAAE,KAAY,EAAE,KAAc,EAAY,EAAE;IACtF,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;IACzE,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC;IACnF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAClD,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,EAAE,uBAAuB,CAAC,CAAC;IACnF,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;AACpE,CAAC,CAAC;AAEF,0CAA0C;AAC1C,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAoB,EAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { ProseDocument } from "./plugin.ts";
2
+ import type { Candidate } from "./semantic.ts";
3
+ export declare const wordsFrom: (lookAt: string | undefined) => string[];
4
+ export type Narrowing = {
5
+ readonly words: readonly string[];
6
+ readonly needsNumber: boolean;
7
+ readonly kept: number;
8
+ readonly total: number;
9
+ };
10
+ /**
11
+ * 絞り込めたら文単位で、絞り込めなければ文書全体を渡す。
12
+ * 全体を渡すときは「絞り込めなかった」ことを呼ぶ側に返す。黙って高いほうを選ばない。
13
+ */
14
+ export declare const narrow: (doc: ProseDocument, lookAt: string | undefined, whole: (doc: ProseDocument) => Candidate[]) => {
15
+ candidates: Candidate[];
16
+ narrowing: Narrowing;
17
+ };
18
+ //# sourceMappingURL=look-at.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"look-at.d.ts","sourceRoot":"","sources":["../src/look-at.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAe/C,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,GAAG,SAAS,KAAG,MAAM,EAI5D,CAAC;AAKF,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAS5I;;;GAGG;AACH,eAAO,MAAM,MAAM,GACjB,KAAK,aAAa,EAClB,QAAQ,MAAM,GAAG,SAAS,EAC1B,OAAO,CAAC,GAAG,EAAE,aAAa,KAAK,SAAS,EAAE,KACzC;IAAE,UAAU,EAAE,SAAS,EAAE,CAAC;IAAC,SAAS,EAAE,SAAS,CAAA;CAUjD,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * 自然文で書かれた `look_at` を、決定的な絞り込みに変える。spec §14、§26-7。
3
+ *
4
+ * 変換に LLM も対話も使わない。書き手は「どこを見るか」を説明するとき、
5
+ * 見るべき語を**自然に括弧でくくる**。
6
+ *
7
+ * look_at: 「お願いします」「ご確認ください」を含む文
8
+ *
9
+ * その括弧の中を取り出すだけで、文単位の絞り込みになる。
10
+ * 推測を足さないので、書いたものと動くものが一致する。
11
+ */
12
+ const QUOTED = /[「『"'`]([^「『』」"'`]{1,40})[」』"'`]/gu;
13
+ export const wordsFrom = (lookAt) => {
14
+ if (lookAt === undefined)
15
+ return [];
16
+ const found = [...lookAt.matchAll(QUOTED)].map((match) => match[1]?.trim() ?? "").filter((word) => word.length > 0);
17
+ return [...new Set(found)];
18
+ };
19
+ /** 数値を見ると書いてあれば、数字のある文に限る。 */
20
+ const WANTS_NUMBER = /数値|数字|number|figure/iu;
21
+ const NUMBER = /\d/u;
22
+ const matches = (text, words, needsNumber) => {
23
+ if (needsNumber && !NUMBER.test(text))
24
+ return false;
25
+ return words.length === 0 || words.some((word) => text.includes(word));
26
+ };
27
+ /**
28
+ * 絞り込めたら文単位で、絞り込めなければ文書全体を渡す。
29
+ * 全体を渡すときは「絞り込めなかった」ことを呼ぶ側に返す。黙って高いほうを選ばない。
30
+ */
31
+ export const narrow = (doc, lookAt, whole) => {
32
+ const words = wordsFrom(lookAt);
33
+ const needsNumber = lookAt !== undefined && WANTS_NUMBER.test(lookAt);
34
+ const total = doc.sentences.length;
35
+ if (words.length === 0 && !needsNumber)
36
+ return { candidates: whole(doc), narrowing: { words, needsNumber, kept: total, total } };
37
+ const hits = doc.sentences.filter((sentence) => matches(sentence.text, words, needsNumber));
38
+ return {
39
+ candidates: hits.map((sentence) => ({ text: sentence.text.trim(), offset: sentence.span.start })),
40
+ narrowing: { words, needsNumber, kept: hits.length, total },
41
+ };
42
+ };
43
+ //# sourceMappingURL=look-at.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"look-at.js","sourceRoot":"","sources":["../src/look-at.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,MAAM,MAAM,GAAG,oCAAoC,CAAC;AAEpD,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,MAA0B,EAAY,EAAE;IAChE,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,KAAK,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpH,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7B,CAAC,CAAC;AAEF,8BAA8B;AAC9B,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAI7C,MAAM,MAAM,GAAG,KAAK,CAAC;AAErB,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,KAAwB,EAAE,WAAoB,EAAW,EAAE;IACxF,IAAI,WAAW,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACzE,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,GAAkB,EAClB,MAA0B,EAC1B,KAA0C,EACS,EAAE;IACrD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,WAAW,GAAG,MAAM,KAAK,SAAS,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtE,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC;IACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;IACjI,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAC5F,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACjG,SAAS,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE;KAC5D,CAAC;AACJ,CAAC,CAAC"}