chaffjs 0.21.0 → 0.22.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 (214) hide show
  1. package/README.md +2 -1
  2. package/dist/cli-text.d.ts.map +1 -1
  3. package/dist/cli-text.js +4 -0
  4. package/dist/cli-text.js.map +1 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +4 -11
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/init-command.d.ts +4 -0
  9. package/dist/commands/init-command.d.ts.map +1 -0
  10. package/dist/commands/init-command.js +15 -0
  11. package/dist/commands/init-command.js.map +1 -0
  12. package/dist/commands/plugin-init.d.ts +20 -0
  13. package/dist/commands/plugin-init.d.ts.map +1 -0
  14. package/dist/commands/plugin-init.js +129 -0
  15. package/dist/commands/plugin-init.js.map +1 -0
  16. package/dist/commands/plugin-test.d.ts +11 -0
  17. package/dist/commands/plugin-test.d.ts.map +1 -0
  18. package/dist/commands/plugin-test.js +81 -0
  19. package/dist/commands/plugin-test.js.map +1 -0
  20. package/dist/custom/problems.d.ts.map +1 -1
  21. package/dist/custom/problems.js +1 -2
  22. package/dist/custom/problems.js.map +1 -1
  23. package/dist/detectors/amount-for-count.d.ts +21 -0
  24. package/dist/detectors/amount-for-count.d.ts.map +1 -0
  25. package/dist/detectors/amount-for-count.js +55 -0
  26. package/dist/detectors/amount-for-count.js.map +1 -0
  27. package/dist/detectors/currency-notation.d.ts +29 -0
  28. package/dist/detectors/currency-notation.d.ts.map +1 -0
  29. package/dist/detectors/currency-notation.js +58 -0
  30. package/dist/detectors/currency-notation.js.map +1 -0
  31. package/dist/detectors/dangling-opener.d.ts +14 -0
  32. package/dist/detectors/dangling-opener.d.ts.map +1 -0
  33. package/dist/detectors/dangling-opener.js +55 -0
  34. package/dist/detectors/dangling-opener.js.map +1 -0
  35. package/dist/detectors/footnote-mismatch.d.ts +11 -0
  36. package/dist/detectors/footnote-mismatch.d.ts.map +1 -0
  37. package/dist/detectors/footnote-mismatch.js +55 -0
  38. package/dist/detectors/footnote-mismatch.js.map +1 -0
  39. package/dist/detectors/form-minority.d.ts +13 -0
  40. package/dist/detectors/form-minority.d.ts.map +1 -0
  41. package/dist/detectors/form-minority.js +19 -0
  42. package/dist/detectors/form-minority.js.map +1 -0
  43. package/dist/detectors/heading-end-mark.d.ts +10 -0
  44. package/dist/detectors/heading-end-mark.d.ts.map +1 -0
  45. package/dist/detectors/heading-end-mark.js +59 -0
  46. package/dist/detectors/heading-end-mark.js.map +1 -0
  47. package/dist/detectors/list-marker.d.ts +7 -0
  48. package/dist/detectors/list-marker.d.ts.map +1 -0
  49. package/dist/detectors/list-marker.js +50 -0
  50. package/dist/detectors/list-marker.js.map +1 -0
  51. package/dist/detectors/markdown-slip.d.ts +19 -0
  52. package/dist/detectors/markdown-slip.d.ts.map +1 -0
  53. package/dist/detectors/markdown-slip.js +122 -0
  54. package/dist/detectors/markdown-slip.js.map +1 -0
  55. package/dist/detectors/numeral-opener.d.ts +10 -0
  56. package/dist/detectors/numeral-opener.d.ts.map +1 -0
  57. package/dist/detectors/numeral-opener.js +65 -0
  58. package/dist/detectors/numeral-opener.js.map +1 -0
  59. package/dist/detectors/ordinal-suffix.d.ts +12 -0
  60. package/dist/detectors/ordinal-suffix.d.ts.map +1 -0
  61. package/dist/detectors/ordinal-suffix.js +33 -0
  62. package/dist/detectors/ordinal-suffix.js.map +1 -0
  63. package/dist/detectors/range-notation.d.ts +15 -0
  64. package/dist/detectors/range-notation.d.ts.map +1 -0
  65. package/dist/detectors/range-notation.js +58 -0
  66. package/dist/detectors/range-notation.js.map +1 -0
  67. package/dist/detectors/registry/amount-for-count.d.ts +3 -0
  68. package/dist/detectors/registry/amount-for-count.d.ts.map +1 -0
  69. package/dist/detectors/registry/amount-for-count.js +3 -0
  70. package/dist/detectors/registry/amount-for-count.js.map +1 -0
  71. package/dist/detectors/registry/currency-notation.d.ts +3 -0
  72. package/dist/detectors/registry/currency-notation.d.ts.map +1 -0
  73. package/dist/detectors/registry/currency-notation.js +3 -0
  74. package/dist/detectors/registry/currency-notation.js.map +1 -0
  75. package/dist/detectors/registry/dangling-opener.d.ts +3 -0
  76. package/dist/detectors/registry/dangling-opener.d.ts.map +1 -0
  77. package/dist/detectors/registry/dangling-opener.js +3 -0
  78. package/dist/detectors/registry/dangling-opener.js.map +1 -0
  79. package/dist/detectors/registry/footnote-mismatch.d.ts +3 -0
  80. package/dist/detectors/registry/footnote-mismatch.d.ts.map +1 -0
  81. package/dist/detectors/registry/footnote-mismatch.js +3 -0
  82. package/dist/detectors/registry/footnote-mismatch.js.map +1 -0
  83. package/dist/detectors/registry/heading-end-punctuation.d.ts +3 -0
  84. package/dist/detectors/registry/heading-end-punctuation.d.ts.map +1 -0
  85. package/dist/detectors/registry/heading-end-punctuation.js +3 -0
  86. package/dist/detectors/registry/heading-end-punctuation.js.map +1 -0
  87. package/dist/detectors/registry/list-marker.d.ts +3 -0
  88. package/dist/detectors/registry/list-marker.d.ts.map +1 -0
  89. package/dist/detectors/registry/list-marker.js +3 -0
  90. package/dist/detectors/registry/list-marker.js.map +1 -0
  91. package/dist/detectors/registry/numeral-opener.d.ts +3 -0
  92. package/dist/detectors/registry/numeral-opener.d.ts.map +1 -0
  93. package/dist/detectors/registry/numeral-opener.js +3 -0
  94. package/dist/detectors/registry/numeral-opener.js.map +1 -0
  95. package/dist/detectors/registry/ordinal-suffix.d.ts +3 -0
  96. package/dist/detectors/registry/ordinal-suffix.d.ts.map +1 -0
  97. package/dist/detectors/registry/ordinal-suffix.js +3 -0
  98. package/dist/detectors/registry/ordinal-suffix.js.map +1 -0
  99. package/dist/detectors/registry/range-notation.d.ts +3 -0
  100. package/dist/detectors/registry/range-notation.d.ts.map +1 -0
  101. package/dist/detectors/registry/range-notation.js +3 -0
  102. package/dist/detectors/registry/range-notation.js.map +1 -0
  103. package/dist/detectors/registry/relative-pronoun-mix.d.ts +3 -0
  104. package/dist/detectors/registry/relative-pronoun-mix.d.ts.map +1 -0
  105. package/dist/detectors/registry/relative-pronoun-mix.js +3 -0
  106. package/dist/detectors/registry/relative-pronoun-mix.js.map +1 -0
  107. package/dist/detectors/registry/share-over-hundred.d.ts +3 -0
  108. package/dist/detectors/registry/share-over-hundred.d.ts.map +1 -0
  109. package/dist/detectors/registry/share-over-hundred.js +3 -0
  110. package/dist/detectors/registry/share-over-hundred.js.map +1 -0
  111. package/dist/detectors/registry/step-reference.d.ts +3 -0
  112. package/dist/detectors/registry/step-reference.d.ts.map +1 -0
  113. package/dist/detectors/registry/step-reference.js +3 -0
  114. package/dist/detectors/registry/step-reference.js.map +1 -0
  115. package/dist/detectors/registry/table-row-overflow.d.ts +3 -0
  116. package/dist/detectors/registry/table-row-overflow.d.ts.map +1 -0
  117. package/dist/detectors/registry/table-row-overflow.js +3 -0
  118. package/dist/detectors/registry/table-row-overflow.js.map +1 -0
  119. package/dist/detectors/registry/toc-heading.d.ts +3 -0
  120. package/dist/detectors/registry/toc-heading.d.ts.map +1 -0
  121. package/dist/detectors/registry/toc-heading.js +3 -0
  122. package/dist/detectors/registry/toc-heading.js.map +1 -0
  123. package/dist/detectors/registry/unclosed-code-fence.d.ts +3 -0
  124. package/dist/detectors/registry/unclosed-code-fence.d.ts.map +1 -0
  125. package/dist/detectors/registry/unclosed-code-fence.js +3 -0
  126. package/dist/detectors/registry/unclosed-code-fence.js.map +1 -0
  127. package/dist/detectors/registry/unrendered-emphasis.d.ts +3 -0
  128. package/dist/detectors/registry/unrendered-emphasis.d.ts.map +1 -0
  129. package/dist/detectors/registry/unrendered-emphasis.js +3 -0
  130. package/dist/detectors/registry/unrendered-emphasis.js.map +1 -0
  131. package/dist/detectors/relative-pronoun-mix.d.ts +19 -0
  132. package/dist/detectors/relative-pronoun-mix.d.ts.map +1 -0
  133. package/dist/detectors/relative-pronoun-mix.js +60 -0
  134. package/dist/detectors/relative-pronoun-mix.js.map +1 -0
  135. package/dist/detectors/share-over-hundred.d.ts +20 -0
  136. package/dist/detectors/share-over-hundred.d.ts.map +1 -0
  137. package/dist/detectors/share-over-hundred.js +55 -0
  138. package/dist/detectors/share-over-hundred.js.map +1 -0
  139. package/dist/detectors/step-reference.d.ts +20 -0
  140. package/dist/detectors/step-reference.d.ts.map +1 -0
  141. package/dist/detectors/step-reference.js +57 -0
  142. package/dist/detectors/step-reference.js.map +1 -0
  143. package/dist/detectors/toc-heading.d.ts +10 -0
  144. package/dist/detectors/toc-heading.d.ts.map +1 -0
  145. package/dist/detectors/toc-heading.js +99 -0
  146. package/dist/detectors/toc-heading.js.map +1 -0
  147. package/dist/list-marks.d.ts +21 -0
  148. package/dist/list-marks.d.ts.map +1 -0
  149. package/dist/list-marks.js +82 -0
  150. package/dist/list-marks.js.map +1 -0
  151. package/dist/rule-fields.d.ts +5 -0
  152. package/dist/rule-fields.d.ts.map +1 -1
  153. package/dist/rule-fields.js +21 -0
  154. package/dist/rule-fields.js.map +1 -1
  155. package/package.json +3 -3
  156. package/rules/cliche.yaml +67 -0
  157. package/rules/currency-notation-consistency.yaml +77 -0
  158. package/rules/dangling-participle.yaml +58 -0
  159. package/rules/footnote-mismatch.yaml +91 -0
  160. package/rules/heading-end-punctuation-mix.yaml +158 -0
  161. package/rules/less-for-fewer.yaml +59 -0
  162. package/rules/list-marker-mix.yaml +111 -0
  163. package/rules/nonstandard-word.yaml +80 -0
  164. package/rules/numeral-sentence-start.yaml +56 -0
  165. package/rules/ordinal-suffix-mismatch.yaml +65 -0
  166. package/rules/range-notation-consistency.yaml +73 -0
  167. package/rules/share-over-hundred.yaml +65 -0
  168. package/rules/step-reference-missing.yaml +85 -0
  169. package/rules/table-row-overflow.yaml +90 -0
  170. package/rules/toc-heading-mismatch.yaml +136 -0
  171. package/rules/unclosed-code-fence.yaml +107 -0
  172. package/rules/uncomparable-graded.yaml +65 -0
  173. package/rules/unrendered-emphasis.yaml +73 -0
  174. package/rules/which-that-consistency.yaml +64 -0
  175. package/skills/chaff/SKILL.md +7 -7
  176. package/src/cli-text.ts +4 -0
  177. package/src/cli.ts +5 -9
  178. package/src/commands/init-command.ts +13 -0
  179. package/src/commands/plugin-init.ts +150 -0
  180. package/src/commands/plugin-test.ts +111 -0
  181. package/src/custom/problems.ts +1 -3
  182. package/src/detectors/amount-for-count.ts +90 -0
  183. package/src/detectors/currency-notation.ts +90 -0
  184. package/src/detectors/dangling-opener.ts +74 -0
  185. package/src/detectors/footnote-mismatch.ts +72 -0
  186. package/src/detectors/form-minority.ts +21 -0
  187. package/src/detectors/heading-end-mark.ts +82 -0
  188. package/src/detectors/list-marker.ts +60 -0
  189. package/src/detectors/markdown-slip.ts +140 -0
  190. package/src/detectors/numeral-opener.ts +72 -0
  191. package/src/detectors/ordinal-suffix.ts +40 -0
  192. package/src/detectors/range-notation.ts +76 -0
  193. package/src/detectors/registry/amount-for-count.ts +4 -0
  194. package/src/detectors/registry/currency-notation.ts +4 -0
  195. package/src/detectors/registry/dangling-opener.ts +4 -0
  196. package/src/detectors/registry/footnote-mismatch.ts +4 -0
  197. package/src/detectors/registry/heading-end-punctuation.ts +4 -0
  198. package/src/detectors/registry/list-marker.ts +4 -0
  199. package/src/detectors/registry/numeral-opener.ts +4 -0
  200. package/src/detectors/registry/ordinal-suffix.ts +4 -0
  201. package/src/detectors/registry/range-notation.ts +4 -0
  202. package/src/detectors/registry/relative-pronoun-mix.ts +4 -0
  203. package/src/detectors/registry/share-over-hundred.ts +4 -0
  204. package/src/detectors/registry/step-reference.ts +4 -0
  205. package/src/detectors/registry/table-row-overflow.ts +4 -0
  206. package/src/detectors/registry/toc-heading.ts +4 -0
  207. package/src/detectors/registry/unclosed-code-fence.ts +4 -0
  208. package/src/detectors/registry/unrendered-emphasis.ts +4 -0
  209. package/src/detectors/relative-pronoun-mix.ts +79 -0
  210. package/src/detectors/share-over-hundred.ts +75 -0
  211. package/src/detectors/step-reference.ts +83 -0
  212. package/src/detectors/toc-heading.ts +125 -0
  213. package/src/list-marks.ts +106 -0
  214. package/src/rule-fields.ts +28 -0
