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,554 @@
1
+ /**
2
+ * CriticMarkup annotation parsing and manipulation
3
+ *
4
+ * Syntax:
5
+ * {++inserted text++} - Insertions
6
+ * {--deleted text--} - Deletions
7
+ * {~~old~>new~~} - Substitutions
8
+ * {>>Author: comment<<} - Comments
9
+ * {==text==} - Highlights
10
+ */
11
+ // =============================================================================
12
+ // Constants
13
+ // =============================================================================
14
+ /** Window size for context lookup (characters before/after position) */
15
+ const CONTEXT_WINDOW_SIZE = 2000;
16
+ /** Characters of context to include in annotation results */
17
+ const CONTEXT_SNIPPET_SIZE = 50;
18
+ /** Maximum iterations for nested annotation stripping (safety limit) */
19
+ const MAX_STRIP_ITERATIONS = 20;
20
+ /** Maximum author name length in comments */
21
+ const MAX_AUTHOR_LENGTH = 30;
22
+ /** Maximum content length before heuristic assumes it's not a comment */
23
+ const MAX_COMMENT_CONTENT_LENGTH = 200;
24
+ // =============================================================================
25
+ // Patterns
26
+ // =============================================================================
27
+ // Patterns for each annotation type
28
+ const PATTERNS = {
29
+ insert: /\{\+\+(.+?)\+\+\}/gs,
30
+ delete: /\{--(.+?)--\}/gs,
31
+ substitute: /\{~~(.+?)~>(.+?)~~\}/gs,
32
+ comment: /\{>>(.+?)<<\}/gs,
33
+ highlight: /\{==(.+?)==\}/gs,
34
+ };
35
+ /**
36
+ * Check if a potential comment is actually a false positive
37
+ * (e.g., figure caption, nested inside other annotation, code block, etc.)
38
+ * @param commentContent - The content inside {>>...<<}
39
+ * @param fullText - The full document text
40
+ * @param position - Position of the comment in the text
41
+ * @returns true if this is a false positive (not a real comment)
42
+ */
43
+ function isCommentFalsePositive(commentContent, fullText, position) {
44
+ // Check if inside a code block (fenced or indented)
45
+ const textBefore = fullText.slice(Math.max(0, position - CONTEXT_WINDOW_SIZE), position);
46
+ const textAfter = fullText.slice(position, Math.min(fullText.length, position + CONTEXT_WINDOW_SIZE));
47
+ // Count unclosed fenced code blocks (``` or ~~~)
48
+ const fenceOpens = (textBefore.match(/^```|^~~~/gm) || []).length;
49
+ const fenceCloses = (textBefore.match(/```$|~~~$/gm) || []).length;
50
+ if (fenceOpens > fenceCloses)
51
+ return true; // Inside code block
52
+ // Check if on an indented line (4+ spaces or tab at line start = code)
53
+ const lineStart = textBefore.lastIndexOf('\n') + 1;
54
+ const linePrefix = fullText.slice(lineStart, position);
55
+ if (/^(\t| )/.test(linePrefix))
56
+ return true; // Indented code
57
+ // Check if inside inline code backticks
58
+ const backticksBefore = (linePrefix.match(/`/g) || []).length;
59
+ if (backticksBefore % 2 === 1)
60
+ return true; // Inside inline code
61
+ // Check if nested inside a deletion or insertion block
62
+ const nearTextBefore = fullText.slice(Math.max(0, position - 500), position);
63
+ // Count unclosed deletion markers
64
+ const delOpens = (nearTextBefore.match(/\{--/g) || []).length;
65
+ const delCloses = (nearTextBefore.match(/--\}/g) || []).length;
66
+ if (delOpens > delCloses)
67
+ return true; // Nested inside deletion
68
+ // Count unclosed insertion markers
69
+ const insOpens = (nearTextBefore.match(/\{\+\+/g) || []).length;
70
+ const insCloses = (nearTextBefore.match(/\+\+\}/g) || []).length;
71
+ if (insOpens > insCloses)
72
+ return true; // Nested inside insertion
73
+ // Heuristics for figure captions and other false positives:
74
+ // Contains image/figure path patterns
75
+ if (/\(figures?\/|\(images?\/|\.png|\.jpg|\.jpeg|\.gif|\.svg|\.pdf/i.test(commentContent))
76
+ return true;
77
+ // Contains markdown figure reference syntax
78
+ if (/\{#fig:|!\[/.test(commentContent))
79
+ return true;
80
+ // Contains URL patterns (likely a link, not a comment)
81
+ if (/https?:\/\/|www\./i.test(commentContent) && commentContent.length < 150)
82
+ return true;
83
+ // Looks like code (contains programming patterns)
84
+ if (/function\s*\(|=>|import\s+|export\s+|const\s+|let\s+|var\s+/.test(commentContent))
85
+ return true;
86
+ // Very long without clear author pattern (likely caption, not comment)
87
+ // Real comments typically have "Author:" at start and are shorter
88
+ const hasAuthorPrefix = /^[A-Za-z][A-Za-z\s]{0,20}:\s/.test(commentContent.trim());
89
+ const hasResolvedMark = /^[✓✔]\s/.test(commentContent.trim());
90
+ if (!hasAuthorPrefix && !hasResolvedMark && commentContent.length > MAX_COMMENT_CONTENT_LENGTH)
91
+ return true;
92
+ // Looks like a figure caption (starts with "Fig" or contains typical caption words)
93
+ if (/^(Fig\.?|Figure|Table|Sankey|Diagram|Proportion|Distribution|Map|Chart|Graph|Plot|Panel)/i.test(commentContent.trim())) {
94
+ return true;
95
+ }
96
+ // Contains LaTeX-like patterns (likely equation, not comment)
97
+ if (/\\[a-z]+\{|\\frac|\\sum|\\int|\\begin\{/.test(commentContent))
98
+ return true;
99
+ // Looks like BibTeX entry (not a comment)
100
+ if (/@article\{|@book\{|@inproceedings\{/i.test(commentContent))
101
+ return true;
102
+ return false;
103
+ }
104
+ // Combined pattern for any track change (not comments)
105
+ const TRACK_CHANGE_PATTERN = /(\{\+\+.+?\+\+\}|\{--.+?--\}|\{~~.+?~>.+?~~\})/gs;
106
+ // =============================================================================
107
+ // Public API
108
+ // =============================================================================
109
+ /**
110
+ * Parse all annotations from text
111
+ * @param text - Markdown text containing CriticMarkup annotations
112
+ * @returns Array of parsed annotations sorted by position
113
+ * @throws TypeError If text is not a string
114
+ */
115
+ export function parseAnnotations(text) {
116
+ if (typeof text !== 'string') {
117
+ throw new TypeError(`text must be a string, got ${typeof text}`);
118
+ }
119
+ const annotations = [];
120
+ // Build line number lookup
121
+ const lines = text.split('\n');
122
+ let pos = 0;
123
+ const lineStarts = lines.map((line) => {
124
+ const start = pos;
125
+ pos += line.length + 1;
126
+ return start;
127
+ });
128
+ function getLine(position) {
129
+ for (let i = 0; i < lineStarts.length; i++) {
130
+ const start = lineStarts[i];
131
+ if (start !== undefined && start > position)
132
+ return i;
133
+ }
134
+ return lineStarts.length;
135
+ }
136
+ function getContext(position, length) {
137
+ const start = Math.max(0, position - CONTEXT_SNIPPET_SIZE);
138
+ const end = Math.min(text.length, position + length + CONTEXT_SNIPPET_SIZE);
139
+ const before = text.slice(start, position).split('\n').pop() || '';
140
+ const after = text.slice(position + length, end).split('\n')[0] || '';
141
+ return { before, after };
142
+ }
143
+ // Parse insertions
144
+ for (const match of text.matchAll(PATTERNS.insert)) {
145
+ if (match.index === undefined)
146
+ continue;
147
+ const ctx = getContext(match.index, match[0].length);
148
+ annotations.push({
149
+ type: 'insert',
150
+ match: match[0],
151
+ content: match[1] || '',
152
+ position: match.index,
153
+ line: getLine(match.index),
154
+ ...ctx,
155
+ });
156
+ }
157
+ // Parse deletions
158
+ for (const match of text.matchAll(PATTERNS.delete)) {
159
+ if (match.index === undefined)
160
+ continue;
161
+ const ctx = getContext(match.index, match[0].length);
162
+ annotations.push({
163
+ type: 'delete',
164
+ match: match[0],
165
+ content: match[1] || '',
166
+ position: match.index,
167
+ line: getLine(match.index),
168
+ ...ctx,
169
+ });
170
+ }
171
+ // Parse substitutions
172
+ for (const match of text.matchAll(PATTERNS.substitute)) {
173
+ if (match.index === undefined)
174
+ continue;
175
+ const ctx = getContext(match.index, match[0].length);
176
+ annotations.push({
177
+ type: 'substitute',
178
+ match: match[0],
179
+ content: match[1] || '',
180
+ replacement: match[2] || '',
181
+ position: match.index,
182
+ line: getLine(match.index),
183
+ ...ctx,
184
+ });
185
+ }
186
+ // Parse comments (with false positive filtering)
187
+ for (const match of text.matchAll(PATTERNS.comment)) {
188
+ if (match.index === undefined)
189
+ continue;
190
+ // Skip false positives (figure captions, nested annotations, etc.)
191
+ const commentContent = match[1] || '';
192
+ if (isCommentFalsePositive(commentContent, text, match.index)) {
193
+ continue;
194
+ }
195
+ const ctx = getContext(match.index, match[0].length);
196
+ let commentText = commentContent;
197
+ let author = '';
198
+ // Extract author if present (format: "Author: comment")
199
+ const colonIdx = commentText.indexOf(':');
200
+ if (colonIdx > 0 && colonIdx < MAX_AUTHOR_LENGTH) {
201
+ author = commentText.slice(0, colonIdx).trim();
202
+ commentText = commentText.slice(colonIdx + 1).trim();
203
+ }
204
+ annotations.push({
205
+ type: 'comment',
206
+ match: match[0],
207
+ content: commentText,
208
+ author,
209
+ position: match.index,
210
+ line: getLine(match.index),
211
+ ...ctx,
212
+ });
213
+ }
214
+ // Sort by position
215
+ annotations.sort((a, b) => a.position - b.position);
216
+ return annotations;
217
+ }
218
+ /**
219
+ * Strip annotations from text, applying changes
220
+ * Handles nested annotations by iterating until stable
221
+ * @param text - Markdown text with CriticMarkup annotations
222
+ * @param options - Strip options
223
+ * @returns Clean text with annotations applied/removed
224
+ * @throws TypeError If text is not a string
225
+ */
226
+ export function stripAnnotations(text, options = {}) {
227
+ if (typeof text !== 'string') {
228
+ throw new TypeError(`text must be a string, got ${typeof text}`);
229
+ }
230
+ const { keepComments = false } = options;
231
+ // Iterate until no more changes (handles nested annotations)
232
+ let prev;
233
+ let iterations = 0;
234
+ do {
235
+ prev = text;
236
+ // Apply substitutions: {~~old~>new~~} → new
237
+ text = text.replace(PATTERNS.substitute, '$2');
238
+ // Apply insertions: {++text++} → text
239
+ text = text.replace(PATTERNS.insert, '$1');
240
+ // Apply deletions: {--text--} → nothing
241
+ // Don't touch surrounding whitespace - just remove the annotation
242
+ text = text.replace(PATTERNS.delete, '');
243
+ // Remove highlights: {==text==} → text
244
+ text = text.replace(PATTERNS.highlight, '$1');
245
+ // Remove comments unless keeping
246
+ if (!keepComments) {
247
+ text = text.replace(PATTERNS.comment, '');
248
+ }
249
+ // Clean up partial/orphaned markers within the loop
250
+ // This handles cases where nested annotations leave behind fragments
251
+ // Empty annotations (from nested stripping)
252
+ text = text.replace(/\{----\}/g, '');
253
+ text = text.replace(/\{\+\+\+\+\}/g, '');
254
+ text = text.replace(/\{--\s*--\}/g, '');
255
+ text = text.replace(/\{\+\+\s*\+\+\}/g, '');
256
+ // Orphaned substitution fragments: ~>text~~} or {~~text (no proper pairs)
257
+ text = text.replace(/~>[^{]*?~~\}/g, '');
258
+ text = text.replace(/\{~~[^~}]*$/gm, '');
259
+ // Handle malformed substitution from nested: {~~{~~old → just strip the {~~
260
+ text = text.replace(/\{~~\{~~/g, '{~~');
261
+ text = text.replace(/~~\}~~\}/g, '~~}');
262
+ iterations++;
263
+ } while (text !== prev && iterations < MAX_STRIP_ITERATIONS);
264
+ // Final cleanup of any remaining orphaned markers
265
+ // Orphaned closing markers
266
+ text = text.replace(/--\}(?:--\})+/g, '');
267
+ text = text.replace(/\+\+\}(?:\+\+\})+/g, '');
268
+ text = text.replace(/~~\}(?:~~\})+/g, '');
269
+ text = text.replace(/--\}/g, '');
270
+ text = text.replace(/\+\+\}/g, '');
271
+ text = text.replace(/~~\}/g, '');
272
+ // Orphaned opening markers
273
+ text = text.replace(/\{--(?:\{--)+/g, '');
274
+ text = text.replace(/\{\+\+(?:\{\+\+)+/g, '');
275
+ text = text.replace(/\{~~(?:\{~~)+/g, '');
276
+ text = text.replace(/\{--/g, '');
277
+ text = text.replace(/\{\+\+/g, '');
278
+ text = text.replace(/\{~~/g, '');
279
+ text = text.replace(/~>/g, '');
280
+ return text;
281
+ }
282
+ /**
283
+ * Collapse multiple spaces to single space, preserving table formatting
284
+ * Useful for cleaning up messy Word imports
285
+ * @param text - Text to normalize
286
+ * @returns Text with multiple spaces collapsed to single spaces
287
+ * @throws TypeError If text is not a string
288
+ */
289
+ export function stripToSingleSpace(text) {
290
+ if (typeof text !== 'string') {
291
+ throw new TypeError(`text must be a string, got ${typeof text}`);
292
+ }
293
+ const lines = text.split('\n');
294
+ let inTable = false;
295
+ // Helper to check if a line looks like table content
296
+ const looksLikeTableRow = (ln) => {
297
+ const trimmed = ln.trim();
298
+ if (!trimmed)
299
+ return false;
300
+ // Has multiple consecutive spaces (column spacing)
301
+ // OR italicized category header with trailing spaces
302
+ return /\S\s{2,}\S/.test(trimmed) || (/^\*[^*]+\*\s*$/.test(trimmed) && /\s{2,}$/.test(ln));
303
+ };
304
+ for (let i = 0; i < lines.length; i++) {
305
+ const line = lines[i];
306
+ if (!line)
307
+ continue;
308
+ // Detect table separator line
309
+ const isTableSeparator = /^\|?[\s-]*[-]{3,}[\s|:-]+[-]{3,}/.test(line) ||
310
+ /^[-]{3,}\s{2,}[-]{3,}/.test(line);
311
+ if (isTableSeparator) {
312
+ inTable = true;
313
+ continue;
314
+ }
315
+ // Check if we're exiting the table
316
+ if (inTable && line.trim() === '') {
317
+ let nextContentLine = '';
318
+ for (let j = i + 1; j < lines.length && j < i + 5; j++) {
319
+ const nextLine = lines[j];
320
+ if (nextLine && nextLine.trim() !== '') {
321
+ nextContentLine = nextLine;
322
+ break;
323
+ }
324
+ }
325
+ if (!looksLikeTableRow(nextContentLine) && !/^[-]{3,}/.test(nextContentLine.trim())) {
326
+ inTable = false;
327
+ }
328
+ continue;
329
+ }
330
+ // Only collapse spaces outside tables
331
+ if (!inTable) {
332
+ lines[i] = line.replace(/ +/g, ' ');
333
+ }
334
+ }
335
+ return lines.join('\n');
336
+ }
337
+ /**
338
+ * Check if text contains any CriticMarkup annotations
339
+ * @param text - Text to check
340
+ * @returns True if text contains any annotations
341
+ * @throws TypeError If text is not a string
342
+ */
343
+ export function hasAnnotations(text) {
344
+ if (typeof text !== 'string') {
345
+ throw new TypeError(`text must be a string, got ${typeof text}`);
346
+ }
347
+ return PATTERNS.insert.test(text) ||
348
+ PATTERNS.delete.test(text) ||
349
+ PATTERNS.substitute.test(text) ||
350
+ PATTERNS.comment.test(text) ||
351
+ PATTERNS.highlight.test(text);
352
+ }
353
+ /**
354
+ * Apply a decision to a single annotation (accept or reject)
355
+ * @param text - Document text containing the annotation
356
+ * @param annotation - Annotation object from parseAnnotations()
357
+ * @param accept - True to accept the change, false to reject
358
+ * @returns Updated text with the decision applied
359
+ * @throws TypeError If text is not a string or annotation is invalid
360
+ */
361
+ export function applyDecision(text, annotation, accept) {
362
+ if (typeof text !== 'string') {
363
+ throw new TypeError(`text must be a string, got ${typeof text}`);
364
+ }
365
+ if (!annotation || typeof annotation.type !== 'string' || typeof annotation.match !== 'string') {
366
+ throw new TypeError('annotation must have type and match properties');
367
+ }
368
+ let replacement;
369
+ // Extract any comments embedded in the annotation content
370
+ // These should be preserved when accepting deletions or rejecting insertions
371
+ const commentPattern = /\{>>[^<]*<<\}/g;
372
+ const embeddedComments = (annotation.match || '').match(commentPattern) || [];
373
+ switch (annotation.type) {
374
+ case 'insert':
375
+ if (accept) {
376
+ replacement = annotation.content;
377
+ }
378
+ else {
379
+ // Rejecting insertion - preserve any comments that were inside
380
+ replacement = embeddedComments.length > 0 ? embeddedComments.join('') : '';
381
+ }
382
+ break;
383
+ case 'delete':
384
+ if (accept) {
385
+ // Accepting deletion - preserve any comments by placing them before
386
+ replacement = embeddedComments.length > 0 ? embeddedComments.join('') : '';
387
+ }
388
+ else {
389
+ replacement = annotation.content;
390
+ }
391
+ break;
392
+ case 'substitute':
393
+ if (accept) {
394
+ // For substitutions, check if comments are in the old text being replaced
395
+ const oldTextComments = (annotation.content || '').match(commentPattern) || [];
396
+ replacement = annotation.replacement || '';
397
+ if (oldTextComments.length > 0) {
398
+ // Prepend comments that were in the old text
399
+ replacement = oldTextComments.join('') + replacement;
400
+ }
401
+ }
402
+ else {
403
+ replacement = annotation.content;
404
+ }
405
+ break;
406
+ default:
407
+ return text;
408
+ }
409
+ return text.replace(annotation.match, replacement);
410
+ }
411
+ /**
412
+ * Get track changes only (no comments)
413
+ * @param text - Markdown text with CriticMarkup annotations
414
+ * @returns Array of insert/delete/substitute annotations
415
+ * @throws TypeError If text is not a string
416
+ */
417
+ export function getTrackChanges(text) {
418
+ // Input validation delegated to parseAnnotations
419
+ return parseAnnotations(text).filter((a) => a.type !== 'comment');
420
+ }
421
+ /**
422
+ * Get comments only
423
+ * @param text - Markdown text with CriticMarkup annotations
424
+ * @param options - Filter options
425
+ * @returns Array of comment annotations
426
+ * @throws TypeError If text is not a string
427
+ */
428
+ export function getComments(text, options = {}) {
429
+ // Input validation delegated to parseAnnotations
430
+ const { pendingOnly = false, resolvedOnly = false } = options;
431
+ let comments = parseAnnotations(text).filter((a) => a.type === 'comment');
432
+ // Check for resolved status marker at end of comment
433
+ comments = comments.map((c) => {
434
+ const resolved = c.content.endsWith('[RESOLVED]') || c.content.endsWith('[✓]');
435
+ return {
436
+ ...c,
437
+ resolved,
438
+ content: resolved
439
+ ? c.content.replace(/\s*\[(RESOLVED|✓)\]$/, '').trim()
440
+ : c.content,
441
+ };
442
+ });
443
+ if (pendingOnly) {
444
+ comments = comments.filter((c) => !c.resolved);
445
+ }
446
+ if (resolvedOnly) {
447
+ comments = comments.filter((c) => c.resolved);
448
+ }
449
+ return comments;
450
+ }
451
+ /**
452
+ * Mark a comment as resolved or pending
453
+ * @param text - Document text containing the comment
454
+ * @param comment - Comment annotation object from getComments()
455
+ * @param resolved - True to mark resolved, false to mark pending
456
+ * @returns Updated text with status marker applied
457
+ * @throws TypeError If text is not a string or comment is invalid
458
+ */
459
+ export function setCommentStatus(text, comment, resolved) {
460
+ if (typeof text !== 'string') {
461
+ throw new TypeError(`text must be a string, got ${typeof text}`);
462
+ }
463
+ if (!comment || typeof comment.match !== 'string') {
464
+ throw new TypeError('comment must have a match property');
465
+ }
466
+ // Find the comment in the text
467
+ const originalMatch = comment.match;
468
+ if (resolved) {
469
+ // Add [RESOLVED] marker before the closing <<
470
+ const newMatch = originalMatch.replace(/<<\}$/, ' [RESOLVED]<<}');
471
+ return text.replace(originalMatch, newMatch);
472
+ }
473
+ else {
474
+ // Remove resolved markers
475
+ const newMatch = originalMatch.replace(/\s*\[(RESOLVED|✓)\]<<\}$/, '<<}');
476
+ return text.replace(originalMatch, newMatch);
477
+ }
478
+ }
479
+ /**
480
+ * Count annotations by type
481
+ * @param text - Markdown text with CriticMarkup annotations
482
+ * @returns Counts by annotation type
483
+ * @throws TypeError If text is not a string
484
+ */
485
+ export function countAnnotations(text) {
486
+ // Input validation delegated to parseAnnotations
487
+ const annotations = parseAnnotations(text);
488
+ const counts = { inserts: 0, deletes: 0, substitutes: 0, comments: 0, total: 0 };
489
+ for (const a of annotations) {
490
+ counts.total++;
491
+ switch (a.type) {
492
+ case 'insert':
493
+ counts.inserts++;
494
+ break;
495
+ case 'delete':
496
+ counts.deletes++;
497
+ break;
498
+ case 'substitute':
499
+ counts.substitutes++;
500
+ break;
501
+ case 'comment':
502
+ counts.comments++;
503
+ break;
504
+ }
505
+ }
506
+ return counts;
507
+ }
508
+ /**
509
+ * Clean up orphaned/malformed CriticMarkup markers
510
+ * This can happen when track changes span across comment boundaries
511
+ * @param text - Document text with potentially malformed markers
512
+ * @returns Cleaned text with orphaned markers removed
513
+ * @throws TypeError If text is not a string
514
+ */
515
+ export function cleanupOrphanedMarkers(text) {
516
+ if (typeof text !== 'string') {
517
+ throw new TypeError(`text must be a string, got ${typeof text}`);
518
+ }
519
+ let result = text;
520
+ // Remove orphaned insertion end markers (++} not preceded by {++)
521
+ // These occur when an insertion's start was inside something that got deleted/replaced
522
+ result = result.replace(/(?<!\{\+\+[^}]*)\+\+\}/g, '');
523
+ // Remove orphaned deletion end markers (--} not preceded by {--)
524
+ result = result.replace(/(?<!\{--[^}]*)--\}/g, '');
525
+ // Remove orphaned substitution end markers (~~} not preceded by {~~)
526
+ result = result.replace(/(?<!\{~~[^}]*)~~\}/g, '');
527
+ // Fix unclosed insertions: {++ without matching ++}
528
+ // Find {++ and check if there's a matching ++} before the next { marker
529
+ result = result.replace(/\{\+\+([^+]*?)(?=\{[+\-~>]|\{>>|$)/g, (match, content) => {
530
+ // If content has no ++}, it's unclosed - just keep the content
531
+ if (!content.includes('++}')) {
532
+ return content;
533
+ }
534
+ return match;
535
+ });
536
+ // Fix unclosed deletions: {-- without matching --}
537
+ result = result.replace(/\{--([^-]*?)(?=\{[+\-~>]|\{>>|$)/g, (match, content) => {
538
+ if (!content.includes('--}')) {
539
+ return content;
540
+ }
541
+ return match;
542
+ });
543
+ // Fix unclosed substitutions: {~~ without matching ~~}
544
+ // This is trickier because we need both ~> and ~~}
545
+ result = result.replace(/\{~~([^~]*?)~>([^~]*?)(?=\{[+\-~>]|\{>>|$)/g, (match, old, newText) => {
546
+ if (!match.includes('~~}')) {
547
+ // Unclosed substitution - keep the new text
548
+ return newText;
549
+ }
550
+ return match;
551
+ });
552
+ return result;
553
+ }
554
+ //# sourceMappingURL=annotations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"annotations.js","sourceRoot":"","sources":["../../lib/annotations.ts"],"names":[],"mappings":"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"}