paperlint 6.1.0 → 6.2.1
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/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 +25 -4
- package/dist/cli.js.map +1 -1
- 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/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/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 +3 -0
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +6 -10
- package/dist/presets.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 +3 -0
- package/dist/tex-requirements.d.ts.map +1 -1
- package/dist/tex-requirements.js +2 -0
- package/dist/tex-requirements.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.md +11 -0
- 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 +30 -0
- package/presets/venue-profile.schema.json +132 -0
- package/skills/submit-paper/references/venues/agenticdev.md +36 -9
- 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 +31 -3
- package/src/domain/talk.test.ts +125 -0
- package/src/domain/talk.ts +274 -0
- 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/talk-media.ts +19 -0
- package/src/presets.ts +9 -10
- package/src/rule-cases.test.ts +110 -3
- package/src/talk-rules.test.ts +459 -0
- package/src/talk-rules.ts +672 -0
- package/src/tex-requirements.ts +9 -0
|
@@ -0,0 +1,451 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE TALK RULES — a paper's finished talk files judged against what its venue asks a presenter to
|
|
3
|
+
* send. paperlint does not make the talk and does not know how it was made; it reads the files.
|
|
4
|
+
*
|
|
5
|
+
* talk/profile error the paper's `talk` can be judged: a venue preset with a `talk`
|
|
6
|
+
* block, a mode it allows, a slot for the paper's kind
|
|
7
|
+
* talk/required-files error every file the venue requires for the paper's mode is in the folder
|
|
8
|
+
* talk/undeclared warn a video sits in the paper's `talk/` folder, and no `talk` is declared
|
|
9
|
+
* talk/duration error the video is no longer than the slot's talk; its audio track runs as
|
|
10
|
+
* long as the container
|
|
11
|
+
* talk/duration-floor warn the video is no shorter than the talk the venue asks for
|
|
12
|
+
* talk/video-format error the video is an MP4, tall enough, small enough
|
|
13
|
+
* talk/one-slide-size error the one-slide image has the declared size
|
|
14
|
+
* talk/captions-cover warn the captions cover the video: start near its start, end near its end,
|
|
15
|
+
* no long gap
|
|
16
|
+
*
|
|
17
|
+
* ── WHAT THEY READ ───────────────────────────────────────────────────────────────
|
|
18
|
+
* Like the venue rules, they run on a paper's `paper.tex` and judge the files beside it: the paper's
|
|
19
|
+
* `paperlint.json` (`talk`, `kind`, `extends`), the preset it resolves to (`talk` block), and the
|
|
20
|
+
* files in the talk folder, read through the `TalkMedia` port — MP4Box.js for the video, the PNG
|
|
21
|
+
* header for the image, an SRT parser for the captions. No ffmpeg, no build step, no facts file.
|
|
22
|
+
*
|
|
23
|
+
* ── WHO SPEAKS WHEN THE INPUT CANNOT BE JUDGED ───────────────────────────────────
|
|
24
|
+
* no `talk` declared every rule silent but talk/undeclared
|
|
25
|
+
* settings or preset broken every talk rule silent — pdf/profile says why
|
|
26
|
+
* talk, but nothing to judge by talk/profile; the rules that need the missing part are silent
|
|
27
|
+
* a file missing talk/required-files; the rules reading that file are silent
|
|
28
|
+
* a video that does not parse talk/video-format; duration and captions silent
|
|
29
|
+
*/
|
|
30
|
+
import { basename, dirname, join, relative } from "node:path";
|
|
31
|
+
import { callerPath } from "./caller-path.js";
|
|
32
|
+
import { CONFIG_FILE } from "#lib/paper-config";
|
|
33
|
+
import { paperPreset } from "./presets.js";
|
|
34
|
+
import { fieldOf } from "./domain/record.js";
|
|
35
|
+
import { DEFAULT_TALK_DIR, } from "./domain/talk.js";
|
|
36
|
+
import { rulePageUrl, } from "./venue-rules.js";
|
|
37
|
+
/** The `.mp4` files in the paper's default talk folder. */
|
|
38
|
+
const straysOf = (paperDir, deps) => deps
|
|
39
|
+
.listDir(callerPath(join(paperDir, DEFAULT_TALK_DIR)))
|
|
40
|
+
.filter((n) => n.toLowerCase().endsWith(".mp4"))
|
|
41
|
+
.map((n) => join(paperDir, DEFAULT_TALK_DIR, n));
|
|
42
|
+
/** One paper, assessed. Reads through `deps` only; never throws on a paper's files. */
|
|
43
|
+
function assess(paperDir, deps) {
|
|
44
|
+
const p = paperPreset(paperDir, deps);
|
|
45
|
+
if (p.kind === "settings-problem" || p.kind === "preset-problem")
|
|
46
|
+
return { kind: "unreadable" };
|
|
47
|
+
const settings = p.settings;
|
|
48
|
+
if (settings?.talk == null)
|
|
49
|
+
return { kind: "undeclared", strays: straysOf(paperDir, deps) };
|
|
50
|
+
return {
|
|
51
|
+
kind: "declared",
|
|
52
|
+
paperDir,
|
|
53
|
+
talk: settings.talk,
|
|
54
|
+
paperKind: settings.kind,
|
|
55
|
+
venue: p.kind === "resolved"
|
|
56
|
+
? { label: p.preset.label, talk: p.preset.talk }
|
|
57
|
+
: null,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
const finding = (messageId, data = {}) => ({ messageId, data });
|
|
61
|
+
/** Seconds as `m:ss.s (N s)`: what a person reads off a player, and the exact number. */
|
|
62
|
+
export function clock(s) {
|
|
63
|
+
const tenths = Math.round(s * 10) / 10;
|
|
64
|
+
const m = Math.floor(tenths / 60);
|
|
65
|
+
const rest = (tenths - m * 60).toFixed(1).padStart(4, "0");
|
|
66
|
+
return `${String(m)}:${rest} (${String(Math.round(s * 100) / 100)} s)`;
|
|
67
|
+
}
|
|
68
|
+
/** Where artifact `a` is looked for. */
|
|
69
|
+
const fileOf = (d, a) => join(d.paperDir, d.talk.dir, d.talk.files[a]);
|
|
70
|
+
const bytesOf = (deps, path) => deps.files.readBytes(callerPath(path));
|
|
71
|
+
const askedOf = (d) => d.venue === null || d.venue.talk === null
|
|
72
|
+
? null
|
|
73
|
+
: { label: d.venue.label, talk: d.venue.talk };
|
|
74
|
+
function slotOf(d) {
|
|
75
|
+
const asked = askedOf(d);
|
|
76
|
+
if (asked === null || d.paperKind === null)
|
|
77
|
+
return null;
|
|
78
|
+
const slot = asked.talk.kinds.get(d.paperKind);
|
|
79
|
+
return slot === undefined
|
|
80
|
+
? null
|
|
81
|
+
: { venue: asked.label, kind: d.paperKind, slot };
|
|
82
|
+
}
|
|
83
|
+
/** The video's probe; null when the file is absent or does not parse (other rules say which). */
|
|
84
|
+
function videoOf(d, deps) {
|
|
85
|
+
const bytes = bytesOf(deps, fileOf(d, "video"));
|
|
86
|
+
return bytes === null ? null : deps.media.probeVideo(bytes);
|
|
87
|
+
}
|
|
88
|
+
/** What keeps the declaration from being judged, most basic first. */
|
|
89
|
+
export function judgeProfile(d) {
|
|
90
|
+
if (d.venue === null)
|
|
91
|
+
return [finding("noPreset")];
|
|
92
|
+
const venue = d.venue.label;
|
|
93
|
+
const vt = d.venue.talk;
|
|
94
|
+
if (vt === null)
|
|
95
|
+
return [finding("noTalkBlock", { venue })];
|
|
96
|
+
const mode = d.talk.mode;
|
|
97
|
+
const modes = vt.modes.join(", ");
|
|
98
|
+
const modeProblem = vt.modes.length > 0 && !vt.modes.includes(mode)
|
|
99
|
+
? [finding("mode", { venue, mode, modes })]
|
|
100
|
+
: [];
|
|
101
|
+
const known = [...vt.kinds.keys()].join(", ") || "(none)";
|
|
102
|
+
const kind = d.paperKind;
|
|
103
|
+
const kindProblem = kind === null
|
|
104
|
+
? [finding("kindMissing", { venue, known })]
|
|
105
|
+
: vt.kinds.has(kind)
|
|
106
|
+
? []
|
|
107
|
+
: [finding("kindNoSlot", { venue, kind, known })];
|
|
108
|
+
return [...modeProblem, ...kindProblem];
|
|
109
|
+
}
|
|
110
|
+
/** The artifacts the paper's mode owes at its venue, captions included when the venue requires them. */
|
|
111
|
+
export function requiredArtifacts(vt, mode) {
|
|
112
|
+
const owed = vt.artifacts.get(mode)?.required ?? [];
|
|
113
|
+
const captions = vt.video.captions === "required" && owed.includes("video")
|
|
114
|
+
? ["captions"]
|
|
115
|
+
: [];
|
|
116
|
+
return [...new Set([...owed, ...captions])];
|
|
117
|
+
}
|
|
118
|
+
const judgeRequired = (d, { deps, shown }) => {
|
|
119
|
+
const asked = askedOf(d);
|
|
120
|
+
return asked === null
|
|
121
|
+
? []
|
|
122
|
+
: requiredArtifacts(asked.talk, d.talk.mode)
|
|
123
|
+
.filter((a) => !deps.files.isFile(callerPath(fileOf(d, a))))
|
|
124
|
+
.map((a) => finding("missing", {
|
|
125
|
+
artifact: a,
|
|
126
|
+
file: shown(fileOf(d, a)),
|
|
127
|
+
venue: asked.label,
|
|
128
|
+
mode: d.talk.mode,
|
|
129
|
+
}));
|
|
130
|
+
};
|
|
131
|
+
/** Seconds a track may differ from the container before it is reported. */
|
|
132
|
+
export const DEFAULT_TRACK_TOLERANCE_S = 1;
|
|
133
|
+
const numberOption = (options, key, dflt) => {
|
|
134
|
+
const v = fieldOf(options, key);
|
|
135
|
+
return typeof v === "number" ? v : dflt;
|
|
136
|
+
};
|
|
137
|
+
/** Over the slot's ceiling, and an audio track that ends away from the container's end. */
|
|
138
|
+
export function judgeDuration(v, slotted, at) {
|
|
139
|
+
const over = slotted !== null && v.durationS > slotted.slot.talkSMax
|
|
140
|
+
? [
|
|
141
|
+
finding("tooLong", {
|
|
142
|
+
file: at.file,
|
|
143
|
+
got: clock(v.durationS),
|
|
144
|
+
max: clock(slotted.slot.talkSMax),
|
|
145
|
+
venue: slotted.venue,
|
|
146
|
+
}),
|
|
147
|
+
]
|
|
148
|
+
: [];
|
|
149
|
+
const off = v.audioS === null ? 0 : Math.abs(v.durationS - v.audioS);
|
|
150
|
+
const mismatch = v.audioS !== null && off > at.tolS
|
|
151
|
+
? [
|
|
152
|
+
finding("trackMismatch", {
|
|
153
|
+
file: at.file,
|
|
154
|
+
video: clock(v.durationS),
|
|
155
|
+
audio: clock(v.audioS),
|
|
156
|
+
tol: at.tolS,
|
|
157
|
+
}),
|
|
158
|
+
]
|
|
159
|
+
: [];
|
|
160
|
+
return [...over, ...mismatch];
|
|
161
|
+
}
|
|
162
|
+
const judgeDurationRule = (d, { deps, options, shown }) => {
|
|
163
|
+
const v = videoOf(d, deps);
|
|
164
|
+
return v === null
|
|
165
|
+
? []
|
|
166
|
+
: judgeDuration(v, slotOf(d), {
|
|
167
|
+
file: shown(fileOf(d, "video")),
|
|
168
|
+
tolS: numberOption(options[0], "trackToleranceS", DEFAULT_TRACK_TOLERANCE_S),
|
|
169
|
+
});
|
|
170
|
+
};
|
|
171
|
+
const judgeFloor = (d, { deps, shown }) => {
|
|
172
|
+
const v = videoOf(d, deps);
|
|
173
|
+
const s = slotOf(d);
|
|
174
|
+
const min = s?.slot.talkSMin ?? null;
|
|
175
|
+
return v === null || s === null || min === null || v.durationS >= min
|
|
176
|
+
? []
|
|
177
|
+
: [
|
|
178
|
+
finding("tooShort", {
|
|
179
|
+
file: shown(fileOf(d, "video")),
|
|
180
|
+
got: clock(v.durationS),
|
|
181
|
+
min: clock(min),
|
|
182
|
+
venue: s.venue,
|
|
183
|
+
kind: s.kind,
|
|
184
|
+
}),
|
|
185
|
+
];
|
|
186
|
+
};
|
|
187
|
+
/** The video's container, height and size against the venue's limits. */
|
|
188
|
+
export function judgeVideoFormat(v, bytes, limits) {
|
|
189
|
+
const qt = v.brands[0] === "qt ";
|
|
190
|
+
const container = limits.container === "mp4" && qt ? [finding("container", {})] : [];
|
|
191
|
+
const min = limits.minHeightPx;
|
|
192
|
+
const height = min === null
|
|
193
|
+
? []
|
|
194
|
+
: v.heightPx === null
|
|
195
|
+
? [finding("noVideoTrack", {})]
|
|
196
|
+
: v.heightPx < min
|
|
197
|
+
? [finding("height", { got: v.heightPx, min })]
|
|
198
|
+
: [];
|
|
199
|
+
const max = limits.maxBytes;
|
|
200
|
+
const size = max !== null && bytes > max ? [finding("bytes", { got: bytes, max })] : [];
|
|
201
|
+
return [...container, ...height, ...size];
|
|
202
|
+
}
|
|
203
|
+
const judgeFormat = (d, { deps, shown }) => {
|
|
204
|
+
const bytes = bytesOf(deps, fileOf(d, "video"));
|
|
205
|
+
const asked = askedOf(d);
|
|
206
|
+
if (bytes === null || asked === null)
|
|
207
|
+
return [];
|
|
208
|
+
const v = deps.media.probeVideo(bytes);
|
|
209
|
+
const file = shown(fileOf(d, "video"));
|
|
210
|
+
return v === null
|
|
211
|
+
? [finding("unreadable", { file })]
|
|
212
|
+
: judgeVideoFormat(v, bytes.length, asked.talk.video).map((f) => finding(f.messageId, { ...f.data, file, venue: asked.label }));
|
|
213
|
+
};
|
|
214
|
+
/** The size to hold the one-slide to: the paper's own, else the venue's; null when neither says. */
|
|
215
|
+
const oneSlideSizeOf = (d) => d.talk.oneSlide ?? askedOf(d)?.talk.oneSlide ?? null;
|
|
216
|
+
const judgeOneSlide = (d, { deps, shown }) => {
|
|
217
|
+
const want = oneSlideSizeOf(d);
|
|
218
|
+
const bytes = bytesOf(deps, fileOf(d, "one-slide"));
|
|
219
|
+
if (want === null || bytes === null)
|
|
220
|
+
return [];
|
|
221
|
+
const got = deps.media.imageSize(bytes);
|
|
222
|
+
const file = shown(fileOf(d, "one-slide"));
|
|
223
|
+
const size = (s) => `${String(s.width)}×${String(s.height)}`;
|
|
224
|
+
return got === null
|
|
225
|
+
? [finding("notPng", { file })]
|
|
226
|
+
: got.width === want.width && got.height === want.height
|
|
227
|
+
? []
|
|
228
|
+
: [finding("size", { file, got: size(got), want: size(want) })];
|
|
229
|
+
};
|
|
230
|
+
export const DEFAULT_COVER = {
|
|
231
|
+
maxStartS: 1,
|
|
232
|
+
maxEndGapS: 2,
|
|
233
|
+
maxGapS: 5,
|
|
234
|
+
};
|
|
235
|
+
/** The longest silence between cues in time order, and where it starts. Overlapping cues leave none. */
|
|
236
|
+
function largestGap(cues) {
|
|
237
|
+
const sorted = [...cues].sort((a, b) => a.startS - b.startS);
|
|
238
|
+
return sorted.reduce((acc, cue) => {
|
|
239
|
+
const gap = acc.end === null ? null : { at: acc.end, s: cue.startS - acc.end };
|
|
240
|
+
const longer = gap !== null && (acc.best === null || gap.s > acc.best.s);
|
|
241
|
+
return {
|
|
242
|
+
end: Math.max(acc.end ?? cue.endS, cue.endS),
|
|
243
|
+
best: longer ? gap : acc.best,
|
|
244
|
+
};
|
|
245
|
+
}, { end: null, best: null }).best;
|
|
246
|
+
}
|
|
247
|
+
/** The first cue later than the limit into the video. */
|
|
248
|
+
const lateStart = (first, l) => first > l.maxStartS
|
|
249
|
+
? [finding("lateStart", { first: clock(first), max: l.maxStartS })]
|
|
250
|
+
: [];
|
|
251
|
+
/** The last cue ending earlier than the limit before the video's end. */
|
|
252
|
+
const earlyEnd = (last, durationS, l) => last < durationS - l.maxEndGapS
|
|
253
|
+
? [
|
|
254
|
+
finding("earlyEnd", {
|
|
255
|
+
last: clock(last),
|
|
256
|
+
video: clock(durationS),
|
|
257
|
+
max: l.maxEndGapS,
|
|
258
|
+
}),
|
|
259
|
+
]
|
|
260
|
+
: [];
|
|
261
|
+
/** How the cues cover a video of `durationS`. */
|
|
262
|
+
export function judgeCover(cues, durationS, limits) {
|
|
263
|
+
if (cues.length === 0)
|
|
264
|
+
return [finding("noCues", {})];
|
|
265
|
+
const gap = largestGap(cues);
|
|
266
|
+
return [
|
|
267
|
+
...lateStart(Math.min(...cues.map((c) => c.startS)), limits),
|
|
268
|
+
...earlyEnd(Math.max(...cues.map((c) => c.endS)), durationS, limits),
|
|
269
|
+
...(gap !== null && gap.s > limits.maxGapS
|
|
270
|
+
? [
|
|
271
|
+
finding("gap", {
|
|
272
|
+
at: clock(gap.at),
|
|
273
|
+
s: gap.s.toFixed(1),
|
|
274
|
+
max: limits.maxGapS,
|
|
275
|
+
}),
|
|
276
|
+
]
|
|
277
|
+
: []),
|
|
278
|
+
];
|
|
279
|
+
}
|
|
280
|
+
const coverLimitsOf = (options) => ({
|
|
281
|
+
maxStartS: numberOption(options, "maxStartS", DEFAULT_COVER.maxStartS),
|
|
282
|
+
maxEndGapS: numberOption(options, "maxEndGapS", DEFAULT_COVER.maxEndGapS),
|
|
283
|
+
maxGapS: numberOption(options, "maxGapS", DEFAULT_COVER.maxGapS),
|
|
284
|
+
});
|
|
285
|
+
const judgeCaptions = (d, { deps, options, shown }) => {
|
|
286
|
+
const text = bytesOf(deps, fileOf(d, "captions"));
|
|
287
|
+
const v = videoOf(d, deps);
|
|
288
|
+
if (text === null || v === null)
|
|
289
|
+
return [];
|
|
290
|
+
const cues = deps.media.captions(new TextDecoder().decode(text));
|
|
291
|
+
const file = shown(fileOf(d, "captions"));
|
|
292
|
+
return judgeCover(cues, v.durationS, coverLimitsOf(options[0])).map((f) => finding(f.messageId, { ...f.data, file }));
|
|
293
|
+
};
|
|
294
|
+
/** Which rule reports what, given a paper that declares a talk. `undeclared` is judged apart. */
|
|
295
|
+
const JUDGES = {
|
|
296
|
+
profile: (d) => judgeProfile(d),
|
|
297
|
+
"required-files": judgeRequired,
|
|
298
|
+
duration: judgeDurationRule,
|
|
299
|
+
"duration-floor": judgeFloor,
|
|
300
|
+
"video-format": judgeFormat,
|
|
301
|
+
"one-slide-size": judgeOneSlide,
|
|
302
|
+
"captions-cover": judgeCaptions,
|
|
303
|
+
};
|
|
304
|
+
function findingsOf(name, a, ctx) {
|
|
305
|
+
if (name === "undeclared")
|
|
306
|
+
return a.kind === "undeclared"
|
|
307
|
+
? a.strays.map((f) => finding("undeclared", { file: ctx.shown(f), config: CONFIG_FILE }))
|
|
308
|
+
: [];
|
|
309
|
+
return a.kind === "declared" ? JUDGES[name](a, ctx) : [];
|
|
310
|
+
}
|
|
311
|
+
const TALK = "`talk` in the paper's paperlint.json";
|
|
312
|
+
const META = {
|
|
313
|
+
profile: {
|
|
314
|
+
description: "a paper's `talk` can be judged: its venue preset has a `talk` block, allows the paper's mode, and sets a slot for its kind",
|
|
315
|
+
messages: {
|
|
316
|
+
noPreset: `the paper declares ${TALK} and names no venue preset ("extends"), so nothing says what the talk must be`,
|
|
317
|
+
noTalkBlock: "the paper declares a talk, and the preset `{{venue}}` has no `talk` block — so its files are not judged. Add one to your own preset, quoting the organizers",
|
|
318
|
+
mode: "`{{venue}}` allows the talk modes {{modes}}; this paper declares `{{mode}}`",
|
|
319
|
+
kindMissing: `${CONFIG_FILE} names no \`kind\`, so the talk slot of \`{{venue}}\` is not known; its talk kinds: {{known}}`,
|
|
320
|
+
kindNoSlot: "`{{venue}}` sets no talk slot for a `{{kind}}` paper, so the video's length is not checked; its talk kinds: {{known}}",
|
|
321
|
+
},
|
|
322
|
+
},
|
|
323
|
+
"required-files": {
|
|
324
|
+
description: "every file the venue requires for the paper's talk mode is in the talk folder",
|
|
325
|
+
messages: {
|
|
326
|
+
missing: "{{venue}} asks for the {{artifact}} of a {{mode}} talk, and {{file}} is not there — add it, or name the file in `talk.files`",
|
|
327
|
+
},
|
|
328
|
+
},
|
|
329
|
+
undeclared: {
|
|
330
|
+
type: "suggestion",
|
|
331
|
+
description: "a video in the paper's talk folder while the paper declares no `talk`, so nothing checks it",
|
|
332
|
+
messages: {
|
|
333
|
+
undeclared: '{{file}} is a talk video, and this paper declares no `talk`, so its length and format are not checked — declare it in {{config}}: "talk": { "mode": "remote-video" }',
|
|
334
|
+
},
|
|
335
|
+
},
|
|
336
|
+
duration: {
|
|
337
|
+
description: "the talk video is no longer than the slot's talk, and its audio track runs as long as the video",
|
|
338
|
+
schema: [
|
|
339
|
+
{
|
|
340
|
+
type: "object",
|
|
341
|
+
properties: { trackToleranceS: { type: "number", minimum: 0 } },
|
|
342
|
+
additionalProperties: false,
|
|
343
|
+
},
|
|
344
|
+
],
|
|
345
|
+
messages: {
|
|
346
|
+
tooLong: "{{file}} runs {{got}}, over the {{max}} talk {{venue}} sets for this kind of paper — cut it",
|
|
347
|
+
trackMismatch: "{{file}}: the video runs {{video}} and its audio track {{audio}}, more than {{tol}} s apart — a cut or a re-encode dropped or padded sound",
|
|
348
|
+
},
|
|
349
|
+
},
|
|
350
|
+
"duration-floor": {
|
|
351
|
+
type: "suggestion",
|
|
352
|
+
description: "the talk video is no shorter than the talk the venue asks for",
|
|
353
|
+
messages: {
|
|
354
|
+
tooShort: "{{file}} runs {{got}}, under the {{min}} talk {{venue}} asks for a {{kind}} paper — decide whether that is fine, or set this rule to off for the paper",
|
|
355
|
+
},
|
|
356
|
+
},
|
|
357
|
+
"video-format": {
|
|
358
|
+
description: "the talk video is an MP4 file, at least the venue's height, and within its size limit",
|
|
359
|
+
messages: {
|
|
360
|
+
unreadable: "{{file}} is not an MP4 or QuickTime file (no `ftyp`/`moov` box), so its length and format cannot be read — export it as MP4 (H.264)",
|
|
361
|
+
container: "{{file}} is a QuickTime (.mov) file inside, and {{venue}} asks for MP4 — re-export as MP4",
|
|
362
|
+
noVideoTrack: "{{file}} has no video track",
|
|
363
|
+
height: "{{file}} is {{got}} px high, under the {{min}} px {{venue}} asks for — export at a higher resolution",
|
|
364
|
+
bytes: "{{file}} is {{got}} bytes, over the {{max}} {{venue}} accepts — re-encode at a lower bitrate",
|
|
365
|
+
},
|
|
366
|
+
},
|
|
367
|
+
"one-slide-size": {
|
|
368
|
+
description: "the one-slide image is a PNG of the size the venue or the paper states",
|
|
369
|
+
messages: {
|
|
370
|
+
notPng: "{{file}} is not a PNG file",
|
|
371
|
+
size: "{{file}} is {{got}} px, and the one-slide must be {{want}} px",
|
|
372
|
+
},
|
|
373
|
+
},
|
|
374
|
+
"captions-cover": {
|
|
375
|
+
type: "suggestion",
|
|
376
|
+
description: "the talk's captions cover the video: they start near its start, end near its end, and leave no long gap",
|
|
377
|
+
schema: [
|
|
378
|
+
{
|
|
379
|
+
type: "object",
|
|
380
|
+
properties: {
|
|
381
|
+
maxStartS: { type: "number", minimum: 0 },
|
|
382
|
+
maxEndGapS: { type: "number", minimum: 0 },
|
|
383
|
+
maxGapS: { type: "number", minimum: 0 },
|
|
384
|
+
},
|
|
385
|
+
additionalProperties: false,
|
|
386
|
+
},
|
|
387
|
+
],
|
|
388
|
+
messages: {
|
|
389
|
+
noCues: "{{file}} holds no caption cues",
|
|
390
|
+
lateStart: "{{file}}: the first caption starts at {{first}}, later than {{max}} s into the video",
|
|
391
|
+
earlyEnd: "{{file}}: the last caption ends at {{last}}, and the video runs {{video}} — more than {{max}} s uncaptioned at the end",
|
|
392
|
+
gap: "{{file}}: {{s}} s without a caption from {{at}}, longer than {{max}} s",
|
|
393
|
+
},
|
|
394
|
+
},
|
|
395
|
+
};
|
|
396
|
+
/** The level each talk rule is on at, for every `paper.tex`. Silent for a paper without `talk`. */
|
|
397
|
+
export const TALK_RULE_LEVELS = {
|
|
398
|
+
"talk/profile": "error",
|
|
399
|
+
"talk/required-files": "error",
|
|
400
|
+
"talk/undeclared": "warn",
|
|
401
|
+
"talk/duration": "error",
|
|
402
|
+
"talk/duration-floor": "warn",
|
|
403
|
+
"talk/video-format": "error",
|
|
404
|
+
"talk/one-slide-size": "error",
|
|
405
|
+
"talk/captions-cover": "warn",
|
|
406
|
+
};
|
|
407
|
+
/** Every finding of rule `name` on the paper whose `paper.tex` ESLint is linting, reported at line 1. */
|
|
408
|
+
function reportAll(name, context, deps) {
|
|
409
|
+
const cwd = context.cwd;
|
|
410
|
+
const shown = (p) => (cwd ? relative(cwd, p) : p);
|
|
411
|
+
const a = assess(dirname(context.filename), deps);
|
|
412
|
+
const loc = { start: { line: 1, column: 1 }, end: { line: 1, column: 2 } };
|
|
413
|
+
findingsOf(name, a, { deps, options: context.options, shown }).forEach((f) => {
|
|
414
|
+
context.report({ loc, messageId: f.messageId, data: f.data });
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
function rule(name, deps) {
|
|
418
|
+
const meta = META[name];
|
|
419
|
+
return {
|
|
420
|
+
meta: {
|
|
421
|
+
type: meta.type ?? "problem",
|
|
422
|
+
docs: { description: meta.description, url: rulePageUrl(`talk/${name}`) },
|
|
423
|
+
schema: meta.schema ?? [],
|
|
424
|
+
messages: meta.messages,
|
|
425
|
+
},
|
|
426
|
+
create(context) {
|
|
427
|
+
// Judged once per paper, on its paper.tex: the paper directory is the file's directory.
|
|
428
|
+
if (basename(context.filename) !== "paper.tex")
|
|
429
|
+
return {};
|
|
430
|
+
return {
|
|
431
|
+
root() {
|
|
432
|
+
reportAll(name, context, deps);
|
|
433
|
+
},
|
|
434
|
+
};
|
|
435
|
+
},
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
/** The talk rules, as the rules of the `talk` plugin. */
|
|
439
|
+
export function talkRules(deps) {
|
|
440
|
+
return {
|
|
441
|
+
profile: rule("profile", deps),
|
|
442
|
+
"required-files": rule("required-files", deps),
|
|
443
|
+
undeclared: rule("undeclared", deps),
|
|
444
|
+
duration: rule("duration", deps),
|
|
445
|
+
"duration-floor": rule("duration-floor", deps),
|
|
446
|
+
"video-format": rule("video-format", deps),
|
|
447
|
+
"one-slide-size": rule("one-slide-size", deps),
|
|
448
|
+
"captions-cover": rule("captions-cover", deps),
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
//# sourceMappingURL=talk-rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"talk-rules.js","sourceRoot":"","sources":["../src/talk-rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Ajv from "ajv";
|
|
2
2
|
import type { RegisterAnchor } from "./domain/register.ts";
|
|
3
|
+
import { type VenueTalk } from "./domain/talk.ts";
|
|
3
4
|
/** CTAN package name → the names that prove it is installed. */
|
|
4
5
|
export type PackageProofs = Readonly<Record<string, readonly string[]>>;
|
|
5
6
|
export interface TexRequirements {
|
|
@@ -87,6 +88,8 @@ export interface PresetFile {
|
|
|
87
88
|
* (a child's list replaces its parent's).
|
|
88
89
|
*/
|
|
89
90
|
readonly registerAnchors: readonly RegisterAnchor[] | null;
|
|
91
|
+
/** What the venue asks a presenter to send; null when the file has no `talk` block. */
|
|
92
|
+
readonly talk: VenueTalk | null;
|
|
90
93
|
}
|
|
91
94
|
/**
|
|
92
95
|
* The text of one preset file → the typed file, or an Error naming every problem. The ONE parser
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tex-requirements.d.ts","sourceRoot":"","sources":["../src/tex-requirements.ts"],"names":[],"mappings":"AA0BA,OAAO,GAAG,MAAM,KAAK,CAAC;AAItB,OAAO,KAAK,EAAE,cAAc,EAAuB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"tex-requirements.d.ts","sourceRoot":"","sources":["../src/tex-requirements.ts"],"names":[],"mappings":"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"}
|
package/dist/tex-requirements.js
CHANGED
|
@@ -28,6 +28,7 @@ import Ajv from "ajv";
|
|
|
28
28
|
import { presetsDir } from "./package-dirs.js";
|
|
29
29
|
import { CONFIG_FILE } from "#lib/paper-config";
|
|
30
30
|
import { fieldOf } from "./domain/record.js";
|
|
31
|
+
import { venueTalkOf, } from "./domain/talk.js";
|
|
31
32
|
/** The profile every paper gets, and the only one a paper with an unknown venue gets. */
|
|
32
33
|
export const BASE_PROFILE = "tex-base.jsonc";
|
|
33
34
|
export const SCHEMA_FILE = "venue-profile.schema.json";
|
|
@@ -162,6 +163,7 @@ export function parsePreset(text, file, dir = presetsDir()) {
|
|
|
162
163
|
format: formatOf(j.format),
|
|
163
164
|
rules: j.rules ?? {},
|
|
164
165
|
registerAnchors: anchorsOf(j.register),
|
|
166
|
+
talk: j.talk === undefined ? null : venueTalkOf(j.talk),
|
|
165
167
|
};
|
|
166
168
|
}
|
|
167
169
|
/** The text of one preset → the TeX requirements it declares itself (none without a `tex` block). */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tex-requirements.js","sourceRoot":"","sources":["../src/tex-requirements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,6FAA6F;AAC7F,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,+FAA+F;AAC/F,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"tex-requirements.js","sourceRoot":"","sources":["../src/tex-requirements.ts"],"names":[],"mappings":"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"}
|
package/docs/configuration.md
CHANGED
|
@@ -81,7 +81,7 @@ refused by name. `node_modules/`, `.git/` and `<papers>/.template/` are skipped.
|
|
|
81
81
|
```
|
|
82
82
|
|
|
83
83
|
The same keys as the root file, minus the project-only ones (`papersDir`, `structure` and the
|
|
84
|
-
skills' keys), which are refused here by name. **It merges over the root file:** its `extends`,
|
|
84
|
+
skills' keys), which are refused here by name, plus `talk`, which only a paper has. **It merges over the root file:** its `extends`,
|
|
85
85
|
`kind` and `pdf` win; one it does not set comes from the root.
|
|
86
86
|
|
|
87
87
|
| key | what it is |
|
|
@@ -90,6 +90,7 @@ skills' keys), which are refused here by name. **It merges over the root file:**
|
|
|
90
90
|
| `kind` | the kind of paper (`short`, `research`, …) whose page limit applies |
|
|
91
91
|
| `pdf` | where the built PDF is, relative to the paper, when it is not `paper.pdf` |
|
|
92
92
|
| `identity` | what identifies the authors — names, handles, emails, affiliations, your own project names. A blind venue's PDF must say none of it ([`anonymity/identity`](rules/anonymity/identity.md)). Joined with the root's list |
|
|
93
|
+
| `talk` | how this paper is presented, `{ "mode": "remote-video" }` plus optional `dir`, `files`, `one_slide` — the `talk/*` rules judge its finished files ([`talk.md`](talk.md)). Only here: the root file refuses it |
|
|
93
94
|
| `rules` | rule overrides for this paper alone — `{ "<rule>": "<severity>" }`, or blocks with globs relative to the paper |
|
|
94
95
|
| `$comment` | a note for humans; ignored |
|
|
95
96
|
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# talk/captions-cover
|
|
2
|
+
|
|
3
|
+
**Level:** warn · **Reads:** `paper.tex` → `paperlint.json` (`talk`), the captions file (SubRip,
|
|
4
|
+
`.srt`) and the video's headers
|
|
5
|
+
|
|
6
|
+
## What it catches
|
|
7
|
+
|
|
8
|
+
Captions that do not cover the video:
|
|
9
|
+
|
|
10
|
+
- no cue at all (`noCues`);
|
|
11
|
+
- the first cue starts more than `maxStartS` into the video (`lateStart`);
|
|
12
|
+
- the last cue ends more than `maxEndGapS` before the video does (`earlyEnd`);
|
|
13
|
+
- two consecutive cues are more than `maxGapS` apart (`gap`).
|
|
14
|
+
|
|
15
|
+
The `.srt` is read with a parser (`srt-parser-2`); only the cue times are used.
|
|
16
|
+
|
|
17
|
+
## Why
|
|
18
|
+
|
|
19
|
+
Captions generated from one take and attached to another, or cut short by a tool, still play — and
|
|
20
|
+
stop matching the speech partway through. Coverage against the video's length is the part a count
|
|
21
|
+
can see.
|
|
22
|
+
|
|
23
|
+
## Examples
|
|
24
|
+
|
|
25
|
+
Warning — the AgenticDev talk's last cue ends 4.2 s before the video:
|
|
26
|
+
|
|
27
|
+
> papers/agenticdev-2026/talk/agenticdev-2026-talk.srt: the last caption ends at 5:16.6 (316.6 s),
|
|
28
|
+
> and the video runs 5:20.8 (320.84 s) — more than 2 s uncaptioned at the end
|
|
29
|
+
|
|
30
|
+
Passing: cues from 0 s to within 2 s of the end, no silence between cues over 5 s.
|
|
31
|
+
|
|
32
|
+
## Options / preset fields
|
|
33
|
+
|
|
34
|
+
`{ "maxStartS": 1, "maxEndGapS": 2, "maxGapS": 5 }`. ⚠️ **These thresholds are not calibrated.**
|
|
35
|
+
They are a first guess, checked against one real talk only (93 cues, first at 0 s, largest gap
|
|
36
|
+
1.4 s; its last cue ends 4.2 s before the video does, so it warns on `maxEndGapS`). They should be set from the posted talks of a venue, measured with this
|
|
37
|
+
same rule, before the rule is raised above a warning.
|
|
38
|
+
|
|
39
|
+
## What it does not check
|
|
40
|
+
|
|
41
|
+
Whether the words match the speech, their spelling, line length, reading speed. Captions in another
|
|
42
|
+
format than SubRip.
|
|
43
|
+
|
|
44
|
+
## How to fix
|
|
45
|
+
|
|
46
|
+
Regenerate the captions from the final video, or extend the last cue; raise a threshold in the
|
|
47
|
+
paper's `rules` when a silence is intended (a closing slide).
|