paperlint 6.2.3 → 7.0.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.
Files changed (234) hide show
  1. package/CONTRIBUTING.md +4 -2
  2. package/README.md +10 -3
  3. package/dist/adapters/hotcrp/index.d.ts +7 -0
  4. package/dist/adapters/hotcrp/index.d.ts.map +1 -0
  5. package/dist/adapters/hotcrp/index.js +7 -0
  6. package/dist/adapters/hotcrp/index.js.map +1 -0
  7. package/dist/adapters/hotcrp/portal.io.d.ts +20 -0
  8. package/dist/adapters/hotcrp/portal.io.d.ts.map +1 -0
  9. package/dist/adapters/hotcrp/portal.io.js +90 -0
  10. package/dist/adapters/hotcrp/portal.io.js.map +1 -0
  11. package/dist/adapters/hotcrp/response.d.ts +13 -0
  12. package/dist/adapters/hotcrp/response.d.ts.map +1 -0
  13. package/dist/adapters/hotcrp/response.js +138 -0
  14. package/dist/adapters/hotcrp/response.js.map +1 -0
  15. package/dist/adapters/latex/conditionals.d.ts +21 -0
  16. package/dist/adapters/latex/conditionals.d.ts.map +1 -0
  17. package/dist/adapters/latex/conditionals.js +75 -0
  18. package/dist/adapters/latex/conditionals.js.map +1 -0
  19. package/dist/adapters/latex/headings.d.ts +10 -0
  20. package/dist/adapters/latex/headings.d.ts.map +1 -0
  21. package/dist/adapters/latex/headings.js +129 -0
  22. package/dist/adapters/latex/headings.js.map +1 -0
  23. package/dist/adapters/latex/index.d.ts +1 -0
  24. package/dist/adapters/latex/index.d.ts.map +1 -1
  25. package/dist/adapters/latex/index.js +3 -0
  26. package/dist/adapters/latex/index.js.map +1 -1
  27. package/dist/adapters/latex/parse.d.ts +1 -1
  28. package/dist/adapters/latex/parse.d.ts.map +1 -1
  29. package/dist/adapters/latex/parse.js +3 -2
  30. package/dist/adapters/latex/parse.js.map +1 -1
  31. package/dist/build.d.ts +1 -1
  32. package/dist/build.d.ts.map +1 -1
  33. package/dist/build.js +1 -1
  34. package/dist/build.js.map +1 -1
  35. package/dist/cli.d.ts +4 -2
  36. package/dist/cli.d.ts.map +1 -1
  37. package/dist/cli.js +126 -37
  38. package/dist/cli.js.map +1 -1
  39. package/dist/domain/heading-case.d.ts +100 -0
  40. package/dist/domain/heading-case.d.ts.map +1 -0
  41. package/dist/domain/heading-case.js +365 -0
  42. package/dist/domain/heading-case.js.map +1 -0
  43. package/dist/domain/result.d.ts +4 -0
  44. package/dist/domain/result.d.ts.map +1 -1
  45. package/dist/domain/result.js +2 -0
  46. package/dist/domain/result.js.map +1 -1
  47. package/dist/domain/submission.d.ts +106 -0
  48. package/dist/domain/submission.d.ts.map +1 -0
  49. package/dist/domain/submission.js +39 -0
  50. package/dist/domain/submission.js.map +1 -0
  51. package/dist/domain/tex-document.d.ts +32 -0
  52. package/dist/domain/tex-document.d.ts.map +1 -1
  53. package/dist/domain/tex-document.js +11 -0
  54. package/dist/domain/tex-document.js.map +1 -1
  55. package/dist/domain/venue-name.d.ts +38 -0
  56. package/dist/domain/venue-name.d.ts.map +1 -0
  57. package/dist/domain/venue-name.js +71 -0
  58. package/dist/domain/venue-name.js.map +1 -0
  59. package/dist/eslint-rules/latex-language.d.ts.map +1 -1
  60. package/dist/eslint-rules/latex-language.js +16 -3
  61. package/dist/eslint-rules/latex-language.js.map +1 -1
  62. package/dist/facts-file.d.ts +3 -3
  63. package/dist/facts-file.d.ts.map +1 -1
  64. package/dist/facts-file.js +3 -3
  65. package/dist/facts-file.js.map +1 -1
  66. package/dist/folder-venue-rule.d.ts +51 -0
  67. package/dist/folder-venue-rule.d.ts.map +1 -0
  68. package/dist/folder-venue-rule.js +96 -0
  69. package/dist/folder-venue-rule.js.map +1 -0
  70. package/dist/heading-case.d.ts +48 -0
  71. package/dist/heading-case.d.ts.map +1 -0
  72. package/dist/heading-case.js +191 -0
  73. package/dist/heading-case.js.map +1 -0
  74. package/dist/init.d.ts +6 -0
  75. package/dist/init.d.ts.map +1 -1
  76. package/dist/init.js +3 -3
  77. package/dist/init.js.map +1 -1
  78. package/dist/lib/paper-config.d.ts.map +1 -1
  79. package/dist/lib/paper-config.js +5 -1
  80. package/dist/lib/paper-config.js.map +1 -1
  81. package/dist/new-paper.d.ts +19 -5
  82. package/dist/new-paper.d.ts.map +1 -1
  83. package/dist/new-paper.js +23 -4
  84. package/dist/new-paper.js.map +1 -1
  85. package/dist/paper-settings.d.ts +3 -0
  86. package/dist/paper-settings.d.ts.map +1 -1
  87. package/dist/paper-settings.js +20 -4
  88. package/dist/paper-settings.js.map +1 -1
  89. package/dist/ports/latex.d.ts +7 -1
  90. package/dist/ports/latex.d.ts.map +1 -1
  91. package/dist/ports/submission-portal.d.ts +19 -0
  92. package/dist/ports/submission-portal.d.ts.map +1 -0
  93. package/dist/ports/submission-portal.js +2 -0
  94. package/dist/ports/submission-portal.js.map +1 -0
  95. package/dist/preset-card-rule.d.ts +100 -0
  96. package/dist/preset-card-rule.d.ts.map +1 -0
  97. package/dist/preset-card-rule.js +221 -0
  98. package/dist/preset-card-rule.js.map +1 -0
  99. package/dist/presets.d.ts +43 -2
  100. package/dist/presets.d.ts.map +1 -1
  101. package/dist/presets.js +130 -63
  102. package/dist/presets.js.map +1 -1
  103. package/dist/rules-config.js +1 -1
  104. package/dist/submission.d.ts +61 -0
  105. package/dist/submission.d.ts.map +1 -0
  106. package/dist/submission.js +211 -0
  107. package/dist/submission.js.map +1 -0
  108. package/dist/tex-requirements.d.ts +36 -3
  109. package/dist/tex-requirements.d.ts.map +1 -1
  110. package/dist/tex-requirements.js +30 -2
  111. package/dist/tex-requirements.js.map +1 -1
  112. package/dist/tex-venue-rules.d.ts +7 -8
  113. package/dist/tex-venue-rules.d.ts.map +1 -1
  114. package/dist/tex-venue-rules.js +10 -14
  115. package/dist/tex-venue-rules.js.map +1 -1
  116. package/dist/types.d.ts +13 -0
  117. package/dist/types.d.ts.map +1 -1
  118. package/docs/configuration.md +30 -11
  119. package/docs/optional-rules.md +4 -3
  120. package/docs/rules/format/page-limit.md +1 -1
  121. package/docs/rules/paper/folder-venue-leftover.md +104 -0
  122. package/docs/rules/talk/captions-cover.md +1 -1
  123. package/docs/rules/talk/duration-floor.md +1 -1
  124. package/docs/rules/talk/profile.md +1 -1
  125. package/docs/rules/tex/heading-case.md +424 -0
  126. package/docs/rules.md +64 -53
  127. package/docs/skills.md +5 -4
  128. package/docs/submission.md +64 -0
  129. package/docs/talk.md +1 -1
  130. package/eslint-rules/latex-language.test.mjs +12 -0
  131. package/eslint-rules/latex-language.ts +17 -4
  132. package/eslint-rules/paper-typography.test.mjs +12 -0
  133. package/eslint.config.mjs +59 -1
  134. package/fixtures/build-e2e/acmart/paper.tex +1 -1
  135. package/fixtures/build-e2e/fallback/expect.json +3 -3
  136. package/lib/paper-config.ts +6 -1
  137. package/lib/skill-checks.d.mts +7 -0
  138. package/lib/skill-checks.mjs +31 -0
  139. package/lib/skill-trigger-cases.mjs +11 -0
  140. package/package.json +8 -2
  141. package/presets/acm-sigconf.jsonc +5 -0
  142. package/presets/acm-sigconf.md +43 -0
  143. package/presets/agenticdev.jsonc +27 -6
  144. package/presets/agenticdev.md +151 -0
  145. package/presets/aidc.jsonc +12 -0
  146. package/presets/aidc.md +75 -0
  147. package/presets/aisec.jsonc +5 -1
  148. package/presets/aisec.md +117 -0
  149. package/presets/ieee-conference.jsonc +5 -0
  150. package/presets/ieee-conference.md +38 -0
  151. package/presets/realm.jsonc +7 -2
  152. package/presets/realm.md +166 -0
  153. package/presets/tex/agenticdev.tex +1 -1
  154. package/presets/tex-base.jsonc +6 -0
  155. package/presets/tex-base.md +30 -0
  156. package/presets/venue-profile.schema.json +57 -2
  157. package/skills/find-venue/SKILL.md +6 -5
  158. package/skills/find-venue/SKILL.md.spec.ts +5 -4
  159. package/skills/paper-pipeline/SKILL.md +5 -6
  160. package/skills/paper-pipeline/SKILL.md.spec.ts +4 -5
  161. package/skills/paper-pipeline/paper-pipeline.harness.mjs +4 -0
  162. package/skills/paper-pipeline/references/acl-venue-rules.md +1 -1
  163. package/skills/study-accepted-papers/SKILL.md +3 -3
  164. package/skills/study-accepted-papers/SKILL.md.spec.ts +2 -2
  165. package/skills/submission-portal/SKILL.md +69 -0
  166. package/skills/submission-portal/SKILL.md.spec.ts +71 -0
  167. package/skills/submission-portal/submission-portal.eval.mjs +15 -0
  168. package/skills/submission-portal/submission-portal.test.ts +81 -0
  169. package/skills/submit-paper/SKILL.md +27 -22
  170. package/skills/submit-paper/SKILL.md.spec.ts +26 -21
  171. package/skills/submit-paper/references/publishers/acm.md +1 -1
  172. package/src/adapters/hotcrp/cassette/README.md +24 -0
  173. package/src/adapters/hotcrp/cassette/get-noauth.json +10 -0
  174. package/src/adapters/hotcrp/cassette/get-paper.json +39 -0
  175. package/src/adapters/hotcrp/cassette/post-dot.json +21 -0
  176. package/src/adapters/hotcrp/cassette/post-ok.json +12 -0
  177. package/src/adapters/hotcrp/index.ts +11 -0
  178. package/src/adapters/hotcrp/portal.io.ts +130 -0
  179. package/src/adapters/hotcrp/portal.test.ts +503 -0
  180. package/src/adapters/hotcrp/response.ts +181 -0
  181. package/src/adapters/latex/conditionals.ts +130 -0
  182. package/src/adapters/latex/headings.ts +163 -0
  183. package/src/adapters/latex/index.test.ts +65 -0
  184. package/src/adapters/latex/index.ts +3 -0
  185. package/src/adapters/latex/parse.ts +3 -2
  186. package/src/build.ts +2 -2
  187. package/src/cli.test.ts +155 -3
  188. package/src/cli.ts +161 -25
  189. package/src/domain/heading-case.test.ts +660 -0
  190. package/src/domain/heading-case.ts +538 -0
  191. package/src/domain/result.test.ts +9 -1
  192. package/src/domain/result.ts +5 -0
  193. package/src/domain/submission.test.ts +45 -0
  194. package/src/domain/submission.ts +141 -0
  195. package/src/domain/tex-document.ts +36 -0
  196. package/src/domain/venue-name.test.ts +121 -0
  197. package/src/domain/venue-name.ts +129 -0
  198. package/src/facts-file.test.ts +4 -4
  199. package/src/facts-file.ts +6 -6
  200. package/src/folder-venue-rule.test.ts +182 -0
  201. package/src/folder-venue-rule.ts +141 -0
  202. package/src/heading-case.test.ts +500 -0
  203. package/src/heading-case.ts +275 -0
  204. package/src/init.test.ts +22 -0
  205. package/src/init.ts +9 -2
  206. package/src/new-paper.harness.mjs +11 -9
  207. package/src/new-paper.test.ts +135 -10
  208. package/src/new-paper.ts +38 -7
  209. package/src/paper-settings-commands.test.ts +25 -10
  210. package/src/paper-settings.test.ts +12 -1
  211. package/src/paper-settings.ts +25 -5
  212. package/src/parse-args.test.ts +19 -0
  213. package/src/ports/latex.ts +7 -0
  214. package/src/ports/submission-portal.ts +26 -0
  215. package/src/preset-card-rule.test.ts +266 -0
  216. package/src/preset-card-rule.ts +384 -0
  217. package/src/presets.test.ts +212 -37
  218. package/src/presets.ts +183 -71
  219. package/src/rule-cases.test.ts +147 -42
  220. package/src/rules-config.ts +1 -1
  221. package/src/submission.test.ts +497 -0
  222. package/src/submission.ts +311 -0
  223. package/src/talk-rules.test.ts +6 -3
  224. package/src/tex-requirements.harness.ts +25 -11
  225. package/src/tex-requirements.test.ts +127 -1
  226. package/src/tex-requirements.ts +78 -8
  227. package/src/tex-venue-rules.test.ts +36 -22
  228. package/src/tex-venue-rules.ts +14 -26
  229. package/src/types.ts +13 -0
  230. package/src/venue-rules.test.ts +7 -6
  231. package/templates/paper/paper.tex +1 -1
  232. package/skills/submit-paper/references/venues/agenticdev.md +0 -171
  233. package/skills/submit-paper/references/venues/aisec.md +0 -105
  234. package/skills/submit-paper/references/venues/realm.md +0 -155
