chaffjs 0.0.1 → 0.2.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 (109) hide show
  1. package/dist/checks.d.ts +20 -0
  2. package/dist/checks.d.ts.map +1 -0
  3. package/dist/checks.js +58 -0
  4. package/dist/checks.js.map +1 -0
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +14 -1
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/eval.d.ts +15 -0
  9. package/dist/commands/eval.d.ts.map +1 -0
  10. package/dist/commands/eval.js +44 -0
  11. package/dist/commands/eval.js.map +1 -0
  12. package/dist/commands/test.d.ts +21 -0
  13. package/dist/commands/test.d.ts.map +1 -0
  14. package/dist/commands/test.js +70 -0
  15. package/dist/commands/test.js.map +1 -0
  16. package/dist/config/by-path.d.ts +15 -0
  17. package/dist/config/by-path.d.ts.map +1 -0
  18. package/dist/config/by-path.js +41 -0
  19. package/dist/config/by-path.js.map +1 -0
  20. package/dist/config/load.d.ts +8 -0
  21. package/dist/config/load.d.ts.map +1 -1
  22. package/dist/config/load.js +34 -1
  23. package/dist/config/load.js.map +1 -1
  24. package/dist/detectors/count-per-section.d.ts +8 -1
  25. package/dist/detectors/count-per-section.d.ts.map +1 -1
  26. package/dist/detectors/count-per-section.js +26 -5
  27. package/dist/detectors/count-per-section.js.map +1 -1
  28. package/dist/detectors/sentence-length.d.ts.map +1 -1
  29. package/dist/detectors/sentence-length.js +3 -9
  30. package/dist/detectors/sentence-length.js.map +1 -1
  31. package/dist/detectors/sentence-rhythm.d.ts.map +1 -1
  32. package/dist/detectors/sentence-rhythm.js +3 -2
  33. package/dist/detectors/sentence-rhythm.js.map +1 -1
  34. package/dist/document.d.ts.map +1 -1
  35. package/dist/document.js +21 -6
  36. package/dist/document.js.map +1 -1
  37. package/dist/eval.d.ts +31 -0
  38. package/dist/eval.d.ts.map +1 -0
  39. package/dist/eval.js +62 -0
  40. package/dist/eval.js.map +1 -0
  41. package/dist/genre.d.ts.map +1 -1
  42. package/dist/genre.js +8 -1
  43. package/dist/genre.js.map +1 -1
  44. package/dist/init.d.ts.map +1 -1
  45. package/dist/init.js +2 -0
  46. package/dist/init.js.map +1 -1
  47. package/dist/judge.d.ts +40 -0
  48. package/dist/judge.d.ts.map +1 -0
  49. package/dist/judge.js +0 -0
  50. package/dist/judge.js.map +1 -0
  51. package/dist/measure.d.ts +15 -0
  52. package/dist/measure.d.ts.map +1 -0
  53. package/dist/measure.js +16 -0
  54. package/dist/measure.js.map +1 -0
  55. package/dist/plugin.d.ts +2 -0
  56. package/dist/plugin.d.ts.map +1 -1
  57. package/dist/render/eval.d.ts +7 -0
  58. package/dist/render/eval.d.ts.map +1 -0
  59. package/dist/render/eval.js +59 -0
  60. package/dist/render/eval.js.map +1 -0
  61. package/dist/render/semantic.d.ts +7 -0
  62. package/dist/render/semantic.d.ts.map +1 -0
  63. package/dist/render/semantic.js +50 -0
  64. package/dist/render/semantic.js.map +1 -0
  65. package/dist/rule-load.d.ts.map +1 -1
  66. package/dist/rule-load.js +12 -3
  67. package/dist/rule-load.js.map +1 -1
  68. package/dist/run-semantic.d.ts +17 -0
  69. package/dist/run-semantic.d.ts.map +1 -0
  70. package/dist/run-semantic.js +71 -0
  71. package/dist/run-semantic.js.map +1 -0
  72. package/dist/run.d.ts.map +1 -1
  73. package/dist/run.js +4 -0
  74. package/dist/run.js.map +1 -1
  75. package/dist/semantic.d.ts +25 -0
  76. package/dist/semantic.d.ts.map +1 -0
  77. package/dist/semantic.js +55 -0
  78. package/dist/semantic.js.map +1 -0
  79. package/package.json +4 -3
  80. package/rules/bold-density.yaml +8 -6
  81. package/rules/empty-conclusion.yaml +37 -0
  82. package/rules/empty-intensifier.yaml +1 -1
  83. package/rules/heading-echo.yaml +1 -1
  84. package/rules/max-sentence-length.yaml +1 -1
  85. package/rules/repeated-sentence-head.yaml +1 -1
  86. package/rules/risk-disclosure.yaml +41 -0
  87. package/rules/unsourced-number.yaml +40 -0
  88. package/src/checks.ts +74 -0
  89. package/src/cli.ts +12 -1
  90. package/src/commands/eval.ts +64 -0
  91. package/src/commands/test.ts +89 -0
  92. package/src/config/by-path.ts +47 -0
  93. package/src/config/load.ts +41 -1
  94. package/src/detectors/count-per-section.ts +30 -6
  95. package/src/detectors/sentence-length.ts +4 -10
  96. package/src/detectors/sentence-rhythm.ts +3 -2
  97. package/src/document.ts +22 -6
  98. package/src/eval.ts +80 -0
  99. package/src/genre.ts +8 -1
  100. package/src/init.ts +2 -0
  101. package/src/judge.ts +0 -0
  102. package/src/measure.ts +21 -0
  103. package/src/plugin.ts +2 -0
  104. package/src/render/eval.ts +62 -0
  105. package/src/render/semantic.ts +60 -0
  106. package/src/rule-load.ts +14 -3
  107. package/src/run-semantic.ts +107 -0
  108. package/src/run.ts +4 -0
  109. package/src/semantic.ts +74 -0
