slopless 0.1.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/README.md +64 -0
- package/dist/families/metrics/avg-sentence-length.js +22 -0
- package/dist/families/metrics/avg-sentence-length.js.map +1 -0
- package/dist/families/metrics/coleman-liau.js +27 -0
- package/dist/families/metrics/coleman-liau.js.map +1 -0
- package/dist/families/metrics/flesch-kincaid.js +27 -0
- package/dist/families/metrics/flesch-kincaid.js.map +1 -0
- package/dist/families/metrics/gunning-fog.js +27 -0
- package/dist/families/metrics/gunning-fog.js.map +1 -0
- package/dist/families/metrics/paragraph-length.js +21 -0
- package/dist/families/metrics/paragraph-length.js.map +1 -0
- package/dist/families/metrics/word-repetition.js +46 -0
- package/dist/families/metrics/word-repetition.js.map +1 -0
- package/dist/families/orthography/colon-dramatic.js +117 -0
- package/dist/families/orthography/colon-dramatic.js.map +1 -0
- package/dist/families/orthography/em-dashes.js +41 -0
- package/dist/families/orthography/em-dashes.js.map +1 -0
- package/dist/families/orthography/exclamation-density.js +51 -0
- package/dist/families/orthography/exclamation-density.js.map +1 -0
- package/dist/families/orthography/fake-timestamps.js +103 -0
- package/dist/families/orthography/fake-timestamps.js.map +1 -0
- package/dist/families/orthography/sentence-case.js +66 -0
- package/dist/families/orthography/sentence-case.js.map +1 -0
- package/dist/families/orthography/smart-quotes.js +53 -0
- package/dist/families/orthography/smart-quotes.js.map +1 -0
- package/dist/families/phrases/cliches.js +17 -0
- package/dist/families/phrases/cliches.js.map +1 -0
- package/dist/families/phrases/corporate-speak.js +23 -0
- package/dist/families/phrases/corporate-speak.js.map +1 -0
- package/dist/families/phrases/data/cliches.json +699 -0
- package/dist/families/phrases/data/corporate-speak.json +27 -0
- package/dist/families/phrases/data/prohibited-phrases.json +8 -0
- package/dist/families/phrases/data/skunked-terms.json +10 -0
- package/dist/families/phrases/data/uncomparables.json +57 -0
- package/dist/families/phrases/humble-bragger.js +26 -0
- package/dist/families/phrases/humble-bragger.js.map +1 -0
- package/dist/families/phrases/jargon-faker.js +84 -0
- package/dist/families/phrases/jargon-faker.js.map +1 -0
- package/dist/families/phrases/llm-disclaimer.js +54 -0
- package/dist/families/phrases/llm-disclaimer.js.map +1 -0
- package/dist/families/phrases/prohibited-phrases.js +17 -0
- package/dist/families/phrases/prohibited-phrases.js.map +1 -0
- package/dist/families/phrases/skunked-terms.js +23 -0
- package/dist/families/phrases/skunked-terms.js.map +1 -0
- package/dist/families/phrases/uncomparables.js +78 -0
- package/dist/families/phrases/uncomparables.js.map +1 -0
- package/dist/families/semantic-thinness/patterns/abstract-contrast.json +85 -0
- package/dist/families/semantic-thinness/patterns/abstract-metaphor-claim.json +112 -0
- package/dist/families/semantic-thinness/patterns/body-emotion-shorthand.json +77 -0
- package/dist/families/semantic-thinness/patterns/body-knows.json +80 -0
- package/dist/families/semantic-thinness/patterns/deictic-summary.json +109 -0
- package/dist/families/semantic-thinness/patterns/empty-atmosphere-shift.json +70 -0
- package/dist/families/semantic-thinness/patterns/empty-emotional-weather.json +104 -0
- package/dist/families/semantic-thinness/patterns/empty-scene-state.json +117 -0
- package/dist/families/semantic-thinness/patterns/empty-scene-transition.json +98 -0
- package/dist/families/semantic-thinness/patterns/gaze-choreography.json +87 -0
- package/dist/families/semantic-thinness/patterns/generic-lesson-extraction.json +82 -0
- package/dist/families/semantic-thinness/patterns/generic-pressure-or-stakes.json +107 -0
- package/dist/families/semantic-thinness/patterns/generic-realization.json +113 -0
- package/dist/families/semantic-thinness/patterns/hollow-significance.json +103 -0
- package/dist/families/semantic-thinness/patterns/low-information-physical-blocking.json +113 -0
- package/dist/families/semantic-thinness/patterns/point-is-frame.json +81 -0
- package/dist/families/semantic-thinness/patterns/real-work-begins.json +66 -0
- package/dist/families/semantic-thinness/patterns/silence-as-actor.json +69 -0
- package/dist/families/semantic-thinness/patterns/something-shifted.json +73 -0
- package/dist/families/semantic-thinness/patterns/truth-answer-moves.json +75 -0
- package/dist/families/semantic-thinness/patterns/vague-connective-payoff.json +90 -0
- package/dist/families/semantic-thinness/patterns/vague-threshold-change.json +98 -0
- package/dist/families/semantic-thinness/private/pattern-data-a.js +15 -0
- package/dist/families/semantic-thinness/private/pattern-data-a.js.map +1 -0
- package/dist/families/semantic-thinness/private/pattern-data-b.js +15 -0
- package/dist/families/semantic-thinness/private/pattern-data-b.js.map +1 -0
- package/dist/families/semantic-thinness/private/pattern-data-c.js +9 -0
- package/dist/families/semantic-thinness/private/pattern-data-c.js.map +1 -0
- package/dist/families/semantic-thinness/private/pattern-data-d.js +17 -0
- package/dist/families/semantic-thinness/private/pattern-data-d.js.map +1 -0
- package/dist/families/semantic-thinness/private/pattern-data.js +11 -0
- package/dist/families/semantic-thinness/private/pattern-data.js.map +1 -0
- package/dist/families/semantic-thinness/private/pattern-matcher.js +172 -0
- package/dist/families/semantic-thinness/private/pattern-matcher.js.map +1 -0
- package/dist/families/semantic-thinness/semantic-thinness.js +25 -0
- package/dist/families/semantic-thinness/semantic-thinness.js.map +1 -0
- package/dist/families/syntactic-patterns/authority/authority-padding.js +81 -0
- package/dist/families/syntactic-patterns/authority/authority-padding.js.map +1 -0
- package/dist/families/syntactic-patterns/closers/affirmation-closers.js +48 -0
- package/dist/families/syntactic-patterns/closers/affirmation-closers.js.map +1 -0
- package/dist/families/syntactic-patterns/closers/boilerplate-conclusion.js +131 -0
- package/dist/families/syntactic-patterns/closers/boilerplate-conclusion.js.map +1 -0
- package/dist/families/syntactic-patterns/closers/false-question.js +30 -0
- package/dist/families/syntactic-patterns/closers/false-question.js.map +1 -0
- package/dist/families/syntactic-patterns/closers/summative-closer.js +33 -0
- package/dist/families/syntactic-patterns/closers/summative-closer.js.map +1 -0
- package/dist/families/syntactic-patterns/contrast/blame-reframe.js +59 -0
- package/dist/families/syntactic-patterns/contrast/blame-reframe.js.map +1 -0
- package/dist/families/syntactic-patterns/contrast/contrastive-aphorism.js +203 -0
- package/dist/families/syntactic-patterns/contrast/contrastive-aphorism.js.map +1 -0
- package/dist/families/syntactic-patterns/contrast/negation-reframe.js +20 -0
- package/dist/families/syntactic-patterns/contrast/negation-reframe.js.map +1 -0
- package/dist/families/syntactic-patterns/contrast/private/negation-reframe-matcher.js +218 -0
- package/dist/families/syntactic-patterns/contrast/private/negation-reframe-matcher.js.map +1 -0
- package/dist/families/syntactic-patterns/contrast/private/negation-reframe-parts.js +136 -0
- package/dist/families/syntactic-patterns/contrast/private/negation-reframe-parts.js.map +1 -0
- package/dist/families/syntactic-patterns/generalization/softening-language.js +143 -0
- package/dist/families/syntactic-patterns/generalization/softening-language.js.map +1 -0
- package/dist/families/syntactic-patterns/generalization/universalizing-claims.js +137 -0
- package/dist/families/syntactic-patterns/generalization/universalizing-claims.js.map +1 -0
- package/dist/families/syntactic-patterns/lead-ins/boilerplate-framing.js +104 -0
- package/dist/families/syntactic-patterns/lead-ins/boilerplate-framing.js.map +1 -0
- package/dist/families/syntactic-patterns/lead-ins/generic-signposting.js +230 -0
- package/dist/families/syntactic-patterns/lead-ins/generic-signposting.js.map +1 -0
- package/dist/families/syntactic-patterns/lead-ins/lesson-framing.js +76 -0
- package/dist/families/syntactic-patterns/lead-ins/lesson-framing.js.map +1 -0
- package/dist/families/syntactic-patterns/lead-ins/llm-openers.js +24 -0
- package/dist/families/syntactic-patterns/lead-ins/llm-openers.js.map +1 -0
- package/dist/families/syntactic-patterns/lead-ins/observer-guidance.js +95 -0
- package/dist/families/syntactic-patterns/lead-ins/observer-guidance.js.map +1 -0
- package/dist/families/syntactic-patterns/llm-artifacts/response-wrapper.js +106 -0
- package/dist/families/syntactic-patterns/llm-artifacts/response-wrapper.js.map +1 -0
- package/dist/families/syntactic-patterns/repetition/demonstrative-emphasis.js +251 -0
- package/dist/families/syntactic-patterns/repetition/demonstrative-emphasis.js.map +1 -0
- package/dist/families/syntactic-patterns/repetition/empty-emphasis.js +108 -0
- package/dist/families/syntactic-patterns/repetition/empty-emphasis.js.map +1 -0
- package/dist/families/syntactic-patterns/repetition/fragment-stacking.js +306 -0
- package/dist/families/syntactic-patterns/repetition/fragment-stacking.js.map +1 -0
- package/dist/families/syntactic-patterns/repetition/triple-repeat.js +149 -0
- package/dist/families/syntactic-patterns/repetition/triple-repeat.js.map +1 -0
- package/dist/families/term-policy/recommended-terms.js +87 -0
- package/dist/families/term-policy/recommended-terms.js.map +1 -0
- package/dist/families/term-policy/required-terms.js +32 -0
- package/dist/families/term-policy/required-terms.js.map +1 -0
- package/dist/families/words/data/prohibited-words.json +12 -0
- package/dist/families/words/data/simplicity-pairs.json +7 -0
- package/dist/families/words/hedge-stacking.js +43 -0
- package/dist/families/words/hedge-stacking.js.map +1 -0
- package/dist/families/words/llm-vocabulary.js +33 -0
- package/dist/families/words/llm-vocabulary.js.map +1 -0
- package/dist/families/words/prohibited-words.js +17 -0
- package/dist/families/words/prohibited-words.js.map +1 -0
- package/dist/families/words/simplicity.js +27 -0
- package/dist/families/words/simplicity.js.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/presets/everything.js +52 -0
- package/dist/presets/everything.js.map +1 -0
- package/dist/registries/metrics.js +15 -0
- package/dist/registries/metrics.js.map +1 -0
- package/dist/registries/orthography.js +15 -0
- package/dist/registries/orthography.js.map +1 -0
- package/dist/registries/phrases.js +19 -0
- package/dist/registries/phrases.js.map +1 -0
- package/dist/registries/semantic-thinness.js +5 -0
- package/dist/registries/semantic-thinness.js.map +1 -0
- package/dist/registries/syntactic-patterns/authority.js +5 -0
- package/dist/registries/syntactic-patterns/authority.js.map +1 -0
- package/dist/registries/syntactic-patterns/closers.js +11 -0
- package/dist/registries/syntactic-patterns/closers.js.map +1 -0
- package/dist/registries/syntactic-patterns/contrast.js +9 -0
- package/dist/registries/syntactic-patterns/contrast.js.map +1 -0
- package/dist/registries/syntactic-patterns/generalization.js +7 -0
- package/dist/registries/syntactic-patterns/generalization.js.map +1 -0
- package/dist/registries/syntactic-patterns/lead-ins.js +13 -0
- package/dist/registries/syntactic-patterns/lead-ins.js.map +1 -0
- package/dist/registries/syntactic-patterns/llm-artifacts.js +5 -0
- package/dist/registries/syntactic-patterns/llm-artifacts.js.map +1 -0
- package/dist/registries/syntactic-patterns/repetition.js +11 -0
- package/dist/registries/syntactic-patterns/repetition.js.map +1 -0
- package/dist/registries/syntactic-patterns.js +17 -0
- package/dist/registries/syntactic-patterns.js.map +1 -0
- package/dist/registries/term-policy.js +7 -0
- package/dist/registries/term-policy.js.map +1 -0
- package/dist/registries/words.js +11 -0
- package/dist/registries/words.js.map +1 -0
- package/dist/shared/matchers/phrases.js +71 -0
- package/dist/shared/matchers/phrases.js.map +1 -0
- package/dist/shared/matchers/prose-patterns.js +104 -0
- package/dist/shared/matchers/prose-patterns.js.map +1 -0
- package/dist/shared/text/document.js +18 -0
- package/dist/shared/text/document.js.map +1 -0
- package/dist/shared/text/normalize.js +30 -0
- package/dist/shared/text/normalize.js.map +1 -0
- package/dist/shared/text/quotes.js +20 -0
- package/dist/shared/text/quotes.js.map +1 -0
- package/dist/shared/text/sections.js +119 -0
- package/dist/shared/text/sections.js.map +1 -0
- package/dist/shared/text/sentences.js +79 -0
- package/dist/shared/text/sentences.js.map +1 -0
- package/dist/shared/text/tokens.js +18 -0
- package/dist/shared/text/tokens.js.map +1 -0
- package/dist/shared/text/traverse.js +10 -0
- package/dist/shared/text/traverse.js.map +1 -0
- package/dist/shared/text/whitespace.js +25 -0
- package/dist/shared/text/whitespace.js.map +1 -0
- package/package.json +115 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { cleanSentence, containsAny, tokens } from "../../../shared/matchers/prose-patterns.js";
|
|
2
|
+
import { allParagraphSentences } from "../../../shared/text/sections.js";
|
|
3
|
+
const MODAL_PATTERNS = [" could ", " may ", " might "];
|
|
4
|
+
const QUALIFIER_PATTERNS = [
|
|
5
|
+
" broadly ",
|
|
6
|
+
" generally ",
|
|
7
|
+
" largely ",
|
|
8
|
+
" typically ",
|
|
9
|
+
" commonly ",
|
|
10
|
+
" potentially ",
|
|
11
|
+
" relatively ",
|
|
12
|
+
" usually "
|
|
13
|
+
];
|
|
14
|
+
const VARIABILITY_PATTERNS = [
|
|
15
|
+
"in some individuals",
|
|
16
|
+
"in some people",
|
|
17
|
+
"in some children",
|
|
18
|
+
"in some cases",
|
|
19
|
+
"from person to person",
|
|
20
|
+
"may not necessarily",
|
|
21
|
+
"not necessarily",
|
|
22
|
+
"not all individuals",
|
|
23
|
+
"not all people"
|
|
24
|
+
];
|
|
25
|
+
const REPORTING_PATTERNS = [
|
|
26
|
+
"is believed",
|
|
27
|
+
"are believed",
|
|
28
|
+
"generally considered",
|
|
29
|
+
"is often seen",
|
|
30
|
+
"are often seen",
|
|
31
|
+
"is often treated",
|
|
32
|
+
"are often treated",
|
|
33
|
+
"has been reported",
|
|
34
|
+
"have been reported",
|
|
35
|
+
"it is thought",
|
|
36
|
+
"it is believed",
|
|
37
|
+
"research suggests",
|
|
38
|
+
"studies suggest",
|
|
39
|
+
"studies have suggested",
|
|
40
|
+
"more research is needed"
|
|
41
|
+
];
|
|
42
|
+
const QUANTIFIER_LEADS = ["many", "most", "some", "certain", "various"];
|
|
43
|
+
const QUANTIFIER_TARGETS = [
|
|
44
|
+
"adults",
|
|
45
|
+
"children",
|
|
46
|
+
"couples",
|
|
47
|
+
"families",
|
|
48
|
+
"people",
|
|
49
|
+
"individuals",
|
|
50
|
+
"kids",
|
|
51
|
+
"moms",
|
|
52
|
+
"parents",
|
|
53
|
+
"experts",
|
|
54
|
+
"research",
|
|
55
|
+
"studies",
|
|
56
|
+
"foods",
|
|
57
|
+
"factors",
|
|
58
|
+
"types",
|
|
59
|
+
"cases",
|
|
60
|
+
"patients",
|
|
61
|
+
"patterns",
|
|
62
|
+
"problems",
|
|
63
|
+
"ways"
|
|
64
|
+
];
|
|
65
|
+
function findQuantifierPair(text) {
|
|
66
|
+
const words = tokens(text);
|
|
67
|
+
for (let index = 0; index < words.length - 1; index += 1) {
|
|
68
|
+
const lead = words[index];
|
|
69
|
+
const target = words[index + 1];
|
|
70
|
+
if (lead !== undefined &&
|
|
71
|
+
target !== undefined &&
|
|
72
|
+
QUANTIFIER_LEADS.includes(lead) &&
|
|
73
|
+
QUANTIFIER_TARGETS.includes(target)) {
|
|
74
|
+
return `${lead} ${target}`;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
function matchSoftening(sentence) {
|
|
80
|
+
const normalized = ` ${cleanSentence(sentence)} `;
|
|
81
|
+
const modal = containsAny(normalized, MODAL_PATTERNS);
|
|
82
|
+
const qualifier = containsAny(normalized, QUALIFIER_PATTERNS);
|
|
83
|
+
const variability = containsAny(normalized, VARIABILITY_PATTERNS);
|
|
84
|
+
const reporting = containsAny(normalized, REPORTING_PATTERNS);
|
|
85
|
+
const quantifier = findQuantifierPair(normalized);
|
|
86
|
+
const signalCount = Number(modal !== undefined) +
|
|
87
|
+
Number(qualifier !== undefined) +
|
|
88
|
+
Number(variability !== undefined) +
|
|
89
|
+
Number(reporting !== undefined) +
|
|
90
|
+
Number(quantifier !== undefined);
|
|
91
|
+
if (signalCount < 2) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
if (modal !== undefined && variability !== undefined) {
|
|
95
|
+
return {
|
|
96
|
+
kind: "variability-softening",
|
|
97
|
+
signal: `${modal} + ${variability}`
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
if (modal !== undefined && qualifier !== undefined) {
|
|
101
|
+
return { kind: "hedged-claim", signal: `${modal} + ${qualifier}` };
|
|
102
|
+
}
|
|
103
|
+
if (modal !== undefined && quantifier !== undefined) {
|
|
104
|
+
return { kind: "quantified-softening", signal: `${modal} + ${quantifier}` };
|
|
105
|
+
}
|
|
106
|
+
if (reporting !== undefined && modal !== undefined) {
|
|
107
|
+
return { kind: "tentative-reporting", signal: `${reporting} + ${modal}` };
|
|
108
|
+
}
|
|
109
|
+
if (reporting !== undefined && quantifier !== undefined) {
|
|
110
|
+
return {
|
|
111
|
+
kind: "tentative-reporting",
|
|
112
|
+
signal: `${reporting} + ${quantifier}`
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
if (variability !== undefined && quantifier !== undefined) {
|
|
116
|
+
return {
|
|
117
|
+
kind: "variability-softening",
|
|
118
|
+
signal: `${variability} + ${quantifier}`
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return { kind: "stacked-softening", signal: "multiple softening signals" };
|
|
122
|
+
}
|
|
123
|
+
const rule = (context) => {
|
|
124
|
+
const { Syntax, RuleError, locator, report } = context;
|
|
125
|
+
return {
|
|
126
|
+
[Syntax.Document](node) {
|
|
127
|
+
for (const item of allParagraphSentences(node)) {
|
|
128
|
+
const matched = matchSoftening(item.sentence.text);
|
|
129
|
+
if (matched === undefined) {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
report(item.paragraph, new RuleError(`Softening language found: ${matched.signal}. Make the claim specific or remove the hedge stack.`, {
|
|
133
|
+
padding: locator.range([
|
|
134
|
+
item.source.originalStartFor(item.sentence.start),
|
|
135
|
+
item.source.originalEndFor(item.sentence.end)
|
|
136
|
+
])
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
};
|
|
141
|
+
};
|
|
142
|
+
export default rule;
|
|
143
|
+
//# sourceMappingURL=softening-language.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"softening-language.js","sourceRoot":"","sources":["../../../../src/families/syntactic-patterns/generalization/softening-language.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { cleanSentence, tokens, startsWithWords } from "../../../shared/matchers/prose-patterns.js";
|
|
2
|
+
import { allParagraphSentences } from "../../../shared/text/sections.js";
|
|
3
|
+
const PREFIXES = [
|
|
4
|
+
"however, ",
|
|
5
|
+
"but ",
|
|
6
|
+
"and ",
|
|
7
|
+
"so ",
|
|
8
|
+
"ultimately, ",
|
|
9
|
+
"after all, ",
|
|
10
|
+
"in the end, "
|
|
11
|
+
];
|
|
12
|
+
const SUBJECT_PATTERNS = [
|
|
13
|
+
["everyone"],
|
|
14
|
+
["everybody"],
|
|
15
|
+
["we", "all"],
|
|
16
|
+
["many", "adults"],
|
|
17
|
+
["many", "couples"],
|
|
18
|
+
["many", "families"],
|
|
19
|
+
["many", "kids"],
|
|
20
|
+
["many", "parents"],
|
|
21
|
+
["many", "people"],
|
|
22
|
+
["many", "of", "us"],
|
|
23
|
+
["most", "adults"],
|
|
24
|
+
["most", "couples"],
|
|
25
|
+
["most", "people"],
|
|
26
|
+
["most", "of", "us"],
|
|
27
|
+
["most", "parents"],
|
|
28
|
+
["most", "families"],
|
|
29
|
+
["most", "kids"],
|
|
30
|
+
["for", "many", "adults"],
|
|
31
|
+
["for", "many", "families"],
|
|
32
|
+
["for", "many", "parents"],
|
|
33
|
+
["for", "many", "people"],
|
|
34
|
+
["for", "most", "people"],
|
|
35
|
+
["no", "one"],
|
|
36
|
+
["nobody"]
|
|
37
|
+
];
|
|
38
|
+
const DESIRE_VERBS = [
|
|
39
|
+
"want",
|
|
40
|
+
"wants",
|
|
41
|
+
"hope",
|
|
42
|
+
"hopes",
|
|
43
|
+
"deserve",
|
|
44
|
+
"deserves",
|
|
45
|
+
"crave",
|
|
46
|
+
"craves",
|
|
47
|
+
"look",
|
|
48
|
+
"looks",
|
|
49
|
+
"reach",
|
|
50
|
+
"reaches",
|
|
51
|
+
"try",
|
|
52
|
+
"tries"
|
|
53
|
+
];
|
|
54
|
+
const CERTAINTY_VERBS = [
|
|
55
|
+
"assume",
|
|
56
|
+
"assumes",
|
|
57
|
+
"expect",
|
|
58
|
+
"expects",
|
|
59
|
+
"know",
|
|
60
|
+
"knows"
|
|
61
|
+
];
|
|
62
|
+
const HUMAN_GROUP_SUBJECTS = [
|
|
63
|
+
"adults",
|
|
64
|
+
"children",
|
|
65
|
+
"couples",
|
|
66
|
+
"dads",
|
|
67
|
+
"families",
|
|
68
|
+
"kids",
|
|
69
|
+
"moms",
|
|
70
|
+
"parents",
|
|
71
|
+
"people",
|
|
72
|
+
"students",
|
|
73
|
+
"teachers"
|
|
74
|
+
];
|
|
75
|
+
const GROUP_BEHAVIOR_GERUNDS = [
|
|
76
|
+
"asking",
|
|
77
|
+
"looking",
|
|
78
|
+
"reaching",
|
|
79
|
+
"trying",
|
|
80
|
+
"waiting",
|
|
81
|
+
"hoping",
|
|
82
|
+
"wondering"
|
|
83
|
+
];
|
|
84
|
+
const BROAD_GROUP_LEADS = ["many", "most"];
|
|
85
|
+
function matchGroupBehavior(words) {
|
|
86
|
+
const [first, subject, third, gerund] = words;
|
|
87
|
+
if (first !== undefined &&
|
|
88
|
+
subject !== undefined &&
|
|
89
|
+
third === "keep" &&
|
|
90
|
+
gerund !== undefined &&
|
|
91
|
+
BROAD_GROUP_LEADS.includes(first) &&
|
|
92
|
+
HUMAN_GROUP_SUBJECTS.includes(subject) &&
|
|
93
|
+
GROUP_BEHAVIOR_GERUNDS.includes(gerund)) {
|
|
94
|
+
return `${first} ${subject} keep ${gerund}`;
|
|
95
|
+
}
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
function matchUniversalizing(sentence) {
|
|
99
|
+
const words = tokens(cleanSentence(sentence, PREFIXES));
|
|
100
|
+
const group = matchGroupBehavior(words);
|
|
101
|
+
if (group !== undefined) {
|
|
102
|
+
return group;
|
|
103
|
+
}
|
|
104
|
+
for (const subject of SUBJECT_PATTERNS) {
|
|
105
|
+
if (!startsWithWords(words, subject)) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const window = words.slice(subject.length, subject.length + 4);
|
|
109
|
+
const verb = window.find((candidate) => DESIRE_VERBS.includes(candidate)) ??
|
|
110
|
+
window.find((candidate) => CERTAINTY_VERBS.includes(candidate));
|
|
111
|
+
if (verb !== undefined) {
|
|
112
|
+
return `${subject.join(" ")} ${verb}`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
const rule = (context) => {
|
|
118
|
+
const { Syntax, RuleError, locator, report } = context;
|
|
119
|
+
return {
|
|
120
|
+
[Syntax.Document](node) {
|
|
121
|
+
for (const item of allParagraphSentences(node)) {
|
|
122
|
+
const matched = matchUniversalizing(item.sentence.text);
|
|
123
|
+
if (matched === undefined) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
report(item.paragraph, new RuleError(`Universalizing claim found: ${matched}. Replace the broad claim with a bounded claim.`, {
|
|
127
|
+
padding: locator.range([
|
|
128
|
+
item.source.originalStartFor(item.sentence.start),
|
|
129
|
+
item.source.originalEndFor(item.sentence.end)
|
|
130
|
+
])
|
|
131
|
+
}));
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
export default rule;
|
|
137
|
+
//# sourceMappingURL=universalizing-claims.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"universalizing-claims.js","sourceRoot":"","sources":["../../../../src/families/syntactic-patterns/generalization/universalizing-claims.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { cleanSentence, tokens, tokensContainInOrder } from "../../../shared/matchers/prose-patterns.js";
|
|
2
|
+
import { allParagraphSentences } from "../../../shared/text/sections.js";
|
|
3
|
+
const PREFIXES = ["however, ", "but ", "and ", "so ", "that being said, "];
|
|
4
|
+
const VAGUE_INTROS = [
|
|
5
|
+
"some",
|
|
6
|
+
"common",
|
|
7
|
+
"certain",
|
|
8
|
+
"several",
|
|
9
|
+
"following",
|
|
10
|
+
"many",
|
|
11
|
+
"key",
|
|
12
|
+
"main"
|
|
13
|
+
];
|
|
14
|
+
const CATEGORY_WORDS = [
|
|
15
|
+
"examples",
|
|
16
|
+
"types",
|
|
17
|
+
"reasons",
|
|
18
|
+
"factors",
|
|
19
|
+
"foods",
|
|
20
|
+
"triggers",
|
|
21
|
+
"ways",
|
|
22
|
+
"steps",
|
|
23
|
+
"sections",
|
|
24
|
+
"parts",
|
|
25
|
+
"points",
|
|
26
|
+
"things"
|
|
27
|
+
];
|
|
28
|
+
const PREVIEW_OBJECTS = [
|
|
29
|
+
"sections",
|
|
30
|
+
"section",
|
|
31
|
+
"parts",
|
|
32
|
+
"part",
|
|
33
|
+
"pages",
|
|
34
|
+
"page"
|
|
35
|
+
];
|
|
36
|
+
const PREVIEW_VERBS = ["explore", "discuss", "examine", "cover"];
|
|
37
|
+
const REASON_STARTERS = ["reason", "factor", "point", "thing"];
|
|
38
|
+
const ORDINAL_STARTERS = ["one", "another"];
|
|
39
|
+
function matchEnumerationPreface(words) {
|
|
40
|
+
if (words.some((word) => VAGUE_INTROS.includes(word)) &&
|
|
41
|
+
words.some((word) => CATEGORY_WORDS.includes(word)) &&
|
|
42
|
+
words.some((word) => word === "include" || word === "includes")) {
|
|
43
|
+
return "vague-category-include";
|
|
44
|
+
}
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
function matchStarterFrame(words) {
|
|
48
|
+
const [first, second, third] = words;
|
|
49
|
+
if (first !== undefined &&
|
|
50
|
+
second !== undefined &&
|
|
51
|
+
third === "is" &&
|
|
52
|
+
ORDINAL_STARTERS.includes(first) &&
|
|
53
|
+
REASON_STARTERS.includes(second)) {
|
|
54
|
+
return `${first}-${second}-is`;
|
|
55
|
+
}
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
function matchBoilerplateFraming(sentence) {
|
|
59
|
+
const stripped = cleanSentence(sentence, PREFIXES);
|
|
60
|
+
const words = tokens(stripped);
|
|
61
|
+
const matches = [];
|
|
62
|
+
if (tokensContainInOrder(words, [["following"], PREVIEW_OBJECTS, PREVIEW_VERBS])) {
|
|
63
|
+
matches.push("following + explore");
|
|
64
|
+
}
|
|
65
|
+
if (stripped.includes("when it comes to")) {
|
|
66
|
+
matches.push("when it comes to");
|
|
67
|
+
}
|
|
68
|
+
if (tokensContainInOrder(words, [
|
|
69
|
+
["there"],
|
|
70
|
+
["are"],
|
|
71
|
+
["certain", "common"],
|
|
72
|
+
CATEGORY_WORDS
|
|
73
|
+
])) {
|
|
74
|
+
matches.push("there are certain/common");
|
|
75
|
+
}
|
|
76
|
+
const enumeration = matchEnumerationPreface(words);
|
|
77
|
+
if (enumeration !== undefined) {
|
|
78
|
+
matches.push(enumeration);
|
|
79
|
+
}
|
|
80
|
+
const starter = matchStarterFrame(words);
|
|
81
|
+
if (starter !== undefined) {
|
|
82
|
+
matches.push(starter);
|
|
83
|
+
}
|
|
84
|
+
return matches;
|
|
85
|
+
}
|
|
86
|
+
const rule = (context) => {
|
|
87
|
+
const { Syntax, RuleError, locator, report } = context;
|
|
88
|
+
return {
|
|
89
|
+
[Syntax.Document](node) {
|
|
90
|
+
for (const item of allParagraphSentences(node)) {
|
|
91
|
+
for (const signal of matchBoilerplateFraming(item.sentence.text)) {
|
|
92
|
+
report(item.paragraph, new RuleError(`Boilerplate framing found: ${signal}. Start with the specific point.`, {
|
|
93
|
+
padding: locator.range([
|
|
94
|
+
item.source.originalStartFor(item.sentence.start),
|
|
95
|
+
item.source.originalEndFor(item.sentence.end)
|
|
96
|
+
])
|
|
97
|
+
}));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
};
|
|
103
|
+
export default rule;
|
|
104
|
+
//# sourceMappingURL=boilerplate-framing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boilerplate-framing.js","sourceRoot":"","sources":["../../../../src/families/syntactic-patterns/lead-ins/boilerplate-framing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { cleanSentence, containsAny, tokens } from "../../../shared/matchers/prose-patterns.js";
|
|
2
|
+
import { allParagraphSentences } from "../../../shared/text/sections.js";
|
|
3
|
+
const PREFIXES = ["however, ", "but ", "and ", "so "];
|
|
4
|
+
const IMPORTANT_TO_PATTERNS = [
|
|
5
|
+
"it's important to note",
|
|
6
|
+
"it is important to note",
|
|
7
|
+
"it's important to remember",
|
|
8
|
+
"it is important to remember"
|
|
9
|
+
];
|
|
10
|
+
const TRANSITION_PATTERNS = ["that being said", "as such"];
|
|
11
|
+
const CONSULTATION_PATTERNS = [
|
|
12
|
+
"it's always best to consult",
|
|
13
|
+
"it is always best to consult",
|
|
14
|
+
"it's best to consult",
|
|
15
|
+
"it is best to consult",
|
|
16
|
+
"it's recommended to consult",
|
|
17
|
+
"it is recommended to consult"
|
|
18
|
+
];
|
|
19
|
+
const NOTE_PATTERNS = ["please note that", "please note"];
|
|
20
|
+
const QUESTION_PATTERNS = [
|
|
21
|
+
"the useful question is",
|
|
22
|
+
"the useful move is",
|
|
23
|
+
"the practical move is",
|
|
24
|
+
"the real question is",
|
|
25
|
+
"the better question is"
|
|
26
|
+
];
|
|
27
|
+
const ANSWER_PATTERNS = [
|
|
28
|
+
"the answer is simple",
|
|
29
|
+
"the answer is straightforward",
|
|
30
|
+
"the practical answer is",
|
|
31
|
+
"the short answer is",
|
|
32
|
+
"the better conclusion is",
|
|
33
|
+
"the useful conclusion is simple"
|
|
34
|
+
];
|
|
35
|
+
const FRAME_PATTERNS = [
|
|
36
|
+
"the short version",
|
|
37
|
+
"the practical version is",
|
|
38
|
+
"the useful frame",
|
|
39
|
+
"the useful version is",
|
|
40
|
+
"the point is plain enough"
|
|
41
|
+
];
|
|
42
|
+
const SEQUENCE_PATTERNS = [
|
|
43
|
+
"a simple sequence works well",
|
|
44
|
+
"a simple pattern works well",
|
|
45
|
+
"a simple rule works well"
|
|
46
|
+
];
|
|
47
|
+
const WHAT_FRAME_TAIL_STARTERS = [
|
|
48
|
+
"boring",
|
|
49
|
+
"clear",
|
|
50
|
+
"consistent",
|
|
51
|
+
"easy",
|
|
52
|
+
"hard",
|
|
53
|
+
"less",
|
|
54
|
+
"making",
|
|
55
|
+
"more",
|
|
56
|
+
"never",
|
|
57
|
+
"not",
|
|
58
|
+
"plain",
|
|
59
|
+
"practice",
|
|
60
|
+
"rarely",
|
|
61
|
+
"small",
|
|
62
|
+
"smaller",
|
|
63
|
+
"simple",
|
|
64
|
+
"straightforward",
|
|
65
|
+
"true",
|
|
66
|
+
"usually"
|
|
67
|
+
];
|
|
68
|
+
const FRAME_ADJECTIVES = [
|
|
69
|
+
"basic",
|
|
70
|
+
"best",
|
|
71
|
+
"better",
|
|
72
|
+
"biggest",
|
|
73
|
+
"bigger",
|
|
74
|
+
"central",
|
|
75
|
+
"clearest",
|
|
76
|
+
"core",
|
|
77
|
+
"easiest",
|
|
78
|
+
"final",
|
|
79
|
+
"first",
|
|
80
|
+
"hardest",
|
|
81
|
+
"honest",
|
|
82
|
+
"important",
|
|
83
|
+
"main",
|
|
84
|
+
"only",
|
|
85
|
+
"obvious",
|
|
86
|
+
"practical",
|
|
87
|
+
"real",
|
|
88
|
+
"simple",
|
|
89
|
+
"useful"
|
|
90
|
+
];
|
|
91
|
+
const FRAME_NOUNS = [
|
|
92
|
+
"answer",
|
|
93
|
+
"challenge",
|
|
94
|
+
"conclusion",
|
|
95
|
+
"fact",
|
|
96
|
+
"frame",
|
|
97
|
+
"idea",
|
|
98
|
+
"lesson",
|
|
99
|
+
"move",
|
|
100
|
+
"point",
|
|
101
|
+
"problem",
|
|
102
|
+
"question",
|
|
103
|
+
"result",
|
|
104
|
+
"rule",
|
|
105
|
+
"shift",
|
|
106
|
+
"signal",
|
|
107
|
+
"test",
|
|
108
|
+
"thing",
|
|
109
|
+
"truth",
|
|
110
|
+
"version",
|
|
111
|
+
"way",
|
|
112
|
+
"win"
|
|
113
|
+
];
|
|
114
|
+
const ABSTRACT_FRAME_VERBS = ["is", "are", "was"];
|
|
115
|
+
const POINT_NOUNS = ["goal", "job", "key", "point", "takeaway", "trick"];
|
|
116
|
+
function matchModifiedAbstractFrame(words) {
|
|
117
|
+
const [first, second, third, fourth, fifth] = words;
|
|
118
|
+
if (first === "the" &&
|
|
119
|
+
second === "result" &&
|
|
120
|
+
third === "worth" &&
|
|
121
|
+
fourth === "caring" &&
|
|
122
|
+
fifth === "about") {
|
|
123
|
+
return "the-result-worth-caring-about";
|
|
124
|
+
}
|
|
125
|
+
if (first !== "the") {
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
const key = `${second ?? ""}-${third ?? ""}-${fourth ?? ""}`;
|
|
129
|
+
const matches = new Map([
|
|
130
|
+
["better-move-is", "the-better-move-is"],
|
|
131
|
+
["bigger-win-is", "the-bigger-win-is"],
|
|
132
|
+
["useful-move-is", "the-useful-move-is"],
|
|
133
|
+
["useful-alternative-is", "the-useful-alternative-is"],
|
|
134
|
+
["useful-alternatives-are", "the-useful-alternatives-are"]
|
|
135
|
+
]);
|
|
136
|
+
return matches.get(key);
|
|
137
|
+
}
|
|
138
|
+
function matchEvaluativeFrame(words) {
|
|
139
|
+
const [first, second, third, fourth] = words;
|
|
140
|
+
if (first === "the" &&
|
|
141
|
+
second !== undefined &&
|
|
142
|
+
third !== undefined &&
|
|
143
|
+
fourth !== undefined &&
|
|
144
|
+
FRAME_ADJECTIVES.includes(second) &&
|
|
145
|
+
FRAME_NOUNS.includes(third) &&
|
|
146
|
+
ABSTRACT_FRAME_VERBS.includes(fourth)) {
|
|
147
|
+
return `the-${second}-${third}-${fourth}`;
|
|
148
|
+
}
|
|
149
|
+
return undefined;
|
|
150
|
+
}
|
|
151
|
+
function matchPointIsToFrame(words) {
|
|
152
|
+
const [first, second, third, fourth, fifth] = words;
|
|
153
|
+
if (first === "the" &&
|
|
154
|
+
POINT_NOUNS.includes(second ?? "") &&
|
|
155
|
+
third === "is" &&
|
|
156
|
+
fourth === "to" &&
|
|
157
|
+
fifth !== undefined) {
|
|
158
|
+
return `the-${second ?? "point"}-is-to`;
|
|
159
|
+
}
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
function matchWhatFrame(words) {
|
|
163
|
+
const [first, second, third, fourth] = words;
|
|
164
|
+
if (first === "what" &&
|
|
165
|
+
(second === "helps" ||
|
|
166
|
+
second === "matters" ||
|
|
167
|
+
second === "works" ||
|
|
168
|
+
second === "changes") &&
|
|
169
|
+
third === "is" &&
|
|
170
|
+
fourth !== undefined &&
|
|
171
|
+
WHAT_FRAME_TAIL_STARTERS.includes(fourth)) {
|
|
172
|
+
return `what-${second}-is`;
|
|
173
|
+
}
|
|
174
|
+
if (first === "what" && second === "matters" && third === "most") {
|
|
175
|
+
return "what-matters-most";
|
|
176
|
+
}
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
function matchAbstractFrame(text) {
|
|
180
|
+
const words = tokens(text);
|
|
181
|
+
return (matchModifiedAbstractFrame(words) ??
|
|
182
|
+
matchEvaluativeFrame(words) ??
|
|
183
|
+
matchPointIsToFrame(words) ??
|
|
184
|
+
matchWhatFrame(words));
|
|
185
|
+
}
|
|
186
|
+
function matchSignposting(sentence) {
|
|
187
|
+
const stripped = cleanSentence(sentence, PREFIXES);
|
|
188
|
+
const abstract = matchAbstractFrame(stripped);
|
|
189
|
+
if (abstract !== undefined) {
|
|
190
|
+
return { kind: "abstract-evaluation-frame", signal: abstract };
|
|
191
|
+
}
|
|
192
|
+
const checks = [
|
|
193
|
+
["important-to", IMPORTANT_TO_PATTERNS],
|
|
194
|
+
["transition", TRANSITION_PATTERNS],
|
|
195
|
+
["consultation-signpost", CONSULTATION_PATTERNS],
|
|
196
|
+
["note-signpost", NOTE_PATTERNS],
|
|
197
|
+
["question-frame", QUESTION_PATTERNS],
|
|
198
|
+
["answer-frame", ANSWER_PATTERNS],
|
|
199
|
+
["frame-signpost", FRAME_PATTERNS],
|
|
200
|
+
["sequence-frame", SEQUENCE_PATTERNS]
|
|
201
|
+
];
|
|
202
|
+
for (const [kind, patterns] of checks) {
|
|
203
|
+
const signal = containsAny(stripped, patterns);
|
|
204
|
+
if (signal !== undefined) {
|
|
205
|
+
return { kind, signal };
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return undefined;
|
|
209
|
+
}
|
|
210
|
+
const rule = (context) => {
|
|
211
|
+
const { Syntax, RuleError, locator, report } = context;
|
|
212
|
+
return {
|
|
213
|
+
[Syntax.Document](node) {
|
|
214
|
+
for (const item of allParagraphSentences(node)) {
|
|
215
|
+
const matched = matchSignposting(item.sentence.text);
|
|
216
|
+
if (matched === undefined) {
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
report(item.paragraph, new RuleError(`Generic signposting found: ${matched.signal}. Replace the frame with the concrete claim.`, {
|
|
220
|
+
padding: locator.range([
|
|
221
|
+
item.source.originalStartFor(item.sentence.start),
|
|
222
|
+
item.source.originalEndFor(item.sentence.end)
|
|
223
|
+
])
|
|
224
|
+
}));
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
};
|
|
229
|
+
export default rule;
|
|
230
|
+
//# sourceMappingURL=generic-signposting.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generic-signposting.js","sourceRoot":"","sources":["../../../../src/families/syntactic-patterns/lead-ins/generic-signposting.ts"],"names":[],"mappings":"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"}
|