docrev 0.8.1 → 0.8.5

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 (306) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/PLAN-tables-and-postprocess.md +850 -0
  3. package/README.md +33 -0
  4. package/bin/rev.js +12 -131
  5. package/bin/rev.ts +145 -0
  6. package/dist/bin/rev.d.ts +9 -0
  7. package/dist/bin/rev.d.ts.map +1 -0
  8. package/dist/bin/rev.js +118 -0
  9. package/dist/bin/rev.js.map +1 -0
  10. package/dist/lib/annotations.d.ts +91 -0
  11. package/dist/lib/annotations.d.ts.map +1 -0
  12. package/dist/lib/annotations.js +554 -0
  13. package/dist/lib/annotations.js.map +1 -0
  14. package/dist/lib/build.d.ts +171 -0
  15. package/dist/lib/build.d.ts.map +1 -0
  16. package/dist/lib/build.js +755 -0
  17. package/dist/lib/build.js.map +1 -0
  18. package/dist/lib/citations.d.ts +34 -0
  19. package/dist/lib/citations.d.ts.map +1 -0
  20. package/dist/lib/citations.js +140 -0
  21. package/dist/lib/citations.js.map +1 -0
  22. package/dist/lib/commands/build.d.ts +13 -0
  23. package/dist/lib/commands/build.d.ts.map +1 -0
  24. package/dist/lib/commands/build.js +678 -0
  25. package/dist/lib/commands/build.js.map +1 -0
  26. package/dist/lib/commands/citations.d.ts +11 -0
  27. package/dist/lib/commands/citations.d.ts.map +1 -0
  28. package/dist/lib/commands/citations.js +428 -0
  29. package/dist/lib/commands/citations.js.map +1 -0
  30. package/dist/lib/commands/comments.d.ts +11 -0
  31. package/dist/lib/commands/comments.d.ts.map +1 -0
  32. package/dist/lib/commands/comments.js +883 -0
  33. package/dist/lib/commands/comments.js.map +1 -0
  34. package/dist/lib/commands/context.d.ts +35 -0
  35. package/dist/lib/commands/context.d.ts.map +1 -0
  36. package/dist/lib/commands/context.js +59 -0
  37. package/dist/lib/commands/context.js.map +1 -0
  38. package/dist/lib/commands/core.d.ts +11 -0
  39. package/dist/lib/commands/core.d.ts.map +1 -0
  40. package/dist/lib/commands/core.js +246 -0
  41. package/dist/lib/commands/core.js.map +1 -0
  42. package/dist/lib/commands/doi.d.ts +11 -0
  43. package/dist/lib/commands/doi.d.ts.map +1 -0
  44. package/dist/lib/commands/doi.js +373 -0
  45. package/dist/lib/commands/doi.js.map +1 -0
  46. package/dist/lib/commands/history.d.ts +11 -0
  47. package/dist/lib/commands/history.d.ts.map +1 -0
  48. package/dist/lib/commands/history.js +245 -0
  49. package/dist/lib/commands/history.js.map +1 -0
  50. package/dist/lib/commands/index.d.ts +28 -0
  51. package/dist/lib/commands/index.d.ts.map +1 -0
  52. package/dist/lib/commands/index.js +35 -0
  53. package/dist/lib/commands/index.js.map +1 -0
  54. package/dist/lib/commands/init.d.ts +11 -0
  55. package/dist/lib/commands/init.d.ts.map +1 -0
  56. package/dist/lib/commands/init.js +209 -0
  57. package/dist/lib/commands/init.js.map +1 -0
  58. package/dist/lib/commands/response.d.ts +11 -0
  59. package/dist/lib/commands/response.d.ts.map +1 -0
  60. package/dist/lib/commands/response.js +317 -0
  61. package/dist/lib/commands/response.js.map +1 -0
  62. package/dist/lib/commands/sections.d.ts +11 -0
  63. package/dist/lib/commands/sections.d.ts.map +1 -0
  64. package/dist/lib/commands/sections.js +1071 -0
  65. package/dist/lib/commands/sections.js.map +1 -0
  66. package/dist/lib/commands/utilities.d.ts +19 -0
  67. package/dist/lib/commands/utilities.d.ts.map +1 -0
  68. package/dist/lib/commands/utilities.js +2009 -0
  69. package/dist/lib/commands/utilities.js.map +1 -0
  70. package/dist/lib/comment-realign.d.ts +50 -0
  71. package/dist/lib/comment-realign.d.ts.map +1 -0
  72. package/dist/lib/comment-realign.js +372 -0
  73. package/dist/lib/comment-realign.js.map +1 -0
  74. package/dist/lib/config.d.ts +41 -0
  75. package/dist/lib/config.d.ts.map +1 -0
  76. package/dist/lib/config.js +76 -0
  77. package/dist/lib/config.js.map +1 -0
  78. package/dist/lib/crossref.d.ts +108 -0
  79. package/dist/lib/crossref.d.ts.map +1 -0
  80. package/dist/lib/crossref.js +597 -0
  81. package/dist/lib/crossref.js.map +1 -0
  82. package/dist/lib/dependencies.d.ts +30 -0
  83. package/dist/lib/dependencies.d.ts.map +1 -0
  84. package/dist/lib/dependencies.js +95 -0
  85. package/dist/lib/dependencies.js.map +1 -0
  86. package/dist/lib/doi-cache.d.ts +29 -0
  87. package/dist/lib/doi-cache.d.ts.map +1 -0
  88. package/dist/lib/doi-cache.js +104 -0
  89. package/dist/lib/doi-cache.js.map +1 -0
  90. package/dist/lib/doi.d.ts +65 -0
  91. package/dist/lib/doi.d.ts.map +1 -0
  92. package/dist/lib/doi.js +710 -0
  93. package/dist/lib/doi.js.map +1 -0
  94. package/dist/lib/equations.d.ts +61 -0
  95. package/dist/lib/equations.d.ts.map +1 -0
  96. package/dist/lib/equations.js +445 -0
  97. package/dist/lib/equations.js.map +1 -0
  98. package/dist/lib/errors.d.ts +60 -0
  99. package/dist/lib/errors.d.ts.map +1 -0
  100. package/dist/lib/errors.js +303 -0
  101. package/dist/lib/errors.js.map +1 -0
  102. package/dist/lib/format.d.ts +104 -0
  103. package/dist/lib/format.d.ts.map +1 -0
  104. package/dist/lib/format.js +416 -0
  105. package/dist/lib/format.js.map +1 -0
  106. package/dist/lib/git.d.ts +88 -0
  107. package/dist/lib/git.d.ts.map +1 -0
  108. package/dist/lib/git.js +304 -0
  109. package/dist/lib/git.js.map +1 -0
  110. package/dist/lib/grammar.d.ts +62 -0
  111. package/dist/lib/grammar.d.ts.map +1 -0
  112. package/dist/lib/grammar.js +244 -0
  113. package/dist/lib/grammar.js.map +1 -0
  114. package/dist/lib/image-registry.d.ts +68 -0
  115. package/dist/lib/image-registry.d.ts.map +1 -0
  116. package/dist/lib/image-registry.js +112 -0
  117. package/dist/lib/image-registry.js.map +1 -0
  118. package/dist/lib/import.d.ts +184 -0
  119. package/dist/lib/import.d.ts.map +1 -0
  120. package/dist/lib/import.js +1581 -0
  121. package/dist/lib/import.js.map +1 -0
  122. package/dist/lib/journals.d.ts +55 -0
  123. package/dist/lib/journals.d.ts.map +1 -0
  124. package/dist/lib/journals.js +417 -0
  125. package/dist/lib/journals.js.map +1 -0
  126. package/dist/lib/merge.d.ts +138 -0
  127. package/dist/lib/merge.d.ts.map +1 -0
  128. package/dist/lib/merge.js +603 -0
  129. package/dist/lib/merge.js.map +1 -0
  130. package/dist/lib/orcid.d.ts +36 -0
  131. package/dist/lib/orcid.d.ts.map +1 -0
  132. package/dist/lib/orcid.js +117 -0
  133. package/dist/lib/orcid.js.map +1 -0
  134. package/dist/lib/pdf-comments.d.ts +95 -0
  135. package/dist/lib/pdf-comments.d.ts.map +1 -0
  136. package/dist/lib/pdf-comments.js +192 -0
  137. package/dist/lib/pdf-comments.js.map +1 -0
  138. package/dist/lib/pdf-import.d.ts +118 -0
  139. package/dist/lib/pdf-import.d.ts.map +1 -0
  140. package/dist/lib/pdf-import.js +397 -0
  141. package/dist/lib/pdf-import.js.map +1 -0
  142. package/dist/lib/plugins.d.ts +76 -0
  143. package/dist/lib/plugins.d.ts.map +1 -0
  144. package/dist/lib/plugins.js +235 -0
  145. package/dist/lib/plugins.js.map +1 -0
  146. package/dist/lib/postprocess.d.ts +42 -0
  147. package/dist/lib/postprocess.d.ts.map +1 -0
  148. package/dist/lib/postprocess.js +138 -0
  149. package/dist/lib/postprocess.js.map +1 -0
  150. package/dist/lib/pptx-template.d.ts +59 -0
  151. package/dist/lib/pptx-template.d.ts.map +1 -0
  152. package/dist/lib/pptx-template.js +613 -0
  153. package/dist/lib/pptx-template.js.map +1 -0
  154. package/dist/lib/pptx-themes.d.ts +80 -0
  155. package/dist/lib/pptx-themes.d.ts.map +1 -0
  156. package/dist/lib/pptx-themes.js +818 -0
  157. package/dist/lib/pptx-themes.js.map +1 -0
  158. package/dist/lib/protect-restore.d.ts +137 -0
  159. package/dist/lib/protect-restore.d.ts.map +1 -0
  160. package/dist/lib/protect-restore.js +394 -0
  161. package/dist/lib/protect-restore.js.map +1 -0
  162. package/dist/lib/rate-limiter.d.ts +27 -0
  163. package/dist/lib/rate-limiter.d.ts.map +1 -0
  164. package/dist/lib/rate-limiter.js +79 -0
  165. package/dist/lib/rate-limiter.js.map +1 -0
  166. package/dist/lib/response.d.ts +41 -0
  167. package/dist/lib/response.d.ts.map +1 -0
  168. package/dist/lib/response.js +150 -0
  169. package/dist/lib/response.js.map +1 -0
  170. package/dist/lib/review.d.ts +35 -0
  171. package/dist/lib/review.d.ts.map +1 -0
  172. package/dist/lib/review.js +263 -0
  173. package/dist/lib/review.js.map +1 -0
  174. package/dist/lib/schema.d.ts +66 -0
  175. package/dist/lib/schema.d.ts.map +1 -0
  176. package/dist/lib/schema.js +339 -0
  177. package/dist/lib/schema.js.map +1 -0
  178. package/dist/lib/scientific-words.d.ts +6 -0
  179. package/dist/lib/scientific-words.d.ts.map +1 -0
  180. package/dist/lib/scientific-words.js +66 -0
  181. package/dist/lib/scientific-words.js.map +1 -0
  182. package/dist/lib/sections.d.ts +40 -0
  183. package/dist/lib/sections.d.ts.map +1 -0
  184. package/dist/lib/sections.js +288 -0
  185. package/dist/lib/sections.js.map +1 -0
  186. package/dist/lib/slides.d.ts +86 -0
  187. package/dist/lib/slides.d.ts.map +1 -0
  188. package/dist/lib/slides.js +676 -0
  189. package/dist/lib/slides.js.map +1 -0
  190. package/dist/lib/spelling.d.ts +76 -0
  191. package/dist/lib/spelling.d.ts.map +1 -0
  192. package/dist/lib/spelling.js +272 -0
  193. package/dist/lib/spelling.js.map +1 -0
  194. package/dist/lib/templates.d.ts +30 -0
  195. package/dist/lib/templates.d.ts.map +1 -0
  196. package/dist/lib/templates.js +504 -0
  197. package/dist/lib/templates.js.map +1 -0
  198. package/dist/lib/themes.d.ts +85 -0
  199. package/dist/lib/themes.d.ts.map +1 -0
  200. package/dist/lib/themes.js +652 -0
  201. package/dist/lib/themes.js.map +1 -0
  202. package/dist/lib/trackchanges.d.ts +51 -0
  203. package/dist/lib/trackchanges.d.ts.map +1 -0
  204. package/dist/lib/trackchanges.js +202 -0
  205. package/dist/lib/trackchanges.js.map +1 -0
  206. package/dist/lib/tui.d.ts +76 -0
  207. package/dist/lib/tui.d.ts.map +1 -0
  208. package/dist/lib/tui.js +377 -0
  209. package/dist/lib/tui.js.map +1 -0
  210. package/dist/lib/types.d.ts +447 -0
  211. package/dist/lib/types.d.ts.map +1 -0
  212. package/dist/lib/types.js +6 -0
  213. package/dist/lib/types.js.map +1 -0
  214. package/dist/lib/undo.d.ts +57 -0
  215. package/dist/lib/undo.d.ts.map +1 -0
  216. package/dist/lib/undo.js +185 -0
  217. package/dist/lib/undo.js.map +1 -0
  218. package/dist/lib/utils.d.ts +16 -0
  219. package/dist/lib/utils.d.ts.map +1 -0
  220. package/dist/lib/utils.js +40 -0
  221. package/dist/lib/utils.js.map +1 -0
  222. package/dist/lib/variables.d.ts +42 -0
  223. package/dist/lib/variables.d.ts.map +1 -0
  224. package/dist/lib/variables.js +141 -0
  225. package/dist/lib/variables.js.map +1 -0
  226. package/dist/lib/word.d.ts +80 -0
  227. package/dist/lib/word.d.ts.map +1 -0
  228. package/dist/lib/word.js +360 -0
  229. package/dist/lib/word.js.map +1 -0
  230. package/dist/lib/wordcomments.d.ts +51 -0
  231. package/dist/lib/wordcomments.d.ts.map +1 -0
  232. package/dist/lib/wordcomments.js +587 -0
  233. package/dist/lib/wordcomments.js.map +1 -0
  234. package/eslint.config.js +27 -0
  235. package/lib/annotations.ts +622 -0
  236. package/lib/apply-buildup-colors.py +88 -0
  237. package/lib/build.ts +1013 -0
  238. package/lib/{citations.js → citations.ts} +38 -27
  239. package/lib/commands/{build.js → build.ts} +80 -27
  240. package/lib/commands/{citations.js → citations.ts} +36 -18
  241. package/lib/commands/{comments.js → comments.ts} +187 -54
  242. package/lib/commands/{context.js → context.ts} +18 -8
  243. package/lib/commands/{core.js → core.ts} +34 -20
  244. package/lib/commands/{doi.js → doi.ts} +32 -16
  245. package/lib/commands/{history.js → history.ts} +25 -12
  246. package/lib/commands/{index.js → index.ts} +9 -5
  247. package/lib/commands/{init.js → init.ts} +20 -8
  248. package/lib/commands/{response.js → response.ts} +47 -20
  249. package/lib/commands/{sections.js → sections.ts} +273 -68
  250. package/lib/commands/{utilities.js → utilities.ts} +338 -158
  251. package/lib/{comment-realign.js → comment-realign.ts} +117 -45
  252. package/lib/config.ts +84 -0
  253. package/lib/{crossref.js → crossref.ts} +213 -138
  254. package/lib/dependencies.ts +106 -0
  255. package/lib/doi-cache.ts +115 -0
  256. package/lib/{doi.js → doi.ts} +115 -281
  257. package/lib/{equations.js → equations.ts} +60 -64
  258. package/lib/{errors.js → errors.ts} +56 -48
  259. package/lib/{format.js → format.ts} +137 -63
  260. package/lib/{git.js → git.ts} +66 -63
  261. package/lib/{grammar.js → grammar.ts} +45 -32
  262. package/lib/image-registry.ts +180 -0
  263. package/lib/import.ts +2060 -0
  264. package/lib/journals.ts +505 -0
  265. package/lib/{merge.js → merge.ts} +185 -135
  266. package/lib/{orcid.js → orcid.ts} +17 -22
  267. package/lib/{pdf-comments.js → pdf-comments.ts} +76 -18
  268. package/lib/{pdf-import.js → pdf-import.ts} +148 -70
  269. package/lib/{plugins.js → plugins.ts} +82 -39
  270. package/lib/postprocess.ts +188 -0
  271. package/lib/pptx-color-filter.lua +37 -0
  272. package/lib/pptx-template.ts +625 -0
  273. package/lib/pptx-themes/academic.pptx +0 -0
  274. package/lib/pptx-themes/corporate.pptx +0 -0
  275. package/lib/pptx-themes/dark.pptx +0 -0
  276. package/lib/pptx-themes/default.pptx +0 -0
  277. package/lib/pptx-themes/minimal.pptx +0 -0
  278. package/lib/pptx-themes/plant.pptx +0 -0
  279. package/lib/pptx-themes.ts +896 -0
  280. package/lib/protect-restore.ts +516 -0
  281. package/lib/rate-limiter.ts +94 -0
  282. package/lib/{response.js → response.ts} +36 -21
  283. package/lib/{review.js → review.ts} +53 -43
  284. package/lib/{schema.js → schema.ts} +70 -25
  285. package/lib/{sections.js → sections.ts} +71 -76
  286. package/lib/slides.ts +793 -0
  287. package/lib/{spelling.js → spelling.ts} +43 -59
  288. package/lib/{templates.js → templates.ts} +20 -17
  289. package/lib/themes.ts +742 -0
  290. package/lib/{trackchanges.js → trackchanges.ts} +52 -23
  291. package/lib/types.ts +509 -0
  292. package/lib/{undo.js → undo.ts} +75 -52
  293. package/lib/utils.ts +41 -0
  294. package/lib/{variables.js → variables.ts} +60 -54
  295. package/lib/word.ts +428 -0
  296. package/lib/{wordcomments.js → wordcomments.ts} +94 -40
  297. package/package.json +15 -5
  298. package/skill/REFERENCE.md +67 -0
  299. package/tsconfig.json +26 -0
  300. package/lib/annotations.js +0 -414
  301. package/lib/build.js +0 -639
  302. package/lib/config.js +0 -79
  303. package/lib/import.js +0 -1145
  304. package/lib/journals.js +0 -629
  305. package/lib/word.js +0 -225
  306. /package/lib/{scientific-words.js → scientific-words.ts} +0 -0
