docrev 0.8.1 → 0.9.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 (307) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/.gitattributes +1 -0
  3. package/PLAN-tables-and-postprocess.md +850 -0
  4. package/README.md +33 -0
  5. package/bin/rev.js +12 -131
  6. package/bin/rev.ts +145 -0
  7. package/dist/bin/rev.d.ts +9 -0
  8. package/dist/bin/rev.d.ts.map +1 -0
  9. package/dist/bin/rev.js +118 -0
  10. package/dist/bin/rev.js.map +1 -0
  11. package/dist/lib/annotations.d.ts +91 -0
  12. package/dist/lib/annotations.d.ts.map +1 -0
  13. package/dist/lib/annotations.js +554 -0
  14. package/dist/lib/annotations.js.map +1 -0
  15. package/dist/lib/build.d.ts +171 -0
  16. package/dist/lib/build.d.ts.map +1 -0
  17. package/dist/lib/build.js +755 -0
  18. package/dist/lib/build.js.map +1 -0
  19. package/dist/lib/citations.d.ts +34 -0
  20. package/dist/lib/citations.d.ts.map +1 -0
  21. package/dist/lib/citations.js +140 -0
  22. package/dist/lib/citations.js.map +1 -0
  23. package/dist/lib/commands/build.d.ts +13 -0
  24. package/dist/lib/commands/build.d.ts.map +1 -0
  25. package/dist/lib/commands/build.js +678 -0
  26. package/dist/lib/commands/build.js.map +1 -0
  27. package/dist/lib/commands/citations.d.ts +11 -0
  28. package/dist/lib/commands/citations.d.ts.map +1 -0
  29. package/dist/lib/commands/citations.js +428 -0
  30. package/dist/lib/commands/citations.js.map +1 -0
  31. package/dist/lib/commands/comments.d.ts +11 -0
  32. package/dist/lib/commands/comments.d.ts.map +1 -0
  33. package/dist/lib/commands/comments.js +883 -0
  34. package/dist/lib/commands/comments.js.map +1 -0
  35. package/dist/lib/commands/context.d.ts +35 -0
  36. package/dist/lib/commands/context.d.ts.map +1 -0
  37. package/dist/lib/commands/context.js +59 -0
  38. package/dist/lib/commands/context.js.map +1 -0
  39. package/dist/lib/commands/core.d.ts +11 -0
  40. package/dist/lib/commands/core.d.ts.map +1 -0
  41. package/dist/lib/commands/core.js +246 -0
  42. package/dist/lib/commands/core.js.map +1 -0
  43. package/dist/lib/commands/doi.d.ts +11 -0
  44. package/dist/lib/commands/doi.d.ts.map +1 -0
  45. package/dist/lib/commands/doi.js +373 -0
  46. package/dist/lib/commands/doi.js.map +1 -0
  47. package/dist/lib/commands/history.d.ts +11 -0
  48. package/dist/lib/commands/history.d.ts.map +1 -0
  49. package/dist/lib/commands/history.js +245 -0
  50. package/dist/lib/commands/history.js.map +1 -0
  51. package/dist/lib/commands/index.d.ts +28 -0
  52. package/dist/lib/commands/index.d.ts.map +1 -0
  53. package/dist/lib/commands/index.js +35 -0
  54. package/dist/lib/commands/index.js.map +1 -0
  55. package/dist/lib/commands/init.d.ts +11 -0
  56. package/dist/lib/commands/init.d.ts.map +1 -0
  57. package/dist/lib/commands/init.js +209 -0
  58. package/dist/lib/commands/init.js.map +1 -0
  59. package/dist/lib/commands/response.d.ts +11 -0
  60. package/dist/lib/commands/response.d.ts.map +1 -0
  61. package/dist/lib/commands/response.js +317 -0
  62. package/dist/lib/commands/response.js.map +1 -0
  63. package/dist/lib/commands/sections.d.ts +11 -0
  64. package/dist/lib/commands/sections.d.ts.map +1 -0
  65. package/dist/lib/commands/sections.js +1071 -0
  66. package/dist/lib/commands/sections.js.map +1 -0
  67. package/dist/lib/commands/utilities.d.ts +19 -0
  68. package/dist/lib/commands/utilities.d.ts.map +1 -0
  69. package/dist/lib/commands/utilities.js +2009 -0
  70. package/dist/lib/commands/utilities.js.map +1 -0
  71. package/dist/lib/comment-realign.d.ts +50 -0
  72. package/dist/lib/comment-realign.d.ts.map +1 -0
  73. package/dist/lib/comment-realign.js +372 -0
  74. package/dist/lib/comment-realign.js.map +1 -0
  75. package/dist/lib/config.d.ts +41 -0
  76. package/dist/lib/config.d.ts.map +1 -0
  77. package/dist/lib/config.js +76 -0
  78. package/dist/lib/config.js.map +1 -0
  79. package/dist/lib/crossref.d.ts +108 -0
  80. package/dist/lib/crossref.d.ts.map +1 -0
  81. package/dist/lib/crossref.js +597 -0
  82. package/dist/lib/crossref.js.map +1 -0
  83. package/dist/lib/dependencies.d.ts +30 -0
  84. package/dist/lib/dependencies.d.ts.map +1 -0
  85. package/dist/lib/dependencies.js +95 -0
  86. package/dist/lib/dependencies.js.map +1 -0
  87. package/dist/lib/doi-cache.d.ts +29 -0
  88. package/dist/lib/doi-cache.d.ts.map +1 -0
  89. package/dist/lib/doi-cache.js +104 -0
  90. package/dist/lib/doi-cache.js.map +1 -0
  91. package/dist/lib/doi.d.ts +65 -0
  92. package/dist/lib/doi.d.ts.map +1 -0
  93. package/dist/lib/doi.js +710 -0
  94. package/dist/lib/doi.js.map +1 -0
  95. package/dist/lib/equations.d.ts +61 -0
  96. package/dist/lib/equations.d.ts.map +1 -0
  97. package/dist/lib/equations.js +445 -0
  98. package/dist/lib/equations.js.map +1 -0
  99. package/dist/lib/errors.d.ts +60 -0
  100. package/dist/lib/errors.d.ts.map +1 -0
  101. package/dist/lib/errors.js +303 -0
  102. package/dist/lib/errors.js.map +1 -0
  103. package/dist/lib/format.d.ts +104 -0
  104. package/dist/lib/format.d.ts.map +1 -0
  105. package/dist/lib/format.js +416 -0
  106. package/dist/lib/format.js.map +1 -0
  107. package/dist/lib/git.d.ts +88 -0
  108. package/dist/lib/git.d.ts.map +1 -0
  109. package/dist/lib/git.js +304 -0
  110. package/dist/lib/git.js.map +1 -0
  111. package/dist/lib/grammar.d.ts +62 -0
  112. package/dist/lib/grammar.d.ts.map +1 -0
  113. package/dist/lib/grammar.js +244 -0
  114. package/dist/lib/grammar.js.map +1 -0
  115. package/dist/lib/image-registry.d.ts +68 -0
  116. package/dist/lib/image-registry.d.ts.map +1 -0
  117. package/dist/lib/image-registry.js +112 -0
  118. package/dist/lib/image-registry.js.map +1 -0
  119. package/dist/lib/import.d.ts +184 -0
  120. package/dist/lib/import.d.ts.map +1 -0
  121. package/dist/lib/import.js +1581 -0
  122. package/dist/lib/import.js.map +1 -0
  123. package/dist/lib/journals.d.ts +55 -0
  124. package/dist/lib/journals.d.ts.map +1 -0
  125. package/dist/lib/journals.js +417 -0
  126. package/dist/lib/journals.js.map +1 -0
  127. package/dist/lib/merge.d.ts +138 -0
  128. package/dist/lib/merge.d.ts.map +1 -0
  129. package/dist/lib/merge.js +603 -0
  130. package/dist/lib/merge.js.map +1 -0
  131. package/dist/lib/orcid.d.ts +36 -0
  132. package/dist/lib/orcid.d.ts.map +1 -0
  133. package/dist/lib/orcid.js +117 -0
  134. package/dist/lib/orcid.js.map +1 -0
  135. package/dist/lib/pdf-comments.d.ts +95 -0
  136. package/dist/lib/pdf-comments.d.ts.map +1 -0
  137. package/dist/lib/pdf-comments.js +192 -0
  138. package/dist/lib/pdf-comments.js.map +1 -0
  139. package/dist/lib/pdf-import.d.ts +118 -0
  140. package/dist/lib/pdf-import.d.ts.map +1 -0
  141. package/dist/lib/pdf-import.js +397 -0
  142. package/dist/lib/pdf-import.js.map +1 -0
  143. package/dist/lib/plugins.d.ts +76 -0
  144. package/dist/lib/plugins.d.ts.map +1 -0
  145. package/dist/lib/plugins.js +235 -0
  146. package/dist/lib/plugins.js.map +1 -0
  147. package/dist/lib/postprocess.d.ts +42 -0
  148. package/dist/lib/postprocess.d.ts.map +1 -0
  149. package/dist/lib/postprocess.js +138 -0
  150. package/dist/lib/postprocess.js.map +1 -0
  151. package/dist/lib/pptx-template.d.ts +59 -0
  152. package/dist/lib/pptx-template.d.ts.map +1 -0
  153. package/dist/lib/pptx-template.js +613 -0
  154. package/dist/lib/pptx-template.js.map +1 -0
  155. package/dist/lib/pptx-themes.d.ts +80 -0
  156. package/dist/lib/pptx-themes.d.ts.map +1 -0
  157. package/dist/lib/pptx-themes.js +818 -0
  158. package/dist/lib/pptx-themes.js.map +1 -0
  159. package/dist/lib/protect-restore.d.ts +137 -0
  160. package/dist/lib/protect-restore.d.ts.map +1 -0
  161. package/dist/lib/protect-restore.js +394 -0
  162. package/dist/lib/protect-restore.js.map +1 -0
  163. package/dist/lib/rate-limiter.d.ts +27 -0
  164. package/dist/lib/rate-limiter.d.ts.map +1 -0
  165. package/dist/lib/rate-limiter.js +79 -0
  166. package/dist/lib/rate-limiter.js.map +1 -0
  167. package/dist/lib/response.d.ts +41 -0
  168. package/dist/lib/response.d.ts.map +1 -0
  169. package/dist/lib/response.js +150 -0
  170. package/dist/lib/response.js.map +1 -0
  171. package/dist/lib/review.d.ts +35 -0
  172. package/dist/lib/review.d.ts.map +1 -0
  173. package/dist/lib/review.js +263 -0
  174. package/dist/lib/review.js.map +1 -0
  175. package/dist/lib/schema.d.ts +66 -0
  176. package/dist/lib/schema.d.ts.map +1 -0
  177. package/dist/lib/schema.js +339 -0
  178. package/dist/lib/schema.js.map +1 -0
  179. package/dist/lib/scientific-words.d.ts +6 -0
  180. package/dist/lib/scientific-words.d.ts.map +1 -0
  181. package/dist/lib/scientific-words.js +66 -0
  182. package/dist/lib/scientific-words.js.map +1 -0
  183. package/dist/lib/sections.d.ts +40 -0
  184. package/dist/lib/sections.d.ts.map +1 -0
  185. package/dist/lib/sections.js +288 -0
  186. package/dist/lib/sections.js.map +1 -0
  187. package/dist/lib/slides.d.ts +86 -0
  188. package/dist/lib/slides.d.ts.map +1 -0
  189. package/dist/lib/slides.js +676 -0
  190. package/dist/lib/slides.js.map +1 -0
  191. package/dist/lib/spelling.d.ts +76 -0
  192. package/dist/lib/spelling.d.ts.map +1 -0
  193. package/dist/lib/spelling.js +272 -0
  194. package/dist/lib/spelling.js.map +1 -0
  195. package/dist/lib/templates.d.ts +30 -0
  196. package/dist/lib/templates.d.ts.map +1 -0
  197. package/dist/lib/templates.js +504 -0
  198. package/dist/lib/templates.js.map +1 -0
  199. package/dist/lib/themes.d.ts +85 -0
  200. package/dist/lib/themes.d.ts.map +1 -0
  201. package/dist/lib/themes.js +652 -0
  202. package/dist/lib/themes.js.map +1 -0
  203. package/dist/lib/trackchanges.d.ts +51 -0
  204. package/dist/lib/trackchanges.d.ts.map +1 -0
  205. package/dist/lib/trackchanges.js +202 -0
  206. package/dist/lib/trackchanges.js.map +1 -0
  207. package/dist/lib/tui.d.ts +76 -0
  208. package/dist/lib/tui.d.ts.map +1 -0
  209. package/dist/lib/tui.js +377 -0
  210. package/dist/lib/tui.js.map +1 -0
  211. package/dist/lib/types.d.ts +447 -0
  212. package/dist/lib/types.d.ts.map +1 -0
  213. package/dist/lib/types.js +6 -0
  214. package/dist/lib/types.js.map +1 -0
  215. package/dist/lib/undo.d.ts +57 -0
  216. package/dist/lib/undo.d.ts.map +1 -0
  217. package/dist/lib/undo.js +185 -0
  218. package/dist/lib/undo.js.map +1 -0
  219. package/dist/lib/utils.d.ts +16 -0
  220. package/dist/lib/utils.d.ts.map +1 -0
  221. package/dist/lib/utils.js +40 -0
  222. package/dist/lib/utils.js.map +1 -0
  223. package/dist/lib/variables.d.ts +42 -0
  224. package/dist/lib/variables.d.ts.map +1 -0
  225. package/dist/lib/variables.js +141 -0
  226. package/dist/lib/variables.js.map +1 -0
  227. package/dist/lib/word.d.ts +80 -0
  228. package/dist/lib/word.d.ts.map +1 -0
  229. package/dist/lib/word.js +360 -0
  230. package/dist/lib/word.js.map +1 -0
  231. package/dist/lib/wordcomments.d.ts +51 -0
  232. package/dist/lib/wordcomments.d.ts.map +1 -0
  233. package/dist/lib/wordcomments.js +587 -0
  234. package/dist/lib/wordcomments.js.map +1 -0
  235. package/eslint.config.js +27 -0
  236. package/lib/annotations.ts +622 -0
  237. package/lib/apply-buildup-colors.py +88 -0
  238. package/lib/build.ts +1013 -0
  239. package/lib/{citations.js → citations.ts} +38 -27
  240. package/lib/commands/{build.js → build.ts} +80 -27
  241. package/lib/commands/{citations.js → citations.ts} +36 -18
  242. package/lib/commands/{comments.js → comments.ts} +187 -54
  243. package/lib/commands/{context.js → context.ts} +18 -8
  244. package/lib/commands/{core.js → core.ts} +34 -20
  245. package/lib/commands/{doi.js → doi.ts} +32 -16
  246. package/lib/commands/{history.js → history.ts} +25 -12
  247. package/lib/commands/{index.js → index.ts} +9 -5
  248. package/lib/commands/{init.js → init.ts} +20 -8
  249. package/lib/commands/{response.js → response.ts} +47 -20
  250. package/lib/commands/{sections.js → sections.ts} +273 -68
  251. package/lib/commands/{utilities.js → utilities.ts} +338 -158
  252. package/lib/{comment-realign.js → comment-realign.ts} +117 -45
  253. package/lib/config.ts +84 -0
  254. package/lib/{crossref.js → crossref.ts} +213 -138
  255. package/lib/dependencies.ts +106 -0
  256. package/lib/doi-cache.ts +115 -0
  257. package/lib/{doi.js → doi.ts} +115 -281
  258. package/lib/{equations.js → equations.ts} +60 -64
  259. package/lib/{errors.js → errors.ts} +56 -48
  260. package/lib/{format.js → format.ts} +137 -63
  261. package/lib/{git.js → git.ts} +66 -63
  262. package/lib/{grammar.js → grammar.ts} +45 -32
  263. package/lib/image-registry.ts +180 -0
  264. package/lib/import.ts +2060 -0
  265. package/lib/journals.ts +505 -0
  266. package/lib/{merge.js → merge.ts} +185 -135
  267. package/lib/{orcid.js → orcid.ts} +17 -22
  268. package/lib/{pdf-comments.js → pdf-comments.ts} +76 -18
  269. package/lib/{pdf-import.js → pdf-import.ts} +148 -70
  270. package/lib/{plugins.js → plugins.ts} +82 -39
  271. package/lib/postprocess.ts +188 -0
  272. package/lib/pptx-color-filter.lua +37 -0
  273. package/lib/pptx-template.ts +625 -0
  274. package/lib/pptx-themes/academic.pptx +0 -0
  275. package/lib/pptx-themes/corporate.pptx +0 -0
  276. package/lib/pptx-themes/dark.pptx +0 -0
  277. package/lib/pptx-themes/default.pptx +0 -0
  278. package/lib/pptx-themes/minimal.pptx +0 -0
  279. package/lib/pptx-themes/plant.pptx +0 -0
  280. package/lib/pptx-themes.ts +896 -0
  281. package/lib/protect-restore.ts +516 -0
  282. package/lib/rate-limiter.ts +94 -0
  283. package/lib/{response.js → response.ts} +36 -21
  284. package/lib/{review.js → review.ts} +53 -43
  285. package/lib/{schema.js → schema.ts} +70 -25
  286. package/lib/{sections.js → sections.ts} +71 -76
  287. package/lib/slides.ts +793 -0
  288. package/lib/{spelling.js → spelling.ts} +43 -59
  289. package/lib/{templates.js → templates.ts} +20 -17
  290. package/lib/themes.ts +742 -0
  291. package/lib/{trackchanges.js → trackchanges.ts} +52 -23
  292. package/lib/types.ts +509 -0
  293. package/lib/{undo.js → undo.ts} +75 -52
  294. package/lib/utils.ts +41 -0
  295. package/lib/{variables.js → variables.ts} +60 -54
  296. package/lib/word.ts +428 -0
  297. package/lib/{wordcomments.js → wordcomments.ts} +94 -40
  298. package/package.json +15 -5
  299. package/skill/REFERENCE.md +67 -0
  300. package/tsconfig.json +26 -0
  301. package/lib/annotations.js +0 -414
  302. package/lib/build.js +0 -639
  303. package/lib/config.js +0 -79
  304. package/lib/import.js +0 -1145
  305. package/lib/journals.js +0 -629
  306. package/lib/word.js +0 -225
  307. /package/lib/{scientific-words.js → scientific-words.ts} +0 -0
