docxmlater 11.0.10 → 12.0.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 (354) hide show
  1. package/README.md +51 -13
  2. package/dist/core/Document.d.ts +28 -2
  3. package/dist/core/Document.d.ts.map +1 -1
  4. package/dist/core/Document.js +725 -170
  5. package/dist/core/Document.js.map +1 -1
  6. package/dist/core/DocumentGenerator.d.ts +1 -0
  7. package/dist/core/DocumentGenerator.d.ts.map +1 -1
  8. package/dist/core/DocumentGenerator.js +77 -25
  9. package/dist/core/DocumentGenerator.js.map +1 -1
  10. package/dist/core/DocumentParser.d.ts +7 -3
  11. package/dist/core/DocumentParser.d.ts.map +1 -1
  12. package/dist/core/DocumentParser.js +427 -81
  13. package/dist/core/DocumentParser.js.map +1 -1
  14. package/dist/core/RelationshipManager.d.ts.map +1 -1
  15. package/dist/core/RelationshipManager.js +2 -2
  16. package/dist/core/RelationshipManager.js.map +1 -1
  17. package/dist/elements/Comment.d.ts +15 -1
  18. package/dist/elements/Comment.d.ts.map +1 -1
  19. package/dist/elements/Comment.js +67 -12
  20. package/dist/elements/Comment.js.map +1 -1
  21. package/dist/elements/CommentManager.d.ts +4 -0
  22. package/dist/elements/CommentManager.d.ts.map +1 -1
  23. package/dist/elements/CommentManager.js +74 -16
  24. package/dist/elements/CommentManager.js.map +1 -1
  25. package/dist/elements/EndnoteManager.d.ts.map +1 -1
  26. package/dist/elements/EndnoteManager.js.map +1 -1
  27. package/dist/elements/Field.d.ts +10 -1
  28. package/dist/elements/Field.d.ts.map +1 -1
  29. package/dist/elements/Field.js +76 -34
  30. package/dist/elements/Field.js.map +1 -1
  31. package/dist/elements/FieldHelpers.d.ts +1 -0
  32. package/dist/elements/FieldHelpers.d.ts.map +1 -1
  33. package/dist/elements/FieldHelpers.js +8 -4
  34. package/dist/elements/FieldHelpers.js.map +1 -1
  35. package/dist/elements/Footer.d.ts +3 -1
  36. package/dist/elements/Footer.d.ts.map +1 -1
  37. package/dist/elements/Footer.js +39 -53
  38. package/dist/elements/Footer.js.map +1 -1
  39. package/dist/elements/FootnoteManager.d.ts.map +1 -1
  40. package/dist/elements/FootnoteManager.js.map +1 -1
  41. package/dist/elements/Header.d.ts +3 -1
  42. package/dist/elements/Header.d.ts.map +1 -1
  43. package/dist/elements/Header.js +39 -53
  44. package/dist/elements/Header.js.map +1 -1
  45. package/dist/elements/HeaderFooterManager.d.ts +4 -2
  46. package/dist/elements/HeaderFooterManager.d.ts.map +1 -1
  47. package/dist/elements/HeaderFooterManager.js +36 -6
  48. package/dist/elements/HeaderFooterManager.js.map +1 -1
  49. package/dist/elements/Hyperlink.d.ts +6 -1
  50. package/dist/elements/Hyperlink.d.ts.map +1 -1
  51. package/dist/elements/Hyperlink.js +69 -44
  52. package/dist/elements/Hyperlink.js.map +1 -1
  53. package/dist/elements/Image.d.ts.map +1 -1
  54. package/dist/elements/Image.js +33 -6
  55. package/dist/elements/Image.js.map +1 -1
  56. package/dist/elements/ImageManager.d.ts +1 -0
  57. package/dist/elements/ImageManager.d.ts.map +1 -1
  58. package/dist/elements/ImageManager.js +11 -0
  59. package/dist/elements/ImageManager.js.map +1 -1
  60. package/dist/elements/Paragraph.d.ts +3 -0
  61. package/dist/elements/Paragraph.d.ts.map +1 -1
  62. package/dist/elements/Paragraph.js +91 -26
  63. package/dist/elements/Paragraph.js.map +1 -1
  64. package/dist/elements/Revision.d.ts +4 -0
  65. package/dist/elements/Revision.d.ts.map +1 -1
  66. package/dist/elements/Revision.js +369 -29
  67. package/dist/elements/Revision.js.map +1 -1
  68. package/dist/elements/Run.d.ts +1 -0
  69. package/dist/elements/Run.d.ts.map +1 -1
  70. package/dist/elements/Run.js +24 -4
  71. package/dist/elements/Run.js.map +1 -1
  72. package/dist/elements/Section.d.ts.map +1 -1
  73. package/dist/elements/Section.js +17 -7
  74. package/dist/elements/Section.js.map +1 -1
  75. package/dist/elements/Shape.d.ts.map +1 -1
  76. package/dist/elements/Shape.js +50 -42
  77. package/dist/elements/Shape.js.map +1 -1
  78. package/dist/elements/StructuredDocumentTag.d.ts +9 -1
  79. package/dist/elements/StructuredDocumentTag.d.ts.map +1 -1
  80. package/dist/elements/StructuredDocumentTag.js +46 -6
  81. package/dist/elements/StructuredDocumentTag.js.map +1 -1
  82. package/dist/elements/Table.d.ts +2 -0
  83. package/dist/elements/Table.d.ts.map +1 -1
  84. package/dist/elements/Table.js +90 -42
  85. package/dist/elements/Table.js.map +1 -1
  86. package/dist/elements/TableCell.d.ts +1 -0
  87. package/dist/elements/TableCell.d.ts.map +1 -1
  88. package/dist/elements/TableCell.js +32 -13
  89. package/dist/elements/TableCell.js.map +1 -1
  90. package/dist/elements/TableOfContents.d.ts.map +1 -1
  91. package/dist/elements/TableOfContents.js +5 -7
  92. package/dist/elements/TableOfContents.js.map +1 -1
  93. package/dist/elements/TableRow.d.ts +1 -0
  94. package/dist/elements/TableRow.d.ts.map +1 -1
  95. package/dist/elements/TableRow.js +16 -1
  96. package/dist/elements/TableRow.js.map +1 -1
  97. package/dist/elements/TextBox.d.ts.map +1 -1
  98. package/dist/elements/TextBox.js +55 -42
  99. package/dist/elements/TextBox.js.map +1 -1
  100. package/dist/esm/core/Document.js +726 -171
  101. package/dist/esm/core/Document.js.map +1 -1
  102. package/dist/esm/core/DocumentGenerator.js +77 -25
  103. package/dist/esm/core/DocumentGenerator.js.map +1 -1
  104. package/dist/esm/core/DocumentParser.js +427 -81
  105. package/dist/esm/core/DocumentParser.js.map +1 -1
  106. package/dist/esm/core/RelationshipManager.js +2 -2
  107. package/dist/esm/core/RelationshipManager.js.map +1 -1
  108. package/dist/esm/elements/Comment.js +67 -12
  109. package/dist/esm/elements/Comment.js.map +1 -1
  110. package/dist/esm/elements/CommentManager.js +74 -16
  111. package/dist/esm/elements/CommentManager.js.map +1 -1
  112. package/dist/esm/elements/EndnoteManager.js.map +1 -1
  113. package/dist/esm/elements/Field.js +77 -35
  114. package/dist/esm/elements/Field.js.map +1 -1
  115. package/dist/esm/elements/FieldHelpers.js +7 -4
  116. package/dist/esm/elements/FieldHelpers.js.map +1 -1
  117. package/dist/esm/elements/Footer.js +39 -53
  118. package/dist/esm/elements/Footer.js.map +1 -1
  119. package/dist/esm/elements/FootnoteManager.js.map +1 -1
  120. package/dist/esm/elements/Header.js +39 -53
  121. package/dist/esm/elements/Header.js.map +1 -1
  122. package/dist/esm/elements/HeaderFooterManager.js +36 -6
  123. package/dist/esm/elements/HeaderFooterManager.js.map +1 -1
  124. package/dist/esm/elements/Hyperlink.js +69 -44
  125. package/dist/esm/elements/Hyperlink.js.map +1 -1
  126. package/dist/esm/elements/Image.js +33 -6
  127. package/dist/esm/elements/Image.js.map +1 -1
  128. package/dist/esm/elements/ImageManager.js +11 -0
  129. package/dist/esm/elements/ImageManager.js.map +1 -1
  130. package/dist/esm/elements/Paragraph.js +91 -26
  131. package/dist/esm/elements/Paragraph.js.map +1 -1
  132. package/dist/esm/elements/Revision.js +369 -29
  133. package/dist/esm/elements/Revision.js.map +1 -1
  134. package/dist/esm/elements/Run.js +24 -4
  135. package/dist/esm/elements/Run.js.map +1 -1
  136. package/dist/esm/elements/Section.js +17 -7
  137. package/dist/esm/elements/Section.js.map +1 -1
  138. package/dist/esm/elements/Shape.js +50 -42
  139. package/dist/esm/elements/Shape.js.map +1 -1
  140. package/dist/esm/elements/StructuredDocumentTag.js +46 -6
  141. package/dist/esm/elements/StructuredDocumentTag.js.map +1 -1
  142. package/dist/esm/elements/Table.js +90 -42
  143. package/dist/esm/elements/Table.js.map +1 -1
  144. package/dist/esm/elements/TableCell.js +32 -13
  145. package/dist/esm/elements/TableCell.js.map +1 -1
  146. package/dist/esm/elements/TableOfContents.js +5 -7
  147. package/dist/esm/elements/TableOfContents.js.map +1 -1
  148. package/dist/esm/elements/TableRow.js +16 -1
  149. package/dist/esm/elements/TableRow.js.map +1 -1
  150. package/dist/esm/elements/TextBox.js +55 -42
  151. package/dist/esm/elements/TextBox.js.map +1 -1
  152. package/dist/esm/formatting/AbstractNumbering.js +1 -1
  153. package/dist/esm/formatting/AbstractNumbering.js.map +1 -1
  154. package/dist/esm/formatting/NumberingLevel.js +8 -6
  155. package/dist/esm/formatting/NumberingLevel.js.map +1 -1
  156. package/dist/esm/formatting/NumberingManager.js +16 -1
  157. package/dist/esm/formatting/NumberingManager.js.map +1 -1
  158. package/dist/esm/formatting/Style.js +14 -0
  159. package/dist/esm/formatting/Style.js.map +1 -1
  160. package/dist/esm/formatting/StylesManager.js +14 -2
  161. package/dist/esm/formatting/StylesManager.js.map +1 -1
  162. package/dist/esm/helpers/CleanupHelper.js +103 -26
  163. package/dist/esm/helpers/CleanupHelper.js.map +1 -1
  164. package/dist/esm/images/ImageOptimizer.js +52 -4
  165. package/dist/esm/images/ImageOptimizer.js.map +1 -1
  166. package/dist/esm/index.js +1 -0
  167. package/dist/esm/index.js.map +1 -1
  168. package/dist/esm/internal.js +1 -1
  169. package/dist/esm/internal.js.map +1 -1
  170. package/dist/esm/processors/CompatibilityUpgrader.js +7 -1
  171. package/dist/esm/processors/CompatibilityUpgrader.js.map +1 -1
  172. package/dist/esm/processors/InMemoryRevisionAcceptor.js +134 -13
  173. package/dist/esm/processors/InMemoryRevisionAcceptor.js.map +1 -1
  174. package/dist/esm/processors/RevisionWalker.js +58 -8
  175. package/dist/esm/processors/RevisionWalker.js.map +1 -1
  176. package/dist/esm/processors/SelectiveRevisionAcceptor.js +116 -17
  177. package/dist/esm/processors/SelectiveRevisionAcceptor.js.map +1 -1
  178. package/dist/esm/processors/cnfStyleDecoder.js +7 -7
  179. package/dist/esm/processors/cnfStyleDecoder.js.map +1 -1
  180. package/dist/esm/processors/stripTrackedChanges.js +16 -5
  181. package/dist/esm/processors/stripTrackedChanges.js.map +1 -1
  182. package/dist/esm/utils/deepClone.js +24 -11
  183. package/dist/esm/utils/deepClone.js.map +1 -1
  184. package/dist/esm/utils/units.js +1 -1
  185. package/dist/esm/utils/units.js.map +1 -1
  186. package/dist/esm/utils/validation.js +11 -23
  187. package/dist/esm/utils/validation.js.map +1 -1
  188. package/dist/esm/utils/xmlSanitization.js +131 -7
  189. package/dist/esm/utils/xmlSanitization.js.map +1 -1
  190. package/dist/esm/validation/RevisionAutoFixer.js +69 -55
  191. package/dist/esm/validation/RevisionAutoFixer.js.map +1 -1
  192. package/dist/esm/validation/RevisionValidator.js +24 -20
  193. package/dist/esm/validation/RevisionValidator.js.map +1 -1
  194. package/dist/esm/xml/XMLBuilder.js +52 -20
  195. package/dist/esm/xml/XMLBuilder.js.map +1 -1
  196. package/dist/esm/xml/XMLParser.js +55 -13
  197. package/dist/esm/xml/XMLParser.js.map +1 -1
  198. package/dist/esm/zip/ZipHandler.js +37 -13
  199. package/dist/esm/zip/ZipHandler.js.map +1 -1
  200. package/dist/esm/zip/ZipReader.js +53 -6
  201. package/dist/esm/zip/ZipReader.js.map +1 -1
  202. package/dist/esm/zip/errors.js +7 -0
  203. package/dist/esm/zip/errors.js.map +1 -1
  204. package/dist/esm/zip/types.js +4 -0
  205. package/dist/esm/zip/types.js.map +1 -1
  206. package/dist/formatting/AbstractNumbering.d.ts.map +1 -1
  207. package/dist/formatting/AbstractNumbering.js +1 -1
  208. package/dist/formatting/AbstractNumbering.js.map +1 -1
  209. package/dist/formatting/NumberingLevel.d.ts +1 -1
  210. package/dist/formatting/NumberingLevel.d.ts.map +1 -1
  211. package/dist/formatting/NumberingLevel.js +8 -6
  212. package/dist/formatting/NumberingLevel.js.map +1 -1
  213. package/dist/formatting/NumberingManager.d.ts.map +1 -1
  214. package/dist/formatting/NumberingManager.js +16 -1
  215. package/dist/formatting/NumberingManager.js.map +1 -1
  216. package/dist/formatting/Style.d.ts.map +1 -1
  217. package/dist/formatting/Style.js +14 -0
  218. package/dist/formatting/Style.js.map +1 -1
  219. package/dist/formatting/StylesManager.d.ts +2 -0
  220. package/dist/formatting/StylesManager.d.ts.map +1 -1
  221. package/dist/formatting/StylesManager.js +14 -2
  222. package/dist/formatting/StylesManager.js.map +1 -1
  223. package/dist/helpers/CleanupHelper.d.ts.map +1 -1
  224. package/dist/helpers/CleanupHelper.js +103 -26
  225. package/dist/helpers/CleanupHelper.js.map +1 -1
  226. package/dist/images/ImageOptimizer.d.ts.map +1 -1
  227. package/dist/images/ImageOptimizer.js +52 -4
  228. package/dist/images/ImageOptimizer.js.map +1 -1
  229. package/dist/index.d.ts +3 -1
  230. package/dist/index.d.ts.map +1 -1
  231. package/dist/index.js +4 -2
  232. package/dist/index.js.map +1 -1
  233. package/dist/internal.d.ts +1 -1
  234. package/dist/internal.d.ts.map +1 -1
  235. package/dist/internal.js +2 -1
  236. package/dist/internal.js.map +1 -1
  237. package/dist/processors/CompatibilityUpgrader.d.ts.map +1 -1
  238. package/dist/processors/CompatibilityUpgrader.js +7 -1
  239. package/dist/processors/CompatibilityUpgrader.js.map +1 -1
  240. package/dist/processors/InMemoryRevisionAcceptor.d.ts +1 -0
  241. package/dist/processors/InMemoryRevisionAcceptor.d.ts.map +1 -1
  242. package/dist/processors/InMemoryRevisionAcceptor.js +135 -13
  243. package/dist/processors/InMemoryRevisionAcceptor.js.map +1 -1
  244. package/dist/processors/RevisionWalker.d.ts +2 -0
  245. package/dist/processors/RevisionWalker.d.ts.map +1 -1
  246. package/dist/processors/RevisionWalker.js +58 -8
  247. package/dist/processors/RevisionWalker.js.map +1 -1
  248. package/dist/processors/SelectiveRevisionAcceptor.d.ts.map +1 -1
  249. package/dist/processors/SelectiveRevisionAcceptor.js +116 -17
  250. package/dist/processors/SelectiveRevisionAcceptor.js.map +1 -1
  251. package/dist/processors/cnfStyleDecoder.d.ts.map +1 -1
  252. package/dist/processors/cnfStyleDecoder.js +7 -7
  253. package/dist/processors/cnfStyleDecoder.js.map +1 -1
  254. package/dist/processors/stripTrackedChanges.d.ts.map +1 -1
  255. package/dist/processors/stripTrackedChanges.js +16 -5
  256. package/dist/processors/stripTrackedChanges.js.map +1 -1
  257. package/dist/utils/deepClone.d.ts.map +1 -1
  258. package/dist/utils/deepClone.js +24 -11
  259. package/dist/utils/deepClone.js.map +1 -1
  260. package/dist/utils/units.d.ts.map +1 -1
  261. package/dist/utils/units.js +1 -1
  262. package/dist/utils/units.js.map +1 -1
  263. package/dist/utils/validation.d.ts.map +1 -1
  264. package/dist/utils/validation.js +11 -23
  265. package/dist/utils/validation.js.map +1 -1
  266. package/dist/utils/xmlSanitization.d.ts +2 -0
  267. package/dist/utils/xmlSanitization.d.ts.map +1 -1
  268. package/dist/utils/xmlSanitization.js +133 -7
  269. package/dist/utils/xmlSanitization.js.map +1 -1
  270. package/dist/validation/RevisionAutoFixer.d.ts +6 -2
  271. package/dist/validation/RevisionAutoFixer.d.ts.map +1 -1
  272. package/dist/validation/RevisionAutoFixer.js +68 -54
  273. package/dist/validation/RevisionAutoFixer.js.map +1 -1
  274. package/dist/validation/RevisionValidator.d.ts +2 -0
  275. package/dist/validation/RevisionValidator.d.ts.map +1 -1
  276. package/dist/validation/RevisionValidator.js +26 -21
  277. package/dist/validation/RevisionValidator.js.map +1 -1
  278. package/dist/xml/XMLBuilder.d.ts +1 -0
  279. package/dist/xml/XMLBuilder.d.ts.map +1 -1
  280. package/dist/xml/XMLBuilder.js +52 -20
  281. package/dist/xml/XMLBuilder.js.map +1 -1
  282. package/dist/xml/XMLParser.d.ts +1 -0
  283. package/dist/xml/XMLParser.d.ts.map +1 -1
  284. package/dist/xml/XMLParser.js +55 -13
  285. package/dist/xml/XMLParser.js.map +1 -1
  286. package/dist/zip/ZipHandler.d.ts.map +1 -1
  287. package/dist/zip/ZipHandler.js +37 -13
  288. package/dist/zip/ZipHandler.js.map +1 -1
  289. package/dist/zip/ZipReader.d.ts.map +1 -1
  290. package/dist/zip/ZipReader.js +52 -5
  291. package/dist/zip/ZipReader.js.map +1 -1
  292. package/dist/zip/errors.d.ts +3 -0
  293. package/dist/zip/errors.d.ts.map +1 -1
  294. package/dist/zip/errors.js +9 -1
  295. package/dist/zip/errors.js.map +1 -1
  296. package/dist/zip/types.d.ts +4 -0
  297. package/dist/zip/types.d.ts.map +1 -1
  298. package/dist/zip/types.js +4 -0
  299. package/dist/zip/types.js.map +1 -1
  300. package/package.json +2 -2
  301. package/src/core/Document.ts +1159 -240
  302. package/src/core/DocumentGenerator.ts +106 -26
  303. package/src/core/DocumentParser.ts +681 -114
  304. package/src/core/RelationshipManager.ts +446 -442
  305. package/src/elements/Comment.ts +123 -18
  306. package/src/elements/CommentManager.ts +121 -22
  307. package/src/elements/EndnoteManager.ts +4 -1
  308. package/src/elements/Field.ts +134 -43
  309. package/src/elements/FieldHelpers.ts +20 -4
  310. package/src/elements/Footer.ts +62 -67
  311. package/src/elements/FootnoteManager.ts +4 -1
  312. package/src/elements/Header.ts +62 -67
  313. package/src/elements/HeaderFooterManager.ts +56 -8
  314. package/src/elements/Hyperlink.ts +150 -55
  315. package/src/elements/Image.ts +51 -7
  316. package/src/elements/ImageManager.ts +24 -0
  317. package/src/elements/Paragraph.ts +161 -40
  318. package/src/elements/Revision.ts +446 -47
  319. package/src/elements/Run.ts +44 -6
  320. package/src/elements/Section.ts +25 -9
  321. package/src/elements/Shape.ts +52 -44
  322. package/src/elements/StructuredDocumentTag.ts +83 -8
  323. package/src/elements/Table.ts +151 -50
  324. package/src/elements/TableCell.ts +57 -17
  325. package/src/elements/TableOfContents.ts +10 -9
  326. package/src/elements/TableRow.ts +35 -3
  327. package/src/elements/TextBox.ts +58 -43
  328. package/src/formatting/AbstractNumbering.ts +4 -2
  329. package/src/formatting/NumberingLevel.ts +50 -12
  330. package/src/formatting/NumberingManager.ts +32 -3
  331. package/src/formatting/Style.ts +14 -0
  332. package/src/formatting/StylesManager.ts +29 -2
  333. package/src/helpers/CleanupHelper.ts +122 -30
  334. package/src/images/ImageOptimizer.ts +64 -5
  335. package/src/index.ts +7 -0
  336. package/src/internal.ts +1 -0
  337. package/src/processors/CompatibilityUpgrader.ts +15 -2
  338. package/src/processors/InMemoryRevisionAcceptor.ts +276 -17
  339. package/src/processors/RevisionWalker.ts +83 -7
  340. package/src/processors/SelectiveRevisionAcceptor.ts +164 -28
  341. package/src/processors/cnfStyleDecoder.ts +18 -12
  342. package/src/processors/stripTrackedChanges.ts +47 -10
  343. package/src/utils/deepClone.ts +48 -14
  344. package/src/utils/units.ts +3 -1
  345. package/src/utils/validation.ts +30 -32
  346. package/src/utils/xmlSanitization.ts +218 -22
  347. package/src/validation/RevisionAutoFixer.ts +109 -65
  348. package/src/validation/RevisionValidator.ts +48 -23
  349. package/src/xml/XMLBuilder.ts +82 -22
  350. package/src/xml/XMLParser.ts +87 -20
  351. package/src/zip/ZipHandler.ts +61 -21
  352. package/src/zip/ZipReader.ts +135 -13
  353. package/src/zip/errors.ts +15 -0
  354. package/src/zip/types.ts +44 -2