@@ -0,0 +1,365 @@
1
+ /**
2
+ * HEADING CASE — what a venue's capitalization style asks of the words of the paper's title and of
3
+ * its headings, decided on the text the LaTeX adapter hands over (`TitledHeading`), never on the
4
+ * source.
5
+ *
6
+ * ── A STYLE IS NAMED AFTER THE TEXT THAT DEFINES IT ──────────────────────────────
7
+ * Venues name the authority precisely and the scope loosely: «headline-style capitalization
8
+ * (according to the Chicago Manual of Style …)» for «the title and all headings». Headline variants
9
+ * disagree on real words — Chicago lowercases `With`, `Between` and `From` «regardless of length»,
10
+ * APA title case and IEEE's manual capitalize them — so there is no style called just «headline»:
11
+ * one word would let a preset apply Chicago where a venue asks APA. A new variant is a new member of
12
+ * `CaseStyle`, added with the venue text that defines it and its own word table.
13
+ *
14
+ * ── CHICAGO-HEADLINE, THE PUBLISHER'S WORDS ──────────────────────────────────────
15
+ * Conference Publishing Consulting's quote of the Chicago Manual of Style 8.157–8.159 (the text is
16
+ * quoted on the rule's page): capitalize the first and the last word, the first word after a colon,
17
+ * and every major word (nouns, pronouns, verbs, adjectives, adverbs); lowercase articles,
18
+ * prepositions «regardless of length», the conjunctions and, but, for, or, nor, and «to» and «as»; in
19
+ * a hyphenated compound always capitalize the first element and lowercase the others when they are
20
+ * an article, a preposition or a conjunction, or when the first is a prefix that cannot stand by
21
+ * itself.
22
+ *
23
+ * ── SILENCE IS THE DEFAULT ───────────────────────────────────────────────────────
24
+ * A finding here is an error at a venue that rejects on it, and a wrong one costs more than a miss.
25
+ * So every word gets one of four classes, and only two of them can be wrong:
26
+ *
27
+ * lower what the publisher lists, and prepositions that are nothing else: lowercase between the
28
+ * first and the last word, capitalized at either end and after a colon
29
+ * major every word not in a list — nouns, verbs, adjectives, adverbs, pronouns: capitalized
30
+ * either a word that is a preposition in one sentence and a particle, an adverb or a subordinating
31
+ * conjunction in another (`up`, `down`, `over`, `out`, `off`, `on`, `in`, `through`, `if`,
32
+ * `while`, `that`…): capitalized at the ends and after a colon, whatever it is; anywhere
33
+ * else not read, in either case, and never fixed
34
+ * name the particle of a surname (`von`, `de`): never read
35
+ *
36
+ * What the rule cannot tell from a word is not read at all: a word with a capital inside (`LLM`,
37
+ * `GitHub`, `iOS`), a single letter, anything with a digit, a dot, a slash or an accent in it, a
38
+ * piece followed by a full stop before the title ends (`al.`, `etc.`, `vs.`), the abbreviations
39
+ * `et al etc cf eg ie approx viz`, a word whose capital is not one letter (a ligature, `fi`), and
40
+ * everything `OPAQUE` in the title (math, code, citations). A word right beside such a thing is
41
+ * not known to be first or last, so a minor word there is left as it is.
42
+ *
43
+ * A title comes in parts — a subtitle after a colon, a question mark, a dash or a line break
44
+ * (`LINE_BREAK`). The first word of a part is a start: a minor word there is not asked either way.
45
+ * The last word of a part is capitalized by Chicago and may be a particle (_What Is It Good For:_),
46
+ * so a minor word there is not asked either way either.
47
+ */
48
+ import { LINE_BREAK, runText, } from "./tex-document.js";
49
+ /** Every style, in the order a message lists them. */
50
+ export const CASE_STYLES = [
51
+ "chicago-headline",
52
+ "sentence",
53
+ "any",
54
+ ];
55
+ /** Every heading level, in the order of the outline. */
56
+ export const HEADING_LEVELS = [
57
+ "section",
58
+ "subsection",
59
+ "subsubsection",
60
+ "paragraph",
61
+ "subparagraph",
62
+ ];
63
+ /** The style a title is judged by: the title's own, or its level's, else every heading's. */
64
+ export function styleFor(options, command) {
65
+ switch (command.kind) {
66
+ case "title":
67
+ return options.title;
68
+ case "heading":
69
+ return options.levels?.[command.level] ?? options.headings;
70
+ }
71
+ }
72
+ const kinds = (kind, words) => words.split(" ").map((w) => [w, kind]);
73
+ /**
74
+ * The words that are not «major». Articles, the conjunctions the publisher names, «to» and «as»,
75
+ * and prepositions that are used as nothing else in a title. A word on the `either` list may be
76
+ * an adverb or a particle («break through», «scale up») and is never read mid-title.
77
+ */
78
+ const KINDS = new Map([
79
+ ...kinds("lower", "the a an and but for or nor to as"),
80
+ ...kinds("lower", "of at by from into onto upon via per with within without during among amongst against between across throughout toward towards amid despite versus beneath beside"),
81
+ ...kinds("either", "up down over out off on in through under around about above below along after before behind near past inside outside beyond like than since until till vs"),
82
+ ...kinds("either", "if because while when where whether although though whereas unless once so yet that how"),
83
+ ...kinds("either", "using following including regarding concerning given excluding considering besides"),
84
+ ...kinds("name", "von van de der den da di du del della la le el"),
85
+ // Abbreviations a title borrows from running text: never words of it, in any place.
86
+ ...kinds("name", "et al etc cf eg ie approx viz"),
87
+ ]);
88
+ /**
89
+ * Prefixes that cannot stand by themselves: after one, the second element of a compound is not
90
+ * read (`Multi-turn` and `Multi-Turn` both pass). Not `self`, `cross`, `meta`, `over`, `under`,
91
+ * `mini`, `micro`, `super`, `mid`, `counter`, `pro`: each stands alone, or is not certain to.
92
+ */
93
+ export const BOUND_PREFIXES = new Set([
94
+ "anti",
95
+ "co",
96
+ "de",
97
+ "inter",
98
+ "intra",
99
+ "multi",
100
+ "non",
101
+ "post",
102
+ "pre",
103
+ "pseudo",
104
+ "quasi",
105
+ "re",
106
+ "semi",
107
+ "sub",
108
+ "trans",
109
+ "ultra",
110
+ "un",
111
+ ]);
112
+ const isNonEmpty = (a) => a.length > 0;
113
+ /**
114
+ * A piece of the title: up to a space, a dash or a line break. A lone hyphen is a piece; two or more
115
+ * are a dash. A dash and a line break each break the title into parts.
116
+ */
117
+ const PIECES = new RegExp(`(?:[^\\s—–${LINE_BREAK}-]|-(?!-))+|-{2,}|[—–${LINE_BREAK}]`, "gu");
118
+ const BREAK = new RegExp(`^(?:-+|[—–${LINE_BREAK}])$`, "u");
119
+ const LEADING = /^[("'“‘`[{¿¡]+/u;
120
+ const TRAILING = /[.,;:!?)"'”’\]}»]+$/u;
121
+ const READABLE = /^\p{L}[\p{L}'’]*(?:-\p{L}[\p{L}'’]*)*$/u;
122
+ /**
123
+ * An element whose capital is not one letter (a ligature: `fi` → `FI`): capitalizing it would
124
+ * rewrite the word, so it is not read.
125
+ */
126
+ const hasPlainCapital = (el) => el.charAt(0).toUpperCase().length === 1;
127
+ /**
128
+ * One piece → what it is: a break, a word the rule reads, or something it does not. A piece followed
129
+ * by a full stop that does not end the title is an abbreviation (`al.`, `etc.`, `vs.`), not a word.
130
+ */
131
+ function tokenOf(piece, index, final) {
132
+ if (BREAK.test(piece))
133
+ return { kind: "break" };
134
+ const unopened = piece.replace(LEADING, "");
135
+ const core = unopened.replace(TRAILING, "");
136
+ const trail = unopened.slice(core.length);
137
+ const elements = core.split("-");
138
+ const abbreviated = trail.startsWith(".") && !final;
139
+ if (!READABLE.test(core) ||
140
+ !isNonEmpty(elements) ||
141
+ abbreviated ||
142
+ !elements.every(hasPlainCapital))
143
+ return { kind: "opaque", trail };
144
+ const from = index + piece.length - unopened.length;
145
+ return {
146
+ kind: "word",
147
+ word: { elements, from, to: from + core.length },
148
+ trail,
149
+ };
150
+ }
151
+ const tokensOf = (text) => {
152
+ const pieces = [...text.matchAll(PIECES)];
153
+ return pieces.map((m, k) => tokenOf(m[0], m.index, k === pieces.length - 1));
154
+ };
155
+ const isWord = (t) => t.kind === "word";
156
+ const trailOf = (t) => t === undefined || t.kind === "break" ? "" : t.trail;
157
+ function placeOf(tokens, i) {
158
+ const prev = tokens[i - 1];
159
+ const next = tokens[i + 1];
160
+ return {
161
+ first: i === 0,
162
+ last: i === tokens.length - 1,
163
+ afterColon: trailOf(prev).includes(":"),
164
+ mayBeFirst: !tokens.slice(0, i).some(isWord),
165
+ mayBeLast: !tokens.slice(i + 1).some(isWord),
166
+ afterBreak: prev?.kind === "break" || /[.?!]/u.test(trailOf(prev)),
167
+ beforeBreak: next?.kind === "break" || /[:?!]/u.test(trailOf(tokens[i])),
168
+ besideOpaque: prev?.kind === "opaque" || next?.kind === "opaque",
169
+ };
170
+ }
171
+ const kindOf = (element) => KINDS.get(element.toLowerCase()) ?? "major";
172
+ /** A word with a capital anywhere but its first letter (`LLM`, `GitHub`, `iOS`): a name, not read. */
173
+ const isMixed = (el) => el.slice(1) !== el.slice(1).toLowerCase();
174
+ /**
175
+ * A single letter other than a lowercase article: a symbol, not a word. A capital «A» in the middle
176
+ * of a title is a label (_Module A_, _Appendix A_, _Vitamin A_), never an article set wrong.
177
+ */
178
+ const isSymbol = (el) => el.length === 1 && el !== "a";
179
+ const capitalized = (el) => el.charAt(0).toUpperCase() + el.slice(1);
180
+ /** A word of the `lower` class: capitalized at either end and after a colon, else lowercase unless unsure. */
181
+ function wantOfMinor(edge, p) {
182
+ if (edge)
183
+ return "upper";
184
+ const unsure = p.mayBeFirst ||
185
+ p.mayBeLast ||
186
+ p.afterBreak ||
187
+ p.beforeBreak ||
188
+ p.besideOpaque;
189
+ return unsure ? "any" : "lower";
190
+ }
191
+ /** What chicago-headline asks of a whole word standing alone. */
192
+ function wantOfWord(el, p) {
193
+ if (isSymbol(el))
194
+ return "any";
195
+ const edge = p.first || p.last || p.afterColon;
196
+ switch (kindOf(el)) {
197
+ case "name":
198
+ return "any";
199
+ case "major":
200
+ return "upper";
201
+ case "either":
202
+ return edge ? "upper" : "any";
203
+ case "lower":
204
+ return wantOfMinor(edge, p);
205
+ }
206
+ }
207
+ /** What chicago-headline asks of the `k`-th element (k > 0) of a compound whose first element is `first`. */
208
+ function wantOfLater(el, k, first) {
209
+ switch (kindOf(el)) {
210
+ case "lower":
211
+ return "lower";
212
+ case "major":
213
+ return k === 1 && BOUND_PREFIXES.has(first.toLowerCase())
214
+ ? "any"
215
+ : "upper";
216
+ case "either":
217
+ case "name":
218
+ return "any";
219
+ }
220
+ }
221
+ /** An element as `want` asks, or as it is when it is a name or the want is open. */
222
+ function applied(el, want) {
223
+ if (want === "any" || isMixed(el))
224
+ return el;
225
+ return want === "upper" ? capitalized(el) : el.toLowerCase();
226
+ }
227
+ /**
228
+ * What chicago-headline asks of each element of a word. A compound with a single-letter element
229
+ * (`k-means`, `e-mail`) is not read; otherwise the first element is capitalized always and the rest
230
+ * follow `wantOfLater`.
231
+ */
232
+ function judgedElements(word, p) {
233
+ const [first] = word.elements;
234
+ const wantOf = (el, k) => {
235
+ if (word.elements.length === 1)
236
+ return wantOfWord(el, p);
237
+ if (word.elements.some(isSymbol))
238
+ return "any";
239
+ return k === 0 ? "upper" : wantOfLater(el, k, first);
240
+ };
241
+ return word.elements.map((got, k) => {
242
+ const want = wantOf(got, k);
243
+ return { k, want, got, expected: applied(got, want) };
244
+ });
245
+ }
246
+ /** What a message calls the thing a word stands in. */
247
+ function nounOf(c) {
248
+ switch (c.kind) {
249
+ case "title":
250
+ return "title";
251
+ case "heading":
252
+ return "heading";
253
+ }
254
+ }
255
+ /** Why an element is wanted the way it is, as the message says it. */
256
+ function whyOf(j, p, h) {
257
+ if (j.want === "lower")
258
+ return "an article, preposition or conjunction is lowercase";
259
+ if (j.k > 0)
260
+ return "the elements of a hyphenated compound are capitalized unless one is an article, a preposition or a conjunction, or follows a prefix such as «non-»";
261
+ if (p.first)
262
+ return `the first word of a ${nounOf(h.command)} is capitalized`;
263
+ if (p.last)
264
+ return `the last word of a ${nounOf(h.command)} is capitalized`;
265
+ if (p.afterColon)
266
+ return "the first word after a colon is capitalized";
267
+ return "nouns, pronouns, verbs, adjectives and adverbs are capitalized";
268
+ }
269
+ /** The letters of a word, as the title says them. */
270
+ const wordText = (h, w) => runText(h.title).slice(w.from, w.to);
271
+ /**
272
+ * Where the letters `[from, to)` of a title stand in the source: from its first character to past its
273
+ * last. Total, no null: the title's characters are the source's, each at its own offset.
274
+ */
275
+ function spanOf(h, from, to) {
276
+ const offsets = h.title.segments
277
+ .flatMap((s) => s.text.split("").map((_, k) => s.at + k))
278
+ .slice(from, to);
279
+ return { start: Math.min(...offsets), end: Math.max(...offsets) + 1 };
280
+ }
281
+ /** The fix for a word, only where the source holds exactly the letters read, side by side. */
282
+ function fixOf(h, w, expected, source) {
283
+ const span = spanOf(h, w.from, w.to);
284
+ const contiguous = span.end - span.start === w.to - w.from;
285
+ if (!contiguous || source.slice(span.start, span.end) !== wordText(h, w))
286
+ return null;
287
+ return { span, text: expected };
288
+ }
289
+ /** The macro a title is the argument of. */
290
+ function macroOf(c) {
291
+ switch (c.kind) {
292
+ case "title":
293
+ return "title";
294
+ case "heading":
295
+ return c.level;
296
+ }
297
+ }
298
+ /** `\section` for a title, `\section[…]` for the optional short one: how a message names the heading. */
299
+ const whereOf = (h) => h.argument === "short"
300
+ ? `\\${macroOf(h.command)}[…]`
301
+ : `\\${macroOf(h.command)}`;
302
+ /** One word against chicago-headline: nothing, or a finding with the fix where it is certain. */
303
+ function judgeHeadlineWord(h, word, p, source) {
304
+ const [changed] = judgedElements(word, p).filter((j) => j.expected !== j.got);
305
+ if (changed === undefined)
306
+ return [];
307
+ const expected = judgedElements(word, p)
308
+ .map((j) => j.expected)
309
+ .join("-");
310
+ return [
311
+ {
312
+ messageId: changed.want === "upper" ? "capitalize" : "lowercase",
313
+ data: {
314
+ word: wordText(h, word),
315
+ expected,
316
+ why: whyOf(changed, p, h),
317
+ where: whereOf(h),
318
+ },
319
+ at: spanOf(h, word.from, word.to),
320
+ fix: fixOf(h, word, expected, source),
321
+ },
322
+ ];
323
+ }
324
+ /** Sentence: the first word of a title is capitalized, and nothing else is read. */
325
+ function judgeSentenceWord(h, word, p) {
326
+ const [first] = word.elements;
327
+ const got = wordText(h, word);
328
+ const readable = kindOf(first) !== "name" && !isSymbol(first) && !isMixed(first);
329
+ const expected = p.first && readable ? capitalized(got) : got;
330
+ if (expected === got)
331
+ return [];
332
+ return [
333
+ {
334
+ messageId: "sentenceFirst",
335
+ data: { word: got, expected, where: whereOf(h) },
336
+ at: spanOf(h, word.from, word.to),
337
+ fix: null,
338
+ },
339
+ ];
340
+ }
341
+ /** The findings of one title, each word judged where it stands by `judge`. */
342
+ function judgeWords(h, judge) {
343
+ const tokens = tokensOf(runText(h.title));
344
+ return tokens.flatMap((t, i) => t.kind === "word" ? judge(t.word, placeOf(tokens, i)) : []);
345
+ }
346
+ /** The findings of one title under the style its scope asks. */
347
+ function judgeTitle(h, style, source) {
348
+ switch (style) {
349
+ case "any":
350
+ return [];
351
+ case "chicago-headline":
352
+ return judgeWords(h, (w, p) => judgeHeadlineWord(h, w, p, source));
353
+ case "sentence":
354
+ return judgeWords(h, (w, p) => judgeSentenceWord(h, w, p));
355
+ }
356
+ }
357
+ /**
358
+ * The paper's title and every heading, each against the style its scope asks (`styleFor`), in
359
+ * document order. `source` is the text the titles were read from: a fix is offered only where it
360
+ * holds the very letters the judge read.
361
+ */
362
+ export function judgeHeadingCase(headings, options, source) {
363
+ return headings.flatMap((h) => judgeTitle(h, styleFor(options, h.command), source));
364
+ }
365
+ //# sourceMappingURL=heading-case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heading-case.js","sourceRoot":"","sources":["../../src/domain/heading-case.ts"],"names":[],"mappings":"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"}
@@ -12,6 +12,10 @@ export type Result<T, E> = {
12
12
  };
13
13
  export declare const ok: <T>(value: T) => Result<T, never>;
14
14
  export declare const err: <E>(error: E) => Result<never, E>;
15
+ /** Whether `r` succeeded — a type guard, so `filter(isOk)` keeps the successes as successes. */
16
+ export declare const isOk: <T, E>(r: Result<T, E>) => r is Extract<Result<T, E>, {
17
+ readonly ok: true;
18
+ }>;
15
19
  export declare const map: <T, U, E>(r: Result<T, E>, f: (t: T) => U) => Result<U, E>;
16
20
  export declare const andThen: <T, U, E, F>(r: Result<T, E>, f: (t: T) => Result<U, F>) => Result<U, E | F>;
17
21
  export declare const match: <T, E, R>(r: Result<T, E>, on: {
@@ -1 +1 @@
1
- {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/domain/result.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,IACnB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACxC;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAE9C,eAAO,MAAM,EAAE,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAA0B,CAAC;AAC3E,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAA2B,CAAC;AAE7E,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAC/C,CAAC;AAE5B,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAChC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EACf,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KACxB,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAA4B,CAAC;AAE/C,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAC3B,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EACf,IAAI;IAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;CAAE,KAC1D,CAA8C,CAAC"}
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../../src/domain/result.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,IACnB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACxC;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC;AAE9C,eAAO,MAAM,EAAE,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAA0B,CAAC;AAC3E,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAA2B,CAAC;AAE7E,gGAAgG;AAChG,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,CAAC,EACvB,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KACd,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAA;CAAE,CAAS,CAAC;AAE7D,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAC/C,CAAC;AAE5B,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAChC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EACf,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KACxB,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAA4B,CAAC;AAE/C,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAC3B,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EACf,IAAI;IAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;CAAE,KAC1D,CAA8C,CAAC"}
@@ -1,5 +1,7 @@
1
1
  export const ok = (value) => ({ ok: true, value });
2
2
  export const err = (error) => ({ ok: false, error });
3
+ /** Whether `r` succeeded — a type guard, so `filter(isOk)` keeps the successes as successes. */
4
+ export const isOk = (r) => r.ok;
3
5
  export const map = (r, f) => r.ok ? ok(f(r.value)) : r;
4
6
  export const andThen = (r, f) => (r.ok ? f(r.value) : r);
5
7
  export const match = (r, on) => (r.ok ? on.ok(r.value) : on.err(r.error));
@@ -1 +1 @@
1
- {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/domain/result.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,EAAE,GAAG,CAAI,KAAQ,EAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,GAAG,GAAG,CAAI,KAAQ,EAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAE7E,MAAM,CAAC,MAAM,GAAG,GAAG,CAAU,CAAe,EAAE,CAAc,EAAgB,EAAE,CAC5E,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE5B,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,CAAe,EACf,CAAyB,EACP,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/C,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,CAAe,EACf,EAA2D,EACxD,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"result.js","sourceRoot":"","sources":["../../src/domain/result.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,EAAE,GAAG,CAAI,KAAQ,EAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,GAAG,GAAG,CAAI,KAAQ,EAAoB,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;AAE7E,gGAAgG;AAChG,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,CAAe,EACoC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAE7D,MAAM,CAAC,MAAM,GAAG,GAAG,CAAU,CAAe,EAAE,CAAc,EAAgB,EAAE,CAC5E,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE5B,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,CAAe,EACf,CAAyB,EACP,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/C,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,CAAe,EACf,EAA2D,EACxD,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * THE SUBMISSION ON A CONFERENCE PORTAL — what `paperlint submission` reads and changes.
3
+ *
4
+ * Two declarations, each in the file that owns the fact:
5
+ *
6
+ * venue preset `portal` where the venue takes submissions: `{ "kind": "hotcrp", "url": … }`
7
+ * paper `submission` which submission on that portal is this paper's: `{ "id": 7 }`
8
+ *
9
+ * The values here are the portal's answers in paperlint's words, not in any one portal's: an adapter
10
+ * per portal kind maps its API onto them (`src/adapters/hotcrp/`).
11
+ */
12
+ import { type Result } from "./result.ts";
13
+ import type { Sha256 } from "./sha256.ts";
14
+ /** The portal kinds an adapter exists for. Any other kind is refused by name. */
15
+ export type PortalKind = "hotcrp";
16
+ export declare const PORTAL_KINDS: readonly PortalKind[];
17
+ /** A venue preset's `portal`, as the preset declares it: the kind is checked where it is used. */
18
+ export interface VenuePortal {
19
+ readonly kind: string;
20
+ /** The portal site's base URL, without a trailing slash. */
21
+ readonly url: string;
22
+ }
23
+ /** A portal whose kind has an adapter. */
24
+ export interface SupportedPortal {
25
+ readonly kind: PortalKind;
26
+ readonly url: string;
27
+ }
28
+ /** The declared portal → one paperlint can talk to, or the refusal naming the kind. Pure. */
29
+ export declare function supportedPortal(p: VenuePortal): Result<SupportedPortal, string>;
30
+ /** A paper's `submission`: which submission on the venue's portal is this paper's. */
31
+ export interface PaperSubmission {
32
+ readonly id: number;
33
+ }
34
+ /** A paper's `submission` key → the value, null when absent, or one line saying what is wrong. Pure. */
35
+ export declare function parsePaperSubmission(v: unknown): Result<PaperSubmission | null, string>;
36
+ /** The PDF the portal holds for a submission. */
37
+ export interface PortalDocument {
38
+ /** The sha256 of the stored bytes; null when the portal names another hash or none. */
39
+ readonly sha256: Sha256 | null;
40
+ /** The hash as the portal spells it. */
41
+ readonly hash: string;
42
+ readonly size: number | null;
43
+ readonly mimetype: string | null;
44
+ /** Unix seconds; null when the portal does not say. */
45
+ readonly uploadedAt: number | null;
46
+ }
47
+ /** One submission, as the portal shows it to its author. */
48
+ export interface SubmissionView {
49
+ readonly id: number;
50
+ readonly status: string;
51
+ readonly title: string | null;
52
+ readonly paperType: string | null;
53
+ readonly topics: readonly string[];
54
+ readonly abstract: string | null;
55
+ /** The PDF the portal holds; null when none is uploaded. */
56
+ readonly pdf: PortalDocument | null;
57
+ /** Unix seconds; null when not submitted or not said. */
58
+ readonly submittedAt: number | null;
59
+ readonly modifiedAt: number | null;
60
+ /** What the portal said beside the answer. */
61
+ readonly messages: readonly PortalMessage[];
62
+ }
63
+ /** A change to send. Every absent part is left as the portal has it. */
64
+ export interface SubmissionChange {
65
+ readonly pdf: {
66
+ readonly name: string;
67
+ readonly bytes: Uint8Array;
68
+ } | null;
69
+ readonly abstract: string | null;
70
+ /** Mark the submission submitted (ready for review). */
71
+ readonly submit: boolean;
72
+ }
73
+ /** One message from the portal: its text, and the field it is about when it names one. */
74
+ export interface PortalMessage {
75
+ readonly message: string;
76
+ readonly field: string | null;
77
+ /** The portal's severity number, when it gives one. */
78
+ readonly status: number | null;
79
+ }
80
+ /** What the portal answered to a change. */
81
+ export interface UpdateOutcome {
82
+ readonly httpStatus: number;
83
+ /** The change is valid; for a saved change, it was also committed. */
84
+ readonly valid: boolean;
85
+ /** The fields the change touched. */
86
+ readonly changes: readonly string[];
87
+ readonly messages: readonly PortalMessage[];
88
+ /** The portal reports that nothing was saved. */
89
+ readonly dryRun: boolean;
90
+ }
91
+ /** Why the portal gave no usable answer. */
92
+ export type PortalFailure = {
93
+ readonly kind: "refused";
94
+ readonly httpStatus: number;
95
+ readonly messages: readonly PortalMessage[];
96
+ } | {
97
+ readonly kind: "unreachable";
98
+ readonly detail: string;
99
+ } | {
100
+ readonly kind: "malformed";
101
+ readonly httpStatus: number;
102
+ readonly detail: string;
103
+ };
104
+ /** Words in a text, as a reader counts them: runs of non-space. Pure. */
105
+ export declare const wordCount: (s: string) => number;
106
+ //# sourceMappingURL=submission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submission.d.ts","sourceRoot":"","sources":["../../src/domain/submission.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * THE SUBMISSION ON A CONFERENCE PORTAL — what `paperlint submission` reads and changes.
3
+ *
4
+ * Two declarations, each in the file that owns the fact:
5
+ *
6
+ * venue preset `portal` where the venue takes submissions: `{ "kind": "hotcrp", "url": … }`
7
+ * paper `submission` which submission on that portal is this paper's: `{ "id": 7 }`
8
+ *
9
+ * The values here are the portal's answers in paperlint's words, not in any one portal's: an adapter
10
+ * per portal kind maps its API onto them (`src/adapters/hotcrp/`).
11
+ */
12
+ import { err, ok } from "./result.js";
13
+ import { isRecord } from "./record.js";
14
+ export const PORTAL_KINDS = ["hotcrp"];
15
+ const isPortalKind = (k) => PORTAL_KINDS.some((x) => x === k);
16
+ /** The declared portal → one paperlint can talk to, or the refusal naming the kind. Pure. */
17
+ export function supportedPortal(p) {
18
+ return isPortalKind(p.kind)
19
+ ? ok({ kind: p.kind, url: p.url.replace(/\/+$/, "") })
20
+ : err(`portal kind "${p.kind}" is not supported; upload by hand`);
21
+ }
22
+ /** A paper's `submission` key → the value, null when absent, or one line saying what is wrong. Pure. */
23
+ export function parsePaperSubmission(v) {
24
+ if (v === undefined)
25
+ return ok(null);
26
+ const bad = err(`"submission" must be { "id": <the submission number on the venue's portal> }`);
27
+ if (!isRecord(v))
28
+ return bad;
29
+ const unknown = Object.keys(v).find((k) => k !== "id");
30
+ if (unknown !== undefined)
31
+ return err(`"submission" has an unknown key "${unknown}" — known: id`);
32
+ const id = v["id"];
33
+ return typeof id === "number" && Number.isInteger(id) && id > 0
34
+ ? ok({ id })
35
+ : bad;
36
+ }
37
+ /** Words in a text, as a reader counts them: runs of non-space. Pure. */
38
+ export const wordCount = (s) => s.split(/\s+/).filter((w) => w !== "").length;
39
+ //# sourceMappingURL=submission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submission.js","sourceRoot":"","sources":["../../src/domain/submission.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAKvC,MAAM,CAAC,MAAM,YAAY,GAA0B,CAAC,QAAQ,CAAC,CAAC;AAe9D,MAAM,YAAY,GAAG,CAAC,CAAS,EAAmB,EAAE,CAClD,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;AAEpC,6FAA6F;AAC7F,MAAM,UAAU,eAAe,CAC7B,CAAc;IAEd,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC;QACzB,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;QACtD,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,oCAAoC,CAAC,CAAC;AACtE,CAAC;AAOD,wGAAwG;AACxG,MAAM,UAAU,oBAAoB,CAClC,CAAU;IAEV,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,GAAG,CACb,8EAA8E,CAC/E,CAAC;IACF,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACvD,IAAI,OAAO,KAAK,SAAS;QACvB,OAAO,GAAG,CAAC,oCAAoC,OAAO,eAAe,CAAC,CAAC;IACzE,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC;QAC7D,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC;QACZ,CAAC,CAAC,GAAG,CAAC;AACV,CAAC;AAyED,yEAAyE;AACzE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAS,EAAU,EAAE,CAC7C,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC"}
@@ -144,4 +144,36 @@ export interface LayoutOverride {
144
144
  readonly command: string;
145
145
  readonly place: Place;
146
146
  }
147
+ /**
148
+ * What stands in a heading's text for something the reader sees and the case judge does not read —
149
+ * math, code, a citation, any command whose text is not plain: one character no title contains.
150
+ */
151
+ export declare const OPAQUE = "\uFFFC";
152
+ /**
153
+ * What stands in a heading's text for a forced line break (`\\`, `\newline`, `\linebreak`): one
154
+ * character no title contains. A title broken over two lines is two parts — a title and its
155
+ * subtitle — so the case judge reads the word after it as a start, like the word after a dash.
156
+ */
157
+ export declare const LINE_BREAK = "\u2028";
158
+ /** The headings whose title a venue sets in a case style. */
159
+ export type HeadingLevel = "section" | "subsection" | "subsubsection" | "paragraph" | "subparagraph";
160
+ /** Which command a title belongs to: the paper's own `\title`, or a heading at its level. */
161
+ export type TitledCommand = {
162
+ readonly kind: "title";
163
+ } | {
164
+ readonly kind: "heading";
165
+ readonly level: HeadingLevel;
166
+ };
167
+ /** Which argument of the command: the title, or the optional short title in brackets. */
168
+ export type TitleArgument = "title" | "short";
169
+ /**
170
+ * One title as the case judge reads it — the paper's or a heading's: its text, each character with
171
+ * the source offset it came from, and `OPAQUE` where something it does not read stands. A label, a
172
+ * footnote and a comment are not in it; a title with nothing else has no `TitledHeading`.
173
+ */
174
+ export interface TitledHeading {
175
+ readonly command: TitledCommand;
176
+ readonly argument: TitleArgument;
177
+ readonly title: TextRun;
178
+ }
147
179
  //# sourceMappingURL=tex-document.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tex-document.d.ts","sourceRoot":"","sources":["../../src/domain/tex-document.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tex-document.d.ts","sourceRoot":"","sources":["../../src/domain/tex-document.ts"],"names":[],"mappings":"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"}