slopless 0.2.5 → 0.2.7

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 (283) hide show
  1. package/README.md +43 -124
  2. package/dist/adapters/textlint/report.js +51 -0
  3. package/dist/adapters/textlint/report.js.map +1 -0
  4. package/dist/adapters/textlint/units.js +28 -0
  5. package/dist/adapters/textlint/units.js.map +1 -0
  6. package/dist/cli.js +77 -5
  7. package/dist/cli.js.map +1 -1
  8. package/dist/index.js +4 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/presets/everything.js +8 -1
  11. package/dist/presets/everything.js.map +1 -1
  12. package/dist/registries/academic-slop.js +5 -0
  13. package/dist/registries/academic-slop.js.map +1 -0
  14. package/dist/registries/metrics.js +6 -6
  15. package/dist/registries/metrics.js.map +1 -1
  16. package/dist/registries/narrative-slop.js +11 -0
  17. package/dist/registries/narrative-slop.js.map +1 -0
  18. package/dist/registries/orthography.js +6 -6
  19. package/dist/registries/orthography.js.map +1 -1
  20. package/dist/registries/phrases.js +13 -9
  21. package/dist/registries/phrases.js.map +1 -1
  22. package/dist/registries/semantic-thinness.js +1 -1
  23. package/dist/registries/semantic-thinness.js.map +1 -1
  24. package/dist/registries/syntactic-patterns/authority.js +1 -1
  25. package/dist/registries/syntactic-patterns/authority.js.map +1 -1
  26. package/dist/registries/syntactic-patterns/closers.js +4 -4
  27. package/dist/registries/syntactic-patterns/closers.js.map +1 -1
  28. package/dist/registries/syntactic-patterns/contrast.js +3 -3
  29. package/dist/registries/syntactic-patterns/contrast.js.map +1 -1
  30. package/dist/registries/syntactic-patterns/generalization.js +2 -2
  31. package/dist/registries/syntactic-patterns/generalization.js.map +1 -1
  32. package/dist/registries/syntactic-patterns/lead-ins.js +5 -5
  33. package/dist/registries/syntactic-patterns/lead-ins.js.map +1 -1
  34. package/dist/registries/syntactic-patterns/llm-artifacts.js +1 -1
  35. package/dist/registries/syntactic-patterns/llm-artifacts.js.map +1 -1
  36. package/dist/registries/syntactic-patterns/repetition.js +4 -4
  37. package/dist/registries/syntactic-patterns/repetition.js.map +1 -1
  38. package/dist/registries/term-policy.js +2 -2
  39. package/dist/registries/term-policy.js.map +1 -1
  40. package/dist/registries/words.js +4 -4
  41. package/dist/registries/words.js.map +1 -1
  42. package/dist/reporting/reports.js +92 -0
  43. package/dist/reporting/reports.js.map +1 -0
  44. package/dist/reporting/types.js +2 -0
  45. package/dist/reporting/types.js.map +1 -0
  46. package/dist/rules/academic-slop/data/tortured-phrases.json +8 -0
  47. package/dist/rules/academic-slop/tortured-phrases.js +27 -0
  48. package/dist/rules/academic-slop/tortured-phrases.js.map +1 -0
  49. package/dist/{families → rules}/metrics/avg-sentence-length.js +8 -4
  50. package/dist/rules/metrics/avg-sentence-length.js.map +1 -0
  51. package/dist/{families → rules}/metrics/coleman-liau.js +8 -4
  52. package/dist/rules/metrics/coleman-liau.js.map +1 -0
  53. package/dist/{families → rules}/metrics/flesch-kincaid.js +8 -4
  54. package/dist/rules/metrics/flesch-kincaid.js.map +1 -0
  55. package/dist/{families → rules}/metrics/gunning-fog.js +8 -4
  56. package/dist/rules/metrics/gunning-fog.js.map +1 -0
  57. package/dist/rules/metrics/paragraph-length.js +25 -0
  58. package/dist/rules/metrics/paragraph-length.js.map +1 -0
  59. package/dist/{families → rules}/metrics/word-repetition.js +8 -4
  60. package/dist/rules/metrics/word-repetition.js.map +1 -0
  61. package/dist/rules/narrative-slop/body-action-density.js +198 -0
  62. package/dist/rules/narrative-slop/body-action-density.js.map +1 -0
  63. package/dist/rules/narrative-slop/data/narrative-cliches.json +134 -0
  64. package/dist/rules/narrative-slop/flat-action-cadence.js +322 -0
  65. package/dist/rules/narrative-slop/flat-action-cadence.js.map +1 -0
  66. package/dist/rules/narrative-slop/narrative-cliches.js +46 -0
  67. package/dist/rules/narrative-slop/narrative-cliches.js.map +1 -0
  68. package/dist/rules/narrative-slop/perception-verb-density.js +84 -0
  69. package/dist/rules/narrative-slop/perception-verb-density.js.map +1 -0
  70. package/dist/{families → rules}/orthography/colon-dramatic.js +11 -7
  71. package/dist/rules/orthography/colon-dramatic.js.map +1 -0
  72. package/dist/{families → rules}/orthography/em-dashes.js +11 -7
  73. package/dist/rules/orthography/em-dashes.js.map +1 -0
  74. package/dist/{families → rules}/orthography/exclamation-density.js +11 -7
  75. package/dist/rules/orthography/exclamation-density.js.map +1 -0
  76. package/dist/{families → rules}/orthography/fake-timestamps.js +11 -7
  77. package/dist/rules/orthography/fake-timestamps.js.map +1 -0
  78. package/dist/{families → rules}/orthography/sentence-case.js +7 -2
  79. package/dist/rules/orthography/sentence-case.js.map +1 -0
  80. package/dist/{families → rules}/orthography/smart-quotes.js +11 -7
  81. package/dist/rules/orthography/smart-quotes.js.map +1 -0
  82. package/dist/rules/phrases/cliches.js +43 -0
  83. package/dist/rules/phrases/cliches.js.map +1 -0
  84. package/dist/rules/phrases/corporate-speak.js +32 -0
  85. package/dist/rules/phrases/corporate-speak.js.map +1 -0
  86. package/dist/rules/phrases/data/cliche-templates.json +20 -0
  87. package/dist/{families → rules}/phrases/data/cliches.json +73 -1
  88. package/dist/rules/phrases/data/corporate-abstraction-patterns.json +80 -0
  89. package/dist/{families → rules}/phrases/data/corporate-speak.json +0 -3
  90. package/dist/rules/phrases/data/llm-disclaimer-expansions.json +4 -0
  91. package/dist/{families → rules}/phrases/data/prohibited-phrases.json +0 -1
  92. package/dist/rules/phrases/data/redundancy-patterns.json +74 -0
  93. package/dist/rules/phrases/data/wordiness-patterns.json +53 -0
  94. package/dist/rules/phrases/humble-bragger.js +30 -0
  95. package/dist/rules/phrases/humble-bragger.js.map +1 -0
  96. package/dist/{families → rules}/phrases/jargon-faker.js +11 -7
  97. package/dist/rules/phrases/jargon-faker.js.map +1 -0
  98. package/dist/{families → rules}/phrases/llm-disclaimer.js +21 -8
  99. package/dist/rules/phrases/llm-disclaimer.js.map +1 -0
  100. package/dist/rules/phrases/prohibited-phrases.js +27 -0
  101. package/dist/rules/phrases/prohibited-phrases.js.map +1 -0
  102. package/dist/rules/phrases/redundancy.js +27 -0
  103. package/dist/rules/phrases/redundancy.js.map +1 -0
  104. package/dist/{families → rules}/phrases/skunked-terms.js +8 -4
  105. package/dist/rules/phrases/skunked-terms.js.map +1 -0
  106. package/dist/{families → rules}/phrases/uncomparables.js +8 -4
  107. package/dist/rules/phrases/uncomparables.js.map +1 -0
  108. package/dist/rules/phrases/wordiness.js +27 -0
  109. package/dist/rules/phrases/wordiness.js.map +1 -0
  110. package/dist/rules/semantic-thinness/patterns/abstract-personification-line.json +23 -0
  111. package/dist/rules/semantic-thinness/patterns/emotion-as-substance.json +95 -0
  112. package/dist/rules/semantic-thinness/patterns/fixed-metaphor-frame.json +32 -0
  113. package/dist/rules/semantic-thinness/patterns/sensory-instead-of-frame.json +40 -0
  114. package/dist/rules/semantic-thinness/patterns/summary-fog-transition.json +30 -0
  115. package/dist/{families → rules}/semantic-thinness/private/pattern-data-a.js +2 -0
  116. package/dist/rules/semantic-thinness/private/pattern-data-a.js.map +1 -0
  117. package/dist/rules/semantic-thinness/private/pattern-data-b.js.map +1 -0
  118. package/dist/rules/semantic-thinness/private/pattern-data-c.js +17 -0
  119. package/dist/rules/semantic-thinness/private/pattern-data-c.js.map +1 -0
  120. package/dist/rules/semantic-thinness/private/pattern-data-d.js.map +1 -0
  121. package/dist/rules/semantic-thinness/private/pattern-data.js.map +1 -0
  122. package/dist/rules/semantic-thinness/private/pattern-matcher.js.map +1 -0
  123. package/dist/{families → rules}/semantic-thinness/semantic-thinness.js +11 -7
  124. package/dist/rules/semantic-thinness/semantic-thinness.js.map +1 -0
  125. package/dist/{families → rules}/syntactic-patterns/authority/authority-padding.js +11 -7
  126. package/dist/rules/syntactic-patterns/authority/authority-padding.js.map +1 -0
  127. package/dist/{families → rules}/syntactic-patterns/closers/affirmation-closers.js +20 -13
  128. package/dist/rules/syntactic-patterns/closers/affirmation-closers.js.map +1 -0
  129. package/dist/{families → rules}/syntactic-patterns/closers/boilerplate-conclusion.js +11 -7
  130. package/dist/rules/syntactic-patterns/closers/boilerplate-conclusion.js.map +1 -0
  131. package/dist/{families → rules}/syntactic-patterns/closers/false-question.js +11 -7
  132. package/dist/rules/syntactic-patterns/closers/false-question.js.map +1 -0
  133. package/dist/{families → rules}/syntactic-patterns/closers/summative-closer.js +11 -7
  134. package/dist/rules/syntactic-patterns/closers/summative-closer.js.map +1 -0
  135. package/dist/{families → rules}/syntactic-patterns/contrast/blame-reframe.js +11 -7
  136. package/dist/rules/syntactic-patterns/contrast/blame-reframe.js.map +1 -0
  137. package/dist/{families → rules}/syntactic-patterns/contrast/contrastive-aphorism.js +10 -7
  138. package/dist/rules/syntactic-patterns/contrast/contrastive-aphorism.js.map +1 -0
  139. package/dist/rules/syntactic-patterns/contrast/negation-reframe.js +24 -0
  140. package/dist/rules/syntactic-patterns/contrast/negation-reframe.js.map +1 -0
  141. package/dist/{families → rules}/syntactic-patterns/contrast/private/negation-reframe-matcher.js +22 -5
  142. package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-matcher.js.map +1 -0
  143. package/dist/{families → rules}/syntactic-patterns/contrast/private/negation-reframe-parts.js +55 -0
  144. package/dist/rules/syntactic-patterns/contrast/private/negation-reframe-parts.js.map +1 -0
  145. package/dist/rules/syntactic-patterns/contrast/private/negative-slop-frames.js +103 -0
  146. package/dist/rules/syntactic-patterns/contrast/private/negative-slop-frames.js.map +1 -0
  147. package/dist/{families → rules}/syntactic-patterns/generalization/softening-language.js +11 -7
  148. package/dist/rules/syntactic-patterns/generalization/softening-language.js.map +1 -0
  149. package/dist/{families → rules}/syntactic-patterns/generalization/universalizing-claims.js +11 -7
  150. package/dist/rules/syntactic-patterns/generalization/universalizing-claims.js.map +1 -0
  151. package/dist/{families → rules}/syntactic-patterns/lead-ins/boilerplate-framing.js +11 -7
  152. package/dist/rules/syntactic-patterns/lead-ins/boilerplate-framing.js.map +1 -0
  153. package/dist/{families → rules}/syntactic-patterns/lead-ins/generic-signposting.js +11 -7
  154. package/dist/rules/syntactic-patterns/lead-ins/generic-signposting.js.map +1 -0
  155. package/dist/{families → rules}/syntactic-patterns/lead-ins/lesson-framing.js +11 -7
  156. package/dist/rules/syntactic-patterns/lead-ins/lesson-framing.js.map +1 -0
  157. package/dist/rules/syntactic-patterns/lead-ins/llm-openers.js +28 -0
  158. package/dist/rules/syntactic-patterns/lead-ins/llm-openers.js.map +1 -0
  159. package/dist/{families → rules}/syntactic-patterns/lead-ins/observer-guidance.js +11 -7
  160. package/dist/rules/syntactic-patterns/lead-ins/observer-guidance.js.map +1 -0
  161. package/dist/rules/syntactic-patterns/llm-artifacts/data/response-wrapper-patterns.json +33 -0
  162. package/dist/{families → rules}/syntactic-patterns/llm-artifacts/response-wrapper.js +55 -10
  163. package/dist/rules/syntactic-patterns/llm-artifacts/response-wrapper.js.map +1 -0
  164. package/dist/{families → rules}/syntactic-patterns/repetition/demonstrative-emphasis.js +11 -7
  165. package/dist/rules/syntactic-patterns/repetition/demonstrative-emphasis.js.map +1 -0
  166. package/dist/{families → rules}/syntactic-patterns/repetition/empty-emphasis.js +11 -7
  167. package/dist/rules/syntactic-patterns/repetition/empty-emphasis.js.map +1 -0
  168. package/dist/{families → rules}/syntactic-patterns/repetition/fragment-stacking.js +11 -7
  169. package/dist/rules/syntactic-patterns/repetition/fragment-stacking.js.map +1 -0
  170. package/dist/{families → rules}/syntactic-patterns/repetition/triple-repeat.js +13 -9
  171. package/dist/rules/syntactic-patterns/repetition/triple-repeat.js.map +1 -0
  172. package/dist/{families → rules}/term-policy/recommended-terms.js +8 -4
  173. package/dist/rules/term-policy/recommended-terms.js.map +1 -0
  174. package/dist/{families → rules}/term-policy/required-terms.js +8 -4
  175. package/dist/rules/term-policy/required-terms.js.map +1 -0
  176. package/dist/rules/types.js +2 -0
  177. package/dist/rules/types.js.map +1 -0
  178. package/dist/{families → rules}/words/hedge-stacking.js +11 -7
  179. package/dist/rules/words/hedge-stacking.js.map +1 -0
  180. package/dist/{families → rules}/words/llm-vocabulary.js +8 -4
  181. package/dist/rules/words/llm-vocabulary.js.map +1 -0
  182. package/dist/rules/words/prohibited-words.js +21 -0
  183. package/dist/rules/words/prohibited-words.js.map +1 -0
  184. package/dist/{families → rules}/words/simplicity.js +11 -7
  185. package/dist/rules/words/simplicity.js.map +1 -0
  186. package/dist/shared/matchers/phrases.js +74 -0
  187. package/dist/shared/matchers/phrases.js.map +1 -1
  188. package/package.json +57 -49
  189. package/skills/slopless/SKILL.md +63 -0
  190. package/dist/families/metrics/avg-sentence-length.js.map +0 -1
  191. package/dist/families/metrics/coleman-liau.js.map +0 -1
  192. package/dist/families/metrics/flesch-kincaid.js.map +0 -1
  193. package/dist/families/metrics/gunning-fog.js.map +0 -1
  194. package/dist/families/metrics/paragraph-length.js +0 -21
  195. package/dist/families/metrics/paragraph-length.js.map +0 -1
  196. package/dist/families/metrics/word-repetition.js.map +0 -1
  197. package/dist/families/orthography/colon-dramatic.js.map +0 -1
  198. package/dist/families/orthography/em-dashes.js.map +0 -1
  199. package/dist/families/orthography/exclamation-density.js.map +0 -1
  200. package/dist/families/orthography/fake-timestamps.js.map +0 -1
  201. package/dist/families/orthography/sentence-case.js.map +0 -1
  202. package/dist/families/orthography/smart-quotes.js.map +0 -1
  203. package/dist/families/phrases/cliches.js +0 -17
  204. package/dist/families/phrases/cliches.js.map +0 -1
  205. package/dist/families/phrases/corporate-speak.js +0 -23
  206. package/dist/families/phrases/corporate-speak.js.map +0 -1
  207. package/dist/families/phrases/humble-bragger.js +0 -26
  208. package/dist/families/phrases/humble-bragger.js.map +0 -1
  209. package/dist/families/phrases/jargon-faker.js.map +0 -1
  210. package/dist/families/phrases/llm-disclaimer.js.map +0 -1
  211. package/dist/families/phrases/prohibited-phrases.js +0 -17
  212. package/dist/families/phrases/prohibited-phrases.js.map +0 -1
  213. package/dist/families/phrases/skunked-terms.js.map +0 -1
  214. package/dist/families/phrases/uncomparables.js.map +0 -1
  215. package/dist/families/semantic-thinness/private/pattern-data-a.js.map +0 -1
  216. package/dist/families/semantic-thinness/private/pattern-data-b.js.map +0 -1
  217. package/dist/families/semantic-thinness/private/pattern-data-c.js +0 -9
  218. package/dist/families/semantic-thinness/private/pattern-data-c.js.map +0 -1
  219. package/dist/families/semantic-thinness/private/pattern-data-d.js.map +0 -1
  220. package/dist/families/semantic-thinness/private/pattern-data.js.map +0 -1
  221. package/dist/families/semantic-thinness/private/pattern-matcher.js.map +0 -1
  222. package/dist/families/semantic-thinness/semantic-thinness.js.map +0 -1
  223. package/dist/families/syntactic-patterns/authority/authority-padding.js.map +0 -1
  224. package/dist/families/syntactic-patterns/closers/affirmation-closers.js.map +0 -1
  225. package/dist/families/syntactic-patterns/closers/boilerplate-conclusion.js.map +0 -1
  226. package/dist/families/syntactic-patterns/closers/false-question.js.map +0 -1
  227. package/dist/families/syntactic-patterns/closers/summative-closer.js.map +0 -1
  228. package/dist/families/syntactic-patterns/contrast/blame-reframe.js.map +0 -1
  229. package/dist/families/syntactic-patterns/contrast/contrastive-aphorism.js.map +0 -1
  230. package/dist/families/syntactic-patterns/contrast/negation-reframe.js +0 -20
  231. package/dist/families/syntactic-patterns/contrast/negation-reframe.js.map +0 -1
  232. package/dist/families/syntactic-patterns/contrast/private/negation-reframe-matcher.js.map +0 -1
  233. package/dist/families/syntactic-patterns/contrast/private/negation-reframe-parts.js.map +0 -1
  234. package/dist/families/syntactic-patterns/generalization/softening-language.js.map +0 -1
  235. package/dist/families/syntactic-patterns/generalization/universalizing-claims.js.map +0 -1
  236. package/dist/families/syntactic-patterns/lead-ins/boilerplate-framing.js.map +0 -1
  237. package/dist/families/syntactic-patterns/lead-ins/generic-signposting.js.map +0 -1
  238. package/dist/families/syntactic-patterns/lead-ins/lesson-framing.js.map +0 -1
  239. package/dist/families/syntactic-patterns/lead-ins/llm-openers.js +0 -24
  240. package/dist/families/syntactic-patterns/lead-ins/llm-openers.js.map +0 -1
  241. package/dist/families/syntactic-patterns/lead-ins/observer-guidance.js.map +0 -1
  242. package/dist/families/syntactic-patterns/llm-artifacts/response-wrapper.js.map +0 -1
  243. package/dist/families/syntactic-patterns/repetition/demonstrative-emphasis.js.map +0 -1
  244. package/dist/families/syntactic-patterns/repetition/empty-emphasis.js.map +0 -1
  245. package/dist/families/syntactic-patterns/repetition/fragment-stacking.js.map +0 -1
  246. package/dist/families/syntactic-patterns/repetition/triple-repeat.js.map +0 -1
  247. package/dist/families/term-policy/recommended-terms.js.map +0 -1
  248. package/dist/families/term-policy/required-terms.js.map +0 -1
  249. package/dist/families/words/hedge-stacking.js.map +0 -1
  250. package/dist/families/words/llm-vocabulary.js.map +0 -1
  251. package/dist/families/words/prohibited-words.js +0 -17
  252. package/dist/families/words/prohibited-words.js.map +0 -1
  253. package/dist/families/words/simplicity.js.map +0 -1
  254. /package/dist/{families → rules}/phrases/data/skunked-terms.json +0 -0
  255. /package/dist/{families → rules}/phrases/data/uncomparables.json +0 -0
  256. /package/dist/{families → rules}/semantic-thinness/patterns/abstract-contrast.json +0 -0
  257. /package/dist/{families → rules}/semantic-thinness/patterns/abstract-metaphor-claim.json +0 -0
  258. /package/dist/{families → rules}/semantic-thinness/patterns/body-emotion-shorthand.json +0 -0
  259. /package/dist/{families → rules}/semantic-thinness/patterns/body-knows.json +0 -0
  260. /package/dist/{families → rules}/semantic-thinness/patterns/deictic-summary.json +0 -0
  261. /package/dist/{families → rules}/semantic-thinness/patterns/empty-atmosphere-shift.json +0 -0
  262. /package/dist/{families → rules}/semantic-thinness/patterns/empty-emotional-weather.json +0 -0
  263. /package/dist/{families → rules}/semantic-thinness/patterns/empty-scene-state.json +0 -0
  264. /package/dist/{families → rules}/semantic-thinness/patterns/empty-scene-transition.json +0 -0
  265. /package/dist/{families → rules}/semantic-thinness/patterns/gaze-choreography.json +0 -0
  266. /package/dist/{families → rules}/semantic-thinness/patterns/generic-lesson-extraction.json +0 -0
  267. /package/dist/{families → rules}/semantic-thinness/patterns/generic-pressure-or-stakes.json +0 -0
  268. /package/dist/{families → rules}/semantic-thinness/patterns/generic-realization.json +0 -0
  269. /package/dist/{families → rules}/semantic-thinness/patterns/hollow-significance.json +0 -0
  270. /package/dist/{families → rules}/semantic-thinness/patterns/low-information-physical-blocking.json +0 -0
  271. /package/dist/{families → rules}/semantic-thinness/patterns/point-is-frame.json +0 -0
  272. /package/dist/{families → rules}/semantic-thinness/patterns/real-work-begins.json +0 -0
  273. /package/dist/{families → rules}/semantic-thinness/patterns/silence-as-actor.json +0 -0
  274. /package/dist/{families → rules}/semantic-thinness/patterns/something-shifted.json +0 -0
  275. /package/dist/{families → rules}/semantic-thinness/patterns/truth-answer-moves.json +0 -0
  276. /package/dist/{families → rules}/semantic-thinness/patterns/vague-connective-payoff.json +0 -0
  277. /package/dist/{families → rules}/semantic-thinness/patterns/vague-threshold-change.json +0 -0
  278. /package/dist/{families → rules}/semantic-thinness/private/pattern-data-b.js +0 -0
  279. /package/dist/{families → rules}/semantic-thinness/private/pattern-data-d.js +0 -0
  280. /package/dist/{families → rules}/semantic-thinness/private/pattern-data.js +0 -0
  281. /package/dist/{families → rules}/semantic-thinness/private/pattern-matcher.js +0 -0
  282. /package/dist/{families → rules}/words/data/prohibited-words.json +0 -0
  283. /package/dist/{families → rules}/words/data/simplicity-pairs.json +0 -0