@@ -32,6 +32,7 @@ import { logParagraphContent, logParsing, logTextDirection } from '../utils/diag
32
32
  import { getGlobalLogger, createScopedLogger, defaultLogger } from '../utils/logger.js';
33
33
  import { safeParseInt, isExplicitlySet, parseOoxmlBoolean, parseOnOffAttribute, } from '../utils/parsingHelpers.js';
34
34
  import { halfPointsToPoints } from '../utils/units.js';
35
+ import { normalizeAnchorSizeRel } from '../utils/xmlSanitization.js';
35
36
  function getLogger() {
36
37
  return createScopedLogger(getGlobalLogger(), 'DocumentParser');
37
38
  }
@@ -213,9 +214,13 @@ export class DocumentParser {
213
214
  const parsed = XMLParser.parseToObject(elementXml, {
214
215
  trimValues: false,
215
216
  });
216
- const sdt = await this.parseSDTFromObject(parsed['w:sdt'], relationshipManager, zipHandler, imageManager);
217
- if (sdt)
217
+ const sdt = await this.parseSDTFromObject(parsed['w:sdt'], relationshipManager, zipHandler, imageManager, elementXml);
218
+ if (sdt) {
218
219
  bodyElements.push(sdt);
220
+ }
221
+ else {
222
+ bodyElements.push(new PreservedElement(elementXml, 'sdt', 'block'));
223
+ }
219
224
  pos = next.pos + elementXml.length;
220
225
  }