@@ -11,11 +11,16 @@ export type FieldProblem = {
11
11
  } | {
12
12
  readonly kind: "bad-summary";
13
13
  readonly written: string;
14
+ } | {
15
+ readonly kind: "bad-text";
16
+ readonly written: string;
14
17
  } | {
15
18
  readonly kind: "bad-example";
16
19
  readonly written: string;
17
20
  };
18
21
  export type FieldKind = FieldProblem["kind"];
22
+ /** Every kind, for a caller that reports these among problems of its own. */
23
+ export declare const FIELD_KINDS: ReadonlySet<string>;
19
24
  /** What is wrong with the shared fields of one rule as written, in the order the fields are listed here. */
20
25
  export declare const fieldProblems: (raw: Readonly<Record<string, unknown>>, genres: readonly string[]) => FieldProblem[];
21
26
  /** What is wrong, with the value as written and what would be right. */
@@ -1 +1 @@
1
- {"version":3,"file":"rule-fields.d.ts","sourceRoot":"","sources":["../src/rule-fields.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAS,UAAU,EAAE,MAAM,SAAS,CAAC;AAMjD,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAgD7C,4GAA4G;AAC5G,eAAO,MAAM,aAAa,GAAI,KAAK,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,SAAS,MAAM,EAAE,KAAG,YAAY,EAM7G,CAAC;AAuBF,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,GAAI,SAAS,YAAY,EAAE,IAAI,UAAU,KAAG,MAAiD,CAAC"}
1
+ {"version":3,"file":"rule-fields.d.ts","sourceRoot":"","sources":["../src/rule-fields.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAS,UAAU,EAAE,MAAM,SAAS,CAAC;AAMjD,MAAM,MAAM,YAAY,GACpB;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC1D;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D,MAAM,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;AAE7C,6EAA6E;AAC7E,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,MAAM,CAA2G,CAAC;AAmExJ,4GAA4G;AAC5G,eAAO,MAAM,aAAa,GAAI,KAAK,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,QAAQ,SAAS,MAAM,EAAE,KAAG,YAAY,EAO7G,CAAC;AA2BF,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,GAAI,SAAS,YAAY,EAAE,IAAI,UAAU,KAAG,MAAiD,CAAC"}
@@ -1,5 +1,7 @@
1
1
  import { RULE_GROUPS } from "./rule-guide.js";
2
2
  import { depthOfRewrite, unknownDepthSentence } from "./rewrite-depth.js";
3
+ /** Every kind, for a caller that reports these among problems of its own. */
4
+ export const FIELD_KINDS = new Set(["bad-depth", "bad-group", "bad-use-for", "bad-summary", "bad-example", "bad-text"]);
3
5
  const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
4
6
  const isText = (value) => typeof value === "string" && value.trim() !== "";
5
7
  const printed = (value) => (typeof value === "string" ? value : (JSON.stringify(value) ?? typeof value));
@@ -16,6 +18,22 @@ const useForProblems = (useFor, genres) => {
16
18
  return useFor.filter((entry) => !namesGenre(entry, genres)).map((entry) => ({ kind: "bad-use-for", written: printed(entry) }));
17
19
  };
18
20
  const summaryProblems = (summary) => summary === undefined || isTextByLanguage(summary) ? [] : [{ kind: "bad-summary", written: printed(summary) }];
21
+ /** A language as a key of a text by language: ja, en, pt-br. */
22
+ const LANGUAGE_KEY = /^[a-z]{2,3}(?:-[a-z0-9]+)*$/iu;
23
+ /** The texts a reader sees. Each may be one string or one per language. */
24
+ const TEXT_FIELDS = ["name", "why", "how_to_fix", "message", "summary"];
25
+ /**
26
+ * A text by language whose key is not a language, or whose value is not a text. In YAML, { en: Write a date, or a
27
+ * number of days } is two entries, the second keyed " or a number of days": without this, the text is cut silently.
28
+ */
29
+ const textProblems = (raw) => TEXT_FIELDS.flatMap((field) => {
30
+ const value = raw[field];
31
+ if (!isRecord(value))
32
+ return [];
33
+ return Object.entries(value)
34
+ .filter(([key, text]) => !LANGUAGE_KEY.test(key) || typeof text !== "string")
35
+ .map(([key]) => ({ kind: "bad-text", written: `${field}: ${JSON.stringify(key)}` }));
36
+ });
19
37
  /** One example: before and after, each a text in every language or by language. */
20
38
  const isExamplePair = (value) => isRecord(value) && isTextByLanguage(value["before"]) && isTextByLanguage(value["after"]);
21
39
  /**
@@ -42,6 +60,7 @@ export const fieldProblems = (raw, genres) => [
42
60
  ...useForProblems(raw["use_for"], genres),
43
61
  ...exampleProblems(raw["example"]),
44
62
  ...depthProblems(raw["rewrite"]),
63
+ ...textProblems(raw),
45
64
  ];
46
65
  const TEXT = {
47
66
  ja: {
@@ -49,6 +68,7 @@ const TEXT = {
49
68
  "bad-group": (written) => `group: ${written} は分類の名前ではありません(${RULE_GROUPS.join(" / ")})。`,
50
69
  "bad-use-for": (written) => `use_for: ${written} はジャンルではありません。ジャンルかその頭(business、business/report)を並べます。一覧は npx chaffjs genres。`,
51
70
  "bad-summary": (written) => `summary: ${written} は読めません。一つの文字列か、言語ごとの文字列({ ja: …, en: … })で書きます。`,
71
+ "bad-text": (written) => `${written} は言語ではありません。{ } の中のカンマは項目の区切りになるので、カンマのある文は引用符で囲みます(en: "Write a date, or a number of days.")。`,
52
72
  "bad-example": (written) => `example: ${written} の before と after が揃っていません。{ before, after } か、言語ごとに { ja: { before, after }, en: { before, after } } と書きます。`,
53
73
  },
54
74
  en: {
@@ -56,6 +76,7 @@ const TEXT = {
56
76
  "bad-group": (written) => `group: ${written} is not a group (${RULE_GROUPS.join(" / ")}).`,
57
77
  "bad-use-for": (written) => `use_for: ${written} is not a genre. List genres or their first part (business, business/report); npx chaffjs genres lists them.`,
58
78
  "bad-summary": (written) => `summary: cannot read ${written}. Write one string, or one per language ({ ja: …, en: … }).`,
79
+ "bad-text": (written) => `${written} is not a language. Inside { }, a comma separates entries, so quote a text that has one (en: "Write a date, or a number of days.").`,
59
80
  "bad-example": (written) => `example: ${written} lacks a before or an after. Write { before, after }, or one per language: { ja: { before, after }, en: { before, after } }.`,
60
81
  },
61
82
  };
@@ -1 +1 @@
1
- {"version":3,"file":"rule-fields.js","sourceRoot":"","sources":["../src/rule-fields.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule-fields.js","sourceRoot":"","sources":["../src/rule-fields.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chaffjs",
3
- "version": "0.21.0",
3
+ "version": "0.22.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",
@@ -66,8 +66,8 @@
66
66
  },
67
67
  "dependencies": {
68
68
  "@anthropic-ai/sdk": "^0.125.0",
69
- "@chaffjs/lang-en": "0.19.0",
70
- "@chaffjs/lang-ja": "0.20.0",
69
+ "@chaffjs/lang-en": "0.20.0",
70
+ "@chaffjs/lang-ja": "0.21.0",
71
71
  "mdast-util-from-markdown": "^2.0.3",
72
72
  "mdast-util-frontmatter": "^2.0.1",
73
73
  "mdast-util-gfm-table": "^2.0.0",
@@ -0,0 +1,67 @@
1
+ id: cliche
2
+ layer: L2
3
+ status: stable
4
+ how_to_find: phrase-match
5
+ word_list: cliche
6
+ requires: [pos]
7
+ languages: [en]
8
+ severity: info
9
+
10
+ name:
11
+ ja: 使い古された決まり文句
12
+ en: Cliché
13
+
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.'
17
+
18
+ message:
19
+ ja: 「{matched}」は使い古された決まり文句です
20
+ en: '"{matched}" is a cliché'
21
+
22
+ how_to_fix:
23
+ ja: 決まり文句が指していた中身を、そのまま書いてください(low-hanging fruit → 簡単に済む作業の名前)。
24
+ en: Say what the phrase stood for ("low-hanging fruit" → name the easy tasks).
25
+
26
+ levels: { strict: 1, normal: 1, relaxed: 2 }
27
+
28
+ use_for: [business, technical, blog, legal, docs, academic, literature, speech]
29
+ off_for:
30
+ literature: "A narrator or a character may speak in clichés; the voice is the author's choice."
31
+ speech: "A transcript keeps the speaker's words."
32
+
33
+ group: wording
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"
37
+ example:
38
+ en:
39
+ before: |
40
+ At the end of the day, the new cache is faster.
41
+ after: |
42
+ The new cache cuts load time from 2 seconds to 0.5.
43
+
44
+ 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.
47
+ level_meaning:
48
+ ja: 当てはまる言い回しが {limit} 箇所あれば指摘
49
+ en: reported once there are {limit}
50
+ sources: [write-good, proselint]
51
+ rewrite:
52
+ depth: light
53
+ en:
54
+ 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
+ pairs:
56
+ - before: At the end of the day, the new cache is faster.
57
+ after: The new cache is faster.
58
+ - before: Fixing the login page is low-hanging fruit.
59
+ after: Fixing the login page takes an hour.
60
+ - before: Let's touch base next week.
61
+ after: Let's talk next week.
62
+ keep:
63
+ - the claim the sentence makes
64
+ - numbers, names and dates in the sentence
65
+ avoid:
66
+ - swapping one cliché for another
67
+ - inventing a figure or a date the text does not give
@@ -0,0 +1,77 @@
1
+ id: currency-notation-consistency
2
+ layer: L2
3
+ status: stable
4
+ how_to_find: currency-notation
5
+ severity: info
6
+
7
+ name:
8
+ ja: 通貨の書き方が混ざっている
9
+ en: A currency written two ways
10
+
11
+ why:
12
+ ja: 同じ通貨の金額を「1,000円」と「¥1,000」、「$20」と「USD 20」のように二通りに書くと、読み手は別の通貨か、別の扱いの金額かと迷います。見積もりや資料を寄せ集めたときに起きます。どの書き方が正しいかは決めず、通貨ごとに文書の中で少ないほうを指します。
13
+ en: When one currency is written two ways in one document ("$20" and "USD 20", "1,000円" and "¥1,000"), the reader wonders whether a different currency or a different kind of amount is meant. It happens when quotes and notes are pasted together. chaff does not decide which way is right; for each currency it points at the way the document uses less.
14
+
15
+ message:
16
+ ja: 「{written}」と書いています(この文書はこの通貨をふつう「{usual}」のように書きます。{of} 箇所のうち {count} 箇所が違う)
17
+ en: '"{written}" here, where the document usually writes this currency like "{usual}" ({count} of {of})'
18
+
19
+ how_to_fix:
20
+ ja: 文書の多いほうの書き方に合わせてください。チームで決めているなら、STYLE.md に書いておくと迷いません。
21
+ en: Match the way the rest of the document writes the currency. If the team has decided, write it in the style guide.
22
+
23
+ # 少ないほうが、その通貨の金額の何パーセントまでなら「混ざっている」と見るか。これを超えたら、文書が使い分けている。
24
+ levels: { strict: 49, normal: 34, relaxed: 20 }
25
+
26
+ use_for: [business, technical, blog, legal, docs, academic, literature, speech]
27
+
28
+ group: consistency
29
+ summary:
30
+ ja: 「1,000円」と「¥1,000」、「$20」と「USD 20」のように、一つの文書で同じ通貨の金額を二通りに書いている所
31
+ en: One currency written two ways in one document, such as "$20" and "USD 20", or "1,000円" and "¥1,000"
32
+ example:
33
+ ja:
34
+ before: |
35
+ 基本料金は 3,000円、追加料金は 500円、送料は 800円 です。割引は ¥200 です。
36
+ after: |
37
+ 基本料金は 3,000円、追加料金は 500円、送料は 800円 です。割引は 200円 です。
38
+ en:
39
+ before: |
40
+ The base fee is $300, the add-on is $50 and shipping is $20. The discount is USD 10.
41
+ after: |
42
+ The base fee is $300, the add-on is $50 and shipping is $20. The discount is $10.
43
+
44
+ not_flagged:
45
+ ja: 通貨ごとに比べるので、円とドルが並ぶのは混ざりではありません。少ないほうがその通貨の金額の三分の一を超える文書は、使い分けている(表は USD、本文は $)と読んで言いません。二つの書き方が同じ数のときも言いません。コードの中は読みません。
46
+ en: Each currency is compared with itself, so dollars beside yen is not a mix. When the less common way is over a third of that currency's amounts, the document is read as using both on purpose (USD in tables, $ in prose) and nothing is reported; nor when the two ways are equally common. Code is not read.
47
+ level_meaning:
48
+ ja: 少ないほうの書き方が、その通貨の金額の {limit}% 以下のとき指摘
49
+ en: reported when the less common way is {limit}% of that currency's amounts or less
50
+
51
+ rewrite:
52
+ ja:
53
+ direction: その通貨の金額を、文書で多いほうの書き方にそろえてください。数と桁はそのまま残します。
54
+ pairs:
55
+ - before: 送料は 800円 です。割引は ¥200 です。
56
+ after: 送料は 800円 です。割引は 200円 です。
57
+ - before: 月額 $20、年額 USD 200 です。
58
+ after: 月額 $20、年額 $200 です。
59
+ keep:
60
+ - 金額の数と桁
61
+ - どの通貨か
62
+ avoid:
63
+ - 別の通貨に換算してしまう
64
+ - 表の通貨の書き方まで本文に合わせて崩す
65
+ en:
66
+ direction: Write the currency's amounts the way the document mostly does. Keep the numbers as they are.
67
+ pairs:
68
+ - before: Shipping is $20. The discount is USD 10.
69
+ after: Shipping is $20. The discount is $10.
70
+ - before: The fee is 500 yen, or ¥450 if paid early.
71
+ after: The fee is 500 yen, or 450 yen if paid early.
72
+ keep:
73
+ - the numbers and their magnitude
74
+ - which currency each amount is in
75
+ avoid:
76
+ - converting an amount to another currency
77
+ - changing the way a table writes it to match the prose
@@ -0,0 +1,58 @@
1
+ id: dangling-participle
2
+ layer: L3
3
+ status: stable
4
+ how_to_find: dangling-opener
5
+ requires: [pos]
6
+ languages: [en]
7
+ severity: info
8
+
9
+ name:
10
+ ja: 主語の無い分詞の句
11
+ en: Dangling participle
12
+
13
+ why:
14
+ ja: 英語で分詞の句から始めた文(Having reviewed the code, …)は、句の動作をしたのが文の主語だと読まれます。主語が形だけの it や there だと(Having reviewed the code, it is ready.)、コードを見たのが誰なのか文に書かれていません。読み手は一瞬つまずき、意味を補って読むことになります。-ing の分詞の句の直後の主語が it か there で、be が続く形だけを指します。
15
+ en: 'A sentence that opens with a participle phrase ("Having reviewed the code, …") is read as if the subject did that action. When the subject is an empty "it" or "there" ("Having reviewed the code, it is ready."), the sentence never says who reviewed the code, and the reader has to supply it. Only an opening "-ing" phrase followed by "it" or "there" and a form of "be" is reported.'
16
+
17
+ message:
18
+ ja: 「{opener}」の動作をしたのが誰か、文に書かれていません(主語が「{subject}」)
19
+ en: '"{opener}" has no one to attach to; the subject is an empty "{subject}"'
20
+
21
+ how_to_fix:
22
+ ja: 動作をした人を主語にするか(Having reviewed the code, we think it is ready.)、句を節にしてください(After we reviewed the code, it was ready.)。
23
+ en: Make whoever did the action the subject ("Having reviewed the code, we consider it ready."), or turn the phrase into a clause ("After we reviewed the code, it was ready.").
24
+
25
+ levels: { strict: warning, normal: info, relaxed: info }
26
+
27
+ use_for: [business, technical, blog, legal, docs, academic, literature, speech]
28
+ off_for:
29
+ literature: "A narrator and a character speak as they speak, and loose openings are part of a voice."
30
+ speech: "A transcript keeps the speaker's words."
31
+
32
+ group: wording
33
+ summary:
34
+ ja: 英語で、「Having reviewed the code, it is ready.」のように、分詞の句の後ろの主語が形だけの it や there の文
35
+ en: 'A participle phrase followed by an empty "it" or "there", as in "Having reviewed the code, it is ready."'
36
+
37
+ example:
38
+ en:
39
+ before: Having reviewed the logs, it is clear that the job failed twice.
40
+ after: Having reviewed the logs, we found that the job failed twice.
41
+
42
+ not_flagged:
43
+ ja: 主語が人や物の名詞の文(Having reviewed the code, the team approved it.)、過去分詞で始めた句(Configured with SSO, it is ready.。it そのものを言うことが多い)、決まった言い方として読む句(Given、Based on、Generally speaking、Having said that)、挿入句の it is(Testing it, it is worth noting, requires …)、分詞の句が長く読点の位置が当てにならない文は指しません。英語の文だけを読みます。
44
+ en: 'A sentence whose subject is a person or a thing ("Having reviewed the code, the team approved it."), an opening past participle ("Configured with SSO, it is ready.", which usually describes "it" itself), openings read as fixed phrases ("Given", "Based on", "Generally speaking", "Having said that"), a parenthetical "it is" ("Testing it, it is worth noting, requires …"), and long openings where the comma cannot be trusted are not reported. Only English sentences are read.'
45
+
46
+ rewrite:
47
+ depth: light
48
+ en:
49
+ direction: Give the participle phrase a subject that did its action, or turn the phrase into a clause with its own subject. Keep what the sentence says.
50
+ pairs:
51
+ - before: Having reviewed the logs, it is clear that the job failed twice.
52
+ after: Having reviewed the logs, we found that the job failed twice.
53
+ - before: Looking at the totals, there is a gap of 40 hours.
54
+ after: Looking at the totals, we see a gap of 40 hours.
55
+ keep:
56
+ - what the sentence says and its figures
57
+ avoid:
58
+ - inventing who did the action when the document does not say
@@ -0,0 +1,91 @@
1
+ id: footnote-mismatch
2
+ layer: L3
3
+ status: stable
4
+ how_to_find: footnote-mismatch
5
+ severity: warning
6
+
7
+ name:
8
+ ja: 注の無い注の印と、印の無い注
9
+ en: A note mark with no note, or a note nothing points to
10
+
11
+ why:
12
+ ja: 本文に「※3」や「[^3]」と書いたのに注3が無ければ、読み手は探しても見つからない注を探します。逆に、本文のどこも指さない注は、どの語の注か分かりません。注を消したり番号を振り直したりして、印と注の片方だけが残ったときに起きます。印と注の番号を突き合わせれば、機械で言えます。
13
+ en: When the text says "[^3]" or "※3" and there is no note 3, the reader looks for a note that is not there; a note nothing points to cannot be tied to any word. It happens when a note is deleted or the notes are renumbered and only one side is changed. Matching the marks against the notes' numbers is mechanical.
14
+
15
+ message:
16
+ ja: 「{label}」の注がありません
17
+ en: 'There is no note for "{label}"'
18
+
19
+ messages:
20
+ missing:
21
+ ja: 「{label}」の注がありません
22
+ en: 'There is no note for "{label}"'
23
+ unused:
24
+ ja: 注「{label}」を本文のどこも指していません
25
+ en: 'Nothing in the text points to the note "{label}"'
26
+
27
+ how_to_fix:
28
+ ja: 注を足すか、印を消してください。注を振り直したなら、本文の印も同じ番号に直します。
29
+ en: Add the note or remove the mark. If the notes were renumbered, renumber the marks to match.
30
+
31
+ levels: { normal: warning, relaxed: info }
32
+
33
+ use_for: [business, technical, blog, legal, docs, academic, literature, speech]
34
+
35
+ group: structure
36
+ summary:
37
+ ja: 本文の「※3」「[^3]」に対応する注が無い所と、本文のどこも指さない注
38
+ en: A note mark ("[^3]", "※3") with no note, or a note that nothing in the text points to
39
+ example:
40
+ ja:
41
+ before: |
42
+ 営業運行※1を開始し、料金※2は無料です。
43
+
44
+ ※1 特定の走行環境条件での運行
45
+ after: |
46
+ 営業運行※1を開始し、料金※2は無料です。
47
+
48
+ ※1 特定の走行環境条件での運行
49
+ ※2 実証期間中に限ります
50
+ en:
51
+ before: |
52
+ The pilot starts in May[^1] and is free[^2].
53
+
54
+ [^1]: On weekdays only.
55
+ after: |
56
+ The pilot starts in May[^1] and is free[^2].
57
+
58
+ [^1]: On weekdays only.
59
+ [^2]: During the trial period.
60
+
61
+ not_flagged:
62
+ ja: Markdown の脚注([^1] と行頭の [^1]:)と、※ に一桁か二桁の番号を付けた印(※1、(※2))を読みます。※ の注が文書に一つも無いときは、注を別の所(表や別紙)に置いた文書と読んで言いません。※ の後ろに数が続くもの(※2018年度)は注の番号ではありません。コードの中は読みません。
63
+ en: Markdown footnotes ([^1] and a line starting "[^1]:") and a ※ with a one- or two-digit number (※1, (※2)) are read. When a document has no ※ note at all, its notes are taken to be elsewhere (a table, an annex) and nothing is reported for ※. A ※ before a longer number ("※2018") is not a note mark. Code is not read.
64
+
65
+ rewrite:
66
+ ja:
67
+ direction: 印と注の番号を突き合わせ、注の無い印には注を足すか印を消し、どこからも指されない注には印を足すか注を消してください。
68
+ pairs:
69
+ - before: 料金※2は無料です。(注は ※1 だけ)
70
+ after: 料金※2は無料です。(※2 実証期間中に限ります、を足す)
71
+ - before: 本文に ※3 が無いのに「※3 予約が必要です」の注がある
72
+ after: 予約の要る語に ※3 を付ける
73
+ keep:
74
+ - 注の中身
75
+ - ほかの注の番号
76
+ avoid:
77
+ - 書き手が知らない注の中身を作る
78
+ - 印だけを消して、注が要る内容を本文から落とす
79
+ en:
80
+ direction: Match the marks against the notes. Add the missing note or remove its mark; for a note nothing points to, add the mark where it belongs or remove the note.
81
+ pairs:
82
+ - before: The pilot is free[^2]. (only [^1] is defined)
83
+ after: 'The pilot is free[^2]. (adds "[^2]: During the trial period.")'
84
+ - before: '"[^3]: Booking required." with no [^3] in the text'
85
+ after: '"Booking is required[^3]." where the note belongs'
86
+ keep:
87
+ - what each note says
88
+ - the numbers of the other notes
89
+ avoid:
90
+ - inventing what a note says
91
+ - removing a mark and with it a qualification the text needs
@@ -0,0 +1,158 @@
1
+ id: heading-end-punctuation-mix
2
+ layer: L1
3
+ status: stable
4
+ how_to_find: heading-end-punctuation
5
+ word_list: heading-end-word
6
+ requires: [markdown]
7
+ severity: info
8
+
9
+ name:
10
+ ja: 見出しの終わりの記号が揃っていない
11
+ en: Heading end punctuation mixed
12
+
13
+ why:
14
+ ja: ほとんどの見出しが「手順」「注意点」のように記号なしで終わるのに、一つだけ「準備:」「確認。」と記号で終わっていたり、その逆だったりすると、読み手はその見出しだけ別の扱いなのかと迷い、目次でも浮いて見えます。直し忘れや、別の文書から貼った見出しによく出る形です。どちらの書き方が正しいかは決めず、同じ深さの見出しのうち少ないほうを指します。深さごとに比べるので、一段深い見出しをすべて「任意:」のような札にする書き方は指しません。
15
+ en: When most headings end bare ("Setup", "Notes") and one ends with a colon or a full stop ("Prerequisites:", "Checks."), or the other way round, the reader wonders whether that heading is meant to be different, and it stands out in the table of contents. It is usually a heading pasted from elsewhere or not yet tidied. chaff does not pick a style; it points at the smaller side among headings of the same depth. Depths are compared apart, so a depth whose headings are all labels ("Optional:") is not reported.
16
+
17
+ message:
18
+ ja: 見出し「{heading}」の終わりの記号が、ほかの見出し(「{example}」など {count} 個)と違います
19
+ en: 'The heading "{heading}" ends differently from the other headings ("{example}" and {count} in all)'
20
+ messages:
21
+ marked:
22
+ ja: 見出し「{heading}」だけ「{mark}」で終わっています(ほかの見出しは「{example}」など {count} 個が「:」「。」なしで終わる)
23
+ en: 'The heading "{heading}" ends with "{mark}", while {count} other headings end bare ("{example}")'
24
+ bare:
25
+ ja: 見出し「{heading}」だけ「:」「。」なしで終わっています(ほかの見出しは「{example}」など {count} 個が記号で終わる)
26
+ en: 'The heading "{heading}" ends bare, while {count} other headings end with a mark ("{example}")'
27
+
28
+ how_to_fix:
29
+ ja: 見出しの終わりを、多いほうの書き方に揃えてください。記号なしの見出しが多ければ「:」や「。」を外します。
30
+ en: End the heading the way most headings end. If most end bare, drop the colon or the full stop.
31
+
32
+ placeholders:
33
+ heading:
34
+ ja: 見出し
35
+ en: the heading
36
+ mark:
37
+ ja: 記号
38
+ en: the mark
39
+ example:
40
+ ja: ほかの見出し
41
+ en: another heading
42
+ count:
43
+ ja: 〇
44
+ en: N
45
+
46
+ levels: { strict: warning, normal: info, relaxed: info }
47
+
48
+ use_for: [business, technical, blog, legal, docs, academic, literature, speech]
49
+
50
+ group: consistency
51
+ summary:
52
+ ja: 記号なしの見出しの中に「準備:」「確認。」のように記号で終わる見出しが混ざっている所(またはその逆)
53
+ en: A heading ending with a colon or a full stop among headings that end bare, or the other way round
54
+ example:
55
+ ja:
56
+ before: |
57
+ # 作業の手引き
58
+
59
+ ## 準備
60
+
61
+ 道具をそろえます。
62
+
63
+ ## 手順
64
+
65
+ 順に進めます。
66
+
67
+ ## 確認:
68
+
69
+ 結果を見ます。
70
+
71
+ ## 片付け
72
+
73
+ 元に戻します。
74
+ after: |
75
+ # 作業の手引き
76
+
77
+ ## 準備
78
+
79
+ 道具をそろえます。
80
+
81
+ ## 手順
82
+
83
+ 順に進めます。
84
+
85
+ ## 確認
86
+
87
+ 結果を見ます。
88
+
89
+ ## 片付け
90
+
91
+ 元に戻します。
92
+ en:
93
+ before: |
94
+ # Working guide
95
+
96
+ ## Preparation
97
+
98
+ Gather the tools.
99
+
100
+ ## Steps
101
+
102
+ Work through them in order.
103
+
104
+ ## Checks:
105
+
106
+ Look at the result.
107
+
108
+ ## Cleanup
109
+
110
+ Put everything back.
111
+ after: |
112
+ # Working guide
113
+
114
+ ## Preparation
115
+
116
+ Gather the tools.
117
+
118
+ ## Steps
119
+
120
+ Work through them in order.
121
+
122
+ ## Checks
123
+
124
+ Look at the result.
125
+
126
+ ## Cleanup
127
+
128
+ Put everything back.
129
+
130
+ not_flagged:
131
+ ja: 文書の題(最初の一つだけの一番上の見出し)は比べません。同じ深さの見出しが四つ未満の所、記号で終わる見出しと終わらない見出しが同じくらいある文書(少ないほうが四分の一を超える)は指しません。疑問符・感嘆符で終わる見出しは、記号なしと数えます。「…」や「etc.」「Inc.」のように言葉の一部の点で終わる見出しは比べません(点で終わる略語は言語ごとの語彙表にあります)。
132
+ en: The page title (a single top-level heading that opens the document) is not compared. Fewer than four headings at one depth, or where both ways are common (the smaller side above a quarter), is not reported. A heading ending with a question mark or an exclamation mark counts as bare. A heading ending with a full stop that is part of the words ("…", "etc.", "Inc.") is left out of the comparison; the abbreviations are in each language's lexicon.
133
+ rewrite:
134
+ depth: light
135
+ ja:
136
+ direction: 見出しの終わりを、文書の多くの見出しと同じ書き方にしてください。記号を足すか外すだけで、見出しの言葉は変えません。
137
+ pairs:
138
+ - before: 「## 準備」「## 手順」「## 確認:」
139
+ after: 「## 準備」「## 手順」「## 確認」
140
+ - before: 「## 背景。」「## 方針。」「## 課題」
141
+ after: 「## 背景。」「## 方針。」「## 課題。」
142
+ keep:
143
+ - 見出しの言葉と深さ
144
+ avoid:
145
+ - 少ないほうに合わせて、ほかの見出しをすべて書き換える
146
+ - 見出しを文に書き直す
147
+ en:
148
+ direction: End the heading the way most of the document's headings end. Only add or drop the mark; keep the heading's words.
149
+ pairs:
150
+ - before: '"## Preparation", "## Steps", "## Checks:"'
151
+ after: '"## Preparation", "## Steps", "## Checks"'
152
+ - before: '"## Background.", "## Plan.", "## Risks"'
153
+ after: '"## Background.", "## Plan.", "## Risks."'
154
+ keep:
155
+ - the heading's words and depth
156
+ avoid:
157
+ - rewriting every other heading to match the odd one
158
+ - turning the heading into a sentence
@@ -0,0 +1,59 @@
1
+ id: less-for-fewer
2
+ layer: L3
3
+ status: stable
4
+ how_to_find: amount-for-count
5
+ requires: [pos]
6
+ languages: [en]
7
+ extra_word_lists: [amount-quantifier, invariant-noun, finite-auxiliary]
8
+ severity: info
9
+
10
+ name:
11
+ ja: 数えられる名詞に less
12
+ en: '"Less" with a countable plural'
13
+
14
+ why:
15
+ ja: 英語の書き言葉では、量には less、数には fewer を使います(less time、fewer errors)。「less errors」「less people」は話し言葉ではよく聞きますが、改まった文書では誤りと読まれます。直後の名詞が数えられる複数とはっきり読める所だけを指します。名詞や数の後ろの less は「引く」の意味(revenue less costs)なので指しません。
16
+ en: 'Written English uses "less" for an amount and "fewer" for a count ("less time", "fewer errors"). "Less errors" and "less people" are common in speech, but a formal reader takes them as a slip. Only a "less" directly before a noun that reads clearly as a countable plural is reported. "Less" after a noun or a number means "minus" ("revenue less costs") and is not reported.'
17
+
18
+ message:
19
+ ja: 「{word}」は数を言うので「{suggestion}」と書きます
20
+ en: '"{word}" counts things; write "{suggestion}"'
21
+
22
+ how_to_fix:
23
+ ja: 数えられる名詞の複数の前では fewer を使ってください(less errors → fewer errors)。量を言いたいなら、名詞を量の語に替えてください(less work)。
24
+ en: Use "fewer" before a countable plural ("less errors" becomes "fewer errors"). To speak of an amount, use a word for the amount ("less work").
25
+
26
+ levels: { strict: warning, normal: info, relaxed: info }
27
+
28
+ use_for: [business, technical, blog, legal, docs, academic, literature, speech]
29
+ off_for:
30
+ literature: 'A narrator and a character speak as they speak: "less people" in dialogue is the voice.'
31
+ speech: "A transcript keeps the speaker's words."
32
+
33
+ group: slips
34
+ summary:
35
+ ja: 英語で、「less errors」のように数えられる名詞の複数に less を付けた所
36
+ en: '"Less" before a countable plural, as in "less errors", where written English uses "fewer"'
37
+ example:
38
+ en:
39
+ before: The new parser reports less errors on long files.
40
+ after: The new parser reports fewer errors on long files.
41
+
42
+ not_flagged:
43
+ ja: 量の名詞(less time、less work)、形容詞に付く less(less experienced staff)、「引く」の less(revenue less costs、$500 less fees)、less than、単数と複数が同じ綴りの名詞(less data)は指しません。
44
+ en: 'Mass nouns ("less time", "less work"), "less" before an adjective ("less experienced staff"), "less" meaning minus ("revenue less costs", "$500 less fees"), "less than", and nouns spelled alike in both numbers ("less data") are not reported.'
45
+
46
+ rewrite:
47
+ depth: light
48
+ en:
49
+ direction: Replace "less" with "fewer" before the countable plural. Change only that word.
50
+ pairs:
51
+ - before: The new parser reports less errors on long files.
52
+ after: The new parser reports fewer errors on long files.
53
+ - before: We hired less people in the spring.
54
+ after: We hired fewer people in the spring.
55
+ keep:
56
+ - the noun and the rest of the sentence
57
+ - '"less" before an amount ("less time") or meaning minus ("revenue less costs")'
58
+ avoid:
59
+ - turning every "less" into "fewer", including amounts