paperlint 3.2.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (442) hide show
  1. package/.github/workflows/ci.yml +16 -23
  2. package/CLAUDE.md +33 -13
  3. package/CONTRIBUTING.md +23 -7
  4. package/README.md +11 -8
  5. package/dist/adapters/banal/failure.d.ts +1 -7
  6. package/dist/adapters/banal/failure.d.ts.map +1 -1
  7. package/dist/adapters/banal/failure.js +5 -7
  8. package/dist/adapters/banal/failure.js.map +1 -1
  9. package/dist/adapters/banal/index.d.ts.map +1 -1
  10. package/dist/adapters/banal/index.js +8 -11
  11. package/dist/adapters/banal/index.js.map +1 -1
  12. package/dist/adapters/banal/install.d.ts.map +1 -1
  13. package/dist/adapters/banal/install.js +4 -3
  14. package/dist/adapters/banal/install.js.map +1 -1
  15. package/dist/adapters/banal/invocation.d.ts +10 -5
  16. package/dist/adapters/banal/invocation.d.ts.map +1 -1
  17. package/dist/adapters/banal/invocation.js +13 -1
  18. package/dist/adapters/banal/invocation.js.map +1 -1
  19. package/dist/adapters/banal/locate.d.ts +12 -9
  20. package/dist/adapters/banal/locate.d.ts.map +1 -1
  21. package/dist/adapters/banal/locate.js +19 -12
  22. package/dist/adapters/banal/locate.js.map +1 -1
  23. package/dist/adapters/banal/run.d.ts +10 -1
  24. package/dist/adapters/banal/run.d.ts.map +1 -1
  25. package/dist/adapters/banal/run.js +8 -4
  26. package/dist/adapters/banal/run.js.map +1 -1
  27. package/dist/adapters/banal/settings.d.ts +1 -1
  28. package/dist/adapters/banal/settings.d.ts.map +1 -1
  29. package/dist/adapters/banal/settings.js +2 -1
  30. package/dist/adapters/banal/settings.js.map +1 -1
  31. package/dist/adapters/latex/document-class.d.ts +22 -0
  32. package/dist/adapters/latex/document-class.d.ts.map +1 -0
  33. package/dist/adapters/latex/document-class.js +102 -0
  34. package/dist/adapters/latex/document-class.js.map +1 -0
  35. package/dist/adapters/latex/hidden.d.ts +16 -0
  36. package/dist/adapters/latex/hidden.d.ts.map +1 -0
  37. package/dist/adapters/latex/hidden.js +49 -0
  38. package/dist/adapters/latex/hidden.js.map +1 -0
  39. package/dist/adapters/latex/index.d.ts +29 -0
  40. package/dist/adapters/latex/index.d.ts.map +1 -0
  41. package/dist/adapters/latex/index.js +18 -0
  42. package/dist/adapters/latex/index.js.map +1 -0
  43. package/dist/adapters/latex/nodes.d.ts +54 -0
  44. package/dist/adapters/latex/nodes.d.ts.map +1 -0
  45. package/dist/adapters/latex/nodes.js +93 -0
  46. package/dist/adapters/latex/nodes.js.map +1 -0
  47. package/dist/adapters/latex/outline.d.ts +10 -0
  48. package/dist/adapters/latex/outline.d.ts.map +1 -0
  49. package/dist/adapters/latex/outline.js +39 -0
  50. package/dist/adapters/latex/outline.js.map +1 -0
  51. package/dist/adapters/latex/parse.d.ts +42 -0
  52. package/dist/adapters/latex/parse.d.ts.map +1 -0
  53. package/dist/adapters/latex/parse.js +94 -0
  54. package/dist/adapters/latex/parse.js.map +1 -0
  55. package/dist/adapters/latex/rendered.d.ts +10 -0
  56. package/dist/adapters/latex/rendered.d.ts.map +1 -0
  57. package/dist/adapters/latex/rendered.js +39 -0
  58. package/dist/adapters/latex/rendered.js.map +1 -0
  59. package/dist/adapters/memory/index.d.ts.map +1 -1
  60. package/dist/adapters/memory/index.js +8 -2
  61. package/dist/adapters/memory/index.js.map +1 -1
  62. package/dist/adapters/node/process.io.d.ts +6 -3
  63. package/dist/adapters/node/process.io.d.ts.map +1 -1
  64. package/dist/adapters/node/process.io.js.map +1 -1
  65. package/dist/adapters/node/workspace.io.d.ts.map +1 -1
  66. package/dist/adapters/node/workspace.io.js +4 -2
  67. package/dist/adapters/node/workspace.io.js.map +1 -1
  68. package/dist/adapters/pdfjs/fill.d.ts.map +1 -1
  69. package/dist/adapters/pdfjs/fill.js +12 -12
  70. package/dist/adapters/pdfjs/fill.js.map +1 -1
  71. package/dist/adapters/references/index.d.ts.map +1 -1
  72. package/dist/adapters/references/index.js +4 -2
  73. package/dist/adapters/references/index.js.map +1 -1
  74. package/dist/build-engine.d.ts +1 -1
  75. package/dist/build-engine.d.ts.map +1 -1
  76. package/dist/build-engine.js +8 -1
  77. package/dist/build-engine.js.map +1 -1
  78. package/dist/build.d.ts +2 -3
  79. package/dist/build.d.ts.map +1 -1
  80. package/dist/build.js +9 -10
  81. package/dist/build.js.map +1 -1
  82. package/dist/caller-path.d.ts +3 -0
  83. package/dist/caller-path.d.ts.map +1 -0
  84. package/dist/caller-path.js +13 -0
  85. package/dist/caller-path.js.map +1 -0
  86. package/dist/cli.d.ts +10 -17
  87. package/dist/cli.d.ts.map +1 -1
  88. package/dist/cli.js +91 -17
  89. package/dist/cli.js.map +1 -1
  90. package/dist/doctor.d.ts +12 -3
  91. package/dist/doctor.d.ts.map +1 -1
  92. package/dist/doctor.js +2 -1
  93. package/dist/doctor.js.map +1 -1
  94. package/dist/domain/paths.d.ts +8 -2
  95. package/dist/domain/paths.d.ts.map +1 -1
  96. package/dist/domain/paths.js +12 -1
  97. package/dist/domain/paths.js.map +1 -1
  98. package/dist/domain/ready.d.ts +24 -0
  99. package/dist/domain/ready.d.ts.map +1 -0
  100. package/dist/domain/ready.js +11 -0
  101. package/dist/domain/ready.js.map +1 -0
  102. package/dist/domain/record.d.ts +8 -0
  103. package/dist/domain/record.d.ts.map +1 -0
  104. package/dist/domain/record.js +8 -0
  105. package/dist/domain/record.js.map +1 -0
  106. package/dist/domain/sha256.d.ts.map +1 -1
  107. package/dist/domain/sha256.js +4 -2
  108. package/dist/domain/sha256.js.map +1 -1
  109. package/dist/domain/tex-document.d.ts +84 -0
  110. package/dist/domain/tex-document.d.ts.map +1 -0
  111. package/dist/domain/tex-document.js +43 -0
  112. package/dist/domain/tex-document.js.map +1 -0
  113. package/dist/engine.d.ts +23 -22
  114. package/dist/engine.d.ts.map +1 -1
  115. package/dist/engine.js.map +1 -1
  116. package/dist/eslint-rules/bib-reachable-entry.d.ts +1 -1
  117. package/dist/eslint-rules/bib-reachable-entry.js.map +1 -1
  118. package/dist/eslint-rules/install-path-literals.d.ts +2 -2
  119. package/dist/eslint-rules/install-path-literals.js.map +1 -1
  120. package/dist/eslint-rules/paper-research-question.d.ts +1 -1
  121. package/dist/eslint-rules/paper-research-question.js.map +1 -1
  122. package/dist/eslint-rules/paper-stages.d.ts +2 -2
  123. package/dist/eslint-rules/paper-stages.js.map +1 -1
  124. package/dist/eslint-rules/paper-typography.d.ts +6 -6
  125. package/dist/eslint-rules/paper-typography.js.map +1 -1
  126. package/dist/eslint-rules/pdf-last-page-balance.d.ts +1 -1
  127. package/dist/eslint-rules/pdf-last-page-balance.js.map +1 -1
  128. package/dist/eslint-rules/review-frontmatter.d.ts +2 -2
  129. package/dist/eslint-rules/review-frontmatter.js.map +1 -1
  130. package/dist/eslint-rules/sibling-frontmatter.d.ts +1 -1
  131. package/dist/eslint-rules/sibling-frontmatter.d.ts.map +1 -1
  132. package/dist/eslint-rules/temp-root-realpath.d.ts +1 -1
  133. package/dist/eslint-rules/temp-root-realpath.js.map +1 -1
  134. package/dist/eslint-rules/tex-build.d.ts +2 -2
  135. package/dist/eslint-rules/tex-build.js.map +1 -1
  136. package/dist/facts-file.d.ts.map +1 -1
  137. package/dist/facts-file.js +31 -28
  138. package/dist/facts-file.js.map +1 -1
  139. package/dist/hooks-settings.d.ts.map +1 -1
  140. package/dist/hooks-settings.js +17 -2
  141. package/dist/hooks-settings.js.map +1 -1
  142. package/dist/init.d.ts +3 -4
  143. package/dist/init.d.ts.map +1 -1
  144. package/dist/init.js +18 -8
  145. package/dist/init.js.map +1 -1
  146. package/dist/lib/paper-config.d.ts.map +1 -1
  147. package/dist/lib/paper-config.js +1 -5
  148. package/dist/lib/paper-config.js.map +1 -1
  149. package/dist/new-paper.d.ts +5 -0
  150. package/dist/new-paper.d.ts.map +1 -1
  151. package/dist/new-paper.js +8 -1
  152. package/dist/new-paper.js.map +1 -1
  153. package/dist/package-dirs.d.ts +5 -0
  154. package/dist/package-dirs.d.ts.map +1 -0
  155. package/dist/package-dirs.js +14 -0
  156. package/dist/package-dirs.js.map +1 -0
  157. package/dist/paper-files.d.ts +4 -4
  158. package/dist/paper-files.d.ts.map +1 -1
  159. package/dist/paper-files.js +6 -6
  160. package/dist/paper-files.js.map +1 -1
  161. package/dist/paper-settings.js +3 -3
  162. package/dist/paper-settings.js.map +1 -1
  163. package/dist/pdf-facts.d.ts +51 -1
  164. package/dist/pdf-facts.d.ts.map +1 -1
  165. package/dist/pdf-facts.js +23 -15
  166. package/dist/pdf-facts.js.map +1 -1
  167. package/dist/pdf-geometry.d.ts.map +1 -1
  168. package/dist/pdf-geometry.js +2 -3
  169. package/dist/pdf-geometry.js.map +1 -1
  170. package/dist/ports/latex.d.ts +24 -0
  171. package/dist/ports/latex.d.ts.map +1 -0
  172. package/dist/ports/latex.js +2 -0
  173. package/dist/ports/latex.js.map +1 -0
  174. package/dist/ports/tool-installer.d.ts +2 -14
  175. package/dist/ports/tool-installer.d.ts.map +1 -1
  176. package/dist/presets.d.ts +15 -2
  177. package/dist/presets.d.ts.map +1 -1
  178. package/dist/presets.js +35 -10
  179. package/dist/presets.js.map +1 -1
  180. package/dist/references.d.ts.map +1 -1
  181. package/dist/references.js +4 -4
  182. package/dist/references.js.map +1 -1
  183. package/dist/rules-config.d.ts +26 -1
  184. package/dist/rules-config.d.ts.map +1 -1
  185. package/dist/rules-config.js +9 -9
  186. package/dist/rules-config.js.map +1 -1
  187. package/dist/tex-requirements.d.ts +15 -0
  188. package/dist/tex-requirements.d.ts.map +1 -1
  189. package/dist/tex-requirements.js +28 -10
  190. package/dist/tex-requirements.js.map +1 -1
  191. package/dist/tex-venue-rules.d.ts +83 -0
  192. package/dist/tex-venue-rules.d.ts.map +1 -0
  193. package/dist/tex-venue-rules.js +254 -0
  194. package/dist/tex-venue-rules.js.map +1 -0
  195. package/dist/types.d.ts +5 -3
  196. package/dist/types.d.ts.map +1 -1
  197. package/dist/venue-rules.d.ts +1 -1
  198. package/dist/venue-rules.d.ts.map +1 -1
  199. package/dist/venue-rules.js +20 -7
  200. package/dist/venue-rules.js.map +1 -1
  201. package/docs/configuration.md +5 -4
  202. package/docs/e2e.md +69 -40
  203. package/docs/install.md +1 -1
  204. package/docs/prior-art/README.md +1 -1
  205. package/docs/prior-art/package-location.md +5 -5
  206. package/docs/prior-art/repro/README.md +1 -1
  207. package/docs/prior-art/test-tooling.md +21 -10
  208. package/docs/rules/tex/required-section.md +73 -0
  209. package/docs/rules/tex/template.md +62 -0
  210. package/docs/rules/tex/venue-leftover.md +71 -0
  211. package/docs/rules.md +70 -48
  212. package/docs/testing.md +17 -4
  213. package/docs/texlive-install-decision.md +1 -1
  214. package/docs/toolchain.md +2 -2
  215. package/eslint-rules/bib-reachable-entry.ts +1 -1
  216. package/eslint-rules/install-path-literals.ts +2 -2
  217. package/eslint-rules/paper-research-question.ts +1 -1
  218. package/eslint-rules/paper-stages.ts +2 -2
  219. package/eslint-rules/paper-typography.ts +2 -2
  220. package/eslint-rules/pdf-last-page-balance.ts +1 -1
  221. package/eslint-rules/review-frontmatter.ts +1 -1
  222. package/eslint-rules/temp-root-realpath.ts +1 -1
  223. package/eslint-rules/tex-build.ts +2 -2
  224. package/eslint.config.mjs +162 -15
  225. package/fixtures/build-e2e/acmart/expect.json +26 -0
  226. package/fixtures/build-e2e/aidc/PIPELINE-STATUS.md +3 -0
  227. package/fixtures/build-e2e/aidc/expect.json +14 -0
  228. package/fixtures/build-e2e/aidc/paper.tex +46 -0
  229. package/fixtures/build-e2e/aidc/paperlint.json +1 -0
  230. package/fixtures/build-e2e/broken/expect.json +11 -0
  231. package/fixtures/build-e2e/cite/expect.json +27 -0
  232. package/fixtures/build-e2e/empty/expect.json +12 -0
  233. package/fixtures/build-e2e/fallback/expect.json +53 -0
  234. package/fixtures/build-e2e/guards/expect.json +6 -0
  235. package/fixtures/build-e2e/no-source/expect.json +10 -0
  236. package/fixtures/build-e2e/unbalanced/expect.json +60 -0
  237. package/fixtures/install-path-literals/clean.fixture.mjs +1 -1
  238. package/fixtures/install-path-literals/clean.md +2 -2
  239. package/fixtures/install-path-literals/defect.fixture.mjs +1 -1
  240. package/fixtures/install-path-literals/defect.md +2 -2
  241. package/fixtures/pdf-facts/README.md +1 -1
  242. package/fixtures/real-markdown-paper/baseline.ts +1 -1
  243. package/fixtures/render-paper/build-clean.sh +3 -5
  244. package/hooks/paper-status-gates.sh +9 -19
  245. package/lib/paper-config.harness.mjs +1 -1
  246. package/lib/paper-config.ts +1 -5
  247. package/lib/skill-checks.mjs +24 -381
  248. package/lib/skill-checks.test.mjs +63 -115
  249. package/lib/skill-corpus.mjs +10 -251
  250. package/lib/skill-corpus.test.mjs +2 -13
  251. package/lib/skill-trigger-cases.mjs +1 -1
  252. package/package.json +13 -2
  253. package/{skills/submit-paper/references/venues → presets}/acm-sigconf.jsonc +4 -1
  254. package/{skills/submit-paper/references/venues → presets}/agenticdev.jsonc +4 -0
  255. package/presets/aidc.jsonc +73 -0
  256. package/{skills/submit-paper/references/venues → presets}/aisec.jsonc +4 -0
  257. package/presets/ieee-conference.jsonc +66 -0
  258. package/{skills/submit-paper/references/venues → presets}/realm.jsonc +8 -1
  259. package/{skills/submit-paper/references/venues → presets/tex}/paper-guards.tex +1 -1
  260. package/{skills/submit-paper/references/venues → presets}/venue-profile.schema.json +30 -2
  261. package/scripts/check.harness.ts +64 -10
  262. package/scripts/check.test.ts +60 -13
  263. package/scripts/check.ts +83 -30
  264. package/scripts/coverage-config.test.ts +0 -1
  265. package/scripts/harness-api.frozen.json +0 -1
  266. package/scripts/test.test.ts +1 -1
  267. package/scripts/test.ts +1 -1
  268. package/skills/analyze-sibling-paper/SKILL.md +1 -39
  269. package/skills/analyze-sibling-paper/SKILL.md.spec.ts +0 -38
  270. package/skills/argument-arc/SKILL.md +2 -36
  271. package/skills/argument-arc/SKILL.md.spec.ts +1 -43
  272. package/skills/build-benchmark/SKILL.md +1 -41
  273. package/skills/build-benchmark/SKILL.md.spec.ts +0 -40
  274. package/skills/camera-ready/SKILL.md +1 -34
  275. package/skills/camera-ready/SKILL.md.spec.ts +0 -33
  276. package/skills/cold-read-diff/SKILL.md +1 -35
  277. package/skills/cold-read-diff/SKILL.md.spec.ts +0 -34
  278. package/skills/draft-paper/SKILL.md +2 -41
  279. package/skills/draft-paper/SKILL.md.spec.ts +1 -50
  280. package/skills/extend-paper/SKILL.md +2 -33
  281. package/skills/extend-paper/SKILL.md.spec.ts +1 -42
  282. package/skills/find-venue/SKILL.md +2 -38
  283. package/skills/find-venue/SKILL.md.spec.ts +1 -47
  284. package/skills/grade-paper-writing/SKILL.md +3 -38
  285. package/skills/grade-paper-writing/SKILL.md.spec.ts +2 -47
  286. package/skills/grade-paper-writing/prose-lint.mjs +2 -3
  287. package/skills/grade-paper-writing/prose-lint.test.ts +1 -1
  288. package/skills/harden-paper/SKILL.md +1 -39
  289. package/skills/harden-paper/SKILL.md.spec.ts +0 -38
  290. package/skills/map-prior-work/SKILL.md +1 -35
  291. package/skills/map-prior-work/SKILL.md.spec.ts +0 -34
  292. package/skills/osf-artifact-upload/osf-artifact-upload.harness.ts +3 -4
  293. package/skills/paper-adversarial-review/SKILL.md +2 -35
  294. package/skills/paper-adversarial-review/SKILL.md.spec.ts +1 -43
  295. package/skills/paper-pipeline/PIPELINE-MAP.md +2 -2
  296. package/skills/paper-pipeline/SKILL.md +3 -29
  297. package/skills/paper-pipeline/SKILL.md.spec.ts +2 -28
  298. package/skills/paper-pipeline/grade-paper-writing-ablation.eval.mjs +1 -1
  299. package/skills/paper-pipeline/paper-pipeline.harness.mjs +25 -40
  300. package/skills/paper-pipeline/references/acceptance-gate.md +1 -6
  301. package/skills/paper-pipeline/references/pipeline-status-template.md +8 -35
  302. package/skills/paper-pipeline/scripts/README.md +30 -225
  303. package/skills/paper-pipeline/scripts/artifact-coverage.harness.mjs +4 -8
  304. package/skills/paper-pipeline/scripts/consumer.d.mts +0 -2
  305. package/skills/paper-pipeline/scripts/consumer.harness.mjs +6 -104
  306. package/skills/paper-pipeline/scripts/consumer.mjs +24 -119
  307. package/skills/paper-pipeline/scripts/generated-code.harness.mjs +2 -3
  308. package/skills/paper-pipeline/scripts/population-map.harness.mjs +3 -3
  309. package/skills/paper-status/SKILL.md +2 -42
  310. package/skills/paper-status/SKILL.md.spec.ts +1 -41
  311. package/skills/pc-panel-review/SKILL.md +2 -46
  312. package/skills/pc-panel-review/SKILL.md.spec.ts +1 -45
  313. package/skills/plan-paper-timeline/SKILL.md +2 -36
  314. package/skills/plan-paper-timeline/SKILL.md.spec.ts +0 -36
  315. package/skills/render-paper/SKILL.md +2 -38
  316. package/skills/render-paper/SKILL.md.spec.ts +1 -37
  317. package/skills/render-paper/check-render.sh +16 -63
  318. package/skills/render-paper/render-paper.harness.mjs +17 -59
  319. package/skills/research-ideate/SKILL.md +2 -39
  320. package/skills/research-ideate/SKILL.md.spec.ts +1 -47
  321. package/skills/study-accepted-papers/SKILL.md +1 -34
  322. package/skills/study-accepted-papers/SKILL.md.spec.ts +0 -33
  323. package/skills/submit-paper/SKILL.md +1 -33
  324. package/skills/submit-paper/SKILL.md.spec.ts +0 -32
  325. package/skills/sweep-design-space/SKILL.md +1 -38
  326. package/skills/sweep-design-space/SKILL.md.spec.ts +0 -37
  327. package/skills/tighten-paper/SKILL.md +2 -39
  328. package/skills/tighten-paper/SKILL.md.spec.ts +1 -47
  329. package/skills/tighten-paper/structure.mjs +4 -11
  330. package/skills/verify-citations/SKILL.md +2 -38
  331. package/skills/verify-citations/SKILL.md.spec.ts +1 -37
  332. package/src/adapters/banal/failure.ts +9 -10
  333. package/src/adapters/banal/index.test.ts +3 -3
  334. package/src/adapters/banal/index.ts +8 -10
  335. package/src/adapters/banal/install.ts +9 -4
  336. package/src/adapters/banal/invocation.test.ts +20 -8
  337. package/src/adapters/banal/invocation.ts +24 -9
  338. package/src/adapters/banal/locate.test.ts +2 -2
  339. package/src/adapters/banal/locate.ts +27 -21
  340. package/src/adapters/banal/output.test.ts +1 -1
  341. package/src/adapters/banal/run.test.ts +3 -3
  342. package/src/adapters/banal/run.ts +16 -10
  343. package/src/adapters/banal/settings.ts +2 -2
  344. package/src/adapters/banal/xml.test.ts +1 -1
  345. package/src/adapters/curl/download.test.ts +4 -4
  346. package/src/adapters/latex/document-class.ts +147 -0
  347. package/src/adapters/latex/hidden.ts +70 -0
  348. package/src/adapters/latex/index.test.ts +361 -0
  349. package/src/adapters/latex/index.ts +55 -0
  350. package/src/adapters/latex/nodes.ts +141 -0
  351. package/src/adapters/latex/outline.ts +64 -0
  352. package/src/adapters/latex/parse.ts +136 -0
  353. package/src/adapters/latex/rendered.ts +59 -0
  354. package/src/adapters/memory/index.ts +4 -3
  355. package/src/adapters/node/files.test.ts +5 -3
  356. package/src/adapters/node/process.io.ts +9 -2
  357. package/src/adapters/node/process.test.ts +4 -4
  358. package/src/adapters/node/workspace.io.ts +9 -4
  359. package/src/adapters/pdfjs/fill.test.ts +1 -1
  360. package/src/adapters/pdfjs/fill.ts +18 -10
  361. package/src/adapters/references/index.ts +7 -2
  362. package/src/build-engine.test.ts +11 -6
  363. package/src/build-engine.ts +10 -5
  364. package/src/build.harness.mjs +5 -7
  365. package/src/build.test.ts +10 -11
  366. package/src/build.ts +12 -13
  367. package/src/caller-path.ts +13 -0
  368. package/src/cli.harness.mjs +1 -3
  369. package/src/cli.test.ts +21 -16
  370. package/src/cli.ts +115 -33
  371. package/src/doctor.test.ts +1 -1
  372. package/src/doctor.ts +14 -5
  373. package/src/domain/paths.test.ts +15 -0
  374. package/src/domain/paths.ts +20 -1
  375. package/src/domain/ready.ts +31 -0
  376. package/src/domain/record.test.ts +20 -0
  377. package/src/domain/record.ts +12 -0
  378. package/src/domain/sha256.ts +5 -3
  379. package/src/domain/tex-document.test.ts +80 -0
  380. package/src/domain/tex-document.ts +110 -0
  381. package/src/engine.harness.mjs +1 -1
  382. package/src/engine.ts +30 -2
  383. package/src/facts-file.test.ts +4 -7
  384. package/src/facts-file.ts +45 -30
  385. package/src/hooks-settings.harness.ts +17 -0
  386. package/src/hooks-settings.ts +28 -4
  387. package/src/init.test.ts +25 -5
  388. package/src/init.ts +26 -12
  389. package/src/latex-loop.harness.ts +1 -1
  390. package/src/new-paper.harness.mjs +7 -23
  391. package/src/new-paper.test.ts +28 -3
  392. package/src/new-paper.ts +15 -3
  393. package/src/package-dirs.ts +17 -0
  394. package/src/paper-files.test.ts +22 -19
  395. package/src/paper-files.ts +16 -27
  396. package/src/paper-settings-commands.test.ts +6 -1
  397. package/src/paper-settings.test.ts +2 -2
  398. package/src/paper-settings.ts +5 -5
  399. package/src/pdf-facts.test.ts +16 -5
  400. package/src/pdf-facts.ts +79 -22
  401. package/src/pdf-geometry.ts +5 -3
  402. package/src/ports/latex.ts +29 -0
  403. package/src/ports/tool-installer.ts +2 -17
  404. package/src/presets.test.ts +65 -4
  405. package/src/presets.ts +65 -28
  406. package/src/references.test.ts +25 -19
  407. package/src/references.ts +4 -5
  408. package/src/rule-cases.test.ts +474 -0
  409. package/src/rule-docs.test.ts +159 -0
  410. package/src/rules-config.ts +40 -11
  411. package/src/tex-requirements.harness.ts +13 -23
  412. package/src/tex-requirements.test.ts +21 -0
  413. package/src/tex-requirements.ts +64 -14
  414. package/src/tex-venue-rules.test.ts +659 -0
  415. package/src/tex-venue-rules.ts +429 -0
  416. package/src/toolchain.harness.mjs +1 -1
  417. package/src/toolchain.test.ts +9 -5
  418. package/src/toolchain.ts +2 -2
  419. package/src/types.ts +5 -3
  420. package/src/venue-rules.test.ts +104 -8
  421. package/src/venue-rules.ts +22 -12
  422. package/templates/paper/paper.tex +2 -1
  423. package/skills/paper-pipeline/scripts/announce.mjs +0 -67
  424. package/skills/paper-pipeline/scripts/announce.test.mjs +0 -102
  425. package/skills/paper-pipeline/scripts/fixtures/clean/PIPELINE-STATUS.md +0 -51
  426. package/skills/paper-pipeline/scripts/fixtures/dirty/PIPELINE-STATUS.md +0 -52
  427. package/skills/paper-pipeline/scripts/fixtures/dirty/paper.md +0 -6
  428. package/skills/paper-pipeline/scripts/fixtures/scorecard.ts +0 -100
  429. package/skills/paper-pipeline/scripts/ledger.cli.test.mjs +0 -302
  430. package/skills/paper-pipeline/scripts/ledger.mjs +0 -623
  431. package/skills/paper-pipeline/scripts/ledger.test.mjs +0 -254
  432. package/skills/paper-pipeline/scripts/pipeline-check.cli.test.mjs +0 -474
  433. package/skills/paper-pipeline/scripts/pipeline-check.harness.mjs +0 -328
  434. package/skills/paper-pipeline/scripts/pipeline-check.mjs +0 -750
  435. package/skills/paper-pipeline/scripts/pipeline-edges.mjs +0 -169
  436. package/skills/paper-pipeline/scripts/pipeline-edges.test.mjs +0 -73
  437. package/skills/paper-pipeline/scripts/run-mechanical.mjs +0 -648
  438. package/skills/paper-pipeline/scripts/run-mechanical.test.mjs +0 -468
  439. package/skills/paper-pipeline/scripts/status.mjs +0 -295
  440. package/skills/paper-pipeline/scripts/status.test.mjs +0 -232
  441. /package/{skills/submit-paper/references/venues → presets/tex}/agenticdev.tex +0 -0
  442. /package/{skills/submit-paper/references/venues → presets}/tex-base.jsonc +0 -0
