chaffjs 0.22.0 → 0.24.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 +7 -1
- package/dist/api.d.ts +14 -0
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js.map +1 -1
- package/dist/cli-args.d.ts +2 -0
- package/dist/cli-args.d.ts.map +1 -1
- package/dist/cli-args.js +2 -0
- package/dist/cli-args.js.map +1 -1
- package/dist/cli-text.d.ts.map +1 -1
- package/dist/cli-text.js +2 -0
- package/dist/cli-text.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +13 -19
- package/dist/cli.js.map +1 -1
- package/dist/commands/feedback.d.ts +3 -0
- package/dist/commands/feedback.d.ts.map +1 -1
- package/dist/commands/feedback.js.map +1 -1
- package/dist/commands/fix-plan.d.ts.map +1 -1
- package/dist/commands/fix-plan.js +5 -0
- package/dist/commands/fix-plan.js.map +1 -1
- package/dist/commands/rules.d.ts +9 -0
- package/dist/commands/rules.d.ts.map +1 -0
- package/dist/commands/rules.js +26 -0
- package/dist/commands/rules.js.map +1 -0
- package/dist/config/load.d.ts +6 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +1 -0
- package/dist/config/load.js.map +1 -1
- package/dist/config/style.js +1 -1
- package/dist/config/style.js.map +1 -1
- package/dist/config/warnings.d.ts +1 -1
- package/dist/config/warnings.d.ts.map +1 -1
- package/dist/config/warnings.js +3 -1
- package/dist/config/warnings.js.map +1 -1
- package/dist/detectors/bare-comparative.d.ts +26 -0
- package/dist/detectors/bare-comparative.d.ts.map +1 -0
- package/dist/detectors/bare-comparative.js +117 -0
- package/dist/detectors/bare-comparative.js.map +1 -0
- package/dist/detectors/chat-citation.d.ts +6 -0
- package/dist/detectors/chat-citation.d.ts.map +1 -1
- package/dist/detectors/chat-citation.js +26 -1
- package/dist/detectors/chat-citation.js.map +1 -1
- package/dist/detectors/clause-shape.d.ts.map +1 -1
- package/dist/detectors/clause-shape.js +19 -5
- package/dist/detectors/clause-shape.js.map +1 -1
- package/dist/detectors/definition-use.d.ts.map +1 -1
- package/dist/detectors/definition-use.js +4 -2
- package/dist/detectors/definition-use.js.map +1 -1
- package/dist/detectors/ellipsis.d.ts +10 -0
- package/dist/detectors/ellipsis.d.ts.map +1 -0
- package/dist/detectors/ellipsis.js +56 -0
- package/dist/detectors/ellipsis.js.map +1 -0
- package/dist/detectors/generic-heading.d.ts +8 -0
- package/dist/detectors/generic-heading.d.ts.map +1 -0
- package/dist/detectors/generic-heading.js +26 -0
- package/dist/detectors/generic-heading.js.map +1 -0
- package/dist/detectors/ime-residue.d.ts +13 -0
- package/dist/detectors/ime-residue.d.ts.map +1 -0
- package/dist/detectors/ime-residue.js +27 -0
- package/dist/detectors/ime-residue.js.map +1 -0
- package/dist/detectors/lexicon.d.ts.map +1 -1
- package/dist/detectors/lexicon.js +9 -2
- package/dist/detectors/lexicon.js.map +1 -1
- package/dist/detectors/lookalike-character.d.ts +18 -0
- package/dist/detectors/lookalike-character.d.ts.map +1 -0
- package/dist/detectors/lookalike-character.js +50 -0
- package/dist/detectors/lookalike-character.js.map +1 -0
- package/dist/detectors/lowercase-name.d.ts +9 -0
- package/dist/detectors/lowercase-name.d.ts.map +1 -0
- package/dist/detectors/lowercase-name.js +40 -0
- package/dist/detectors/lowercase-name.js.map +1 -0
- package/dist/detectors/registry/bare-comparative.d.ts +3 -0
- package/dist/detectors/registry/bare-comparative.d.ts.map +1 -0
- package/dist/detectors/registry/bare-comparative.js +3 -0
- package/dist/detectors/registry/bare-comparative.js.map +1 -0
- package/dist/detectors/registry/calendar-name-case.d.ts +3 -0
- package/dist/detectors/registry/calendar-name-case.d.ts.map +1 -0
- package/dist/detectors/registry/calendar-name-case.js +3 -0
- package/dist/detectors/registry/calendar-name-case.js.map +1 -0
- package/dist/detectors/registry/ellipsis-consistency.d.ts +3 -0
- package/dist/detectors/registry/ellipsis-consistency.d.ts.map +1 -0
- package/dist/detectors/registry/ellipsis-consistency.js +3 -0
- package/dist/detectors/registry/ellipsis-consistency.js.map +1 -0
- package/dist/detectors/registry/generic-heading.d.ts +3 -0
- package/dist/detectors/registry/generic-heading.d.ts.map +1 -0
- package/dist/detectors/registry/generic-heading.js +3 -0
- package/dist/detectors/registry/generic-heading.js.map +1 -0
- package/dist/detectors/registry/ime-residue.d.ts +3 -0
- package/dist/detectors/registry/ime-residue.d.ts.map +1 -0
- package/dist/detectors/registry/ime-residue.js +3 -0
- package/dist/detectors/registry/ime-residue.js.map +1 -0
- package/dist/detectors/registry/lookalike-character.d.ts +3 -0
- package/dist/detectors/registry/lookalike-character.d.ts.map +1 -0
- package/dist/detectors/registry/lookalike-character.js +3 -0
- package/dist/detectors/registry/lookalike-character.js.map +1 -0
- package/dist/detectors/registry/unit-spacing-consistency.d.ts +3 -0
- package/dist/detectors/registry/unit-spacing-consistency.d.ts.map +1 -0
- package/dist/detectors/registry/unit-spacing-consistency.js +3 -0
- package/dist/detectors/registry/unit-spacing-consistency.js.map +1 -0
- package/dist/detectors/signals.d.ts.map +1 -1
- package/dist/detectors/signals.js +8 -4
- package/dist/detectors/signals.js.map +1 -1
- package/dist/detectors/structure-tree.d.ts.map +1 -1
- package/dist/detectors/structure-tree.js +32 -7
- package/dist/detectors/structure-tree.js.map +1 -1
- package/dist/detectors/technical-docs.d.ts.map +1 -1
- package/dist/detectors/technical-docs.js +14 -0
- package/dist/detectors/technical-docs.js.map +1 -1
- package/dist/detectors/unit-spacing.d.ts +25 -0
- package/dist/detectors/unit-spacing.d.ts.map +1 -0
- package/dist/detectors/unit-spacing.js +50 -0
- package/dist/detectors/unit-spacing.js.map +1 -0
- package/dist/extension/load.d.ts +3 -0
- package/dist/extension/load.d.ts.map +1 -1
- package/dist/extension/load.js +1 -0
- package/dist/extension/load.js.map +1 -1
- package/dist/extension/pack-read.d.ts.map +1 -1
- package/dist/extension/pack-read.js +1 -0
- package/dist/extension/pack-read.js.map +1 -1
- package/dist/extension/plugin-load.js.map +1 -1
- package/dist/extension/plugin-parse.d.ts +7 -0
- package/dist/extension/plugin-parse.d.ts.map +1 -1
- package/dist/extension/plugin-parse.js +18 -2
- package/dist/extension/plugin-parse.js.map +1 -1
- package/dist/extension/problem-text.d.ts.map +1 -1
- package/dist/extension/problem-text.js +5 -0
- package/dist/extension/problem-text.js.map +1 -1
- package/dist/fix-plan/plan.d.ts +4 -0
- package/dist/fix-plan/plan.d.ts.map +1 -1
- package/dist/fix-plan/plan.js +1 -0
- package/dist/fix-plan/plan.js.map +1 -1
- package/dist/fix-plan/render.d.ts.map +1 -1
- package/dist/fix-plan/render.js +9 -0
- package/dist/fix-plan/render.js.map +1 -1
- package/dist/fix-plan/text.d.ts +4 -0
- package/dist/fix-plan/text.d.ts.map +1 -1
- package/dist/fix-plan/text.js +8 -2
- package/dist/fix-plan/text.js.map +1 -1
- package/dist/genre-guide/key-rules.d.ts +10 -0
- package/dist/genre-guide/key-rules.d.ts.map +1 -0
- package/dist/genre-guide/key-rules.js +23 -0
- package/dist/genre-guide/key-rules.js.map +1 -0
- package/dist/genre-guide/layer.d.ts +44 -0
- package/dist/genre-guide/layer.d.ts.map +1 -0
- package/dist/genre-guide/layer.js +43 -0
- package/dist/genre-guide/layer.js.map +1 -0
- package/dist/genre-guide/lines.d.ts +15 -0
- package/dist/genre-guide/lines.d.ts.map +1 -0
- package/dist/genre-guide/lines.js +39 -0
- package/dist/genre-guide/lines.js.map +1 -0
- package/dist/genre-guide/of-config.d.ts +13 -0
- package/dist/genre-guide/of-config.d.ts.map +1 -0
- package/dist/genre-guide/of-config.js +18 -0
- package/dist/genre-guide/of-config.js.map +1 -0
- package/dist/genre-guide/problem-text.d.ts +5 -0
- package/dist/genre-guide/problem-text.d.ts.map +1 -0
- package/dist/genre-guide/problem-text.js +29 -0
- package/dist/genre-guide/problem-text.js.map +1 -0
- package/dist/genre-guide/render.d.ts +5 -0
- package/dist/genre-guide/render.d.ts.map +1 -0
- package/dist/genre-guide/render.js +38 -0
- package/dist/genre-guide/render.js.map +1 -0
- package/dist/genre-guide/report.d.ts +32 -0
- package/dist/genre-guide/report.d.ts.map +1 -0
- package/dist/genre-guide/report.js +42 -0
- package/dist/genre-guide/report.js.map +1 -0
- package/dist/genre-guide/resolve.d.ts +16 -0
- package/dist/genre-guide/resolve.d.ts.map +1 -0
- package/dist/genre-guide/resolve.js +31 -0
- package/dist/genre-guide/resolve.js.map +1 -0
- package/dist/genre-parse.d.ts +5 -1
- package/dist/genre-parse.d.ts.map +1 -1
- package/dist/genre-parse.js +8 -1
- package/dist/genre-parse.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +14 -0
- package/dist/init.js.map +1 -1
- package/dist/quoted-span.d.ts +7 -0
- package/dist/quoted-span.d.ts.map +1 -1
- package/dist/quoted-span.js +20 -0
- package/dist/quoted-span.js.map +1 -1
- package/dist/render/rules-json.d.ts +2 -1
- package/dist/render/rules-json.d.ts.map +1 -1
- package/dist/render/rules-json.js +3 -1
- package/dist/render/rules-json.js.map +1 -1
- package/dist/render/sarif.d.ts +3 -1
- package/dist/render/sarif.d.ts.map +1 -1
- package/dist/render/sarif.js +3 -1
- package/dist/render/sarif.js.map +1 -1
- package/dist/structure/definition-use.d.ts +14 -4
- package/dist/structure/definition-use.d.ts.map +1 -1
- package/dist/structure/definition-use.js +29 -9
- package/dist/structure/definition-use.js.map +1 -1
- package/dist/style-parse.d.ts +3 -0
- package/dist/style-parse.d.ts.map +1 -1
- package/dist/style-parse.js +18 -2
- package/dist/style-parse.js.map +1 -1
- package/genres.yaml +329 -0
- package/package.json +3 -3
- package/rules/calendar-name-case.yaml +55 -0
- package/rules/comparative-without-baseline.yaml +71 -0
- package/rules/cross-doc-broken-link.yaml +1 -1
- package/rules/cross-doc-duplicate-definition.yaml +1 -1
- package/rules/cross-doc-fact-conflict.yaml +1 -1
- package/rules/cross-doc-term-variant.yaml +5 -3
- package/rules/ellipsis-consistency.yaml +73 -0
- package/rules/figurative-density.yaml +84 -0
- package/rules/ime-residue.yaml +55 -0
- package/rules/lookalike-character.yaml +82 -0
- package/rules/numbered-generic-heading.yaml +111 -0
- package/rules/undefined-acronym.yaml +1 -0
- package/rules/unit-spacing-consistency.yaml +74 -0
- package/skills/chaff/SKILL.md +6 -0
- package/src/api.ts +13 -0
- package/src/cli-args.ts +3 -0
- package/src/cli-text.ts +2 -0
- package/src/cli.ts +16 -20
- package/src/commands/feedback.ts +3 -0
- package/src/commands/fix-plan.ts +8 -0
- package/src/commands/rules.ts +34 -0
- package/src/config/load.ts +7 -1
- package/src/config/style.ts +1 -1
- package/src/config/warnings.ts +3 -1
- package/src/detectors/bare-comparative.ts +152 -0
- package/src/detectors/chat-citation.ts +28 -1
- package/src/detectors/clause-shape.ts +20 -6
- package/src/detectors/definition-use.ts +13 -3
- package/src/detectors/ellipsis.ts +74 -0
- package/src/detectors/generic-heading.ts +30 -0
- package/src/detectors/ime-residue.ts +37 -0
- package/src/detectors/lexicon.ts +11 -2
- package/src/detectors/lookalike-character.ts +75 -0
- package/src/detectors/lowercase-name.ts +58 -0
- package/src/detectors/registry/bare-comparative.ts +4 -0
- package/src/detectors/registry/calendar-name-case.ts +4 -0
- package/src/detectors/registry/ellipsis-consistency.ts +4 -0
- package/src/detectors/registry/generic-heading.ts +4 -0
- package/src/detectors/registry/ime-residue.ts +4 -0
- package/src/detectors/registry/lookalike-character.ts +4 -0
- package/src/detectors/registry/unit-spacing-consistency.ts +4 -0
- package/src/detectors/signals.ts +9 -5
- package/src/detectors/structure-tree.ts +55 -30
- package/src/detectors/technical-docs.ts +13 -0
- package/src/detectors/unit-spacing.ts +71 -0
- package/src/extension/load.ts +4 -0
- package/src/extension/pack-read.ts +1 -0
- package/src/extension/plugin-load.ts +1 -1
- package/src/extension/plugin-parse.ts +27 -4
- package/src/extension/problem-text.ts +7 -1
- package/src/fix-plan/plan.ts +5 -0
- package/src/fix-plan/render.ts +9 -0
- package/src/fix-plan/text.ts +12 -2
- package/src/genre-guide/key-rules.ts +37 -0
- package/src/genre-guide/layer.ts +77 -0
- package/src/genre-guide/lines.ts +41 -0
- package/src/genre-guide/of-config.ts +26 -0
- package/src/genre-guide/problem-text.ts +34 -0
- package/src/genre-guide/render.ts +50 -0
- package/src/genre-guide/report.ts +63 -0
- package/src/genre-guide/resolve.ts +36 -0
- package/src/genre-parse.ts +13 -3
- package/src/init.ts +14 -0
- package/src/quoted-span.ts +25 -0
- package/src/render/rules-json.ts +4 -0
- package/src/render/sarif.ts +4 -1
- package/src/structure/definition-use.ts +42 -10
- package/src/style-parse.ts +19 -1
package/src/render/rules-json.ts
CHANGED
|
@@ -14,6 +14,7 @@ import { loadStyles } from "../style-load.ts";
|
|
|
14
14
|
import type { OptionLayer } from "../rule-options.ts";
|
|
15
15
|
import { CUSTOM_TYPES } from "../custom/parse.ts";
|
|
16
16
|
import { DEFAULT_DEPTH, REWRITE_DEPTHS, depthMeaning } from "../rewrite-depth.ts";
|
|
17
|
+
import type { ReportedGuide } from "../genre-guide/report.ts";
|
|
17
18
|
|
|
18
19
|
const TEXT: Texts<{
|
|
19
20
|
readonly offBySetting: string;
|
|
@@ -185,6 +186,7 @@ export const rulesJson = (
|
|
|
185
186
|
language: string,
|
|
186
187
|
genre: string,
|
|
187
188
|
optionLayers: readonly OptionLayer[] = [],
|
|
189
|
+
guide?: ReportedGuide,
|
|
188
190
|
): string => {
|
|
189
191
|
const text = TEXT[uiLanguageOf(language)];
|
|
190
192
|
const preset = presetLevels(genre);
|
|
@@ -196,6 +198,8 @@ export const rulesJson = (
|
|
|
196
198
|
schema_version: 2,
|
|
197
199
|
config_file: "chaff.yaml",
|
|
198
200
|
detected: { genre, language },
|
|
201
|
+
// What a good document of the genre does: null unless the genre was set (--genre, chaff.yaml) and its guide is on.
|
|
202
|
+
guide: guide ?? null,
|
|
199
203
|
...(config.applied === undefined ? {} : { style: styleOf(config) }),
|
|
200
204
|
values_you_can_use: ["strict", "normal", "relaxed", "off"],
|
|
201
205
|
values_note: text.valuesNote,
|
package/src/render/sarif.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { messageOf, readableText } from "./text.ts";
|
|
2
2
|
import type { Finding, RuleDefinition, Severity } from "../plugin.ts";
|
|
3
|
+
import type { RunGuide } from "../genre-guide/report.ts";
|
|
3
4
|
|
|
4
5
|
/**
|
|
5
6
|
* 指摘を SARIF 2.1.0 で出す。GitHub の code scanning に上げるため。
|
|
@@ -114,7 +115,8 @@ const notRunNotifications = (notRun: readonly NotRunOnFile[]): SarifNotification
|
|
|
114
115
|
}));
|
|
115
116
|
};
|
|
116
117
|
|
|
117
|
-
|
|
118
|
+
/** guides: the guides of the genres this run set, each with its language; none adds no run properties. */
|
|
119
|
+
export const renderSarif = (located: readonly Located[], version: string, notRun: readonly NotRunOnFile[] = [], guides: readonly RunGuide[] = []): string => {
|
|
118
120
|
return `${JSON.stringify(
|
|
119
121
|
{
|
|
120
122
|
$schema: SCHEMA,
|
|
@@ -124,6 +126,7 @@ export const renderSarif = (located: readonly Located[], version: string, notRun
|
|
|
124
126
|
tool: { driver: { name: "chaff", version, informationUri: INFORMATION_URI, rules: usedRules(located) } },
|
|
125
127
|
invocations: [{ executionSuccessful: true, toolConfigurationNotifications: notRunNotifications(notRun) }],
|
|
126
128
|
results: located.map(resultOf),
|
|
129
|
+
...(guides.length === 0 ? {} : { properties: { guides: guides.map((entry) => ({ ...entry.guide, language: entry.language })) } }),
|
|
127
130
|
},
|
|
128
131
|
],
|
|
129
132
|
},
|
|
@@ -4,7 +4,13 @@ import { inDocumentOrder } from "./issues.ts";
|
|
|
4
4
|
|
|
5
5
|
// 定義した語が本文で使われているか、定義より前に使われていないか。どちらも木の定義と、本文の文の字面だけで決まる。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
/** bare は、定義の語(means・以下…という・the)の無い括弧の引用(("Seller"))。例を引く括弧と同じ形。 */
|
|
8
|
+
export type DefinedTerm = { readonly term: string; readonly span: Span; readonly line: number; readonly inline: boolean; readonly bare?: boolean };
|
|
9
|
+
|
|
10
|
+
/** 文書の位置 [start, end) の語が、使ったのではなく引用符で例として挙げただけか。 */
|
|
11
|
+
export type Mentioned = (start: number, end: number) => boolean;
|
|
12
|
+
|
|
13
|
+
const NEVER_MENTIONED: Mentioned = () => false;
|
|
8
14
|
|
|
9
15
|
/** 本文の一続き(文)。start は文書の中の位置。 */
|
|
10
16
|
export type BodyText = { readonly start: number; readonly text: string };
|
|
@@ -30,7 +36,8 @@ export const definedTerms = (tree: StructureNode): DefinedTerm[] =>
|
|
|
30
36
|
.replaceAll(EMPHASIS_MARKS, "")
|
|
31
37
|
.trim()
|
|
32
38
|
: "";
|
|
33
|
-
|
|
39
|
+
const bare = node.attrs["form"] === "bare" ? { bare: true } : {};
|
|
40
|
+
return isTerm(term) ? [{ term, span: node.span, line: node.line, inline: node.attrs["placement"] === "inline", ...bare }] : [];
|
|
34
41
|
});
|
|
35
42
|
|
|
36
43
|
const LATIN_EDGE = /^[\p{Script=Latin}\p{N}]|[\p{Script=Latin}\p{N}]$/u;
|
|
@@ -56,11 +63,23 @@ const termPattern = (term: string, caseMatch: CaseMatch): RegExp => {
|
|
|
56
63
|
|
|
57
64
|
const inside = (offset: number, spans: readonly Span[]): boolean => spans.some((span) => span.start <= offset && offset < span.end);
|
|
58
65
|
|
|
59
|
-
/**
|
|
60
|
-
|
|
66
|
+
/**
|
|
67
|
+
* 語の現れ(文書の中の位置)を順に。定義そのもの("Seller" means、(the "Seller"))の中の現れは使用に数えない。
|
|
68
|
+
* mentioned が言う現れ(引用符で例として挙げただけ)も数えない。
|
|
69
|
+
*/
|
|
70
|
+
export const usesOf = (
|
|
71
|
+
term: string,
|
|
72
|
+
texts: readonly BodyText[],
|
|
73
|
+
definitionSpans: readonly Span[],
|
|
74
|
+
caseMatch: CaseMatch = "loose",
|
|
75
|
+
mentioned: Mentioned = NEVER_MENTIONED,
|
|
76
|
+
): number[] => {
|
|
61
77
|
const pattern = termPattern(term, caseMatch);
|
|
62
78
|
return texts.flatMap((body) =>
|
|
63
|
-
[...body.text.matchAll(pattern)]
|
|
79
|
+
[...body.text.matchAll(pattern)]
|
|
80
|
+
.filter((match) => !mentioned(body.start + match.index, body.start + match.index + match[0].length))
|
|
81
|
+
.map((match) => body.start + match.index)
|
|
82
|
+
.filter((offset) => !inside(offset, definitionSpans)),
|
|
64
83
|
);
|
|
65
84
|
};
|
|
66
85
|
|
|
@@ -78,10 +97,20 @@ const groupsOf = (terms: readonly DefinedTerm[]): TermGroup[] => {
|
|
|
78
97
|
};
|
|
79
98
|
|
|
80
99
|
/** 定義したのに、定義の外で一度も使っていない語。同じ語の定義が二つあれば、最初の一つだけを言う(二つ目は duplicate-definition)。 */
|
|
81
|
-
export const unusedDefinitions = (terms: readonly DefinedTerm[], texts: readonly BodyText[]): DefinedTerm[] =>
|
|
82
|
-
groupsOf(terms)
|
|
83
|
-
|
|
100
|
+
export const unusedDefinitions = (terms: readonly DefinedTerm[], texts: readonly BodyText[], mentioned: Mentioned = NEVER_MENTIONED): DefinedTerm[] => {
|
|
101
|
+
const groups = groupsOf(terms);
|
|
102
|
+
const examples = quotesExamples(groups, texts, mentioned);
|
|
103
|
+
return groups
|
|
104
|
+
.filter((group) => !(examples && group.first.bare === true) && usesOf(group.first.term, texts, group.spans).length === 0)
|
|
84
105
|
.map((group) => group.first);
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* 定義の語の無い括弧の引用(("Seller"))を、文書が一つも本文で使っていなければ、それは定義ではなく例の引用
|
|
110
|
+
* (Plain verbs, not metaphors ("silently fails"))。引用符で挙げただけの現れは使用に数えない。
|
|
111
|
+
*/
|
|
112
|
+
const quotesExamples = (groups: readonly TermGroup[], texts: readonly BodyText[], mentioned: Mentioned): boolean =>
|
|
113
|
+
!groups.some((group) => group.first.bare === true && usesOf(group.first.term, texts, group.spans, "loose", mentioned).length > 0);
|
|
85
114
|
|
|
86
115
|
/** offset を含む文。texts は start の昇順で、二分探索で引く。 */
|
|
87
116
|
const sentenceAt = (texts: readonly BodyText[], offset: number): BodyText | undefined => {
|
|
@@ -118,13 +147,16 @@ const isDistinctive = (term: string): boolean => CAPITAL_OR_NON_LATIN.test(term)
|
|
|
118
147
|
* 文の途中で括弧に入れて定義した語((the "Seller")、以下「甲」という)を、その定義の文より前で使っている所。最初の一つだけ。
|
|
119
148
|
* 定義の文の中の現れ(株式会社GovTech東京(以下「GovTech東京」という。))は、定義する名前そのものなので数えない。札の文も数えない。
|
|
120
149
|
* 定義の条("Seller" means、「甲」とは)は条の並びの頭にも終わりにも置く書き方があるので、前で使っても言わない。
|
|
150
|
+
* 定義の語の無い括弧の引用(("The key point is"))は例の引用と同じ形なので、その語を引用符で挙げただけの現れ
|
|
151
|
+
* (Its sentences open with "The key point is")は使用ではない。定義の語のある定義((the "Seller")、以下「買主」という)は、
|
|
152
|
+
* 引用符に入れた現れ(The "Seller" ships)も使用。
|
|
121
153
|
*/
|
|
122
|
-
export const usesBeforeDefinition = (terms: readonly DefinedTerm[], texts: readonly BodyText[]): TermUse[] =>
|
|
154
|
+
export const usesBeforeDefinition = (terms: readonly DefinedTerm[], texts: readonly BodyText[], mentioned: Mentioned = NEVER_MENTIONED): TermUse[] =>
|
|
123
155
|
groupsOf(terms)
|
|
124
156
|
.filter((group) => group.first.inline && isDistinctive(group.first.term))
|
|
125
157
|
.flatMap(({ first: defined, spans }) => {
|
|
126
158
|
const defining = sentenceAt(texts, defined.span.start)?.start ?? defined.span.start;
|
|
127
|
-
const uses = usesOf(defined.term, texts, spans, "exact");
|
|
159
|
+
const uses = usesOf(defined.term, texts, spans, "exact", defined.bare === true ? mentioned : NEVER_MENTIONED);
|
|
128
160
|
const first = uses.find((offset) => !isLabel(sentenceAt(texts, offset), defined.term));
|
|
129
161
|
return first !== undefined && first < defining ? [{ term: defined, offset: first }] : [];
|
|
130
162
|
});
|
package/src/style-parse.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { isLevel } from "./levels.ts";
|
|
2
2
|
import type { Level, Localized } from "./plugin.ts";
|
|
3
|
+
import { guideLayerOf, type GuideLayer } from "./genre-guide/layer.ts";
|
|
4
|
+
import { guideProblemText } from "./genre-guide/problem-text.ts";
|
|
5
|
+
import { knownGenres } from "./known-genres.ts";
|
|
3
6
|
|
|
4
7
|
// A house style (styles/*.yaml): a well-known guideline a team picks with style: in chaff.yaml. It sets rule levels and
|
|
5
8
|
// options, and says where they come from. Pure: the YAML comes in already parsed.
|
|
@@ -21,6 +24,8 @@ export type StyleDefinition = {
|
|
|
21
24
|
readonly options: Readonly<Record<string, Readonly<Record<string, unknown>>>>;
|
|
22
25
|
/** The numbers the guideline sets, by language. The rule needs a level under rules too, or the limit decides nothing. */
|
|
23
26
|
readonly limits: StyleLimits;
|
|
27
|
+
/** Its changes to the genre guides (genre-guide/layer.ts), between a rule pack's and chaff.yaml's. */
|
|
28
|
+
readonly guide?: GuideLayer | undefined;
|
|
24
29
|
};
|
|
25
30
|
|
|
26
31
|
const isRecord = (value: unknown): value is Record<string, unknown> => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -85,6 +90,15 @@ const limitsOf = (value: unknown, rules: Readonly<Record<string, Level>>, where:
|
|
|
85
90
|
);
|
|
86
91
|
};
|
|
87
92
|
|
|
93
|
+
/** The style's guide: as a layer named after the style. undefined when it writes none. */
|
|
94
|
+
const guideOf = (value: unknown, id: string, where: string): GuideLayer | undefined => {
|
|
95
|
+
if (value === undefined) return undefined;
|
|
96
|
+
const read = guideLayerOf(value, `style: ${id}`, knownGenres());
|
|
97
|
+
const [problem] = read.problems;
|
|
98
|
+
if (problem !== undefined) throw new Error(`${where}: ${guideProblemText(problem, "en")}`);
|
|
99
|
+
return read.layer;
|
|
100
|
+
};
|
|
101
|
+
|
|
88
102
|
/** One style file. Throws on anything it cannot read: the file ships with chaff, so a wrong entry is chaff's bug. */
|
|
89
103
|
export const parseStyle = (raw: unknown, file: string): StyleDefinition => {
|
|
90
104
|
const id = isRecord(raw) ? raw["id"] : undefined;
|
|
@@ -99,7 +113,10 @@ export const styleOf = (raw: unknown, where: string): StyleDefinition => {
|
|
|
99
113
|
if (typeof id !== "string" || id === "") throw new Error(`${where}: a style needs an id`);
|
|
100
114
|
const rules = levelsOf(raw["rules"], where);
|
|
101
115
|
const options = optionsOf(raw["options"], where);
|
|
102
|
-
|
|
116
|
+
const guide = guideOf(raw["guide"], id, where);
|
|
117
|
+
if (Object.keys(rules).length === 0 && Object.keys(options).length === 0 && guide === undefined) {
|
|
118
|
+
throw new Error(`${where}: a style must set rules, options or guide`);
|
|
119
|
+
}
|
|
103
120
|
return {
|
|
104
121
|
id,
|
|
105
122
|
name: localizedOf(raw["name"], "name", where),
|
|
@@ -108,5 +125,6 @@ export const styleOf = (raw: unknown, where: string): StyleDefinition => {
|
|
|
108
125
|
rules,
|
|
109
126
|
options,
|
|
110
127
|
limits: limitsOf(raw["limits"], rules, where),
|
|
128
|
+
...(guide === undefined ? {} : { guide }),
|
|
111
129
|
};
|
|
112
130
|
};
|