chaffjs 0.25.0 → 0.27.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 (468) hide show
  1. package/README.md +179 -42
  2. package/dist/adapter-import.d.ts +2 -0
  3. package/dist/adapter-import.d.ts.map +1 -0
  4. package/dist/adapter-import.js +11 -0
  5. package/dist/adapter-import.js.map +1 -0
  6. package/dist/adapter-load.d.ts.map +1 -1
  7. package/dist/adapter-load.js +2 -9
  8. package/dist/adapter-load.js.map +1 -1
  9. package/dist/ai-score/human-shares.d.ts +4 -0
  10. package/dist/ai-score/human-shares.d.ts.map +1 -0
  11. package/dist/ai-score/human-shares.js +205 -0
  12. package/dist/ai-score/human-shares.js.map +1 -0
  13. package/dist/ai-score/lint-line.d.ts +4 -0
  14. package/dist/ai-score/lint-line.d.ts.map +1 -0
  15. package/dist/ai-score/lint-line.js +9 -0
  16. package/dist/ai-score/lint-line.js.map +1 -0
  17. package/dist/ai-score/of-document.d.ts +7 -0
  18. package/dist/ai-score/of-document.d.ts.map +1 -0
  19. package/dist/ai-score/of-document.js +40 -0
  20. package/dist/ai-score/of-document.js.map +1 -0
  21. package/dist/ai-score/render.d.ts +24 -0
  22. package/dist/ai-score/render.d.ts.map +1 -0
  23. package/dist/ai-score/render.js +100 -0
  24. package/dist/ai-score/render.js.map +1 -0
  25. package/dist/ai-score/score.d.ts +77 -0
  26. package/dist/ai-score/score.d.ts.map +1 -0
  27. package/dist/ai-score/score.js +52 -0
  28. package/dist/ai-score/score.js.map +1 -0
  29. package/dist/ai-score/signals.d.ts +19 -0
  30. package/dist/ai-score/signals.d.ts.map +1 -0
  31. package/dist/ai-score/signals.js +30 -0
  32. package/dist/ai-score/signals.js.map +1 -0
  33. package/dist/ai-score/text.d.ts +37 -0
  34. package/dist/ai-score/text.d.ts.map +1 -0
  35. package/dist/ai-score/text.js +59 -0
  36. package/dist/ai-score/text.js.map +1 -0
  37. package/dist/ai-score/view.d.ts +5 -0
  38. package/dist/ai-score/view.d.ts.map +1 -0
  39. package/dist/ai-score/view.js +19 -0
  40. package/dist/ai-score/view.js.map +1 -0
  41. package/dist/backends/anthropic.d.ts +0 -1
  42. package/dist/backends/anthropic.d.ts.map +1 -1
  43. package/dist/backends/anthropic.js +0 -1
  44. package/dist/backends/anthropic.js.map +1 -1
  45. package/dist/backends/default-model.d.ts +3 -0
  46. package/dist/backends/default-model.d.ts.map +1 -0
  47. package/dist/backends/default-model.js +5 -0
  48. package/dist/backends/default-model.js.map +1 -0
  49. package/dist/backends/openai.d.ts +0 -1
  50. package/dist/backends/openai.d.ts.map +1 -1
  51. package/dist/backends/openai.js +0 -1
  52. package/dist/backends/openai.js.map +1 -1
  53. package/dist/browser/adapter-import.d.ts +2 -0
  54. package/dist/browser/adapter-import.d.ts.map +1 -0
  55. package/dist/browser/adapter-import.js +17 -0
  56. package/dist/browser/adapter-import.js.map +1 -0
  57. package/dist/browser/bounded-match.d.ts +3 -0
  58. package/dist/browser/bounded-match.d.ts.map +1 -0
  59. package/dist/browser/bounded-match.js +4 -0
  60. package/dist/browser/bounded-match.js.map +1 -0
  61. package/dist/browser/check-text.d.ts +43 -0
  62. package/dist/browser/check-text.d.ts.map +1 -0
  63. package/dist/browser/check-text.js +50 -0
  64. package/dist/browser/check-text.js.map +1 -0
  65. package/dist/browser/detectors.d.ts +4 -0
  66. package/dist/browser/detectors.d.ts.map +1 -0
  67. package/dist/browser/detectors.js +22 -0
  68. package/dist/browser/detectors.js.map +1 -0
  69. package/dist/browser/package-files.d.ts +5 -0
  70. package/dist/browser/package-files.d.ts.map +1 -0
  71. package/dist/browser/package-files.js +8 -0
  72. package/dist/browser/package-files.js.map +1 -0
  73. package/dist/browser/path.d.ts +9 -0
  74. package/dist/browser/path.d.ts.map +1 -0
  75. package/dist/browser/path.js +70 -0
  76. package/dist/browser/path.js.map +1 -0
  77. package/dist/browser/working-dir.d.ts +2 -0
  78. package/dist/browser/working-dir.d.ts.map +1 -0
  79. package/dist/browser/working-dir.js +3 -0
  80. package/dist/browser/working-dir.js.map +1 -0
  81. package/dist/browser-files.d.ts +21 -0
  82. package/dist/browser-files.d.ts.map +1 -0
  83. package/dist/browser-files.js +65 -0
  84. package/dist/browser-files.js.map +1 -0
  85. package/dist/browser.d.ts +9 -0
  86. package/dist/browser.d.ts.map +1 -0
  87. package/dist/browser.js +13 -0
  88. package/dist/browser.js.map +1 -0
  89. package/dist/capitals-with-small.d.ts +8 -0
  90. package/dist/capitals-with-small.d.ts.map +1 -0
  91. package/dist/capitals-with-small.js +20 -0
  92. package/dist/capitals-with-small.js.map +1 -0
  93. package/dist/cli-text.d.ts.map +1 -1
  94. package/dist/cli-text.js +2 -0
  95. package/dist/cli-text.js.map +1 -1
  96. package/dist/cli.d.ts.map +1 -1
  97. package/dist/cli.js +4 -1
  98. package/dist/cli.js.map +1 -1
  99. package/dist/commands/ai-score.d.ts +8 -0
  100. package/dist/commands/ai-score.d.ts.map +1 -0
  101. package/dist/commands/ai-score.js +59 -0
  102. package/dist/commands/ai-score.js.map +1 -0
  103. package/dist/commands/document-commands.d.ts.map +1 -1
  104. package/dist/commands/document-commands.js +2 -0
  105. package/dist/commands/document-commands.js.map +1 -1
  106. package/dist/config/by-path-problems.d.ts +5 -0
  107. package/dist/config/by-path-problems.d.ts.map +1 -0
  108. package/dist/config/by-path-problems.js +11 -0
  109. package/dist/config/by-path-problems.js.map +1 -0
  110. package/dist/config/load.d.ts +9 -2
  111. package/dist/config/load.d.ts.map +1 -1
  112. package/dist/config/load.js +21 -8
  113. package/dist/config/load.js.map +1 -1
  114. package/dist/config/read.d.ts +2 -0
  115. package/dist/config/read.d.ts.map +1 -1
  116. package/dist/config/read.js +4 -1
  117. package/dist/config/read.js.map +1 -1
  118. package/dist/config/warnings.d.ts +1 -1
  119. package/dist/config/warnings.d.ts.map +1 -1
  120. package/dist/config/warnings.js +3 -1
  121. package/dist/config/warnings.js.map +1 -1
  122. package/dist/config/working-dir.d.ts +2 -0
  123. package/dist/config/working-dir.d.ts.map +1 -0
  124. package/dist/config/working-dir.js +3 -0
  125. package/dist/config/working-dir.js.map +1 -0
  126. package/dist/custom/bounded-match.d.ts +1 -12
  127. package/dist/custom/bounded-match.d.ts.map +1 -1
  128. package/dist/custom/bounded-match.js +1 -11
  129. package/dist/custom/bounded-match.js.map +1 -1
  130. package/dist/custom/pattern-timeout.d.ts +13 -0
  131. package/dist/custom/pattern-timeout.d.ts.map +1 -0
  132. package/dist/custom/pattern-timeout.js +13 -0
  133. package/dist/custom/pattern-timeout.js.map +1 -0
  134. package/dist/derived/relative-weekdays.d.ts +16 -0
  135. package/dist/derived/relative-weekdays.d.ts.map +1 -0
  136. package/dist/derived/relative-weekdays.js +52 -0
  137. package/dist/derived/relative-weekdays.js.map +1 -0
  138. package/dist/detect.d.ts.map +1 -1
  139. package/dist/detect.js +4 -5
  140. package/dist/detect.js.map +1 -1
  141. package/dist/detectors/change-rate.d.ts +3 -0
  142. package/dist/detectors/change-rate.d.ts.map +1 -0
  143. package/dist/detectors/change-rate.js +102 -0
  144. package/dist/detectors/change-rate.js.map +1 -0
  145. package/dist/detectors/date-year.d.ts +10 -2
  146. package/dist/detectors/date-year.d.ts.map +1 -1
  147. package/dist/detectors/date-year.js +44 -8
  148. package/dist/detectors/date-year.js.map +1 -1
  149. package/dist/detectors/defined-term-form.d.ts +5 -0
  150. package/dist/detectors/defined-term-form.d.ts.map +1 -1
  151. package/dist/detectors/defined-term-form.js +22 -5
  152. package/dist/detectors/defined-term-form.js.map +1 -1
  153. package/dist/detectors/derived-numbers.d.ts.map +1 -1
  154. package/dist/detectors/derived-numbers.js +3 -7
  155. package/dist/detectors/derived-numbers.js.map +1 -1
  156. package/dist/detectors/document-date.d.ts +4 -0
  157. package/dist/detectors/document-date.d.ts.map +1 -0
  158. package/dist/detectors/document-date.js +12 -0
  159. package/dist/detectors/document-date.js.map +1 -0
  160. package/dist/detectors/orthographic-variant.d.ts.map +1 -1
  161. package/dist/detectors/orthographic-variant.js +60 -28
  162. package/dist/detectors/orthographic-variant.js.map +1 -1
  163. package/dist/detectors/party-role-name.d.ts +3 -0
  164. package/dist/detectors/party-role-name.d.ts.map +1 -0
  165. package/dist/detectors/party-role-name.js +35 -0
  166. package/dist/detectors/party-role-name.js.map +1 -0
  167. package/dist/detectors/quote-without-source.d.ts +17 -0
  168. package/dist/detectors/quote-without-source.d.ts.map +1 -0
  169. package/dist/detectors/quote-without-source.js +64 -0
  170. package/dist/detectors/quote-without-source.js.map +1 -0
  171. package/dist/detectors/reference-text.js +1 -1
  172. package/dist/detectors/reference-text.js.map +1 -1
  173. package/dist/detectors/registry/change-rate.d.ts +3 -0
  174. package/dist/detectors/registry/change-rate.d.ts.map +1 -0
  175. package/dist/detectors/registry/change-rate.js +3 -0
  176. package/dist/detectors/registry/change-rate.js.map +1 -0
  177. package/dist/detectors/registry/party-role-name.d.ts +3 -0
  178. package/dist/detectors/registry/party-role-name.d.ts.map +1 -0
  179. package/dist/detectors/registry/party-role-name.js +3 -0
  180. package/dist/detectors/registry/party-role-name.js.map +1 -0
  181. package/dist/detectors/registry/quote-without-source.d.ts +3 -0
  182. package/dist/detectors/registry/quote-without-source.d.ts.map +1 -0
  183. package/dist/detectors/registry/quote-without-source.js +3 -0
  184. package/dist/detectors/registry/quote-without-source.js.map +1 -0
  185. package/dist/detectors/registry/vague-deadline.d.ts +3 -0
  186. package/dist/detectors/registry/vague-deadline.d.ts.map +1 -0
  187. package/dist/detectors/registry/vague-deadline.js +3 -0
  188. package/dist/detectors/registry/vague-deadline.js.map +1 -0
  189. package/dist/detectors/registry/version-mismatch.d.ts +3 -0
  190. package/dist/detectors/registry/version-mismatch.d.ts.map +1 -0
  191. package/dist/detectors/registry/version-mismatch.js +3 -0
  192. package/dist/detectors/registry/version-mismatch.js.map +1 -0
  193. package/dist/detectors/relative-dates.d.ts.map +1 -1
  194. package/dist/detectors/relative-dates.js +3 -1
  195. package/dist/detectors/relative-dates.js.map +1 -1
  196. package/dist/detectors/relative-day-words.d.ts +4 -0
  197. package/dist/detectors/relative-day-words.d.ts.map +1 -0
  198. package/dist/detectors/relative-day-words.js +105 -0
  199. package/dist/detectors/relative-day-words.js.map +1 -0
  200. package/dist/detectors/run-in-label.d.ts +7 -0
  201. package/dist/detectors/run-in-label.d.ts.map +1 -0
  202. package/dist/detectors/run-in-label.js +53 -0
  203. package/dist/detectors/run-in-label.js.map +1 -0
  204. package/dist/detectors/sentence-counts.d.ts +3 -1
  205. package/dist/detectors/sentence-counts.d.ts.map +1 -1
  206. package/dist/detectors/sentence-counts.js +11 -4
  207. package/dist/detectors/sentence-counts.js.map +1 -1
  208. package/dist/detectors/sentence-ending.d.ts +1 -1
  209. package/dist/detectors/sentence-ending.d.ts.map +1 -1
  210. package/dist/detectors/sentence-ending.js +2 -1
  211. package/dist/detectors/sentence-ending.js.map +1 -1
  212. package/dist/detectors/structure-tree.d.ts +8 -2
  213. package/dist/detectors/structure-tree.d.ts.map +1 -1
  214. package/dist/detectors/structure-tree.js +86 -5
  215. package/dist/detectors/structure-tree.js.map +1 -1
  216. package/dist/detectors/unbalanced-bracket.d.ts +1 -1
  217. package/dist/detectors/unbalanced-bracket.d.ts.map +1 -1
  218. package/dist/detectors/unbalanced-bracket.js +23 -11
  219. package/dist/detectors/unbalanced-bracket.js.map +1 -1
  220. package/dist/detectors/vague-deadline.d.ts +25 -0
  221. package/dist/detectors/vague-deadline.d.ts.map +1 -0
  222. package/dist/detectors/vague-deadline.js +97 -0
  223. package/dist/detectors/vague-deadline.js.map +1 -0
  224. package/dist/detectors/version-mismatch.d.ts +3 -0
  225. package/dist/detectors/version-mismatch.d.ts.map +1 -0
  226. package/dist/detectors/version-mismatch.js +19 -0
  227. package/dist/detectors/version-mismatch.js.map +1 -0
  228. package/dist/furigana.d.ts +7 -0
  229. package/dist/furigana.d.ts.map +1 -0
  230. package/dist/furigana.js +16 -0
  231. package/dist/furigana.js.map +1 -0
  232. package/dist/genre-load.d.ts.map +1 -1
  233. package/dist/genre-load.js +5 -7
  234. package/dist/genre-load.js.map +1 -1
  235. package/dist/grade/ai-score.d.ts +16 -0
  236. package/dist/grade/ai-score.d.ts.map +1 -0
  237. package/dist/grade/ai-score.js +17 -0
  238. package/dist/grade/ai-score.js.map +1 -0
  239. package/dist/grade/finding.d.ts +6 -0
  240. package/dist/grade/finding.d.ts.map +1 -0
  241. package/dist/grade/finding.js +13 -0
  242. package/dist/grade/finding.js.map +1 -0
  243. package/dist/grade/grade-item.d.ts.map +1 -1
  244. package/dist/grade/grade-item.js +4 -11
  245. package/dist/grade/grade-item.js.map +1 -1
  246. package/dist/grade/render-variants.d.ts.map +1 -1
  247. package/dist/grade/render-variants.js +3 -0
  248. package/dist/grade/render-variants.js.map +1 -1
  249. package/dist/grade/render.d.ts.map +1 -1
  250. package/dist/grade/render.js +1 -0
  251. package/dist/grade/render.js.map +1 -1
  252. package/dist/grade/result.d.ts +3 -0
  253. package/dist/grade/result.d.ts.map +1 -1
  254. package/dist/grade/results-read.d.ts.map +1 -1
  255. package/dist/grade/results-read.js +13 -2
  256. package/dist/grade/results-read.js.map +1 -1
  257. package/dist/grade/summary.d.ts +3 -0
  258. package/dist/grade/summary.d.ts.map +1 -1
  259. package/dist/grade/summary.js +6 -0
  260. package/dist/grade/summary.js.map +1 -1
  261. package/dist/grade/text.d.ts +2 -0
  262. package/dist/grade/text.d.ts.map +1 -1
  263. package/dist/grade/text.js +2 -0
  264. package/dist/grade/text.js.map +1 -1
  265. package/dist/grade/variants-text.d.ts +3 -0
  266. package/dist/grade/variants-text.d.ts.map +1 -1
  267. package/dist/grade/variants-text.js +4 -0
  268. package/dist/grade/variants-text.js.map +1 -1
  269. package/dist/grade/variants.d.ts +3 -0
  270. package/dist/grade/variants.d.ts.map +1 -1
  271. package/dist/grade/variants.js +1 -0
  272. package/dist/grade/variants.js.map +1 -1
  273. package/dist/grade-api.d.ts +1 -0
  274. package/dist/grade-api.d.ts.map +1 -1
  275. package/dist/grade-api.js +2 -1
  276. package/dist/grade-api.js.map +1 -1
  277. package/dist/judge.d.ts +0 -1
  278. package/dist/judge.d.ts.map +1 -1
  279. package/dist/judge.js +0 -1
  280. package/dist/judge.js.map +1 -1
  281. package/dist/known-genres.js +2 -2
  282. package/dist/known-genres.js.map +1 -1
  283. package/dist/package-files.d.ts +6 -0
  284. package/dist/package-files.d.ts.map +1 -0
  285. package/dist/package-files.js +11 -0
  286. package/dist/package-files.js.map +1 -0
  287. package/dist/profile/load.d.ts.map +1 -1
  288. package/dist/profile/load.js +5 -6
  289. package/dist/profile/load.js.map +1 -1
  290. package/dist/rule-load.d.ts.map +1 -1
  291. package/dist/rule-load.js +5 -6
  292. package/dist/rule-load.js.map +1 -1
  293. package/dist/rule-offs.js +3 -3
  294. package/dist/rule-offs.js.map +1 -1
  295. package/dist/run.js +1 -1
  296. package/dist/run.js.map +1 -1
  297. package/dist/structure/change-rate.d.ts +33 -0
  298. package/dist/structure/change-rate.d.ts.map +1 -0
  299. package/dist/structure/change-rate.js +71 -0
  300. package/dist/structure/change-rate.js.map +1 -0
  301. package/dist/structure/date-range.d.ts +4 -0
  302. package/dist/structure/date-range.d.ts.map +1 -1
  303. package/dist/structure/date-range.js +23 -3
  304. package/dist/structure/date-range.js.map +1 -1
  305. package/dist/structure/issues.d.ts +17 -1
  306. package/dist/structure/issues.d.ts.map +1 -1
  307. package/dist/structure/issues.js +54 -5
  308. package/dist/structure/issues.js.map +1 -1
  309. package/dist/structure/list-numbering.d.ts +17 -0
  310. package/dist/structure/list-numbering.d.ts.map +1 -0
  311. package/dist/structure/list-numbering.js +27 -0
  312. package/dist/structure/list-numbering.js.map +1 -0
  313. package/dist/structure/party-role.d.ts +30 -0
  314. package/dist/structure/party-role.d.ts.map +1 -0
  315. package/dist/structure/party-role.js +58 -0
  316. package/dist/structure/party-role.js.map +1 -0
  317. package/dist/structure/percent-sum-prose.d.ts +7 -0
  318. package/dist/structure/percent-sum-prose.d.ts.map +1 -0
  319. package/dist/structure/percent-sum-prose.js +44 -0
  320. package/dist/structure/percent-sum-prose.js.map +1 -0
  321. package/dist/structure/prose-total.d.ts +28 -0
  322. package/dist/structure/prose-total.d.ts.map +1 -0
  323. package/dist/structure/prose-total.js +99 -0
  324. package/dist/structure/prose-total.js.map +1 -0
  325. package/dist/structure/reference-text.d.ts +5 -0
  326. package/dist/structure/reference-text.d.ts.map +1 -1
  327. package/dist/structure/reference-text.js +17 -4
  328. package/dist/structure/reference-text.js.map +1 -1
  329. package/dist/structure/term-prefix.d.ts +18 -0
  330. package/dist/structure/term-prefix.d.ts.map +1 -0
  331. package/dist/structure/term-prefix.js +40 -0
  332. package/dist/structure/term-prefix.js.map +1 -0
  333. package/dist/structure/total.d.ts +2 -0
  334. package/dist/structure/total.d.ts.map +1 -1
  335. package/dist/structure/total.js +2 -0
  336. package/dist/structure/total.js.map +1 -1
  337. package/dist/structure/version-mismatch.d.ts +23 -0
  338. package/dist/structure/version-mismatch.d.ts.map +1 -0
  339. package/dist/structure/version-mismatch.js +74 -0
  340. package/dist/structure/version-mismatch.js.map +1 -0
  341. package/dist/structure/weekday.d.ts +21 -2
  342. package/dist/structure/weekday.d.ts.map +1 -1
  343. package/dist/structure/weekday.js +70 -8
  344. package/dist/structure/weekday.js.map +1 -1
  345. package/dist/structure-shape/baseline-load.d.ts.map +1 -1
  346. package/dist/structure-shape/baseline-load.js +4 -5
  347. package/dist/structure-shape/baseline-load.js.map +1 -1
  348. package/dist/style-load.d.ts.map +1 -1
  349. package/dist/style-load.js +5 -6
  350. package/dist/style-load.js.map +1 -1
  351. package/package.json +24 -3
  352. package/rules/agreement-slip.yaml +2 -2
  353. package/rules/change-rate-mismatch.yaml +44 -0
  354. package/rules/cliche.yaml +28 -8
  355. package/rules/date-weekday-mismatch.yaml +4 -4
  356. package/rules/date-without-year.yaml +28 -3
  357. package/rules/defined-term-form.yaml +9 -6
  358. package/rules/demonstrative-opener-run.yaml +24 -7
  359. package/rules/max-sentence-length.yaml +1 -0
  360. package/rules/no-mixed-desumasu.yaml +2 -2
  361. package/rules/numbering-gap.yaml +4 -4
  362. package/rules/one-sentence-paragraph-run.yaml +1 -0
  363. package/rules/orthographic-variant.yaml +3 -3
  364. package/rules/party-role-name.yaml +94 -0
  365. package/rules/percent-sum-mismatch.yaml +4 -4
  366. package/rules/quote-without-source.yaml +61 -0
  367. package/rules/relative-date-mismatch.yaml +4 -4
  368. package/rules/total-mismatch.yaml +8 -8
  369. package/rules/undefined-acronym.yaml +1 -0
  370. package/rules/vague-deadline.yaml +95 -0
  371. package/rules/version-mismatch.yaml +77 -0
  372. package/rules/weasel-word.yaml +25 -7
  373. package/skills/chaff/SKILL.md +12 -2
  374. package/src/adapter-import.ts +3 -0
  375. package/src/adapter-load.ts +2 -1
  376. package/src/ai-score/human-shares.ts +207 -0
  377. package/src/ai-score/lint-line.ts +10 -0
  378. package/src/ai-score/of-document.ts +46 -0
  379. package/src/ai-score/render.ts +124 -0
  380. package/src/ai-score/score.ts +121 -0
  381. package/src/ai-score/signals.ts +39 -0
  382. package/src/ai-score/text.ts +103 -0
  383. package/src/ai-score/view.ts +21 -0
  384. package/src/backends/anthropic.ts +0 -2
  385. package/src/backends/default-model.ts +9 -0
  386. package/src/backends/openai.ts +0 -2
  387. package/src/browser/adapter-import.ts +19 -0
  388. package/src/browser/bounded-match.ts +9 -0
  389. package/src/browser/check-text.ts +106 -0
  390. package/src/browser/detectors.ts +40 -0
  391. package/src/browser/import-meta-glob.d.ts +5 -0
  392. package/src/browser/package-files.ts +13 -0
  393. package/src/browser/path.ts +73 -0
  394. package/src/browser/working-dir.ts +3 -0
  395. package/src/browser-files.ts +87 -0
  396. package/src/browser.ts +19 -0
  397. package/src/capitals-with-small.ts +23 -0
  398. package/src/cli-text.ts +2 -0
  399. package/src/cli.ts +4 -1
  400. package/src/commands/ai-score.ts +77 -0
  401. package/src/commands/document-commands.ts +2 -0
  402. package/src/config/by-path-problems.ts +17 -0
  403. package/src/config/load.ts +21 -8
  404. package/src/config/read.ts +5 -1
  405. package/src/config/warnings.ts +3 -1
  406. package/src/config/working-dir.ts +3 -0
  407. package/src/custom/bounded-match.ts +1 -16
  408. package/src/custom/pattern-timeout.ts +17 -0
  409. package/src/derived/relative-weekdays.ts +65 -0
  410. package/src/detect.ts +4 -5
  411. package/src/detectors/change-rate.ts +122 -0
  412. package/src/detectors/date-year.ts +51 -12
  413. package/src/detectors/defined-term-form.ts +28 -6
  414. package/src/detectors/derived-numbers.ts +3 -11
  415. package/src/detectors/document-date.ts +18 -0
  416. package/src/detectors/orthographic-variant.ts +67 -22
  417. package/src/detectors/party-role-name.ts +44 -0
  418. package/src/detectors/quote-without-source.ts +90 -0
  419. package/src/detectors/reference-text.ts +1 -1
  420. package/src/detectors/registry/change-rate.ts +4 -0
  421. package/src/detectors/registry/party-role-name.ts +4 -0
  422. package/src/detectors/registry/quote-without-source.ts +4 -0
  423. package/src/detectors/registry/vague-deadline.ts +4 -0
  424. package/src/detectors/registry/version-mismatch.ts +4 -0
  425. package/src/detectors/relative-dates.ts +3 -1
  426. package/src/detectors/relative-day-words.ts +126 -0
  427. package/src/detectors/run-in-label.ts +60 -0
  428. package/src/detectors/sentence-counts.ts +13 -4
  429. package/src/detectors/sentence-ending.ts +3 -2
  430. package/src/detectors/structure-tree.ts +104 -10
  431. package/src/detectors/unbalanced-bracket.ts +25 -10
  432. package/src/detectors/vague-deadline.ts +132 -0
  433. package/src/detectors/version-mismatch.ts +23 -0
  434. package/src/furigana.ts +20 -0
  435. package/src/genre-load.ts +5 -7
  436. package/src/grade/ai-score.ts +32 -0
  437. package/src/grade/finding.ts +16 -0
  438. package/src/grade/grade-item.ts +4 -13
  439. package/src/grade/render-variants.ts +5 -0
  440. package/src/grade/render.ts +1 -0
  441. package/src/grade/result.ts +3 -0
  442. package/src/grade/results-read.ts +17 -2
  443. package/src/grade/summary.ts +9 -0
  444. package/src/grade/text.ts +6 -0
  445. package/src/grade/variants-text.ts +7 -0
  446. package/src/grade/variants.ts +4 -0
  447. package/src/grade-api.ts +3 -1
  448. package/src/judge.ts +0 -2
  449. package/src/known-genres.ts +2 -2
  450. package/src/package-files.ts +15 -0
  451. package/src/profile/load.ts +5 -6
  452. package/src/rule-load.ts +5 -6
  453. package/src/rule-offs.ts +3 -3
  454. package/src/run.ts +1 -1
  455. package/src/structure/change-rate.ts +103 -0
  456. package/src/structure/date-range.ts +28 -3
  457. package/src/structure/issues.ts +61 -6
  458. package/src/structure/list-numbering.ts +34 -0
  459. package/src/structure/party-role.ts +94 -0
  460. package/src/structure/percent-sum-prose.ts +54 -0
  461. package/src/structure/prose-total.ts +135 -0
  462. package/src/structure/reference-text.ts +17 -4
  463. package/src/structure/term-prefix.ts +54 -0
  464. package/src/structure/total.ts +4 -0
  465. package/src/structure/version-mismatch.ts +103 -0
  466. package/src/structure/weekday.ts +83 -6
  467. package/src/structure-shape/baseline-load.ts +4 -5
  468. package/src/style-load.ts +5 -6