@@ -1,5 +1,6 @@
1
1
  import { cleanSentence } from "../../../shared/matchers/prose-patterns.js";
2
2
  import { allParagraphSentences } from "../../../shared/text/sections.js";
3
+ import { emitTextlintFinding } from "../../../adapters/textlint/report.js";
3
4
  const PREFIXES = ["however, ", "but ", "and ", "so "];
4
5
  const EVIDENCE_SUBJECTS = [
5
6
  "the evidence",
@@ -59,7 +60,7 @@ function matchAuthorityPadding(sentence) {
59
60
  return undefined;
60
61
  }
61
62
  const rule = (context) => {
62
- const { Syntax, RuleError, locator, report } = context;
63
+ const { Syntax } = context;
63
64
  return {
64
65
  [Syntax.Document](node) {
65
66
  for (const item of allParagraphSentences(node)) {
@@ -67,12 +68,15 @@ const rule = (context) => {
67
68
  if (matched === undefined) {
68
69
  continue;
69
70
  }
70
- report(item.paragraph, new RuleError(`Authority padding found: ${matched.signal}. Cite the actual evidence or remove the frame.`, {
71
- padding: locator.range([
72
- item.source.originalStartFor(item.sentence.start),
73
- item.source.originalEndFor(item.sentence.end)
74
- ])
75
- }));
71
+ emitTextlintFinding(context, {
72
+ node: item.paragraph,
73
+ ruleId: "syntactic-patterns:authority-padding",
74
+ message: `Authority padding found: ${matched.signal}. Cite the actual evidence or remove the frame.`,
75
+ range: {
76
+ start: item.source.originalStartFor(item.sentence.start),
77
+ end: item.source.originalEndFor(item.sentence.end)
78
+ }
79
+ });
76
80
  }
77
81
  }
78
82
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authority-padding.js","sourceRoot":"","sources":["../../../../src/rules/syntactic-patterns/authority/authority-padding.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { allParagraphSentences, sectionLastSentences } from "../../../shared/text/sections.js";
2
2
  import { wordTokens } from "../../../shared/text/tokens.js";
3
+ import { emitTextlintFinding } from "../../../adapters/textlint/report.js";
3
4
  const CLOSERS = ["and that's the key.", "that's what matters."];
4
5
  function isFormulaLine(text) {
5
6
  const lower = text.toLocaleLowerCase("en");
@@ -10,7 +11,7 @@ function evidenceKey(item) {
10
11
  return `${item.paragraph.range[0]}:${item.sentence.start}:${item.sentence.end}`;
11
12
  }
12
13
  const rule = (context) => {
13
- const { Syntax, RuleError, locator, report } = context;
14
+ const { Syntax } = context;
14
15
  return {
15
16
  [Syntax.Document](node) {
16
17
  const reported = new Set();
@@ -21,12 +22,15 @@ const rule = (context) => {
21
22
  continue;
22
23
  }
23
24
  reported.add(evidenceKey(item));
24
- report(item.paragraph, new RuleError(`Affirmation closer found: "${closer}". Replace the empty affirmation with the actual conclusion.`, {
25
- padding: locator.range([
26
- item.source.originalStartFor(item.sentence.start),
27
- item.source.originalEndFor(item.sentence.end)
28
- ])
29
- }));
25
+ emitTextlintFinding(context, {
26
+ node: item.paragraph,
27
+ ruleId: "syntactic-patterns:affirmation-closers",
28
+ message: `Affirmation closer found: "${closer}". Replace the empty affirmation with the actual conclusion.`,
29
+ range: {
30
+ start: item.source.originalStartFor(item.sentence.start),
31
+ end: item.source.originalEndFor(item.sentence.end)
32
+ }
33
+ });
30
34
  }
31
35
  for (const item of allParagraphSentences(node)) {
32
36
  const key = evidenceKey(item);
@@ -34,12 +38,15 @@ const rule = (context) => {
34
38
  continue;
35
39
  }
36
40
  reported.add(key);
37
- report(item.paragraph, new RuleError(`Formula affirmation found: "${item.sentence.text}". Replace the empty formula line with substance.`, {
38
- padding: locator.range([
39
- item.source.originalStartFor(item.sentence.start),
40
- item.source.originalEndFor(item.sentence.end)
41
- ])
42
- }));
41
+ emitTextlintFinding(context, {
42
+ node: item.paragraph,
43
+ ruleId: "syntactic-patterns:affirmation-closers",
44
+ message: `Formula affirmation found: "${item.sentence.text}". Replace the empty formula line with substance.`,
45
+ range: {
46
+ start: item.source.originalStartFor(item.sentence.start),
47
+ end: item.source.originalEndFor(item.sentence.end)
48
+ }
49
+ });
43
50
  }
44
51
  }
45
52
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"affirmation-closers.js","sourceRoot":"","sources":["../../../../src/rules/syntactic-patterns/closers/affirmation-closers.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,qBAAqB,EAErB,oBAAoB,EACrB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAE3E,MAAM,OAAO,GAAG,CAAC,qBAAqB,EAAE,sBAAsB,CAAC,CAAC;AAEhE,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAE3C,OAAO,CACL,UAAU,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC;QAC5B,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CACtE,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAqB;IACxC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;AAClF,CAAC;AAED,MAAM,IAAI,GAAuB,CAAC,OAAO,EAAE,EAAE;IAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,OAAO;QACL,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAqB;YACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;YAEnC,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACzD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;gBAEhE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;oBACzB,SAAS;gBACX,CAAC;gBAED,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;gBAChC,mBAAmB,CAAC,OAAO,EAAE;oBAC3B,IAAI,EAAE,IAAI,CAAC,SAAS;oBACpB,MAAM,EAAE,wCAAwC;oBAChD,OAAO,EAAE,8BAA8B,MAAM,8DAA8D;oBAC3G,KAAK,EAAE;wBACL,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;wBACxD,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;qBACnD;iBACF,CAAC,CAAC;YACL,CAAC;YAED,KAAK,MAAM,IAAI,IAAI,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/C,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;gBAC9B,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5D,SAAS;gBACX,CAAC;gBAED,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAClB,mBAAmB,CAAC,OAAO,EAAE;oBAC3B,IAAI,EAAE,IAAI,CAAC,SAAS;oBACpB,MAAM,EAAE,wCAAwC;oBAChD,OAAO,EAAE,+BAA+B,IAAI,CAAC,QAAQ,CAAC,IAAI,mDAAmD;oBAC7G,KAAK,EAAE;wBACL,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;wBACxD,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;qBACnD;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { emitTextlintFinding } from "../../../adapters/textlint/report.js";
1
2
  import { cleanSentence, containsAny, tokens } from "../../../shared/matchers/prose-patterns.js";
2
3
  import { allParagraphSentences } from "../../../shared/text/sections.js";
3
4
  const PREFIXES = [
@@ -107,7 +108,7 @@ function matchConclusion(sentence, isTail) {
107
108
  : { kind: "compression-close", signal: compression };
108
109
  }
109
110
  const rule = (context) => {
110
- const { Syntax, RuleError, locator, report } = context;
111
+ const { Syntax } = context;
111
112
  return {
112
113
  [Syntax.Document](node) {
113
114
  const sentences = allParagraphSentences(node);
@@ -117,12 +118,15 @@ const rule = (context) => {
117
118
  if (matched === undefined) {
118
119
  return;
119
120
  }
120
- report(item.paragraph, new RuleError(`Boilerplate conclusion found: ${matched.signal}. Replace the closer with a specific ending.`, {
121
- padding: locator.range([
122
- item.source.originalStartFor(item.sentence.start),
123
- item.source.originalEndFor(item.sentence.end)
124
- ])
125
- }));
121
+ emitTextlintFinding(context, {
122
+ node: item.paragraph,
123
+ ruleId: "syntactic-patterns:boilerplate-conclusion",
124
+ message: `Boilerplate conclusion found: ${matched.signal}. Replace the closer with a specific ending.`,
125
+ range: {
126
+ start: item.source.originalStartFor(item.sentence.start),
127
+ end: item.source.originalEndFor(item.sentence.end)
128
+ }
129
+ });
126
130
  });
127
131
  }
128
132
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boilerplate-conclusion.js","sourceRoot":"","sources":["../../../../src/rules/syntactic-patterns/closers/boilerplate-conclusion.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { sectionLastSentences } from "../../../shared/text/sections.js";
2
+ import { emitTextlintFinding } from "../../../adapters/textlint/report.js";
2
3
  const FALSE_QUESTION_PATTERNS = [
3
4
  "isn't that what we all",
4
5
  "isn't that the point",
@@ -7,7 +8,7 @@ const FALSE_QUESTION_PATTERNS = [
7
8
  "isn't that why"
8
9
  ];
9
10
  const rule = (context) => {
10
- const { Syntax, RuleError, locator, report } = context;
11
+ const { Syntax } = context;
11
12
  return {
12
13
  [Syntax.Document](node) {
13
14
  for (const item of sectionLastSentences(node)) {
@@ -16,12 +17,15 @@ const rule = (context) => {
16
17
  if (pattern === undefined || !item.sentence.text.endsWith("?")) {
17
18
  continue;
18
19
  }
19
- report(item.paragraph, new RuleError(`False question found: "${pattern}". Make the claim directly.`, {
20
- padding: locator.range([
21
- item.source.originalStartFor(item.sentence.start),
22
- item.source.originalEndFor(item.sentence.end)
23
- ])
24
- }));
20
+ emitTextlintFinding(context, {
21
+ node: item.paragraph,
22
+ ruleId: "syntactic-patterns:false-question",
23
+ message: `False question found: "${pattern}". Make the claim directly.`,
24
+ range: {
25
+ start: item.source.originalStartFor(item.sentence.start),
26
+ end: item.source.originalEndFor(item.sentence.end)
27
+ }
28
+ });
25
29
  }
26
30
  }
27
31
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"false-question.js","sourceRoot":"","sources":["../../../../src/rules/syntactic-patterns/closers/false-question.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAE3E,MAAM,uBAAuB,GAAG;IAC9B,wBAAwB;IACxB,sBAAsB;IACtB,qBAAqB;IACrB,yBAAyB;IACzB,gBAAgB;CACjB,CAAC;AAEF,MAAM,IAAI,GAAuB,CAAC,OAAO,EAAE,EAAE;IAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,OAAO;QACL,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAqB;YACrC,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACzD,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACtD,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CACvB,CAAC;gBAEF,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC/D,SAAS;gBACX,CAAC;gBAED,mBAAmB,CAAC,OAAO,EAAE;oBAC3B,IAAI,EAAE,IAAI,CAAC,SAAS;oBACpB,MAAM,EAAE,mCAAmC;oBAC3C,OAAO,EAAE,0BAA0B,OAAO,6BAA6B;oBACvE,KAAK,EAAE;wBACL,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;wBACxD,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;qBACnD;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { sectionLastSentences } from "../../../shared/text/sections.js";
2
+ import { emitTextlintFinding } from "../../../adapters/textlint/report.js";
2
3
  const SUMMATIVE_PATTERNS = [
3
4
  "and that's what makes",
4
5
  "that's why this",
@@ -10,7 +11,7 @@ const SUMMATIVE_PATTERNS = [
10
11
  "that is why this matters"
11
12
  ];
12
13
  const rule = (context) => {
13
- const { Syntax, RuleError, locator, report } = context;
14
+ const { Syntax } = context;
14
15
  return {
15
16
  [Syntax.Document](node) {
16
17
  for (const item of sectionLastSentences(node)) {
@@ -19,12 +20,15 @@ const rule = (context) => {
19
20
  if (pattern === undefined) {
20
21
  continue;
21
22
  }
22
- report(item.paragraph, new RuleError(`Summative closer found: "${pattern}". End with the concrete point instead.`, {
23
- padding: locator.range([
24
- item.source.originalStartFor(item.sentence.start),
25
- item.source.originalEndFor(item.sentence.end)
26
- ])
27
- }));
23
+ emitTextlintFinding(context, {
24
+ node: item.paragraph,
25
+ ruleId: "syntactic-patterns:summative-closer",
26
+ message: `Summative closer found: "${pattern}". End with the concrete point instead.`,
27
+ range: {
28
+ start: item.source.originalStartFor(item.sentence.start),
29
+ end: item.source.originalEndFor(item.sentence.end)
30
+ }
31
+ });
28
32
  }
29
33
  }
30
34
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summative-closer.js","sourceRoot":"","sources":["../../../../src/rules/syntactic-patterns/closers/summative-closer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAE3E,MAAM,kBAAkB,GAAG;IACzB,uBAAuB;IACvB,iBAAiB;IACjB,qBAAqB;IACrB,sBAAsB;IACtB,uBAAuB;IACvB,wBAAwB;IACxB,yBAAyB;IACzB,0BAA0B;CAC3B,CAAC;AAEF,MAAM,IAAI,GAAuB,CAAC,OAAO,EAAE,EAAE;IAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,OAAO;QACL,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAqB;YACrC,KAAK,MAAM,IAAI,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;gBACzD,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CACjD,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CACzB,CAAC;gBAEF,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;oBAC1B,SAAS;gBACX,CAAC;gBAED,mBAAmB,CAAC,OAAO,EAAE;oBAC3B,IAAI,EAAE,IAAI,CAAC,SAAS;oBACpB,MAAM,EAAE,qCAAqC;oBAC7C,OAAO,EAAE,4BAA4B,OAAO,yCAAyC;oBACrF,KAAK,EAAE;wBACL,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;wBACxD,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;qBACnD;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { cleanSentence } from "../../../shared/matchers/prose-patterns.js";
2
2
  import { allParagraphSentences } from "../../../shared/text/sections.js";
3
+ import { emitTextlintFinding } from "../../../adapters/textlint/report.js";
3
4
  const PREFIXES = ["and ", "but ", "so "];
4
5
  const BLAME_NOUNS = ["malice", "shame", "guilt", "blame", "humiliation"];
5
6
  const GROWTH_NOUNS = ["development", "skill-building", "learning", "practice"];
@@ -37,7 +38,7 @@ function matchBlameReframe(sentence) {
37
38
  return undefined;
38
39
  }
39
40
  const rule = (context) => {
40
- const { Syntax, RuleError, locator, report } = context;
41
+ const { Syntax } = context;
41
42
  return {
42
43
  [Syntax.Document](node) {
43
44
  for (const item of allParagraphSentences(node)) {
@@ -45,12 +46,15 @@ const rule = (context) => {
45
46
  if (matched === undefined) {
46
47
  continue;
47
48
  }
48
- report(item.paragraph, new RuleError(`Blame reframe found: ${matched}. Replace the moralized contrast with a concrete claim.`, {
49
- padding: locator.range([
50
- item.source.originalStartFor(item.sentence.start),
51
- item.source.originalEndFor(item.sentence.end)
52
- ])
53
- }));
49
+ emitTextlintFinding(context, {
50
+ node: item.paragraph,
51
+ ruleId: "syntactic-patterns:blame-reframe",
52
+ message: `Blame reframe found: ${matched}. Replace the moralized contrast with a concrete claim.`,
53
+ range: {
54
+ start: item.source.originalStartFor(item.sentence.start),
55
+ end: item.source.originalEndFor(item.sentence.end)
56
+ }
57
+ });
54
58
  }
55
59
  }
56
60
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blame-reframe.js","sourceRoot":"","sources":["../../../../src/rules/syntactic-patterns/contrast/blame-reframe.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { emitTextlintFinding } from "../../../adapters/textlint/report.js";
1
2
  import { cleanSentence, startsWithWords, tokens, trimTerminalPunctuation } from "../../../shared/matchers/prose-patterns.js";
2
3
  import { allParagraphSentences } from "../../../shared/text/sections.js";
3
4
  const PREFIXES = ["and ", "but ", "so ", "because "];
@@ -166,13 +167,15 @@ function matchCurriculumPair(first, second) {
166
167
  return undefined;
167
168
  }
168
169
  function reportSentence(context, item, signal) {
169
- const { RuleError, locator, report } = context;
170
- report(item.paragraph, new RuleError(`Contrastive aphorism found: ${signal}. Replace the slogan with a concrete claim.`, {
171
- padding: locator.range([
172
- item.source.originalStartFor(item.sentence.start),
173
- item.source.originalEndFor(item.sentence.end)
174
- ])
175
- }));
170
+ emitTextlintFinding(context, {
171
+ node: item.paragraph,
172
+ ruleId: "syntactic-patterns:contrastive-aphorism",
173
+ message: `Contrastive aphorism found: ${signal}. Replace the slogan with a concrete claim.`,
174
+ range: {
175
+ start: item.source.originalStartFor(item.sentence.start),
176
+ end: item.source.originalEndFor(item.sentence.end)
177
+ }
178
+ });
176
179
  }
177
180
  const rule = (context) => {
178
181
  const { Syntax } = context;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contrastive-aphorism.js","sourceRoot":"","sources":["../../../../src/rules/syntactic-patterns/contrast/contrastive-aphorism.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { findNegationReframes } from "./private/negation-reframe-matcher.js";
2
+ import { sourceText } from "../../../shared/text/traverse.js";
3
+ import { emitTextlintFinding } from "../../../adapters/textlint/report.js";
4
+ const rule = (context) => {
5
+ const { Syntax } = context;
6
+ return {
7
+ [Syntax.Paragraph](node) {
8
+ const source = sourceText(node);
9
+ for (const match of findNegationReframes(source.text)) {
10
+ emitTextlintFinding(context, {
11
+ node: node,
12
+ ruleId: "syntactic-patterns:negation-reframe",
13
+ message: `Negation reframe found: "${match.text}". Rewrite without the not-X-then-Y construction.`,
14
+ range: {
15
+ start: source.originalStartFor(match.start),
16
+ end: source.originalEndFor(match.end)
17
+ }
18
+ });
19
+ }
20
+ }
21
+ };
22
+ };
23
+ export default rule;
24
+ //# sourceMappingURL=negation-reframe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"negation-reframe.js","sourceRoot":"","sources":["../../../../src/rules/syntactic-patterns/contrast/negation-reframe.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAE3E,MAAM,IAAI,GAAuB,CAAC,OAAO,EAAE,EAAE;IAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,OAAO;QACL,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAmB;YACpC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;YAEhC,KAAK,MAAM,KAAK,IAAI,oBAAoB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBACtD,mBAAmB,CAAC,OAAO,EAAE;oBAC3B,IAAI,EAAE,IAAI;oBACV,MAAM,EAAE,qCAAqC;oBAC7C,OAAO,EAAE,4BAA4B,KAAK,CAAC,IAAI,mDAAmD;oBAClG,KAAK,EAAE;wBACL,KAAK,EAAE,MAAM,CAAC,gBAAgB,CAAC,KAAK,CAAC,KAAK,CAAC;wBAC3C,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC;qBACtC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -1,4 +1,5 @@
1
- import { DO_NEGATIONS, EXPLICIT_DO_AUXILIARIES, NEGATION_WORDS, PASSIVE_DEFINITION_VERBS, PRONOUN_REFRAME_STARTS, findCopularNegation, findNegationIndex, hasCommaBeforeNegation, isCompleteSentence, skipOptionalAdverbs, startsWithAny, startsWithWords, validSubject, words } from "./negation-reframe-parts.js";
1
+ import { DO_NEGATIONS, EXPLICIT_DO_AUXILIARIES, NEGATION_WORDS, PASSIVE_DEFINITION_VERBS, PRONOUN_REFRAME_STARTS, contrastPivotSubject, findCopularNegation, findNegationIndex, hasCommaBeforeNegation, isCompleteSentence, skipOptionalAdverbs, startsWithAny, startsWithSubjectOrPronoun, startsWithSubjectVerb, startsWithWords, stripLeadingPairPivot, validSubject, words } from "./negation-reframe-parts.js";
2
+ import { hasNegativeSlopPairSignal, negativeSlopReframe } from "./negative-slop-frames.js";
2
3
  import { splitSentences } from "../../../../shared/text/sentences.js";
3
4
  import { wordTokens } from "../../../../shared/text/tokens.js";
4
5
  const INLINE_NON_CONTRAST_NEGATION_FOLLOWERS = new Set([
@@ -132,6 +133,7 @@ function startsWithNeedAffirmative(bTokens, subject) {
132
133
  }
133
134
  function actionVerbMirror(aTokens, bTokens) {
134
135
  const tokenWords = words(aTokens);
136
+ const bContentTokens = stripLeadingPairPivot(bTokens);
135
137
  for (let index = 0; index < tokenWords.length; index += 1) {
136
138
  const current = tokenWords[index];
137
139
  const next = tokenWords[index + 1];
@@ -142,20 +144,33 @@ function actionVerbMirror(aTokens, bTokens) {
142
144
  if (DO_NEGATIONS.has(current ?? "")) {
143
145
  const verbIndex = skipOptionalAdverbs(tokenWords, index + 1);
144
146
  const verb = tokenWords[verbIndex];
145
- if (verb !== undefined && startsWithWords(bTokens, [...subject, verb])) {
147
+ if (verb !== undefined &&
148
+ startsWithSubjectVerb(bContentTokens, subject, verb)) {
146
149
  return true;
147
150
  }
148
151
  }
149
152
  if (EXPLICIT_DO_AUXILIARIES.has(current ?? "") && next === "not") {
150
153
  const verbIndex = skipOptionalAdverbs(tokenWords, index + 2);
151
154
  const verb = tokenWords[verbIndex];
152
- if (verb !== undefined && startsWithWords(bTokens, [...subject, verb])) {
155
+ if (verb !== undefined &&
156
+ startsWithSubjectVerb(bContentTokens, subject, verb)) {
153
157
  return true;
154
158
  }
155
159
  }
156
160
  }
157
161
  return false;
158
162
  }
163
+ function explicitContrastPivotReframe(aTokens, bTokens) {
164
+ const subject = contrastPivotSubject(aTokens);
165
+ return (subject !== undefined &&
166
+ !startsWithNegatedPronounCopula(bTokens) &&
167
+ startsWithSubjectOrPronoun(bTokens, subject));
168
+ }
169
+ function hasPairNegationSignal(tokens) {
170
+ return (findNegationIndex(tokens) !== undefined ||
171
+ contrastPivotSubject(tokens) !== undefined ||
172
+ hasNegativeSlopPairSignal(tokens));
173
+ }
159
174
  function looksLikePassiveDefinition(aTokens, bTokens) {
160
175
  const aWords = words(aTokens);
161
176
  const bWords = words(bTokens);
@@ -176,7 +191,7 @@ function sentencePairReframe(a, b) {
176
191
  const bTokens = wordTokens(b.text);
177
192
  if (!isCompleteSentence(a) ||
178
193
  !isCompleteSentence(b) ||
179
- findNegationIndex(aTokens) === undefined) {
194
+ !hasPairNegationSignal(aTokens)) {
180
195
  return undefined;
181
196
  }
182
197
  if (sameSubjectCopularReframe(aTokens, bTokens) ||
@@ -184,7 +199,9 @@ function sentencePairReframe(a, b) {
184
199
  progressiveVerbMirror(aTokens, bTokens) ||
185
200
  meaningReframe(aTokens, bTokens) ||
186
201
  needReframe(aTokens, bTokens) ||
187
- actionVerbMirror(aTokens, bTokens)) {
202
+ actionVerbMirror(aTokens, bTokens) ||
203
+ negativeSlopReframe(aTokens, bTokens) ||
204
+ explicitContrastPivotReframe(aTokens, bTokens)) {
188
205
  return {
189
206
  end: b.end,
190
207
  start: a.start,
@@ -0,0 +1 @@
1
+ {"version":3,"file":"negation-reframe-matcher.js","sourceRoot":"","sources":["../../../../../src/rules/syntactic-patterns/contrast/private/negation-reframe-matcher.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,14 @@ export const OPTIONAL_ADVERBS = new Set([
34
34
  "really",
35
35
  "usually"
36
36
  ]);
37
+ export const FACTUAL_NEGATION_CONNECTORS = new Set([
38
+ "because",
39
+ "if",
40
+ "since",
41
+ "until",
42
+ "when",
43
+ "while"
44
+ ]);
37
45
  export const PRONOUN_REFRAME_STARTS = [
38
46
  ["it", "is"],
39
47
  ["it", "was"],
@@ -54,6 +62,7 @@ export const PASSIVE_DEFINITION_VERBS = new Set([
54
62
  "marked",
55
63
  "produced"
56
64
  ]);
65
+ const IRREGULAR_PAST_TENSE = new Map([["go", "went"]]);
57
66
  export function findNegationIndex(tokens) {
58
67
  for (let index = 0; index < tokens.length; index += 1) {
59
68
  const token = tokens[index];
@@ -74,9 +83,33 @@ export function startsWithWords(tokens, words) {
74
83
  }
75
84
  return true;
76
85
  }
86
+ function regularPastTense(verb) {
87
+ return verb.endsWith("e") ? `${verb}d` : `${verb}ed`;
88
+ }
89
+ function affirmativeVerbForms(verb) {
90
+ return [verb, IRREGULAR_PAST_TENSE.get(verb) ?? regularPastTense(verb)];
91
+ }
92
+ export function stripLeadingPairPivot(tokens) {
93
+ return tokens[0]?.normalized === "instead" ? tokens.slice(1) : tokens;
94
+ }
95
+ export function startsWithSubjectOrPronoun(tokens, subject) {
96
+ if (startsWithWords(tokens, subject)) {
97
+ return true;
98
+ }
99
+ if (subject.length === 1) {
100
+ return false;
101
+ }
102
+ return startsWithWords(tokens, ["they"]) || startsWithWords(tokens, ["it"]);
103
+ }
104
+ export function startsWithSubjectVerb(tokens, subject, verb) {
105
+ return affirmativeVerbForms(verb).some((candidate) => startsWithWords(tokens, [...subject, candidate]));
106
+ }
77
107
  export function words(tokens) {
78
108
  return tokens.map((token) => token.normalized);
79
109
  }
110
+ export function hasAnyWord(tokens, candidates) {
111
+ return tokens.some((token) => candidates.has(token));
112
+ }
80
113
  export function skipOptionalAdverbs(tokens, start) {
81
114
  let index = start;
82
115
  while (OPTIONAL_ADVERBS.has(tokens[index] ?? "")) {
@@ -133,4 +166,26 @@ export function findCopularNegation(tokens) {
133
166
  export function validSubject(subject) {
134
167
  return subject.length > 0 && subject.length <= 8;
135
168
  }
169
+ export function contrastPivotSubject(tokens) {
170
+ const tokenWords = words(tokens);
171
+ for (let index = 0; index < tokenWords.length; index += 1) {
172
+ const current = tokenWords[index];
173
+ if (current === undefined || COPULAR_FORMS.get(current) === undefined) {
174
+ continue;
175
+ }
176
+ const subject = tokenWords.slice(0, index);
177
+ if (!validSubject(subject)) {
178
+ continue;
179
+ }
180
+ if (tokenWords[index + 1] === "not" && tokenWords[index + 2] === "just") {
181
+ return subject;
182
+ }
183
+ if (tokenWords[index + 1] === "no" &&
184
+ tokenWords[index + 2] === "longer" &&
185
+ tokenWords[index + 3] === "just") {
186
+ return subject;
187
+ }
188
+ }
189
+ return undefined;
190
+ }
136
191
  //# sourceMappingURL=negation-reframe-parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"negation-reframe-parts.js","sourceRoot":"","sources":["../../../../../src/rules/syntactic-patterns/contrast/private/negation-reframe-parts.ts"],"names":[],"mappings":"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"}