221
226
  else {
@@ -641,6 +646,7 @@ export class DocumentParser {
641
646
  let permEndIndex = 0;
642
647
  let oMathIndex = 0;
643
648
  let rubyIndex = 0;
649
+ let sdtIndex = 0;
644
650
  let commentRangeStartIndex = 0;
645
651
  let commentRangeEndIndex = 0;
646
652
  const findClosingTagEnd = (content, tagName, startPos) => {
@@ -792,6 +798,14 @@ export class DocumentParser {
792
798
  });
793
799
  searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:ruby', tagEnd);
794
800
  }
801
+ else if (tagName === 'w:sdt') {
802
+ children.push({
803
+ type: 'w:sdt',
804
+ pos: tagStart,
805
+ index: sdtIndex++,
806
+ });
807
+ searchPos = selfClosing ? tagEnd + 1 : findClosingTagEnd(paraContent, 'w:sdt', tagEnd);
808
+ }
795
809
  else {
796
810
  searchPos = tagEnd + 1;
797
811
  }
@@ -872,12 +886,35 @@ export class DocumentParser {
872
886
  paragraph.addContent(new PreservedElement(runXml, 'w:r', 'inline'));
873
887
  }
874
888
  }
889
+ else if (runObj['mc:AlternateContent']) {
890
+ const runXml = extractRunXmlAtPosition(child.pos);
891
+ if (runXml) {
892
+ paragraph.addContent(new PreservedElement(runXml, 'w:r', 'inline'));
893
+ }
894
+ }
875
895
  else if (runObj['w:drawing']) {
896
+ let imageRun = null;
876
897
  if (zipHandler && imageManager) {
877
- const imageRun = await this.parseDrawingFromObject(runObj['w:drawing'], zipHandler, relationshipManager, imageManager);
878
- if (imageRun) {
879
- this.parseRunPropertiesFromObject(runObj['w:rPr'], imageRun);
880
- paragraph.addRun(imageRun);
898
+ imageRun = await this.parseDrawingFromObject(runObj['w:drawing'], zipHandler, relationshipManager, imageManager);
899
+ }
900
+ if (imageRun) {
901
+ this.parseRunPropertiesFromObject(runObj['w:rPr'], imageRun);
902
+ paragraph.addRun(imageRun);
903
+ if (runObj['w:t'] ||
904
+ runObj['w:tab'] ||
905
+ runObj['w:br'] ||
906
+ runObj['w:cr'] ||
907
+ runObj['w:noBreakHyphen']) {
908
+ const siblingRun = this.parseRunFromObject(runObj);
909
+ if (siblingRun) {
910
+ paragraph.addRun(siblingRun);
911
+ }
912
+ }
913
+ }
914
+ else {
915
+ const runXml = extractRunXmlAtPosition(child.pos);
916
+ if (runXml) {
917
+ paragraph.addContent(new PreservedElement(runXml, 'w:r', 'inline'));
881
918
  }
882
919
  }
883
920
  }
@@ -1064,6 +1101,12 @@ export class DocumentParser {
1064
1101
  paragraph.addContent(new PreservedElement(elementXml, child.type, 'inline'));
1065
1102
  }
1066
1103
  }