@@ -3,31 +3,38 @@
3
3
  * `$BANAL` (an explicit choice — if it names nothing, there is NO fallback), `<project>/vendor/banal`
4
4
  * (a project that vendors its own copy), then the one `paperlint toolchain` installed.
5
5
  */
6
- import { join } from "node:path";
6
+ import { joinPath } from "../../domain/paths.js";
7
7
  import { err, ok } from "../../domain/result.js";
8
8
  import { BANAL_PIN } from "./pin.js";
9
+ // Not exported: only this module can write the property, so only `locate` can make a LocatedBanal.
10
+ const LOCATED = Symbol("LocatedBanal");
11
+ /** `path` as a banal to run — when the `Files` port says it is a file, else null. */
12
+ function locate(path, kind, isFile) {
13
+ return isFile(path) ? { path, provenance: { kind }, [LOCATED]: true } : null;
14
+ }
9
15
  /** Where `paperlint toolchain` puts the pinned banal: one directory per HotCRP commit. */
10
- export const installedBanal = (s) => join(s.cacheDir, BANAL_PIN.commit.slice(0, 12), "banal");
16
+ export const installedBanal = (s) => joinPath(s.cacheDir, BANAL_PIN.commit.slice(0, 12), "banal");
11
17
  export function lookupOrder(s, projectRoot) {
12
18
  if (s.explicit)
13
19
  return { kind: "explicit", path: s.explicit };
14
20
  return {
15
21
  kind: "search",
16
- vendor: join(projectRoot, "vendor", "banal"),
22
+ vendor: joinPath(projectRoot, "vendor", "banal"),
17
23
  cache: installedBanal(s),
18
24
  };
19
25
  }
