paperlint 6.0.0 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/latex/index.d.ts +1 -1
- package/dist/adapters/latex/index.d.ts.map +1 -1
- package/dist/adapters/latex/index.js +3 -2
- package/dist/adapters/latex/index.js.map +1 -1
- package/dist/adapters/latex/prose.d.ts +6 -1
- package/dist/adapters/latex/prose.d.ts.map +1 -1
- package/dist/adapters/latex/prose.js +142 -31
- package/dist/adapters/latex/prose.js.map +1 -1
- package/dist/adapters/mp4box/index.d.ts +4 -0
- package/dist/adapters/mp4box/index.d.ts.map +1 -0
- package/dist/adapters/mp4box/index.js +46 -0
- package/dist/adapters/mp4box/index.js.map +1 -0
- package/dist/adapters/node/index.d.ts +1 -0
- package/dist/adapters/node/index.d.ts.map +1 -1
- package/dist/adapters/node/index.js +1 -0
- package/dist/adapters/node/index.js.map +1 -1
- package/dist/adapters/node/list-dir.io.d.ts +3 -0
- package/dist/adapters/node/list-dir.io.d.ts.map +1 -0
- package/dist/adapters/node/list-dir.io.js +15 -0
- package/dist/adapters/node/list-dir.io.js.map +1 -0
- package/dist/adapters/png/index.d.ts +11 -0
- package/dist/adapters/png/index.d.ts.map +1 -0
- package/dist/adapters/png/index.js +21 -0
- package/dist/adapters/png/index.js.map +1 -0
- package/dist/adapters/srt/index.d.ts +4 -0
- package/dist/adapters/srt/index.d.ts.map +1 -0
- package/dist/adapters/srt/index.js +12 -0
- package/dist/adapters/srt/index.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +40 -22
- package/dist/cli.js.map +1 -1
- package/dist/domain/register.d.ts +96 -0
- package/dist/domain/register.d.ts.map +1 -0
- package/dist/domain/register.js +136 -0
- package/dist/domain/register.js.map +1 -0
- package/dist/domain/talk.d.ts +121 -0
- package/dist/domain/talk.d.ts.map +1 -0
- package/dist/domain/talk.js +121 -0
- package/dist/domain/talk.js.map +1 -0
- package/dist/domain/tex-document.d.ts +19 -0
- package/dist/domain/tex-document.d.ts.map +1 -1
- package/dist/domain/tex-document.js +8 -3
- package/dist/domain/tex-document.js.map +1 -1
- package/dist/lib/paper-config.d.ts +2 -0
- package/dist/lib/paper-config.d.ts.map +1 -1
- package/dist/lib/paper-config.js +3 -0
- package/dist/lib/paper-config.js.map +1 -1
- package/dist/paper-settings.d.ts +3 -0
- package/dist/paper-settings.d.ts.map +1 -1
- package/dist/paper-settings.js +15 -9
- package/dist/paper-settings.js.map +1 -1
- package/dist/ports/latex.d.ts +6 -1
- package/dist/ports/latex.d.ts.map +1 -1
- package/dist/ports/talk-media.d.ts +18 -0
- package/dist/ports/talk-media.d.ts.map +1 -0
- package/dist/ports/talk-media.js +2 -0
- package/dist/ports/talk-media.js.map +1 -0
- package/dist/presets.d.ts +6 -0
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +8 -9
- package/dist/presets.js.map +1 -1
- package/dist/register-bands.d.ts +37 -0
- package/dist/register-bands.d.ts.map +1 -0
- package/dist/register-bands.js +196 -0
- package/dist/register-bands.js.map +1 -0
- package/dist/register.d.ts +4 -2
- package/dist/register.d.ts.map +1 -1
- package/dist/register.js +6 -45
- package/dist/register.js.map +1 -1
- package/dist/talk-rules.d.ts +65 -0
- package/dist/talk-rules.d.ts.map +1 -0
- package/dist/talk-rules.js +451 -0
- package/dist/talk-rules.js.map +1 -0
- package/dist/tex-requirements.d.ts +9 -0
- package/dist/tex-requirements.d.ts.map +1 -1
- package/dist/tex-requirements.js +28 -6
- package/dist/tex-requirements.js.map +1 -1
- package/dist/tex-venue-rules.d.ts +1 -1
- package/dist/tex-venue-rules.d.ts.map +1 -1
- package/dist/tex-venue-rules.js.map +1 -1
- package/docs/configuration.md +2 -1
- package/docs/rules/talk/captions-cover.md +47 -0
- package/docs/rules/talk/duration-floor.md +38 -0
- package/docs/rules/talk/duration.md +43 -0
- package/docs/rules/talk/one-slide-size.md +38 -0
- package/docs/rules/talk/profile.md +64 -0
- package/docs/rules/talk/required-files.md +39 -0
- package/docs/rules/talk/undeclared.md +35 -0
- package/docs/rules/talk/video-format.md +43 -0
- package/docs/rules/tex/claim-emphasis.md +71 -0
- package/docs/rules/tex/contrast-frames.md +100 -0
- package/docs/rules/tex/relation-markers.md +72 -0
- package/docs/rules.md +57 -42
- package/docs/talk.md +94 -0
- package/fixtures/talk/audio-only.mp4 +0 -0
- package/fixtures/talk/one-slide.png +0 -0
- package/fixtures/talk/short-audio.mp4 +0 -0
- package/fixtures/talk/talk.mov +0 -0
- package/fixtures/talk/talk.mp4 +0 -0
- package/fixtures/talk/talk.srt +7 -0
- package/lib/paper-config.harness.mjs +5 -2
- package/lib/paper-config.ts +4 -0
- package/package.json +3 -1
- package/presets/agenticdev.jsonc +29 -0
- package/presets/aidc.jsonc +50 -0
- package/presets/venue-profile.schema.json +180 -1
- package/skills/grade-paper-writing/SKILL.md +59 -27
- package/skills/grade-paper-writing/SKILL.md.spec.ts +58 -26
- package/src/adapters/latex/index.test.ts +91 -0
- package/src/adapters/latex/index.ts +3 -2
- package/src/adapters/latex/prose.ts +188 -58
- package/src/adapters/mp4box/index.test.ts +63 -0
- package/src/adapters/mp4box/index.ts +50 -0
- package/src/adapters/node/index.ts +1 -0
- package/src/adapters/node/list-dir.io.ts +15 -0
- package/src/adapters/node/list-dir.test.ts +30 -0
- package/src/adapters/png/index.test.ts +43 -0
- package/src/adapters/png/index.ts +29 -0
- package/src/adapters/srt/index.test.ts +24 -0
- package/src/adapters/srt/index.ts +13 -0
- package/src/cli.test.ts +12 -0
- package/src/cli.ts +50 -21
- package/src/domain/register.test.ts +153 -0
- package/src/domain/register.ts +261 -0
- package/src/domain/talk.test.ts +125 -0
- package/src/domain/talk.ts +274 -0
- package/src/domain/tex-document.ts +37 -3
- package/src/new-paper.test.ts +1 -0
- package/src/paper-settings.test.ts +18 -1
- package/src/paper-settings.ts +21 -11
- package/src/ports/latex.ts +6 -0
- package/src/ports/talk-media.ts +19 -0
- package/src/presets.ts +14 -9
- package/src/register-bands.test.ts +327 -0
- package/src/register-bands.ts +291 -0
- package/src/register.ts +7 -37
- package/src/rule-cases.test.ts +177 -20
- package/src/talk-rules.test.ts +459 -0
- package/src/talk-rules.ts +672 -0
- package/src/tex-requirements.ts +56 -8
- package/src/tex-venue-rules.ts +7 -1
package/dist/presets.js
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
* tex union — a child never removes a package its parent needs
|
|
20
20
|
* format per key, the child wins; `kinds` by kind name, a child's kind replaces that kind
|
|
21
21
|
* rules per rule id, the child wins
|
|
22
|
-
* template the child wins; so does `name`, and `required_sections` (
|
|
22
|
+
* template the child wins; so does `name`, and `required_sections`, `register` and `talk` (each whole)
|
|
23
23
|
* aliases union, with every `name` — what the venue is called along the chain
|
|
24
24
|
*
|
|
25
25
|
* ── THE LABEL ─────────────────────────────────────────────────────────────────────
|
|
@@ -129,6 +129,8 @@ function merged(spec, rootFirst) {
|
|
|
129
129
|
tex: NO_REQUIREMENTS,
|
|
130
130
|
format: NO_FORMAT,
|
|
131
131
|
rules: {},
|
|
132
|
+
registerAnchors: [],
|
|
133
|
+
talk: null,
|
|
132
134
|
};
|
|
133
135
|
const m = rootFirst.reduce((acc, { preset: p, file }) => ({
|
|
134
136
|
name: p.name ?? acc.name,
|
|
@@ -145,17 +147,14 @@ function merged(spec, rootFirst) {
|
|
|
145
147
|
tex: p.tex ? mergeRequirements(acc.tex, p.tex) : acc.tex,
|
|
146
148
|
format: mergeFormat(acc.format, p.format),
|
|
147
149
|
rules: { ...acc.rules, ...p.rules },
|
|
150
|
+
registerAnchors: p.registerAnchors ?? acc.registerAnchors,
|
|
151
|
+
talk: p.talk ?? acc.talk,
|
|
148
152
|
}), base);
|
|
153
|
+
const { name, ...rest } = m;
|
|
149
154
|
return {
|
|
150
|
-
label:
|
|
155
|
+
label: name ?? labelOf(spec),
|
|
151
156
|
chain: rootFirst.map((x) => x.file),
|
|
152
|
-
|
|
153
|
-
aliases: m.aliases,
|
|
154
|
-
blind: m.blind,
|
|
155
|
-
requiredSections: m.requiredSections,
|
|
156
|
-
tex: m.tex,
|
|
157
|
-
format: m.format,
|
|
158
|
-
rules: m.rules,
|
|
157
|
+
...rest,
|
|
159
158
|
};
|
|
160
159
|
}
|
|
161
160
|
/**
|
package/dist/presets.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,WAAW,EACX,aAAa,EACb,UAAU,GAKX,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,oBAAoB,CAAC;AAE1D,OAAO,EACL,iBAAiB,GAGlB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"presets.js","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type Band, type Occurrence, type RegisterAnchor } from "./domain/register.ts";
|
|
2
|
+
import type { Span } from "./domain/tex-document.ts";
|
|
3
|
+
import type { LatexReader } from "./ports/latex.ts";
|
|
4
|
+
import { type Located, type TexRuleModule } from "./tex-venue-rules.ts";
|
|
5
|
+
import type { VenueRuleDeps } from "./venue-rules.ts";
|
|
6
|
+
/** What the three rules read: the preset store, and the LaTeX reader. */
|
|
7
|
+
export interface RegisterBandDeps extends VenueRuleDeps {
|
|
8
|
+
readonly latex: LatexReader;
|
|
9
|
+
}
|
|
10
|
+
export type RegisterBandRuleName = "contrast-frames" | "claim-emphasis" | "relation-markers";
|
|
11
|
+
/** What one body measures for one rule: its words, the occurrences, where the body starts. */
|
|
12
|
+
export interface BodyMeasure {
|
|
13
|
+
readonly words: number;
|
|
14
|
+
readonly occurrences: readonly Occurrence[];
|
|
15
|
+
readonly at: Span | null;
|
|
16
|
+
}
|
|
17
|
+
/** How a rate stands against a band. */
|
|
18
|
+
export type Standing = "below" | "within" | "above";
|
|
19
|
+
export declare const standingOf: (rate: number, band: Band) => Standing;
|
|
20
|
+
/**
|
|
21
|
+
* A body against a band: nothing within it; outside it, one finding at the body's start naming the
|
|
22
|
+
* count, the rate, the band and the anchors' range — and, above it when `each` is set, one finding
|
|
23
|
+
* at every occurrence, so an editor shows the author where to rewrite.
|
|
24
|
+
*/
|
|
25
|
+
export declare function judgeBand(m: BodyMeasure, band: Band | null, venue: string, each: boolean): readonly Located[];
|
|
26
|
+
/** What a body measures for a rule: its words, its occurrences, and where it starts. */
|
|
27
|
+
export declare function measureBody(rule: RegisterBandRuleName, src: string, latex: LatexReader): BodyMeasure;
|
|
28
|
+
/**
|
|
29
|
+
* A paper as a preset records it among its anchors: its body's words and its count of every
|
|
30
|
+
* measure, by the rules' own counters — the one way an anchor is measured.
|
|
31
|
+
*/
|
|
32
|
+
export declare function anchorOf(paper: string, src: string, latex: LatexReader): RegisterAnchor;
|
|
33
|
+
/** The three rules, as rules of the `tex` plugin. */
|
|
34
|
+
export declare function registerBandRules(deps: RegisterBandDeps): Readonly<Record<RegisterBandRuleName, TexRuleModule>>;
|
|
35
|
+
/** The level each rule is on at in paperlint's own config, for every `paper.tex`. */
|
|
36
|
+
export declare const REGISTER_BAND_RULE_LEVELS: Readonly<Record<`tex/${RegisterBandRuleName}`, "warn">>;
|
|
37
|
+
//# sourceMappingURL=register-bands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-bands.d.ts","sourceRoot":"","sources":["../src/register-bands.ts"],"names":[],"mappings":"AAyBA,OAAO,EAQL,KAAK,IAAI,EACT,KAAK,UAAU,EACf,KAAK,cAAc,EAEpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAqB,IAAI,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIpD,OAAO,EAEL,KAAK,OAAO,EAEZ,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEtD,yEAAyE;AACzE,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACrD,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC7B;AAED,MAAM,MAAM,oBAAoB,GAC9B,iBAAiB,GAAG,gBAAgB,GAAG,kBAAkB,CAAC;AAE5D,8FAA8F;AAC9F,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5C,QAAQ,CAAC,EAAE,EAAE,IAAI,GAAG,IAAI,CAAC;CAC1B;AAED,wCAAwC;AACxC,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEpD,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,MAAM,IAAI,KAAG,QACY,CAAC;AA8BnE;;;;GAIG;AACH,wBAAgB,SAAS,CACvB,CAAC,EAAE,WAAW,EACd,IAAI,EAAE,IAAI,GAAG,IAAI,EACjB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,OAAO,GACZ,SAAS,OAAO,EAAE,CAapB;AA4DD,wFAAwF;AACxF,wBAAgB,WAAW,CACzB,IAAI,EAAE,oBAAoB,EAC1B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,GACjB,WAAW,CASb;AASD;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,WAAW,GACjB,cAAc,CAchB;AA4CD,qDAAqD;AACrD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,gBAAgB,GACrB,QAAQ,CAAC,MAAM,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC,CAMvD;AAED,qFAAqF;AACrF,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAC9C,MAAM,CAAC,OAAO,oBAAoB,EAAE,EAAE,MAAM,CAAC,CAK9C,CAAC"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE REGISTER RULES THAT MEASURE A BODY AGAINST ITS VENUE'S ACCEPTED PAPERS — each a rate per
|
|
3
|
+
* 10,000 words, judged against the band the venue preset's anchors set (`src/domain/register.ts`):
|
|
4
|
+
*
|
|
5
|
+
* tex/contrast-frames warn «X, not Y», «rather than», «instead of» … outside the band; above it,
|
|
6
|
+
* each frame is reported where it stands
|
|
7
|
+
* tex/claim-emphasis warn claims set in bold inside a sentence outside the band; above it, each
|
|
8
|
+
* is reported where it stands
|
|
9
|
+
* tex/relation-markers warn words naming how a sentence relates to the one before (because,
|
|
10
|
+
* therefore, however, for example …) outside the band
|
|
11
|
+
*
|
|
12
|
+
* ── WHY ──────────────────────────────────────────────────────────────────────────
|
|
13
|
+
* Reviewers called a paper "too informal" and "a blogpost". Its text differed from the accepted
|
|
14
|
+
* papers of the venue's parent conference in exactly these three counts, each several times over
|
|
15
|
+
* the anchors' range, while sentence length, contractions, questions and the second person did not
|
|
16
|
+
* separate them. The measurements are on the rules' pages.
|
|
17
|
+
*
|
|
18
|
+
* ── TWO-SIDED, AND THE VENUE'S OWN ───────────────────────────────────────────────
|
|
19
|
+
* Every rule judges both ends of its band: a rewrite that strips every relation marker is as far
|
|
20
|
+
* from the venue as one that stacks contrast frames. The band is the venue preset's, derived from
|
|
21
|
+
* its anchors, so a venue with other accepted papers gets another band, and a preset without
|
|
22
|
+
* anchors is not judged — there is nothing to compare, as `tex/template` is silent for a preset that
|
|
23
|
+
* names no template. A body under `MIN_WORDS` is not judged either: one sentence would decide it.
|
|
24
|
+
*/
|
|
25
|
+
import { basename, dirname } from "node:path";
|
|
26
|
+
import { bandOf, bodySentences, claimEmphasis, contrastFrames, rateOf, relationMarkers, wordsOf, } from "./domain/register.js";
|
|
27
|
+
import { paperPreset } from "./presets.js";
|
|
28
|
+
import { MIN_WORDS, startOf } from "./register.js";
|
|
29
|
+
import { readPaper, reportInPaper } from "./tex-paper.js";
|
|
30
|
+
import { ruleDocsUrl, } from "./tex-venue-rules.js";
|
|
31
|
+
export const standingOf = (rate, band) => rate < band.min ? "below" : rate > band.max ? "above" : "within";
|
|
32
|
+
const fixed = (n) => n.toFixed(1);
|
|
33
|
+
/** How many examples a finding about the whole body quotes. */
|
|
34
|
+
const EXAMPLES = 3;
|
|
35
|
+
/** What every message about a body names: its count and rate, the band, the anchors' range, examples. */
|
|
36
|
+
function dataOf(m, band, venue) {
|
|
37
|
+
return {
|
|
38
|
+
count: m.occurrences.length,
|
|
39
|
+
words: m.words,
|
|
40
|
+
rate: fixed(rateOf(m.occurrences.length, m.words)),
|
|
41
|
+
venue,
|
|
42
|
+
min: fixed(band.min),
|
|
43
|
+
max: fixed(band.max),
|
|
44
|
+
anchors: band.anchors,
|
|
45
|
+
anchorMin: fixed(band.anchorMin),
|
|
46
|
+
anchorMax: fixed(band.anchorMax),
|
|
47
|
+
examples: m.occurrences
|
|
48
|
+
.slice(0, EXAMPLES)
|
|
49
|
+
.map((o) => `«${o.sentence}»`)
|
|
50
|
+
.join(", "),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A body against a band: nothing within it; outside it, one finding at the body's start naming the
|
|
55
|
+
* count, the rate, the band and the anchors' range — and, above it when `each` is set, one finding
|
|
56
|
+
* at every occurrence, so an editor shows the author where to rewrite.
|
|
57
|
+
*/
|
|
58
|
+
export function judgeBand(m, band, venue, each) {
|
|
59
|
+
if (band === null || m.words < MIN_WORDS)
|
|
60
|
+
return [];
|
|
61
|
+
const standing = standingOf(rateOf(m.occurrences.length, m.words), band);
|
|
62
|
+
if (standing === "within")
|
|
63
|
+
return [];
|
|
64
|
+
const data = dataOf(m, band, venue);
|
|
65
|
+
const whole = { messageId: standing, data, at: m.at };
|
|
66
|
+
if (standing === "below" || !each)
|
|
67
|
+
return [whole];
|
|
68
|
+
const at = (o, i) => ({
|
|
69
|
+
messageId: "each",
|
|
70
|
+
data: { ...data, match: o.match, index: i + 1 },
|
|
71
|
+
at: o.at,
|
|
72
|
+
});
|
|
73
|
+
return [whole, ...m.occurrences.map(at)];
|
|
74
|
+
}
|
|
75
|
+
/** The band words every message shares: the rate, and where the venue's anchors put it. */
|
|
76
|
+
const AGAINST = "{{rate}} per 10,000 words; {{venue}}'s {{anchors}} anchor papers measure {{anchorMin}}–{{anchorMax}}, and this rule warns outside {{min}}–{{max}}";
|
|
77
|
+
const MEASURES = {
|
|
78
|
+
"contrast-frames": {
|
|
79
|
+
name: "contrast_frames",
|
|
80
|
+
description: "contrast frames («X, not Y», «rather than», «instead of») stay within the rate the venue's accepted papers show",
|
|
81
|
+
each: true,
|
|
82
|
+
count: (b) => contrastFrames(bodySentences(b.passages)),
|
|
83
|
+
messages: {
|
|
84
|
+
above: `{{count}} contrast frames («X, not Y», «not X but Y», «rather than», «instead of», «as opposed to») — ${AGAINST}. First: {{examples}}. Say what the thing is and why, with the evidence; keep a frame only where a reader would otherwise assume the rejected alternative`,
|
|
85
|
+
below: `{{count}} contrast frames — ${AGAINST}. A rewrite may have dropped relations the argument needs: check that each claim still says what it is set against`,
|
|
86
|
+
each: "contrast frame «{{match}}» ({{index}} of {{count}}; the body is at {{rate}} per 10,000 words, above {{venue}}'s {{max}})",
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
"claim-emphasis": {
|
|
90
|
+
name: "claim_emphasis",
|
|
91
|
+
description: "claims set in bold inside a sentence stay within the rate the venue's accepted papers show",
|
|
92
|
+
each: true,
|
|
93
|
+
count: (b) => claimEmphasis(b.emphasis()),
|
|
94
|
+
messages: {
|
|
95
|
+
above: `{{count}} claims set in bold inside a sentence (a bold phrase of six words or more, or holding a number) — ${AGAINST}. First: {{examples}}. Accepted papers set a term or a label in bold; take the bold off a finding and let the sentence, a table or a figure carry it`,
|
|
96
|
+
below: `{{count}} claims set in bold inside a sentence — ${AGAINST}`,
|
|
97
|
+
each: "a claim set in bold, «{{match}}» ({{index}} of {{count}}; the body is at {{rate}} per 10,000 words, above {{venue}}'s {{max}})",
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
"relation-markers": {
|
|
101
|
+
name: "relation_markers",
|
|
102
|
+
description: "words that name how a sentence relates to the one before (because, therefore, however, for example) stay within the rate the venue's accepted papers show",
|
|
103
|
+
each: false,
|
|
104
|
+
count: (b) => relationMarkers(bodySentences(b.passages)),
|
|
105
|
+
messages: {
|
|
106
|
+
below: `{{count}} words name how a sentence relates to the one before (because, therefore, however, in contrast, for example, that is …) — ${AGAINST}. Where two sentences stand side by side, say whether the second is the cause, the consequence, an example or a limit of the first`,
|
|
107
|
+
above: `{{count}} relation markers — ${AGAINST}. First: {{examples}}`,
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
/** What a body measures for a rule: its words, its occurrences, and where it starts. */
|
|
112
|
+
export function measureBody(rule, src, latex) {
|
|
113
|
+
const passages = latex.bodyProse(src);
|
|
114
|
+
const [first] = passages;
|
|
115
|
+
const body = { passages, emphasis: () => latex.bodyEmphasis(src) };
|
|
116
|
+
return {
|
|
117
|
+
words: wordsOf(bodySentences(passages)),
|
|
118
|
+
occurrences: MEASURES[rule].count(body),
|
|
119
|
+
at: first === undefined ? null : startOf(first),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/** Which rule counts each measure an anchor records. */
|
|
123
|
+
const RULE_OF = {
|
|
124
|
+
contrast_frames: "contrast-frames",
|
|
125
|
+
claim_emphasis: "claim-emphasis",
|
|
126
|
+
relation_markers: "relation-markers",
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* A paper as a preset records it among its anchors: its body's words and its count of every
|
|
130
|
+
* measure, by the rules' own counters — the one way an anchor is measured.
|
|
131
|
+
*/
|
|
132
|
+
export function anchorOf(paper, src, latex) {
|
|
133
|
+
const passages = latex.bodyProse(src);
|
|
134
|
+
const body = { passages, emphasis: () => latex.bodyEmphasis(src) };
|
|
135
|
+
const count = (m) => MEASURES[RULE_OF[m]].count(body).length;
|
|
136
|
+
return {
|
|
137
|
+
paper,
|
|
138
|
+
words: wordsOf(bodySentences(passages)),
|
|
139
|
+
counts: {
|
|
140
|
+
contrast_frames: count("contrast_frames"),
|
|
141
|
+
claim_emphasis: count("claim_emphasis"),
|
|
142
|
+
relation_markers: count("relation_markers"),
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
}
|
|
146
|
+
/** The findings for the paper whose `paper.tex` is `filename`; none when its preset has no anchors. */
|
|
147
|
+
function judgePaper(name, context, deps) {
|
|
148
|
+
const p = paperPreset(dirname(context.filename), deps);
|
|
149
|
+
if (p.kind !== "resolved")
|
|
150
|
+
return;
|
|
151
|
+
const measure = MEASURES[name];
|
|
152
|
+
const band = bandOf(p.preset.registerAnchors, measure.name);
|
|
153
|
+
if (band === null)
|
|
154
|
+
return;
|
|
155
|
+
const sc = context.sourceCode;
|
|
156
|
+
const paper = readPaper(context.filename, sc.raw ?? sc.text, deps);
|
|
157
|
+
const m = measureBody(name, paper.text, deps.latex);
|
|
158
|
+
const findings = judgeBand(m, band, p.preset.label, measure.each);
|
|
159
|
+
reportInPaper(context, measure.messages, paper, findings);
|
|
160
|
+
}
|
|
161
|
+
function rule(name, deps) {
|
|
162
|
+
const measure = MEASURES[name];
|
|
163
|
+
return {
|
|
164
|
+
meta: {
|
|
165
|
+
type: "suggestion",
|
|
166
|
+
docs: { description: measure.description, url: ruleDocsUrl(name) },
|
|
167
|
+
schema: [],
|
|
168
|
+
messages: measure.messages,
|
|
169
|
+
},
|
|
170
|
+
create(context) {
|
|
171
|
+
// Judged once per paper, on its paper.tex: the paper directory is the file's directory.
|
|
172
|
+
if (basename(context.filename) !== "paper.tex")
|
|
173
|
+
return {};
|
|
174
|
+
return {
|
|
175
|
+
root: () => {
|
|
176
|
+
judgePaper(name, context, deps);
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/** The three rules, as rules of the `tex` plugin. */
|
|
183
|
+
export function registerBandRules(deps) {
|
|
184
|
+
return {
|
|
185
|
+
"contrast-frames": rule("contrast-frames", deps),
|
|
186
|
+
"claim-emphasis": rule("claim-emphasis", deps),
|
|
187
|
+
"relation-markers": rule("relation-markers", deps),
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
/** The level each rule is on at in paperlint's own config, for every `paper.tex`. */
|
|
191
|
+
export const REGISTER_BAND_RULE_LEVELS = {
|
|
192
|
+
"tex/contrast-frames": "warn",
|
|
193
|
+
"tex/claim-emphasis": "warn",
|
|
194
|
+
"tex/relation-markers": "warn",
|
|
195
|
+
};
|
|
196
|
+
//# sourceMappingURL=register-bands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-bands.js","sourceRoot":"","sources":["../src/register-bands.ts"],"names":[],"mappings":"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"}
|
package/dist/register.d.ts
CHANGED
|
@@ -15,10 +15,10 @@
|
|
|
15
15
|
* (src/domain/sentences.ts). A citation, a cross-reference or math reads as one word, as it does on
|
|
16
16
|
* the page. A body under 2 000 words is not judged: there one sentence decides the rate.
|
|
17
17
|
*/
|
|
18
|
-
import {
|
|
18
|
+
import type { Passage, Span } from "./domain/tex-document.ts";
|
|
19
19
|
import { type PaperDeps } from "./tex-paper.ts";
|
|
20
20
|
import { type Located, type TexRuleModule } from "./tex-venue-rules.ts";
|
|
21
|
-
/** Under this many words in the body,
|
|
21
|
+
/** Under this many words in the body, a rate is not judged: one sentence would decide it. */
|
|
22
22
|
export declare const MIN_WORDS = 2000;
|
|
23
23
|
/** The limit when the config sets none, from the measurement on the rule's page. */
|
|
24
24
|
export declare const DEFAULT_LIMIT = 0.8;
|
|
@@ -31,6 +31,8 @@ export interface RegisterMeasure {
|
|
|
31
31
|
/** Where the body's first passage starts, for a finding about the whole body. */
|
|
32
32
|
readonly at: Span | null;
|
|
33
33
|
}
|
|
34
|
+
/** Where a passage's first piece stands: where a finding about the whole body points. */
|
|
35
|
+
export declare function startOf(p: Passage): Span;
|
|
34
36
|
/** The body's words, and its sentences that open with a conjunction. */
|
|
35
37
|
export declare function measureRegister(passages: readonly Passage[]): RegisterMeasure;
|
|
36
38
|
/** One finding, at the start of the body, when the rate runs above `limit` per 1000 words. */
|
package/dist/register.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAE9D,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAEL,KAAK,OAAO,EACZ,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAE9B,6FAA6F;AAC7F,eAAO,MAAM,SAAS,OAAO,CAAC;AAE9B,oFAAoF;AACpF,eAAO,MAAM,aAAa,MAAM,CAAC;AAYjC,8BAA8B;AAC9B,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,iFAAiF;IACjF,QAAQ,CAAC,EAAE,EAAE,IAAI,GAAG,IAAI,CAAC;CAC1B;AAED,yFAAyF;AACzF,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAQxC;AAED,wEAAwE;AACxE,wBAAgB,eAAe,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,GAAG,eAAe,CAU7E;AAED,8FAA8F;AAC9F,wBAAgB,aAAa,CAC3B,CAAC,EAAE,eAAe,EAClB,KAAK,GAAE,MAAsB,GAC5B,SAAS,OAAO,EAAE,CAWpB;AAmCD,8FAA8F;AAC9F,eAAO,MAAM,YAAY,GAAI,MAAM,SAAS,KAAG,aAmB7C,CAAC"}
|
package/dist/register.js
CHANGED
|
@@ -1,25 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
* `tex/register` — the body reads at the register of a paper, not of a post: sentences that open
|
|
3
|
-
* with a coordinating conjunction stay as rare as they are in accepted papers.
|
|
4
|
-
*
|
|
5
|
-
* warn more than 0.8 sentences per 1000 words of the body open with And, So, But, Nor, Or or Yet
|
|
6
|
-
*
|
|
7
|
-
* ── WHY ──────────────────────────────────────────────────────────────────────────
|
|
8
|
-
* Reviewers called our prose "too informal" and "a blogpost" twice. Measured against eleven accepted
|
|
9
|
-
* papers, sentence-initial conjunctions set our drafts apart (accepted 0–0.58 per 1000 words). The
|
|
10
|
-
* limit is an option; its default and the measurement behind it are on the rule's page.
|
|
11
|
-
*
|
|
12
|
-
* ── WHAT IT READS ────────────────────────────────────────────────────────────────
|
|
13
|
-
* The body's prose through the `LatexReader` port (`bodyProse`) — the parse tree of the whole paper,
|
|
14
|
-
* includes spliced — cut into sentences by the same splitter `tex/claim-provenance` uses
|
|
15
|
-
* (src/domain/sentences.ts). A citation, a cross-reference or math reads as one word, as it does on
|
|
16
|
-
* the page. A body under 2 000 words is not judged: there one sentence decides the rate.
|
|
17
|
-
*/
|
|
18
|
-
import { runText } from "./domain/tex-document.js";
|
|
19
|
-
import { runOf, sentences } from "./domain/sentences.js";
|
|
1
|
+
import { bodySentences, wordsOf } from "./domain/register.js";
|
|
20
2
|
import { readPaper, reportInPaper } from "./tex-paper.js";
|
|
21
3
|
import { ruleDocsUrl, } from "./tex-venue-rules.js";
|
|
22
|
-
/** Under this many words in the body,
|
|
4
|
+
/** Under this many words in the body, a rate is not judged: one sentence would decide it. */
|
|
23
5
|
export const MIN_WORDS = 2000;
|
|
24
6
|
/** The limit when the config sets none, from the measurement on the rule's page. */
|
|
25
7
|
export const DEFAULT_LIMIT = 0.8;
|
|
@@ -32,23 +14,8 @@ const CONJUNCTIONS = new Set([
|
|
|
32
14
|
"Or",
|
|
33
15
|
"Yet",
|
|
34
16
|
]);
|
|
35
|
-
/**
|
|
36
|
-
|
|
37
|
-
const WORDS = new Intl.Segmenter("en", { granularity: "word" });
|
|
38
|
-
/** A sentence's words: the word-like ones, and one for each mark or math. Null when it has none of its own. */
|
|
39
|
-
function sentenceOf(text) {
|
|
40
|
-
const words = [...WORDS.segment(text)].filter((w) => w.isWordLike);
|
|
41
|
-
const [first] = words;
|
|
42
|
-
if (first === undefined)
|
|
43
|
-
return null;
|
|
44
|
-
return {
|
|
45
|
-
text: text.replace(MARK, "").replace(/\s+/gu, " ").trim(),
|
|
46
|
-
words: words.length + (text.match(MARK)?.length ?? 0),
|
|
47
|
-
first: first.segment,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
/** Where a passage's first piece stands. */
|
|
51
|
-
function startOf(p) {
|
|
17
|
+
/** Where a passage's first piece stands: where a finding about the whole body points. */
|
|
18
|
+
export function startOf(p) {
|
|
52
19
|
const first = p.pieces[0];
|
|
53
20
|
return first.kind === "text"
|
|
54
21
|
? {
|
|
@@ -59,17 +26,11 @@ function startOf(p) {
|
|
|
59
26
|
}
|
|
60
27
|
/** The body's words, and its sentences that open with a conjunction. */
|
|
61
28
|
export function measureRegister(passages) {
|
|
62
|
-
const all = passages
|
|
63
|
-
const text = runText(runOf(p));
|
|
64
|
-
return sentences(text).flatMap(([from, to]) => {
|
|
65
|
-
const s = sentenceOf(text.slice(from, to));
|
|
66
|
-
return s === null ? [] : [s];
|
|
67
|
-
});
|
|
68
|
-
});
|
|
29
|
+
const all = bodySentences(passages);
|
|
69
30
|
const conj = all.filter((s) => CONJUNCTIONS.has(s.first));
|
|
70
31
|
const [first] = passages;
|
|
71
32
|
return {
|
|
72
|
-
words: all
|
|
33
|
+
words: wordsOf(all),
|
|
73
34
|
conjunctionStarts: conj.length,
|
|
74
35
|
examples: conj.slice(0, 3).map((s) => s.text),
|
|
75
36
|
at: first === undefined ? null : startOf(first),
|
package/dist/register.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"register.js","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Files } from "./ports/files.ts";
|
|
2
|
+
import type { ListDir, TalkMedia } from "./ports/talk-media.ts";
|
|
3
|
+
import { type Cue, type PaperTalk, type TalkArtifact, type TalkSlot, type VenueTalk, type VideoProbe } from "./domain/talk.ts";
|
|
4
|
+
import { type VenueRuleModule } from "./venue-rules.ts";
|
|
5
|
+
/** What the rules are built with. */
|
|
6
|
+
export interface TalkRuleDeps {
|
|
7
|
+
readonly files: Files;
|
|
8
|
+
/** The package's presets directory: the shipped presets and their schema. */
|
|
9
|
+
readonly venuesDir: string;
|
|
10
|
+
readonly media: TalkMedia;
|
|
11
|
+
readonly listDir: ListDir;
|
|
12
|
+
}
|
|
13
|
+
/** A paper that declares a talk, with what its venue says about talks (or null). */
|
|
14
|
+
interface Declared {
|
|
15
|
+
readonly kind: "declared";
|
|
16
|
+
readonly paperDir: string;
|
|
17
|
+
readonly talk: PaperTalk;
|
|
18
|
+
readonly paperKind: string | null;
|
|
19
|
+
/** The preset's label and its `talk` block (null when it has none); null when the paper names no preset. */
|
|
20
|
+
readonly venue: {
|
|
21
|
+
readonly label: string;
|
|
22
|
+
readonly talk: VenueTalk | null;
|
|
23
|
+
} | null;
|
|
24
|
+
}
|
|
25
|
+
interface Finding {
|
|
26
|
+
readonly messageId: string;
|
|
27
|
+
readonly data: Readonly<Record<string, string | number>>;
|
|
28
|
+
}
|
|
29
|
+
/** Seconds as `m:ss.s (N s)`: what a person reads off a player, and the exact number. */
|
|
30
|
+
export declare function clock(s: number): string;
|
|
31
|
+
/** The slot of the paper's kind, with the names it is reported under. */
|
|
32
|
+
export interface Slotted {
|
|
33
|
+
readonly venue: string;
|
|
34
|
+
readonly kind: string;
|
|
35
|
+
readonly slot: TalkSlot;
|
|
36
|
+
}
|
|
37
|
+
/** What keeps the declaration from being judged, most basic first. */
|
|
38
|
+
export declare function judgeProfile(d: Declared): readonly Finding[];
|
|
39
|
+
/** The artifacts the paper's mode owes at its venue, captions included when the venue requires them. */
|
|
40
|
+
export declare function requiredArtifacts(vt: VenueTalk, mode: PaperTalk["mode"]): readonly TalkArtifact[];
|
|
41
|
+
/** Seconds a track may differ from the container before it is reported. */
|
|
42
|
+
export declare const DEFAULT_TRACK_TOLERANCE_S = 1;
|
|
43
|
+
/** Over the slot's ceiling, and an audio track that ends away from the container's end. */
|
|
44
|
+
export declare function judgeDuration(v: VideoProbe, slotted: Slotted | null, at: {
|
|
45
|
+
readonly file: string;
|
|
46
|
+
readonly tolS: number;
|
|
47
|
+
}): readonly Finding[];
|
|
48
|
+
/** The video's container, height and size against the venue's limits. */
|
|
49
|
+
export declare function judgeVideoFormat(v: VideoProbe, bytes: number, limits: VenueTalk["video"]): readonly Finding[];
|
|
50
|
+
/** The thresholds of `talk/captions-cover`, in seconds. Uncalibrated: one real talk measured. */
|
|
51
|
+
export interface CoverLimits {
|
|
52
|
+
readonly maxStartS: number;
|
|
53
|
+
readonly maxEndGapS: number;
|
|
54
|
+
readonly maxGapS: number;
|
|
55
|
+
}
|
|
56
|
+
export declare const DEFAULT_COVER: CoverLimits;
|
|
57
|
+
/** How the cues cover a video of `durationS`. */
|
|
58
|
+
export declare function judgeCover(cues: readonly Cue[], durationS: number, limits: CoverLimits): readonly Finding[];
|
|
59
|
+
export type TalkRuleName = "profile" | "required-files" | "undeclared" | "duration" | "duration-floor" | "video-format" | "one-slide-size" | "captions-cover";
|
|
60
|
+
/** The level each talk rule is on at, for every `paper.tex`. Silent for a paper without `talk`. */
|
|
61
|
+
export declare const TALK_RULE_LEVELS: Readonly<Record<`talk/${TalkRuleName}`, "error" | "warn">>;
|
|
62
|
+
/** The talk rules, as the rules of the `talk` plugin. */
|
|
63
|
+
export declare function talkRules(deps: TalkRuleDeps): Readonly<Record<TalkRuleName, VenueRuleModule>>;
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=talk-rules.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"talk-rules.d.ts","sourceRoot":"","sources":["../src/talk-rules.ts"],"names":[],"mappings":"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"}
|