1104
+ else if (child.type === 'w:sdt') {
1105
+ const sdtXml = extractElementXmlAtPosition(child.pos, 'w:sdt');
1106
+ if (sdtXml) {
1107
+ paragraph.addContent(new PreservedElement(sdtXml, 'w:sdt', 'inline'));
1108
+ }
1109
+ }
1067
1110
  }
1068
1111
  }
1069
1112
  async parseRevisionFromXml(revisionXml, tagName, relationshipManager, zipHandler, imageManager) {
@@ -1098,19 +1141,63 @@ export class DocumentParser {
1098
1141
  const hyperlinkXmls = XMLParser.extractElements(revisionXml, 'w:hyperlink');
1099
1142
  let xmlWithoutHyperlinks = revisionXml;
1100
1143
  for (const hyperlinkXml of hyperlinkXmls) {
1101
- xmlWithoutHyperlinks = xmlWithoutHyperlinks.split(hyperlinkXml).join('');
1144
+ xmlWithoutHyperlinks = xmlWithoutHyperlinks
1145
+ .split(hyperlinkXml)
1146
+ .join(' '.repeat(hyperlinkXml.length));
1102
1147
  }
1103
1148
  const runXmls = XMLParser.extractElements(xmlWithoutHyperlinks, 'w:r');
1104
- const content = [];
1149
+ const orderedChildren = [];
1150
+ let runCursor = 0;
1105
1151
  for (const runXml of runXmls) {
1152
+ const pos = xmlWithoutHyperlinks.indexOf(runXml, runCursor);
1153
+ orderedChildren.push({ pos: pos === -1 ? runCursor : pos, type: 'w:r', xml: runXml });
1154
+ if (pos !== -1) {
1155
+ runCursor = pos + runXml.length;
1156
+ }
1157
+ }
1158
+ let hyperlinkCursor = 0;
1159
+ for (const hyperlinkXml of hyperlinkXmls) {
1160
+ const pos = revisionXml.indexOf(hyperlinkXml, hyperlinkCursor);
1161
+ orderedChildren.push({
1162
+ pos: pos === -1 ? hyperlinkCursor : pos,
1163
+ type: 'w:hyperlink',
1164
+ xml: hyperlinkXml,
1165
+ });
1166
+ if (pos !== -1) {
1167
+ hyperlinkCursor = pos + hyperlinkXml.length;
1168
+ }
1169
+ }
1170
+ orderedChildren.sort((a, b) => a.pos - b.pos);
1171
+ const content = [];
1172
+ for (const child of orderedChildren) {
1173
+ if (child.type === 'w:hyperlink') {
1174
+ const hyperlinkObj = XMLParser.parseToObject(child.xml, { trimValues: false });
1175
+ const hyperlinkResult = this.parseHyperlinkFromObject(hyperlinkObj['w:hyperlink'], relationshipManager);
1176
+ if (hyperlinkResult.hyperlink) {
1177
+ content.push(hyperlinkResult.hyperlink);
1178
+ }
1179
+ result.bookmarkStarts.push(...hyperlinkResult.bookmarkStarts);
1180
+ result.bookmarkEnds.push(...hyperlinkResult.bookmarkEnds);
1181
+ continue;
1182
+ }
1183
+ const runXml = child.xml;
1106
1184
  const runObj = XMLParser.parseToObject(runXml, { trimValues: false });
1107
1185
  const runElement = runObj['w:r'];
1108
1186
  if (runElement?.['w:drawing']) {
1187
+ let imageRun = null;
1109
1188
  if (zipHandler && imageManager) {
1110
- const imageRun = await this.parseDrawingFromObject(runElement['w:drawing'], zipHandler, relationshipManager, imageManager);
1111
- if (imageRun) {
1112
- imageRun.setRawRunXml(runXml);
1113
- content.push(imageRun);
1189
+ imageRun = await this.parseDrawingFromObject(runElement['w:drawing'], zipHandler, relationshipManager, imageManager);
1190
+ }
1191
+ if (imageRun) {
1192
+ imageRun.setRawRunXml(runXml);
1193
+ content.push(imageRun);
1194
+ }
1195
+ else {
1196
+ const drawingXmls = XMLParser.extractElements(runXml, 'w:drawing');
1197
+ if (drawingXmls.length > 0 && drawingXmls[0]) {
1198
+ const run = Run.createFromContent([{ type: 'vml', rawXml: drawingXmls[0] }]);
1199
+ this.parseRunPropertiesFromObject(runElement['w:rPr'], run);
1200
+ content.push(run);
1114
1201
  }
1115
1202
  }
1116
1203
  }
@@ -1121,15 +1208,6 @@ export class DocumentParser {
1121
1208
  }
1122
1209
  }
1123
1210
  }
1124
- for (const hyperlinkXml of hyperlinkXmls) {
1125
- const hyperlinkObj = XMLParser.parseToObject(hyperlinkXml, { trimValues: false });
1126
- const hyperlinkResult = this.parseHyperlinkFromObject(hyperlinkObj['w:hyperlink'], relationshipManager);
1127
- if (hyperlinkResult.hyperlink) {
1128
- content.push(hyperlinkResult.hyperlink);
1129
- }
1130
- result.bookmarkStarts.push(...hyperlinkResult.bookmarkStarts);
1131
- result.bookmarkEnds.push(...hyperlinkResult.bookmarkEnds);
1132
- }
1133
1211
  const bookmarkStartXmls = XMLParser.extractElements(xmlWithoutHyperlinks, 'w:bookmarkStart');
1134
1212
  const bookmarkEndXmls = XMLParser.extractElements(xmlWithoutHyperlinks, 'w:bookmarkEnd');
1135
1213
  for (const bookmarkXml of bookmarkStartXmls) {
@@ -1170,18 +1248,33 @@ export class DocumentParser {
1170
1248
  return result;
1171
1249
  }
1172
1250
  }
1173
- parseCommentsXml(commentsXml) {
1251
+ parseCommentsXml(commentsXml, commentsExtendedXml) {
1174
1252
  const comments = [];
1253
+ const doneByParaId = commentsExtendedXml
1254
+ ? this.parseCommentsExtendedDone(commentsExtendedXml)
1255
+ : undefined;
1175
1256
  const commentXmls = XMLParser.extractElements(commentsXml, 'w:comment');
1176
1257
  for (const commentXml of commentXmls) {
1177
- const comment = this.parseCommentFromXml(commentXml);
1258
+ const comment = this.parseCommentFromXml(commentXml, doneByParaId);
1178
1259
  if (comment) {
1179
1260
  comments.push(comment);
1180
1261
  }
1181
1262
  }
1182
1263
  return comments;
1183
1264
  }
1184
- parseCommentFromXml(commentXml) {
1265
+ parseCommentsExtendedDone(commentsExtendedXml) {
1266
+ const doneByParaId = new Map();
1267
+ for (const commentExXml of XMLParser.extractElements(commentsExtendedXml, 'w15:commentEx')) {
1268
+ const paraId = XMLParser.extractAttribute(commentExXml, 'w15:paraId');
1269
+ if (!paraId) {
1270
+ continue;
1271
+ }
1272
+ const done = parseOnOffAttribute(XMLParser.extractAttribute(commentExXml, 'w15:done'));
1273
+ doneByParaId.set(paraId.toUpperCase(), done);
1274
+ }
1275
+ return doneByParaId;
1276
+ }
1277
+ parseCommentFromXml(commentXml, doneByParaId) {
1185
1278
  try {
1186
1279
  const idAttr = XMLParser.extractAttribute(commentXml, 'w:id');
1187
1280
  const author = XMLParser.extractAttribute(commentXml, 'w:author') || 'Unknown';
@@ -1197,15 +1290,33 @@ export class DocumentParser {
1197
1290
  const id = parseInt(idAttr, 10);
1198
1291
  const date = dateAttr ? new Date(dateAttr) : new Date();
1199
1292
  const parentId = parentIdAttr ? parseInt(parentIdAttr, 10) : undefined;
1200
- const done = parseOnOffAttribute(doneAttr);
1293
+ let done = parseOnOffAttribute(doneAttr);
1201
1294
  const runs = [];
1202
- const runXmls = XMLParser.extractElements(commentXml, 'w:r');
1203
- for (const runXml of runXmls) {
1204
- const runObj = XMLParser.parseToObject(runXml, { trimValues: false });
1205
- const run = this.parseRunFromObject(runObj['w:r']);
1206
- if (run) {
1207
- runs.push(run);
1295
+ const paragraphs = [];
1296
+ const paraXmls = XMLParser.extractElements(commentXml, 'w:p');
1297
+ const runSources = paraXmls.length > 0 ? paraXmls : [commentXml];
1298
+ if (doneByParaId && paraXmls.length > 0) {
1299
+ const lastParaXml = paraXmls[paraXmls.length - 1];
1300
+ const lastParaId = XMLParser.extractAttribute(lastParaXml, 'w14:paraId');
1301
+ if (lastParaId) {
1302
+ const extendedDone = doneByParaId.get(lastParaId.toUpperCase());
1303
+ if (extendedDone !== undefined) {
1304
+ done = extendedDone;
1305
+ }
1306
+ }
1307
+ }
1308
+ for (const sourceXml of runSources) {
1309
+ const content = this.parseCommentParagraphContent(sourceXml);
1310
+ for (const item of content) {
1311
+ if (item instanceof Run) {
1312
+ runs.push(item);
1313
+ }
1314
+ else {
1315
+ runs.push(...item.runs);
1316
+ }
1208
1317
  }
1318
+ const pPr = paraXmls.length > 0 ? XMLParser.extractElements(sourceXml, 'w:pPr')[0] : undefined;
1319
+ paragraphs.push({ pPr, content });
1209
1320
  }
1210
1321
  const comment = new Comment({
1211
1322
  id,
@@ -1216,6 +1327,9 @@ export class DocumentParser {
1216
1327
  parentId,
1217
1328
  done,
1218
1329
  });
1330
+ if (paraXmls.length > 0) {
1331
+ comment.setParagraphs(paragraphs);
1332
+ }
1219
1333
  return comment;
1220
1334
  }
1221
1335
  catch (error) {
@@ -1223,18 +1337,59 @@ export class DocumentParser {
1223
1337
  return null;
1224
1338
  }
1225
1339
  }
1226
- parseFootnotesXml(footnotesXml) {
1340
+ parseCommentParagraphContent(sourceXml) {
1341
+ const positioned = [];
1342
+ const hyperlinkRanges = [];
1343
+ let hyperlinkCursor = 0;
1344
+ for (const hyperlinkXml of XMLParser.extractElements(sourceXml, 'w:hyperlink')) {
1345
+ const start = sourceXml.indexOf(hyperlinkXml, hyperlinkCursor);
1346
+ if (start === -1) {
1347
+ continue;
1348
+ }
1349
+ hyperlinkCursor = start + hyperlinkXml.length;
1350
+ hyperlinkRanges.push({ start, end: hyperlinkCursor });
1351
+ const innerRuns = [];
1352
+ for (const runXml of XMLParser.extractElements(hyperlinkXml, 'w:r')) {
1353
+ const run = this.parseCommentRun(runXml);
1354
+ if (run) {
1355
+ innerRuns.push(run);
1356
+ }
1357
+ }
1358
+ positioned.push({ pos: start, item: { rawXml: hyperlinkXml, runs: innerRuns } });
1359
+ }
1360
+ let runCursor = 0;
1361
+ for (const runXml of XMLParser.extractElements(sourceXml, 'w:r')) {
1362
+ const start = sourceXml.indexOf(runXml, runCursor);
1363
+ if (start === -1) {
1364
+ continue;
1365
+ }
1366
+ runCursor = start + runXml.length;
1367
+ if (hyperlinkRanges.some((range) => start >= range.start && start < range.end)) {
1368
+ continue;
1369
+ }
1370
+ const run = this.parseCommentRun(runXml);
1371
+ if (run) {
1372
+ positioned.push({ pos: start, item: run });
1373
+ }
1374
+ }
1375
+ return positioned.sort((a, b) => a.pos - b.pos).map((entry) => entry.item);
1376
+ }
1377
+ parseCommentRun(runXml) {
1378
+ const runObj = XMLParser.parseToObject(runXml, { trimValues: false });
1379
+ return this.parseRunFromObject(runObj['w:r']);
1380
+ }
1381
+ parseFootnotesXml(footnotesXml, partRels) {
1227
1382
  const footnotes = [];
1228
1383
  const footnoteXmls = XMLParser.extractElements(footnotesXml, 'w:footnote');
1229
1384
  for (const footnoteXml of footnoteXmls) {
1230
- const footnote = this.parseFootnoteFromXml(footnoteXml);
1385
+ const footnote = this.parseFootnoteFromXml(footnoteXml, partRels);
1231
1386
  if (footnote) {
1232
1387
  footnotes.push(footnote);
1233
1388
  }
1234
1389
  }
1235
1390
  return footnotes;
1236
1391
  }
1237
- parseFootnoteFromXml(footnoteXml) {
1392
+ parseFootnoteFromXml(footnoteXml, partRels) {
1238
1393
  try {
1239
1394
  const idAttr = XMLParser.extractAttribute(footnoteXml, 'w:id');
1240
1395
  const typeAttr = XMLParser.extractAttribute(footnoteXml, 'w:type');
@@ -1255,7 +1410,7 @@ export class DocumentParser {
1255
1410
  const footnote = new Footnote({ id, type });
1256
1411
  const paraXmls = XMLParser.extractElements(footnoteXml, 'w:p');
1257
1412
  for (const paraXml of paraXmls) {
1258
- const para = this.parseNoteParaFromXml(paraXml);
1413
+ const para = this.parseNoteParaFromXml(paraXml, partRels);
1259
1414
  if (para) {
1260
1415
  footnote.addParagraph(para);
1261
1416
  }
@@ -1267,18 +1422,18 @@ export class DocumentParser {
1267
1422
  return null;
1268
1423
  }
1269
1424
  }
1270
- parseEndnotesXml(endnotesXml) {
1425
+ parseEndnotesXml(endnotesXml, partRels) {
1271
1426
  const endnotes = [];
1272
1427
  const endnoteXmls = XMLParser.extractElements(endnotesXml, 'w:endnote');
1273
1428
  for (const endnoteXml of endnoteXmls) {
1274
- const endnote = this.parseEndnoteFromXml(endnoteXml);
1429
+ const endnote = this.parseEndnoteFromXml(endnoteXml, partRels);
1275
1430
  if (endnote) {
1276
1431
  endnotes.push(endnote);
1277
1432
  }
1278
1433
  }
1279
1434
  return endnotes;
1280
1435
  }
1281
- parseEndnoteFromXml(endnoteXml) {
1436
+ parseEndnoteFromXml(endnoteXml, partRels) {
1282
1437
  try {
1283
1438
  const idAttr = XMLParser.extractAttribute(endnoteXml, 'w:id');
1284
1439
  const typeAttr = XMLParser.extractAttribute(endnoteXml, 'w:type');
@@ -1299,7 +1454,7 @@ export class DocumentParser {
1299
1454
  const endnote = new Endnote({ id, type });
1300
1455
  const paraXmls = XMLParser.extractElements(endnoteXml, 'w:p');
1301
1456
  for (const paraXml of paraXmls) {
1302
- const para = this.parseNoteParaFromXml(paraXml);
1457
+ const para = this.parseNoteParaFromXml(paraXml, partRels);
1303
1458
  if (para) {
1304
1459
  endnote.addParagraph(para);
1305
1460
  }
@@ -1311,15 +1466,60 @@ export class DocumentParser {
1311
1466
  return null;
1312
1467
  }
1313
1468
  }
1314
- parseNoteParaFromXml(paraXml) {
1469
+ parseNoteParaFromXml(paraXml, partRels) {
1315
1470
  try {
1316
1471
  const para = new Paragraph();
1317
- const runXmls = XMLParser.extractElements(paraXml, 'w:r');
1318
- for (const runXml of runXmls) {
1319
- const runObj = XMLParser.parseToObject(runXml, { trimValues: false });
1320
- const run = this.parseRunFromObject(runObj['w:r']);
1321
- if (run) {
1322
- para.addRun(run);
1472
+ const paraObj = XMLParser.parseToObject(paraXml, { trimValues: false });
1473
+ const pElement = paraObj['w:p'];
1474
+ if (pElement?.['w:pPr']) {
1475
+ this.parseParagraphPropertiesFromObject(pElement['w:pPr'], para);
1476
+ }
1477
+ const pPrEnd = paraXml.indexOf('</w:pPr>');
1478
+ const contentStart = pPrEnd !== -1 ? pPrEnd + '</w:pPr>'.length : paraXml.indexOf('>') + 1;
1479
+ const contentEnd = paraXml.lastIndexOf('</w:p>');
1480
+ if (contentEnd <= contentStart) {
1481
+ return para;
1482
+ }
1483
+ const content = paraXml.substring(contentStart, contentEnd);
1484
+ let searchPos = 0;
1485
+ while (searchPos < content.length) {
1486
+ const tagStart = content.indexOf('<', searchPos);
1487
+ if (tagStart === -1)
1488
+ break;
1489
+ const tagEnd = content.indexOf('>', tagStart);
1490
+ if (tagEnd === -1)
1491
+ break;
1492
+ const tagBody = content.substring(tagStart + 1, tagEnd);
1493
+ const tagName = tagBody.split(/[\s/>]/)[0];
1494
+ const selfClosing = tagBody.endsWith('/');
1495
+ if ((tagName === 'w:r' || tagName === 'w:hyperlink') && !selfClosing) {
1496
+ const closingTag = `</${tagName}>`;
1497
+ const closingPos = content.indexOf(closingTag, tagEnd);
1498
+ const childEnd = closingPos === -1 ? tagEnd + 1 : closingPos + closingTag.length;
1499
+ const childXml = content.substring(tagStart, childEnd);
1500
+ const childObj = XMLParser.parseToObject(childXml, { trimValues: false });
1501
+ if (tagName === 'w:r') {
1502
+ const run = this.parseRunFromObject(childObj['w:r']);
1503
+ if (run) {
1504
+ para.addRun(run);
1505
+ }
1506
+ }
1507
+ else {
1508
+ const result = this.parseHyperlinkFromObject(childObj['w:hyperlink'], partRels ?? RelationshipManager.create());
1509
+ if (result.hyperlink) {
1510
+ para.addHyperlink(result.hyperlink);
1511
+ }
1512
+ for (const bookmark of result.bookmarkStarts) {
1513
+ para.addBookmarkStart(bookmark);
1514
+ }
1515
+ for (const bookmark of result.bookmarkEnds) {
1516
+ para.addBookmarkEnd(bookmark);
1517
+ }
1518
+ }
1519
+ searchPos = childEnd;
1520
+ }
1521
+ else {
1522
+ searchPos = tagEnd + 1;
1323
1523
  }
1324
1524
  }
1325
1525
  return para;
@@ -1417,11 +1617,28 @@ export class DocumentParser {
1417
1617
  if (elementIndex < runArray.length) {
1418
1618
  const child = runArray[elementIndex];
1419
1619
  if (child['w:drawing']) {
1620
+ let imageRun = null;
1420
1621
  if (zipHandler && imageManager) {
1421
- const imageRun = await this.parseDrawingFromObject(child['w:drawing'], zipHandler, relationshipManager, imageManager);
1422
- if (imageRun) {
1423
- this.parseRunPropertiesFromObject(child['w:rPr'], imageRun);
1424
- paragraph.addRun(imageRun);
1622
+ imageRun = await this.parseDrawingFromObject(child['w:drawing'], zipHandler, relationshipManager, imageManager);
1623
+ }
1624
+ if (imageRun) {
1625
+ this.parseRunPropertiesFromObject(child['w:rPr'], imageRun);
1626
+ paragraph.addRun(imageRun);
1627
+ if (child['w:t'] ||
1628
+ child['w:tab'] ||
1629
+ child['w:br'] ||
1630
+ child['w:cr'] ||
1631
+ child['w:noBreakHyphen']) {
1632
+ const siblingRun = this.parseRunFromObject(child);
1633
+ if (siblingRun) {
1634
+ paragraph.addRun(siblingRun);
1635
+ }
1636
+ }
1637
+ }
1638
+ else {
1639
+ const runXml = this.objectToXml({ 'w:r': child });
1640
+ if (runXml) {
1641
+ paragraph.addContent(new PreservedElement(runXml, 'w:r', 'inline'));
1425
1642
  }
1426
1643
  }
1427
1644
  }
@@ -1470,11 +1687,28 @@ export class DocumentParser {
1470
1687
  const runChildren = Array.isArray(runs) ? runs : runs ? [runs] : [];
1471
1688
  for (const child of runChildren) {
1472
1689
  if (child['w:drawing']) {
1690
+ let imageRun = null;
1473
1691
  if (zipHandler && imageManager) {
1474
- const imageRun = await this.parseDrawingFromObject(child['w:drawing'], zipHandler, relationshipManager, imageManager);
1475
- if (imageRun) {
1476
- this.parseRunPropertiesFromObject(child['w:rPr'], imageRun);
1477
- paragraph.addRun(imageRun);
1692
+ imageRun = await this.parseDrawingFromObject(child['w:drawing'], zipHandler, relationshipManager, imageManager);
1693
+ }
1694
+ if (imageRun) {
1695
+ this.parseRunPropertiesFromObject(child['w:rPr'], imageRun);
1696
+ paragraph.addRun(imageRun);
1697
+ if (child['w:t'] ||
1698
+ child['w:tab'] ||
1699
+ child['w:br'] ||
1700
+ child['w:cr'] ||
1701
+ child['w:noBreakHyphen']) {
1702
+ const siblingRun = this.parseRunFromObject(child);
1703
+ if (siblingRun) {
1704
+ paragraph.addRun(siblingRun);
1705
+ }
1706
+ }
1707
+ }
1708
+ else {
1709
+ const runXml = this.objectToXml({ 'w:r': child });
1710
+ if (runXml) {
1711
+ paragraph.addContent(new PreservedElement(runXml, 'w:r', 'inline'));
1478
1712
  }
1479
1713
  }
1480
1714
  }
@@ -2899,9 +3133,9 @@ export class DocumentParser {
2899
3133
  return '';
2900
3134
  }
2901
3135
  if (typeof node === 'object') {
2902
- return XMLBuilder.unescapeXml(node['#text'] || '');
3136
+ return node['#text'] != null ? String(node['#text']) : '';
2903
3137
  }
2904
- return XMLBuilder.unescapeXml(String(node));
3138
+ return String(node);
2905
3139
  };
2906
3140
  const parseBooleanAttr = (value) => {
2907
3141
  if (value === undefined || value === null) {
@@ -3504,13 +3738,18 @@ export class DocumentParser {
3504
3738
  anchor: finalAnchor,
3505
3739
  text: displayText,
3506
3740
  formatting,
3741
+ preserveFormatting: true,
3507
3742
  tooltip,
3508
3743
  relationshipId: finalRelationshipId,
3509
3744
  tgtFrame,
3510
3745
  history,
3511
3746
  docLocation,
3512
3747
  });
3513
- if (parsedRun && parsedRun.getContent().length > 1) {
3748
+ if (parsedRuns.length > 1 && (text || parsedRuns.some((r) => r.getContent().length > 1))) {
3749
+ hyperlink.setRuns(parsedRuns);
3750
+ }
3751
+ else if (parsedRun &&
3752
+ ((parsedRuns.length === 1 && text) || parsedRun.getContent().length > 1)) {
3514
3753
  hyperlink.setRun(parsedRun);
3515
3754
  }
3516
3755
  result.hyperlink = hyperlink;
@@ -3664,6 +3903,26 @@ export class DocumentParser {
3664
3903
  fldLock,
3665
3904
  dirty,
3666
3905
  });
3906
+ const resultRuns = fieldObj['w:r'];
3907
+ const resultRunArray = Array.isArray(resultRuns)
3908
+ ? resultRuns
3909
+ : resultRuns
3910
+ ? [resultRuns]
3911
+ : [];
3912
+ const cachedRuns = [];
3913
+ for (const runObj of resultRunArray) {
3914
+ const run = this.parseRunFromObject(runObj);
3915
+ if (run) {
3916
+ const runFormatting = run.getFormatting();
3917
+ cachedRuns.push({
3918
+ text: run.getText(),
3919
+ formatting: Object.keys(runFormatting).length > 0 ? runFormatting : undefined,
3920
+ });
3921
+ }
3922
+ }
3923
+ if (cachedRuns.length > 0) {
3924
+ field.setCachedResultRuns(cachedRuns);
3925
+ }
3667
3926
  return field;
3668
3927
  }
3669
3928
  catch (error) {
@@ -3850,7 +4109,7 @@ export class DocumentParser {
3850
4109
  if (rPrObj['w:rFonts']) {
3851
4110
  const rFonts = rPrObj['w:rFonts'];
3852
4111
  if (rFonts['@_w:ascii'] !== undefined)
3853
- run.setFont(String(rFonts['@_w:ascii']));
4112
+ run.setFontAscii(String(rFonts['@_w:ascii']));
3854
4113
  if (rFonts['@_w:hAnsi'] !== undefined)
3855
4114
  run.setFontHAnsi(String(rFonts['@_w:hAnsi']));
3856
4115
  if (rFonts['@_w:eastAsia'] !== undefined)
@@ -4625,8 +4884,9 @@ export class DocumentParser {
4625
4884
  'wp:cNvGraphicFramePr',
4626
4885
  'a:graphic',
4627
4886
  ]);
4628
- if (anchorExtras)
4629
- image._setRawPassthrough('anchor-extra', anchorExtras);
4887
+ if (anchorExtras) {
4888
+ image._setRawPassthrough('anchor-extra', normalizeAnchorSizeRel(anchorExtras));
4889
+ }
4630
4890
  }
4631
4891
  if (docPrObj) {
4632
4892
  const docPrExtras = this.collectUnmodeledChildren(docPrObj, []);
@@ -4675,7 +4935,9 @@ export class DocumentParser {
4675
4935
  type = 'none';
4676
4936
  return {
4677
4937
  type,
4678
- side: wrapObj['@_wrapText'] || 'bothSides',
4938
+ side: type === 'none' || type === 'topAndBottom'
4939
+ ? wrapObj['@_wrapText']
4940
+ : wrapObj['@_wrapText'] || 'bothSides',
4679
4941
  distanceTop: wrapObj['@_distT'] ? parseInt(wrapObj['@_distT'], 10) : undefined,
4680
4942
  distanceBottom: wrapObj['@_distB'] ? parseInt(wrapObj['@_distB'], 10) : undefined,
4681
4943
  distanceLeft: wrapObj['@_distL'] ? parseInt(wrapObj['@_distL'], 10) : undefined,
@@ -5663,7 +5925,7 @@ export class DocumentParser {
5663
5925
  }
5664
5926
  return depth === 0 ? pos : -1;
5665
5927
  }
5666
- async parseSDTFromObject(sdtObj, relationshipManager, zipHandler, imageManager) {
5928
+ async parseSDTFromObject(sdtObj, relationshipManager, zipHandler, imageManager, rawSdtXml) {
5667
5929
  try {
5668
5930
  if (!sdtObj)
5669
5931
  return null;
@@ -5724,10 +5986,14 @@ export class DocumentParser {
5724
5986
  else if (sdtPr['w14:checkbox']) {
5725
5987
  properties.controlType = 'checkbox';
5726
5988
  const checkboxElement = sdtPr['w14:checkbox'];
5989
+ const rawCheckedFont = checkboxElement?.['w14:checkedState']?.['@_w14:font'];
5990
+ const rawUncheckedFont = checkboxElement?.['w14:uncheckedState']?.['@_w14:font'];
5727
5991
  properties.checkbox = {
5728
5992
  checked: parseOoxmlBoolean(checkboxElement?.['w14:checked'], '@_w14:val'),
5729
5993
  checkedState: String(checkboxElement?.['w14:checkedState']?.['@_w14:val'] ?? ''),
5730
5994
  uncheckedState: String(checkboxElement?.['w14:uncheckedState']?.['@_w14:val'] ?? ''),
5995
+ checkedFont: rawCheckedFont === undefined ? undefined : String(rawCheckedFont),
5996
+ uncheckedFont: rawUncheckedFont === undefined ? undefined : String(rawUncheckedFont),
5731
5997
  };
5732
5998
  }
5733
5999
  else if (sdtPr['w:picture']) {
@@ -5782,6 +6048,32 @@ export class DocumentParser {
5782
6048
  properties.showingPlcHdr = parseOoxmlBoolean(showingPlcHdr);
5783
6049
  }
5784
6050
  }
6051
+ let rawSdtPrXml;
6052
+ if (sdtPr !== undefined) {
6053
+ if (rawSdtXml) {
6054
+ const prPos = rawSdtXml.indexOf('<w:sdtPr');
6055
+ if (prPos !== -1) {
6056
+ rawSdtPrXml = this.extractSingleElement(rawSdtXml, 'w:sdtPr', prPos) || undefined;
6057
+ }
6058
+ }
6059
+ if (rawSdtPrXml === undefined) {
6060
+ rawSdtPrXml = this.objectToXml({ 'w:sdtPr': sdtPr }) || undefined;
6061
+ }
6062
+ }
6063
+ let rawSdtEndPrXml;
6064
+ const sdtEndPr = sdtObj['w:sdtEndPr'];
6065
+ if (sdtEndPr !== undefined) {
6066
+ if (rawSdtXml) {
6067
+ const endPrPos = rawSdtXml.indexOf('<w:sdtEndPr');
6068
+ if (endPrPos !== -1) {
6069
+ rawSdtEndPrXml =
6070
+ this.extractSingleElement(rawSdtXml, 'w:sdtEndPr', endPrPos) || undefined;
6071
+ }
6072
+ }
6073
+ if (rawSdtEndPrXml === undefined) {
6074
+ rawSdtEndPrXml = this.objectToXml({ 'w:sdtEndPr': sdtEndPr }) || undefined;
6075
+ }
6076
+ }
5785
6077
  const content = [];
5786
6078
  const sdtContent = sdtObj['w:sdtContent'];
5787
6079
  if (sdtContent) {
@@ -5825,6 +6117,19 @@ export class DocumentParser {
5825
6117
  content.push(nestedSdt);
5826
6118
  }
5827
6119
  }
6120
+ else if (!elementType.startsWith('@_') && elementType !== '#text') {
6121
+ const others = sdtContent[elementType];
6122
+ const otherArray = Array.isArray(others)
6123
+ ? others
6124
+ : others !== undefined
6125
+ ? [others]
6126
+ : [];
6127
+ if (elementIndex < otherArray.length) {
6128
+ const rawXml = this.objectToXml({ [elementType]: otherArray[elementIndex] });
6129
+ if (rawXml)
6130
+ content.push(new PreservedElement(rawXml, elementType, 'block'));
6131
+ }
6132
+ }
5828
6133
  }
5829
6134
  }
5830
6135
  else {
@@ -5850,6 +6155,27 @@ export class DocumentParser {
5850
6155
  if (nestedSdt)
5851
6156
  content.push(nestedSdt);
5852
6157
  }
6158
+ for (const key of Object.keys(sdtContent)) {
6159
+ if (key === 'w:p' ||
6160
+ key === 'w:tbl' ||
6161
+ key === 'w:sdt' ||
6162
+ key === '#text' ||
6163
+ key === '_orderedChildren' ||
6164
+ key.startsWith('@_')) {
6165
+ continue;
6166
+ }
6167
+ const others = sdtContent[key];
6168
+ const otherArray = Array.isArray(others)
6169
+ ? others
6170
+ : others !== undefined
6171
+ ? [others]
6172
+ : [];
6173
+ for (const otherObj of otherArray) {
6174
+ const rawXml = this.objectToXml({ [key]: otherObj });
6175
+ if (rawXml)
6176
+ content.push(new PreservedElement(rawXml, key, 'block'));
6177
+ }
6178
+ }
5853
6179
  }
5854
6180
  }
5855
6181
  if (properties.buildingBlock?.gallery === 'Table of Contents') {
@@ -5858,7 +6184,12 @@ export class DocumentParser {
5858
6184
  return new TableOfContentsElement(toc);
5859
6185
  }
5860
6186
  }
5861
- return new StructuredDocumentTag(properties, content);
6187
+ const sdt = new StructuredDocumentTag(properties, content);
6188
+ if (rawSdtPrXml !== undefined)
6189
+ sdt._setRawSdtPrXml(rawSdtPrXml);
6190
+ if (rawSdtEndPrXml !== undefined)
6191
+ sdt._setRawSdtEndPrXml(rawSdtEndPrXml);
6192
+ return sdt;
5862
6193
  }
5863
6194
  catch (error) {
5864
6195
  defaultLogger.warn('[DocumentParser] Failed to parse SDT:', error instanceof Error
@@ -6117,10 +6448,10 @@ export class DocumentParser {
6117
6448
  }
6118
6449
  objectToXml(obj) {
6119
6450
  const buildXml = (o, name) => {
6120
- if (typeof o === 'string')
6121
- return o;
6122
- if (typeof o !== 'object')
6123
- return String(o);
6451
+ if (typeof o !== 'object' || o === null) {
6452
+ const text = String(o ?? '');
6453
+ return name ? `<${name}>${text}</${name}>` : text;
6454
+ }
6124
6455
  const keys = Object.keys(o);
6125
6456
  if (keys.length === 0 && !name)
6126
6457
  return '';
@@ -6391,6 +6722,8 @@ export class DocumentParser {
6391
6722
  return null;
6392
6723
  }
6393
6724
  }
6725
+ const sectPrWithChange = sectPr;
6726
+ sectPr = sectPr.replace(/<w:sectPrChange[\s\S]*?<\/w:sectPrChange>/, '');
6394
6727
  const sectionProps = {};
6395
6728
  const pgSzElements = XMLParser.extractElements(sectPr, 'w:pgSz');
6396
6729
  if (pgSzElements.length > 0) {
@@ -6752,7 +7085,7 @@ export class DocumentParser {
6752
7085
  }
6753
7086
  }
6754
7087
  const section = new Section(sectionProps);
6755
- const sectPrChangeElements = XMLParser.extractElements(sectPr, 'w:sectPrChange');
7088
+ const sectPrChangeElements = XMLParser.extractElements(sectPrWithChange, 'w:sectPrChange');
6756
7089
  if (sectPrChangeElements.length > 0 && sectPrChangeElements[0]) {
6757
7090
  const changeXml = sectPrChangeElements[0];
6758
7091
  const id = XMLParser.extractAttribute(changeXml, 'w:id') || '0';
@@ -6799,17 +7132,20 @@ export class DocumentParser {
6799
7132
  }
6800
7133
  }
6801
7134
  }
6802
- const basedOnElement = XMLParser.extractBetweenTags(styleXml, '<w:basedOn', '</w:basedOn>');
6803
- const basedOn = basedOnElement
6804
- ? XMLParser.extractAttribute(`<w:basedOn${basedOnElement}`, 'w:val')
6805
- : undefined;
6806
- const nextElement = XMLParser.extractBetweenTags(styleXml, '<w:next', '</w:next>');
6807
- const next = nextElement
6808
- ? XMLParser.extractAttribute(`<w:next${nextElement}`, 'w:val')
6809
- : undefined;
7135
+ let basedOn;
7136
+ const basedOnAttrs = XMLParser.extractSelfClosingTag(styleXml, 'w:basedOn');
7137
+ if (basedOnAttrs) {
7138
+ basedOn = XMLParser.extractAttribute(`<w:basedOn${basedOnAttrs}/>`, 'w:val');
7139
+ }
7140
+ let next;
7141
+ const nextAttrs = XMLParser.extractSelfClosingTag(styleXml, 'w:next');
7142
+ if (nextAttrs) {
7143
+ next = XMLParser.extractAttribute(`<w:next${nextAttrs}/>`, 'w:val');
7144
+ }
7145
+ const styleBase = styleXml.replace(/<w:tblStylePr[\s\S]*?<\/w:tblStylePr>/g, '');
6810
7146
  let paragraphFormatting;
6811
7147
  let styleNumPr;
6812
- const pPrXml = XMLParser.extractBetweenTags(styleXml, '<w:pPr>', '</w:pPr>');
7148
+ const pPrXml = XMLParser.extractBetweenTags(styleBase, '<w:pPr>', '</w:pPr>');
6813
7149
  if (pPrXml) {
6814
7150
  paragraphFormatting = this.parseParagraphFormattingFromXml(pPrXml);
6815
7151
  const numPrXml = XMLParser.extractBetweenTags(pPrXml, '<w:numPr>', '</w:numPr>');
@@ -6826,7 +7162,7 @@ export class DocumentParser {
6826
7162
  }
6827
7163
  }
6828
7164
  let runFormatting;
6829
- const rPrXml = XMLParser.extractBetweenTags(styleXml, '<w:rPr>', '</w:rPr>');
7165
+ const rPrXml = XMLParser.extractBetweenTags(styleBase, '<w:rPr>', '</w:rPr>');
6830
7166
  if (rPrXml) {
6831
7167
  runFormatting = this.parseRunFormattingFromXml(rPrXml);
6832
7168
  }
@@ -8029,11 +8365,21 @@ export class DocumentParser {
8029
8365
  return namespaces;
8030
8366
  }
8031
8367
  parseDocumentBackground(docXml) {
8032
- const bgMatch = /<w:background([^>]*?)\/>/.exec(docXml);
8033
- if (!bgMatch?.[1])
8368
+ const bgMatch = /<w:background([^>]*?)(\/>|>)/.exec(docXml);
8369
+ if (!bgMatch)
8034
8370
  return undefined;
8035
- const attrStr = bgMatch[1];
8371
+ const attrStr = bgMatch[1] ?? '';
8036
8372
  const result = {};
8373
+ if (bgMatch[2] === '>') {
8374
+ const innerStart = bgMatch.index + bgMatch[0].length;
8375
+ const closeIndex = docXml.indexOf('</w:background>', innerStart);
8376
+ if (closeIndex !== -1) {
8377
+ const inner = docXml.substring(innerStart, closeIndex);
8378
+ if (inner.length > 0) {
8379
+ result.rawInnerXml = inner;
8380
+ }
8381
+ }
8382
+ }
8037
8383
  const colorMatch = /w:color="([^"]+)"/.exec(attrStr);
8038
8384
  if (colorMatch?.[1])
8039
8385
  result.color = colorMatch[1];