@@ -1,13 +1,34 @@
1
- /** 節あたりの強調の数。bold-density が使う。 */
1
+ import { charLength, proseText } from "../measure.js";
2
+ /** これより短い節では密度が暴れる。43 字に 1 箇所で「1000 字あたり 23」になる。 */
3
+ const MIN_CHARS = 200;
4
+ const PER = 1000;
5
+ const charsOf = (section) => section.sentences.reduce((sum, sentence) => sum + charLength(sentence), 0);
6
+ /**
7
+ * 節あたりの「密度」を見る。件数ではない。
8
+ *
9
+ * 件数で数えると、節が長いほど当たる。実文書で測ると、1095 字に 2 箇所の節と
10
+ * 557 字に 9 箇所の節が同じ「多すぎる」になっていた。読者が受け取る印象は逆なのに。
11
+ *
12
+ * rule の名前(bold-density)が最初から密度と言っていた。件数で実装していたのが誤り。
13
+ */
2
14
  export const countPerSection = (doc, options) => doc.sections
3
- .filter((section) => section.strongCount > options.limit)
4
- .map((section) => ({
15
+ .map((section) => ({ section, chars: charsOf(section) }))
16
+ .filter(({ chars }) => chars >= MIN_CHARS)
17
+ .map(({ section, chars }) => ({ section, chars, density: Math.round((section.strongCount / chars) * PER) }))
18
+ .filter(({ density }) => density > options.limit)
19
+ .map(({ section, chars, density }) => ({
5
20
  rule: "bold-density",
6
21
  severity: "warning",
7
22
  line: 0,
8
23
  column: 0,
9
24
  // 節全体を引くと段落をまたいで読めなくなる。最初の文だけ見せて場所を示す。
10
- quote: section.firstSentence?.text.trim() ?? "",
11
- values: { count: section.strongCount, limit: options.limit, offset: section.firstSentence?.span.start ?? section.span.start },
25
+ quote: section.firstSentence === undefined ? "" : proseText(section.firstSentence),
26
+ values: {
27
+ count: density,
28
+ limit: options.limit,
29
+ bolds: section.strongCount,
30
+ chars,
31
+ offset: section.firstSentence?.span.start ?? section.span.start,
32
+ },
12
33
  }));
13
34
  //# sourceMappingURL=count-per-section.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"count-per-section.js","sourceRoot":"","sources":["../../src/detectors/count-per-section.ts"],"names":[],"mappings":"AAEA,kCAAkC;AAClC,MAAM,CAAC,MAAM,eAAe,GAAa,CAAC,GAAG,EAAE,OAAO,EAAa,EAAE,CACnE,GAAG,CAAC,QAAQ;KACT,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;KACxD,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACjB,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,uCAAuC;IACvC,KAAK,EAAE,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;IAC/C,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE;CAC9H,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"count-per-section.js","sourceRoot":"","sources":["../../src/detectors/count-per-section.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGtD,oDAAoD;AACpD,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,MAAM,GAAG,GAAG,IAAI,CAAC;AAEjB,MAAM,OAAO,GAAG,CAAC,OAAgB,EAAU,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,GAAG,GAAG,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AAEzH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAa,CAAC,GAAG,EAAE,OAAO,EAAa,EAAE,CACnE,GAAG,CAAC,QAAQ;KACT,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;KACxD,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,KAAK,IAAI,SAAS,CAAC;KACzC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;KAC3G,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;KAChD,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACrC,IAAI,EAAE,cAAc;IACpB,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,uCAAuC;IACvC,KAAK,EAAE,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC;IAClF,MAAM,EAAE;QACN,KAAK,EAAE,OAAO;QACd,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,WAAW;QAC1B,KAAK;QACL,MAAM,EAAE,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK;KAChE;CACF,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sentence-length.d.ts","sourceRoot":"","sources":["../../src/detectors/sentence-length.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAoC,MAAM,cAAc,CAAC;AAS/E,eAAO,MAAM,cAAc,EAAE,QAWtB,CAAC"}
1
+ {"version":3,"file":"sentence-length.d.ts","sourceRoot":"","sources":["../../src/detectors/sentence-length.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAW,MAAM,cAAc,CAAC;AAEtD,eAAO,MAAM,cAAc,EAAE,QAWtB,CAAC"}
@@ -1,19 +1,13 @@
1
- /** 日本語は文字、英語は語。単位は adapter が宣言する。spec §7。 */
2
- const measure = (doc, sentence) => {
3
- const text = sentence.text.trim();
4
- if (doc.lengthUnit === "char")
5
- return text.length;
6
- return text.split(/\s+/u).filter((word) => word.length > 0).length;
7
- };
1
+ import { lengthOf, proseText } from "../measure.js";
8
2
  export const sentenceLength = (doc, options) => doc.sentences
9
- .map((sentence) => ({ sentence, size: measure(doc, sentence) }))
3
+ .map((sentence) => ({ sentence, size: lengthOf(sentence, doc.lengthUnit) }))
10
4
  .filter(({ size }) => size > options.limit)
11
5
  .map(({ sentence, size }) => ({
12
6
  rule: "max-sentence-length",
13
7
  severity: "warning",
14
8
  line: 0,
15
9
  column: 0,
16
- quote: sentence.text.trim(),
10
+ quote: proseText(sentence),
17
11
  values: { count: size, limit: options.limit, offset: sentence.span.start },
18
12
  }));
19
13
  //# sourceMappingURL=sentence-length.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sentence-length.js","sourceRoot":"","sources":["../../src/detectors/sentence-length.ts"],"names":[],"mappings":"AAEA,6CAA6C;AAC7C,MAAM,OAAO,GAAG,CAAC,GAAkB,EAAE,QAAkB,EAAU,EAAE;IACjE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAClC,IAAI,GAAG,CAAC,UAAU,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IAClD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;AACrE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAa,CAAC,GAAG,EAAE,OAAO,EAAa,EAAE,CAClE,GAAG,CAAC,SAAS;KACV,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;KAC/D,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC;KAC1C,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5B,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE;IAC3B,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE;CAC3E,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"sentence-length.js","sourceRoot":"","sources":["../../src/detectors/sentence-length.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,CAAC,MAAM,cAAc,GAAa,CAAC,GAAG,EAAE,OAAO,EAAa,EAAE,CAClE,GAAG,CAAC,SAAS;KACV,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;KAC3E,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC;KAC1C,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5B,IAAI,EAAE,qBAAqB;IAC3B,QAAQ,EAAE,SAAS;IACnB,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC;IAC1B,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE;CAC3E,CAAC,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sentence-rhythm.d.ts","sourceRoot":"","sources":["../../src/detectors/sentence-rhythm.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAW,MAAM,cAAc,CAAC;AAYtD,eAAO,MAAM,cAAc,EAAE,QAe5B,CAAC"}
1
+ {"version":3,"file":"sentence-rhythm.d.ts","sourceRoot":"","sources":["../../src/detectors/sentence-rhythm.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAW,MAAM,cAAc,CAAC;AAYtD,eAAO,MAAM,cAAc,EAAE,QAe5B,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { charLength, proseText } from "../measure.js";
1
2
  /** 文が少ないと変動係数は当てにならない。ここを下回る文書は見ない。 */
2
3
  const MIN_SENTENCES = 8;
3
4
  const coefficientOfVariation = (sizes) => {
@@ -8,7 +9,7 @@ const coefficientOfVariation = (sizes) => {
8
9
  return Math.sqrt(variance) / mean;
9
10
  };
10
11
  export const sentenceRhythm = (doc, options) => {
11
- const sizes = doc.sentences.map((sentence) => sentence.text.trim().length);
12
+ const sizes = doc.sentences.map((sentence) => charLength(sentence));
12
13
  if (sizes.length < MIN_SENTENCES)
13
14
  return [];
14
15
  const spread = Math.round(coefficientOfVariation(sizes) * 100);
@@ -20,7 +21,7 @@ export const sentenceRhythm = (doc, options) => {
20
21
  severity: "warning",
21
22
  line: 0,
22
23
  column: 0,
23
- quote: doc.sentences[0]?.text.trim() ?? "",
24
+ quote: doc.sentences[0] === undefined ? "" : proseText(doc.sentences[0]),
24
25
  values: { count: spread, limit: options.limit, offset: doc.sentences[0]?.span.start ?? 0 },
25
26
  },
26
27
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"sentence-rhythm.js","sourceRoot":"","sources":["../../src/detectors/sentence-rhythm.ts"],"names":[],"mappings":"AAEA,uCAAuC;AACvC,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,MAAM,sBAAsB,GAAG,CAAC,KAAwB,EAAU,EAAE;IAClE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACvE,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACzF,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAa,CAAC,GAAG,EAAE,OAAO,EAAa,EAAE;IAClE,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;IAC3E,IAAI,KAAK,CAAC,MAAM,GAAG,aAAa;QAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IAC/D,IAAI,MAAM,IAAI,OAAO,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO;QACL;YACE,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;YAC1C,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE;SAC3F;KACF,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"sentence-rhythm.js","sourceRoot":"","sources":["../../src/detectors/sentence-rhythm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAGtD,uCAAuC;AACvC,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,MAAM,sBAAsB,GAAG,CAAC,KAAwB,EAAU,EAAE;IAClE,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACvE,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;IACzF,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;AACpC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAa,CAAC,GAAG,EAAE,OAAO,EAAa,EAAE;IAClE,MAAM,KAAK,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpE,IAAI,KAAK,CAAC,MAAM,GAAG,aAAa;QAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,sBAAsB,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;IAC/D,IAAI,MAAM,IAAI,OAAO,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACvC,OAAO;QACL;YACE,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,SAAS;YACnB,IAAI,EAAE,CAAC;YACP,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACxE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE;SAC3F;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -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;AAsI3F,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,EAAE,SAAS,eAAe,KAAG,aAatF,CAAC"}
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"}
package/dist/document.js CHANGED
@@ -4,8 +4,14 @@ import { gfmTableFromMarkdown } from "mdast-util-gfm-table";
4
4
  import { frontmatter } from "micromark-extension-frontmatter";
5
5
  import { frontmatterFromMarkdown } from "mdast-util-frontmatter";
6
6
  import { maskSpans } from "./mask.js";
7
- /** 本文として数えないもの。コードは文章ではなく、表は文章の形をしていない。 */
8
- const NOT_PROSE = new Set(["code", "inlineCode", "html", "yaml", "toml", "table", "thematicBreak", "definition", "image", "imageReference"]);
7
+ /**
8
+ * 本文として数えないもの。
9
+ *
10
+ * コードは文章ではなく、表は文章の形をしていない。
11
+ * **引用は自分の文章ではない。** chaff が言えるのは「2 文に割ってください」までで、
12
+ * 引用文にそれはできない。直せないものを指摘しても、書いた人は動けない。
13
+ */
14
+ const NOT_PROSE = new Set(["code", "inlineCode", "html", "yaml", "toml", "table", "blockquote", "thematicBreak", "definition", "image", "imageReference"]);
9
15
  const spanOf = (node) => {
10
16
  const start = node.position?.start.offset;
11
17
  const end = node.position?.end.offset;
@@ -67,13 +73,21 @@ const headingsOf = (root, source) => {
67
73
  });
68
74
  return found;
69
75
  };
70
- const strongSpans = (root) => {
76
+ const startsInside = (span, regions) => regions.some((region) => span.start >= region.start && span.start < region.end);
77
+ /**
78
+ * 本文の強調だけを数える。
79
+ *
80
+ * 表のセルや見出しの中の太字はラベルであって強調ではない。
81
+ * 「太字は読者の目を止める道具」という bold-density の理屈が当てはまらない。
82
+ * 「本文でないもの」の定義は覆う範囲(collectMasks)に 1 つだけ置き、ここはそれを使う。
83
+ */
84
+ const strongSpans = (root, masked) => {
71
85
  const found = [];
72
86
  walk(root, (node) => {
73
87
  if (node.type !== "strong")
74
88
  return;
75
89
  const span = spanOf(node);
76
- if (span !== undefined)
90
+ if (span !== undefined && !startsInside(span, masked))
77
91
  found.push(span);
78
92
  });
79
93
  return found;
@@ -123,14 +137,15 @@ const sectionsOf = (headings, sentences, strongs, length) => {
123
137
  };
124
138
  export const buildDocument = (path, source, adapter) => {
125
139
  const root = parse(source);
126
- const prose = maskSpans(source, collectMasks(root));
140
+ const masked = collectMasks(root);
141
+ const prose = maskSpans(source, masked);
127
142
  const sentences = sentencesOf(prose, paragraphSpans(root), adapter);
128
143
  return {
129
144
  path,
130
145
  source,
131
146
  language: adapter.id,
132
147
  lengthUnit: adapter.capabilities.lengthUnit,
133
- sections: sectionsOf(headingsOf(root, source), sentences, strongSpans(root), source.length),
148
+ sections: sectionsOf(headingsOf(root, source), sentences, strongSpans(root, masked), source.length),
134
149
  sentences,
135
150
  lexicons: adapter.lexicons,
136
151
  };
@@ -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":"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"}
package/dist/eval.d.ts ADDED
@@ -0,0 +1,31 @@
1
+ import type { ProseDocument, RuleDefinition } from "./plugin.ts";
2
+ /**
3
+ * 閾値の較正。
4
+ *
5
+ * examples/ に置いた文書は、実際に公開した「人間の良い文書」。そこで多く発火する
6
+ * rule は、閾値が現実に合っていない疑いがある。spec §21 の目標(人間の良い文書での
7
+ * 誤検知率 5% 未満)を、そのまま推奨の判断に使う。
8
+ *
9
+ * これは較正であって正解ではない。corpus が変われば答えも変わる。だから自動では
10
+ * 適用せず、提示して選ばせる。
11
+ */
12
+ export declare const TARGET_HIT_RATE = 0.05;
13
+ /** 文書単位の割合は corpus が小さいと粗い。文字数あたりの密度を併記する。 */
14
+ export type Point = {
15
+ readonly limit: number;
16
+ readonly findings: number;
17
+ readonly documents: number;
18
+ readonly per10k: number;
19
+ };
20
+ /** 5% を表せるだけの文書数。これを下回ると割合が「0 か全部」になる。 */
21
+ export declare const MIN_CORPUS = 20;
22
+ export type RuleReport = {
23
+ readonly rule: string;
24
+ readonly name: string;
25
+ readonly current: number;
26
+ readonly sweep: readonly Point[];
27
+ readonly recommended: number | undefined;
28
+ readonly total: number;
29
+ };
30
+ export declare const evaluate: (docs: readonly ProseDocument[], rules: readonly RuleDefinition[], genre: string, language: string) => RuleReport[];
31
+ //# sourceMappingURL=eval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../src/eval.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEjE;;;;;;;;;GASG;AACH,eAAO,MAAM,eAAe,OAAO,CAAC;AAEpC,8CAA8C;AAC9C,MAAM,MAAM,KAAK,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/H,0CAA0C;AAC1C,eAAO,MAAM,UAAU,KAAK,CAAC;AAE7B,MAAM,MAAM,UAAU,GAAG;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,KAAK,EAAE,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB,CAAC;AAoCF,eAAO,MAAM,QAAQ,GAAI,MAAM,SAAS,aAAa,EAAE,EAAE,OAAO,SAAS,cAAc,EAAE,EAAE,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,UAAU,EAcjI,CAAC"}
package/dist/eval.js ADDED
@@ -0,0 +1,62 @@
1
+ import { DETECTORS } from "./detectors/index.js";
2
+ import { charLength } from "./measure.js";
3
+ /**
4
+ * 閾値の較正。
5
+ *
6
+ * examples/ に置いた文書は、実際に公開した「人間の良い文書」。そこで多く発火する
7
+ * rule は、閾値が現実に合っていない疑いがある。spec §21 の目標(人間の良い文書での
8
+ * 誤検知率 5% 未満)を、そのまま推奨の判断に使う。
9
+ *
10
+ * これは較正であって正解ではない。corpus が変われば答えも変わる。だから自動では
11
+ * 適用せず、提示して選ばせる。
12
+ */
13
+ export const TARGET_HIT_RATE = 0.05;
14
+ /** 5% を表せるだけの文書数。これを下回ると割合が「0 か全部」になる。 */
15
+ export const MIN_CORPUS = 20;
16
+ /** strict が relaxed より大きい rule は、値が大きいほど厳しい(sentence-rhythm)。 */
17
+ const stricterIsHigher = (rule) => (rule.levels.strict ?? 0) > (rule.levels.relaxed ?? 0);
18
+ const MULTIPLIERS = [0.5, 0.7, 0.85, 1, 1.25, 1.5, 2, 3];
19
+ /** rule 自身が持つ段を基点に掃引する。rule ごとに単位が違うので、倍率で散らす。 */
20
+ const candidates = (rule) => {
21
+ const base = rule.levels.normal ?? 1;
22
+ const fromLevels = [rule.levels.strict, rule.levels.normal, rule.levels.relaxed].filter((value) => value !== undefined);
23
+ const scaled = MULTIPLIERS.map((factor) => Math.max(1, Math.round(base * factor)));
24
+ return [...new Set([...fromLevels, ...scaled])].sort((left, right) => left - right);
25
+ };
26
+ const countAt = (docs, rule, limit) => {
27
+ const detector = DETECTORS[rule.how_to_find];
28
+ if (detector === undefined)
29
+ return { limit, findings: 0, documents: 0, per10k: 0 };
30
+ const perDoc = docs.map((doc) => {
31
+ const lexicon = rule.word_list === undefined ? undefined : doc.lexicons[rule.word_list];
32
+ if (rule.word_list !== undefined && lexicon === undefined)
33
+ return 0;
34
+ return detector(doc, { limit, lexicon, where: rule.where }).length;
35
+ });
36
+ const findings = perDoc.reduce((sum, count) => sum + count, 0);
37
+ const chars = docs.reduce((sum, doc) => sum + doc.sentences.reduce((inner, sentence) => inner + charLength(sentence), 0), 0);
38
+ return { limit, findings, documents: perDoc.filter((count) => count > 0).length, per10k: chars === 0 ? 0 : (findings / chars) * 10000 };
39
+ };
40
+ /** 目標の誤検知率を満たす中で、いちばん厳しい閾値を選ぶ。 */
41
+ const recommend = (rule, sweep, total) => {
42
+ const ok = sweep.filter((point) => point.documents / Math.max(1, total) <= TARGET_HIT_RATE);
43
+ if (ok.length === 0)
44
+ return undefined;
45
+ const strictest = stricterIsHigher(rule) ? Math.max(...ok.map((p) => p.limit)) : Math.min(...ok.map((p) => p.limit));
46
+ return strictest;
47
+ };
48
+ export const evaluate = (docs, rules, genre, language) => rules
49
+ .filter((rule) => rule.layer !== "L4" && rule.use_for.some((target) => genre.startsWith(target)))
50
+ .map((rule) => {
51
+ const sweep = candidates(rule).map((limit) => countAt(docs, rule, limit));
52
+ const current = rule.levels.normal ?? 1;
53
+ return {
54
+ rule: rule.id,
55
+ name: rule.name[language] ?? rule.id,
56
+ current,
57
+ sweep,
58
+ recommended: recommend(rule, sweep, docs.length),
59
+ total: docs.length,
60
+ };
61
+ });
62
+ //# sourceMappingURL=eval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.js","sourceRoot":"","sources":["../src/eval.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"genre.d.ts","sourceRoot":"","sources":["../src/genre.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAqB3E,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,EAAE,OAAO,MAAM,GAAG,SAAS,KAAG,UAAU,GAAG,SAOjG,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,SAI1D,CAAC"}
1
+ {"version":3,"file":"genre.d.ts","sourceRoot":"","sources":["../src/genre.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AA4B3E,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,QAAQ,MAAM,EAAE,OAAO,MAAM,GAAG,SAAS,KAAG,UAAU,GAAG,SAOjG,CAAC;AAEF,kDAAkD;AAClD,eAAO,MAAM,gBAAgB,GAAI,QAAQ,MAAM,KAAG,MAAM,GAAG,SAI1D,CAAC"}
package/dist/genre.js CHANGED
@@ -1,10 +1,17 @@
1
+ /**
2
+ * 仕様書・README は「読ませる文章」ではなく「間違えさせない文章」。
3
+ * 書き出しのつかみもリズムも要らない。技術文書として別に見る。
4
+ */
1
5
  const BY_PATH = [
6
+ [/(^|\/)readme\.md$/iu, "technical/readme"],
7
+ [/spec[^/]*\.md$/iu, "technical/spec"],
8
+ [/(^|\/)(spec|specs)\//iu, "technical/spec"],
2
9
  [/(^|\/)(proposals?|teian)\//iu, "business/proposal"],
3
10
  [/(^|\/)(minutes|gijiroku)\//iu, "business/meeting-notes"],
4
11
  [/(^|\/)(press|pr)\//iu, "business/press-release"],
5
12
  [/(^|\/)(reports?)\//iu, "business/report"],
6
13
  [/(^|\/)(blog|posts?|articles?)\//iu, "blog/tech"],
7
- [/(^|\/)docs?\//iu, "blog/tech"],
14
+ [/(^|\/)docs?\//iu, "technical/readme"],
8
15
  ];
9
16
  /**
10
17
  * 見出しと行頭に限る。本文中の言及では判定しない。
package/dist/genre.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"genre.js","sourceRoot":"","sources":["../src/genre.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,GAA2C;IACtD,CAAC,8BAA8B,EAAE,mBAAmB,CAAC;IACrD,CAAC,8BAA8B,EAAE,wBAAwB,CAAC;IAC1D,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;IAClD,CAAC,sBAAsB,EAAE,iBAAiB,CAAC;IAC3C,CAAC,mCAAmC,EAAE,WAAW,CAAC;IAClD,CAAC,iBAAiB,EAAE,WAAW,CAAC;CACjC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,GAA2C;IACzD,CAAC,gDAAgD,EAAE,wBAAwB,CAAC;IAC5E,CAAC,4CAA4C,EAAE,wBAAwB,CAAC;IACxE,CAAC,uBAAuB,EAAE,iBAAiB,CAAC;CAC7C,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,KAAyB,EAA0B,EAAE;IAC5G,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClE,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACvE,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxE,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,kDAAkD;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAsB,EAAE;IACrE,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnB,CAAC,CAAC"}
1
+ {"version":3,"file":"genre.js","sourceRoot":"","sources":["../src/genre.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,OAAO,GAA2C;IACtD,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;IAC3C,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IACtC,CAAC,wBAAwB,EAAE,gBAAgB,CAAC;IAC5C,CAAC,8BAA8B,EAAE,mBAAmB,CAAC;IACrD,CAAC,8BAA8B,EAAE,wBAAwB,CAAC;IAC1D,CAAC,sBAAsB,EAAE,wBAAwB,CAAC;IAClD,CAAC,sBAAsB,EAAE,iBAAiB,CAAC;IAC3C,CAAC,mCAAmC,EAAE,WAAW,CAAC;IAClD,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;CACxC,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,GAA2C;IACzD,CAAC,gDAAgD,EAAE,wBAAwB,CAAC;IAC5E,CAAC,4CAA4C,EAAE,wBAAwB,CAAC;IACxE,CAAC,uBAAuB,EAAE,iBAAiB,CAAC;CAC7C,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,MAAc,EAAE,KAAyB,EAA0B,EAAE;IAC5G,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/D,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAClE,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACvE,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACxE,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,kDAAkD;AAClD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAc,EAAsB,EAAE;IACrE,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gCAAgC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnB,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,EASnC,CAAC"}
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"}
package/dist/init.js CHANGED
@@ -59,6 +59,8 @@ export const runInit = (dir, genre) => {
59
59
  ];
60
60
  };
61
61
  export const GENRES = [
62
+ "technical/spec",
63
+ "technical/readme",
62
64
  "blog/tech",
63
65
  "blog/essay",
64
66
  "blog/owned-media",
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,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,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"}
@@ -0,0 +1,40 @@
1
+ import Anthropic from "@anthropic-ai/sdk";
2
+ export declare const CACHE_DIR = ".chaff-cache";
3
+ /** 判定は必ずこの形で返させる。自由文を後から解釈しない。 */
4
+ export type Verdict = {
5
+ readonly violated: boolean;
6
+ readonly confidence: number;
7
+ readonly reason: string;
8
+ };
9
+ export type Ask = {
10
+ readonly rule: string;
11
+ readonly rubric: string;
12
+ /** 判定に渡す範囲。文書全体ではなく、絞り込んだ部分だけ。spec §14。 */
13
+ readonly candidate: string;
14
+ readonly language: string;
15
+ };
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
+ export type JudgeOptions = {
29
+ readonly model: string;
30
+ readonly cacheDir: string;
31
+ readonly client?: JudgeClient | undefined;
32
+ };
33
+ export declare const hasCredentials: (profileDir?: string) => boolean;
34
+ export declare const isAuthFailure: (error: unknown) => boolean;
35
+ /**
36
+ * 同じ (model, rule, rubric, candidate) なら 2 度目は問い合わせない。
37
+ * CI でも使えるよう、キャッシュはファイルに置く。spec §14。
38
+ */
39
+ export declare const ask: (request: Ask, options: JudgeOptions) => Promise<Verdict>;
40
+ //# sourceMappingURL=judge.d.ts.map
@@ -0,0 +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"}
package/dist/judge.js ADDED
Binary file
@@ -0,0 +1 @@
1
+ {"version":3,"file":"judge.js","sourceRoot":"","sources":["../src/judge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Sentence } from "./plugin.ts";
2
+ /**
3
+ * 文の長さ。**覆った部分の空白を数えない。**
4
+ *
5
+ * 非 prose は同じ長さの空白で覆っている(オフセットを保つため)。そのまま数えると、
6
+ * URL を 1 つ含む文が「245 文字」になる。実文書で max-sentence-length が指摘の
7
+ * 8 割を占めていた原因はこれで、読み手が長いと感じる長さではなかった。
8
+ *
9
+ * 日本語は文字数、英語は語数。単位は adapter が宣言する。
10
+ */
11
+ export declare const proseText: (sentence: Sentence) => string;
12
+ export declare const charLength: (sentence: Sentence) => number;
13
+ export declare const wordLength: (sentence: Sentence) => number;
14
+ export declare const lengthOf: (sentence: Sentence, unit: "char" | "word") => number;
15
+ //# sourceMappingURL=measure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure.d.ts","sourceRoot":"","sources":["../src/measure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,GAAI,UAAU,QAAQ,KAAG,MAAoD,CAAC;AAEpG,eAAO,MAAM,UAAU,GAAI,UAAU,QAAQ,KAAG,MAAmD,CAAC;AAEpG,eAAO,MAAM,UAAU,GAAI,UAAU,QAAQ,KAAG,MAGH,CAAC;AAE9C,eAAO,MAAM,QAAQ,GAAI,UAAU,QAAQ,EAAE,MAAM,MAAM,GAAG,MAAM,KAAG,MAAyE,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * 文の長さ。**覆った部分の空白を数えない。**
3
+ *
4
+ * 非 prose は同じ長さの空白で覆っている(オフセットを保つため)。そのまま数えると、
5
+ * URL を 1 つ含む文が「245 文字」になる。実文書で max-sentence-length が指摘の
6
+ * 8 割を占めていた原因はこれで、読み手が長いと感じる長さではなかった。
7
+ *
8
+ * 日本語は文字数、英語は語数。単位は adapter が宣言する。
9
+ */
10
+ export const proseText = (sentence) => sentence.text.replace(/\s+/gu, " ").trim();
11
+ export const charLength = (sentence) => sentence.text.replace(/\s+/gu, "").length;
12
+ export const wordLength = (sentence) => proseText(sentence)
13
+ .split(" ")
14
+ .filter((word) => word.length > 0).length;
15
+ export const lengthOf = (sentence, unit) => (unit === "char" ? charLength(sentence) : wordLength(sentence));
16
+ //# sourceMappingURL=measure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"measure.js","sourceRoot":"","sources":["../src/measure.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAAkB,EAAU,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAEpG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAkB,EAAU,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC;AAEpG,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,QAAkB,EAAU,EAAE,CACvD,SAAS,CAAC,QAAQ,CAAC;KAChB,KAAK,CAAC,GAAG,CAAC;KACV,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;AAE9C,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAkB,EAAE,IAAqB,EAAU,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC"}
package/dist/plugin.d.ts CHANGED
@@ -109,6 +109,8 @@ export type RuleDefinition = {
109
109
  readonly levels: LevelTable;
110
110
  readonly how_to_find: string;
111
111
  readonly word_list: string | undefined;
112
+ /** L4 のみ。LLM に渡す決まり。言語別。 */
113
+ readonly what_to_check: Localized | undefined;
112
114
  readonly where: string | undefined;
113
115
  readonly use_for: readonly string[];
114
116
  readonly severity: Severity;
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type RuleReport } from "../eval.ts";
2
+ /**
3
+ * 閾値は自動で書き換えない。提示して選ばせる。
4
+ * 較正は corpus に対する答えであって、正解ではないため。
5
+ */
6
+ export declare const renderEval: (reports: readonly RuleReport[], total: number, paths: number) => string;
7
+ //# sourceMappingURL=eval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval.d.ts","sourceRoot":"","sources":["../../src/render/eval.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAoC1E;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,SAAS,SAAS,UAAU,EAAE,EAAE,OAAO,MAAM,EAAE,OAAO,MAAM,KAAG,MAqBhD,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { MIN_CORPUS, TARGET_HIT_RATE } from "../eval.js";
2
+ const pct = (part, whole) => `${((part / Math.max(1, whole)) * 100).toFixed(1)}%`;
3
+ const mark = (report, limit) => {
4
+ if (limit === report.current && limit === report.recommended)
5
+ return " ← 現在 / 推奨";
6
+ if (limit === report.current)
7
+ return " ← 現在";
8
+ if (limit === report.recommended)
9
+ return " ← 推奨";
10
+ return "";
11
+ };
12
+ const sweepLines = (report) => report.sweep.map((point) => {
13
+ const limit = String(point.limit).padStart(6);
14
+ const docs = `${String(point.documents).padStart(3)} 文書`;
15
+ const density = `1万字あたり ${point.per10k.toFixed(1)}`;
16
+ return ` ${limit} ${docs} (${pct(point.documents, report.total).padStart(6)}) 指摘 ${String(point.findings).padStart(3)} 件 ${density}${mark(report, point.limit)}`;
17
+ });
18
+ const verdict = (report) => {
19
+ const now = report.sweep.find((point) => point.limit === report.current);
20
+ const rate = now === undefined ? 0 : now.documents / Math.max(1, report.total);
21
+ if (rate <= TARGET_HIT_RATE)
22
+ return [` いまの閾値で目標(${TARGET_HIT_RATE * 100}% 未満)を満たしています。`];
23
+ if (report.recommended === undefined) {
24
+ return [` どの閾値でも目標を満たしません。この corpus に対して rule 自体が合っていない可能性があります。`];
25
+ }
26
+ return [
27
+ ` いまの閾値では ${pct(now?.documents ?? 0, report.total)} の文書が該当し、目標(${TARGET_HIT_RATE * 100}% 未満)を超えています。`,
28
+ ` 推奨: ${report.recommended}`,
29
+ "",
30
+ ` chaff.yaml に書くなら: rules:\n ${report.rule}: ${report.recommended}`,
31
+ ];
32
+ };
33
+ const block = (report) => ["", ` ${report.name} (${report.rule})`, "", ...sweepLines(report), "", ...verdict(report), ""];
34
+ /**
35
+ * 閾値は自動で書き換えない。提示して選ばせる。
36
+ * 較正は corpus に対する答えであって、正解ではないため。
37
+ */
38
+ export const renderEval = (reports, total, paths) => [
39
+ "",
40
+ ` ${paths} ファイルを corpus として ${reports.length} 本の rule を測りました。`,
41
+ "",
42
+ " ここにある文書は「人間が書いて公開した良い文書」として扱っています。",
43
+ ` そこで多く発火する rule は、閾値が現実に合っていない疑いがあります(目標: ${TARGET_HIT_RATE * 100}% 未満)。`,
44
+ ...(total < MIN_CORPUS
45
+ ? [
46
+ "",
47
+ ` ※ corpus が ${total} 文書しかありません。${TARGET_HIT_RATE * 100}% を表すには ${MIN_CORPUS} 文書以上が要ります。`,
48
+ " いまは割合が「0 か全部」に振れるので、右端の密度(1万字あたりの指摘数)のほうを見てください。",
49
+ ]
50
+ : []),
51
+ ...reports.flatMap(block),
52
+ " " + "─".repeat(58),
53
+ "",
54
+ ` 閾値は自動で書き換えていません。corpus が変われば答えも変わるためです。`,
55
+ "",
56
+ ]
57
+ .join("\n")
58
+ .replace(/\{total\}/gu, String(total));
59
+ //# sourceMappingURL=eval.js.map