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,587 @@
1
+ /**
2
+ * Word comment injection with reply threading
3
+ *
4
+ * Flow:
5
+ * 1. prepareMarkdownWithMarkers() - Parse comments, detect reply relationships
6
+ * - First comment in a cluster = parent (gets markers: ⟦CMS:n⟧anchor⟦CME:n⟧)
7
+ * - Subsequent adjacent comments = replies (no markers, attach to parent)
8
+ * 2. Pandoc converts to DOCX
9
+ * 3. injectCommentsAtMarkers() - Insert comment ranges for parents only
10
+ * - Replies go in comments.xml with parent reference in commentsExtended.xml
11
+ */
12
+ import * as fs from 'fs';
13
+ import AdmZip from 'adm-zip';
14
+ const MARKER_START_PREFIX = '⟦CMS:';
15
+ const MARKER_END_PREFIX = '⟦CME:';
16
+ const MARKER_SUFFIX = '⟧';
17
+ function escapeXml(str) {
18
+ return str
19
+ .replace(/&/g, '&')
20
+ .replace(/</g, '&lt;')
21
+ .replace(/>/g, '&gt;')
22
+ .replace(/"/g, '&quot;')
23
+ .replace(/'/g, '&apos;');
24
+ }
25
+ function generateParaId(commentIdx, paraNum) {
26
+ // Generate 8-character uppercase hex ID matching Word format
27
+ // Word uses IDs like "3F25BC58", "0331C187"
28
+ // Must be deterministic - same inputs always produce same output
29
+ const id = 0x10000000 + (commentIdx * 0x00100000) + (paraNum * 0x00001000);
30
+ return id.toString(16).toUpperCase().padStart(8, '0');
31
+ }
32
+ /**
33
+ * Parse comments and create markers
34
+ *
35
+ * Returns:
36
+ * - markedMarkdown: markdown with markers for parent comments only
37
+ * - comments: array with author, text, isReply, parentIdx
38
+ */
39
+ export function prepareMarkdownWithMarkers(markdown) {
40
+ // Match all comments with optional anchor
41
+ const commentPattern = /\{>>(.+?)<<\}(?:\s*\[([^\]]+)\]\{\.mark\})?/g;
42
+ const rawMatches = [];
43
+ let match;
44
+ while ((match = commentPattern.exec(markdown)) !== null) {
45
+ const content = match[1] ?? '';
46
+ let author = 'Unknown';
47
+ let text = content;
48
+ const colonIdx = content.indexOf(':');
49
+ if (colonIdx > 0 && colonIdx < 30) {
50
+ author = content.slice(0, colonIdx).trim();
51
+ text = content.slice(colonIdx + 1).trim();
52
+ }
53
+ rawMatches.push({
54
+ author,
55
+ text,
56
+ anchor: match[2] || null,
57
+ start: match.index,
58
+ end: match.index + match[0].length,
59
+ fullMatch: match[0]
60
+ });
61
+ }
62
+ if (rawMatches.length === 0) {
63
+ return { markedMarkdown: markdown, comments: [] };
64
+ }
65
+ // Detect reply relationships based on adjacency
66
+ // First comment in a cluster = parent, all subsequent = replies to that parent
67
+ // Comments are "adjacent" if there's minimal text between them (< 10 chars)
68
+ const ADJACENT_THRESHOLD = 10;
69
+ const comments = [];
70
+ let clusterParentIdx = -1; // Index of first comment in current cluster
71
+ let lastCommentEnd = -1;
72
+ for (let i = 0; i < rawMatches.length; i++) {
73
+ const m = rawMatches[i];
74
+ if (!m)
75
+ continue;
76
+ // Check if this comment is adjacent to the previous one
77
+ const gap = lastCommentEnd >= 0 ? m.start - lastCommentEnd : Infinity;
78
+ const isAdjacent = gap < ADJACENT_THRESHOLD;
79
+ // Reset cluster if there's a gap (comments not in same cluster)
80
+ if (!isAdjacent) {
81
+ clusterParentIdx = -1;
82
+ }
83
+ if (clusterParentIdx === -1) {
84
+ // First comment in cluster = parent (regardless of author)
85
+ comments.push({
86
+ author: m.author,
87
+ text: m.text,
88
+ anchor: m.anchor,
89
+ start: m.start,
90
+ end: m.end,
91
+ fullMatch: m.fullMatch,
92
+ isReply: false,
93
+ parentIdx: null,
94
+ commentIdx: comments.length
95
+ });
96
+ clusterParentIdx = comments.length - 1;
97
+ }
98
+ else {
99
+ // Subsequent comment in cluster = reply to first comment
100
+ comments.push({
101
+ author: m.author,
102
+ text: m.text,
103
+ anchor: m.anchor,
104
+ start: m.start,
105
+ end: m.end,
106
+ fullMatch: m.fullMatch,
107
+ isReply: true,
108
+ parentIdx: clusterParentIdx,
109
+ commentIdx: comments.length
110
+ });
111
+ }
112
+ lastCommentEnd = m.end;
113
+ }
114
+ // Propagate anchors from replies to parents
115
+ // If a reply has an anchor but its parent doesn't, move the anchor to the parent
116
+ // Track flags for special handling during marker generation
117
+ for (const c of comments) {
118
+ if (c.isReply && c.anchor && c.parentIdx !== null) {
119
+ const parent = comments[c.parentIdx];
120
+ if (parent && !parent.anchor) {
121
+ parent.anchor = c.anchor;
122
+ parent.anchorFromReply = true; // Parent's anchor came from a reply (markers placed by reply)
123
+ c.placesParentMarkers = true; // This reply should place the parent's markers
124
+ c.anchor = null;
125
+ }
126
+ }
127
+ }
128
+ // Build marked markdown - only parent comments get markers
129
+ // Process from end to start to preserve positions
130
+ let markedMarkdown = markdown;
131
+ for (let i = comments.length - 1; i >= 0; i--) {
132
+ const c = comments[i];
133
+ if (!c)
134
+ continue;
135
+ if (c.isReply) {
136
+ // Reply: remove from document entirely (will be in comments.xml only)
137
+ // Also consume leading whitespace to avoid double spaces
138
+ let removeStart = c.start;
139
+ const charBefore = markedMarkdown[removeStart - 1];
140
+ while (removeStart > 0 && charBefore && /\s/.test(charBefore)) {
141
+ removeStart--;
142
+ }
143
+ // If this reply places parent's markers (anchor was propagated)
144
+ if (c.placesParentMarkers && c.parentIdx !== null) {
145
+ // Extract anchor text from the original match
146
+ const anchorMatch = c.fullMatch.match(/\[([^\]]+)\]\{\.mark\}$/);
147
+ if (anchorMatch) {
148
+ const anchorText = anchorMatch[1] ?? '';
149
+ // Output markers with PARENT's index around the anchor text
150
+ const parentIdx = c.parentIdx;
151
+ const replacement = `${MARKER_START_PREFIX}${parentIdx}${MARKER_SUFFIX}${anchorText}${MARKER_END_PREFIX}${parentIdx}${MARKER_SUFFIX}`;
152
+ markedMarkdown = markedMarkdown.slice(0, removeStart) + replacement + markedMarkdown.slice(c.end);
153
+ }
154
+ else {
155
+ markedMarkdown = markedMarkdown.slice(0, removeStart) + markedMarkdown.slice(c.end);
156
+ }
157
+ }
158
+ else {
159
+ markedMarkdown = markedMarkdown.slice(0, removeStart) + markedMarkdown.slice(c.end);
160
+ }
161
+ }
162
+ else {
163
+ // Parent comment
164
+ if (c.anchorFromReply) {
165
+ // Anchor markers are placed by the reply, just remove this comment
166
+ let removeStart = c.start;
167
+ const charBefore = markedMarkdown[removeStart - 1];
168
+ while (removeStart > 0 && charBefore && /\s/.test(charBefore)) {
169
+ removeStart--;
170
+ }
171
+ markedMarkdown = markedMarkdown.slice(0, removeStart) + markedMarkdown.slice(c.end);
172
+ }
173
+ else {
174
+ // Normal case: replace with markers
175
+ const anchor = c.anchor || '';
176
+ const replacement = `${MARKER_START_PREFIX}${i}${MARKER_SUFFIX}${anchor}${MARKER_END_PREFIX}${i}${MARKER_SUFFIX}`;
177
+ markedMarkdown = markedMarkdown.slice(0, c.start) + replacement + markedMarkdown.slice(c.end);
178
+ }
179
+ }
180
+ }
181
+ return { markedMarkdown, comments };
182
+ }
183
+ function createCommentsXml(comments) {
184
+ // Word expects date without milliseconds: 2025-12-30T08:33:00Z
185
+ const now = new Date().toISOString().replace(/\.\d{3}Z$/, 'Z');
186
+ let xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
187
+ // Minimal namespaces matching golden file structure
188
+ xml += '<w:comments xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" mc:Ignorable="w14 w15">';
189
+ // Use a consistent rsid (8-char hex) for all comments in this batch
190
+ const rsid = '00' + (Date.now() % 0xFFFFFF).toString(16).toUpperCase().padStart(6, '0');
191
+ for (const comment of comments) {
192
+ xml += `<w:comment w:id="${comment.id}" w:author="${escapeXml(comment.author)}" w:date="${now}" w:initials="${comment.author.split(' ').map(n => n[0]).join('')}">`;
193
+ // First paragraph: rsidRDefault="00000000", annotationRef without rStyle wrapper
194
+ xml += `<w:p w14:paraId="${comment.paraId}" w14:textId="77777777" w:rsidR="${rsid}" w:rsidRDefault="00000000">`;
195
+ xml += `<w:r><w:annotationRef/></w:r>`;
196
+ xml += `<w:r><w:t>${escapeXml(comment.text)}</w:t></w:r>`;
197
+ xml += `</w:p>`;
198
+ if (comment.isReply) {
199
+ // Second empty paragraph: rsidRDefault matches rsidR
200
+ xml += `<w:p w14:paraId="${comment.paraId2}" w14:textId="77777777" w:rsidR="${rsid}" w:rsidRDefault="${rsid}"/>`;
201
+ }
202
+ xml += `</w:comment>`;
203
+ }
204
+ xml += '</w:comments>';
205
+ return xml;
206
+ }
207
+ function createCommentsExtendedXml(comments) {
208
+ let xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
209
+ // Minimal namespaces matching golden file structure
210
+ xml += '<w15:commentsEx xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" mc:Ignorable="w14 w15">';
211
+ for (const comment of comments) {
212
+ if (comment.isReply && comment.parentParaId) {
213
+ // Reply: use paraId2 (the second/empty paragraph) and link to parent's paraId
214
+ xml += `<w15:commentEx w15:paraId="${comment.paraId2}" w15:paraIdParent="${comment.parentParaId}" w15:done="0"/>`;
215
+ }
216
+ else {
217
+ // Parent comment: use paraId (first paragraph)
218
+ xml += `<w15:commentEx w15:paraId="${comment.paraId}" w15:done="0"/>`;
219
+ }
220
+ }
221
+ xml += '</w15:commentsEx>';
222
+ return xml;
223
+ }
224
+ function generateDurableId(index) {
225
+ // Generate unique 8-char hex ID for durableId
226
+ // CRITICAL: Must stay within signed 32-bit range (< 0x7FFFFFFF = 2147483647)
227
+ // Word interprets durableIds as signed 32-bit integers
228
+ const base = 0x10000000 + (Date.now() % 0x40000000); // Base between 0x10000000 and 0x50000000
229
+ const id = (base + index * 0x01000000) % 0x7FFFFFFF; // Keep under signed 32-bit max
230
+ return id.toString(16).toUpperCase().padStart(8, '0');
231
+ }
232
+ function createCommentsIdsXml(comments) {
233
+ let xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
234
+ // Minimal namespaces matching golden file structure
235
+ xml += '<w16cid:commentsIds ';
236
+ xml += 'xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" ';
237
+ xml += 'xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" ';
238
+ xml += 'mc:Ignorable="w16cid">';
239
+ for (const comment of comments) {
240
+ // ONE entry per comment using the LAST paragraph's paraId:
241
+ // - Parent comments (1 paragraph): use paraId
242
+ // - Reply comments (2 paragraphs): use paraId2 (the second/empty paragraph)
243
+ const useParaId = comment.isReply ? comment.paraId2 : comment.paraId;
244
+ xml += `<w16cid:commentId w16cid:paraId="${useParaId}" w16cid:durableId="${comment.durableId}"/>`;
245
+ }
246
+ xml += '</w16cid:commentsIds>';
247
+ return xml;
248
+ }
249
+ function createCommentsExtensibleXml(comments) {
250
+ const now = new Date().toISOString().replace(/\.\d{3}Z$/, 'Z');
251
+ let xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
252
+ // Minimal namespaces matching golden file structure
253
+ xml += '<w16cex:commentsExtensible ';
254
+ xml += 'xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" ';
255
+ xml += 'xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex" ';
256
+ xml += 'mc:Ignorable="w16cex">';
257
+ for (const comment of comments) {
258
+ // ONE entry per comment using the durableId
259
+ xml += `<w16cex:commentExtensible w16cex:durableId="${comment.durableId}" w16cex:dateUtc="${now}"/>`;
260
+ }
261
+ xml += '</w16cex:commentsExtensible>';
262
+ return xml;
263
+ }
264
+ // Generate deterministic user IDs for authors (no hardcoded personal data)
265
+ function createPeopleXml(comments) {
266
+ // Extract unique authors
267
+ const authors = [...new Set(comments.map(c => c.author))];
268
+ let xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\n';
269
+ xml += '<w15:people ';
270
+ xml += 'xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" ';
271
+ xml += 'xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" ';
272
+ xml += 'xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" ';
273
+ xml += 'xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" ';
274
+ xml += 'xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" ';
275
+ xml += 'xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" ';
276
+ xml += 'xmlns:w16cex="http://schemas.microsoft.com/office/word/2018/wordml/cex" ';
277
+ xml += 'xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" ';
278
+ xml += 'xmlns:w16="http://schemas.microsoft.com/office/word/2018/wordml" ';
279
+ xml += 'xmlns:w16sdtdh="http://schemas.microsoft.com/office/word/2020/wordml/sdtdatahash" ';
280
+ xml += 'xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" ';
281
+ xml += 'mc:Ignorable="w14 w15 w16se w16cid w16 w16cex w16sdtdh">';
282
+ for (const author of authors) {
283
+ const userId = generateUserId(author);
284
+ xml += `<w15:person w15:author="${escapeXml(author)}">`;
285
+ xml += `<w15:presenceInfo w15:providerId="Windows Live" w15:userId="${userId}"/>`;
286
+ xml += `</w15:person>`;
287
+ }
288
+ xml += '</w15:people>';
289
+ return xml;
290
+ }
291
+ function generateUserId(author) {
292
+ // Generate a deterministic 16-char hex ID from author name
293
+ let hash = 0;
294
+ for (let i = 0; i < author.length; i++) {
295
+ hash = ((hash << 5) - hash) + author.charCodeAt(i);
296
+ hash = hash & hash;
297
+ }
298
+ return Math.abs(hash).toString(16).padStart(16, '0').slice(0, 16);
299
+ }
300
+ /**
301
+ * Inject comments at marker positions
302
+ */
303
+ export async function injectCommentsAtMarkers(docxPath, comments, outputPath) {
304
+ try {
305
+ if (!fs.existsSync(docxPath)) {
306
+ return { success: false, commentCount: 0, skippedComments: 0, error: `File not found: ${docxPath}` };
307
+ }
308
+ if (comments.length === 0) {
309
+ fs.copyFileSync(docxPath, outputPath);
310
+ return { success: true, commentCount: 0, skippedComments: 0 };
311
+ }
312
+ const zip = new AdmZip(docxPath);
313
+ const documentEntry = zip.getEntry('word/document.xml');
314
+ if (!documentEntry) {
315
+ return { success: false, commentCount: 0, skippedComments: 0, error: 'Invalid DOCX: no document.xml' };
316
+ }
317
+ let documentXml = zip.readAsText(documentEntry);
318
+ // Assign IDs and paraIds (IDs start at 1, not 0 - Word convention)
319
+ const commentsWithIds = comments.map((c, idx) => ({
320
+ ...c,
321
+ id: String(idx + 1),
322
+ paraId: generateParaId(idx, 1), // First paragraph (e.g., 10000001)
323
+ paraId2: generateParaId(idx, 2), // Second paragraph (e.g., 10000002)
324
+ durableId: generateDurableId(idx), // Unique ID for commentsIds/commentsExtensible
325
+ }));
326
+ // Link replies to parent paraIds
327
+ for (const c of commentsWithIds) {
328
+ if (c.isReply && c.parentIdx !== null) {
329
+ const parent = commentsWithIds[c.parentIdx];
330
+ if (parent) {
331
+ c.parentParaId = parent.paraId;
332
+ }
333
+ }
334
+ }
335
+ const injectedIds = new Set();
336
+ // Process only parent comments (non-replies) for document ranges
337
+ const parentComments = commentsWithIds.filter(c => !c.isReply);
338
+ for (let i = parentComments.length - 1; i >= 0; i--) {
339
+ const comment = parentComments[i];
340
+ if (!comment)
341
+ continue;
342
+ const idx = comment.commentIdx;
343
+ const startMarker = `${MARKER_START_PREFIX}${idx}${MARKER_SUFFIX}`;
344
+ const endMarker = `${MARKER_END_PREFIX}${idx}${MARKER_SUFFIX}`;
345
+ const startPos = documentXml.indexOf(startMarker);
346
+ const endPos = documentXml.indexOf(endMarker);
347
+ if (startPos === -1 || endPos === -1)
348
+ continue;
349
+ // Find the <w:r> containing the markers
350
+ const rStartBefore = documentXml.lastIndexOf('<w:r>', startPos);
351
+ const rStartOpen = documentXml.lastIndexOf('<w:r ', startPos);
352
+ const rStart = Math.max(rStartBefore, rStartOpen);
353
+ const rEndPos = documentXml.indexOf('</w:r>', endPos);
354
+ if (rStart === -1 || rEndPos === -1)
355
+ continue;
356
+ const rEnd = rEndPos + '</w:r>'.length;
357
+ const runContent = documentXml.slice(rStart, rEnd);
358
+ // Extract styling
359
+ const rPrMatch = runContent.match(/<w:rPr>[\s\S]*?<\/w:rPr>/);
360
+ const rPr = rPrMatch ? rPrMatch[0] : '';
361
+ // Extract text
362
+ const textMatch = runContent.match(/<w:t[^>]*>([\s\S]*?)<\/w:t>/);
363
+ if (!textMatch)
364
+ continue;
365
+ const fullText = textMatch[1] ?? '';
366
+ const tElementMatch = textMatch[0].match(/<w:t[^>]*>/);
367
+ if (!tElementMatch)
368
+ continue;
369
+ const tElement = tElementMatch[0];
370
+ const startInText = fullText.indexOf(startMarker);
371
+ const endInText = fullText.indexOf(endMarker);
372
+ if (startInText === -1 || endInText === -1)
373
+ continue;
374
+ let textBefore = fullText.slice(0, startInText);
375
+ let anchorText = fullText.slice(startInText + startMarker.length, endInText);
376
+ let textAfter = fullText.slice(endInText + endMarker.length);
377
+ // When anchor is empty, use the first word from textAfter as fallback
378
+ if (!anchorText && textAfter) {
379
+ const wordMatch = textAfter.match(/^\s*(\S+)/);
380
+ if (wordMatch) {
381
+ anchorText = wordMatch[1] ?? '';
382
+ textAfter = textAfter.slice(wordMatch[0].length);
383
+ }
384
+ }
385
+ // When anchor is still empty, normalize double spaces to single space
386
+ if (!anchorText && textBefore.endsWith(' ') && textAfter.startsWith(' ')) {
387
+ textAfter = textAfter.slice(1); // Remove leading space from textAfter
388
+ }
389
+ // Build replacement
390
+ let replacement = '';
391
+ if (textBefore) {
392
+ replacement += `<w:r>${rPr}${tElement}${textBefore}</w:t></w:r>`;
393
+ }
394
+ // Find replies to this comment
395
+ const replies = commentsWithIds.filter(c => c.isReply && c.parentIdx === comment?.commentIdx);
396
+ // Start ranges for parent AND all replies (nested)
397
+ replacement += `<w:commentRangeStart w:id="${comment.id}"/>`;
398
+ for (const reply of replies) {
399
+ replacement += `<w:commentRangeStart w:id="${reply.id}"/>`;
400
+ }
401
+ // Anchor text
402
+ if (anchorText) {
403
+ replacement += `<w:r>${rPr}${tElement}${anchorText}</w:t></w:r>`;
404
+ }
405
+ // End parent range and reference (NO rStyle wrapper - required for threading)
406
+ replacement += `<w:commentRangeEnd w:id="${comment.id}"/>`;
407
+ replacement += `<w:r><w:commentReference w:id="${comment.id}"/></w:r>`;
408
+ // End reply ranges and references (same position as parent, NO rStyle wrapper)
409
+ for (const reply of replies) {
410
+ replacement += `<w:commentRangeEnd w:id="${reply.id}"/>`;
411
+ replacement += `<w:r><w:commentReference w:id="${reply.id}"/></w:r>`;
412
+ injectedIds.add(reply.id);
413
+ }
414
+ if (textAfter) {
415
+ replacement += `<w:r>${rPr}${tElement}${textAfter}</w:t></w:r>`;
416
+ }
417
+ documentXml = documentXml.slice(0, rStart) + replacement + documentXml.slice(rEnd);
418
+ injectedIds.add(comment.id);
419
+ }
420
+ // Add required namespaces to document.xml for comment threading
421
+ const requiredNs = {
422
+ 'xmlns:w14': 'http://schemas.microsoft.com/office/word/2010/wordml',
423
+ 'xmlns:w15': 'http://schemas.microsoft.com/office/word/2012/wordml',
424
+ 'xmlns:w16cid': 'http://schemas.microsoft.com/office/word/2016/wordml/cid',
425
+ 'xmlns:w16cex': 'http://schemas.microsoft.com/office/word/2018/wordml/cex',
426
+ 'xmlns:mc': 'http://schemas.openxmlformats.org/markup-compatibility/2006',
427
+ };
428
+ // Find <w:document and add namespaces
429
+ const docTagMatch = documentXml.match(/<w:document[^>]*>/);
430
+ if (docTagMatch) {
431
+ let docTag = docTagMatch[0];
432
+ let modified = false;
433
+ for (const [attr, val] of Object.entries(requiredNs)) {
434
+ if (!docTag.includes(attr)) {
435
+ docTag = docTag.replace('>', ` ${attr}="${val}">`);
436
+ modified = true;
437
+ }
438
+ }
439
+ // Add mc:Ignorable if mc namespace was added
440
+ if (modified && !docTag.includes('mc:Ignorable')) {
441
+ docTag = docTag.replace('>', ' mc:Ignorable="w14 w15 w16cid w16cex">');
442
+ }
443
+ documentXml = documentXml.replace(docTagMatch[0], docTag);
444
+ }
445
+ // Update document.xml
446
+ zip.updateFile('word/document.xml', Buffer.from(documentXml, 'utf-8'));
447
+ // All comments (parents + replies) go in comments.xml
448
+ // But only include if parent was injected
449
+ const includedComments = commentsWithIds.filter(c => {
450
+ if (!c.isReply) {
451
+ return injectedIds.has(c.id);
452
+ }
453
+ else {
454
+ // Include reply if its parent was injected
455
+ const parent = c.parentIdx !== null ? commentsWithIds[c.parentIdx] : undefined;
456
+ return parent && injectedIds.has(parent.id);
457
+ }
458
+ });
459
+ // Create comments.xml
460
+ const commentsXml = createCommentsXml(includedComments);
461
+ if (zip.getEntry('word/comments.xml')) {
462
+ zip.updateFile('word/comments.xml', Buffer.from(commentsXml, 'utf-8'));
463
+ }
464
+ else {
465
+ zip.addFile('word/comments.xml', Buffer.from(commentsXml, 'utf-8'));
466
+ }
467
+ // Create commentsExtended.xml with reply threading
468
+ const commentsExtXml = createCommentsExtendedXml(includedComments);
469
+ if (zip.getEntry('word/commentsExtended.xml')) {
470
+ zip.updateFile('word/commentsExtended.xml', Buffer.from(commentsExtXml, 'utf-8'));
471
+ }
472
+ else {
473
+ zip.addFile('word/commentsExtended.xml', Buffer.from(commentsExtXml, 'utf-8'));
474
+ }
475
+ // Create commentsIds.xml (Word 2016+)
476
+ const commentsIdsXml = createCommentsIdsXml(includedComments);
477
+ if (zip.getEntry('word/commentsIds.xml')) {
478
+ zip.updateFile('word/commentsIds.xml', Buffer.from(commentsIdsXml, 'utf-8'));
479
+ }
480
+ else {
481
+ zip.addFile('word/commentsIds.xml', Buffer.from(commentsIdsXml, 'utf-8'));
482
+ }
483
+ // Create commentsExtensible.xml (Word 2018+)
484
+ const commentsExtensibleXml = createCommentsExtensibleXml(includedComments);
485
+ if (zip.getEntry('word/commentsExtensible.xml')) {
486
+ zip.updateFile('word/commentsExtensible.xml', Buffer.from(commentsExtensibleXml, 'utf-8'));
487
+ }
488
+ else {
489
+ zip.addFile('word/commentsExtensible.xml', Buffer.from(commentsExtensibleXml, 'utf-8'));
490
+ }
491
+ // Create people.xml (author definitions with Windows Live IDs)
492
+ const peopleXml = createPeopleXml(includedComments);
493
+ if (zip.getEntry('word/people.xml')) {
494
+ zip.updateFile('word/people.xml', Buffer.from(peopleXml, 'utf-8'));
495
+ }
496
+ else {
497
+ zip.addFile('word/people.xml', Buffer.from(peopleXml, 'utf-8'));
498
+ }
499
+ // Update [Content_Types].xml
500
+ const contentTypesEntry = zip.getEntry('[Content_Types].xml');
501
+ if (contentTypesEntry) {
502
+ let contentTypes = zip.readAsText(contentTypesEntry);
503
+ if (!contentTypes.includes('comments.xml')) {
504
+ const insertPoint = contentTypes.lastIndexOf('</Types>');
505
+ contentTypes = contentTypes.slice(0, insertPoint) +
506
+ '<Override PartName="/word/comments.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml"/>\n' +
507
+ contentTypes.slice(insertPoint);
508
+ }
509
+ if (!contentTypes.includes('commentsExtended.xml')) {
510
+ const insertPoint = contentTypes.lastIndexOf('</Types>');
511
+ contentTypes = contentTypes.slice(0, insertPoint) +
512
+ '<Override PartName="/word/commentsExtended.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtended+xml"/>\n' +
513
+ contentTypes.slice(insertPoint);
514
+ }
515
+ if (!contentTypes.includes('commentsIds.xml')) {
516
+ const insertPoint = contentTypes.lastIndexOf('</Types>');
517
+ contentTypes = contentTypes.slice(0, insertPoint) +
518
+ '<Override PartName="/word/commentsIds.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.commentsIds+xml"/>\n' +
519
+ contentTypes.slice(insertPoint);
520
+ }
521
+ if (!contentTypes.includes('commentsExtensible.xml')) {
522
+ const insertPoint = contentTypes.lastIndexOf('</Types>');
523
+ contentTypes = contentTypes.slice(0, insertPoint) +
524
+ '<Override PartName="/word/commentsExtensible.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtensible+xml"/>\n' +
525
+ contentTypes.slice(insertPoint);
526
+ }
527
+ if (!contentTypes.includes('people.xml')) {
528
+ const insertPoint = contentTypes.lastIndexOf('</Types>');
529
+ contentTypes = contentTypes.slice(0, insertPoint) +
530
+ '<Override PartName="/word/people.xml" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.people+xml"/>\n' +
531
+ contentTypes.slice(insertPoint);
532
+ }
533
+ zip.updateFile('[Content_Types].xml', Buffer.from(contentTypes, 'utf-8'));
534
+ }
535
+ // Update relationships
536
+ const relsEntry = zip.getEntry('word/_rels/document.xml.rels');
537
+ if (relsEntry) {
538
+ let rels = zip.readAsText(relsEntry);
539
+ const rIdMatches = rels.match(/rId(\d+)/g) || [];
540
+ const maxId = rIdMatches.reduce((max, r) => Math.max(max, parseInt(r.replace('rId', ''))), 0);
541
+ if (!rels.includes('comments.xml')) {
542
+ const insertPoint = rels.lastIndexOf('</Relationships>');
543
+ rels = rels.slice(0, insertPoint) +
544
+ `<Relationship Id="rId${maxId + 1}" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments" Target="comments.xml"/>\n` +
545
+ rels.slice(insertPoint);
546
+ }
547
+ if (!rels.includes('commentsExtended.xml')) {
548
+ const insertPoint = rels.lastIndexOf('</Relationships>');
549
+ rels = rels.slice(0, insertPoint) +
550
+ `<Relationship Id="rId${maxId + 2}" Type="http://schemas.microsoft.com/office/2011/relationships/commentsExtended" Target="commentsExtended.xml"/>\n` +
551
+ rels.slice(insertPoint);
552
+ }
553
+ if (!rels.includes('commentsIds.xml')) {
554
+ const insertPoint = rels.lastIndexOf('</Relationships>');
555
+ rels = rels.slice(0, insertPoint) +
556
+ `<Relationship Id="rId${maxId + 3}" Type="http://schemas.microsoft.com/office/2016/09/relationships/commentsIds" Target="commentsIds.xml"/>\n` +
557
+ rels.slice(insertPoint);
558
+ }
559
+ if (!rels.includes('commentsExtensible.xml')) {
560
+ const insertPoint = rels.lastIndexOf('</Relationships>');
561
+ rels = rels.slice(0, insertPoint) +
562
+ `<Relationship Id="rId${maxId + 4}" Type="http://schemas.microsoft.com/office/2018/08/relationships/commentsExtensible" Target="commentsExtensible.xml"/>\n` +
563
+ rels.slice(insertPoint);
564
+ }
565
+ if (!rels.includes('people.xml')) {
566
+ const insertPoint = rels.lastIndexOf('</Relationships>');
567
+ rels = rels.slice(0, insertPoint) +
568
+ `<Relationship Id="rId${maxId + 5}" Type="http://schemas.microsoft.com/office/2011/relationships/people" Target="people.xml"/>\n` +
569
+ rels.slice(insertPoint);
570
+ }
571
+ zip.updateFile('word/_rels/document.xml.rels', Buffer.from(rels, 'utf-8'));
572
+ }
573
+ zip.writeZip(outputPath);
574
+ const parentCount = includedComments.filter(c => !c.isReply).length;
575
+ const replyCount = includedComments.filter(c => c.isReply).length;
576
+ return {
577
+ success: true,
578
+ commentCount: parentCount,
579
+ replyCount: replyCount,
580
+ skippedComments: comments.length - includedComments.length,
581
+ };
582
+ }
583
+ catch (err) {
584
+ return { success: false, commentCount: 0, skippedComments: 0, error: err.message };
585
+ }
586
+ }
587
+ //# sourceMappingURL=wordcomments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wordcomments.js","sourceRoot":"","sources":["../../lib/wordcomments.ts"],"names":[],"mappings":"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"}