@usejunior/docx-core 0.0.1 → 0.1.1

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 (252) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +86 -28
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/atomizer.d.ts +218 -0
  5. package/dist/atomizer.d.ts.map +1 -0
  6. package/dist/atomizer.js +856 -0
  7. package/dist/atomizer.js.map +1 -0
  8. package/dist/baselines/atomizer/atomLcs.d.ts +96 -0
  9. package/dist/baselines/atomizer/atomLcs.d.ts.map +1 -0
  10. package/dist/baselines/atomizer/atomLcs.js +347 -0
  11. package/dist/baselines/atomizer/atomLcs.js.map +1 -0
  12. package/dist/baselines/atomizer/debug.d.ts +41 -0
  13. package/dist/baselines/atomizer/debug.d.ts.map +1 -0
  14. package/dist/baselines/atomizer/debug.js +85 -0
  15. package/dist/baselines/atomizer/debug.js.map +1 -0
  16. package/dist/baselines/atomizer/documentReconstructor.d.ts +64 -0
  17. package/dist/baselines/atomizer/documentReconstructor.d.ts.map +1 -0
  18. package/dist/baselines/atomizer/documentReconstructor.js +939 -0
  19. package/dist/baselines/atomizer/documentReconstructor.js.map +1 -0
  20. package/dist/baselines/atomizer/hierarchicalLcs.d.ts +111 -0
  21. package/dist/baselines/atomizer/hierarchicalLcs.d.ts.map +1 -0
  22. package/dist/baselines/atomizer/hierarchicalLcs.js +469 -0
  23. package/dist/baselines/atomizer/hierarchicalLcs.js.map +1 -0
  24. package/dist/baselines/atomizer/inPlaceModifier.d.ts +183 -0
  25. package/dist/baselines/atomizer/inPlaceModifier.d.ts.map +1 -0
  26. package/dist/baselines/atomizer/inPlaceModifier.js +1600 -0
  27. package/dist/baselines/atomizer/inPlaceModifier.js.map +1 -0
  28. package/dist/baselines/atomizer/numberingIntegration.d.ts +59 -0
  29. package/dist/baselines/atomizer/numberingIntegration.d.ts.map +1 -0
  30. package/dist/baselines/atomizer/numberingIntegration.js +209 -0
  31. package/dist/baselines/atomizer/numberingIntegration.js.map +1 -0
  32. package/dist/baselines/atomizer/pipeline.d.ts +65 -0
  33. package/dist/baselines/atomizer/pipeline.d.ts.map +1 -0
  34. package/dist/baselines/atomizer/pipeline.js +510 -0
  35. package/dist/baselines/atomizer/pipeline.js.map +1 -0
  36. package/dist/baselines/atomizer/premergeRuns.d.ts +26 -0
  37. package/dist/baselines/atomizer/premergeRuns.d.ts.map +1 -0
  38. package/dist/baselines/atomizer/premergeRuns.js +150 -0
  39. package/dist/baselines/atomizer/premergeRuns.js.map +1 -0
  40. package/dist/baselines/atomizer/trackChangesAcceptor.d.ts +63 -0
  41. package/dist/baselines/atomizer/trackChangesAcceptor.d.ts.map +1 -0
  42. package/dist/baselines/atomizer/trackChangesAcceptor.js +254 -0
  43. package/dist/baselines/atomizer/trackChangesAcceptor.js.map +1 -0
  44. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts +64 -0
  45. package/dist/baselines/atomizer/trackChangesAcceptorAst.d.ts.map +1 -0
  46. package/dist/baselines/atomizer/trackChangesAcceptorAst.js +586 -0
  47. package/dist/baselines/atomizer/trackChangesAcceptorAst.js.map +1 -0
  48. package/dist/baselines/atomizer/xmlToWmlElement.d.ts +65 -0
  49. package/dist/baselines/atomizer/xmlToWmlElement.d.ts.map +1 -0
  50. package/dist/baselines/atomizer/xmlToWmlElement.js +95 -0
  51. package/dist/baselines/atomizer/xmlToWmlElement.js.map +1 -0
  52. package/dist/baselines/diffmatch/documentBuilder.d.ts +44 -0
  53. package/dist/baselines/diffmatch/documentBuilder.d.ts.map +1 -0
  54. package/dist/baselines/diffmatch/documentBuilder.js +227 -0
  55. package/dist/baselines/diffmatch/documentBuilder.js.map +1 -0
  56. package/dist/baselines/diffmatch/paragraphAlignment.d.ts +75 -0
  57. package/dist/baselines/diffmatch/paragraphAlignment.d.ts.map +1 -0
  58. package/dist/baselines/diffmatch/paragraphAlignment.js +206 -0
  59. package/dist/baselines/diffmatch/paragraphAlignment.js.map +1 -0
  60. package/dist/baselines/diffmatch/pipeline.d.ts +33 -0
  61. package/dist/baselines/diffmatch/pipeline.d.ts.map +1 -0
  62. package/dist/baselines/diffmatch/pipeline.js +84 -0
  63. package/dist/baselines/diffmatch/pipeline.js.map +1 -0
  64. package/dist/baselines/diffmatch/runDiff.d.ts +53 -0
  65. package/dist/baselines/diffmatch/runDiff.d.ts.map +1 -0
  66. package/dist/baselines/diffmatch/runDiff.js +253 -0
  67. package/dist/baselines/diffmatch/runDiff.js.map +1 -0
  68. package/dist/baselines/diffmatch/trackChangesRenderer.d.ts +64 -0
  69. package/dist/baselines/diffmatch/trackChangesRenderer.d.ts.map +1 -0
  70. package/dist/baselines/diffmatch/trackChangesRenderer.js +178 -0
  71. package/dist/baselines/diffmatch/trackChangesRenderer.js.map +1 -0
  72. package/dist/baselines/diffmatch/xmlParser.d.ts +45 -0
  73. package/dist/baselines/diffmatch/xmlParser.d.ts.map +1 -0
  74. package/dist/baselines/diffmatch/xmlParser.js +344 -0
  75. package/dist/baselines/diffmatch/xmlParser.js.map +1 -0
  76. package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts +51 -0
  77. package/dist/baselines/wmlcomparer/DocxodusWasm.d.ts.map +1 -0
  78. package/dist/baselines/wmlcomparer/DocxodusWasm.js +83 -0
  79. package/dist/baselines/wmlcomparer/DocxodusWasm.js.map +1 -0
  80. package/dist/baselines/wmlcomparer/DotnetCli.d.ts +40 -0
  81. package/dist/baselines/wmlcomparer/DotnetCli.d.ts.map +1 -0
  82. package/dist/baselines/wmlcomparer/DotnetCli.js +135 -0
  83. package/dist/baselines/wmlcomparer/DotnetCli.js.map +1 -0
  84. package/dist/benchmark/metrics.d.ts +72 -0
  85. package/dist/benchmark/metrics.d.ts.map +1 -0
  86. package/dist/benchmark/metrics.js +45 -0
  87. package/dist/benchmark/metrics.js.map +1 -0
  88. package/dist/benchmark/reporter.d.ts +23 -0
  89. package/dist/benchmark/reporter.d.ts.map +1 -0
  90. package/dist/benchmark/reporter.js +147 -0
  91. package/dist/benchmark/reporter.js.map +1 -0
  92. package/dist/benchmark/runner.d.ts +30 -0
  93. package/dist/benchmark/runner.d.ts.map +1 -0
  94. package/dist/benchmark/runner.js +233 -0
  95. package/dist/benchmark/runner.js.map +1 -0
  96. package/dist/cli/compare-two.d.ts +28 -0
  97. package/dist/cli/compare-two.d.ts.map +1 -0
  98. package/dist/cli/compare-two.js +110 -0
  99. package/dist/cli/compare-two.js.map +1 -0
  100. package/dist/cli/index.d.ts +3 -0
  101. package/dist/cli/index.d.ts.map +1 -0
  102. package/dist/cli/index.js +21 -0
  103. package/dist/cli/index.js.map +1 -0
  104. package/dist/core-types.d.ts +296 -0
  105. package/dist/core-types.d.ts.map +1 -0
  106. package/dist/core-types.js +122 -0
  107. package/dist/core-types.js.map +1 -0
  108. package/dist/footnotes.d.ts +144 -0
  109. package/dist/footnotes.d.ts.map +1 -0
  110. package/dist/footnotes.js +291 -0
  111. package/dist/footnotes.js.map +1 -0
  112. package/dist/format-detection.d.ts +120 -0
  113. package/dist/format-detection.d.ts.map +1 -0
  114. package/dist/format-detection.js +338 -0
  115. package/dist/format-detection.js.map +1 -0
  116. package/dist/index.d.ts +177 -0
  117. package/dist/index.d.ts.map +1 -0
  118. package/dist/index.js +55 -0
  119. package/dist/index.js.map +1 -0
  120. package/dist/integration/output-artifacts.d.ts +6 -0
  121. package/dist/integration/output-artifacts.d.ts.map +1 -0
  122. package/dist/integration/output-artifacts.js +30 -0
  123. package/dist/integration/output-artifacts.js.map +1 -0
  124. package/dist/move-detection.d.ts +211 -0
  125. package/dist/move-detection.d.ts.map +1 -0
  126. package/dist/move-detection.js +391 -0
  127. package/dist/move-detection.js.map +1 -0
  128. package/dist/numbering.d.ts +136 -0
  129. package/dist/numbering.d.ts.map +1 -0
  130. package/dist/numbering.js +446 -0
  131. package/dist/numbering.js.map +1 -0
  132. package/dist/primitives/accept_changes.d.ts +30 -0
  133. package/dist/primitives/accept_changes.d.ts.map +1 -0
  134. package/dist/primitives/accept_changes.js +241 -0
  135. package/dist/primitives/accept_changes.js.map +1 -0
  136. package/dist/primitives/bookmarks.d.ts +12 -0
  137. package/dist/primitives/bookmarks.d.ts.map +1 -0
  138. package/dist/primitives/bookmarks.js +248 -0
  139. package/dist/primitives/bookmarks.js.map +1 -0
  140. package/dist/primitives/comments.d.ts +88 -0
  141. package/dist/primitives/comments.d.ts.map +1 -0
  142. package/dist/primitives/comments.js +703 -0
  143. package/dist/primitives/comments.js.map +1 -0
  144. package/dist/primitives/document.d.ts +168 -0
  145. package/dist/primitives/document.d.ts.map +1 -0
  146. package/dist/primitives/document.js +532 -0
  147. package/dist/primitives/document.js.map +1 -0
  148. package/dist/primitives/document_view.d.ts +93 -0
  149. package/dist/primitives/document_view.d.ts.map +1 -0
  150. package/dist/primitives/document_view.js +722 -0
  151. package/dist/primitives/document_view.js.map +1 -0
  152. package/dist/primitives/dom-helpers.d.ts +94 -0
  153. package/dist/primitives/dom-helpers.d.ts.map +1 -0
  154. package/dist/primitives/dom-helpers.js +219 -0
  155. package/dist/primitives/dom-helpers.js.map +1 -0
  156. package/dist/primitives/errors.d.ts +7 -0
  157. package/dist/primitives/errors.d.ts.map +1 -0
  158. package/dist/primitives/errors.js +10 -0
  159. package/dist/primitives/errors.js.map +1 -0
  160. package/dist/primitives/extract_revisions.d.ts +50 -0
  161. package/dist/primitives/extract_revisions.d.ts.map +1 -0
  162. package/dist/primitives/extract_revisions.js +340 -0
  163. package/dist/primitives/extract_revisions.js.map +1 -0
  164. package/dist/primitives/footnotes.d.ts +37 -0
  165. package/dist/primitives/footnotes.d.ts.map +1 -0
  166. package/dist/primitives/footnotes.js +552 -0
  167. package/dist/primitives/footnotes.js.map +1 -0
  168. package/dist/primitives/formatting_tags.d.ts +30 -0
  169. package/dist/primitives/formatting_tags.d.ts.map +1 -0
  170. package/dist/primitives/formatting_tags.js +217 -0
  171. package/dist/primitives/formatting_tags.js.map +1 -0
  172. package/dist/primitives/index.d.ts +26 -0
  173. package/dist/primitives/index.d.ts.map +1 -0
  174. package/dist/primitives/index.js +26 -0
  175. package/dist/primitives/index.js.map +1 -0
  176. package/dist/primitives/layout.d.ts +53 -0
  177. package/dist/primitives/layout.d.ts.map +1 -0
  178. package/dist/primitives/layout.js +178 -0
  179. package/dist/primitives/layout.js.map +1 -0
  180. package/dist/primitives/list_labels.d.ts +19 -0
  181. package/dist/primitives/list_labels.d.ts.map +1 -0
  182. package/dist/primitives/list_labels.js +57 -0
  183. package/dist/primitives/list_labels.js.map +1 -0
  184. package/dist/primitives/matching.d.ts +17 -0
  185. package/dist/primitives/matching.d.ts.map +1 -0
  186. package/dist/primitives/matching.js +144 -0
  187. package/dist/primitives/matching.js.map +1 -0
  188. package/dist/primitives/merge_runs.d.ts +23 -0
  189. package/dist/primitives/merge_runs.d.ts.map +1 -0
  190. package/dist/primitives/merge_runs.js +195 -0
  191. package/dist/primitives/merge_runs.js.map +1 -0
  192. package/dist/primitives/namespaces.d.ts +90 -0
  193. package/dist/primitives/namespaces.d.ts.map +1 -0
  194. package/dist/primitives/namespaces.js +107 -0
  195. package/dist/primitives/namespaces.js.map +1 -0
  196. package/dist/primitives/numbering.d.ts +27 -0
  197. package/dist/primitives/numbering.d.ts.map +1 -0
  198. package/dist/primitives/numbering.js +182 -0
  199. package/dist/primitives/numbering.js.map +1 -0
  200. package/dist/primitives/prevent_double_elevation.d.ts +18 -0
  201. package/dist/primitives/prevent_double_elevation.d.ts.map +1 -0
  202. package/dist/primitives/prevent_double_elevation.js +190 -0
  203. package/dist/primitives/prevent_double_elevation.js.map +1 -0
  204. package/dist/primitives/reject_changes.d.ts +27 -0
  205. package/dist/primitives/reject_changes.d.ts.map +1 -0
  206. package/dist/primitives/reject_changes.js +371 -0
  207. package/dist/primitives/reject_changes.js.map +1 -0
  208. package/dist/primitives/relationships.d.ts +7 -0
  209. package/dist/primitives/relationships.d.ts.map +1 -0
  210. package/dist/primitives/relationships.js +24 -0
  211. package/dist/primitives/relationships.js.map +1 -0
  212. package/dist/primitives/semantic_tags.d.ts +32 -0
  213. package/dist/primitives/semantic_tags.d.ts.map +1 -0
  214. package/dist/primitives/semantic_tags.js +139 -0
  215. package/dist/primitives/semantic_tags.js.map +1 -0
  216. package/dist/primitives/simplify_redlines.d.ts +19 -0
  217. package/dist/primitives/simplify_redlines.d.ts.map +1 -0
  218. package/dist/primitives/simplify_redlines.js +94 -0
  219. package/dist/primitives/simplify_redlines.js.map +1 -0
  220. package/dist/primitives/styles.d.ts +36 -0
  221. package/dist/primitives/styles.d.ts.map +1 -0
  222. package/dist/primitives/styles.js +190 -0
  223. package/dist/primitives/styles.js.map +1 -0
  224. package/dist/primitives/text.d.ts +27 -0
  225. package/dist/primitives/text.d.ts.map +1 -0
  226. package/dist/primitives/text.js +416 -0
  227. package/dist/primitives/text.js.map +1 -0
  228. package/dist/primitives/validate_document.d.ts +24 -0
  229. package/dist/primitives/validate_document.d.ts.map +1 -0
  230. package/dist/primitives/validate_document.js +147 -0
  231. package/dist/primitives/validate_document.js.map +1 -0
  232. package/dist/primitives/xml.d.ts +5 -0
  233. package/dist/primitives/xml.d.ts.map +1 -0
  234. package/dist/primitives/xml.js +19 -0
  235. package/dist/primitives/xml.js.map +1 -0
  236. package/dist/primitives/zip.d.ts +25 -0
  237. package/dist/primitives/zip.d.ts.map +1 -0
  238. package/dist/primitives/zip.js +78 -0
  239. package/dist/primitives/zip.js.map +1 -0
  240. package/dist/shared/docx/DocxArchive.d.ts +94 -0
  241. package/dist/shared/docx/DocxArchive.d.ts.map +1 -0
  242. package/dist/shared/docx/DocxArchive.js +169 -0
  243. package/dist/shared/docx/DocxArchive.js.map +1 -0
  244. package/dist/shared/ooxml/namespaces.d.ts +149 -0
  245. package/dist/shared/ooxml/namespaces.d.ts.map +1 -0
  246. package/dist/shared/ooxml/namespaces.js +224 -0
  247. package/dist/shared/ooxml/namespaces.js.map +1 -0
  248. package/dist/shared/ooxml/types.d.ts +136 -0
  249. package/dist/shared/ooxml/types.d.ts.map +1 -0
  250. package/dist/shared/ooxml/types.js +7 -0
  251. package/dist/shared/ooxml/types.js.map +1 -0
  252. package/package.json +63 -6