@@ -0,0 +1,117 @@
1
+ /**
2
+ * ORCID integration for author metadata
3
+ *
4
+ * Fetches author information from ORCID public API
5
+ */
6
+ /**
7
+ * Validate ORCID format (0000-0000-0000-0000)
8
+ */
9
+ export function isValidOrcid(orcid) {
10
+ return /^(\d{4}-){3}\d{3}[\dX]$/i.test(orcid);
11
+ }
12
+ /**
13
+ * Clean ORCID input (removes URLs, whitespace)
14
+ */
15
+ export function cleanOrcid(input) {
16
+ if (!input)
17
+ return '';
18
+ // Remove URL prefix if present
19
+ let clean = input.trim()
20
+ .replace(/^https?:\/\/(www\.)?orcid\.org\//i, '')
21
+ .replace(/^orcid\.org\//i, '')
22
+ .trim();
23
+ return clean;
24
+ }
25
+ /**
26
+ * Fetch author info from ORCID public API
27
+ */
28
+ export async function fetchOrcidProfile(orcid) {
29
+ const cleanId = cleanOrcid(orcid);
30
+ if (!isValidOrcid(cleanId)) {
31
+ throw new Error(`Invalid ORCID format: ${orcid}`);
32
+ }
33
+ const url = `https://pub.orcid.org/v3.0/${cleanId}/person`;
34
+ const response = await fetch(url, {
35
+ headers: {
36
+ 'Accept': 'application/json',
37
+ },
38
+ });
39
+ if (!response.ok) {
40
+ if (response.status === 404) {
41
+ throw new Error(`ORCID not found: ${cleanId}`);
42
+ }
43
+ throw new Error(`ORCID API error: ${response.status}`);
44
+ }
45
+ const data = await response.json();
46
+ // Extract name
47
+ const nameData = data.name;
48
+ let name = '';
49
+ if (nameData) {
50
+ const given = nameData['given-names']?.value || '';
51
+ const family = nameData['family-name']?.value || '';
52
+ name = `${given} ${family}`.trim();
53
+ }
54
+ // Extract primary affiliation
55
+ let affiliation = '';
56
+ const affiliations = data.employments?.['affiliation-group'] || [];
57
+ if (affiliations.length > 0) {
58
+ const primary = affiliations[0]?.summaries?.[0]?.['employment-summary'];
59
+ affiliation = primary?.organization?.name || '';
60
+ }
61
+ // Extract email (if public)
62
+ let email = '';
63
+ const emails = data.emails?.email || [];
64
+ const primaryEmail = emails.find((e) => e.primary) || emails[0];
65
+ if (primaryEmail?.email) {
66
+ email = primaryEmail.email;
67
+ }
68
+ return {
69
+ orcid: cleanId,
70
+ name,
71
+ affiliation,
72
+ email,
73
+ };
74
+ }
75
+ /**
76
+ * Fetch work count from ORCID
77
+ */
78
+ export async function fetchOrcidWorkCount(orcid) {
79
+ const cleanId = cleanOrcid(orcid);
80
+ if (!isValidOrcid(cleanId)) {
81
+ throw new Error(`Invalid ORCID format: ${orcid}`);
82
+ }
83
+ const url = `https://pub.orcid.org/v3.0/${cleanId}/works`;
84
+ const response = await fetch(url, {
85
+ headers: {
86
+ 'Accept': 'application/json',
87
+ },
88
+ });
89
+ if (!response.ok) {
90
+ return 0;
91
+ }
92
+ const data = await response.json();
93
+ return data.group?.length || 0;
94
+ }
95
+ /**
96
+ * Format author for YAML
97
+ */
98
+ export function formatAuthorYaml(profile) {
99
+ const lines = [];
100
+ lines.push(` - name: ${profile.name}`);
101
+ if (profile.affiliation) {
102
+ lines.push(` affiliation: ${profile.affiliation}`);
103
+ }
104
+ if (profile.email) {
105
+ lines.push(` email: ${profile.email}`);
106
+ }
107
+ lines.push(` orcid: ${profile.orcid}`);
108
+ return lines.join('\n');
109
+ }
110
+ /**
111
+ * Generate ORCID badge markdown
112
+ */
113
+ export function getOrcidBadge(orcid) {
114
+ const cleanId = cleanOrcid(orcid);
115
+ return `[![ORCID](https://img.shields.io/badge/ORCID-${cleanId}-a6ce39)](https://orcid.org/${cleanId})`;
116
+ }
117
+ //# sourceMappingURL=orcid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orcid.js","sourceRoot":"","sources":["../../lib/orcid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * PDF comment rendering for dual export
3
+ *
4
+ * Converts CriticMarkup comments to LaTeX margin notes for PDF output
5
+ */
6
+ /**
7
+ * LaTeX preamble for margin comments
8
+ * Uses todonotes package with custom styling
9
+ */
10
+ export declare const MARGIN_NOTES_PREAMBLE = "\n% Margin notes for comments\n\\usepackage[colorinlistoftodos,textsize=scriptsize]{todonotes}\n\\usepackage{xcolor}\n\n% Define comment colors by author\n\\definecolor{commentblue}{RGB}{59, 130, 246}\n\\definecolor{commentgreen}{RGB}{34, 197, 94}\n\\definecolor{commentorange}{RGB}{249, 115, 22}\n\\definecolor{commentpurple}{RGB}{168, 85, 247}\n\\definecolor{commentgray}{RGB}{107, 114, 128}\n\n% Custom margin note command\n\\newcommand{\\margincomment}[2][]{%\n \\todo[linecolor=commentblue,backgroundcolor=commentblue!10,bordercolor=commentblue,size=\\scriptsize,#1]{#2}%\n}\n\n% Author-specific commands\n\\newcommand{\\reviewercomment}[2]{%\n \\todo[linecolor=commentgreen,backgroundcolor=commentgreen!10,bordercolor=commentgreen,size=\\scriptsize]{\\textbf{#1:} #2}%\n}\n\n% Increase margin for notes (if needed)\n% \\setlength{\\marginparwidth}{2.5cm}\n";
11
+ /**
12
+ * Simpler preamble using marginpar (no extra packages needed)
13
+ */
14
+ export declare const SIMPLE_MARGIN_PREAMBLE = "\n% Simple margin notes for comments\n\\usepackage{xcolor}\n\\definecolor{commentcolor}{RGB}{59, 130, 246}\n\n\\newcommand{\\margincomment}[1]{%\n \\marginpar{\\raggedright\\scriptsize\\textcolor{commentcolor}{#1}}%\n}\n";
15
+ /**
16
+ * Options for converting comments to margin notes
17
+ */
18
+ export interface CommentConversionOptions {
19
+ useTodonotes?: boolean;
20
+ stripResolved?: boolean;
21
+ }
22
+ /**
23
+ * Result of comment conversion
24
+ */
25
+ export interface CommentConversionResult {
26
+ markdown: string;
27
+ commentCount: number;
28
+ preamble: string;
29
+ }
30
+ /**
31
+ * Convert CriticMarkup comments to LaTeX margin notes
32
+ * {>>Author: comment text<<} -> \margincomment{Author: comment text}
33
+ *
34
+ * @param markdown - Markdown with CriticMarkup comments
35
+ * @param options - { useTodonotes: boolean, stripResolved: boolean }
36
+ * @returns Converted markdown with comment count and preamble
37
+ */
38
+ export declare function convertCommentsToMarginNotes(markdown: string, options?: CommentConversionOptions): CommentConversionResult;
39
+ /**
40
+ * Result of track changes conversion
41
+ */
42
+ export interface TrackChangesResult {
43
+ markdown: string;
44
+ preamble: string;
45
+ }
46
+ /**
47
+ * Convert track changes to visible LaTeX formatting
48
+ * {++inserted++} -> \textcolor{green}{inserted}
49
+ * {--deleted--} -> \textcolor{red}{\sout{deleted}}
50
+ * {~~old~>new~~} -> \textcolor{red}{\sout{old}}\textcolor{green}{new}
51
+ *
52
+ * @param markdown - Markdown with track changes
53
+ * @returns Converted markdown and preamble
54
+ */
55
+ export declare function convertTrackChangesToLatex(markdown: string): TrackChangesResult;
56
+ /**
57
+ * Options for combined preamble
58
+ */
59
+ export interface PreambleOptions {
60
+ comments?: boolean;
61
+ trackChanges?: boolean;
62
+ useTodonotes?: boolean;
63
+ }
64
+ /**
65
+ * Get combined preamble for comments and track changes
66
+ * @param options - { comments: boolean, trackChanges: boolean, useTodonotes: boolean }
67
+ * @returns Combined LaTeX preamble
68
+ */
69
+ export declare function getCombinedPreamble(options?: PreambleOptions): string;
70
+ /**
71
+ * Options for preparing markdown for annotated PDF
72
+ */
73
+ export interface AnnotatedPdfOptions {
74
+ showTrackChanges?: boolean;
75
+ useTodonotes?: boolean;
76
+ stripResolved?: boolean;
77
+ }
78
+ /**
79
+ * Result of preparing markdown for annotated PDF
80
+ */
81
+ export interface AnnotatedPdfResult {
82
+ markdown: string;
83
+ preamble: string;
84
+ commentCount: number;
85
+ }
86
+ /**
87
+ * Prepare markdown for PDF with visible comments
88
+ * Converts comments to margin notes and optionally shows track changes
89
+ *
90
+ * @param markdown - Markdown content
91
+ * @param options - { showTrackChanges: boolean, useTodonotes: boolean }
92
+ * @returns Converted markdown with preamble and comment count
93
+ */
94
+ export declare function prepareMarkdownForAnnotatedPdf(markdown: string, options?: AnnotatedPdfOptions): AnnotatedPdfResult;
95
+ //# sourceMappingURL=pdf-comments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-comments.d.ts","sourceRoot":"","sources":["../../lib/pdf-comments.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,eAAO,MAAM,qBAAqB,q2BAwBjC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,kOAQlC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,wBAA6B,GACrC,uBAAuB,CAwCzB;AAgBD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CA2B/E;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,eAAoB,GAAG,MAAM,CAwBzE;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CA0BpB"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * PDF comment rendering for dual export
3
+ *
4
+ * Converts CriticMarkup comments to LaTeX margin notes for PDF output
5
+ */
6
+ /**
7
+ * LaTeX preamble for margin comments
8
+ * Uses todonotes package with custom styling
9
+ */
10
+ export const MARGIN_NOTES_PREAMBLE = `
11
+ % Margin notes for comments
12
+ \\usepackage[colorinlistoftodos,textsize=scriptsize]{todonotes}
13
+ \\usepackage{xcolor}
14
+
15
+ % Define comment colors by author
16
+ \\definecolor{commentblue}{RGB}{59, 130, 246}
17
+ \\definecolor{commentgreen}{RGB}{34, 197, 94}
18
+ \\definecolor{commentorange}{RGB}{249, 115, 22}
19
+ \\definecolor{commentpurple}{RGB}{168, 85, 247}
20
+ \\definecolor{commentgray}{RGB}{107, 114, 128}
21
+
22
+ % Custom margin note command
23
+ \\newcommand{\\margincomment}[2][]{%
24
+ \\todo[linecolor=commentblue,backgroundcolor=commentblue!10,bordercolor=commentblue,size=\\scriptsize,#1]{#2}%
25
+ }
26
+
27
+ % Author-specific commands
28
+ \\newcommand{\\reviewercomment}[2]{%
29
+ \\todo[linecolor=commentgreen,backgroundcolor=commentgreen!10,bordercolor=commentgreen,size=\\scriptsize]{\\textbf{#1:} #2}%
30
+ }
31
+
32
+ % Increase margin for notes (if needed)
33
+ % \\setlength{\\marginparwidth}{2.5cm}
34
+ `;
35
+ /**
36
+ * Simpler preamble using marginpar (no extra packages needed)
37
+ */
38
+ export const SIMPLE_MARGIN_PREAMBLE = `
39
+ % Simple margin notes for comments
40
+ \\usepackage{xcolor}
41
+ \\definecolor{commentcolor}{RGB}{59, 130, 246}
42
+
43
+ \\newcommand{\\margincomment}[1]{%
44
+ \\marginpar{\\raggedright\\scriptsize\\textcolor{commentcolor}{#1}}%
45
+ }
46
+ `;
47
+ /**
48
+ * Convert CriticMarkup comments to LaTeX margin notes
49
+ * {>>Author: comment text<<} -> \margincomment{Author: comment text}
50
+ *
51
+ * @param markdown - Markdown with CriticMarkup comments
52
+ * @param options - { useTodonotes: boolean, stripResolved: boolean }
53
+ * @returns Converted markdown with comment count and preamble
54
+ */
55
+ export function convertCommentsToMarginNotes(markdown, options = {}) {
56
+ const { useTodonotes = true, stripResolved = true } = options;
57
+ let commentCount = 0;
58
+ // Pattern for CriticMarkup comments: {>>author: text<<} or {>>text<<}
59
+ // Also handle resolved comments: {>>✓ author: text<<}
60
+ const commentPattern = /\{>>(✓\s*)?([^<]+)<<\}/g;
61
+ const converted = markdown.replace(commentPattern, (match, resolved, content) => {
62
+ // Skip resolved comments if requested
63
+ if (resolved && stripResolved) {
64
+ return '';
65
+ }
66
+ commentCount++;
67
+ // Escape LaTeX special characters
68
+ const escaped = escapeLatex(content.trim());
69
+ if (useTodonotes) {
70
+ // Check if content has author prefix (Author: text)
71
+ const authorMatch = escaped.match(/^([^:]+):\s*([\s\S]+)$/);
72
+ if (authorMatch) {
73
+ const [, author, text] = authorMatch;
74
+ return `\\reviewercomment{${author}}{${text}}`;
75
+ }
76
+ return `\\margincomment{${escaped}}`;
77
+ }
78
+ else {
79
+ return `\\margincomment{${escaped}}`;
80
+ }
81
+ });
82
+ const preamble = useTodonotes ? MARGIN_NOTES_PREAMBLE : SIMPLE_MARGIN_PREAMBLE;
83
+ return {
84
+ markdown: converted,
85
+ commentCount,
86
+ preamble,
87
+ };
88
+ }
89
+ /**
90
+ * Escape LaTeX special characters
91
+ * @param text - Text to escape
92
+ * @returns Escaped text
93
+ */
94
+ function escapeLatex(text) {
95
+ return text
96
+ .replace(/\\/g, '\\textbackslash{}')
97
+ .replace(/([#$%&_{}])/g, '\\$1')
98
+ .replace(/\^/g, '\\textasciicircum{}')
99
+ .replace(/~/g, '\\textasciitilde{}')
100
+ .replace(/\n/g, ' '); // Replace newlines with spaces
101
+ }
102
+ /**
103
+ * Convert track changes to visible LaTeX formatting
104
+ * {++inserted++} -> \textcolor{green}{inserted}
105
+ * {--deleted--} -> \textcolor{red}{\sout{deleted}}
106
+ * {~~old~>new~~} -> \textcolor{red}{\sout{old}}\textcolor{green}{new}
107
+ *
108
+ * @param markdown - Markdown with track changes
109
+ * @returns Converted markdown and preamble
110
+ */
111
+ export function convertTrackChangesToLatex(markdown) {
112
+ let result = markdown;
113
+ // Insertions: {++text++} -> green text
114
+ result = result.replace(/\{\+\+([^+]+)\+\+\}/g, (match, text) => {
115
+ return `\\textcolor{green}{${escapeLatex(text)}}`;
116
+ });
117
+ // Deletions: {--text--} -> red strikethrough
118
+ result = result.replace(/\{--([^-]+)--\}/g, (match, text) => {
119
+ return `\\textcolor{red}{\\sout{${escapeLatex(text)}}}`;
120
+ });
121
+ // Substitutions: {~~old~>new~~} -> red strikethrough + green new
122
+ result = result.replace(/\{~~([^~]+)~>([^~]+)~~\}/g, (match, oldText, newText) => {
123
+ return `\\textcolor{red}{\\sout{${escapeLatex(oldText)}}}\\textcolor{green}{${escapeLatex(newText)}}`;
124
+ });
125
+ const preamble = `
126
+ % Track changes visualization
127
+ \\usepackage{xcolor}
128
+ \\usepackage[normalem]{ulem}
129
+ \\definecolor{green}{RGB}{34, 197, 94}
130
+ \\definecolor{red}{RGB}{239, 68, 68}
131
+ `;
132
+ return { markdown: result, preamble };
133
+ }
134
+ /**
135
+ * Get combined preamble for comments and track changes
136
+ * @param options - { comments: boolean, trackChanges: boolean, useTodonotes: boolean }
137
+ * @returns Combined LaTeX preamble
138
+ */
139
+ export function getCombinedPreamble(options = {}) {
140
+ const { comments = true, trackChanges = false, useTodonotes = true } = options;
141
+ let preamble = '';
142
+ if (comments) {
143
+ preamble += useTodonotes ? MARGIN_NOTES_PREAMBLE : SIMPLE_MARGIN_PREAMBLE;
144
+ }
145
+ if (trackChanges) {
146
+ preamble += `
147
+ % Track changes visualization
148
+ \\usepackage[normalem]{ulem}
149
+ `;
150
+ if (!comments) {
151
+ preamble += `\\usepackage{xcolor}\n`;
152
+ }
153
+ preamble += `
154
+ \\definecolor{insertgreen}{RGB}{34, 197, 94}
155
+ \\definecolor{deletered}{RGB}{239, 68, 68}
156
+ `;
157
+ }
158
+ return preamble;
159
+ }
160
+ /**
161
+ * Prepare markdown for PDF with visible comments
162
+ * Converts comments to margin notes and optionally shows track changes
163
+ *
164
+ * @param markdown - Markdown content
165
+ * @param options - { showTrackChanges: boolean, useTodonotes: boolean }
166
+ * @returns Converted markdown with preamble and comment count
167
+ */
168
+ export function prepareMarkdownForAnnotatedPdf(markdown, options = {}) {
169
+ const { showTrackChanges = false, useTodonotes = true, stripResolved = true } = options;
170
+ let result = markdown;
171
+ let preamble = '';
172
+ let commentCount = 0;
173
+ // Convert comments to margin notes
174
+ const commentResult = convertCommentsToMarginNotes(result, { useTodonotes, stripResolved });
175
+ result = commentResult.markdown;
176
+ commentCount = commentResult.commentCount;
177
+ preamble += commentResult.preamble;
178
+ // Optionally show track changes
179
+ if (showTrackChanges) {
180
+ const trackResult = convertTrackChangesToLatex(result);
181
+ result = trackResult.markdown;
182
+ // Add ulem package if not already in todonotes preamble
183
+ if (!useTodonotes) {
184
+ preamble += trackResult.preamble;
185
+ }
186
+ else {
187
+ preamble += `\\usepackage[normalem]{ulem}\n`;
188
+ }
189
+ }
190
+ return { markdown: result, preamble, commentCount };
191
+ }
192
+ //# sourceMappingURL=pdf-comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-comments.js","sourceRoot":"","sources":["../../lib/pdf-comments.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;CAwBpC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;;;;;CAQrC,CAAC;AAmBF;;;;;;;GAOG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAAgB,EAChB,UAAoC,EAAE;IAEtC,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE9D,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,sEAAsE;IACtE,sDAAsD;IACtD,MAAM,cAAc,GAAG,yBAAyB,CAAC;IAEjD,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QAC9E,sCAAsC;QACtC,IAAI,QAAQ,IAAI,aAAa,EAAE,CAAC;YAC9B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,YAAY,EAAE,CAAC;QAEf,kCAAkC;QAClC,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAE5C,IAAI,YAAY,EAAE,CAAC;YACjB,oDAAoD;YACpD,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC5D,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,WAAW,CAAC;gBACrC,OAAO,qBAAqB,MAAM,KAAK,IAAI,GAAG,CAAC;YACjD,CAAC;YACD,OAAO,mBAAmB,OAAO,GAAG,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,OAAO,mBAAmB,OAAO,GAAG,CAAC;QACvC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,sBAAsB,CAAC;IAE/E,OAAO;QACL,QAAQ,EAAE,SAAS;QACnB,YAAY;QACZ,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,IAAI;SACR,OAAO,CAAC,KAAK,EAAE,mBAAmB,CAAC;SACnC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC;SAC/B,OAAO,CAAC,KAAK,EAAE,qBAAqB,CAAC;SACrC,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC;SACnC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAE,+BAA+B;AAC1D,CAAC;AAUD;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAAgB;IACzD,IAAI,MAAM,GAAG,QAAQ,CAAC;IAEtB,uCAAuC;IACvC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAC9D,OAAO,sBAAsB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,6CAA6C;IAC7C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAC1D,OAAO,2BAA2B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,iEAAiE;IACjE,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,2BAA2B,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE;QAC/E,OAAO,2BAA2B,WAAW,CAAC,OAAO,CAAC,wBAAwB,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC;IACxG,CAAC,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG;;;;;;CAMlB,CAAC;IAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACxC,CAAC;AAWD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAA2B,EAAE;IAC/D,MAAM,EAAE,QAAQ,GAAG,IAAI,EAAE,YAAY,GAAG,KAAK,EAAE,YAAY,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAE/E,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,IAAI,QAAQ,EAAE,CAAC;QACb,QAAQ,IAAI,YAAY,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,sBAAsB,CAAC;IAC5E,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACjB,QAAQ,IAAI;;;CAGf,CAAC;QACE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,QAAQ,IAAI,wBAAwB,CAAC;QACvC,CAAC;QACD,QAAQ,IAAI;;;CAGf,CAAC;IACA,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAoBD;;;;;;;GAOG;AACH,MAAM,UAAU,8BAA8B,CAC5C,QAAgB,EAChB,UAA+B,EAAE;IAEjC,MAAM,EAAE,gBAAgB,GAAG,KAAK,EAAE,YAAY,GAAG,IAAI,EAAE,aAAa,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAExF,IAAI,MAAM,GAAG,QAAQ,CAAC;IACtB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,mCAAmC;IACnC,MAAM,aAAa,GAAG,4BAA4B,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC;IAC5F,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC;IAChC,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC;IAC1C,QAAQ,IAAI,aAAa,CAAC,QAAQ,CAAC;IAEnC,gCAAgC;IAChC,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,WAAW,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC;QAC9B,wDAAwD;QACxD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,QAAQ,IAAI,WAAW,CAAC,QAAQ,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,QAAQ,IAAI,gCAAgC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACtD,CAAC"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * PDF comment extraction for docrev
3
+ *
4
+ * Extracts annotations (comments, highlights, sticky notes) from PDF files
5
+ * and converts them to CriticMarkup format for insertion into markdown.
6
+ * Also extracts the actual text content under highlights using pdfjs-dist.
7
+ */
8
+ /**
9
+ * Raw PDF annotation extracted from pdf-lib
10
+ */
11
+ export interface PdfAnnotation {
12
+ type: string;
13
+ page: number;
14
+ contents: string;
15
+ author: string;
16
+ date: string;
17
+ rect: number[];
18
+ quadPoints: number[];
19
+ }
20
+ /**
21
+ * PDF comment converted to CriticMarkup format
22
+ */
23
+ export interface PdfComment {
24
+ author: string;
25
+ text: string;
26
+ page: number;
27
+ type: string;
28
+ date?: string;
29
+ }
30
+ /**
31
+ * PDF annotation with extracted highlighted text
32
+ */
33
+ export interface PdfAnnotationWithText extends PdfAnnotation {
34
+ highlightedText: string;
35
+ }
36
+ /**
37
+ * Options for PDF extraction
38
+ */
39
+ export interface ExtractOptions {
40
+ timeout?: number;
41
+ }
42
+ /**
43
+ * Options for markdown insertion
44
+ */
45
+ export interface InsertOptions {
46
+ sectionPerPage?: boolean;
47
+ }
48
+ /**
49
+ * Statistics about PDF comments
50
+ */
51
+ export interface PdfCommentStats {
52
+ total: number;
53
+ byType: Record<string, number>;
54
+ byAuthor: Record<string, number>;
55
+ byPage: Record<number, number>;
56
+ }
57
+ /**
58
+ * Extract raw annotations from a PDF file
59
+ * @param pdfPath - Path to PDF file
60
+ * @param options - { timeout: number (ms) }
61
+ * @returns Array of PDF annotations
62
+ */
63
+ export declare function extractPdfAnnotations(pdfPath: string, options?: ExtractOptions): Promise<PdfAnnotation[]>;
64
+ /**
65
+ * Convert PDF annotations to CriticMarkup comments
66
+ * @param annotations - From extractPdfAnnotations
67
+ * @returns Array of PDF comments
68
+ */
69
+ export declare function annotationsToComments(annotations: PdfAnnotation[]): PdfComment[];
70
+ /**
71
+ * Extract comments from PDF and format for display
72
+ * @param pdfPath - Path to PDF file
73
+ * @returns Array of PDF comments
74
+ */
75
+ export declare function extractPdfComments(pdfPath: string): Promise<PdfComment[]>;
76
+ /**
77
+ * Insert PDF comments into markdown based on page/position heuristics
78
+ * Since PDFs don't have direct text anchors like Word, we use page numbers
79
+ * and append comments to the end of corresponding sections
80
+ *
81
+ * @param markdown - The markdown content
82
+ * @param comments - Comments from extractPdfComments
83
+ * @param options - { sectionPerPage: boolean }
84
+ * @returns Markdown with comments inserted
85
+ */
86
+ export declare function insertPdfCommentsIntoMarkdown(markdown: string, comments: PdfComment[], options?: InsertOptions): string;
87
+ /**
88
+ * Format PDF comments for CLI display
89
+ * @param comments - Array of PDF comments
90
+ * @returns Formatted string
91
+ */
92
+ export declare function formatPdfComments(comments: PdfComment[]): string;
93
+ /**
94
+ * Get statistics about PDF comments
95
+ * @param comments - Array of PDF comments
96
+ * @returns Statistics object
97
+ */
98
+ export declare function getPdfCommentStats(comments: PdfComment[]): PdfCommentStats;
99
+ /**
100
+ * Extract highlighted text from a PDF using QuadPoints
101
+ * @param pdfPath - Path to PDF file
102
+ * @param annotations - Annotations with quadPoints from extractPdfAnnotations
103
+ * @returns Annotations with highlighted text extracted
104
+ */
105
+ export declare function extractHighlightedText(pdfPath: string, annotations: PdfAnnotation[]): Promise<PdfAnnotationWithText[]>;
106
+ /**
107
+ * Extract annotations with highlighted text in one call
108
+ * @param pdfPath - Path to PDF file
109
+ * @returns Annotations with highlighted text
110
+ */
111
+ export declare function extractPdfAnnotationsWithText(pdfPath: string): Promise<PdfAnnotationWithText[]>;
112
+ /**
113
+ * Format annotation with highlighted text for display
114
+ * @param annot - Annotation with highlightedText
115
+ * @returns Formatted string
116
+ */
117
+ export declare function formatAnnotationWithText(annot: PdfAnnotationWithText): string;
118
+ //# sourceMappingURL=pdf-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-import.d.ts","sourceRoot":"","sources":["../../lib/pdf-import.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAkBH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAaD;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,aAAa,EAAE,CAAC,CAyG1B;AA2CD;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,UAAU,EAAE,CAUhF;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAG/E;AAED;;;;;;;;;GASG;AACH,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,UAAU,EAAE,EACtB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CA6BR;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,MAAM,CAqBhE;AAmBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,eAAe,CAe1E;AAwCD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,aAAa,EAAE,GAC3B,OAAO,CAAC,qBAAqB,EAAE,CAAC,CA2DlC;AAED;;;;GAIG;AACH,wBAAsB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAGrG;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,qBAAqB,GAAG,MAAM,CAc7E"}