chaffjs 0.1.0 → 0.3.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.
- package/dist/backends/anthropic.d.ts +24 -0
- package/dist/backends/anthropic.d.ts.map +1 -0
- package/dist/backends/anthropic.js +44 -0
- package/dist/backends/anthropic.js.map +1 -0
- package/dist/backends/openai.d.ts +29 -0
- package/dist/backends/openai.d.ts.map +1 -0
- package/dist/backends/openai.js +33 -0
- package/dist/backends/openai.js.map +1 -0
- package/dist/backends/types.d.ts +32 -0
- package/dist/backends/types.d.ts.map +1 -0
- package/dist/backends/types.js +18 -0
- package/dist/backends/types.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +21 -67
- package/dist/cli.js.map +1 -1
- package/dist/commands/eval.d.ts +15 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/eval.js +47 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/test.d.ts +21 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +116 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/config/by-path.d.ts +15 -0
- package/dist/config/by-path.d.ts.map +1 -0
- package/dist/config/by-path.js +41 -0
- package/dist/config/by-path.js.map +1 -0
- package/dist/config/load.d.ts +8 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +31 -3
- package/dist/config/load.js.map +1 -1
- package/dist/detectors/agentless-passive.d.ts +3 -0
- package/dist/detectors/agentless-passive.d.ts.map +1 -0
- package/dist/detectors/agentless-passive.js +31 -0
- package/dist/detectors/agentless-passive.js.map +1 -0
- package/dist/detectors/char-shape.d.ts +12 -0
- package/dist/detectors/char-shape.d.ts.map +1 -0
- package/dist/detectors/char-shape.js +39 -0
- package/dist/detectors/char-shape.js.map +1 -0
- package/dist/detectors/count-per-section.d.ts +8 -1
- package/dist/detectors/count-per-section.d.ts.map +1 -1
- package/dist/detectors/count-per-section.js +26 -5
- package/dist/detectors/count-per-section.js.map +1 -1
- package/dist/detectors/en-shape.d.ts +19 -0
- package/dist/detectors/en-shape.d.ts.map +1 -0
- package/dist/detectors/en-shape.js +176 -0
- package/dist/detectors/en-shape.js.map +1 -0
- package/dist/detectors/index.d.ts.map +1 -1
- package/dist/detectors/index.js +33 -0
- package/dist/detectors/index.js.map +1 -1
- package/dist/detectors/lexicon.d.ts +15 -0
- package/dist/detectors/lexicon.d.ts.map +1 -0
- package/dist/detectors/lexicon.js +109 -0
- package/dist/detectors/lexicon.js.map +1 -0
- package/dist/detectors/repeated-head.d.ts.map +1 -1
- package/dist/detectors/repeated-head.js +17 -5
- package/dist/detectors/repeated-head.js.map +1 -1
- package/dist/detectors/sentence-ending.d.ts +3 -0
- package/dist/detectors/sentence-ending.d.ts.map +1 -0
- package/dist/detectors/sentence-ending.js +34 -0
- package/dist/detectors/sentence-ending.js.map +1 -0
- package/dist/detectors/sentence-length.d.ts.map +1 -1
- package/dist/detectors/sentence-length.js +3 -9
- package/dist/detectors/sentence-length.js.map +1 -1
- package/dist/detectors/sentence-rhythm.d.ts.map +1 -1
- package/dist/detectors/sentence-rhythm.js +3 -2
- package/dist/detectors/sentence-rhythm.js.map +1 -1
- package/dist/detectors/signals.d.ts +6 -0
- package/dist/detectors/signals.d.ts.map +1 -0
- package/dist/detectors/signals.js +183 -0
- package/dist/detectors/signals.js.map +1 -0
- package/dist/detectors/structure.d.ts +24 -0
- package/dist/detectors/structure.d.ts.map +1 -0
- package/dist/detectors/structure.js +111 -0
- package/dist/detectors/structure.js.map +1 -0
- package/dist/detectors/token-shape.d.ts +4 -0
- package/dist/detectors/token-shape.d.ts.map +1 -0
- package/dist/detectors/token-shape.js +62 -0
- package/dist/detectors/token-shape.js.map +1 -0
- package/dist/document.d.ts.map +1 -1
- package/dist/document.js +95 -12
- package/dist/document.js.map +1 -1
- package/dist/env.d.ts +12 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +20 -0
- package/dist/env.js.map +1 -0
- package/dist/eval.d.ts +31 -0
- package/dist/eval.d.ts.map +1 -0
- package/dist/eval.js +62 -0
- package/dist/eval.js.map +1 -0
- package/dist/genre.d.ts.map +1 -1
- package/dist/genre.js +8 -1
- package/dist/genre.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +11 -6
- package/dist/init.js.map +1 -1
- package/dist/judge.d.ts +14 -16
- package/dist/judge.d.ts.map +1 -1
- package/dist/judge.js +0 -0
- package/dist/judge.js.map +1 -1
- package/dist/levels.d.ts +1 -9
- package/dist/levels.d.ts.map +1 -1
- package/dist/levels.js +15 -3
- package/dist/levels.js.map +1 -1
- package/dist/look-at.d.ts +18 -0
- package/dist/look-at.d.ts.map +1 -0
- package/dist/look-at.js +43 -0
- package/dist/look-at.js.map +1 -0
- package/dist/measure.d.ts +15 -0
- package/dist/measure.d.ts.map +1 -0
- package/dist/measure.js +16 -0
- package/dist/measure.js.map +1 -0
- package/dist/plugin.d.ts +44 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/render/eval.d.ts +7 -0
- package/dist/render/eval.d.ts.map +1 -0
- package/dist/render/eval.js +59 -0
- package/dist/render/eval.js.map +1 -0
- package/dist/render/explain.d.ts +1 -1
- package/dist/render/explain.d.ts.map +1 -1
- package/dist/render/explain.js +12 -4
- package/dist/render/explain.js.map +1 -1
- package/dist/render/rules-json.d.ts.map +1 -1
- package/dist/render/rules-json.js +13 -5
- package/dist/render/rules-json.js.map +1 -1
- package/dist/render/semantic.d.ts +2 -1
- package/dist/render/semantic.d.ts.map +1 -1
- package/dist/render/semantic.js +35 -0
- package/dist/render/semantic.js.map +1 -1
- package/dist/rule-load.d.ts.map +1 -1
- package/dist/rule-load.js +27 -1
- package/dist/rule-load.js.map +1 -1
- package/dist/run-semantic.d.ts +22 -1
- package/dist/run-semantic.d.ts.map +1 -1
- package/dist/run-semantic.js +21 -10
- package/dist/run-semantic.js.map +1 -1
- package/dist/run.d.ts +6 -1
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +34 -2
- package/dist/run.js.map +1 -1
- package/dist/sentence-shape.d.ts +6 -0
- package/dist/sentence-shape.d.ts.map +1 -0
- package/dist/sentence-shape.js +15 -0
- package/dist/sentence-shape.js.map +1 -0
- package/package.json +4 -3
- package/rules/adverb-overuse.yaml +28 -0
- package/rules/agentless-passive.yaml +28 -0
- package/rules/ai-tell.yaml +27 -0
- package/rules/bold-density.yaml +8 -6
- package/rules/concrete-evidence-density.yaml +25 -0
- package/rules/cushion-phrase-density.yaml +26 -0
- package/rules/double-keigo.yaml +27 -0
- package/rules/emoji-density.yaml +26 -0
- package/rules/empty-intensifier.yaml +1 -1
- package/rules/excessive-hedging.yaml +26 -0
- package/rules/expletive-construction.yaml +27 -0
- package/rules/heading-echo.yaml +1 -1
- package/rules/hiragana-fukushi.yaml +27 -0
- package/rules/max-kanji-continuous.yaml +26 -0
- package/rules/max-paragraph-length.yaml +25 -0
- package/rules/max-sentence-length.yaml +23 -1
- package/rules/ngram-repetition.yaml +25 -0
- package/rules/no-doubled-joshi.yaml +28 -0
- package/rules/no-mixed-desumasu.yaml +29 -0
- package/rules/no-nakaguro-parallel.yaml +27 -0
- package/rules/oxford-comma-consistency.yaml +26 -0
- package/rules/paragraph-length-variance.yaml +25 -0
- package/rules/preamble-length.yaml +25 -0
- package/rules/repeated-conjunction.yaml +26 -0
- package/rules/repeated-sentence-head.yaml +1 -1
- package/rules/rule-of-three.yaml +25 -0
- package/rules/sasete-itadaku.yaml +27 -0
- package/rules/section-length-uniformity.yaml +25 -0
- package/rules/sentence-initial-conjunction-run.yaml +27 -0
- package/rules/taigen-dome-in-prose.yaml +27 -0
- package/rules/title-case-consistency.yaml +26 -0
- package/rules/undefined-acronym.yaml +25 -0
- package/rules/unqualified-superlative.yaml +26 -0
- package/src/backends/anthropic.ts +61 -0
- package/src/backends/openai.ts +46 -0
- package/src/backends/types.ts +38 -0
- package/src/cli.ts +19 -78
- package/src/commands/eval.ts +67 -0
- package/src/commands/test.ts +147 -0
- package/src/config/by-path.ts +47 -0
- package/src/config/load.ts +36 -3
- package/src/detectors/agentless-passive.ts +34 -0
- package/src/detectors/char-shape.ts +47 -0
- package/src/detectors/count-per-section.ts +30 -6
- package/src/detectors/en-shape.ts +187 -0
- package/src/detectors/index.ts +33 -0
- package/src/detectors/lexicon.ts +124 -0
- package/src/detectors/repeated-head.ts +17 -6
- package/src/detectors/sentence-ending.ts +37 -0
- package/src/detectors/sentence-length.ts +4 -10
- package/src/detectors/sentence-rhythm.ts +3 -2
- package/src/detectors/signals.ts +199 -0
- package/src/detectors/structure.ts +119 -0
- package/src/detectors/token-shape.ts +81 -0
- package/src/document.ts +101 -13
- package/src/env.ts +20 -0
- package/src/eval.ts +80 -0
- package/src/genre.ts +8 -1
- package/src/init.ts +11 -6
- package/src/judge.ts +0 -0
- package/src/levels.ts +16 -4
- package/src/look-at.ts +53 -0
- package/src/measure.ts +21 -0
- package/src/plugin.ts +45 -3
- package/src/render/eval.ts +62 -0
- package/src/render/explain.ts +12 -4
- package/src/render/rules-json.ts +16 -5
- package/src/render/semantic.ts +38 -1
- package/src/rule-load.ts +28 -1
- package/src/run-semantic.ts +32 -11
- package/src/run.ts +36 -3
- package/src/sentence-shape.ts +22 -0
package/dist/run-semantic.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-semantic.js","sourceRoot":"","sources":["../src/run-semantic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAkB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,GAAG,EAAqB,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,OAAO,EAAkB,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"run-semantic.js","sourceRoot":"","sources":["../src/run-semantic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAkB,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,GAAG,EAAqB,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,OAAO,EAAkB,MAAM,eAAe,CAAC;AACxD,OAAO,EAAE,MAAM,EAAkB,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAqBpD,MAAM,SAAS,GAAG,CAAC,IAAwB,EAA4B,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,gBAAgB,CAAC,IAAI,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;AAEvJ,MAAM,iBAAiB,GAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAEpF,MAAM,iBAAiB,GAAG,CAAC,IAAoB,EAAE,KAAY,EAAY,EAAE;IACzE,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAC5D,OAAO,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;AACrF,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,GAAkB,EAAE,KAAgC,EAAE,QAAyC,EAAE,KAAa,EAAS,EAAE,CAC5I,KAAK;KACF,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC;KAC/H,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;IAChB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1G,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3D,OAAO;QACL;YACE,IAAI,EAAE,IAAI,CAAC,EAAE;YACb,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC;YACxC,MAAM;YACN,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC;YAClD,QAAQ,EAAE,iBAAiB,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC;YAChE,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC;SAC7C;KACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEP,MAAM,QAAQ,GAAG,CAAC,GAAkB,EAAE,MAA4B,EAAE,KAAa,EAAS,EAAE,CAC1F,MAAM;KACH,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;KACpG,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;IACb,iDAAiD;IACjD,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1F,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,EAAE;QACd,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,cAAc,KAAK,CAAC,OAAO,EAAE;QAC/F,QAAQ,EAAE,KAAK,CAAC,UAAU;QAC1B,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;QACjC,UAAU;QACV,SAAS;KACV,CAAC;AACJ,CAAC,CAAC,CAAC;AAEP,MAAM,SAAS,GAAG,CAAC,GAAQ,EAAE,SAAoB,EAAE,MAAc,EAAE,UAAkB,EAAE,SAAiB,EAAE,MAAyB,EAAW,EAAE;IAC9I,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7C,uCAAuC;IACvC,MAAM,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;IAChE,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,QAAQ;QACR,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,MAAM,EAAE,EAAE,CAAC,MAAM;QACjB,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;QACnC,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE;KAChF,CAAC;AACJ,CAAC,CAAC;AAIF;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,GAAkB,EAClB,KAAgC,EAChC,MAA4B,EAC5B,QAAyC,EACzC,KAAa,EACN,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,GAAG,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAE3F,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAC9B,GAAkB,EAClB,KAAgC,EAChC,MAA4B,EAC5B,QAAyC,EACzC,KAAa,EACb,OAAwB,EACC,EAAE;IAC3B,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;IAC1H,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC/B,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CACnB,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;QACrC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,CAAC,CAAC;QAC9H,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,EAAE,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3I,CAAC,CAAC,CACH,CACF,CAAC;IACF,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAC1G,OAAO;QACP,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,aAAa,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM;QACnC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;KACrH,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/run.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Finding, Level, ProseDocument, RuleDefinition } from "./plugin.ts";
|
|
1
|
+
import type { AdapterNeeds, Finding, Level, ProseDocument, RuleDefinition } from "./plugin.ts";
|
|
2
2
|
export type Skipped = {
|
|
3
3
|
readonly rule: string;
|
|
4
4
|
readonly why: string;
|
|
@@ -10,5 +10,10 @@ export type RunResult = {
|
|
|
10
10
|
readonly forcedExperimental: readonly string[];
|
|
11
11
|
};
|
|
12
12
|
export type Settings = Readonly<Record<string, Level>>;
|
|
13
|
+
/**
|
|
14
|
+
* 解析器の初期化に払う代金を決める。動く rule が 1 本も要求しないなら読み込まない。
|
|
15
|
+
* capabilities は「払えばできる」の宣言なので、ここでは見ない。
|
|
16
|
+
*/
|
|
17
|
+
export declare const neededBy: (rules: readonly RuleDefinition[], settings: Settings, experimental: boolean, genre: string, language: string) => AdapterNeeds;
|
|
13
18
|
export declare const runRules: (doc: ProseDocument, rules: readonly RuleDefinition[], settings: Settings, experimental: boolean, genre: string) => RunResult;
|
|
14
19
|
//# sourceMappingURL=run.d.ts.map
|
package/dist/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG/F,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtE,MAAM,MAAM,SAAS,GAAG;IACtB,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IACrC,+DAA+D;IAC/D,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AA8BvD;;;GAGG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,SAAS,cAAc,EAAE,EAAE,UAAU,QAAQ,EAAE,cAAc,OAAO,EAAE,OAAO,MAAM,EAAE,UAAU,MAAM,KAAG,YAKtI,CAAC;AAQH,eAAO,MAAM,QAAQ,GAAI,KAAK,aAAa,EAAE,OAAO,SAAS,cAAc,EAAE,EAAE,UAAU,QAAQ,EAAE,cAAc,OAAO,EAAE,OAAO,MAAM,KAAG,SAoCzI,CAAC"}
|
package/dist/run.js
CHANGED
|
@@ -10,6 +10,35 @@ const levelFor = (rule, settings, experimental) => {
|
|
|
10
10
|
return "off";
|
|
11
11
|
return "normal";
|
|
12
12
|
};
|
|
13
|
+
const CAPABILITY_NAME = { pos: "品詞解析", lemma: "原形" };
|
|
14
|
+
/** 知らない要求は満たされていないものとして扱う。黙って無視すると、要求なしで動いてしまう。 */
|
|
15
|
+
const has = (capabilities, need) => {
|
|
16
|
+
if (need === "pos")
|
|
17
|
+
return capabilities.pos;
|
|
18
|
+
if (need === "lemma")
|
|
19
|
+
return capabilities.lemma;
|
|
20
|
+
return false;
|
|
21
|
+
};
|
|
22
|
+
/** 要求を満たさない rule は動かせない。満たさないまま動かすと「指摘 0 件」が保証に見える。 */
|
|
23
|
+
const unmet = (rule, doc) => {
|
|
24
|
+
if (rule.languages !== undefined && !rule.languages.includes(doc.language))
|
|
25
|
+
return `${doc.language} 向けの rule ではないため`;
|
|
26
|
+
const missing = rule.requires.find((need) => !has(doc.capabilities, need));
|
|
27
|
+
if (missing === undefined)
|
|
28
|
+
return undefined;
|
|
29
|
+
return `この言語では${CAPABILITY_NAME[missing] ?? missing}が使えないため`;
|
|
30
|
+
};
|
|
31
|
+
const forGenre = (rules, genre) => rules.filter((rule) => rule.use_for.some((target) => genre.startsWith(target)));
|
|
32
|
+
/**
|
|
33
|
+
* 解析器の初期化に払う代金を決める。動く rule が 1 本も要求しないなら読み込まない。
|
|
34
|
+
* capabilities は「払えばできる」の宣言なので、ここでは見ない。
|
|
35
|
+
*/
|
|
36
|
+
export const neededBy = (rules, settings, experimental, genre, language) => ({
|
|
37
|
+
pos: forGenre(rules, genre)
|
|
38
|
+
.filter((rule) => rule.layer !== "L4" && levelFor(rule, settings, experimental) !== "off")
|
|
39
|
+
.filter((rule) => rule.languages === undefined || rule.languages.includes(language))
|
|
40
|
+
.some((rule) => rule.requires.includes("pos") || rule.requires.includes("lemma")),
|
|
41
|
+
});
|
|
13
42
|
const place = (starts, finding) => {
|
|
14
43
|
const offset = finding.values["offset"];
|
|
15
44
|
const at = placeOf(starts, typeof offset === "number" ? offset : 0);
|
|
@@ -17,7 +46,7 @@ const place = (starts, finding) => {
|
|
|
17
46
|
};
|
|
18
47
|
export const runRules = (doc, rules, settings, experimental, genre) => {
|
|
19
48
|
const starts = lineStarts(doc.source);
|
|
20
|
-
const applicable = rules
|
|
49
|
+
const applicable = forGenre(rules, genre);
|
|
21
50
|
const forced = applicable
|
|
22
51
|
.filter((rule) => rule.status === "experimental" && settings[rule.id] !== undefined && settings[rule.id] !== "off")
|
|
23
52
|
.map((rule) => rule.id);
|
|
@@ -26,6 +55,9 @@ export const runRules = (doc, rules, settings, experimental, genre) => {
|
|
|
26
55
|
if (rule.layer === "L4") {
|
|
27
56
|
return { findings: acc.findings, skipped: [...acc.skipped, { rule: rule.id, why: "意味を読む検査のため(npx chaff test で動きます)" }] };
|
|
28
57
|
}
|
|
58
|
+
const blocked = unmet(rule, doc);
|
|
59
|
+
if (blocked !== undefined)
|
|
60
|
+
return { findings: acc.findings, skipped: [...acc.skipped, { rule: rule.id, why: blocked }] };
|
|
29
61
|
const level = levelFor(rule, settings, experimental);
|
|
30
62
|
if (level === "off") {
|
|
31
63
|
const why = rule.status === "experimental" && settings[rule.id] === undefined ? "まだ試験中のため" : "設定で止めているため";
|
|
@@ -35,7 +67,7 @@ export const runRules = (doc, rules, settings, experimental, genre) => {
|
|
|
35
67
|
if (detector === undefined)
|
|
36
68
|
return { findings: acc.findings, skipped: [...acc.skipped, { rule: rule.id, why: `検出器 ${rule.how_to_find} がないため` }] };
|
|
37
69
|
const options = {
|
|
38
|
-
limit: resolve(rule, level).limit,
|
|
70
|
+
limit: resolve(rule, level, genre).limit,
|
|
39
71
|
lexicon: rule.word_list === undefined ? undefined : doc.lexicons[rule.word_list],
|
|
40
72
|
where: rule.where,
|
|
41
73
|
};
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAapD,MAAM,QAAQ,GAAG,CAAC,IAAoB,EAAE,QAAkB,EAAE,YAAqB,EAAS,EAAE;IAC1F,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,6CAA6C;IAC7C,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAC5C,IAAI,IAAI,CAAC,MAAM,KAAK,cAAc,IAAI,CAAC,YAAY;QAAE,OAAO,KAAK,CAAC;IAClE,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Sentence, Token } from "./plugin.ts";
|
|
2
|
+
export declare const isClosed: (sentence: Sentence) => boolean;
|
|
3
|
+
export declare const hasPredicate: (sentence: Sentence) => boolean;
|
|
4
|
+
export declare const hasParticle: (sentence: Sentence) => boolean;
|
|
5
|
+
export declare const lastContent: (sentence: Sentence) => Token | undefined;
|
|
6
|
+
//# sourceMappingURL=sentence-shape.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentence-shape.d.ts","sourceRoot":"","sources":["../src/sentence-shape.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAWnD,eAAO,MAAM,QAAQ,GAAI,UAAU,QAAQ,KAAG,OAAmC,CAAC;AAIlF,eAAO,MAAM,YAAY,GAAI,UAAU,QAAQ,KAAG,OAA4E,CAAC;AAE/H,eAAO,MAAM,WAAW,GAAI,UAAU,QAAQ,KAAG,OAAgG,CAAC;AAIlJ,eAAO,MAAM,WAAW,GAAI,UAAU,QAAQ,KAAG,KAAK,GAAG,SAAyF,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 「これは文か」の判定を 1 箇所に置く。
|
|
3
|
+
*
|
|
4
|
+
* 段落として解析されるものには、見出しの下の名前だけの行(`OpenAI`)、引用の出典行、
|
|
5
|
+
* 表題行が混ざる。文として数えると、文書全体を分母にする rule がそこで狂う。
|
|
6
|
+
* 終止符で終わることを条件にすると、そのほとんどが落ちる。
|
|
7
|
+
*/
|
|
8
|
+
const ENDS = /[。..!?!?]["))」』\s]*$/u;
|
|
9
|
+
export const isClosed = (sentence) => ENDS.test(sentence.text);
|
|
10
|
+
const PREDICATE = new Set(["AUX", "VERB", "ADJ"]);
|
|
11
|
+
export const hasPredicate = (sentence) => (sentence.tokens ?? []).some((token) => PREDICATE.has(token.pos));
|
|
12
|
+
export const hasParticle = (sentence) => (sentence.tokens ?? []).some((token) => token.pos === "ADP" || token.pos === "SCONJ");
|
|
13
|
+
const SKIP = new Set(["PUNCT", "PART", "SYM"]);
|
|
14
|
+
export const lastContent = (sentence) => [...(sentence.tokens ?? [])].reverse().find((token) => !SKIP.has(token.pos));
|
|
15
|
+
//# sourceMappingURL=sentence-shape.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentence-shape.js","sourceRoot":"","sources":["../src/sentence-shape.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AACH,MAAM,IAAI,GAAG,uBAAuB,CAAC;AAErC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAkB,EAAW,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAElF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAElD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,QAAkB,EAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAE/H,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAkB,EAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,KAAK,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,CAAC;AAElJ,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAE/C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,QAAkB,EAAqB,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "chaffjs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.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",
|
|
@@ -52,13 +52,14 @@
|
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"@anthropic-ai/sdk": "^0.125.0",
|
|
55
|
-
"@chaffjs/lang-en": "0.
|
|
56
|
-
"@chaffjs/lang-ja": "0.
|
|
55
|
+
"@chaffjs/lang-en": "0.3.0",
|
|
56
|
+
"@chaffjs/lang-ja": "0.3.0",
|
|
57
57
|
"mdast-util-from-markdown": "^2.0.3",
|
|
58
58
|
"mdast-util-frontmatter": "^2.0.1",
|
|
59
59
|
"mdast-util-gfm-table": "^2.0.0",
|
|
60
60
|
"micromark-extension-frontmatter": "^2.0.0",
|
|
61
61
|
"micromark-extension-gfm-table": "^2.1.1",
|
|
62
|
+
"openai": "^7.15.0",
|
|
62
63
|
"yaml": "^2.9.0"
|
|
63
64
|
}
|
|
64
65
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
id: adverb-overuse
|
|
2
|
+
layer: L3
|
|
3
|
+
status: experimental
|
|
4
|
+
how_to_find: adverb-density
|
|
5
|
+
requires: [pos]
|
|
6
|
+
languages: [en]
|
|
7
|
+
severity: info
|
|
8
|
+
|
|
9
|
+
name:
|
|
10
|
+
ja: -ly 副詞が多い
|
|
11
|
+
en: Too many -ly adverbs
|
|
12
|
+
|
|
13
|
+
why:
|
|
14
|
+
ja: -ly 副詞は、動詞が弱いことの目印になります。"walked quickly" より "hurried" のほうが短く、絵が見えます。
|
|
15
|
+
en: An -ly adverb usually marks a weak verb. "Hurried" is shorter and sharper than "walked quickly".
|
|
16
|
+
|
|
17
|
+
message:
|
|
18
|
+
ja: 1000 語あたり {density} 個の -ly 副詞があります({limit} 個まで)
|
|
19
|
+
en: "{density} -ly adverbs per 1000 words (limit {limit})"
|
|
20
|
+
|
|
21
|
+
how_to_fix:
|
|
22
|
+
ja: 副詞ごと動詞に畳んでください。"said loudly" を "shouted" に。
|
|
23
|
+
en: Fold the adverb into the verb. "Said loudly" becomes "shouted".
|
|
24
|
+
|
|
25
|
+
# 1000 語あたりの個数。件数で数えると長い文書ほど当たる(bold-density と同じ)。
|
|
26
|
+
levels: { strict: 10, normal: 15, relaxed: 25 }
|
|
27
|
+
|
|
28
|
+
use_for: [blog, business]
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
id: agentless-passive
|
|
2
|
+
layer: L3
|
|
3
|
+
status: experimental
|
|
4
|
+
how_to_find: agentless-passive
|
|
5
|
+
word_list: agent-marker
|
|
6
|
+
requires: [pos]
|
|
7
|
+
severity: warning
|
|
8
|
+
|
|
9
|
+
name:
|
|
10
|
+
ja: 誰がしたのか書かれていない
|
|
11
|
+
en: Passive with no actor
|
|
12
|
+
|
|
13
|
+
why:
|
|
14
|
+
ja: 受動のまま動作主を書かないと、誰が決めたのか・誰がやるのかが文から消えます。読み手は責任の所在をたどれません。
|
|
15
|
+
en: A passive without an actor removes the person from the sentence. The reader cannot tell who decided, or who will act.
|
|
16
|
+
|
|
17
|
+
message:
|
|
18
|
+
ja: この文は「{word}」と受け身で書かれていますが、誰がしたのかがありません
|
|
19
|
+
en: 'This sentence is passive ("{word}") but never says who did it'
|
|
20
|
+
|
|
21
|
+
how_to_fix:
|
|
22
|
+
ja: 主語を立てて能動にしてください。「決定されました」を「運営チームが決定しました」に。誰かを名指せないなら、書けない理由のほうが問題かもしれません。
|
|
23
|
+
en: Name the actor and make it active. "It was decided" becomes "the steering group decided". If you cannot name anyone, the reason you cannot is the real finding.
|
|
24
|
+
|
|
25
|
+
# 1 文に受け身がいくつまで許されるか。1 は「1 つでも指摘する」。
|
|
26
|
+
levels: { strict: 1, normal: 1, relaxed: 2 }
|
|
27
|
+
|
|
28
|
+
use_for: [business]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
id: ai-tell
|
|
2
|
+
layer: L2
|
|
3
|
+
status: experimental
|
|
4
|
+
how_to_find: ai-tell
|
|
5
|
+
word_list: ai-tell
|
|
6
|
+
severity: info
|
|
7
|
+
|
|
8
|
+
name:
|
|
9
|
+
ja: 生成文にありがちな言い回し
|
|
10
|
+
en: Phrasing common in generated text
|
|
11
|
+
|
|
12
|
+
why:
|
|
13
|
+
ja: どれも単独では普通の日本語です。重なったときだけ意味があるので、重みを足し合わせて出しています。これだけで「AI が書いた」とは言えません。
|
|
14
|
+
en: Each is ordinary on its own. Only the pile-up means anything, so the weights are summed. This alone never says the text was generated.
|
|
15
|
+
|
|
16
|
+
message:
|
|
17
|
+
ja: 「{word}」が揃っています(点 {density}、{limit} まで)
|
|
18
|
+
en: '"{word}" appear together (score {density}, limit {limit})'
|
|
19
|
+
|
|
20
|
+
how_to_fix:
|
|
21
|
+
ja: 自分の言葉に置き換えてください。置き換えられないなら、その段落は無くても通るかもしれません。
|
|
22
|
+
en: Put it in your own words. If you cannot, the paragraph may not be needed.
|
|
23
|
+
|
|
24
|
+
# 重みの合計を 10 倍した点。0.9 の言い回しが 2 つで 18。
|
|
25
|
+
levels: { strict: 10, normal: 18, relaxed: 30 }
|
|
26
|
+
|
|
27
|
+
use_for: [blog, business]
|
package/rules/bold-density.yaml
CHANGED
|
@@ -13,16 +13,18 @@ why:
|
|
|
13
13
|
en: Bold marks what matters. Used everywhere, it marks nothing.
|
|
14
14
|
|
|
15
15
|
message:
|
|
16
|
-
ja:
|
|
17
|
-
en: "{
|
|
16
|
+
ja: このセクションは {chars} 字に太字が {bolds} 箇所あります(1000 字あたり {limit} 箇所まで)
|
|
17
|
+
en: "{bolds} bold spans in {chars} characters (limit {limit} per 1000)"
|
|
18
18
|
|
|
19
19
|
how_to_fix:
|
|
20
20
|
ja: 本当に強調したい 1〜2 箇所だけ残して、ほかは普通の文にしてください。
|
|
21
21
|
en: Keep one or two, unbold the rest.
|
|
22
22
|
|
|
23
|
+
# 1000 字あたりの太字の数。件数ではなく密度で測る。
|
|
24
|
+
# 件数で数えると節が長いほど当たるので、読者が受け取る印象と合わない。
|
|
23
25
|
levels:
|
|
24
|
-
strict:
|
|
25
|
-
normal:
|
|
26
|
-
relaxed:
|
|
26
|
+
strict: 10
|
|
27
|
+
normal: 20
|
|
28
|
+
relaxed: 40
|
|
27
29
|
|
|
28
|
-
use_for: [blog, business]
|
|
30
|
+
use_for: [blog, business, technical]
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
id: concrete-evidence-density
|
|
2
|
+
layer: L1
|
|
3
|
+
status: experimental
|
|
4
|
+
how_to_find: concrete-evidence
|
|
5
|
+
severity: info
|
|
6
|
+
|
|
7
|
+
name:
|
|
8
|
+
ja: 具体物のない節がある
|
|
9
|
+
en: Section with nothing concrete
|
|
10
|
+
|
|
11
|
+
why:
|
|
12
|
+
ja: 数値もコードもリンクも無い節は、読み終えても持ち帰るものがありません。抽象的な説明だけが残ります。
|
|
13
|
+
en: A section with no number, no code and no link leaves the reader with nothing to take away.
|
|
14
|
+
|
|
15
|
+
message:
|
|
16
|
+
ja: 「{word}」の節に数値もコードもリンクもありません(そういう節が {count}/{total})
|
|
17
|
+
en: 'Section "{word}" has no number, code or link ({count} of {total} sections)'
|
|
18
|
+
|
|
19
|
+
how_to_fix:
|
|
20
|
+
ja: 実例を 1 つ足してください。書けないなら、その節は他の節に畳めるかもしれません。
|
|
21
|
+
en: Add one example. If you cannot, the section may belong inside another one.
|
|
22
|
+
|
|
23
|
+
levels: { strict: 1, normal: 3, relaxed: 6 }
|
|
24
|
+
|
|
25
|
+
use_for: [blog, business, technical]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
id: cushion-phrase-density
|
|
2
|
+
layer: L2
|
|
3
|
+
status: experimental
|
|
4
|
+
how_to_find: cushion-density
|
|
5
|
+
word_list: cushion-phrase
|
|
6
|
+
severity: info
|
|
7
|
+
|
|
8
|
+
name:
|
|
9
|
+
ja: クッション言葉が多い
|
|
10
|
+
en: Too many softeners
|
|
11
|
+
|
|
12
|
+
why:
|
|
13
|
+
ja: 1 つなら礼儀ですが、重なるほど本題が遠ざかります。読み手は用件を探して読み進めることになります。
|
|
14
|
+
en: One softener is courtesy. Several push the point further away, and the reader has to hunt for it.
|
|
15
|
+
|
|
16
|
+
message:
|
|
17
|
+
ja: 「{matched}」など、クッション言葉が 1000 語あたり {density} 個あります({limit} 個まで)
|
|
18
|
+
en: '"{matched}" and other softeners: {density} per 1000 words (limit {limit})'
|
|
19
|
+
|
|
20
|
+
how_to_fix:
|
|
21
|
+
ja: 最初の 1 つだけ残して、あとは用件を先に書いてください。
|
|
22
|
+
en: Keep the first one. Lead with the request after that.
|
|
23
|
+
|
|
24
|
+
levels: { strict: 2, normal: 5, relaxed: 10 }
|
|
25
|
+
|
|
26
|
+
use_for: [business]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
id: double-keigo
|
|
2
|
+
layer: L3
|
|
3
|
+
status: experimental
|
|
4
|
+
how_to_find: phrase-match
|
|
5
|
+
word_list: double-keigo
|
|
6
|
+
languages: [ja]
|
|
7
|
+
severity: warning
|
|
8
|
+
|
|
9
|
+
name:
|
|
10
|
+
ja: 二重敬語
|
|
11
|
+
en: Doubled honorific
|
|
12
|
+
|
|
13
|
+
why:
|
|
14
|
+
ja: 1 つの動詞に同じ種類の敬語を二重にかけた形です。丁寧さは増えず、読み手には不自然に映ります。
|
|
15
|
+
en: The same kind of honorific applied twice to one verb. It does not read as more polite, only as awkward.
|
|
16
|
+
|
|
17
|
+
message:
|
|
18
|
+
ja: 「{matched}」は敬語が二重になっています
|
|
19
|
+
en: '"{matched}" applies the honorific twice'
|
|
20
|
+
|
|
21
|
+
how_to_fix:
|
|
22
|
+
ja: どちらか一方にしてください。「おっしゃられました」は「おっしゃいました」で足ります。
|
|
23
|
+
en: Keep one. "Said" with a single honorific is enough.
|
|
24
|
+
|
|
25
|
+
levels: { strict: 1, normal: 1, relaxed: 2 }
|
|
26
|
+
|
|
27
|
+
use_for: [business]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
id: emoji-density
|
|
2
|
+
layer: L1
|
|
3
|
+
status: experimental
|
|
4
|
+
how_to_find: emoji-density
|
|
5
|
+
severity: info
|
|
6
|
+
|
|
7
|
+
name:
|
|
8
|
+
ja: 絵文字が多い
|
|
9
|
+
en: Too many emoji
|
|
10
|
+
|
|
11
|
+
why:
|
|
12
|
+
ja: 絵文字は 1 つなら目印になりますが、並ぶと文字そのものが読めなくなります。読み上げ環境では意味を持たない音が増えます。
|
|
13
|
+
en: One emoji marks a spot. Many turn the text into decoration, and a screen reader has to say all of them.
|
|
14
|
+
|
|
15
|
+
message:
|
|
16
|
+
ja: 1000 語あたり {density} 個の絵文字があります({limit} 個まで)
|
|
17
|
+
en: "{density} emoji per 1000 words (limit {limit})"
|
|
18
|
+
|
|
19
|
+
how_to_fix:
|
|
20
|
+
ja: 見出しや強調で代えられるものは代えてください。
|
|
21
|
+
en: Where a heading or emphasis would do the same job, use that instead.
|
|
22
|
+
|
|
23
|
+
# 1000 語あたりの個数。件数で数えると長い文書ほど当たる。
|
|
24
|
+
levels: { strict: 3, normal: 8, relaxed: 20 }
|
|
25
|
+
|
|
26
|
+
use_for: [blog, business, technical]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
id: excessive-hedging
|
|
2
|
+
layer: L2
|
|
3
|
+
status: experimental
|
|
4
|
+
how_to_find: hedging-density
|
|
5
|
+
word_list: excessive-hedging
|
|
6
|
+
severity: warning
|
|
7
|
+
|
|
8
|
+
name:
|
|
9
|
+
ja: 逃げの表現が多い
|
|
10
|
+
en: Too much hedging
|
|
11
|
+
|
|
12
|
+
why:
|
|
13
|
+
ja: 断言を避けるほど、読み手は何が決まったのか分からなくなります。1 つなら慎重さですが、重なると誰も責任を取らない文書になります。
|
|
14
|
+
en: The more the text avoids claiming, the less the reader can tell what was decided. One hedge is caution; many mean nobody is accountable.
|
|
15
|
+
|
|
16
|
+
message:
|
|
17
|
+
ja: 「{matched}」など、逃げの表現が 1000 語あたり {density} 個あります({limit} 個まで)
|
|
18
|
+
en: '"{matched}" and other hedges: {density} per 1000 words (limit {limit})'
|
|
19
|
+
|
|
20
|
+
how_to_fix:
|
|
21
|
+
ja: 言い切れるものは言い切ってください。言い切れないなら、何が分かれば言い切れるのかを書いてください。
|
|
22
|
+
en: Commit where you can. Where you cannot, say what you would need to know.
|
|
23
|
+
|
|
24
|
+
levels: { strict: 3, normal: 6, relaxed: 12 }
|
|
25
|
+
|
|
26
|
+
use_for: [business, blog, technical]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
id: expletive-construction
|
|
2
|
+
layer: L3
|
|
3
|
+
status: experimental
|
|
4
|
+
how_to_find: expletive
|
|
5
|
+
requires: [pos]
|
|
6
|
+
languages: [en]
|
|
7
|
+
severity: info
|
|
8
|
+
|
|
9
|
+
name:
|
|
10
|
+
ja: 主語を後ろへ押しやる書き出し
|
|
11
|
+
en: Expletive construction
|
|
12
|
+
|
|
13
|
+
why:
|
|
14
|
+
ja: "There is / It is ... that は、主語を後ろへ押しやって誰が何をするのかを消します。"
|
|
15
|
+
en: '"There is" and "it is ... that" push the subject to the back and drop who does what.'
|
|
16
|
+
|
|
17
|
+
message:
|
|
18
|
+
ja: '"{word} is ..." の形が文書内に {count} 回あります({limit} 回まで)'
|
|
19
|
+
en: '"{word} is ..." appears {count} times (limit {limit})'
|
|
20
|
+
|
|
21
|
+
how_to_fix:
|
|
22
|
+
ja: 主語を前に出してください。"There is a need to review" を "The board must review" に。
|
|
23
|
+
en: Put the subject first. "There is a need to review" becomes "the board must review".
|
|
24
|
+
|
|
25
|
+
levels: { strict: 1, normal: 3, relaxed: 6 }
|
|
26
|
+
|
|
27
|
+
use_for: [blog, business]
|
package/rules/heading-echo.yaml
CHANGED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
id: hiragana-fukushi
|
|
2
|
+
layer: L3
|
|
3
|
+
status: experimental
|
|
4
|
+
how_to_find: phrase-match
|
|
5
|
+
word_list: hiragana-fukushi
|
|
6
|
+
languages: [ja]
|
|
7
|
+
severity: info
|
|
8
|
+
|
|
9
|
+
name:
|
|
10
|
+
ja: 副詞は ひらがなで
|
|
11
|
+
en: Adverb better in kana
|
|
12
|
+
|
|
13
|
+
why:
|
|
14
|
+
ja: 表外漢字の副詞は、読める人と読めない人が分かれます。ひらがなで書けば誰でも読めて、意味は変わりません。公用文でかな書きと決まっているものだけを見ています。
|
|
15
|
+
en: Adverbs written with rare kanji split readers into those who can read them and those who cannot. Kana costs nothing.
|
|
16
|
+
|
|
17
|
+
message:
|
|
18
|
+
ja: 「{matched}」は ひらがなで書くのが読みやすいです
|
|
19
|
+
en: '"{matched}" reads more easily in kana'
|
|
20
|
+
|
|
21
|
+
how_to_fix:
|
|
22
|
+
ja: かなに開いてください。「殆ど」は「ほとんど」、「勿論」は「もちろん」。
|
|
23
|
+
en: Write it in kana.
|
|
24
|
+
|
|
25
|
+
levels: { strict: 1, normal: 1, relaxed: 3 }
|
|
26
|
+
|
|
27
|
+
use_for: [blog, business, technical]
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
id: max-kanji-continuous
|
|
2
|
+
layer: L3
|
|
3
|
+
status: experimental
|
|
4
|
+
how_to_find: kanji-run
|
|
5
|
+
languages: [ja]
|
|
6
|
+
severity: warning
|
|
7
|
+
|
|
8
|
+
name:
|
|
9
|
+
ja: 漢字が続きすぎている
|
|
10
|
+
en: Long run of kanji
|
|
11
|
+
|
|
12
|
+
why:
|
|
13
|
+
ja: 漢字が続くと、どこで語が切れるのか読み手が探すことになります。「情報処理推進機構認定試験」は 12 字あり、区切りが見えません。
|
|
14
|
+
en: A long unbroken run of kanji forces the reader to hunt for word boundaries.
|
|
15
|
+
|
|
16
|
+
message:
|
|
17
|
+
ja: 「{word}」は漢字が {count} 字続いています({limit} 字まで)
|
|
18
|
+
en: '"{word}" runs {count} kanji together (limit {limit})'
|
|
19
|
+
|
|
20
|
+
how_to_fix:
|
|
21
|
+
ja: ひらがなを 1 つ挟むか、助詞で割ってください。「情報処理推進機構の認定試験」に。
|
|
22
|
+
en: Break it with a particle or kana.
|
|
23
|
+
|
|
24
|
+
levels: { strict: 6, normal: 8, relaxed: 12 }
|
|
25
|
+
|
|
26
|
+
use_for: [blog, business, technical]
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
id: max-paragraph-length
|
|
2
|
+
layer: L1
|
|
3
|
+
status: experimental
|
|
4
|
+
how_to_find: paragraph-length
|
|
5
|
+
severity: warning
|
|
6
|
+
|
|
7
|
+
name:
|
|
8
|
+
ja: 段落が長すぎる
|
|
9
|
+
en: Paragraph too long
|
|
10
|
+
|
|
11
|
+
why:
|
|
12
|
+
ja: 1 段落に文を詰めると、読み手はどこで息継ぎしていいか分からなくなります。
|
|
13
|
+
en: A dense paragraph gives the reader nowhere to pause.
|
|
14
|
+
|
|
15
|
+
message:
|
|
16
|
+
ja: この段落は {count} 文あります({limit} 文まで)
|
|
17
|
+
en: This paragraph runs {count} sentences (limit {limit})
|
|
18
|
+
|
|
19
|
+
how_to_fix:
|
|
20
|
+
ja: 話題の変わり目で段落を割ってください。
|
|
21
|
+
en: Split it where the topic turns.
|
|
22
|
+
|
|
23
|
+
levels: { strict: 3, normal: 5, relaxed: 8 }
|
|
24
|
+
|
|
25
|
+
use_for: [blog, business, technical]
|
|
@@ -25,4 +25,26 @@ levels:
|
|
|
25
25
|
ja: { strict: 70, normal: 100, relaxed: 140 }
|
|
26
26
|
en: { strict: 18, normal: 25, relaxed: 35 }
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
# ジャンルで読まれかたが違う。spec §9 の初期値。
|
|
29
|
+
# 社内メールの 1 文と随筆の 1 文に同じ上限を課すと、どちらかが必ず間違う。
|
|
30
|
+
by_genre:
|
|
31
|
+
business/email:
|
|
32
|
+
ja: { strict: 50, normal: 70, relaxed: 100 }
|
|
33
|
+
en: { strict: 12, normal: 18, relaxed: 25 }
|
|
34
|
+
business/meeting-notes:
|
|
35
|
+
ja: { strict: 60, normal: 80, relaxed: 110 }
|
|
36
|
+
en: { strict: 14, normal: 20, relaxed: 28 }
|
|
37
|
+
business/proposal:
|
|
38
|
+
ja: { strict: 65, normal: 90, relaxed: 125 }
|
|
39
|
+
en: { strict: 16, normal: 22, relaxed: 30 }
|
|
40
|
+
business/press-release:
|
|
41
|
+
ja: { strict: 65, normal: 90, relaxed: 125 }
|
|
42
|
+
en: { strict: 16, normal: 22, relaxed: 30 }
|
|
43
|
+
blog/essay:
|
|
44
|
+
ja: { strict: 100, normal: 140, relaxed: 180 }
|
|
45
|
+
en: { strict: 25, normal: 35, relaxed: 45 }
|
|
46
|
+
blog/owned-media:
|
|
47
|
+
ja: { strict: 65, normal: 90, relaxed: 125 }
|
|
48
|
+
en: { strict: 16, normal: 22, relaxed: 30 }
|
|
49
|
+
|
|
50
|
+
use_for: [blog, business, technical]
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
id: ngram-repetition
|
|
2
|
+
layer: L1
|
|
3
|
+
status: experimental
|
|
4
|
+
how_to_find: ngram-repetition
|
|
5
|
+
severity: info
|
|
6
|
+
|
|
7
|
+
name:
|
|
8
|
+
ja: 同じ言い回しの繰り返し
|
|
9
|
+
en: Repeated phrasing
|
|
10
|
+
|
|
11
|
+
why:
|
|
12
|
+
ja: 同じ言い回しが何度も出ると、読み手は新しいことが書かれていないと感じます。文字の並びで見ているので、どの言語でも同じように効きます。
|
|
13
|
+
en: The same phrasing again and again reads as nothing new being said. Measured on character n-grams, so it works the same in any language.
|
|
14
|
+
|
|
15
|
+
message:
|
|
16
|
+
ja: 「{word}」が {count} 回出てきます({limit} 回まで)
|
|
17
|
+
en: '"{word}" appears {count} times (limit {limit})'
|
|
18
|
+
|
|
19
|
+
how_to_fix:
|
|
20
|
+
ja: 2 回目以降を言い換えるか、まとめて 1 度にしてください。
|
|
21
|
+
en: Rephrase the repeats, or say it once.
|
|
22
|
+
|
|
23
|
+
levels: { strict: 3, normal: 5, relaxed: 9 }
|
|
24
|
+
|
|
25
|
+
use_for: [blog, business, technical]
|