@@ -0,0 +1,291 @@
1
+ /**
2
+ * Footnote Numbering Module
3
+ *
4
+ * Handles sequential footnote/endnote numbering by document order.
5
+ *
6
+ * Per ECMA-376, w:id on footnoteReference is a reference identifier, NOT the
7
+ * display number. Display numbers are sequential based on document order.
8
+ *
9
+ * @example
10
+ * Document has 91 footnotes with XML IDs 2-92 (IDs 0, 1 are reserved):
11
+ * - Incorrect: Display as 2, 3, 4, ..., 92
12
+ * - Correct: Display as 1, 2, 3, ..., 91
13
+ */
14
+ import { RESERVED_FOOTNOTE_IDS, } from './core-types.js';
15
+ import { childElements, getLeafText } from './primitives/index.js';
16
+ // =============================================================================
17
+ // Footnote Reference Finding
18
+ // =============================================================================
19
+ /**
20
+ * Find all footnote or endnote references in document order.
21
+ *
22
+ * Recursively traverses the document tree to find references in reading order.
23
+ *
24
+ * @param element - The root element to search from
25
+ * @param tagName - The reference tag to find ('w:footnoteReference' or 'w:endnoteReference')
26
+ * @returns Array of reference elements in document order
27
+ */
28
+ export function findReferencesInOrder(element, tagName) {
29
+ const refs = [];
30
+ function traverse(node) {
31
+ if (node.tagName === tagName) {
32
+ refs.push(node);
33
+ }
34
+ for (const child of childElements(node)) {
35
+ traverse(child);
36
+ }
37
+ }
38
+ traverse(element);
39
+ return refs;
40
+ }
41
+ /**
42
+ * Check if a footnote/endnote ID is reserved.
43
+ *
44
+ * IDs 0 and 1 are reserved for separator types per ECMA-376.
45
+ *
46
+ * @param xmlId - The XML ID to check
47
+ * @returns True if this is a reserved ID
48
+ */
49
+ export function isReservedId(xmlId) {
50
+ return (xmlId === RESERVED_FOOTNOTE_IDS.SEPARATOR ||
51
+ xmlId === RESERVED_FOOTNOTE_IDS.CONTINUATION_SEPARATOR);
52
+ }
53
+ // =============================================================================
54
+ // FootnoteNumberingTracker Class
55
+ // =============================================================================
56
+ /**
57
+ * Tracks sequential footnote/endnote numbering by document order.
58
+ *
59
+ * Scans the document for footnote/endnote references and builds a mapping
60
+ * from XML IDs to display numbers.
61
+ *
62
+ * @example
63
+ * const tracker = new FootnoteNumberingTracker(documentRoot);
64
+ * const displayNum = tracker.getDisplayNumber('42'); // Returns 1 if '42' is the first footnote
65
+ */
66
+ export class FootnoteNumberingTracker {
67
+ footnoteIdToDisplayNumber = new Map();
68
+ endnoteIdToDisplayNumber = new Map();
69
+ footnoteCustomMarks = new Set();
70
+ endnoteCustomMarks = new Set();
71
+ /**
72
+ * Create a new tracker by scanning the document.
73
+ *
74
+ * @param documentRoot - The root element of the main document (w:document or w:body)
75
+ */
76
+ constructor(documentRoot) {
77
+ this.scanDocument(documentRoot);
78
+ }
79
+ /**
80
+ * Scan the document for footnote and endnote references.
81
+ */
82
+ scanDocument(documentRoot) {
83
+ // Scan for footnote references
84
+ const footnoteRefs = findReferencesInOrder(documentRoot, 'w:footnoteReference');
85
+ this.buildNumbering(footnoteRefs, this.footnoteIdToDisplayNumber, this.footnoteCustomMarks);
86
+ // Scan for endnote references
87
+ const endnoteRefs = findReferencesInOrder(documentRoot, 'w:endnoteReference');
88
+ this.buildNumbering(endnoteRefs, this.endnoteIdToDisplayNumber, this.endnoteCustomMarks);
89
+ }
90
+ /**
91
+ * Build the ID to display number mapping.
92
+ */
93
+ buildNumbering(refs, idToNumber, customMarks) {
94
+ let displayNum = 1;
95
+ for (const ref of refs) {
96
+ const xmlId = ref.getAttribute('w:id');
97
+ if (!xmlId)
98
+ continue;
99
+ // Skip reserved IDs
100
+ if (isReservedId(xmlId))
101
+ continue;
102
+ // Check for custom mark
103
+ const hasCustomMark = ref.getAttribute('w:customMarkFollows') === '1' ||
104
+ ref.getAttribute('w:customMarkFollows') === 'true';
105
+ if (hasCustomMark) {
106
+ customMarks.add(xmlId);
107
+ // Custom marks don't get automatic numbers but still reserve a slot
108
+ // Some implementations skip numbering, others don't - we follow Word behavior
109
+ }
110
+ // Only assign number if not already seen (handles duplicate references)
111
+ if (!idToNumber.has(xmlId)) {
112
+ if (!hasCustomMark) {
113
+ idToNumber.set(xmlId, displayNum);
114
+ displayNum++;
115
+ }
116
+ }
117
+ }
118
+ }
119
+ /**
120
+ * Get the display number for a footnote by its XML ID.
121
+ *
122
+ * @param xmlId - The XML ID (w:id attribute)
123
+ * @returns The display number, or undefined if not found or uses custom mark
124
+ */
125
+ getFootnoteDisplayNumber(xmlId) {
126
+ return this.footnoteIdToDisplayNumber.get(xmlId);
127
+ }
128
+ /**
129
+ * Get the display number for an endnote by its XML ID.
130
+ *
131
+ * @param xmlId - The XML ID (w:id attribute)
132
+ * @returns The display number, or undefined if not found or uses custom mark
133
+ */
134
+ getEndnoteDisplayNumber(xmlId) {
135
+ return this.endnoteIdToDisplayNumber.get(xmlId);
136
+ }
137
+ /**
138
+ * Get the display number for a footnote or endnote by its XML ID.
139
+ *
140
+ * Convenience method that checks both footnotes and endnotes.
141
+ *
142
+ * @param xmlId - The XML ID
143
+ * @returns The display number, or undefined if not found
144
+ */
145
+ getDisplayNumber(xmlId) {
146
+ return (this.footnoteIdToDisplayNumber.get(xmlId) ??
147
+ this.endnoteIdToDisplayNumber.get(xmlId));
148
+ }
149
+ /**
150
+ * Check if a footnote uses a custom mark.
151
+ *
152
+ * @param xmlId - The XML ID
153
+ * @returns True if this footnote has w:customMarkFollows
154
+ */
155
+ hasFootnoteCustomMark(xmlId) {
156
+ return this.footnoteCustomMarks.has(xmlId);
157
+ }
158
+ /**
159
+ * Check if an endnote uses a custom mark.
160
+ *
161
+ * @param xmlId - The XML ID
162
+ * @returns True if this endnote has w:customMarkFollows
163
+ */
164
+ hasEndnoteCustomMark(xmlId) {
165
+ return this.endnoteCustomMarks.has(xmlId);
166
+ }
167
+ /**
168
+ * Get the total number of footnotes (excluding custom marks).
169
+ */
170
+ getFootnoteCount() {
171
+ return this.footnoteIdToDisplayNumber.size;
172
+ }
173
+ /**
174
+ * Get the total number of endnotes (excluding custom marks).
175
+ */
176
+ getEndnoteCount() {
177
+ return this.endnoteIdToDisplayNumber.size;
178
+ }
179
+ /**
180
+ * Get all footnote references as structured data.
181
+ *
182
+ * @returns Array of FootnoteReference objects
183
+ */
184
+ getFootnoteReferences() {
185
+ const refs = [];
186
+ for (const [xmlId, displayNumber] of this.footnoteIdToDisplayNumber) {
187
+ refs.push({
188
+ xmlId,
189
+ displayNumber,
190
+ customMarkFollows: this.footnoteCustomMarks.has(xmlId),
191
+ });
192
+ }
193
+ // Add custom mark footnotes (no display number)
194
+ for (const xmlId of this.footnoteCustomMarks) {
195
+ if (!this.footnoteIdToDisplayNumber.has(xmlId)) {
196
+ refs.push({
197
+ xmlId,
198
+ customMarkFollows: true,
199
+ });
200
+ }
201
+ }
202
+ return refs;
203
+ }
204
+ /**
205
+ * Get all endnote references as structured data.
206
+ *
207
+ * @returns Array of FootnoteReference objects
208
+ */
209
+ getEndnoteReferences() {
210
+ const refs = [];
211
+ for (const [xmlId, displayNumber] of this.endnoteIdToDisplayNumber) {
212
+ refs.push({
213
+ xmlId,
214
+ displayNumber,
215
+ customMarkFollows: this.endnoteCustomMarks.has(xmlId),
216
+ });
217
+ }
218
+ // Add custom mark endnotes (no display number)
219
+ for (const xmlId of this.endnoteCustomMarks) {
220
+ if (!this.endnoteIdToDisplayNumber.has(xmlId)) {
221
+ refs.push({
222
+ xmlId,
223
+ customMarkFollows: true,
224
+ });
225
+ }
226
+ }
227
+ return refs;
228
+ }
229
+ }
230
+ // =============================================================================
231
+ // Footnote Content Extraction
232
+ // =============================================================================
233
+ /**
234
+ * Find a footnote element by its ID in the footnotes.xml part.
235
+ *
236
+ * @param footnotesRoot - The root of the footnotes.xml document
237
+ * @param xmlId - The XML ID to find
238
+ * @returns The w:footnote element, or undefined if not found
239
+ */
240
+ export function findFootnoteById(footnotesRoot, xmlId) {
241
+ if (footnotesRoot.tagName !== 'w:footnotes') {
242
+ return undefined;
243
+ }
244
+ for (const child of childElements(footnotesRoot)) {
245
+ if (child.tagName === 'w:footnote' && child.getAttribute('w:id') === xmlId) {
246
+ return child;
247
+ }
248
+ }
249
+ return undefined;
250
+ }
251
+ /**
252
+ * Find an endnote element by its ID in the endnotes.xml part.
253
+ *
254
+ * @param endnotesRoot - The root of the endnotes.xml document
255
+ * @param xmlId - The XML ID to find
256
+ * @returns The w:endnote element, or undefined if not found
257
+ */
258
+ export function findEndnoteById(endnotesRoot, xmlId) {
259
+ if (endnotesRoot.tagName !== 'w:endnotes') {
260
+ return undefined;
261
+ }
262
+ for (const child of childElements(endnotesRoot)) {
263
+ if (child.tagName === 'w:endnote' && child.getAttribute('w:id') === xmlId) {
264
+ return child;
265
+ }
266
+ }
267
+ return undefined;
268
+ }
269
+ /**
270
+ * Extract plain text content from a footnote/endnote element.
271
+ *
272
+ * @param noteElement - The w:footnote or w:endnote element
273
+ * @returns Plain text content
274
+ */
275
+ export function extractNoteText(noteElement) {
276
+ const texts = [];
277
+ function traverse(node) {
278
+ if (node.tagName === 'w:t') {
279
+ const text = getLeafText(node) ?? '';
280
+ if (text) {
281
+ texts.push(text);
282
+ }
283
+ }
284
+ for (const child of childElements(node)) {
285
+ traverse(child);
286
+ }
287
+ }
288
+ traverse(noteElement);
289
+ return texts.join('');
290
+ }
291
+ //# sourceMappingURL=footnotes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"footnotes.js","sourceRoot":"","sources":["../src/footnotes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * Format Change Detection Module
3
+ *
4
+ * Detects formatting changes (bold, italic, font size, etc.) between
5
+ * documents after LCS comparison. Runs on atoms marked as Equal to
6
+ * identify text that matches but has different formatting.
7
+ *
8
+ * Pipeline position:
9
+ * LCS() → FlattenToAtomList() → detectMovesInAtomList() → detectFormatChangesInAtomList() → CoalesceRecurse()
10
+ *
11
+ * @see design.md Decision 10: Format Change Detection as Post-LCS Phase
12
+ */
13
+ import { ComparisonUnitAtom, FormatChangeInfo, FormatDetectionSettings } from './core-types.js';
14
+ /**
15
+ * Extract run properties (w:rPr) from an atom's ancestor elements.
16
+ *
17
+ * Finds the w:r (run) element in ancestors and extracts its w:rPr child.
18
+ *
19
+ * @param atom - The atom to extract properties from
20
+ * @returns The w:rPr element, or null if not found
21
+ *
22
+ * @example
23
+ * // For an atom inside <w:r><w:rPr><w:b/></w:rPr><w:t>text</w:t></w:r>
24
+ * // Returns the <w:rPr><w:b/></w:rPr> element
25
+ */
26
+ export declare function getRunPropertiesFromAtom(atom: ComparisonUnitAtom): Element | null;
27
+ /**
28
+ * Lightweight property descriptor for normalized comparison.
29
+ * These are NOT DOM Elements — they're ephemeral comparison objects.
30
+ */
31
+ interface NormalizedProperty {
32
+ tagName: string;
33
+ attrs: [string, string][];
34
+ text?: string;
35
+ }
36
+ interface NormalizedRPr {
37
+ children: NormalizedProperty[];
38
+ }
39
+ /**
40
+ * Check if two run properties are equal after normalization.
41
+ */
42
+ export declare function areRunPropertiesEqual(rPr1: Element | null, rPr2: Element | null): boolean;
43
+ export { areRunPropertiesEqual as areNormalizedRunPropertiesEqual };
44
+ /**
45
+ * Get the list of property names that changed between two run properties.
46
+ *
47
+ * Returns friendly names (e.g., "bold", "italic") when available,
48
+ * otherwise returns the OOXML tag name.
49
+ *
50
+ * @param oldRPr - Old run properties element (or null)
51
+ * @param newRPr - New run properties element (or null)
52
+ * @returns Array of changed property names
53
+ */
54
+ export declare function getChangedPropertyNames(oldRPr: Element | null, newRPr: Element | null): string[];
55
+ /**
56
+ * Categorize changed properties into added, removed, and modified.
57
+ *
58
+ * @param oldRPr - Old run properties element (or null)
59
+ * @param newRPr - New run properties element (or null)
60
+ * @returns Object with added, removed, and changed arrays
61
+ */
62
+ export declare function categorizePropertyChanges(oldRPr: Element | null, newRPr: Element | null): {
63
+ added: string[];
64
+ removed: string[];
65
+ changed: string[];
66
+ };
67
+ /**
68
+ * Detect format changes in a flat list of atoms.
69
+ *
70
+ * Runs after LCS and move detection to identify Equal atoms where the text
71
+ * matches but formatting differs. Updates atoms in place with format change status.
72
+ *
73
+ * @param atoms - The atom list to process (modified in place)
74
+ * @param settings - Format detection settings (optional, uses defaults)
75
+ */
76
+ export declare function detectFormatChangesInAtomList(atoms: ComparisonUnitAtom[], settings?: FormatDetectionSettings): void;
77
+ /**
78
+ * Options for generating format change markup.
79
+ */
80
+ export interface FormatChangeMarkupOptions {
81
+ /** Author name for revision tracking */
82
+ author: string;
83
+ /** Timestamp for revisions */
84
+ dateTime: Date;
85
+ /** ID for the w:rPrChange element */
86
+ id: number;
87
+ }
88
+ /**
89
+ * Merge format change markup into a run's existing rPr element.
90
+ *
91
+ * Adds the w:rPrChange element as the last child of w:rPr.
92
+ *
93
+ * @param runElement - The w:r element to modify
94
+ * @param rPrChange - The w:rPrChange element to insert
95
+ */
96
+ export declare function mergeFormatChangeIntoRun(runElement: Element, rPrChange: Element): void;
97
+ /**
98
+ * Extract paragraph properties (w:pPr) from an element.
99
+ *
100
+ * @param paragraphElement - The w:p element
101
+ * @returns The w:pPr element, or null if not found
102
+ */
103
+ export declare function getParagraphProperties(paragraphElement: Element): Element | null;
104
+ /**
105
+ * Paragraph property friendly names.
106
+ */
107
+ export declare const PARAGRAPH_PROPERTY_FRIENDLY_NAMES: Record<string, string>;
108
+ /**
109
+ * @deprecated Use areRunPropertiesEqual directly with Element params
110
+ */
111
+ export declare function normalizeRunProperties(rPr: Element | null): NormalizedRPr;
112
+ /**
113
+ * @deprecated Use getParagraphProperties directly
114
+ */
115
+ export declare function normalizeParagraphProperties(pPr: Element | null): NormalizedRPr;
116
+ /**
117
+ * @deprecated Removed — use generateFormatChangeMarkup with DOM approach
118
+ */
119
+ export declare function generateFormatChangeMarkup(formatChange: FormatChangeInfo, options: FormatChangeMarkupOptions): Element;
120
+ //# sourceMappingURL=format-detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format-detection.d.ts","sourceRoot":"","sources":["../src/format-detection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACL,kBAAkB,EAGlB,gBAAgB,EAChB,uBAAuB,EAExB,MAAM,iBAAiB,CAAC;AAOzB;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,kBAAkB,GACvB,OAAO,GAAG,IAAI,CAYhB;AAMD;;;GAGG;AACH,UAAU,kBAAkB;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,UAAU,aAAa;IACrB,QAAQ,EAAE,kBAAkB,EAAE,CAAC;CAChC;AAmDD;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,OAAO,GAAG,IAAI,EACpB,IAAI,EAAE,OAAO,GAAG,IAAI,GACnB,OAAO,CAIT;AAGD,OAAO,EAAE,qBAAqB,IAAI,+BAA+B,EAAE,CAAC;AAsCpE;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,OAAO,GAAG,IAAI,EACtB,MAAM,EAAE,OAAO,GAAG,IAAI,GACrB,MAAM,EAAE,CAuBV;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,OAAO,GAAG,IAAI,EACtB,MAAM,EAAE,OAAO,GAAG,IAAI,GACrB;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAAE,CA2C3D;AAMD;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,kBAAkB,EAAE,EAC3B,QAAQ,GAAE,uBAA2D,GACpE,IAAI,CA6BN;AAMD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,QAAQ,EAAE,IAAI,CAAC;IACf,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,OAAO,GACjB,IAAI,CA0BN;AAMD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,gBAAgB,EAAE,OAAO,GACxB,OAAO,GAAG,IAAI,CAQhB;AAED;;GAEG;AACH,eAAO,MAAM,iCAAiC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAcpE,CAAC;AAMF;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,GAAG,aAAa,CAEzE;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,GAAG,aAAa,CAE/E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,gBAAgB,EAC9B,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAqBT"}