20
- const located = (path, kind) => ok({ path, provenance: { kind } });
21
26
  export function pickBanal(order, isFile) {
22
- if (order.kind === "explicit")
23
- return isFile(order.path)
24
- ? located(order.path, "env")
27
+ if (order.kind === "explicit") {
28
+ const own = locate(order.path, "env", isFile);
29
+ return own
30
+ ? ok(own)
25
31
  : err({ kind: "explicit-not-found", path: order.path });
26
- if (isFile(order.vendor))
27
- return located(order.vendor, "vendor");
28
- if (isFile(order.cache))
29
- return located(order.cache, "cache");
30
- return err({ kind: "not-installed", installed: order.cache });
32
+ }
33
+ const found = locate(order.vendor, "vendor", isFile) ??
34
+ locate(order.cache, "cache", isFile);
35
+ return found
36
+ ? ok(found)
37
+ : err({ kind: "not-installed", installed: order.cache });
31
38
  }
32
39
  /** Which rule found it, as a person reads it. */
33
40
  export const provenanceLabel = (p) => ({ env: "$BANAL", vendor: "vendor/banal", cache: "paperlint toolchain" })[p.kind];
@@ -1 +1 @@
1
- {"version":3,"file":"locate.js","sourceRoot":"","sources":["../../../src/adapters/banal/locate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAsCrC,0FAA0F;AAC1F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAgB,EAAgB,EAAE,CAC/D,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAiB,CAAC;AAE3E,MAAM,UAAU,WAAW,CACzB,CAAgB,EAChB,WAAyB;IAEzB,IAAI,CAAC,CAAC,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9D,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAiB;QAC5D,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,IAAkB,EAAE,IAAwB,EAAE,EAAE,CAC/D,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,EAAkB,CAAC,CAAC;AAErD,MAAM,UAAU,SAAS,CACvB,KAAkB,EAClB,MAAoC;IAEpC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU;QAC3B,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YACvB,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;YAC5B,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACjE,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9D,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,iDAAiD;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAa,EAAU,EAAE,CACvD,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CACvE,CAAC,CAAC,IAAI,CACP,CAAC"}
1
+ {"version":3,"file":"locate.js","sourceRoot":"","sources":["../../../src/adapters/banal/locate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,QAAQ,EAAqB,MAAM,uBAAuB,CAAC;AACpE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAarC,mGAAmG;AACnG,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AAKvC,qFAAqF;AACrF,SAAS,MAAM,CACb,IAAkB,EAClB,IAAwB,EACxB,MAAoC;IAEpC,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC;AAkBD,0FAA0F;AAC1F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAgB,EAAgB,EAAE,CAC/D,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;AAE/D,MAAM,UAAU,WAAW,CACzB,CAAgB,EAChB,WAAyB;IAEzB,IAAI,CAAC,CAAC,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9D,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,QAAQ,CAAC,WAAW,EAAE,QAAQ,EAAE,OAAO,CAAC;QAChD,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;KACzB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,KAAkB,EAClB,MAAoC;IAEpC,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,GAAG;YACR,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC;YACT,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,KAAK,GACT,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACvC,OAAO,KAAK;QACV,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;QACX,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,iDAAiD;AACjD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAa,EAAU,EAAE,CACvD,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CACvE,CAAC,CAAC,IAAI,CACP,CAAC"}
@@ -32,7 +32,7 @@ import type { RunProcess } from "../../ports/process.ts";
32
32
  import type { Workspace } from "../../ports/workspace.ts";
33
33
  import { type Result } from "../../domain/result.ts";
34
34
  import type { BanalFailure } from "./failure.ts";
35
- import { type BanalCandidate, type PinnedBanal } from "./locate.ts";
35
+ import { type BanalCandidate } from "./locate.ts";
36
36
  import { type BanalSource } from "./pin.ts";
37
37
  import type { BanalSettings } from "./settings.ts";
38
38
  import type { PageLayout } from "../../domain/page-layout.ts";
@@ -67,6 +67,14 @@ export type BanalOutcome = {
67
67
  * `vendor/banal`, or `paperlint toolchain`'s — or why there is none.
68
68
  */
69
69
  export declare function measureGeometry(d: BanalDeps, s: BanalSettings, projectRoot: AbsolutePath, pages: readonly PageLayout[]): BanalOutcome;
70
+ declare const PINNED: unique symbol;
71
+ /**
72
+ * `paperlint toolchain`'s banal after its bytes hashed to the pin AND it measured the probe page. Minted by
73
+ * `probe` only, for `ensureBanal` / `checkBanal` (`./index.ts`): a "ready" line cannot be printed without one.
74
+ */
75
+ export type PinnedBanal = BanalCandidate & {
76
+ readonly [PINNED]: true;
77
+ };
70
78
  export interface Installed {
71
79
  readonly banal: PinnedBanal;
72
80
  /** True when this run downloaded it. */
@@ -86,4 +94,5 @@ export interface EnsureOptions {
86
94
  export declare function ensureBanal(d: InstallDeps, s: BanalSettings, o?: EnsureOptions): Result<Installed, BanalFailure>;
87
95
  /** `--check`: is the pinned banal installed and running? The same predicate as `ensureBanal`, no download. */
88
96
  export declare function checkBanal(d: BanalDeps, s: BanalSettings, source?: BanalSource): Result<PinnedBanal, BanalFailure>;
97
+ export {};
89
98
  //# sourceMappingURL=run.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAoB,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQjD,OAAO,EAIL,KAAK,cAAc,EAEnB,KAAK,WAAW,EACjB,MAAM,aAAa,CAAC;AAMrB,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,gCAAgC;AAChC,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,iCAAiC;AACjC,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B;AAED,8DAA8D;AAC9D,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB;IACE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;CACvC,CAAC;AAsBN;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,aAAa,EAChB,WAAW,EAAE,YAAY,EACzB,KAAK,EAAE,SAAS,UAAU,EAAE,GAC3B,YAAY,CAed;AAsDD,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,WAAW,EACd,CAAC,EAAE,aAAa,EAChB,CAAC,GAAE,aAAkB,GACpB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAajC;AAED,8GAA8G;AAC9G,wBAAgB,UAAU,CACxB,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,aAAa,EAChB,MAAM,GAAE,WAAuB,GAC9B,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CAYnC"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAoB,KAAK,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAQjD,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,aAAa,CAAC;AAMrB,OAAO,EAAuB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAEjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D,gCAAgC;AAChC,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,iCAAiC;AACjC,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B;AAED,8DAA8D;AAC9D,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GACpB;IACE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC,GACD;IACE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,YAAY,CAAC;IAC3B,mEAAmE;IACnE,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI,CAAC;CACvC,CAAC;AAyBN;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,aAAa,EAChB,WAAW,EAAE,YAAY,EACzB,KAAK,EAAE,SAAS,UAAU,EAAE,GAC3B,YAAY,CAed;AAgBD,QAAA,MAAM,MAAM,eAAwB,CAAC;AAErC;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG;IAAE,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,CAAA;CAAE,CAAC;AAqCvE,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,wCAAwC;IACxC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,yEAAyE;IACzE,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,2DAA2D;IAC3D,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,CAAC,EAAE,WAAW,EACd,CAAC,EAAE,aAAa,EAChB,CAAC,GAAE,aAAkB,GACpB,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,CAajC;AAED,8GAA8G;AAC9G,wBAAgB,UAAU,CACxB,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,aAAa,EAChB,MAAM,GAAE,WAAuB,GAC9B,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CAYnC"}
@@ -7,7 +7,10 @@ import { BANAL_PIN, pinLabel } from "./pin.js";
7
7
  import { acceptProbe, PROBE_PAGE } from "./probe.js";
8
8
  /** Seconds: banal is ~90 KB. */
9
9
  export const BANAL_DOWNLOAD_SECONDS = 60;
10
- /** Run `banal` on `pages` in a scratch directory that is gone when this returns. */
10
+ /**
11
+ * Run `banal` on `pages` in a scratch directory that is gone when this returns. It needs the path
12
+ * only: `measureGeometry` passes the banal `pickBanal` located, `probe` the one whose bytes it verified.
13
+ */
11
14
  function runBanal(d, s, banal, pages) {
12
15
  return d.workspace.within("paperlint-banal-", (scratch) => parseBanalOutput(d.run.run(banalCommand(banal, stage(scratch, stageBanalInput(pages)), s.processEnv))));
13
16
  }
@@ -40,15 +43,16 @@ function perlRuns(d, s) {
40
43
  });
41
44
  return r.kind === "exited" && r.status === 0;
42
45
  }
46
+ // Not exported: only `probe` below can write the property, so only it can make a PinnedBanal.
47
+ const PINNED = Symbol("PinnedBanal");
43
48
  /**
44
49
  * Does the installed, pin-verified banal RUN — accepted by measuring the probe page, not by a
45
50
  * download's exit code. The one place a `PinnedBanal` is minted; callers verified the bytes first.
46
51
  */
47
52
  function probe(d, s, path) {
48
- const at = { path, provenance: { kind: "cache" } };
49
- const r = andThen(runBanal(d, s, at, [PROBE_PAGE]), acceptProbe);
53
+ const r = andThen(runBanal(d, s, { path }, [PROBE_PAGE]), acceptProbe);
50
54
  return r.ok
51
- ? ok(at)
55
+ ? ok({ path, provenance: { kind: "cache" }, [PINNED]: true })
52
56
  : err({ kind: "does-not-run", path, why: r.error });
53
57
  }
54
58
  /** Download `source` into `dest`, keeping the bytes only when they hash to the pin. */
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/adapters/banal/run.ts"],"names":[],"mappings":"AAgCA,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAe,MAAM,wBAAwB,CAAC;AAEvE,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,KAAK,EACL,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EACL,cAAc,EACd,WAAW,EACX,SAAS,GAIV,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,UAAU,EACV,gBAAgB,GAEjB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAoB,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAIrD,gCAAgC;AAChC,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AA+BzC,oFAAoF;AACpF,SAAS,QAAQ,CACf,CAAY,EACZ,CAAgB,EAChB,KAAmB,EACnB,KAA4B;IAE5B,OAAO,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAkB,EAAE,CAAC,OAAO,EAAE,EAAE,CACxD,gBAAgB,CACd,CAAC,CAAC,GAAG,CAAC,GAAG,CACP,YAAY,CACV,KAAK,EACL,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,EACtC,CAAC,CAAC,UAAU,CACb,CACF,CACF,CACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,CAAY,EACZ,CAAgB,EAChB,WAAyB,EACzB,KAA4B;IAE5B,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAC3D,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAClB,CAAC;IACF,IAAI,CAAC,OAAO,CAAC,EAAE;QACb,OAAO;YACL,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,EAAE;YACtD,KAAK,EAAE,IAAI;SACZ,CAAC;IACJ,MAAM,EAAE,GAAmB,OAAO,CAAC,KAAK,CAAC;IACzC,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,CAAC,CAAC,EAAE;QACT,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE;QACxD,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;AAClD,CAAC;AAED,8FAA8F;AAE9F,wFAAwF;AACxF,SAAS,QAAQ,CAAC,CAAY,EAAE,CAAgB;IAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;QAClB,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;QACtB,GAAG,EAAE,CAAC,CAAC,UAAU;QACjB,SAAS,EAAE,YAAY;KACxB,CAAC,CAAC;IACH,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,SAAS,KAAK,CACZ,CAAY,EACZ,CAAgB,EAChB,IAAkB;IAElB,MAAM,EAAE,GAAmB,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC;IACnE,MAAM,CAAC,GAAG,OAAO,CACf,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAkB,EAAE,CAAC,UAAU,CAAC,CAAC,EAChD,WAAW,CACZ,CAAC;IACF,OAAO,CAAC,CAAC,EAAE;QACT,CAAC,CAAC,EAAE,CAAC,EAAiB,CAAC;QACvB,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,uFAAuF;AACvF,SAAS,OAAO,CACd,CAAc,EACd,MAAmB,EACnB,IAAkB;IAElB,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,sBAAsB,GAAG,IAAI,CAAC,CAAC;IACxE,IAAI,CAAC,GAAG,CAAC,EAAE;QACT,OAAO,GAAG,CAAC;YACT,IAAI,EAAE,iBAAiB;YACvB,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM;SACzB,CAAC,CAAC;IACL,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,MAAM,CAAC,EAAE;QACZ,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACxC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;AAClB,CAAC;AAeD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,CAAc,EACd,CAAgB,EAChB,IAAmB,EAAE;IAErB,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IAC1D,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,SAAS,CAAC;IACrC,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,OAAO,GACX,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;IACpE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,CAAC,CAAC,UAAU,EAAE,CAAC,iBAAiB,QAAQ,EAAE,GAAG,CAAC,CAAC;QAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;IAC5B,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAC9B,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAClE,CAAC;AAED,8GAA8G;AAC9G,MAAM,UAAU,UAAU,CACxB,CAAY,EACZ,CAAgB,EAChB,SAAsB,SAAS;IAE/B,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;QACzB,OAAO,GAAG,CAAC;YACT,IAAI,EAAE,eAAe;YACrB,OAAO,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE;SACpD,CAAC,CAAC;IACL,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;QAC9B,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/adapters/banal/run.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { type Environment, type HostDirs } from "../../domain/host.ts";
2
- import type { AbsolutePath } from "../../domain/paths.ts";
2
+ import { type AbsolutePath } from "../../domain/paths.ts";
3
3
  /** An explicit banal to use instead of paperlint's (a path to the script). */
4
4
  export declare const BANAL_ENV = "BANAL";
5
5
  /** Where `paperlint toolchain` stores banal. Default: `$XDG_CACHE_HOME/paperlint/banal`, else `~/.cache/paperlint/banal`. */
@@ -1 +1 @@
1
- {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/settings.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,8EAA8E;AAC9E,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC,6HAA6H;AAC7H,eAAO,MAAM,aAAa,wBAAwB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IACvC,oGAAoG;IACpG,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,+FAA+F;IAC/F,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACvD;AAoBD,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,QAAQ,GACb,aAAa,CAQf"}
1
+ {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/adapters/banal/settings.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,WAAW,EAChB,KAAK,QAAQ,EACd,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAExE,8EAA8E;AAC9E,eAAO,MAAM,SAAS,UAAU,CAAC;AACjC,6HAA6H;AAC7H,eAAO,MAAM,aAAa,wBAAwB,CAAC;AAEnD,MAAM,WAAW,aAAa;IAC5B,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IACvC,oGAAoG;IACpG,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,+FAA+F;IAC/F,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACvD;AAoBD,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,WAAW,EAChB,IAAI,EAAE,QAAQ,GACb,aAAa,CAQf"}
@@ -5,12 +5,13 @@
5
5
  */
6
6
  import { join, resolve } from "node:path";
7
7
  import { childEnv, } from "../../domain/host.js";
8
+ import { absolutePath } from "../../domain/paths.js";
8
9
  /** An explicit banal to use instead of paperlint's (a path to the script). */
9
10
  export const BANAL_ENV = "BANAL";
10
11
  /** Where `paperlint toolchain` stores banal. Default: `$XDG_CACHE_HOME/paperlint/banal`, else `~/.cache/paperlint/banal`. */
11
12
  export const BANAL_DIR_ENV = "PAPERLINT_BANAL_DIR";
12
13
  /** `resolve` with an absolute base never consults the process's cwd. */
13
- const absolute = (cwd, p) => resolve(cwd, p);
14
+ const absolute = (cwd, p) => absolutePath(resolve(cwd, p));
14
15
  /** An unset variable and an empty one mean the same: not set. */
15
16
  const set = (v) => (v ? v : null);
16
17
  function cacheDirOf(env, d) {
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/adapters/banal/settings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,QAAQ,GAGT,MAAM,sBAAsB,CAAC;AAG9B,8EAA8E;AAC9E,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC;AACjC,6HAA6H;AAC7H,MAAM,CAAC,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAanD,wEAAwE;AACxE,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,CAAS,EAAgB,EAAE,CACxD,OAAO,CAAC,GAAG,EAAE,CAAC,CAAiB,CAAC;AAElC,iEAAiE;AACjE,MAAM,GAAG,GAAG,CAAC,CAAqB,EAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAErE,SAAS,UAAU,CAAC,GAAgB,EAAE,CAAW;IAC/C,OAAO,CACL,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACvB,IAAI,CACF,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EACpD,WAAW,EACX,OAAO,CACR,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAgB,EAChB,IAAc;IAEd,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACrC,OAAO;QACL,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;QACjE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;QACpC,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC;KAC1B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/adapters/banal/settings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EACL,QAAQ,GAGT,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,YAAY,EAAqB,MAAM,uBAAuB,CAAC;AAExE,8EAA8E;AAC9E,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAAC;AACjC,6HAA6H;AAC7H,MAAM,CAAC,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAanD,wEAAwE;AACxE,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,CAAS,EAAgB,EAAE,CACxD,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAEhC,iEAAiE;AACjE,MAAM,GAAG,GAAG,CAAC,CAAqB,EAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAErE,SAAS,UAAU,CAAC,GAAgB,EAAE,CAAW;IAC/C,OAAO,CACL,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACvB,IAAI,CACF,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,EACpD,WAAW,EACX,OAAO,CACR,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,GAAgB,EAChB,IAAc;IAEd,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;IACrC,OAAO;QACL,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC;QACjE,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC;QACpC,UAAU,EAAE,QAAQ,CAAC,GAAG,CAAC;KAC1B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,22 @@
1
+ /** The paper's `\documentclass`, a preset's template, and setting a class in a source. */
2
+ import { type ClassLine, type DocumentClass } from "../../domain/tex-document.ts";
3
+ import { type ParsedTex } from "./parse.ts";
4
+ /**
5
+ * The first `\documentclass` at the top of the tree: missing; empty (`\documentclass{}`); or the
6
+ * class with each of its options as written (`foo={a,b}` stays one option, braces kept), whitespace
7
+ * collapsed. Its place spans the macro and its arguments.
8
+ */
9
+ export declare function documentClassOf(t: ParsedTex): ClassLine;
10
+ /**
11
+ * A preset's `template` → the class it names: a whole `\documentclass[…]{…}` line, or a bare class
12
+ * name (`article`), which names no option. Anything else is null.
13
+ */
14
+ export declare function parseTemplate(text: string): DocumentClass | null;
15
+ /**
16
+ * The source with its `\documentclass` line changed to satisfy `want` (see `venueClass`): another
17
+ * class is replaced by the template's line; the same class gains the options it lacks in place. A
18
+ * source whose class already satisfies `want`, or that has no class line the parser could place, is
19
+ * returned as it is.
20
+ */
21
+ export declare function replaceDocumentClass(t: ParsedTex, want: DocumentClass): string;
22
+ //# sourceMappingURL=document-class.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-class.d.ts","sourceRoot":"","sources":["../../../src/adapters/latex/document-class.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,aAAa,EACnB,MAAM,8BAA8B,CAAC;AAUtC,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAoDxD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,SAAS,GAAG,SAAS,CAGvD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAShE;AA0BD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,CAAC,EAAE,SAAS,EACZ,IAAI,EAAE,aAAa,GAClB,MAAM,CAoBR"}
@@ -0,0 +1,102 @@
1
+ /** The paper's `\documentclass`, a preset's template, and setting a class in a source. */
2
+ import { documentClassLine, venueClass, } from "../../domain/tex-document.js";
3
+ import { collapse, macroPlace, mandatory, optional, textOf, } from "./nodes.js";
4
+ import { parseLatex } from "./parse.js";
5
+ const isDocumentClass = (n) => n.type === "macro" && n.content === "documentclass";
6
+ const isComma = (n) => n.type === "string" && n.content === ",";
7
+ /** Nodes split wherever `at` holds, the separators dropped: a comma inside braces is its group's. */
8
+ function splitWhere(nodes, at) {
9
+ const cuts = nodes.flatMap((n, i) => (at(n) ? [i] : []));
10
+ return [-1, ...cuts].map((from, k) => nodes.slice(from + 1, cuts[k] ?? nodes.length));
11
+ }
12
+ /** The source text a run of nodes spans; its markup-free text if unplaced. */
13
+ function sourceOf(src, nodes) {
14
+ const start = nodes[0]?.position?.start.offset;
15
+ const end = nodes.at(-1)?.position?.end.offset;
16
+ return start === undefined || end === undefined
17
+ ? textOf(nodes)
18
+ : src.slice(start, end);
19
+ }
20
+ /**
21
+ * One option as TeX reads it, whitespace collapsed. A line comment is not part of it, and it joins
22
+ * its two sides with no space: `foo=bar% note⏎baz` is `foo=barbaz`.
23
+ */
24
+ const optionText = (src, part) => collapse(splitWhere(part, (n) => n.type === "comment")
25
+ .map((run) => sourceOf(src, run))
26
+ .join(""));
27
+ const classNode = (t) => t.root.content.find(isDocumentClass);
28
+ /** A `\documentclass` node as a class line: empty, or the class with its options as read. */
29
+ function classLine(src, node) {
30
+ const place = macroPlace(node);
31
+ const cls = collapse(textOf(mandatory(node)[0]?.content));
32
+ if (cls === "")
33
+ return { kind: "empty", place };
34
+ const options = splitWhere(optional(node)?.content ?? [], isComma)
35
+ .map((part) => optionText(src, part))
36
+ .filter(Boolean);
37
+ return { kind: "class", cls, options, place };
38
+ }
39
+ /**
40
+ * The first `\documentclass` at the top of the tree: missing; empty (`\documentclass{}`); or the
41
+ * class with each of its options as written (`foo={a,b}` stays one option, braces kept), whitespace
42
+ * collapsed. Its place spans the macro and its arguments.
43
+ */
44
+ export function documentClassOf(t) {
45
+ const node = classNode(t);
46
+ return node === undefined ? { kind: "missing" } : classLine(t.src, node);
47
+ }
48
+ /**
49
+ * A preset's `template` → the class it names: a whole `\documentclass[…]{…}` line, or a bare class
50
+ * name (`article`), which names no option. Anything else is null.
51
+ */
52
+ export function parseTemplate(text) {
53
+ const t = parseLatex(text);
54
+ const [only, ...rest] = t.root.content.filter((n) => n.type !== "whitespace" && n.type !== "comment");
55
+ if (only === undefined || rest.length > 0)
56
+ return null;
57
+ const line = documentClassOf(t);
58
+ if (line.kind === "class")
59
+ return { cls: line.cls, options: line.options };
60
+ return only.type === "string" ? { cls: only.content, options: [] } : null;
61
+ }
62
+ /** `src` with `text` in place of `[from, to)`. */
63
+ const splice = (src, from, to, text) => src.slice(0, from) + text + src.slice(to);
64
+ /**
65
+ * `options` written into the class line's own source: before the `]` of its `[…]` — right after the
66
+ * last node inside, or right after the `[` when there is none — or as a new `[…]` after the name.
67
+ * The bytes between `[` and `]` stay as the author wrote them, comments and braces included.
68
+ */
69
+ function addOptions(src, node, line, options) {
70
+ const list = options.join(",");
71
+ const nameEnd = line.start + 1 + node.content.length; // `\` and the macro's name
72
+ const opt = optional(node);
73
+ if (opt === undefined)
74
+ return splice(src, nameEnd, nameEnd, `[${list}]`);
75
+ const close = opt.content.at(-1)?.position?.end.offset ?? src.indexOf("[", nameEnd) + 1;
76
+ return splice(src, close, close, line.empty ? list : `,${list}`);
77
+ }
78
+ /**
79
+ * The source with its `\documentclass` line changed to satisfy `want` (see `venueClass`): another
80
+ * class is replaced by the template's line; the same class gains the options it lacks in place. A
81
+ * source whose class already satisfies `want`, or that has no class line the parser could place, is
82
+ * returned as it is.
83
+ */
84
+ export function replaceDocumentClass(t, want) {
85
+ const node = classNode(t);
86
+ if (node === undefined)
87
+ return t.src;
88
+ const line = classLine(t.src, node);
89
+ if (line.kind !== "class" || line.place.kind === "unplaced")
90
+ return t.src;
91
+ const { start, end } = line.place.span;
92
+ const change = venueClass(line, want);
93
+ switch (change.kind) {
94
+ case "keep":
95
+ return t.src;
96
+ case "replace":
97
+ return splice(t.src, start, end, documentClassLine(change.by));
98
+ case "add":
99
+ return addOptions(t.src, node, { start, empty: line.options.length === 0 }, change.options);
100
+ }
101
+ }
102
+ //# sourceMappingURL=document-class.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-class.js","sourceRoot":"","sources":["../../../src/adapters/latex/document-class.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * What a reader of the PDF never sees, as a walk over the tree prunes it: comments, math and code,
3
+ * the bibliography's body, and the arguments that are keys, labels, files or URLs. The rendered
4
+ * text and the outline both prune with it.
5
+ *
6
+ * A macro definition's body is NOT pruned here. It is text once the macro is used, and nothing here
7
+ * expands macros, so the rendered text reads the body where it is written — a definition naming
8
+ * another venue is a leftover whether it is used or not. The outline prunes it on top
9
+ * (`isDefinition`): a heading in a definition body is not a section where it is written.
10
+ */
11
+ import { type Visited } from "./nodes.ts";
12
+ /** Whether the walk prunes `v` (given the node that holds it): see the module comment. */
13
+ export declare const isUnrendered: (v: Visited, parent: Visited | undefined) => boolean;
14
+ /** A macro that defines another macro or an environment (`\newcommand`, `\def`, …). */
15
+ export declare const isDefinition: (v: Visited) => boolean;
16
+ //# sourceMappingURL=hidden.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hidden.d.ts","sourceRoot":"","sources":["../../../src/adapters/latex/hidden.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAKL,KAAK,OAAO,EACb,MAAM,YAAY,CAAC;AA4CpB,0FAA0F;AAC1F,eAAO,MAAM,YAAY,GACvB,GAAG,OAAO,EACV,QAAQ,OAAO,GAAG,SAAS,KAC1B,OACsE,CAAC;AAE1E,uFAAuF;AACvF,eAAO,MAAM,YAAY,GAAI,GAAG,OAAO,KAAG,OAC2B,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * What a reader of the PDF never sees, as a walk over the tree prunes it: comments, math and code,
3
+ * the bibliography's body, and the arguments that are keys, labels, files or URLs. The rendered
4
+ * text and the outline both prune with it.
5
+ *
6
+ * A macro definition's body is NOT pruned here. It is text once the macro is used, and nothing here
7
+ * expands macros, so the rendered text reads the body where it is written — a definition naming
8
+ * another venue is a leftover whether it is used or not. The outline prunes it on top
9
+ * (`isDefinition`): a heading in a definition body is not a section where it is written.
10
+ */
11
+ import { isArgument, isNode, } from "./nodes.js";
12
+ import { DEFINITION_MACROS, KEY_ARGUMENT, KEY_SIGNATURES } from "./parse.js";
13
+ /** Environments whose body is not text a reader sees as prose: code, the bibliography, comments. */
14
+ const HIDDEN_ENVS = new Set([
15
+ "thebibliography",
16
+ "verbatim",
17
+ "Verbatim",
18
+ "lstlisting",
19
+ "minted",
20
+ "comment",
21
+ ]);
22
+ /** Node types a reader does not see as prose: comments, code, math. */
23
+ const HIDDEN_TYPES = new Set([
24
+ "comment",
25
+ "verbatim",
26
+ "verb",
27
+ "inlinemath",
28
+ "displaymath",
29
+ "mathenv",
30
+ ]);
31
+ const KEY_MACROS = new Set(Object.keys(KEY_SIGNATURES));
32
+ /** A key macro that prints none of its arguments (`\label`, `\url`, …). */
33
+ const isHiddenMacro = (name) => KEY_MACROS.has(name) && !KEY_ARGUMENT.has(name);
34
+ const isHiddenNode = (n) => HIDDEN_TYPES.has(n.type) ||
35
+ (n.type === "environment" && HIDDEN_ENVS.has(n.env)) ||
36
+ (n.type === "macro" && isHiddenMacro(n.content));
37
+ /**
38
+ * The one argument of a partly printed macro (`KEY_ARGUMENT`) that is a key or a URL. What holds an
39
+ * argument is a macro or an environment; the first three tests only narrow the type.
40
+ */
41
+ const isKeyArgument = (a, parent) => parent !== undefined &&
42
+ isNode(parent) &&
43
+ parent.type === "macro" &&
44
+ parent.args?.indexOf(a) === KEY_ARGUMENT.get(parent.content);
45
+ /** Whether the walk prunes `v` (given the node that holds it): see the module comment. */
46
+ export const isUnrendered = (v, parent) => isArgument(v) ? isKeyArgument(v, parent) : isNode(v) && isHiddenNode(v);
47
+ /** A macro that defines another macro or an environment (`\newcommand`, `\def`, …). */
48
+ export const isDefinition = (v) => isNode(v) && v.type === "macro" && DEFINITION_MACROS.has(v.content);
49
+ //# sourceMappingURL=hidden.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hidden.js","sourceRoot":"","sources":["../../../src/adapters/latex/hidden.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EACL,UAAU,EACV,MAAM,GAIP,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE7E,oGAAoG;AACpG,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC;IAC/C,iBAAiB;IACjB,UAAU;IACV,UAAU;IACV,YAAY;IACZ,QAAQ;IACR,SAAS;CACV,CAAC,CAAC;AAEH,uEAAuE;AACvE,MAAM,YAAY,GAA8B,IAAI,GAAG,CAAe;IACpE,SAAS;IACT,UAAU;IACV,MAAM;IACN,YAAY;IACZ,aAAa;IACb,SAAS;CACV,CAAC,CAAC;AAEH,MAAM,UAAU,GAAwB,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;AAE7E,2EAA2E;AAC3E,MAAM,aAAa,GAAG,CAAC,IAAY,EAAW,EAAE,CAC9C,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAElD,MAAM,YAAY,GAAG,CAAC,CAAO,EAAW,EAAE,CACxC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IACxB,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;AAEnD;;;GAGG;AACH,MAAM,aAAa,GAAG,CAAC,CAAW,EAAE,MAA2B,EAAW,EAAE,CAC1E,MAAM,KAAK,SAAS;IACpB,MAAM,CAAC,MAAM,CAAC;IACd,MAAM,CAAC,IAAI,KAAK,OAAO;IACvB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAE/D,0FAA0F;AAC1F,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,CAAU,EACV,MAA2B,EAClB,EAAE,CACX,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;AAE1E,uFAAuF;AACvF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAU,EAAW,EAAE,CAClD,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Reads a paper.tex and answers three questions — checks nothing itself: `documentClassOf` (which
3
+ * class, with which options, and where), `outlineOf` (the sections in order, where the back matter
4
+ * starts, where the document ends) and `renderedRuns` (the text a reader sees, each character with
5
+ * its source offset). Used by `tex/template`, `tex/required-section`, `tex/venue-leftover` and
6
+ * `paperlint new`, through the `LatexReader` port (`src/ports/latex.ts`); `src/cli.ts` wires it.
7
+ *
8
+ * ── WHY THE PARSE TREE AND NOT THE `tex/latex` PROJECTION ────────────────────────
9
+ * The ESLint language's projection (`eslint-rules/latex-language.ts`) blanks the preamble,
10
+ * `\documentclass`, `\author` and every other macro in its OPAQUE list, because prose rules must
11
+ * not see markup. These questions are about exactly that markup: the class line, a `\section*`
12
+ * title, an `\institution{…}` in the author block. So the source is parsed here with unified-latex,
13
+ * the parser the language already uses.
14
+ *
15
+ * ── STATES, NOT NULL ─────────────────────────────────────────────────────────────
16
+ * A class line is missing, empty or a class; a node the parser gave no position is `unplaced`, not
17
+ * offset 0; a run of text is a non-empty list of contiguous segments, and a range outside it has
18
+ * no span (`spanIn` in `src/domain/tex-document.ts`). A tree travels only with its own source
19
+ * (`ParsedTex`, minted by `parseLatex` alone).
20
+ */
21
+ import type { LatexReader } from "../../ports/latex.ts";
22
+ export { documentClassOf, parseTemplate, replaceDocumentClass, } from "./document-class.ts";
23
+ export { collapse, macroPlace, mandatory, optional, placeOf, textOf, } from "./nodes.ts";
24
+ export { outlineOf } from "./outline.ts";
25
+ export { parseLatex, type ParsedTex } from "./parse.ts";
26
+ export { renderedRuns } from "./rendered.ts";
27
+ /** The `LatexReader` port over unified-latex: each call parses its source once. */
28
+ export declare const latexReader: LatexReader;
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/latex/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAUxD,OAAO,EACL,eAAe,EACf,aAAa,EACb,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,QAAQ,EACR,UAAU,EACV,SAAS,EACT,QAAQ,EACR,OAAO,EACP,MAAM,GACP,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,mFAAmF;AACnF,eAAO,MAAM,WAAW,EAAE,WAMzB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { documentClassOf, parseTemplate, replaceDocumentClass, } from "./document-class.js";
2
+ import { outlineOf } from "./outline.js";
3
+ import { parseLatex } from "./parse.js";
4
+ import { renderedRuns } from "./rendered.js";
5
+ export { documentClassOf, parseTemplate, replaceDocumentClass, } from "./document-class.js";
6
+ export { collapse, macroPlace, mandatory, optional, placeOf, textOf, } from "./nodes.js";
7
+ export { outlineOf } from "./outline.js";
8
+ export { parseLatex } from "./parse.js";
9
+ export { renderedRuns } from "./rendered.js";
10
+ /** The `LatexReader` port over unified-latex: each call parses its source once. */
11
+ export const latexReader = {
12
+ documentClass: (src) => documentClassOf(parseLatex(src)),
13
+ outline: (src) => outlineOf(parseLatex(src)),
14
+ renderedRuns: (src) => renderedRuns(parseLatex(src)),
15
+ template: parseTemplate,
16
+ withDocumentClass: (src, want) => replaceDocumentClass(parseLatex(src), want),
17
+ };
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/latex/index.ts"],"names":[],"mappings":"AAqBA,OAAO,EACL,eAAe,EACf,aAAa,EACb,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,EACL,eAAe,EACf,aAAa,EACb,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,QAAQ,EACR,UAAU,EACV,SAAS,EACT,QAAQ,EACR,OAAO,EACP,MAAM,GACP,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAkB,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,mFAAmF;AACnF,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC,aAAa,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACxD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC5C,YAAY,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IACpD,QAAQ,EAAE,aAAa;IACvB,iBAAiB,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;CAC9E,CAAC"}
@@ -0,0 +1,54 @@
1
+ /** What the three readers share about unified-latex nodes: places, text, and the walk. */
2
+ import type * as Ast from "@unified-latex/unified-latex-types";
3
+ import type { Place } from "../../domain/tex-document.ts";
4
+ export { collapse } from "../../domain/tex-document.ts";
5
+ /** unified-latex's node types, read-only: nothing here writes to a tree. */
6
+ export type Node = Readonly<Ast.Node>;
7
+ export type Macro = Readonly<Ast.Macro>;
8
+ export type Argument = Readonly<Ast.Argument>;
9
+ /** Anything the parser may have given a position: offsets of its first and past its last character. */
10
+ interface Positioned {
11
+ readonly position?: {
12
+ readonly start: {
13
+ readonly offset: number;
14
+ };
15
+ readonly end: {
16
+ readonly offset: number;
17
+ };
18
+ };
19
+ }
20
+ /** Where a node stands, or that it has no position. */
21
+ export declare const placeOf: (n: Positioned) => Place;
22
+ /** The first mandatory (`{…}`) and optional (`[…]`) arguments' contents, and the last mandatory one's. */
23
+ export declare const mandatory: (m: Macro) => readonly Argument[];
24
+ export declare const optional: (m: Macro) => Argument | undefined;
25
+ /** What a string node reads as: itself, except a tie (`~`), which is a space the reader sees. */
26
+ export declare const stringText: (content: string) => string;
27
+ /**
28
+ * The text of a node list with markup dropped: strings, spaces, what groups hold, and the argument a
29
+ * formatting macro typesets — its last mandatory one (`\textbf{Usage}`, `\textcolor{red}{Usage}`,
30
+ * `\href{url}{Usage}` → `Usage`) unless `SHOWN_ARGUMENT` says otherwise. A key macro's arguments
31
+ * (`\label{…}`, `\cite{…}`) are not text.
32
+ */
33
+ export declare const textOf: (nodes: readonly Node[] | undefined) => string;
34
+ /**
35
+ * A macro's place with its arguments: from its name to past the closing mark of the last argument
36
+ * that holds text. unified-latex positions the name and the arguments' contents, never the
37
+ * arguments themselves, so an empty trailing argument is not covered.
38
+ */
39
+ export declare function macroPlace(m: Macro): Place;
40
+ /** What visit reaches: a node, an argument, or a node list (a content array, an argument list). */
41
+ export type Visited = Readonly<Ast.Ast> | readonly (Node | Argument)[];
42
+ /**
43
+ * Everything visit reaches under `tree`, in document order, node lists included; `skip` prunes what
44
+ * it is given (a node or an argument, with the node that holds it) and everything under it. visit
45
+ * reports through a callback and returns nothing, so the one collection point of this adapter is here.
46
+ */
47
+ export declare function visited(tree: Ast.Ast, skip: (v: Visited, parent: Visited | undefined) => boolean): readonly Visited[];
48
+ /** A node list visit reached. `Array.isArray` alone does not narrow a readonly array. */
49
+ export declare const isList: (v: Visited) => v is readonly (Node | Argument)[];
50
+ /** A macro's argument, as visit reports it. */
51
+ export declare const isArgument: (v: Visited) => v is Argument;
52
+ /** A node, as opposed to a node list or an argument (which visit also reports). */
53
+ export declare const isNode: (v: Visited) => v is Node;
54
+ //# sourceMappingURL=nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../../src/adapters/latex/nodes.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,OAAO,KAAK,KAAK,GAAG,MAAM,oCAAoC,CAAC;AAE/D,OAAO,KAAK,EAAE,KAAK,EAAQ,MAAM,8BAA8B,CAAC;AAGhE,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAExD,4EAA4E;AAC5E,MAAM,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACtC,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACxC,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAE9C,uGAAuG;AACvG,UAAU,UAAU;IAClB,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,QAAQ,CAAC,KAAK,EAAE;YAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5C,QAAQ,CAAC,GAAG,EAAE;YAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3C,CAAC;CACH;AAED,uDAAuD;AACvD,eAAO,MAAM,OAAO,GAAI,GAAG,UAAU,KAAG,KAMjC,CAAC;AAER,0GAA0G;AAC1G,eAAO,MAAM,SAAS,GAAI,GAAG,KAAK,KAAG,SAAS,QAAQ,EACJ,CAAC;AACnD,eAAO,MAAM,QAAQ,GAAI,GAAG,KAAK,KAAG,QAAQ,GAAG,SACC,CAAC;AAEjD,iGAAiG;AACjG,eAAO,MAAM,UAAU,GAAI,SAAS,MAAM,KAAG,MACZ,CAAC;AA+BlC;;;;;GAKG;AACH,eAAO,MAAM,MAAM,GAAI,OAAO,SAAS,IAAI,EAAE,GAAG,SAAS,KAAG,MAU/C,CAAC;AAEd;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAS1C;AAED,mGAAmG;AACnG,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,IAAI,GAAG,QAAQ,CAAC,EAAE,CAAC;AAEvE;;;;GAIG;AACH,wBAAgB,OAAO,CAErB,IAAI,EAAE,GAAG,CAAC,GAAG,EACb,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,SAAS,KAAK,OAAO,GACzD,SAAS,OAAO,EAAE,CAapB;AAED,yFAAyF;AACzF,eAAO,MAAM,MAAM,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,SAAS,CAAC,IAAI,GAAG,QAAQ,CAAC,EACjD,CAAC;AAEnB,+CAA+C;AAC/C,eAAO,MAAM,UAAU,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,QACR,CAAC;AAEtC,mFAAmF;AACnF,eAAO,MAAM,MAAM,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,IACiB,CAAC"}