@@ -1 +1 @@
1
- {"version":3,"file":"baseline-load.d.ts","sourceRoot":"","sources":["../../src/structure-shape/baseline-load.ts"],"names":[],"mappings":"AAIA,OAAO,EAA0B,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAY/E,oFAAoF;AACpF,eAAO,MAAM,kBAAkB,EAAE,iBAAkC,CAAC"}
1
+ {"version":3,"file":"baseline-load.d.ts","sourceRoot":"","sources":["../../src/structure-shape/baseline-load.ts"],"names":[],"mappings":"AAGA,OAAO,EAA0B,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAY/E,oFAAoF;AACpF,eAAO,MAAM,kBAAkB,EAAE,iBAAkC,CAAC"}
@@ -1,12 +1,11 @@
1
- import { readFileSync } from "node:fs";
2
- import { dirname, join } from "node:path";
3
- import { fileURLToPath } from "node:url";
1
+ import { join } from "node:path";
4
2
  import { parse } from "yaml";
3
+ import { PACKAGE_DIR, readText } from "../package-files.js";
5
4
  import { parseStructureBaseline } from "./baseline.js";
6
- const BASELINE_FILE = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "structure-baseline.yaml");
5
+ const BASELINE_FILE = join(PACKAGE_DIR, "structure-baseline.yaml");
7
6
  const readBaseline = () => {
8
7
  try {
9
- return parseStructureBaseline(parse(readFileSync(BASELINE_FILE, "utf8")));
8
+ return parseStructureBaseline(parse(readText(BASELINE_FILE)));
10
9
  }
11
10
  catch (error) {
12
11
  throw new Error(`cannot read the structure baseline ${BASELINE_FILE}`, { cause: error });
@@ -1 +1 @@
1
- {"version":3,"file":"baseline-load.js","sourceRoot":"","sources":["../../src/structure-shape/baseline-load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,sBAAsB,EAA0B,MAAM,eAAe,CAAC;AAE/E,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,yBAAyB,CAAC,CAAC;AAE3G,MAAM,YAAY,GAAG,GAAsB,EAAE;IAC3C,IAAI,CAAC;QACH,OAAO,sBAAsB,CAAC,KAAK,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sCAAsC,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC,CAAC;AAEF,oFAAoF;AACpF,MAAM,CAAC,MAAM,kBAAkB,GAAsB,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"baseline-load.js","sourceRoot":"","sources":["../../src/structure-shape/baseline-load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAA0B,MAAM,eAAe,CAAC;AAE/E,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,yBAAyB,CAAC,CAAC;AAEnE,MAAM,YAAY,GAAG,GAAsB,EAAE;IAC3C,IAAI,CAAC;QACH,OAAO,sBAAsB,CAAC,KAAK,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,sCAAsC,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC,CAAC;AAEF,oFAAoF;AACpF,MAAM,CAAC,MAAM,kBAAkB,GAAsB,YAAY,EAAE,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"style-load.d.ts","sourceRoot":"","sources":["../src/style-load.ts"],"names":[],"mappings":"AAIA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAcpE,yEAAyE;AACzE,eAAO,MAAM,UAAU,GAAI,MAAK,MAAmB,KAAG,SAAS,eAAe,EAQ7E,CAAC"}
1
+ {"version":3,"file":"style-load.d.ts","sourceRoot":"","sources":["../src/style-load.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAcpE,yEAAyE;AACzE,eAAO,MAAM,UAAU,GAAI,MAAK,MAAmB,KAAG,SAAS,eAAe,EAQ7E,CAAC"}
@@ -1,13 +1,12 @@
1
- import { readFileSync, readdirSync } from "node:fs";
2
- import { dirname, join } from "node:path";
3
- import { fileURLToPath } from "node:url";
1
+ import { join } from "node:path";
4
2
  import { parse } from "yaml";
3
+ import { PACKAGE_DIR, readDir, readText } from "./package-files.js";
5
4
  import { parseStyle } from "./style-parse.js";
6
- const STYLES_DIR = join(dirname(fileURLToPath(import.meta.url)), "..", "styles");
5
+ const STYLES_DIR = join(PACKAGE_DIR, "styles");
7
6
  const loaded = { value: undefined };
8
7
  const readStyle = (dir, file) => {
9
8
  try {
10
- return parseStyle(parse(readFileSync(join(dir, file), "utf8")), file);
9
+ return parseStyle(parse(readText(join(dir, file))), file);
11
10
  }
12
11
  catch (error) {
13
12
  throw new Error(`cannot read ${join(dir, file)}: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
@@ -17,7 +16,7 @@ const readStyle = (dir, file) => {
17
16
  export const loadStyles = (dir = STYLES_DIR) => {
18
17
  if (dir === STYLES_DIR && loaded.value !== undefined)
19
18
  return loaded.value;
20
- const styles = readdirSync(dir)
19
+ const styles = readDir(dir)
21
20
  .filter((file) => file.endsWith(".yaml"))
22
21
  .toSorted((left, right) => left.localeCompare(right, "en"))
23
22
  .map((file) => readStyle(dir, file));
@@ -1 +1 @@
1
- {"version":3,"file":"style-load.js","sourceRoot":"","sources":["../src/style-load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAwB,MAAM,kBAAkB,CAAC;AAEpE,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;AAEjF,MAAM,MAAM,GAAsD,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAEvF,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,IAAY,EAAmB,EAAE;IAC/D,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACjI,CAAC;AACH,CAAC,CAAC;AAEF,yEAAyE;AACzE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAc,UAAU,EAA8B,EAAE;IACjF,IAAI,GAAG,KAAK,UAAU,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IAC1E,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC;SAC5B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SACxC,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;SAC1D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,UAAU;QAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC;IAC9C,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
1
+ {"version":3,"file":"style-load.js","sourceRoot":"","sources":["../src/style-load.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,UAAU,EAAwB,MAAM,kBAAkB,CAAC;AAEpE,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;AAE/C,MAAM,MAAM,GAAsD,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAEvF,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,IAAY,EAAmB,EAAE;IAC/D,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACjI,CAAC;AACH,CAAC,CAAC;AAEF,yEAAyE;AACzE,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAAc,UAAU,EAA8B,EAAE;IACjF,IAAI,GAAG,KAAK,UAAU,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC,KAAK,CAAC;IAC1E,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;SACxB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SACxC,QAAQ,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;SAC1D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,UAAU;QAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC;IAC9C,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chaffjs",
3
- "version": "0.25.0",
3
+ "version": "0.27.0",
4
4
  "description": "Prose validation harness. Finds what is hard to read, and never rewrites it for you.",
5
5
  "keywords": [
6
6
  "chaff",
@@ -41,8 +41,29 @@
41
41
  "./grade": {
42
42
  "types": "./src/grade-api.ts",
43
43
  "import": "./dist/grade-api.js"
44
+ },
45
+ "./browser": {
46
+ "types": "./src/browser.ts",
47
+ "import": "./dist/browser.js"
48
+ },
49
+ "./browser-files": {
50
+ "types": "./src/browser-files.ts",
51
+ "import": "./dist/browser-files.js"
44
52
  }
45
53
  },
54
+ "browser": {
55
+ "./src/package-files.ts": "./src/browser/package-files.ts",
56
+ "./src/adapter-import.ts": "./src/browser/adapter-import.ts",
57
+ "./src/detectors/index.ts": "./src/browser/detectors.ts",
58
+ "./src/custom/bounded-match.ts": "./src/browser/bounded-match.ts",
59
+ "./src/config/working-dir.ts": "./src/browser/working-dir.ts",
60
+ "./dist/package-files.js": "./dist/browser/package-files.js",
61
+ "./dist/adapter-import.js": "./dist/browser/adapter-import.js",
62
+ "./dist/detectors/index.js": "./dist/browser/detectors.js",
63
+ "./dist/custom/bounded-match.js": "./dist/browser/bounded-match.js",
64
+ "./dist/config/working-dir.js": "./dist/browser/working-dir.js",
65
+ "node:path": "./dist/browser/path.js"
66
+ },
46
67
  "files": [
47
68
  "LICENSE",
48
69
  "README.md",
@@ -66,8 +87,8 @@
66
87
  },
67
88
  "dependencies": {
68
89
  "@anthropic-ai/sdk": "^0.125.0",
69
- "@chaffjs/lang-en": "0.22.0",
70
- "@chaffjs/lang-ja": "0.24.0",
90
+ "@chaffjs/lang-en": "0.24.0",
91
+ "@chaffjs/lang-ja": "0.26.0",
71
92
  "mdast-util-from-markdown": "^2.0.3",
72
93
  "mdast-util-frontmatter": "^2.0.1",
73
94
  "mdast-util-gfm-table": "^2.0.0",
@@ -5,7 +5,7 @@ how_to_find: agreement-slip
5
5
  requires: [pos]
6
6
  languages: [en]
7
7
  extra_word_lists: [singular-determiner, plural-determiner, invariant-noun, count-adjective, dependent-possessive, finite-auxiliary, misnumbered-phrase]
8
- severity: warning
8
+ severity: info
9
9
 
10
10
  name:
11
11
  ja: 語の形が合っていない
@@ -31,7 +31,7 @@ how_to_fix:
31
31
  ja: 限定詞か名詞のどちらかに揃えてください(a significant change / significant changes)。所有の語なら、主語の語に直してください(Your can → You can、their is → there is)。
32
32
  en: Make the determiner and the noun agree ("a significant change" or "significant changes"). For a possessive, write the subject you meant ("Your can" becomes "You can", "their is" becomes "there is").
33
33
 
34
- levels: { strict: error, normal: warning, relaxed: info }
34
+ levels: { strict: warning, normal: info, relaxed: info }
35
35
 
36
36
  use_for: [blog, business, technical, legal, docs, academic, literature, speech]
37
37
  off_for:
@@ -0,0 +1,44 @@
1
+ id: change-rate-mismatch
2
+ layer: L3
3
+ status: stable
4
+ how_to_find: change-rate
5
+ requires: [structure]
6
+ severity: warning
7
+
8
+ name:
9
+ ja: 増減率が二つの値と合わない
10
+ en: A rate of change the two values do not give
11
+
12
+ why:
13
+ ja: 「前年同月の1,000社から20%増えて1,200社」のように、もとの値・今の値・増減率を一つの文に書くと、読み手は率を確かめずに信じます。数字を一つだけ更新したとき、率だけを去年の文書から写したときに食い違います。一つの文に、もとの値(「から」「に比べて」の付いた値)、同じ単位の今の値、向きの語(増加、減少)の付いた百分率が一つずつあるとき、二つの値から率を計算して比べます。値は書いた桁までの丸めを認めます(12億円は11.5億円から12.5億円のどれか)。
14
+ en: When one sentence gives the earlier value, the current one and the rate of change ("1,200 companies, up 20% from 1,000"), readers trust the rate without checking it. It goes wrong when one figure is updated and the others are not, or when the rate is copied from last year's text. When a sentence has one earlier value (marked by "from" or "compared with"), one current value in the same unit, and one percentage with a word of direction (up, decline), chaff computes the rate from the two values and compares. Each value may be rounded to its last written digit ($12 million is anything from $11.5 million to $12.5 million).
15
+
16
+ message:
17
+ ja: 「{rate}%」と書いていますが、二つの値からは {computed}% です
18
+ en: '"{rate}%" is written, but the two values give {computed}%'
19
+
20
+ how_to_fix:
21
+ ja: 二つの値と率のどれが正しいかを確かめて、ほかを直してください。
22
+ en: Check which of the two values and the rate is right, and correct the others.
23
+
24
+ levels: { strict: error, normal: warning, relaxed: info }
25
+
26
+ use_for: [business, technical, blog, legal, docs, academic, literature, speech]
27
+ off_for:
28
+ literature: "Length, rhythm, repetition and register are the author's choices in literature, and dialogue mixes styles. Only what one work can hold itself to runs: consistent spacing and commas, and numbering without gaps."
29
+
30
+ group: facts
31
+ summary:
32
+ ja: 「1,000社から20%増えて1,200社」のように、一つの文の二つの値と増減率が合わない所
33
+ en: A rate of change that the two values in the same sentence do not give
34
+ example:
35
+ ja:
36
+ before: 利用企業は1,300社となり、前年の1,000社から20%増えました。
37
+ after: 利用企業は1,300社となり、前年の1,000社から30%増えました。
38
+ en:
39
+ before: 1,300 companies used the app, up 20% from 1,000 companies a year earlier.
40
+ after: 1,300 companies used the app, up 30% from 1,000 companies a year earlier.
41
+
42
+ not_flagged:
43
+ ja: 率が二つある文、もとの値が「から」「に比べて」で名指されていない文、同じ単位の今の値が一つでない文、向きの語が率のそばに無い文は比べません。「前年比20%増」のように値が一つしか無いもの、ポイントの差、倍は見ません。丸めで届く範囲の率は言いません。
44
+ en: 'A sentence with two rates, with no value marked as the earlier one, with no single current value in the same unit, or with no word of direction beside the rate is not compared. A change given with one value ("up 20% year on year"), percentage points and "times" are not read. A rate the rounding of the values can reach is not reported.'
package/rules/cliche.yaml CHANGED
@@ -4,7 +4,7 @@ status: stable
4
4
  how_to_find: phrase-match
5
5
  word_list: cliche
6
6
  requires: [pos]
7
- languages: [en]
7
+ languages: [ja, en]
8
8
  severity: info
9
9
 
10
10
  name:
@@ -12,15 +12,15 @@ name:
12
12
  en: Cliché
13
13
 
14
14
  why:
15
- ja: 英語の「at the end of the day」「low-hanging fruit」「move the needle」のような決まり文句は、使われすぎて中身が抜けた比喩です。読み手は見慣れた形を読み飛ばし、この文書で何が言いたいのかが残りません。言い回しの一覧は言語ごとの語彙表にあり、それぞれに何を書けばよいかが付いています。
16
- en: '"At the end of the day", "low-hanging fruit" and "move the needle" are figures of speech worn down to filler. The reader skims the familiar shape and learns nothing about this document. The phrases are listed in the lexicon, each with what to write instead.'
15
+ ja: 「今さら聞けない」「徹底解説」「〜の極意」や、英語の「at the end of the day」「low-hanging fruit」のような決まり文句は、使われすぎて中身が抜けた言い回しです。読み手は見慣れた形を読み飛ばし、この文書で何が言いたいのかが残りません。言い回しの一覧は言語ごとの語彙表にあり、それぞれに何を書けばよいかが付いています。
16
+ en: '"At the end of the day", "low-hanging fruit" and "move the needle" (今さら聞けない, 徹底解説) are figures of speech worn down to filler. The reader skims the familiar shape and learns nothing about this document. The phrases are listed in the lexicon, each with what to write instead.'
17
17
 
18
18
  message:
19
19
  ja: 「{matched}」は使い古された決まり文句です
20
20
  en: '"{matched}" is a cliché'
21
21
 
22
22
  how_to_fix:
23
- ja: 決まり文句が指していた中身を、そのまま書いてください(low-hanging fruit → 簡単に済む作業の名前)。
23
+ ja: 決まり文句が指していた中身を、そのまま書いてください(徹底解説 → 何を説明するのか、low-hanging fruit → 簡単に済む作業の名前)。
24
24
  en: Say what the phrase stood for ("low-hanging fruit" → name the easy tasks).
25
25
 
26
26
  levels: { strict: 1, normal: 1, relaxed: 2 }
@@ -32,9 +32,14 @@ off_for:
32
32
 
33
33
  group: wording
34
34
  summary:
35
- ja: 英語で、「at the end of the day」「low-hanging fruit」のような使い古された決まり文句
36
- en: A worn phrase such as "at the end of the day" or "low-hanging fruit"
35
+ ja: 「今さら聞けない」「徹底解説」や「at the end of the day」のような、使い古された決まり文句
36
+ en: A worn phrase such as "at the end of the day" or "low-hanging fruit" (今さら聞けない, 徹底解説)
37
37
  example:
38
+ ja:
39
+ before: |
40
+ この記事では、今さら聞けない Git の基本を徹底解説します。
41
+ after: |
42
+ この記事では、Git を初めて使う人向けに、コミットとブランチの使い方を説明します。
38
43
  en:
39
44
  before: |
40
45
  At the end of the day, the new cache is faster.
@@ -42,14 +47,29 @@ example:
42
47
  The new cache cuts load time from 2 seconds to 0.5.
43
48
 
44
49
  not_flagged:
45
- ja: 一覧にある言い回しだけを見ます。ほかの規則が見る言い回し(ai-tell の「game-changer」、empty-intensifier の「needless to say」)は入れていません。英語の文書だけで動き、文学と講演の書き起こしは対象にしません。
46
- en: Only the phrases on chaff's list are checked. Phrases another rule reads ("game-changer" in ai-tell, "needless to say" in empty-intensifier) are not on it. English documents only; literature and speech transcripts are not checked.
50
+ ja: 一覧にある言い回しだけを見ます。見出しの中は見ず、本文の文だけを見ます。ほかの規則が見る言い回し(closing-cliche の「いかがでしたか」、ai-tell の「深く掘り下げる」「game-changer」、empty-intensifier の「needless to say」)は入れていません。「結論から言うと」は人の記事にも同じくらいあるので、「〜まとめ」「〜な件」は普通の文(まとめました、重要な件)と分けられないので見ません。文学と講演の書き起こしは対象にしません。
51
+ en: Only the phrases on chaff's list are checked, in body sentences; headings are not read. Phrases another rule reads (いかがでしたか in closing-cliche, "game-changer" in ai-tell, "needless to say" in empty-intensifier) are not on it. In Japanese, 結論から言うと is left out because human articles use it as often, and 〜まとめ and 〜な件 because ordinary sentences share them (まとめました, 重要な件). Literature and speech transcripts are not checked.
47
52
  level_meaning:
48
53
  ja: 当てはまる言い回しが {limit} 箇所あれば指摘
49
54
  en: reported once there are {limit}
50
55
  sources: [write-good, proselint]
51
56
  rewrite:
52
57
  depth: light
58
+ ja:
59
+ direction: 決まり文句を、この文書でそれが指している中身に置き換えてください。語彙表の言い回しごとの書き方に従います。本文が中身を言っていなければ、作らずに書き手に聞いてください。
60
+ pairs:
61
+ - before: この記事では、Docker の設定を徹底解説します。
62
+ after: この記事では、Docker のネットワーク設定の手順を説明します。
63
+ - before: 今さら聞けない SQL の書き方を紹介します。
64
+ after: SQL を初めて書く人向けに、SELECT 文の書き方を紹介します。
65
+ - before: 速く書くための極意は、毎日書くことです。
66
+ after: 速く書くには、毎日書いてください。
67
+ keep:
68
+ - 文が言っている主張
69
+ - 文の中の数・名前・日付
70
+ avoid:
71
+ - 決まり文句を別の決まり文句に替える
72
+ - 本文に無い数や日付を作る
53
73
  en:
54
74
  direction: Replace the cliché with what it stood for in this document, following the lexicon's note for the phrase. If the text does not say what that is, ask the writer rather than invent it.
55
75
  pairs:
@@ -10,8 +10,8 @@ name:
10
10
  en: Date and weekday disagree
11
11
 
12
12
  why:
13
- ja: 「2026年10月1日(金)」のように、日付と曜日が食い違っていると、読み手はどちらが正しいのか確かめに行くことになります。日程を書き写すときや、年をまたいで予定を使い回すときに起きます。年まで書いた日付の曜日だけを、暦と比べます。
14
- en: When a date and its weekday disagree ("Friday, 1 October 2026"), the reader has to find out which one is right. It happens when a schedule is copied, or reused for another year. Only dates written with their year are checked against the calendar.
13
+ ja: 「2026年10月1日(金)」のように、日付と曜日が食い違っていると、読み手はどちらが正しいのか確かめに行くことになります。日程を書き写すときや、年をまたいで予定を使い回すときに起きます。年を書いていない日付(メールの「10月9日(金)」)は、年を書いたすぐ前の日付(前に無ければ文書で最初のもの)から5か月以内に収まる年の日付として、暦と比べます。
14
+ en: When a date and its weekday disagree ("Friday, 1 October 2026"), the reader has to find out which one is right. It happens when a schedule is copied, or reused for another year. A date written without its year ("Friday, October 9" in an email) is checked as the date in the year that puts it within five months of the dated date just before it (or, with none before, the first one in the document).
15
15
 
16
16
  message:
17
17
  ja: 「{date}」は{actual}です({written}と書いてあります)
@@ -40,5 +40,5 @@ example:
40
40
  after: The next meeting is on Thursday, 1 October 2026.
41
41
 
42
42
  not_flagged:
43
- ja: 年を書いていない日付は、どの年か決まらないので暦と照らしません。
44
- en: Dates without a year are not checked, since the year is unknown.
43
+ ja: 年を書いていない日付は、文書に年を書いた日付が無いときと、年を書いた日付から5か月より離れていてどちらの年とも読めるときは、暦と照らしません。
44
+ en: A date without its year is not checked when the document gives no date with a year, or when it is more than five months from the dated date and could be in either year.
@@ -3,9 +3,8 @@ layer: L1
3
3
  status: stable
4
4
  how_to_find: date-without-year
5
5
  requires: [dates]
6
- # The dates come from the language package's date reader. English does not read a date written without its year yet,
7
- # so the rule checks Japanese only until it does.
8
- languages: [ja]
6
+ # The dates come from the language package's date reader.
7
+ languages: [ja, en]
9
8
  severity: info
10
9
 
11
10
  name:
@@ -50,6 +49,19 @@ example:
50
49
  - 2026年10月14日(水):説明会
51
50
  - 2026年10月21日(水):申込の締め切り
52
51
  - 2026年10月28日(水):結果の連絡
52
+ en:
53
+ before: |
54
+ # Schedule
55
+
56
+ - October 14, 2026: briefing
57
+ - October 21, 2026: applications close
58
+ - October 28: results sent
59
+ after: |
60
+ # Schedule
61
+
62
+ - October 14, 2026: briefing
63
+ - October 21, 2026: applications close
64
+ - October 28, 2026: results sent
53
65
 
54
66
  not_flagged:
55
67
  ja: 年を一度だけ書いて、あとの日付は月と日だけで書く文書(年の無い日付のほうが多い文書)は、書き方の選び方として指しません。ただしその場合も、年をまたぐ日付は指します。月だけ・年だけの日付は見ません。
@@ -69,3 +81,16 @@ rewrite:
69
81
  avoid:
70
82
  - 曜日と合わない年を書く
71
83
  - 本文から決まらない年を推して書く
84
+ en:
85
+ direction: Add the year to the date that lacks one. Take it from the document's other dates and from the weekday, if one is written. Where the text does not settle it, leave "[year]" for the writer rather than inventing one.
86
+ pairs:
87
+ - before: "October 28: results sent"
88
+ after: "October 28, 2026: results sent"
89
+ - before: The next meeting is on January 15.
90
+ after: The next meeting is on January 15, 2027.
91
+ keep:
92
+ - the month, the day and the weekday
93
+ - how the other dates are written
94
+ avoid:
95
+ - a year that does not match the weekday
96
+ - guessing a year the text does not give
@@ -10,8 +10,8 @@ name:
10
10
  en: A defined term used in another form
11
11
 
12
12
  why:
13
- ja: 契約では、定義した語は定義した形のまま使うのが決まりです。「本サービス」と定義したあとで「「本サービス」」とかぎ括弧を付け直すと、新しく定義し直したのか、同じものなのかが読み手に分かりません。英語では "Services" と定義した語を "services" と小文字で書くと、定義した意味なのか、ふつうの意味なのかが分かれ、争いのもとになります。定義の後ろで、かぎ括弧や引用符に入れ直した語と、大文字で定義した語を小文字で書いた所(大文字の使用より少ないとき)を指します。
14
- en: 'A contract uses each defined term exactly as defined. Quoting a term again after its definition ("the "Services"") leaves the reader asking whether it is being defined anew. Writing "services" where "Services" is defined splits the defined sense from the ordinary one, which is where disputes start. chaff points at a term set in quotes again after its definition, and at a capitalised term written in lower case (when the capitalised uses are more).'
13
+ ja: 契約では、定義した語は定義した形のまま使うのが決まりです。「本サービス」と定義したあとで「「本サービス」」とかぎ括弧を付け直すと、新しく定義し直したのか、同じものなのかが読み手に分かりません。英語では "Services" と定義した語を "services" と小文字で書くと、定義した意味なのか、ふつうの意味なのかが分かれ、争いのもとになります。「本業務」と定義して「本件業務」と書くと、別の業務を指すのかと読めます。定義の後ろで、かぎ括弧や引用符に入れ直した語、大文字で定義した語を小文字で書いた所(大文字の使用より少ないとき)、頭の「本」と「本件」を入れ替えた語(その形も定義した語なら除きます)を指します。
14
+ en: 'A contract uses each defined term exactly as defined. Quoting a term again after its definition ("the "Services"") leaves the reader asking whether it is being defined anew. Writing "services" where "Services" is defined splits the defined sense from the ordinary one, which is where disputes start. In Japanese, 本件業務 written where 本業務 is defined reads as another task. chaff points at a term set in quotes again after its definition, at a capitalised term written in lower case (when the capitalised uses are more), and at a Japanese term written with its other prefix (本 for 本件 or the other way round), unless that form is defined too.'
15
15
 
16
16
  message:
17
17
  ja: 定義した「{term}」と違う形で使っています
@@ -24,6 +24,9 @@ messages:
24
24
  case:
25
25
  ja: 「{term}」は {line} 行目で大文字で定義した語ですが、ここは小文字です
26
26
  en: '"{term}" is defined with a capital on line {line}, but written in lower case here'
27
+ prefix:
28
+ ja: 「{term}」は {line} 行目で定義した語ですが、ここは「{written}」と書いています
29
+ en: '"{term}" is defined on line {line}, but written "{written}" here'
27
30
 
28
31
  how_to_fix:
29
32
  ja: 定義した語はかぎ括弧を付けずに使い、英語では定義のとおり大文字で始めてください。ふつうの意味で使うなら、別の言葉に替えます。
@@ -41,8 +44,8 @@ off_for:
41
44
 
42
45
  group: consistency
43
46
  summary:
44
- ja: 契約や規約で、定義した語を定義のあとでかぎ括弧に入れ直したり、大文字で定義した語を小文字で書いたりしている所
45
- en: A defined term quoted again after its definition, or a capitalised defined term written in lower case
47
+ ja: 契約や規約で、定義した語を定義のあとでかぎ括弧に入れ直したり、大文字で定義した語を小文字で書いたり、「本業務」を「本件業務」と書いたりしている所
48
+ en: A defined term quoted again after its definition, a capitalised defined term written in lower case, or a Japanese term with its other prefix (本件業務 for 本業務)
46
49
  example:
47
50
  ja:
48
51
  config: { genre: legal/contract }
@@ -78,8 +81,8 @@ example:
78
81
  3. You must not resell the Services.
79
82
 
80
83
  not_flagged:
81
- ja: 定義そのもの(以下「本サービス」という、「本サービス」とは)、定義より前の使用(use-before-definition が見ます)、文の頭の大文字、小文字の使用が {limit} 個を超えるか大文字の使用より多い語(ふつうの意味で使っているとみなす)は指しません。定義の文の中の使用(「顧客」とは、表紙に「顧客」と書いた者をいう)も見ません。法令・規程のジャンルは、定義を指すために語をかぎ括弧に入れるので見ません。
82
- en: 'The definitions themselves ("Services" means, (the "Services")), uses before the definition (use-before-definition reads those), capitals at the start of a sentence, and terms written in lower case more than {limit} times or more often than capitalised (taken as the ordinary word used on purpose) are not reported, nor is a use inside the defining sentence ("Customer" means the party named "Customer"). Statutes and regulations quote a term to point at its definition, so that genre does not run this rule.'
84
+ ja: 定義そのもの(以下「本サービス」という、「本サービス」とは)、定義より前の使用(use-before-definition が見ます)、文の頭の大文字、小文字の使用が {limit} 個を超えるか大文字の使用より多い語(ふつうの意味で使っているとみなす)は指しません。定義の文の中の使用(「顧客」とは、表紙に「顧客」と書いた者をいう)も見ません。法令・規程のジャンルは、定義を指すために語をかぎ括弧に入れるので見ません。「本」と「本件」を入れ替えた形は、その形も定義した語であるとき、長い語の一部(見本物品)のときは見ません。
85
+ en: 'The definitions themselves ("Services" means, (the "Services")), uses before the definition (use-before-definition reads those), capitals at the start of a sentence, and terms written in lower case more than {limit} times or more often than capitalised (taken as the ordinary word used on purpose) are not reported, nor is a use inside the defining sentence ("Customer" means the party named "Customer"). Statutes and regulations quote a term to point at its definition, so that genre does not run this rule. A term with its other prefix (本件業務 for 本業務) is not reported when that form is defined too, or inside a longer word (見本物品).'
83
86
  level_meaning:
84
87
  ja: 小文字の使用が {limit} 個以下で、大文字の使用より少ないとき指摘
85
88
  en: lower-case uses reported when they are {limit} or fewer and fewer than the capitalised ones
@@ -4,7 +4,7 @@ status: stable
4
4
  how_to_find: opener-run
5
5
  word_list: demonstrative-opener
6
6
  requires: [pos]
7
- languages: [ja]
7
+ languages: [ja, en]
8
8
  severity: info
9
9
 
10
10
  name:
@@ -13,15 +13,15 @@ name:
13
13
 
14
14
  why:
15
15
  ja: 「これは」「その結果」「この方法は」のように指示語で始まる文が続くと、読み手は一文ごとに「どれのことか」を前に戻って確かめることになります。指すものが一つ前の文なのか、もっと前なのかも曖昧になります。数えるのは同じ段落の中の連続だけです。
16
- en: In Japanese, sentence after sentence opening with a demonstrative (これは, その結果) sends the reader back each time to find what it points at, and blurs whether it means the last sentence or one before. Only runs within one paragraph are counted.
16
+ en: Sentence after sentence opening with a word that points back (This, That, It; これは, その結果) sends the reader back each time to find what it points at, and blurs whether it means the last sentence or one before. Only runs within one paragraph are counted.
17
17
 
18
18
  message:
19
19
  ja: 「{word}」など、指示語で始まる文が {count} 文続いています({limit} 文まで)
20
- en: '{count} sentences in a row open with a demonstrative such as "{word}" (limit {limit})'
20
+ en: '{count} sentences in a row open with a word that points back, such as "{word}" (limit {limit})'
21
21
 
22
22
  how_to_fix:
23
23
  ja: 指示語のどれかを、指している名詞に置き換えてください(その結果 → 調査の結果)。
24
- en: Replace one of the demonstratives with the noun it points at (その結果 → 調査の結果).
24
+ en: Replace one of the demonstratives with the noun it points at (This → The new procedure; その結果 → 調査の結果).
25
25
 
26
26
  levels: { strict: 1, normal: 2, relaxed: 3 }
27
27
 
@@ -30,17 +30,22 @@ use_for: [business, technical, blog, legal, docs, academic, literature, speech]
30
30
  group: readability
31
31
  summary:
32
32
  ja: 「これは」「その」「この」のような指示語で始まる文が、同じ段落の中で続く所
33
- en: Japanese sentences in a row, within one paragraph, that open with a demonstrative (これ, その)
33
+ en: Sentences in a row, within one paragraph, that open with a word pointing back (This, That, It; これ, その)
34
34
  example:
35
35
  ja:
36
36
  before: |
37
37
  新しい手順を導入しました。これは作業を減らすためです。その結果、残業が減りました。この効果は来月も続く見込みです。
38
38
  after: |
39
39
  新しい手順を導入しました。作業を減らすためです。その結果、残業が減りました。残業の減少は来月も続く見込みです。
40
+ en:
41
+ before: |
42
+ We introduced a new procedure. This was meant to cut the work. It reduced overtime. That effect should continue next month.
43
+ after: |
44
+ We introduced a new procedure. This was meant to cut the work. The procedure reduced overtime, and the reduction should continue next month.
40
45
 
41
46
  not_flagged:
42
- ja: 段落が変われば数え直します。「それぞれ」のように一語になったものと、接続詞の「そして」は数えません。
43
- en: The count restarts at each paragraph. Words such as それぞれ and the conjunction そして are not counted.
47
+ ja: 段落が変われば数え直します。「それぞれ」のように一語になったものと、接続詞の「そして」は数えません。英語では、「This Agreement」「This section」のように文書そのものを指す書き出しと、「It is worth」「It seems」のように後ろを指す It は数えません。
48
+ en: The count restarts at each paragraph. Words such as それぞれ and the conjunction そして are not counted. In English, an opening that names the document itself ("This Agreement", "This section") and an "it" that stands for what follows ("It is worth", "It seems") are not counted.
44
49
  level_meaning:
45
50
  ja: 指示語で始まる文 {limit} 文の連続まで
46
51
  en: up to {limit} such sentences in a row
@@ -58,3 +63,15 @@ rewrite:
58
63
  avoid:
59
64
  - 指しているものを取り違える
60
65
  - 指示語を別の指示語(同様に、前述の)に替えるだけ
66
+ en:
67
+ direction: Of the demonstratives in the run, replace the ones whose referent is furthest away with the noun they point at. One that points at the sentence just before may stay.
68
+ pairs:
69
+ - before: We introduced a new procedure. This was meant to cut the work. It reduced overtime. That effect should continue next month.
70
+ after: We introduced a new procedure. This was meant to cut the work. The procedure reduced overtime, and the reduction should continue next month.
71
+ - before: The audit found three gaps. These came from an old manual. It is two years old. This will be fixed next month.
72
+ after: The audit found three gaps. They came from a manual that is two years old. We will revise the manual next month.
73
+ keep:
74
+ - what each word points at, and the order of the sentences
75
+ avoid:
76
+ - mistaking what a word points at
77
+ - swapping one pointer for another (the above, the former, said)
@@ -79,6 +79,7 @@ use_for: [blog, business, technical, legal, docs, academic, literature, speech]
79
79
  off_for:
80
80
  literature: "Length, rhythm, repetition and register are the author's choices in literature, and dialogue mixes styles. Only what one work can hold itself to runs: consistent spacing and commas, and numbering without gaps."
81
81
  speech/transcript: "A transcript records what was said: its sentences, repeats and register are the speaker's, not the writer's to fix."
82
+ academic: measured by yarn rules:measure
82
83
  legal: measured by yarn rules:measure
83
84
  sources: [shibasaki-tamaoka-2010, yasashii-nihongo-2020, koyobun-2022, gov-uk-clear-language]
84
85
 
@@ -51,8 +51,8 @@ example:
51
51
  新しい料金は来月から始まります。請求書の形式も変わります。支払いの期限は月末です。古い料金は三月で終わります。
52
52
 
53
53
  not_flagged:
54
- ja: どちらの調子が正しいかは決めません。多いほうに揃っていない、少ないほうの文だけを指します。本文と箇条書きは別々に数えます。箇条書きの中の少ないほうが文書全体では多いほうなら、その文は指しません。
55
- en: Neither register is called right; only the sentences in the minority are pointed at. The body and each list are counted apart, and a sentence in a list's minority is left alone when its register is the document's majority.
54
+ ja: どちらの調子が正しいかは決めません。多いほうに揃っていない、少ないほうの文だけを指します。本文と箇条書きは別々に数えます。箇条書きの中の少ないほうが文書全体では多いほうなら、その文は指しません。項目や段落の頭の太字の札(「- **速く書ける。** 説明です。」の「速く書ける。」)は見出しと同じく文に数えません。
55
+ en: Neither register is called right; only the sentences in the minority are pointed at. The body and each list are counted apart, and a sentence in a list's minority is left alone when its register is the document's majority. A bold label that opens an item or a paragraph and is followed by more text on its line is a heading, not a sentence.
56
56
  level_meaning:
57
57
  ja: 少ないほうの調子の文が {limit} 文以下のとき、それを指摘
58
58
  en: reported when the minority register has {limit} sentences or fewer
@@ -10,8 +10,8 @@ name:
10
10
  en: Skipped or repeated number
11
11
 
12
12
  why:
13
- ja: 第3条の次が第5条、(a) の次が (c)、同じ第2項が二つ。番号が飛ぶか重なると、読み手は何かが消えたのか、参照がどちらを指すのかを判断できません。同じ親の中で並ぶ番号だけを比べます。枝番号(第3条の2)は並びの外として扱います。
14
- en: Article 5 right after Article 3, (c) right after (a), two paragraphs numbered 2. A reader cannot tell whether something was removed, or which one a reference means. Only numbers side by side under the same parent are compared.
13
+ ja: 第3条の次が第5条、(a) の次が (c)、同じ第2項が二つ。番号が飛ぶか重なると、読み手は何かが消えたのか、参照がどちらを指すのかを判断できません。同じ親の中で並ぶ番号だけを比べます。枝番号(第3条の2)は並びの外として扱います。Markdown の番号付きの箇条書き(手順の「1.」「2.」「4.」)も、書いた番号を比べます。表示は最初の番号から数え直しますが、原文と「手順4を参照」は書いた番号を見ます。
14
+ en: Article 5 right after Article 3, (c) right after (a), two paragraphs numbered 2. A reader cannot tell whether something was removed, or which one a reference means. Only numbers side by side under the same parent are compared. The numbers written on a Markdown ordered list (steps "1.", "2.", "4.") are compared too. The page renders them counted from the first, but the source and a "see step 4" use the numbers as written.
15
15
 
16
16
  message:
17
17
  ja: 「{previous}」の次が「{label}」です({expected} 番目のはず)
@@ -74,5 +74,5 @@ example:
74
74
  Working hours are from nine to six.
75
75
 
76
76
  not_flagged:
77
- ja: 同じ親の下で隣り合う番号だけを比べます。別の章の番号どうしは比べません。
78
- en: Only numbers side by side under the same parent are compared.
77
+ ja: 同じ親の下で隣り合う番号だけを比べます。別の章の番号どうしは比べません。どの項目にも同じ番号(「1.」)を書いた箇条書きと、引用の中の箇条書きは見ません。
78
+ en: Only numbers side by side under the same parent are compared. A list that writes the same number on every item ("1." on each) and a list inside a quotation are not checked.
@@ -26,6 +26,7 @@ use_for: [business, technical, blog, legal, docs, academic, literature, speech]
26
26
  off_for:
27
27
  legal: "A clause, a definition or a claim is a paragraph of one sentence by form."
28
28
  literature: "Dialogue and verse set each line apart."
29
+ academic: measured by yarn rules:measure
29
30
 
30
31
  group: readability
31
32
  summary:
@@ -14,7 +14,7 @@ name:
14
14
 
15
15
  why:
16
16
  ja: 「出来る」と「できる」、「引っ越し」と「引越し」、「ウィンドウ」と「ウインドウ」、「e-mail」と「email」のように、同じ語を一つの文書の中で二通りに書くと、検索で別の語になり、読み手は別のものを指しているのかと迷います。どちらが正しいかは決めません。chaff は語の一覧を持たず、文書の中の語を読み(日本語)やならした綴り(カタカナ語と英字)で束ね、文書の中で少ないほうを指摘します。補助動詞と形式名詞(見て下さい、その事)は、本来の使い方(資料を下さい)と別に比べるので、「補助動詞はかなで書く」と決めた文書はそろっていると見ます。漢字の違う同音の語(書く・描く、機会・機械)は別の語と見ます。少ないほうが三分の一を超える文書は、使い分けていると見て言いません。
17
- en: Writing one word two ways in one document (e-mail and email, GitHub and Github) makes search treat them as different words and leaves the reader wondering whether two things are meant. chaff does not decide which way is right and keeps no list of words; it groups the document's own words, by reading in Japanese and by spelling without hyphens and case in English, and points at whichever way the document uses less. The case of the first letter is left out, since a sentence or a title gives it (Email, email), and so are words in capitals only. It says nothing when the minority is more than a third, since the document then uses both on purpose.
17
+ en: Writing one word two ways in one document (e-mail and email, GitHub and Github) makes search treat them as different words and leaves the reader wondering whether two things are meant. chaff does not decide which way is right and keeps no list of words; it groups the document's own words, by reading in Japanese and by spelling without hyphens and case in English, and points at whichever way the document uses less. The case of the first letter is left out, since a sentence or a title gives it (Email, email), and so are words in capitals only, a name in capitals with an ending (SENDs) and the letters of an acronym picked out (CLImatology next to CLIPER). It says nothing when the minority is more than a third, since the document then uses both on purpose.
18
18
 
19
19
  message:
20
20
  ja: 「{written}」と書いています(この文書はふつう「{other}」と書く語です。{of} 箇所のうち {count} 箇所が違う)
@@ -56,8 +56,8 @@ example:
56
56
  Send the form by email. We answer every email within a day. Attach the receipt to the email.
57
57
 
58
58
  not_flagged:
59
- ja: 読みが同じでも漢字の違う語(書く・描く)、補助動詞・形式名詞と本来の使い方の書き分け(見て下さい・資料を下さい)、書き分けが意味の違いになる語(成る・なる、言う・いう)、語末の「ー」だけの違い(katakana-long-vowel が見ます)、鉤括弧や引用符の中、chaff.yaml の names に書いた名前は見ません。英字は、頭の字の大文字小文字(Email と email)と、大文字だけの語(強調や略語)を書き方の違いにしません。少ないほうが三分の一を超えるときも言いません。文学のジャンルでは既定で止めています(その時代の書き方のため)。
60
- en: The case of a word's first letter (Email, email; Long-Term, long-term) is not a spelling, nor is a word in capitals only (emphasis or an acronym). Hyphenated words that are another word (re-sign, resign), part of an address (github.com), anything in quotation marks and the team's names are not compared. Nothing is reported when the minority is more than a third. The literature preset turns it off, since old spelling belongs to its time.
59
+ ja: 読みが同じでも漢字の違う語(書く・描く)、補助動詞・形式名詞と本来の使い方の書き分け(見て下さい・資料を下さい)、書き分けが意味の違いになる語(成る・なる、言う・いう)、語末の「ー」だけの違い(katakana-long-vowel が見ます)、鉤括弧や引用符の中、語の直後のふりがなの括弧の中(HTTP(えいちてぃーてぃーぴー))、chaff.yaml の names に書いた名前は見ません。名詞に続けて書いたかなの名詞(全員ぶん)と慣用句の動詞(気をつける)は、同じ読みの語(文、名札を付ける)と別に比べます。英字は、頭の字の大文字小文字(Email と email)と、大文字だけの語(強調や略語)、大文字の名前に語尾が付いた語(関数名の SENDs)、同じ文の略語の字を示した語(CLIPER と並ぶ CLImatology)を書き方の違いにしません(HBase のような名前の大文字は比べます)。少ないほうが三分の一を超えるときも言いません。文学のジャンルでは既定で止めています(その時代の書き方のため)。
60
+ en: The case of a word's first letter (Email, email; Long-Term, long-term) is not a spelling, nor is a word in capitals only (emphasis or an acronym), nor a name in capitals with an ending (SENDs, OPENed), nor the letters of an acronym picked out beside it (CLImatology next to CLIPER). A name spelled with capitals (HBase) is still compared. Hyphenated words that are another word (re-sign, resign), part of an address (github.com), anything in quotation marks, a Japanese reading in brackets right after a word (HTTP(えいちてぃーてぃーぴー)) and the team's names are not compared. Nothing is reported when the minority is more than a third. The literature preset turns it off, since old spelling belongs to its time.
61
61
  level_meaning:
62
62
  ja: 少ないほうが語の {limit}% 以下のとき指摘
63
63
  en: reported when the minority spelling is {limit}% of the word's uses or less