@@ -0,0 +1,397 @@
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
+ import * as fs from 'fs';
9
+ import { PDFDocument } from 'pdf-lib';
10
+ /**
11
+ * Annotation types we care about
12
+ */
13
+ const COMMENT_TYPES = [
14
+ 'Text', // Sticky notes
15
+ 'FreeText', // Text boxes
16
+ 'Highlight', // Highlighted text with comment
17
+ 'Underline', // Underlined text with comment
18
+ 'StrikeOut', // Strikethrough (deletion suggestion)
19
+ 'Squiggly', // Squiggly underline
20
+ 'Popup', // Popup comments (attached to other annotations)
21
+ ];
22
+ /**
23
+ * Extract raw annotations from a PDF file
24
+ * @param pdfPath - Path to PDF file
25
+ * @param options - { timeout: number (ms) }
26
+ * @returns Array of PDF annotations
27
+ */
28
+ export async function extractPdfAnnotations(pdfPath, options = {}) {
29
+ const { timeout = 30000 } = options;
30
+ // Validate file exists
31
+ if (!fs.existsSync(pdfPath)) {
32
+ throw new Error(`File not found: ${pdfPath}`);
33
+ }
34
+ let pdfBytes;
35
+ try {
36
+ pdfBytes = fs.readFileSync(pdfPath);
37
+ }
38
+ catch (err) {
39
+ const error = err;
40
+ throw new Error(`Cannot read PDF file: ${error.message}`);
41
+ }
42
+ // Create a promise that rejects after timeout
43
+ const timeoutPromise = new Promise((_, reject) => {
44
+ setTimeout(() => reject(new Error(`PDF extraction timed out after ${timeout / 1000}s`)), timeout);
45
+ });
46
+ let pdfDoc;
47
+ try {
48
+ pdfDoc = await Promise.race([
49
+ PDFDocument.load(pdfBytes, { ignoreEncryption: true }),
50
+ timeoutPromise,
51
+ ]);
52
+ }
53
+ catch (err) {
54
+ const error = err;
55
+ if (error.message.includes('timed out')) {
56
+ throw error;
57
+ }
58
+ throw new Error(`Invalid or corrupted PDF file: ${error.message}`);
59
+ }
60
+ const annotations = [];
61
+ const pages = pdfDoc.getPages();
62
+ for (let pageNum = 0; pageNum < pages.length; pageNum++) {
63
+ const page = pages[pageNum];
64
+ const annots = page.node.Annots();
65
+ if (!annots)
66
+ continue;
67
+ const annotRefs = annots.asArray();
68
+ for (const annotRef of annotRefs) {
69
+ try {
70
+ const annot = annotRef.dict || annotRef;
71
+ if (!annot)
72
+ continue;
73
+ // Get annotation type
74
+ const subtypeName = annot.get(pdfDoc.context.obj('Subtype'));
75
+ const subtype = subtypeName?.toString?.()?.replace('/', '') || '';
76
+ if (!COMMENT_TYPES.includes(subtype))
77
+ continue;
78
+ // Extract contents (the comment text)
79
+ const contentsObj = annot.get(pdfDoc.context.obj('Contents'));
80
+ const contents = contentsObj?.toString?.() || contentsObj?.decodeText?.() || '';
81
+ // Extract author (T field in PDF spec)
82
+ const authorObj = annot.get(pdfDoc.context.obj('T'));
83
+ const author = authorObj?.toString?.() || authorObj?.decodeText?.() || 'Unknown';
84
+ // Extract modification date
85
+ const dateObj = annot.get(pdfDoc.context.obj('M'));
86
+ const dateStr = dateObj?.toString?.() || '';
87
+ const date = parsePdfDate(dateStr);
88
+ // Extract rectangle (position on page)
89
+ const rectObj = annot.get(pdfDoc.context.obj('Rect'));
90
+ const rect = rectObj?.asArray?.()?.map((n) => n?.asNumber?.() || 0) || [0, 0, 0, 0];
91
+ // Extract QuadPoints for highlights (the actual text bounds)
92
+ const quadObj = annot.get(pdfDoc.context.obj('QuadPoints'));
93
+ const quadPoints = quadObj?.asArray?.()?.map((n) => n?.asNumber?.() || 0) || [];
94
+ // Skip empty annotations
95
+ if (!contents.trim() && subtype !== 'StrikeOut')
96
+ continue;
97
+ annotations.push({
98
+ type: subtype,
99
+ page: pageNum + 1,
100
+ contents: cleanPdfString(contents),
101
+ author: cleanPdfString(author),
102
+ date,
103
+ rect,
104
+ quadPoints,
105
+ });
106
+ }
107
+ catch (err) {
108
+ // Skip malformed annotations
109
+ continue;
110
+ }
111
+ }
112
+ }
113
+ // Sort by page, then by vertical position (top to bottom)
114
+ annotations.sort((a, b) => {
115
+ if (a.page !== b.page)
116
+ return a.page - b.page;
117
+ // Higher Y = higher on page in PDF coords
118
+ return (b.rect[1] || 0) - (a.rect[1] || 0);
119
+ });
120
+ return annotations;
121
+ }
122
+ /**
123
+ * Parse PDF date string (D:YYYYMMDDHHmmSS format)
124
+ * @param dateStr - PDF date string
125
+ * @returns ISO date string
126
+ */
127
+ function parsePdfDate(dateStr) {
128
+ if (!dateStr)
129
+ return '';
130
+ // Remove D: prefix and timezone info
131
+ const clean = dateStr.replace(/^D:/, '').replace(/[Z+-].*$/, '');
132
+ if (clean.length >= 8) {
133
+ const year = clean.slice(0, 4);
134
+ const month = clean.slice(4, 6);
135
+ const day = clean.slice(6, 8);
136
+ return `${year}-${month}-${day}`;
137
+ }
138
+ return '';
139
+ }
140
+ /**
141
+ * Clean PDF string (remove parentheses, decode escape sequences)
142
+ * @param str - Raw PDF string
143
+ * @returns Cleaned string
144
+ */
145
+ function cleanPdfString(str) {
146
+ if (!str)
147
+ return '';
148
+ return str
149
+ .replace(/^\(/, '') // Remove leading paren
150
+ .replace(/\)$/, '') // Remove trailing paren
151
+ .replace(/\\n/g, '\n') // Newlines
152
+ .replace(/\\r/g, '') // Carriage returns
153
+ .replace(/\\t/g, ' ') // Tabs
154
+ .replace(/\\\(/g, '(') // Escaped parens
155
+ .replace(/\\\)/g, ')')
156
+ .replace(/\\\\/g, '\\') // Escaped backslash
157
+ .trim();
158
+ }
159
+ /**
160
+ * Convert PDF annotations to CriticMarkup comments
161
+ * @param annotations - From extractPdfAnnotations
162
+ * @returns Array of PDF comments
163
+ */
164
+ export function annotationsToComments(annotations) {
165
+ return annotations
166
+ .filter(a => a.contents.trim())
167
+ .map(a => ({
168
+ author: a.author || 'Reviewer',
169
+ text: a.contents,
170
+ page: a.page,
171
+ type: a.type,
172
+ date: a.date,
173
+ }));
174
+ }
175
+ /**
176
+ * Extract comments from PDF and format for display
177
+ * @param pdfPath - Path to PDF file
178
+ * @returns Array of PDF comments
179
+ */
180
+ export async function extractPdfComments(pdfPath) {
181
+ const annotations = await extractPdfAnnotations(pdfPath);
182
+ return annotationsToComments(annotations);
183
+ }
184
+ /**
185
+ * Insert PDF comments into markdown based on page/position heuristics
186
+ * Since PDFs don't have direct text anchors like Word, we use page numbers
187
+ * and append comments to the end of corresponding sections
188
+ *
189
+ * @param markdown - The markdown content
190
+ * @param comments - Comments from extractPdfComments
191
+ * @param options - { sectionPerPage: boolean }
192
+ * @returns Markdown with comments inserted
193
+ */
194
+ export function insertPdfCommentsIntoMarkdown(markdown, comments, options = {}) {
195
+ if (comments.length === 0)
196
+ return markdown;
197
+ // Group comments by page
198
+ const commentsByPage = new Map();
199
+ for (const c of comments) {
200
+ if (!commentsByPage.has(c.page)) {
201
+ commentsByPage.set(c.page, []);
202
+ }
203
+ commentsByPage.get(c.page).push(c);
204
+ }
205
+ // Strategy: Append all comments at the end with page references
206
+ // This is the safest approach since we can't reliably map PDF positions to markdown
207
+ const lines = markdown.split('\n');
208
+ const commentBlock = [];
209
+ commentBlock.push('');
210
+ commentBlock.push('<!-- PDF Comments -->');
211
+ for (const [page, pageComments] of Array.from(commentsByPage.entries())) {
212
+ for (const c of pageComments) {
213
+ const authorPrefix = c.author ? `${c.author}: ` : '';
214
+ const pageRef = `[p.${page}]`;
215
+ commentBlock.push(`{>>${authorPrefix}${pageRef} ${c.text}<<}`);
216
+ }
217
+ }
218
+ return lines.join('\n') + commentBlock.join('\n');
219
+ }
220
+ /**
221
+ * Format PDF comments for CLI display
222
+ * @param comments - Array of PDF comments
223
+ * @returns Formatted string
224
+ */
225
+ export function formatPdfComments(comments) {
226
+ if (comments.length === 0) {
227
+ return 'No comments found in PDF.';
228
+ }
229
+ const lines = [];
230
+ let currentPage = 0;
231
+ for (const c of comments) {
232
+ if (c.page !== currentPage) {
233
+ if (currentPage > 0)
234
+ lines.push('');
235
+ lines.push(`Page ${c.page}:`);
236
+ currentPage = c.page;
237
+ }
238
+ const typeIcon = getTypeIcon(c.type);
239
+ const author = c.author || 'Unknown';
240
+ lines.push(` ${typeIcon} [${author}] ${c.text}`);
241
+ }
242
+ return lines.join('\n');
243
+ }
244
+ /**
245
+ * Get icon for annotation type
246
+ * @param type - Annotation type
247
+ * @returns Icon string
248
+ */
249
+ function getTypeIcon(type) {
250
+ switch (type) {
251
+ case 'Text': return '📝'; // Sticky note
252
+ case 'FreeText': return '💬'; // Text box
253
+ case 'Highlight': return '🖍️'; // Highlight
254
+ case 'Underline': return '📍'; // Underline
255
+ case 'StrikeOut': return '❌'; // Strikethrough
256
+ case 'Squiggly': return '〰️'; // Squiggly
257
+ default: return '💬';
258
+ }
259
+ }
260
+ /**
261
+ * Get statistics about PDF comments
262
+ * @param comments - Array of PDF comments
263
+ * @returns Statistics object
264
+ */
265
+ export function getPdfCommentStats(comments) {
266
+ const stats = {
267
+ total: comments.length,
268
+ byType: {},
269
+ byAuthor: {},
270
+ byPage: {},
271
+ };
272
+ for (const c of comments) {
273
+ stats.byType[c.type] = (stats.byType[c.type] || 0) + 1;
274
+ stats.byAuthor[c.author] = (stats.byAuthor[c.author] || 0) + 1;
275
+ stats.byPage[c.page] = (stats.byPage[c.page] || 0) + 1;
276
+ }
277
+ return stats;
278
+ }
279
+ /**
280
+ * Extract text content from a PDF page
281
+ * @param page - pdfjs page object
282
+ * @returns Array of text items with positions
283
+ */
284
+ async function getPageTextItems(page) {
285
+ const textContent = await page.getTextContent();
286
+ return textContent.items.map((item) => ({
287
+ str: item.str,
288
+ x: item.transform[4],
289
+ y: item.transform[5],
290
+ width: item.width,
291
+ height: item.height,
292
+ }));
293
+ }
294
+ /**
295
+ * Check if a point is inside a quadrilateral defined by QuadPoints
296
+ * QuadPoints format: [x1,y1, x2,y2, x3,y3, x4,y4] for each quad
297
+ * @param x - X coordinate
298
+ * @param y - Y coordinate
299
+ * @param quad - 8 numbers defining corners
300
+ * @returns True if point is inside quad
301
+ */
302
+ function isPointInQuad(x, y, quad) {
303
+ if (quad.length < 8)
304
+ return false;
305
+ // Get bounding box from quad points
306
+ const xs = [quad[0], quad[2], quad[4], quad[6]];
307
+ const ys = [quad[1], quad[3], quad[5], quad[7]];
308
+ const minX = Math.min(...xs);
309
+ const maxX = Math.max(...xs);
310
+ const minY = Math.min(...ys);
311
+ const maxY = Math.max(...ys);
312
+ return x >= minX && x <= maxX && y >= minY && y <= maxY;
313
+ }
314
+ /**
315
+ * Extract highlighted text from a PDF using QuadPoints
316
+ * @param pdfPath - Path to PDF file
317
+ * @param annotations - Annotations with quadPoints from extractPdfAnnotations
318
+ * @returns Annotations with highlighted text extracted
319
+ */
320
+ export async function extractHighlightedText(pdfPath, annotations) {
321
+ const pdfBytes = fs.readFileSync(pdfPath);
322
+ const data = new Uint8Array(pdfBytes);
323
+ // Load pdfjs-dist dynamically (requires DOMMatrix, not available in Node 18)
324
+ const { getDocument } = await import('pdfjs-dist/legacy/build/pdf.mjs');
325
+ const loadingTask = getDocument({ data, useSystemFonts: true });
326
+ const pdfDoc = await loadingTask.promise;
327
+ const results = [];
328
+ for (const annot of annotations) {
329
+ // Only process text markup annotations (Highlight, Underline, StrikeOut, Squiggly)
330
+ if (!['Highlight', 'Underline', 'StrikeOut', 'Squiggly'].includes(annot.type)) {
331
+ results.push({ ...annot, highlightedText: '' });
332
+ continue;
333
+ }
334
+ if (!annot.quadPoints || annot.quadPoints.length < 8) {
335
+ results.push({ ...annot, highlightedText: '' });
336
+ continue;
337
+ }
338
+ try {
339
+ const page = await pdfDoc.getPage(annot.page);
340
+ const textItems = await getPageTextItems(page);
341
+ // Split quadPoints into individual quads (8 numbers each)
342
+ const quads = [];
343
+ for (let i = 0; i < annot.quadPoints.length; i += 8) {
344
+ quads.push(annot.quadPoints.slice(i, i + 8));
345
+ }
346
+ // Find text items that fall within any of the quads
347
+ const matchedText = [];
348
+ for (const item of textItems) {
349
+ // Check if text item center is in any quad
350
+ const centerX = item.x + (item.width || 0) / 2;
351
+ const centerY = item.y + (item.height || 0) / 2;
352
+ for (const quad of quads) {
353
+ if (isPointInQuad(centerX, centerY, quad) || isPointInQuad(item.x, item.y, quad)) {
354
+ matchedText.push(item.str);
355
+ break;
356
+ }
357
+ }
358
+ }
359
+ results.push({
360
+ ...annot,
361
+ highlightedText: matchedText.join(' ').trim(),
362
+ });
363
+ }
364
+ catch (err) {
365
+ // If text extraction fails, just return empty
366
+ results.push({ ...annot, highlightedText: '' });
367
+ }
368
+ }
369
+ return results;
370
+ }
371
+ /**
372
+ * Extract annotations with highlighted text in one call
373
+ * @param pdfPath - Path to PDF file
374
+ * @returns Annotations with highlighted text
375
+ */
376
+ export async function extractPdfAnnotationsWithText(pdfPath) {
377
+ const annotations = await extractPdfAnnotations(pdfPath);
378
+ return extractHighlightedText(pdfPath, annotations);
379
+ }
380
+ /**
381
+ * Format annotation with highlighted text for display
382
+ * @param annot - Annotation with highlightedText
383
+ * @returns Formatted string
384
+ */
385
+ export function formatAnnotationWithText(annot) {
386
+ const typeIcon = getTypeIcon(annot.type);
387
+ const author = annot.author || 'Unknown';
388
+ const parts = [`${typeIcon} [${author}]`];
389
+ if (annot.highlightedText) {
390
+ parts.push(`"${annot.highlightedText}"`);
391
+ }
392
+ if (annot.contents) {
393
+ parts.push(`→ ${annot.contents}`);
394
+ }
395
+ return parts.join(' ');
396
+ }
397
+ //# sourceMappingURL=pdf-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-import.js","sourceRoot":"","sources":["../../lib/pdf-import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Plugin system for custom journal profiles and export formats
3
+ *
4
+ * Users can add custom profiles in:
5
+ * - Project: .rev/profiles/*.yaml
6
+ * - User: ~/.rev/profiles/*.yaml
7
+ */
8
+ /**
9
+ * Journal profile requirements
10
+ */
11
+ interface ProfileRequirements {
12
+ wordLimit?: Record<string, number | null>;
13
+ references?: Record<string, unknown>;
14
+ figures?: Record<string, unknown>;
15
+ sections?: Record<string, unknown>;
16
+ authors?: Record<string, unknown>;
17
+ keywords?: {
18
+ min?: number;
19
+ max?: number;
20
+ } | null;
21
+ dataAvailability?: boolean;
22
+ [key: string]: unknown;
23
+ }
24
+ /**
25
+ * Normalized profile
26
+ */
27
+ interface NormalizedProfile {
28
+ name: string;
29
+ url: string | null;
30
+ custom: boolean;
31
+ requirements: ProfileRequirements;
32
+ }
33
+ /**
34
+ * Profile list entry
35
+ */
36
+ interface ProfileListEntry {
37
+ id: string;
38
+ name: string;
39
+ source: 'user' | 'project';
40
+ path: string;
41
+ }
42
+ /**
43
+ * Plugin directories info
44
+ */
45
+ interface PluginDirsInfo {
46
+ user: string;
47
+ project: string;
48
+ userExists: boolean;
49
+ projectExists: boolean;
50
+ }
51
+ /**
52
+ * Load all custom journal profiles
53
+ */
54
+ export declare function loadCustomProfiles(): Record<string, NormalizedProfile>;
55
+ /**
56
+ * Initialize plugin directories
57
+ */
58
+ export declare function initPluginDir(project?: boolean): string;
59
+ /**
60
+ * Get plugin directories info
61
+ */
62
+ export declare function getPluginDirs(): PluginDirsInfo;
63
+ /**
64
+ * Create a sample profile template
65
+ */
66
+ export declare function createProfileTemplate(journalName: string): string;
67
+ /**
68
+ * Save a profile template
69
+ */
70
+ export declare function saveProfileTemplate(journalName: string, project?: boolean): string;
71
+ /**
72
+ * List all custom profiles
73
+ */
74
+ export declare function listCustomProfiles(): ProfileListEntry[];
75
+ export {};
76
+ //# sourceMappingURL=plugins.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../lib/plugins.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH;;GAEG;AACH,UAAU,mBAAmB;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAcD;;GAEG;AACH,UAAU,iBAAiB;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,mBAAmB,CAAC;CACnC;AAED;;GAEG;AACH,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;CACxB;AAMD;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAYtE;AAqFD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,UAAQ,GAAG,MAAM,CAQrD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,cAAc,CAO9C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CA+CjE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,UAAQ,GAAG,MAAM,CAahF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,gBAAgB,EAAE,CAwDvD"}