@x15ventures/x15-ui-library 3.19.0 → 3.20.0

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 (484) hide show
  1. package/THIRD_PARTY_LICENSES.md +11182 -0
  2. package/dist/cjs/autoGenerated/libraryThemes.js +12 -12
  3. package/dist/cjs/autoGenerated/libraryThemes.js.map +1 -1
  4. package/dist/cjs/autoGenerated/libraryThemes.json +12 -12
  5. package/dist/cjs/components/design/banners/pageBanner/PageBanner.js +27 -12
  6. package/dist/cjs/components/design/banners/pageBanner/PageBanner.js.map +1 -1
  7. package/dist/cjs/components/design/card/cardHeader/CardHeaderItem.js +22 -15
  8. package/dist/cjs/components/design/card/cardHeader/CardHeaderItem.js.map +1 -1
  9. package/dist/cjs/components/design/dialog/dialog.css +4 -0
  10. package/dist/cjs/components/design/logos/LogoLink.js +2 -1
  11. package/dist/cjs/components/design/logos/LogoLink.js.map +1 -1
  12. package/dist/cjs/components/design/logos/VentureLogo.js +2 -1
  13. package/dist/cjs/components/design/logos/VentureLogo.js.map +1 -1
  14. package/dist/cjs/components/design/revealMore/RevealMoreBelow.js +2 -2
  15. package/dist/cjs/components/design/revealMore/RevealMoreBelow.js.map +1 -1
  16. package/dist/cjs/components/design/skeleton/Skeleton.js +15 -5
  17. package/dist/cjs/components/design/skeleton/Skeleton.js.map +1 -1
  18. package/dist/cjs/components/design/themeLoader/ThemeLoader.js +1 -1
  19. package/dist/cjs/components/design/themeLoader/ThemeLoader.js.map +1 -1
  20. package/dist/cjs/components/form/buttons/SimpleButton.js +3 -1
  21. package/dist/cjs/components/form/buttons/SimpleButton.js.map +1 -1
  22. package/dist/cjs/components/form/buttons/button.interface.js.map +1 -1
  23. package/dist/cjs/components/form/buttons/userPicButton/UserPicButton.js +5 -3
  24. package/dist/cjs/components/form/buttons/userPicButton/UserPicButton.js.map +1 -1
  25. package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +64 -19
  26. package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
  27. package/dist/cjs/components/navigation/link/Link.js +2 -1
  28. package/dist/cjs/components/navigation/link/Link.js.map +1 -1
  29. package/dist/cjs/components/testing/devToolbar/DevToolbar.js +5 -3
  30. package/dist/cjs/components/testing/devToolbar/DevToolbar.js.map +1 -1
  31. package/dist/cjs/constants/fileUploadTypes.js +9 -4
  32. package/dist/cjs/constants/fileUploadTypes.js.map +1 -1
  33. package/dist/cjs/helpers/dateHelpers.js +34 -23
  34. package/dist/cjs/helpers/dateHelpers.js.map +1 -1
  35. package/dist/cjs/helpers/fileHelpers.js +58 -0
  36. package/dist/cjs/helpers/fileHelpers.js.map +1 -0
  37. package/dist/cjs/helpers/index.js +44 -0
  38. package/dist/cjs/helpers/index.js.map +1 -1
  39. package/dist/cjs/helpers/interactionsHelper.js +8 -1
  40. package/dist/cjs/helpers/interactionsHelper.js.map +1 -1
  41. package/dist/cjs/helpers/objectHelpers.js +23 -9
  42. package/dist/cjs/helpers/objectHelpers.js.map +1 -1
  43. package/dist/cjs/helpers/stringHelpers.js +61 -5
  44. package/dist/cjs/helpers/stringHelpers.js.map +1 -1
  45. package/dist/cjs/helpers/urlHelpers.js +48 -0
  46. package/dist/cjs/helpers/urlHelpers.js.map +1 -0
  47. package/dist/cjs/index.js +191 -0
  48. package/dist/cjs/index.js.map +1 -1
  49. package/dist/cjs/package.json +3 -305
  50. package/dist/cjs/styles/index.css +18 -0
  51. package/dist/cjs/styles/variables/cssVars/_designVariables.css +18 -0
  52. package/dist/cjs/widgets/documentComments/DocumentComments.js +305 -0
  53. package/dist/cjs/widgets/documentComments/DocumentComments.js.map +1 -0
  54. package/dist/cjs/widgets/documentComments/_documentCommentsVariables.css +0 -0
  55. package/dist/cjs/widgets/documentComments/documentComments.css +107 -0
  56. package/dist/cjs/widgets/documentComments/documentComments.interfaces.js +6 -0
  57. package/dist/cjs/widgets/documentComments/documentComments.interfaces.js.map +1 -0
  58. package/dist/cjs/widgets/documentComments/index.js +19 -0
  59. package/dist/cjs/widgets/documentComments/index.js.map +1 -0
  60. package/dist/cjs/widgets/documentComparer/DocumentComparer.js +309 -0
  61. package/dist/cjs/widgets/documentComparer/DocumentComparer.js.map +1 -0
  62. package/dist/cjs/widgets/documentComparer/_documentComparerVariables.css +0 -0
  63. package/dist/cjs/widgets/documentComparer/documentComparer.css +117 -0
  64. package/dist/cjs/widgets/documentComparer/documentComparer.interfaces.js +6 -0
  65. package/dist/cjs/widgets/documentComparer/documentComparer.interfaces.js.map +1 -0
  66. package/dist/cjs/widgets/documentComparer/index.js +19 -0
  67. package/dist/cjs/widgets/documentComparer/index.js.map +1 -0
  68. package/dist/cjs/widgets/documentEditor/DocumentEditor.js +142 -0
  69. package/dist/cjs/widgets/documentEditor/DocumentEditor.js.map +1 -0
  70. package/dist/cjs/widgets/documentEditor/_documentEditorVariables.css +0 -0
  71. package/dist/cjs/widgets/documentEditor/documentEditor.css +33 -0
  72. package/dist/cjs/widgets/documentEditor/documentEditor.interfaces.js +6 -0
  73. package/dist/cjs/widgets/documentEditor/documentEditor.interfaces.js.map +1 -0
  74. package/dist/cjs/widgets/documentEditor/index.js +19 -0
  75. package/dist/cjs/widgets/documentEditor/index.js.map +1 -0
  76. package/dist/cjs/widgets/documentViewer/DocumentViewer.js +206 -0
  77. package/dist/cjs/widgets/documentViewer/DocumentViewer.js.map +1 -0
  78. package/dist/cjs/widgets/documentViewer/_documentViewerVariables.css +0 -0
  79. package/dist/cjs/widgets/documentViewer/documentViewer.css +82 -0
  80. package/dist/cjs/widgets/documentViewer/documentViewer.interfaces.js +6 -0
  81. package/dist/cjs/widgets/documentViewer/documentViewer.interfaces.js.map +1 -0
  82. package/dist/cjs/widgets/documentViewer/index.js +19 -0
  83. package/dist/cjs/widgets/documentViewer/index.js.map +1 -0
  84. package/dist/cjs/widgets/index.js +126 -0
  85. package/dist/cjs/widgets/index.js.map +1 -1
  86. package/dist/cjs/widgets/shared/documents/ToggleGroup.js +32 -0
  87. package/dist/cjs/widgets/shared/documents/ToggleGroup.js.map +1 -0
  88. package/dist/cjs/widgets/shared/documents/_documentVariables.css +0 -0
  89. package/dist/cjs/widgets/shared/documents/annotations/AnnotationLayer.js +279 -0
  90. package/dist/cjs/widgets/shared/documents/annotations/AnnotationLayer.js.map +1 -0
  91. package/dist/cjs/widgets/shared/documents/annotations/_annotationLayerVariables.css +0 -0
  92. package/dist/cjs/widgets/shared/documents/annotations/annotationLayer.css +65 -0
  93. package/dist/cjs/widgets/shared/documents/annotations/annotations.interfaces.js +21 -0
  94. package/dist/cjs/widgets/shared/documents/annotations/annotations.interfaces.js.map +1 -0
  95. package/dist/cjs/widgets/shared/documents/annotations/highlightRegistry.js +67 -0
  96. package/dist/cjs/widgets/shared/documents/annotations/highlightRegistry.js.map +1 -0
  97. package/dist/cjs/widgets/shared/documents/annotations/index.js +39 -0
  98. package/dist/cjs/widgets/shared/documents/annotations/index.js.map +1 -0
  99. package/dist/cjs/widgets/shared/documents/annotations/textIndex.js +112 -0
  100. package/dist/cjs/widgets/shared/documents/annotations/textIndex.js.map +1 -0
  101. package/dist/cjs/widgets/shared/documents/annotations/textQuoteAnchor.js +160 -0
  102. package/dist/cjs/widgets/shared/documents/annotations/textQuoteAnchor.js.map +1 -0
  103. package/dist/cjs/widgets/shared/documents/documentHelpers.js +186 -0
  104. package/dist/cjs/widgets/shared/documents/documentHelpers.js.map +1 -0
  105. package/dist/cjs/widgets/shared/documents/documents.interfaces.js +6 -0
  106. package/dist/cjs/widgets/shared/documents/documents.interfaces.js.map +1 -0
  107. package/dist/cjs/widgets/shared/documents/engines/documentDiff/DocumentDiff.js +73 -0
  108. package/dist/cjs/widgets/shared/documents/engines/documentDiff/DocumentDiff.js.map +1 -0
  109. package/dist/cjs/widgets/shared/documents/engines/documentDiff/_documentDiffVariables.css +0 -0
  110. package/dist/cjs/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js +114 -0
  111. package/dist/cjs/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js.map +1 -0
  112. package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.css +69 -0
  113. package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js +6 -0
  114. package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js.map +1 -0
  115. package/dist/cjs/widgets/shared/documents/engines/lazyEngines.js +19 -0
  116. package/dist/cjs/widgets/shared/documents/engines/lazyEngines.js.map +1 -0
  117. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js +200 -0
  118. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js.map +1 -0
  119. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/_markdownEditorEngineVariables.css +0 -0
  120. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.css +50 -0
  121. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js +6 -0
  122. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js.map +1 -0
  123. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js +179 -0
  124. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js.map +1 -0
  125. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js +278 -0
  126. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js.map +1 -0
  127. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js +208 -0
  128. package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js.map +1 -0
  129. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js +85 -0
  130. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js.map +1 -0
  131. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/_markdownRendererVariables.css +0 -0
  132. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/markdownRenderer.css +78 -0
  133. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/index.js +64 -0
  134. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/index.js.map +1 -0
  135. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js +6 -0
  136. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js.map +1 -0
  137. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js +71 -0
  138. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js.map +1 -0
  139. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js +192 -0
  140. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js.map +1 -0
  141. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js +86 -0
  142. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js.map +1 -0
  143. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js +38 -0
  144. package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js.map +1 -0
  145. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/WordRenderer.js +49 -0
  146. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/WordRenderer.js.map +1 -0
  147. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js +214 -0
  148. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js.map +1 -0
  149. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js +112 -0
  150. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js.map +1 -0
  151. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordXml.js +68 -0
  152. package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordXml.js.map +1 -0
  153. package/dist/cjs/widgets/shared/documents/index.js +50 -0
  154. package/dist/cjs/widgets/shared/documents/index.js.map +1 -0
  155. package/dist/cjs/widgets/shared/documents/toggleGroup.css +8 -0
  156. package/dist/cjs/widgets/shared/documents/useDocumentContent.js +222 -0
  157. package/dist/cjs/widgets/shared/documents/useDocumentContent.js.map +1 -0
  158. package/dist/components/design/banners/pageBanner/PageBanner.d.ts.map +1 -1
  159. package/dist/components/design/card/cardHeader/CardHeaderItem.d.ts.map +1 -1
  160. package/dist/components/design/logos/LogoLink.d.ts.map +1 -1
  161. package/dist/components/design/logos/VentureLogo.d.ts.map +1 -1
  162. package/dist/components/design/skeleton/Skeleton.d.ts +1 -1
  163. package/dist/components/design/skeleton/Skeleton.d.ts.map +1 -1
  164. package/dist/components/design/themeLoader/ThemeLoader.d.ts.map +1 -1
  165. package/dist/components/form/buttons/SimpleButton.d.ts.map +1 -1
  166. package/dist/components/form/buttons/button.interface.d.ts +1 -0
  167. package/dist/components/form/buttons/button.interface.d.ts.map +1 -1
  168. package/dist/components/form/buttons/userPicButton/UserPicButton.d.ts.map +1 -1
  169. package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.d.ts.map +1 -1
  170. package/dist/components/navigation/link/Link.d.ts.map +1 -1
  171. package/dist/components/testing/devToolbar/DevToolbar.d.ts.map +1 -1
  172. package/dist/constants/fileUploadTypes.d.ts.map +1 -1
  173. package/dist/esm/autoGenerated/libraryThemes.js +12 -12
  174. package/dist/esm/autoGenerated/libraryThemes.js.map +1 -1
  175. package/dist/esm/autoGenerated/libraryThemes.json +12 -12
  176. package/dist/esm/components/design/banners/pageBanner/PageBanner.js +27 -12
  177. package/dist/esm/components/design/banners/pageBanner/PageBanner.js.map +1 -1
  178. package/dist/esm/components/design/card/cardHeader/CardHeaderItem.js +22 -15
  179. package/dist/esm/components/design/card/cardHeader/CardHeaderItem.js.map +1 -1
  180. package/dist/esm/components/design/dialog/dialog.css +4 -0
  181. package/dist/esm/components/design/logos/LogoLink.js +2 -1
  182. package/dist/esm/components/design/logos/LogoLink.js.map +1 -1
  183. package/dist/esm/components/design/logos/VentureLogo.js +2 -1
  184. package/dist/esm/components/design/logos/VentureLogo.js.map +1 -1
  185. package/dist/esm/components/design/revealMore/RevealMoreBelow.js +1 -1
  186. package/dist/esm/components/design/revealMore/RevealMoreBelow.js.map +1 -1
  187. package/dist/esm/components/design/skeleton/Skeleton.js +15 -5
  188. package/dist/esm/components/design/skeleton/Skeleton.js.map +1 -1
  189. package/dist/esm/components/design/themeLoader/ThemeLoader.js +1 -1
  190. package/dist/esm/components/design/themeLoader/ThemeLoader.js.map +1 -1
  191. package/dist/esm/components/form/buttons/SimpleButton.js +3 -1
  192. package/dist/esm/components/form/buttons/SimpleButton.js.map +1 -1
  193. package/dist/esm/components/form/buttons/button.interface.js.map +1 -1
  194. package/dist/esm/components/form/buttons/userPicButton/UserPicButton.js +5 -3
  195. package/dist/esm/components/form/buttons/userPicButton/UserPicButton.js.map +1 -1
  196. package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +65 -19
  197. package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
  198. package/dist/esm/components/navigation/link/Link.js +2 -1
  199. package/dist/esm/components/navigation/link/Link.js.map +1 -1
  200. package/dist/esm/components/testing/devToolbar/DevToolbar.js +5 -3
  201. package/dist/esm/components/testing/devToolbar/DevToolbar.js.map +1 -1
  202. package/dist/esm/constants/fileUploadTypes.js +9 -4
  203. package/dist/esm/constants/fileUploadTypes.js.map +1 -1
  204. package/dist/esm/helpers/dateHelpers.js +34 -23
  205. package/dist/esm/helpers/dateHelpers.js.map +1 -1
  206. package/dist/esm/helpers/fileHelpers.js +48 -0
  207. package/dist/esm/helpers/fileHelpers.js.map +1 -0
  208. package/dist/esm/helpers/index.js +2 -0
  209. package/dist/esm/helpers/index.js.map +1 -1
  210. package/dist/esm/helpers/interactionsHelper.js +5 -0
  211. package/dist/esm/helpers/interactionsHelper.js.map +1 -1
  212. package/dist/esm/helpers/objectHelpers.js +23 -9
  213. package/dist/esm/helpers/objectHelpers.js.map +1 -1
  214. package/dist/esm/helpers/stringHelpers.js +61 -5
  215. package/dist/esm/helpers/stringHelpers.js.map +1 -1
  216. package/dist/esm/helpers/urlHelpers.js +40 -0
  217. package/dist/esm/helpers/urlHelpers.js.map +1 -0
  218. package/dist/esm/index.js +3 -1
  219. package/dist/esm/index.js.map +1 -1
  220. package/dist/esm/package.json +2 -304
  221. package/dist/esm/styles/index.css +18 -0
  222. package/dist/esm/styles/variables/cssVars/_designVariables.css +18 -0
  223. package/dist/esm/widgets/documentComments/DocumentComments.js +298 -0
  224. package/dist/esm/widgets/documentComments/DocumentComments.js.map +1 -0
  225. package/dist/esm/widgets/documentComments/_documentCommentsVariables.css +0 -0
  226. package/dist/esm/widgets/documentComments/documentComments.css +107 -0
  227. package/dist/esm/widgets/documentComments/documentComments.interfaces.js +2 -0
  228. package/dist/esm/widgets/documentComments/documentComments.interfaces.js.map +1 -0
  229. package/dist/esm/widgets/documentComments/index.js +2 -0
  230. package/dist/esm/widgets/documentComments/index.js.map +1 -0
  231. package/dist/esm/widgets/documentComparer/DocumentComparer.js +301 -0
  232. package/dist/esm/widgets/documentComparer/DocumentComparer.js.map +1 -0
  233. package/dist/esm/widgets/documentComparer/_documentComparerVariables.css +0 -0
  234. package/dist/esm/widgets/documentComparer/documentComparer.css +117 -0
  235. package/dist/esm/widgets/documentComparer/documentComparer.interfaces.js +2 -0
  236. package/dist/esm/widgets/documentComparer/documentComparer.interfaces.js.map +1 -0
  237. package/dist/esm/widgets/documentComparer/index.js +2 -0
  238. package/dist/esm/widgets/documentComparer/index.js.map +1 -0
  239. package/dist/esm/widgets/documentEditor/DocumentEditor.js +135 -0
  240. package/dist/esm/widgets/documentEditor/DocumentEditor.js.map +1 -0
  241. package/dist/esm/widgets/documentEditor/_documentEditorVariables.css +0 -0
  242. package/dist/esm/widgets/documentEditor/documentEditor.css +33 -0
  243. package/dist/esm/widgets/documentEditor/documentEditor.interfaces.js +2 -0
  244. package/dist/esm/widgets/documentEditor/documentEditor.interfaces.js.map +1 -0
  245. package/dist/esm/widgets/documentEditor/index.js +2 -0
  246. package/dist/esm/widgets/documentEditor/index.js.map +1 -0
  247. package/dist/esm/widgets/documentViewer/DocumentViewer.js +198 -0
  248. package/dist/esm/widgets/documentViewer/DocumentViewer.js.map +1 -0
  249. package/dist/esm/widgets/documentViewer/_documentViewerVariables.css +0 -0
  250. package/dist/esm/widgets/documentViewer/documentViewer.css +82 -0
  251. package/dist/esm/widgets/documentViewer/documentViewer.interfaces.js +2 -0
  252. package/dist/esm/widgets/documentViewer/documentViewer.interfaces.js.map +1 -0
  253. package/dist/esm/widgets/documentViewer/index.js +2 -0
  254. package/dist/esm/widgets/documentViewer/index.js.map +1 -0
  255. package/dist/esm/widgets/index.js +6 -0
  256. package/dist/esm/widgets/index.js.map +1 -1
  257. package/dist/esm/widgets/shared/documents/ToggleGroup.js +24 -0
  258. package/dist/esm/widgets/shared/documents/ToggleGroup.js.map +1 -0
  259. package/dist/esm/widgets/shared/documents/_documentVariables.css +0 -0
  260. package/dist/esm/widgets/shared/documents/annotations/AnnotationLayer.js +273 -0
  261. package/dist/esm/widgets/shared/documents/annotations/AnnotationLayer.js.map +1 -0
  262. package/dist/esm/widgets/shared/documents/annotations/_annotationLayerVariables.css +0 -0
  263. package/dist/esm/widgets/shared/documents/annotations/annotationLayer.css +65 -0
  264. package/dist/esm/widgets/shared/documents/annotations/annotations.interfaces.js +14 -0
  265. package/dist/esm/widgets/shared/documents/annotations/annotations.interfaces.js.map +1 -0
  266. package/dist/esm/widgets/shared/documents/annotations/highlightRegistry.js +58 -0
  267. package/dist/esm/widgets/shared/documents/annotations/highlightRegistry.js.map +1 -0
  268. package/dist/esm/widgets/shared/documents/annotations/index.js +4 -0
  269. package/dist/esm/widgets/shared/documents/annotations/index.js.map +1 -0
  270. package/dist/esm/widgets/shared/documents/annotations/textIndex.js +103 -0
  271. package/dist/esm/widgets/shared/documents/annotations/textIndex.js.map +1 -0
  272. package/dist/esm/widgets/shared/documents/annotations/textQuoteAnchor.js +150 -0
  273. package/dist/esm/widgets/shared/documents/annotations/textQuoteAnchor.js.map +1 -0
  274. package/dist/esm/widgets/shared/documents/documentHelpers.js +168 -0
  275. package/dist/esm/widgets/shared/documents/documentHelpers.js.map +1 -0
  276. package/dist/esm/widgets/shared/documents/documents.interfaces.js +2 -0
  277. package/dist/esm/widgets/shared/documents/documents.interfaces.js.map +1 -0
  278. package/dist/esm/widgets/shared/documents/engines/documentDiff/DocumentDiff.js +65 -0
  279. package/dist/esm/widgets/shared/documents/engines/documentDiff/DocumentDiff.js.map +1 -0
  280. package/dist/esm/widgets/shared/documents/engines/documentDiff/_documentDiffVariables.css +0 -0
  281. package/dist/esm/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js +102 -0
  282. package/dist/esm/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js.map +1 -0
  283. package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.css +69 -0
  284. package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js +2 -0
  285. package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js.map +1 -0
  286. package/dist/esm/widgets/shared/documents/engines/lazyEngines.js +13 -0
  287. package/dist/esm/widgets/shared/documents/engines/lazyEngines.js.map +1 -0
  288. package/dist/esm/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js +191 -0
  289. package/dist/esm/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js.map +1 -0
  290. package/dist/esm/widgets/shared/documents/engines/markdownEditor/_markdownEditorEngineVariables.css +0 -0
  291. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.css +50 -0
  292. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js +2 -0
  293. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js.map +1 -0
  294. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js +170 -0
  295. package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js.map +1 -0
  296. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js +270 -0
  297. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js.map +1 -0
  298. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js +198 -0
  299. package/dist/esm/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js.map +1 -0
  300. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js +76 -0
  301. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js.map +1 -0
  302. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/_markdownRendererVariables.css +0 -0
  303. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/markdownRenderer.css +78 -0
  304. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/index.js +5 -0
  305. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/index.js.map +1 -0
  306. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js +2 -0
  307. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js.map +1 -0
  308. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js +64 -0
  309. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js.map +1 -0
  310. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js +182 -0
  311. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js.map +1 -0
  312. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js +78 -0
  313. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js.map +1 -0
  314. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js +30 -0
  315. package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js.map +1 -0
  316. package/dist/esm/widgets/shared/documents/engines/wordRenderer/WordRenderer.js +41 -0
  317. package/dist/esm/widgets/shared/documents/engines/wordRenderer/WordRenderer.js.map +1 -0
  318. package/dist/esm/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js +207 -0
  319. package/dist/esm/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js.map +1 -0
  320. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js +105 -0
  321. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js.map +1 -0
  322. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordXml.js +57 -0
  323. package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordXml.js.map +1 -0
  324. package/dist/esm/widgets/shared/documents/index.js +3 -0
  325. package/dist/esm/widgets/shared/documents/index.js.map +1 -0
  326. package/dist/esm/widgets/shared/documents/toggleGroup.css +8 -0
  327. package/dist/esm/widgets/shared/documents/useDocumentContent.js +215 -0
  328. package/dist/esm/widgets/shared/documents/useDocumentContent.js.map +1 -0
  329. package/dist/helpers/dateHelpers.d.ts.map +1 -1
  330. package/dist/helpers/fileHelpers.d.ts +5 -0
  331. package/dist/helpers/fileHelpers.d.ts.map +1 -0
  332. package/dist/helpers/index.d.ts +3 -0
  333. package/dist/helpers/index.d.ts.map +1 -1
  334. package/dist/helpers/interactionsHelper.d.ts +2 -0
  335. package/dist/helpers/interactionsHelper.d.ts.map +1 -1
  336. package/dist/helpers/objectHelpers.d.ts.map +1 -1
  337. package/dist/helpers/stringHelpers.d.ts.map +1 -1
  338. package/dist/helpers/urlHelpers.d.ts +3 -0
  339. package/dist/helpers/urlHelpers.d.ts.map +1 -0
  340. package/dist/index.d.ts +5 -2
  341. package/dist/index.d.ts.map +1 -1
  342. package/dist/package.json +42 -28
  343. package/dist/widgets/documentComments/DocumentComments.d.ts +7 -0
  344. package/dist/widgets/documentComments/DocumentComments.d.ts.map +1 -0
  345. package/dist/widgets/documentComments/documentComments.interfaces.d.ts +57 -0
  346. package/dist/widgets/documentComments/documentComments.interfaces.d.ts.map +1 -0
  347. package/dist/widgets/documentComments/index.d.ts +3 -0
  348. package/dist/widgets/documentComments/index.d.ts.map +1 -0
  349. package/dist/widgets/documentComparer/DocumentComparer.d.ts +7 -0
  350. package/dist/widgets/documentComparer/DocumentComparer.d.ts.map +1 -0
  351. package/dist/widgets/documentComparer/documentComparer.interfaces.d.ts +78 -0
  352. package/dist/widgets/documentComparer/documentComparer.interfaces.d.ts.map +1 -0
  353. package/dist/widgets/documentComparer/index.d.ts +3 -0
  354. package/dist/widgets/documentComparer/index.d.ts.map +1 -0
  355. package/dist/widgets/documentEditor/DocumentEditor.d.ts +7 -0
  356. package/dist/widgets/documentEditor/DocumentEditor.d.ts.map +1 -0
  357. package/dist/widgets/documentEditor/documentEditor.interfaces.d.ts +40 -0
  358. package/dist/widgets/documentEditor/documentEditor.interfaces.d.ts.map +1 -0
  359. package/dist/widgets/documentEditor/index.d.ts +3 -0
  360. package/dist/widgets/documentEditor/index.d.ts.map +1 -0
  361. package/dist/widgets/documentViewer/DocumentViewer.d.ts +7 -0
  362. package/dist/widgets/documentViewer/DocumentViewer.d.ts.map +1 -0
  363. package/dist/widgets/documentViewer/documentViewer.interfaces.d.ts +47 -0
  364. package/dist/widgets/documentViewer/documentViewer.interfaces.d.ts.map +1 -0
  365. package/dist/widgets/documentViewer/index.d.ts +3 -0
  366. package/dist/widgets/documentViewer/index.d.ts.map +1 -0
  367. package/dist/widgets/index.d.ts +12 -0
  368. package/dist/widgets/index.d.ts.map +1 -1
  369. package/dist/widgets/shared/documents/ToggleGroup.d.ts +15 -0
  370. package/dist/widgets/shared/documents/ToggleGroup.d.ts.map +1 -0
  371. package/dist/widgets/shared/documents/annotations/AnnotationLayer.d.ts +27 -0
  372. package/dist/widgets/shared/documents/annotations/AnnotationLayer.d.ts.map +1 -0
  373. package/dist/widgets/shared/documents/annotations/annotations.interfaces.d.ts +43 -0
  374. package/dist/widgets/shared/documents/annotations/annotations.interfaces.d.ts.map +1 -0
  375. package/dist/widgets/shared/documents/annotations/highlightRegistry.d.ts +12 -0
  376. package/dist/widgets/shared/documents/annotations/highlightRegistry.d.ts.map +1 -0
  377. package/dist/widgets/shared/documents/annotations/index.d.ts +6 -0
  378. package/dist/widgets/shared/documents/annotations/index.d.ts.map +1 -0
  379. package/dist/widgets/shared/documents/annotations/textIndex.d.ts +16 -0
  380. package/dist/widgets/shared/documents/annotations/textIndex.d.ts.map +1 -0
  381. package/dist/widgets/shared/documents/annotations/textQuoteAnchor.d.ts +15 -0
  382. package/dist/widgets/shared/documents/annotations/textQuoteAnchor.d.ts.map +1 -0
  383. package/dist/widgets/shared/documents/documentHelpers.d.ts +14 -0
  384. package/dist/widgets/shared/documents/documentHelpers.d.ts.map +1 -0
  385. package/dist/widgets/shared/documents/documents.interfaces.d.ts +20 -0
  386. package/dist/widgets/shared/documents/documents.interfaces.d.ts.map +1 -0
  387. package/dist/widgets/shared/documents/engines/documentDiff/DocumentDiff.d.ts +6 -0
  388. package/dist/widgets/shared/documents/engines/documentDiff/DocumentDiff.d.ts.map +1 -0
  389. package/dist/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.d.ts +25 -0
  390. package/dist/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.d.ts.map +1 -0
  391. package/dist/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.d.ts +17 -0
  392. package/dist/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.d.ts.map +1 -0
  393. package/dist/widgets/shared/documents/engines/lazyEngines.d.ts +5 -0
  394. package/dist/widgets/shared/documents/engines/lazyEngines.d.ts.map +1 -0
  395. package/dist/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.d.ts +8 -0
  396. package/dist/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.d.ts.map +1 -0
  397. package/dist/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.d.ts +23 -0
  398. package/dist/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.d.ts.map +1 -0
  399. package/dist/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.d.ts +12 -0
  400. package/dist/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.d.ts.map +1 -0
  401. package/dist/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.d.ts +8 -0
  402. package/dist/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.d.ts.map +1 -0
  403. package/dist/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.d.ts +32 -0
  404. package/dist/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.d.ts.map +1 -0
  405. package/dist/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.d.ts +12 -0
  406. package/dist/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.d.ts.map +1 -0
  407. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/index.d.ts +7 -0
  408. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/index.d.ts.map +1 -0
  409. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.d.ts +16 -0
  410. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.d.ts.map +1 -0
  411. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.d.ts +3 -0
  412. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.d.ts.map +1 -0
  413. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.d.ts +6 -0
  414. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.d.ts.map +1 -0
  415. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.d.ts +3 -0
  416. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.d.ts.map +1 -0
  417. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.d.ts +8 -0
  418. package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.d.ts.map +1 -0
  419. package/dist/widgets/shared/documents/engines/wordRenderer/WordRenderer.d.ts +11 -0
  420. package/dist/widgets/shared/documents/engines/wordRenderer/WordRenderer.d.ts.map +1 -0
  421. package/dist/widgets/shared/documents/engines/wordRenderer/renderWordDocument.d.ts +7 -0
  422. package/dist/widgets/shared/documents/engines/wordRenderer/renderWordDocument.d.ts.map +1 -0
  423. package/dist/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.d.ts +3 -0
  424. package/dist/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.d.ts.map +1 -0
  425. package/dist/widgets/shared/documents/engines/wordRenderer/wordXml.d.ts +21 -0
  426. package/dist/widgets/shared/documents/engines/wordRenderer/wordXml.d.ts.map +1 -0
  427. package/dist/widgets/shared/documents/index.d.ts +5 -0
  428. package/dist/widgets/shared/documents/index.d.ts.map +1 -0
  429. package/dist/widgets/shared/documents/useDocumentContent.d.ts +11 -0
  430. package/dist/widgets/shared/documents/useDocumentContent.d.ts.map +1 -0
  431. package/package.json +42 -28
  432. package/readme.md +49 -2
  433. package/dist/components/design/dialog/Dialog.test.d.ts +0 -5
  434. package/dist/components/design/dialog/Dialog.test.d.ts.map +0 -1
  435. package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.test.d.ts +0 -5
  436. package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.test.d.ts.map +0 -1
  437. package/dist/components/design/tooltip/Tooltip.test.d.ts +0 -2
  438. package/dist/components/design/tooltip/Tooltip.test.d.ts.map +0 -1
  439. package/dist/components/form/buttons/SimpleButton.test.d.ts +0 -5
  440. package/dist/components/form/buttons/SimpleButton.test.d.ts.map +0 -1
  441. package/dist/components/form/formFields/formFieldWrapper/FormField.test.d.ts +0 -5
  442. package/dist/components/form/formFields/formFieldWrapper/FormField.test.d.ts.map +0 -1
  443. package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts +0 -5
  444. package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts.map +0 -1
  445. package/dist/components/form/formFields/subComponents/inputs/checkbox/checkboxSwitch/CheckboxSwitch.test.d.ts +0 -5
  446. package/dist/components/form/formFields/subComponents/inputs/checkbox/checkboxSwitch/CheckboxSwitch.test.d.ts.map +0 -1
  447. package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.test.d.ts +0 -5
  448. package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.test.d.ts.map +0 -1
  449. package/dist/components/form/formFields/subComponents/inputs/file/fileAttachmentList/FileAttachmentsList.test.d.ts +0 -5
  450. package/dist/components/form/formFields/subComponents/inputs/file/fileAttachmentList/FileAttachmentsList.test.d.ts.map +0 -1
  451. package/dist/components/form/formFields/subComponents/inputs/text/InputText.test.d.ts +0 -5
  452. package/dist/components/form/formFields/subComponents/inputs/text/InputText.test.d.ts.map +0 -1
  453. package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts +0 -5
  454. package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts.map +0 -1
  455. package/dist/components/form/formFields/subComponents/select/Select.test.d.ts +0 -5
  456. package/dist/components/form/formFields/subComponents/select/Select.test.d.ts.map +0 -1
  457. package/dist/components/form/formFields/subComponents/textarea/Textarea.test.d.ts +0 -5
  458. package/dist/components/form/formFields/subComponents/textarea/Textarea.test.d.ts.map +0 -1
  459. package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts +0 -5
  460. package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts.map +0 -1
  461. package/dist/components/form/validation/ValidationMessages.test.d.ts +0 -5
  462. package/dist/components/form/validation/ValidationMessages.test.d.ts.map +0 -1
  463. package/dist/components/navigation/bubbleNavigator/bubbleNavigatorUtilities.test.d.ts +0 -2
  464. package/dist/components/navigation/bubbleNavigator/bubbleNavigatorUtilities.test.d.ts.map +0 -1
  465. package/dist/components/navigation/menu/menuItemContent/MenuItemIcon.test.d.ts +0 -5
  466. package/dist/components/navigation/menu/menuItemContent/MenuItemIcon.test.d.ts.map +0 -1
  467. package/dist/helpers/ageHelpers.test.d.ts +0 -2
  468. package/dist/helpers/ageHelpers.test.d.ts.map +0 -1
  469. package/dist/helpers/dateHelpers.test.d.ts +0 -2
  470. package/dist/helpers/dateHelpers.test.d.ts.map +0 -1
  471. package/dist/helpers/formatters.test.d.ts +0 -5
  472. package/dist/helpers/formatters.test.d.ts.map +0 -1
  473. package/dist/helpers/iconHelpers.test.d.ts +0 -5
  474. package/dist/helpers/iconHelpers.test.d.ts.map +0 -1
  475. package/dist/helpers/numberHelpers.test.d.ts +0 -5
  476. package/dist/helpers/numberHelpers.test.d.ts.map +0 -1
  477. package/dist/helpers/objectHelpers.test.d.ts +0 -2
  478. package/dist/helpers/objectHelpers.test.d.ts.map +0 -1
  479. package/dist/helpers/stringHelpers.test.d.ts +0 -2
  480. package/dist/helpers/stringHelpers.test.d.ts.map +0 -1
  481. package/dist/hooks/InteractiveHostFocus.test.d.ts +0 -5
  482. package/dist/hooks/InteractiveHostFocus.test.d.ts.map +0 -1
  483. package/dist/widgets/processLauncher/ProcessLauncher.test.d.ts +0 -5
  484. package/dist/widgets/processLauncher/ProcessLauncher.test.d.ts.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tableHelpers.js","names":["LAYOUT_TABLE_MARKER","exports","INVISIBLE_CHARACTERS","map","code","String","fromCharCode","hasMeaningfulTableText","text","Array","from","some","character","test","includes","isProse","trim","length","split","isLabelAndBodyRow","row","label","body","isLikelyLayoutTable","rows","meaningfulRows","filter","cell","Math","max","every","isHeader","layoutRows","populated","ceil"],"sources":["../../../../../../../../src/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.ts"],"sourcesContent":["export type LayoutTableCell = {\n text: string;\n isHeader?: boolean;\n};\n\n// Converters can emit this marker before a table they know is used for layout rather than data.\nexport const LAYOUT_TABLE_MARKER = '<!-- layoutTable -->';\n\n// Zero-width spaces and byte-order marks are common in converted cells and carry no content.\nconst INVISIBLE_CHARACTERS = [0x200b, 0xfeff].map((code) => String.fromCharCode(code));\n\nexport const hasMeaningfulTableText = (text: string): boolean =>\n Array.from(text).some((character) => !/\\s/.test(character) && !INVISIBLE_CHARACTERS.includes(character));\n\nconst isProse = (text: string): boolean => text.trim().length > 40 && text.trim().split(/\\s+/).length >= 8;\n\nconst isLabelAndBodyRow = (row: LayoutTableCell[]): boolean => {\n const label = row[0]?.text.trim() ?? '';\n const body = row[1]?.text.trim() ?? '';\n return label.length > 0\n && label.length <= 90\n && label.split(/\\s+/).length <= 12\n && !/[.!?]$/.test(label)\n && isProse(body)\n && body.length > label.length * 2;\n};\n\n// Documents converted from Word often use one- or two-column tables to lay out prose\n// (a short label beside a paragraph). Those read better styled as text than as a data grid.\nexport const isLikelyLayoutTable = (rows: LayoutTableCell[][]): boolean => {\n const meaningfulRows = rows.filter((row) => row.some((cell) => cell.text.trim()));\n if (!meaningfulRows.length || Math.max(...meaningfulRows.map((row) => row.length)) > 2) {\n return false;\n }\n if (meaningfulRows[0].every((cell) => cell.isHeader && cell.text.trim())) {\n return false;\n }\n const layoutRows = meaningfulRows.filter((row) => {\n const populated = row.filter((cell) => cell.text.trim());\n return populated.length === 1 ? isProse(populated[0].text) : isLabelAndBodyRow(row);\n });\n return layoutRows.length >= Math.max(1, Math.ceil(meaningfulRows.length * 0.6));\n};\n"],"mappings":";;;;;;AAKA;AACO,MAAMA,mBAAmB,GAAAC,OAAA,CAAAD,mBAAA,GAAG,sBAAsB;;AAEzD;AACA,MAAME,oBAAoB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAACC,GAAG,CAAEC,IAAI,IAAKC,MAAM,CAACC,YAAY,CAACF,IAAI,CAAC,CAAC;AAE/E,MAAMG,sBAAsB,GAAIC,IAAY,IACjDC,KAAK,CAACC,IAAI,CAACF,IAAI,CAAC,CAACG,IAAI,CAAEC,SAAS,IAAK,CAAC,IAAI,CAACC,IAAI,CAACD,SAAS,CAAC,IAAI,CAACV,oBAAoB,CAACY,QAAQ,CAACF,SAAS,CAAC,CAAC;AAACX,OAAA,CAAAM,sBAAA,GAAAA,sBAAA;AAE3G,MAAMQ,OAAO,GAAIP,IAAY,IAAcA,IAAI,CAACQ,IAAI,CAAC,CAAC,CAACC,MAAM,GAAG,EAAE,IAAIT,IAAI,CAACQ,IAAI,CAAC,CAAC,CAACE,KAAK,CAAC,KAAK,CAAC,CAACD,MAAM,IAAI,CAAC;AAE1G,MAAME,iBAAiB,GAAIC,GAAsB,IAAc;EAC7D,MAAMC,KAAK,GAAGD,GAAG,CAAC,CAAC,CAAC,EAAEZ,IAAI,CAACQ,IAAI,CAAC,CAAC,IAAI,EAAE;EACvC,MAAMM,IAAI,GAAGF,GAAG,CAAC,CAAC,CAAC,EAAEZ,IAAI,CAACQ,IAAI,CAAC,CAAC,IAAI,EAAE;EACtC,OAAOK,KAAK,CAACJ,MAAM,GAAG,CAAC,IAClBI,KAAK,CAACJ,MAAM,IAAI,EAAE,IAClBI,KAAK,CAACH,KAAK,CAAC,KAAK,CAAC,CAACD,MAAM,IAAI,EAAE,IAC/B,CAAC,QAAQ,CAACJ,IAAI,CAACQ,KAAK,CAAC,IACrBN,OAAO,CAACO,IAAI,CAAC,IACbA,IAAI,CAACL,MAAM,GAAGI,KAAK,CAACJ,MAAM,GAAG,CAAC;AACrC,CAAC;;AAED;AACA;AACO,MAAMM,mBAAmB,GAAIC,IAAyB,IAAc;EACzE,MAAMC,cAAc,GAAGD,IAAI,CAACE,MAAM,CAAEN,GAAG,IAAKA,GAAG,CAACT,IAAI,CAAEgB,IAAI,IAAKA,IAAI,CAACnB,IAAI,CAACQ,IAAI,CAAC,CAAC,CAAC,CAAC;EACjF,IAAI,CAACS,cAAc,CAACR,MAAM,IAAIW,IAAI,CAACC,GAAG,CAAC,GAAGJ,cAAc,CAACtB,GAAG,CAAEiB,GAAG,IAAKA,GAAG,CAACH,MAAM,CAAC,CAAC,GAAG,CAAC,EAAE;IACtF,OAAO,KAAK;EACd;EACA,IAAIQ,cAAc,CAAC,CAAC,CAAC,CAACK,KAAK,CAAEH,IAAI,IAAKA,IAAI,CAACI,QAAQ,IAAIJ,IAAI,CAACnB,IAAI,CAACQ,IAAI,CAAC,CAAC,CAAC,EAAE;IACxE,OAAO,KAAK;EACd;EACA,MAAMgB,UAAU,GAAGP,cAAc,CAACC,MAAM,CAAEN,GAAG,IAAK;IAChD,MAAMa,SAAS,GAAGb,GAAG,CAACM,MAAM,CAAEC,IAAI,IAAKA,IAAI,CAACnB,IAAI,CAACQ,IAAI,CAAC,CAAC,CAAC;IACxD,OAAOiB,SAAS,CAAChB,MAAM,KAAK,CAAC,GAAGF,OAAO,CAACkB,SAAS,CAAC,CAAC,CAAC,CAACzB,IAAI,CAAC,GAAGW,iBAAiB,CAACC,GAAG,CAAC;EACrF,CAAC,CAAC;EACF,OAAOY,UAAU,CAACf,MAAM,IAAIW,IAAI,CAACC,GAAG,CAAC,CAAC,EAAED,IAAI,CAACM,IAAI,CAACT,cAAc,CAACR,MAAM,GAAG,GAAG,CAAC,CAAC;AACjF,CAAC;AAAChB,OAAA,CAAAsB,mBAAA,GAAAA,mBAAA","ignoreList":[]}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = exports.WordRenderer = void 0;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _renderWordDocument = require("./renderWordDocument");
9
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
10
+ const WordRenderer = ({
11
+ arrayBuffer,
12
+ title,
13
+ cssClass = '',
14
+ loadingIndicator = null,
15
+ onError
16
+ }) => {
17
+ const [previewDocument, setPreviewDocument] = (0, _react.useState)(null);
18
+ (0, _react.useEffect)(() => {
19
+ let isCurrent = true;
20
+ setPreviewDocument(null);
21
+ (0, _renderWordDocument.renderWordDocument)(arrayBuffer).then(html => {
22
+ if (isCurrent) {
23
+ setPreviewDocument(html);
24
+ }
25
+ }).catch(error => {
26
+ if (isCurrent) {
27
+ onError?.(error);
28
+ }
29
+ });
30
+ return () => {
31
+ isCurrent = false;
32
+ };
33
+ }, [arrayBuffer, onError]);
34
+ if (previewDocument === null) {
35
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, loadingIndicator);
36
+ }
37
+
38
+ // An empty sandbox blocks scripts, forms and same-origin access; the CSP inside the document
39
+ // additionally blocks any network requests from the converted content.
40
+ return /*#__PURE__*/_react.default.createElement("iframe", {
41
+ title: title,
42
+ className: `wordRenderer ${cssClass}`.trim(),
43
+ sandbox: "",
44
+ srcDoc: previewDocument
45
+ });
46
+ };
47
+ exports.WordRenderer = WordRenderer;
48
+ var _default = exports.default = WordRenderer;
49
+ //# sourceMappingURL=WordRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WordRenderer.js","names":["_react","_interopRequireWildcard","require","_renderWordDocument","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","WordRenderer","arrayBuffer","title","cssClass","loadingIndicator","onError","previewDocument","setPreviewDocument","useState","useEffect","isCurrent","renderWordDocument","then","html","catch","error","createElement","Fragment","className","trim","sandbox","srcDoc","exports","_default"],"sources":["../../../../../../../src/widgets/shared/documents/engines/wordRenderer/WordRenderer.tsx"],"sourcesContent":["import React, { FC, ReactNode, useEffect, useState } from 'react';\n\nimport { renderWordDocument } from './renderWordDocument';\n\nexport type WordRendererProps = {\n arrayBuffer: ArrayBuffer;\n title: string;\n cssClass?: string;\n // Shown while the document is being converted, after the engine itself has loaded.\n loadingIndicator?: ReactNode;\n /* eslint-disable-next-line no-unused-vars */\n onError?: (error: unknown) => void;\n};\n\nexport const WordRenderer: FC<WordRendererProps> = (\n {\n arrayBuffer,\n title,\n cssClass = '',\n loadingIndicator = null,\n onError\n }\n) => {\n const [previewDocument, setPreviewDocument] = useState<string | null>(null);\n\n useEffect(() => {\n let isCurrent = true;\n setPreviewDocument(null);\n renderWordDocument(arrayBuffer)\n .then((html) => {\n if (isCurrent) {\n setPreviewDocument(html);\n }\n })\n .catch((error: unknown) => {\n if (isCurrent) {\n onError?.(error);\n }\n });\n return () => {\n isCurrent = false;\n };\n }, [arrayBuffer, onError]);\n\n if (previewDocument === null) {\n return <>{ loadingIndicator }</>;\n }\n\n // An empty sandbox blocks scripts, forms and same-origin access; the CSP inside the document\n // additionally blocks any network requests from the converted content.\n return <iframe title={ title } className={ `wordRenderer ${ cssClass }`.trim() } sandbox=\"\" srcDoc={ previewDocument } />;\n};\n\nexport default WordRenderer;\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAEA,IAAAC,mBAAA,GAAAD,OAAA;AAA0D,SAAAD,wBAAAG,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAL,uBAAA,YAAAA,CAAAG,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAYnD,MAAMkB,YAAmC,GAAGA,CACjD;EACEC,WAAW;EACXC,KAAK;EACLC,QAAQ,GAAG,EAAE;EACbC,gBAAgB,GAAG,IAAI;EACvBC;AACF,CAAC,KACE;EACH,MAAM,CAACC,eAAe,EAAEC,kBAAkB,CAAC,GAAG,IAAAC,eAAQ,EAAgB,IAAI,CAAC;EAE3E,IAAAC,gBAAS,EAAC,MAAM;IACd,IAAIC,SAAS,GAAG,IAAI;IACpBH,kBAAkB,CAAC,IAAI,CAAC;IACxB,IAAAI,sCAAkB,EAACV,WAAW,CAAC,CAC5BW,IAAI,CAAEC,IAAI,IAAK;MACd,IAAIH,SAAS,EAAE;QACbH,kBAAkB,CAACM,IAAI,CAAC;MAC1B;IACF,CAAC,CAAC,CACDC,KAAK,CAAEC,KAAc,IAAK;MACzB,IAAIL,SAAS,EAAE;QACbL,OAAO,GAAGU,KAAK,CAAC;MAClB;IACF,CAAC,CAAC;IACJ,OAAO,MAAM;MACXL,SAAS,GAAG,KAAK;IACnB,CAAC;EACH,CAAC,EAAE,CAACT,WAAW,EAAEI,OAAO,CAAC,CAAC;EAE1B,IAAIC,eAAe,KAAK,IAAI,EAAE;IAC5B,oBAAO7B,MAAA,CAAAc,OAAA,CAAAyB,aAAA,CAAAvC,MAAA,CAAAc,OAAA,CAAA0B,QAAA,QAAIb,gBAAoB,CAAC;EAClC;;EAEA;EACA;EACA,oBAAO3B,MAAA,CAAAc,OAAA,CAAAyB,aAAA;IAAQd,KAAK,EAAGA,KAAO;IAACgB,SAAS,EAAG,gBAAiBf,QAAQ,EAAG,CAACgB,IAAI,CAAC,CAAG;IAACC,OAAO,EAAC,EAAE;IAACC,MAAM,EAAGf;EAAiB,CAAE,CAAC;AAC3H,CAAC;AAACgB,OAAA,CAAAtB,YAAA,GAAAA,YAAA;AAAA,IAAAuB,QAAA,GAAAD,OAAA,CAAA/B,OAAA,GAEaS,YAAY","ignoreList":[]}
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.renderWordDocument = exports.WORD_DOCUMENT_LIMITS = void 0;
8
+ var _docxPreview = require("docx-preview");
9
+ var _dompurify = _interopRequireDefault(require("dompurify"));
10
+ var _jszip = _interopRequireDefault(require("jszip"));
11
+ var _wordPreviewNumbering = require("./wordPreviewNumbering");
12
+ var _wordXml = require("./wordXml");
13
+ // The preview runs in a sandboxed iframe that cannot read the host page's CSS variables.
14
+ const PAGE_GUTTER = '15px';
15
+ const CONTENT_SECURITY_POLICY = 'default-src \'none\'; img-src data:; font-src data:; style-src \'unsafe-inline\';';
16
+
17
+ /*
18
+ Limits against "zip bombs": a small .docx can declare, or simply contain, gigabytes of compressed
19
+ content. The sizes a zip declares cannot be trusted, so every entry is decompressed through a
20
+ stream that stops once the running total passes the limit, into a new zip that docx-preview reads.
21
+ Its own decompression then only ever sees content whose size has been measured.
22
+ */
23
+ const WORD_DOCUMENT_LIMITS = exports.WORD_DOCUMENT_LIMITS = {
24
+ maxFileBytes: 50 * 1024 * 1024,
25
+ maxUncompressedBytes: 200 * 1024 * 1024,
26
+ maxEntries: 5000
27
+ };
28
+
29
+ // Documented by JSZip but missing from its typings.
30
+
31
+ const TOO_LARGE = 'This Word document is too large to preview.';
32
+ const readZipEntry = (file, budget) => new Promise((resolve, reject) => {
33
+ const chunks = [];
34
+ let length = 0;
35
+ const stream = file.internalStream('uint8array');
36
+ stream.on('data', chunk => {
37
+ budget.remaining -= chunk.length;
38
+ if (budget.remaining < 0) {
39
+ stream.pause();
40
+ reject(new Error(TOO_LARGE));
41
+ return;
42
+ }
43
+ chunks.push(chunk);
44
+ length += chunk.length;
45
+ }).on('error', reject).on('end', () => {
46
+ const content = new Uint8Array(length);
47
+ let offset = 0;
48
+ chunks.forEach(chunk => {
49
+ content.set(chunk, offset);
50
+ offset += chunk.length;
51
+ });
52
+ resolve(content);
53
+ }).resume();
54
+ });
55
+ const loadBoundedZip = async arrayBuffer => {
56
+ if (arrayBuffer.byteLength > WORD_DOCUMENT_LIMITS.maxFileBytes) {
57
+ throw new Error(TOO_LARGE);
58
+ }
59
+ const zip = await _jszip.default.loadAsync(arrayBuffer);
60
+ const entries = Object.values(zip.files).filter(file => !file.dir);
61
+ if (entries.length > WORD_DOCUMENT_LIMITS.maxEntries) {
62
+ throw new Error(TOO_LARGE);
63
+ }
64
+ const bounded = new _jszip.default();
65
+ const budget = {
66
+ remaining: WORD_DOCUMENT_LIMITS.maxUncompressedBytes
67
+ };
68
+ // Sequential, so the budget is spent in order and the first entry over it stops the rest.
69
+ for (const file of entries) {
70
+ bounded.file(file.name, await readZipEntry(file, budget));
71
+ }
72
+ return bounded;
73
+ };
74
+ const parseWordPart = async (zip, name) => {
75
+ const file = zip.file(`word/${name}.xml`);
76
+ if (!file) {
77
+ return undefined;
78
+ }
79
+ const xml = new DOMParser().parseFromString(await file.async('string'), 'application/xml');
80
+ if (xml.querySelector('parsererror')) {
81
+ throw new Error(`Invalid Word XML: ${name}`);
82
+ }
83
+ return xml;
84
+ };
85
+ const hasLatinFont = fonts => Boolean((0, _wordXml.wordAttribute)(fonts, 'ascii') || (0, _wordXml.wordAttribute)(fonts, 'asciiTheme'));
86
+
87
+ // docx-preview replaces the whole CSS font-family when a style only names an East Asian font,
88
+ // so copy the Latin font each style would otherwise inherit.
89
+ const inheritLatinFonts = (styleDefinitions, styles) => {
90
+ const defaultFonts = styleDefinitions?.getElementsByTagNameNS(_wordXml.wordNamespace, 'rPrDefault')[0]?.getElementsByTagNameNS(_wordXml.wordNamespace, 'rFonts')[0];
91
+ const resolveLatinFont = (styleId, visited = new Set()) => {
92
+ if (!styleId) {
93
+ return defaultFonts;
94
+ }
95
+ if (visited.has(styleId)) {
96
+ throw new Error(`Circular Word style inheritance: ${styleId}`);
97
+ }
98
+ visited.add(styleId);
99
+ const style = styles.byId.get(styleId);
100
+ const fonts = (0, _wordXml.wordChild)((0, _wordXml.wordChild)(style, 'rPr'), 'rFonts');
101
+ return hasLatinFont(fonts) ? fonts : resolveLatinFont((0, _wordXml.wordValue)(style, 'basedOn'), visited);
102
+ };
103
+ styles.byId.forEach((style, id) => {
104
+ const fonts = (0, _wordXml.wordChild)((0, _wordXml.wordChild)(style, 'rPr'), 'rFonts');
105
+ if (!fonts || hasLatinFont(fonts)) {
106
+ return;
107
+ }
108
+ const inheritedFonts = resolveLatinFont(id);
109
+ ['ascii', 'asciiTheme'].forEach(name => {
110
+ const font = (0, _wordXml.wordAttribute)(inheritedFonts, name);
111
+ if (font) {
112
+ fonts.setAttributeNS(_wordXml.wordNamespace, `w:${name}`, font);
113
+ }
114
+ });
115
+ });
116
+ };
117
+ const ensureChild = (source, parent, name, prepend = false) => {
118
+ let child = (0, _wordXml.wordChild)(parent, name);
119
+ if (!child) {
120
+ child = source.createElementNS(_wordXml.wordNamespace, `w:${name}`);
121
+ if (prepend) {
122
+ parent.prepend(child);
123
+ } else {
124
+ parent.append(child);
125
+ }
126
+ }
127
+ return child;
128
+ };
129
+ const isPageBreak = element => element.localName === 'lastRenderedPageBreak' || element.localName === 'br' && (0, _wordXml.wordAttribute)(element, 'type') === 'page';
130
+
131
+ // A leading inline page break otherwise produces an empty numbered fragment before the paragraph.
132
+ const convertLeadingPageBreaks = (source, paragraph) => {
133
+ const runContent = Array.from(paragraph.getElementsByTagNameNS(_wordXml.wordNamespace, 'r')).flatMap(run => Array.from(run.children).filter(child => child.localName !== 'rPr'));
134
+ for (const child of runContent) {
135
+ if (!isPageBreak(child)) {
136
+ break;
137
+ }
138
+ const properties = ensureChild(source, paragraph, 'pPr', true);
139
+ ensureChild(source, properties, 'pageBreakBefore').setAttributeNS(_wordXml.wordNamespace, 'w:val', '1');
140
+ child.remove();
141
+ }
142
+ };
143
+ const applyResolvedNumbering = (source, paragraph, resolveNumbering) => {
144
+ const {
145
+ id,
146
+ level
147
+ } = resolveNumbering((0, _wordXml.wordChild)(paragraph, 'pPr'));
148
+ if (!id || id === '0') {
149
+ return;
150
+ }
151
+ const numbering = ensureChild(source, ensureChild(source, paragraph, 'pPr', true), 'numPr');
152
+ ensureChild(source, numbering, 'numId').setAttributeNS(_wordXml.wordNamespace, 'w:val', id);
153
+ ensureChild(source, numbering, 'ilvl').setAttributeNS(_wordXml.wordNamespace, 'w:val', level);
154
+ };
155
+ const wrapPreviewDocument = html => `<!doctype html><html><head><meta charset="utf-8">
156
+ <meta http-equiv="Content-Security-Policy" content="${CONTENT_SECURITY_POLICY}">
157
+ </head><body>${html}
158
+ <style>body { margin: 0; } .docx-wrapper { padding: ${PAGE_GUTTER}; align-items: flex-start; }
159
+ .docx-wrapper > section.docx { flex-shrink: 0; margin: 0 auto ${PAGE_GUTTER}; }
160
+ .docx-wrapper p { text-indent: 0 !important; margin-inline-start: 0 !important; }</style>
161
+ </body></html>`;
162
+
163
+ /*
164
+ Renders a .docx file to a self-contained, sanitised HTML document for a sandboxed iframe.
165
+ The Word XML is patched first to fix fonts, page breaks and list numbering that docx-preview
166
+ would otherwise render incorrectly.
167
+ */
168
+ const renderWordDocument = async arrayBuffer => {
169
+ const zip = await loadBoundedZip(arrayBuffer);
170
+ const source = await parseWordPart(zip, 'document');
171
+ if (!source) {
172
+ throw new Error('DOCX is missing word/document.xml.');
173
+ }
174
+ const styleDefinitions = await parseWordPart(zip, 'styles');
175
+ const styles = (0, _wordXml.getWordStyles)(styleDefinitions);
176
+ inheritLatinFonts(styleDefinitions, styles);
177
+ if (styleDefinitions) {
178
+ zip.file('word/styles.xml', new XMLSerializer().serializeToString(styleDefinitions));
179
+ }
180
+ const numberingDefinitions = await parseWordPart(zip, 'numbering');
181
+ const resolveNumbering = (0, _wordXml.createWordNumberingResolver)(numberingDefinitions, styles);
182
+ Array.from(source.getElementsByTagNameNS(_wordXml.wordNamespace, 'p')).forEach(paragraph => {
183
+ convertLeadingPageBreaks(source, paragraph);
184
+ applyResolvedNumbering(source, paragraph, resolveNumbering);
185
+ });
186
+ const numberingCss = (0, _wordPreviewNumbering.prepareWordPreviewNumbering)(numberingDefinitions, styles);
187
+ if (numberingDefinitions) {
188
+ zip.file('word/numbering.xml', new XMLSerializer().serializeToString(numberingDefinitions));
189
+ }
190
+ zip.file('word/document.xml', new XMLSerializer().serializeToString(source));
191
+ const container = document.createElement('div');
192
+ await (0, _docxPreview.renderAsync)(await zip.generateAsync({
193
+ type: 'arraybuffer'
194
+ }), container, undefined, {
195
+ useBase64URL: true,
196
+ ignoreLastRenderedPageBreak: false,
197
+ renderAltChunks: false
198
+ });
199
+ const numberingStyle = document.createElement('style');
200
+ numberingStyle.textContent = numberingCss;
201
+ container.append(numberingStyle);
202
+ container.querySelectorAll('section.docx').forEach(page => {
203
+ if (page.style.width) {
204
+ // Scale fixed-width pages down to fit narrow viewers instead of scrolling sideways.
205
+ page.style.setProperty('zoom', `min(1, calc((100vw - 2 * ${PAGE_GUTTER}) / ${page.style.width}))`);
206
+ }
207
+ });
208
+ return wrapPreviewDocument(_dompurify.default.sanitize(container.innerHTML, {
209
+ ADD_TAGS: ['style'],
210
+ FORCE_BODY: true
211
+ }));
212
+ };
213
+ exports.renderWordDocument = renderWordDocument;
214
+ //# sourceMappingURL=renderWordDocument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderWordDocument.js","names":["_docxPreview","require","_dompurify","_interopRequireDefault","_jszip","_wordPreviewNumbering","_wordXml","PAGE_GUTTER","CONTENT_SECURITY_POLICY","WORD_DOCUMENT_LIMITS","exports","maxFileBytes","maxUncompressedBytes","maxEntries","TOO_LARGE","readZipEntry","file","budget","Promise","resolve","reject","chunks","length","stream","internalStream","on","chunk","remaining","pause","Error","push","content","Uint8Array","offset","forEach","set","resume","loadBoundedZip","arrayBuffer","byteLength","zip","JSZip","loadAsync","entries","Object","values","files","filter","dir","bounded","name","parseWordPart","undefined","xml","DOMParser","parseFromString","async","querySelector","hasLatinFont","fonts","Boolean","wordAttribute","inheritLatinFonts","styleDefinitions","styles","defaultFonts","getElementsByTagNameNS","wordNamespace","resolveLatinFont","styleId","visited","Set","has","add","style","byId","get","wordChild","wordValue","id","inheritedFonts","font","setAttributeNS","ensureChild","source","parent","prepend","child","createElementNS","append","isPageBreak","element","localName","convertLeadingPageBreaks","paragraph","runContent","Array","from","flatMap","run","children","properties","remove","applyResolvedNumbering","resolveNumbering","level","numbering","wrapPreviewDocument","html","renderWordDocument","getWordStyles","XMLSerializer","serializeToString","numberingDefinitions","createWordNumberingResolver","numberingCss","prepareWordPreviewNumbering","container","document","createElement","renderAsync","generateAsync","type","useBase64URL","ignoreLastRenderedPageBreak","renderAltChunks","numberingStyle","textContent","querySelectorAll","page","width","setProperty","DOMPurify","sanitize","innerHTML","ADD_TAGS","FORCE_BODY"],"sources":["../../../../../../../src/widgets/shared/documents/engines/wordRenderer/renderWordDocument.ts"],"sourcesContent":["import { renderAsync } from 'docx-preview';\nimport DOMPurify from 'dompurify';\nimport JSZip from 'jszip';\n\nimport { prepareWordPreviewNumbering } from './wordPreviewNumbering';\nimport {\n createWordNumberingResolver,\n getWordStyles,\n wordAttribute,\n wordChild,\n wordNamespace,\n WordStyles,\n wordValue\n} from './wordXml';\n\n// The preview runs in a sandboxed iframe that cannot read the host page's CSS variables.\nconst PAGE_GUTTER = '15px';\nconst CONTENT_SECURITY_POLICY = 'default-src \\'none\\'; img-src data:; font-src data:; style-src \\'unsafe-inline\\';';\n\n/*\n Limits against \"zip bombs\": a small .docx can declare, or simply contain, gigabytes of compressed\n content. The sizes a zip declares cannot be trusted, so every entry is decompressed through a\n stream that stops once the running total passes the limit, into a new zip that docx-preview reads.\n Its own decompression then only ever sees content whose size has been measured.\n */\nexport const WORD_DOCUMENT_LIMITS = {\n maxFileBytes: 50 * 1024 * 1024,\n maxUncompressedBytes: 200 * 1024 * 1024,\n maxEntries: 5000\n};\n\n// Documented by JSZip but missing from its typings.\ntype StreamableZipObject = JSZip.JSZipObject & {\n /* eslint-disable-next-line no-unused-vars */\n internalStream: (type: 'uint8array') => JSZip.JSZipStreamHelper<Uint8Array>;\n};\n\nconst TOO_LARGE = 'This Word document is too large to preview.';\n\nconst readZipEntry = (file: JSZip.JSZipObject, budget: { remaining: number }): Promise<Uint8Array> =>\n new Promise((resolve, reject) => {\n const chunks: Uint8Array[] = [];\n let length = 0;\n const stream = (file as StreamableZipObject).internalStream('uint8array');\n stream\n .on('data', (chunk) => {\n budget.remaining -= chunk.length;\n if (budget.remaining < 0) {\n stream.pause();\n reject(new Error(TOO_LARGE));\n return;\n }\n chunks.push(chunk);\n length += chunk.length;\n })\n .on('error', reject)\n .on('end', () => {\n const content = new Uint8Array(length);\n let offset = 0;\n chunks.forEach((chunk) => {\n content.set(chunk, offset);\n offset += chunk.length;\n });\n resolve(content);\n })\n .resume();\n });\n\nconst loadBoundedZip = async (arrayBuffer: ArrayBuffer): Promise<JSZip> => {\n if (arrayBuffer.byteLength > WORD_DOCUMENT_LIMITS.maxFileBytes) {\n throw new Error(TOO_LARGE);\n }\n const zip = await JSZip.loadAsync(arrayBuffer);\n const entries = Object.values(zip.files).filter((file) => !file.dir);\n if (entries.length > WORD_DOCUMENT_LIMITS.maxEntries) {\n throw new Error(TOO_LARGE);\n }\n const bounded = new JSZip();\n const budget = { remaining: WORD_DOCUMENT_LIMITS.maxUncompressedBytes };\n // Sequential, so the budget is spent in order and the first entry over it stops the rest.\n for (const file of entries) {\n bounded.file(file.name, await readZipEntry(file, budget));\n }\n return bounded;\n};\n\nconst parseWordPart = async (zip: JSZip, name: string): Promise<Document | undefined> => {\n const file = zip.file(`word/${ name }.xml`);\n if (!file) {\n return undefined;\n }\n const xml = new DOMParser().parseFromString(await file.async('string'), 'application/xml');\n if (xml.querySelector('parsererror')) {\n throw new Error(`Invalid Word XML: ${ name }`);\n }\n return xml;\n};\n\nconst hasLatinFont = (fonts: Element | undefined): boolean => Boolean(wordAttribute(fonts, 'ascii') || wordAttribute(fonts, 'asciiTheme'));\n\n// docx-preview replaces the whole CSS font-family when a style only names an East Asian font,\n// so copy the Latin font each style would otherwise inherit.\nconst inheritLatinFonts = (styleDefinitions: Document | undefined, styles: WordStyles): void => {\n const defaultFonts = styleDefinitions\n ?.getElementsByTagNameNS(wordNamespace, 'rPrDefault')[0]\n ?.getElementsByTagNameNS(wordNamespace, 'rFonts')[0];\n\n const resolveLatinFont = (styleId: string | undefined, visited = new Set<string>()): Element | undefined => {\n if (!styleId) {\n return defaultFonts;\n }\n if (visited.has(styleId)) {\n throw new Error(`Circular Word style inheritance: ${ styleId }`);\n }\n visited.add(styleId);\n const style = styles.byId.get(styleId);\n const fonts = wordChild(wordChild(style, 'rPr'), 'rFonts');\n return hasLatinFont(fonts) ? fonts : resolveLatinFont(wordValue(style, 'basedOn'), visited);\n };\n\n styles.byId.forEach((style, id) => {\n const fonts = wordChild(wordChild(style, 'rPr'), 'rFonts');\n if (!fonts || hasLatinFont(fonts)) {\n return;\n }\n const inheritedFonts = resolveLatinFont(id);\n ['ascii', 'asciiTheme'].forEach((name) => {\n const font = wordAttribute(inheritedFonts, name);\n if (font) {\n fonts.setAttributeNS(wordNamespace, `w:${ name }`, font);\n }\n });\n });\n};\n\nconst ensureChild = (source: Document, parent: Element, name: string, prepend = false): Element => {\n let child = wordChild(parent, name);\n if (!child) {\n child = source.createElementNS(wordNamespace, `w:${ name }`);\n if (prepend) {\n parent.prepend(child);\n } else {\n parent.append(child);\n }\n }\n return child;\n};\n\nconst isPageBreak = (element: Element): boolean =>\n element.localName === 'lastRenderedPageBreak' || (element.localName === 'br' && wordAttribute(element, 'type') === 'page');\n\n// A leading inline page break otherwise produces an empty numbered fragment before the paragraph.\nconst convertLeadingPageBreaks = (source: Document, paragraph: Element): void => {\n const runContent = Array.from(paragraph.getElementsByTagNameNS(wordNamespace, 'r'))\n .flatMap((run) => Array.from(run.children).filter((child) => child.localName !== 'rPr'));\n for (const child of runContent) {\n if (!isPageBreak(child)) {\n break;\n }\n const properties = ensureChild(source, paragraph, 'pPr', true);\n ensureChild(source, properties, 'pageBreakBefore').setAttributeNS(wordNamespace, 'w:val', '1');\n child.remove();\n }\n};\n\nconst applyResolvedNumbering = (\n source: Document,\n paragraph: Element,\n resolveNumbering: ReturnType<typeof createWordNumberingResolver>\n): void => {\n const { id, level } = resolveNumbering(wordChild(paragraph, 'pPr'));\n if (!id || id === '0') {\n return;\n }\n const numbering = ensureChild(source, ensureChild(source, paragraph, 'pPr', true), 'numPr');\n ensureChild(source, numbering, 'numId').setAttributeNS(wordNamespace, 'w:val', id);\n ensureChild(source, numbering, 'ilvl').setAttributeNS(wordNamespace, 'w:val', level);\n};\n\nconst wrapPreviewDocument = (html: string): string => `<!doctype html><html><head><meta charset=\"utf-8\">\n<meta http-equiv=\"Content-Security-Policy\" content=\"${ CONTENT_SECURITY_POLICY }\">\n</head><body>${ html }\n<style>body { margin: 0; } .docx-wrapper { padding: ${ PAGE_GUTTER }; align-items: flex-start; }\n.docx-wrapper > section.docx { flex-shrink: 0; margin: 0 auto ${ PAGE_GUTTER }; }\n.docx-wrapper p { text-indent: 0 !important; margin-inline-start: 0 !important; }</style>\n</body></html>`;\n\n/*\n Renders a .docx file to a self-contained, sanitised HTML document for a sandboxed iframe.\n The Word XML is patched first to fix fonts, page breaks and list numbering that docx-preview\n would otherwise render incorrectly.\n */\nexport const renderWordDocument = async (arrayBuffer: ArrayBuffer): Promise<string> => {\n const zip = await loadBoundedZip(arrayBuffer);\n const source = await parseWordPart(zip, 'document');\n if (!source) {\n throw new Error('DOCX is missing word/document.xml.');\n }\n\n const styleDefinitions = await parseWordPart(zip, 'styles');\n const styles = getWordStyles(styleDefinitions);\n inheritLatinFonts(styleDefinitions, styles);\n if (styleDefinitions) {\n zip.file('word/styles.xml', new XMLSerializer().serializeToString(styleDefinitions));\n }\n\n const numberingDefinitions = await parseWordPart(zip, 'numbering');\n const resolveNumbering = createWordNumberingResolver(numberingDefinitions, styles);\n Array.from(source.getElementsByTagNameNS(wordNamespace, 'p')).forEach((paragraph) => {\n convertLeadingPageBreaks(source, paragraph);\n applyResolvedNumbering(source, paragraph, resolveNumbering);\n });\n const numberingCss = prepareWordPreviewNumbering(numberingDefinitions, styles);\n if (numberingDefinitions) {\n zip.file('word/numbering.xml', new XMLSerializer().serializeToString(numberingDefinitions));\n }\n zip.file('word/document.xml', new XMLSerializer().serializeToString(source));\n\n const container = document.createElement('div');\n await renderAsync(await zip.generateAsync({ type: 'arraybuffer' }), container, undefined, {\n useBase64URL: true,\n ignoreLastRenderedPageBreak: false,\n renderAltChunks: false\n });\n const numberingStyle = document.createElement('style');\n numberingStyle.textContent = numberingCss;\n container.append(numberingStyle);\n container.querySelectorAll<HTMLElement>('section.docx').forEach((page) => {\n if (page.style.width) {\n // Scale fixed-width pages down to fit narrow viewers instead of scrolling sideways.\n page.style.setProperty('zoom', `min(1, calc((100vw - 2 * ${ PAGE_GUTTER }) / ${ page.style.width }))`);\n }\n });\n\n return wrapPreviewDocument(DOMPurify.sanitize(container.innerHTML, { ADD_TAGS: ['style'], FORCE_BODY: true }));\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.prepareWordPreviewNumbering = void 0;
7
+ var _wordXml = require("./wordXml");
8
+ const MAX_WORD_LIST_LEVEL = 8;
9
+ const childElements = (element, localName) => Array.from(element.children).filter(child => child.localName === localName);
10
+ const setStartOverride = (numbering, level, startOverride) => {
11
+ let start = (0, _wordXml.wordChild)(level, 'start');
12
+ if (!start) {
13
+ start = numbering.createElementNS(_wordXml.wordNamespace, 'w:start');
14
+ level.prepend(start);
15
+ }
16
+ start.setAttributeNS(_wordXml.wordNamespace, 'w:val', startOverride);
17
+ };
18
+
19
+ /*
20
+ Normalises numbering definitions the preview library does not resolve (style links, level
21
+ overrides, restarts), then returns CSS counter rules that replace its immediate-parent-only resets.
22
+ Missing or cyclic definitions throw so a mis-numbered preview is never shown silently.
23
+ */
24
+ const prepareWordPreviewNumbering = (numbering, styles) => {
25
+ if (!numbering) {
26
+ return '';
27
+ }
28
+ const nums = new Map(Array.from(numbering.getElementsByTagNameNS(_wordXml.wordNamespace, 'num')).map(element => [(0, _wordXml.wordAttribute)(element, 'numId'), element]));
29
+ const abstracts = new Map(Array.from(numbering.getElementsByTagNameNS(_wordXml.wordNamespace, 'abstractNum')).map(element => [(0, _wordXml.wordAttribute)(element, 'abstractNumId'), element]));
30
+ const resolveLevels = (id, visited = new Set()) => {
31
+ if (visited.has(id)) {
32
+ throw new Error(`Circular Word numbering style link: ${id}`);
33
+ }
34
+ visited.add(id);
35
+ const num = nums.get(id);
36
+ const abstract = abstracts.get((0, _wordXml.wordValue)(num, 'abstractNumId'));
37
+ if (!num || !abstract) {
38
+ throw new Error(`Missing Word numbering definition: ${id}`);
39
+ }
40
+ const linkedId = styles.properties((0, _wordXml.wordValue)(abstract, 'numStyleLink')).numId;
41
+ const levels = linkedId ? resolveLevels(linkedId, visited) : new Map();
42
+ childElements(abstract, 'lvl').forEach(level => {
43
+ levels.set(Number((0, _wordXml.wordAttribute)(level, 'ilvl')), level.cloneNode(true));
44
+ });
45
+ childElements(num, 'lvlOverride').forEach(override => {
46
+ const index = Number((0, _wordXml.wordAttribute)(override, 'ilvl'));
47
+ const definition = (0, _wordXml.wordChild)(override, 'lvl') ?? levels.get(index);
48
+ if (!definition) {
49
+ throw new Error(`Missing Word numbering definition for numId ${id}, level ${index}.`);
50
+ }
51
+ const level = definition.cloneNode(true);
52
+ const startOverride = (0, _wordXml.wordValue)(override, 'startOverride');
53
+ if (startOverride !== undefined) {
54
+ setStartOverride(numbering, level, startOverride);
55
+ }
56
+ levels.set(index, level);
57
+ });
58
+ return levels;
59
+ };
60
+ const resolved = Array.from(nums.keys()).map(id => {
61
+ if (!id || !/^\d+$/.test(id)) {
62
+ throw new Error(`Invalid Word numbering ID: ${id}`);
63
+ }
64
+ return {
65
+ id,
66
+ levels: resolveLevels(id)
67
+ };
68
+ });
69
+ const initialCounters = [];
70
+ const rules = [];
71
+ let nextAbstractId = Math.max(-1, ...Array.from(abstracts.keys()).map(id => Number(id))) + 1;
72
+ resolved.forEach(({
73
+ id,
74
+ levels
75
+ }) => {
76
+ const abstract = numbering.createElementNS(_wordXml.wordNamespace, 'w:abstractNum');
77
+ const abstractId = String(nextAbstractId);
78
+ nextAbstractId += 1;
79
+ abstract.setAttributeNS(_wordXml.wordNamespace, 'w:abstractNumId', abstractId);
80
+ const definitions = Array.from(levels).sort(([first], [second]) => first - second).map(([index, level]) => {
81
+ const start = Number((0, _wordXml.wordValue)(level, 'start') ?? 1);
82
+ const restart = Number((0, _wordXml.wordValue)(level, 'lvlRestart') ?? index);
83
+ const isValidLevel = Number.isInteger(index) && index >= 0 && index <= MAX_WORD_LIST_LEVEL;
84
+ if (!isValidLevel || !Number.isSafeInteger(start) || !Number.isInteger(restart) || restart < 0 || restart > index) {
85
+ throw new Error(`Invalid Word numbering properties for numId ${id}, level ${index}.`);
86
+ }
87
+ level.setAttributeNS(_wordXml.wordNamespace, 'w:ilvl', String(index));
88
+ abstract.append(level);
89
+ const counter = `docx-num-${id}-${index} ${start - 1}`;
90
+ initialCounters.push(counter);
91
+ return {
92
+ index,
93
+ restart,
94
+ counter
95
+ };
96
+ });
97
+ numbering.documentElement.append(abstract);
98
+ (0, _wordXml.wordChild)(nums.get(id), 'abstractNumId')?.setAttributeNS(_wordXml.wordNamespace, 'w:val', abstractId);
99
+ definitions.forEach(({
100
+ index
101
+ }) => {
102
+ const resets = definitions.filter(deeper => deeper.index > index && deeper.restart > index).map(deeper => deeper.counter);
103
+ rules.push(`p.docx-num-${id}-${index} { counter-set: ${resets.join(' ') || 'none'}; }`);
104
+ });
105
+ });
106
+ if (initialCounters.length) {
107
+ rules.unshift(`.docx-wrapper { counter-reset: ${initialCounters.join(' ')}; }`);
108
+ }
109
+ return rules.join('\n');
110
+ };
111
+ exports.prepareWordPreviewNumbering = prepareWordPreviewNumbering;
112
+ //# sourceMappingURL=wordPreviewNumbering.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wordPreviewNumbering.js","names":["_wordXml","require","MAX_WORD_LIST_LEVEL","childElements","element","localName","Array","from","children","filter","child","setStartOverride","numbering","level","startOverride","start","wordChild","createElementNS","wordNamespace","prepend","setAttributeNS","prepareWordPreviewNumbering","styles","nums","Map","getElementsByTagNameNS","map","wordAttribute","abstracts","resolveLevels","id","visited","Set","has","Error","add","num","get","abstract","wordValue","linkedId","properties","numId","levels","forEach","set","Number","cloneNode","override","index","definition","undefined","resolved","keys","test","initialCounters","rules","nextAbstractId","Math","max","abstractId","String","definitions","sort","first","second","restart","isValidLevel","isInteger","isSafeInteger","append","counter","push","documentElement","resets","deeper","join","length","unshift","exports"],"sources":["../../../../../../../src/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.ts"],"sourcesContent":["import { wordAttribute, wordChild, wordNamespace, WordStyles, wordValue } from './wordXml';\n\nconst MAX_WORD_LIST_LEVEL = 8;\n\nconst childElements = (element: Element, localName: string): Element[] =>\n Array.from(element.children).filter((child) => child.localName === localName);\n\nconst setStartOverride = (numbering: Document, level: Element, startOverride: string): void => {\n let start = wordChild(level, 'start');\n if (!start) {\n start = numbering.createElementNS(wordNamespace, 'w:start');\n level.prepend(start);\n }\n start.setAttributeNS(wordNamespace, 'w:val', startOverride);\n};\n\n/*\n Normalises numbering definitions the preview library does not resolve (style links, level\n overrides, restarts), then returns CSS counter rules that replace its immediate-parent-only resets.\n Missing or cyclic definitions throw so a mis-numbered preview is never shown silently.\n */\nexport const prepareWordPreviewNumbering = (numbering: Document | undefined, styles: WordStyles): string => {\n if (!numbering) {\n return '';\n }\n const nums = new Map(Array.from(numbering.getElementsByTagNameNS(wordNamespace, 'num'))\n .map((element) => [wordAttribute(element, 'numId'), element]));\n const abstracts = new Map(Array.from(numbering.getElementsByTagNameNS(wordNamespace, 'abstractNum'))\n .map((element) => [wordAttribute(element, 'abstractNumId'), element]));\n\n const resolveLevels = (id: string, visited = new Set<string>()): Map<number, Element> => {\n if (visited.has(id)) {\n throw new Error(`Circular Word numbering style link: ${ id }`);\n }\n visited.add(id);\n const num = nums.get(id);\n const abstract = abstracts.get(wordValue(num, 'abstractNumId'));\n if (!num || !abstract) {\n throw new Error(`Missing Word numbering definition: ${ id }`);\n }\n const linkedId = styles.properties(wordValue(abstract, 'numStyleLink')).numId;\n const levels = linkedId ? resolveLevels(linkedId, visited) : new Map<number, Element>();\n childElements(abstract, 'lvl').forEach((level) => {\n levels.set(Number(wordAttribute(level, 'ilvl')), level.cloneNode(true) as Element);\n });\n childElements(num, 'lvlOverride').forEach((override) => {\n const index = Number(wordAttribute(override, 'ilvl'));\n const definition = wordChild(override, 'lvl') ?? levels.get(index);\n if (!definition) {\n throw new Error(`Missing Word numbering definition for numId ${ id }, level ${ index }.`);\n }\n const level = definition.cloneNode(true) as Element;\n const startOverride = wordValue(override, 'startOverride');\n if (startOverride !== undefined) {\n setStartOverride(numbering, level, startOverride);\n }\n levels.set(index, level);\n });\n return levels;\n };\n\n const resolved = Array.from(nums.keys()).map((id) => {\n if (!id || !/^\\d+$/.test(id)) {\n throw new Error(`Invalid Word numbering ID: ${ id }`);\n }\n return { id, levels: resolveLevels(id) };\n });\n\n const initialCounters: string[] = [];\n const rules: string[] = [];\n let nextAbstractId = Math.max(-1, ...Array.from(abstracts.keys()).map((id) => Number(id))) + 1;\n\n resolved.forEach(({ id, levels }) => {\n const abstract = numbering.createElementNS(wordNamespace, 'w:abstractNum');\n const abstractId = String(nextAbstractId);\n nextAbstractId += 1;\n abstract.setAttributeNS(wordNamespace, 'w:abstractNumId', abstractId);\n\n const definitions = Array.from(levels)\n .sort(([first], [second]) => first - second)\n .map(([index, level]) => {\n const start = Number(wordValue(level, 'start') ?? 1);\n const restart = Number(wordValue(level, 'lvlRestart') ?? index);\n const isValidLevel = Number.isInteger(index) && index >= 0 && index <= MAX_WORD_LIST_LEVEL;\n if (!isValidLevel || !Number.isSafeInteger(start) || !Number.isInteger(restart) || restart < 0 || restart > index) {\n throw new Error(`Invalid Word numbering properties for numId ${ id }, level ${ index }.`);\n }\n level.setAttributeNS(wordNamespace, 'w:ilvl', String(index));\n abstract.append(level);\n const counter = `docx-num-${ id }-${ index } ${ start - 1 }`;\n initialCounters.push(counter);\n return { index, restart, counter };\n });\n\n numbering.documentElement.append(abstract);\n wordChild(nums.get(id), 'abstractNumId')?.setAttributeNS(wordNamespace, 'w:val', abstractId);\n definitions.forEach(({ index }) => {\n const resets = definitions\n .filter((deeper) => deeper.index > index && deeper.restart > index)\n .map((deeper) => deeper.counter);\n rules.push(`p.docx-num-${ id }-${ index } { counter-set: ${ resets.join(' ') || 'none' }; }`);\n });\n });\n\n if (initialCounters.length) {\n rules.unshift(`.docx-wrapper { counter-reset: ${ initialCounters.join(' ') }; }`);\n }\n return rules.join('\\n');\n};\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAEA,MAAMC,mBAAmB,GAAG,CAAC;AAE7B,MAAMC,aAAa,GAAGA,CAACC,OAAgB,EAAEC,SAAiB,KACxDC,KAAK,CAACC,IAAI,CAACH,OAAO,CAACI,QAAQ,CAAC,CAACC,MAAM,CAAEC,KAAK,IAAKA,KAAK,CAACL,SAAS,KAAKA,SAAS,CAAC;AAE/E,MAAMM,gBAAgB,GAAGA,CAACC,SAAmB,EAAEC,KAAc,EAAEC,aAAqB,KAAW;EAC7F,IAAIC,KAAK,GAAG,IAAAC,kBAAS,EAACH,KAAK,EAAE,OAAO,CAAC;EACrC,IAAI,CAACE,KAAK,EAAE;IACVA,KAAK,GAAGH,SAAS,CAACK,eAAe,CAACC,sBAAa,EAAE,SAAS,CAAC;IAC3DL,KAAK,CAACM,OAAO,CAACJ,KAAK,CAAC;EACtB;EACAA,KAAK,CAACK,cAAc,CAACF,sBAAa,EAAE,OAAO,EAAEJ,aAAa,CAAC;AAC7D,CAAC;;AAED;AACA;AACA;AACA;AACA;AACO,MAAMO,2BAA2B,GAAGA,CAACT,SAA+B,EAAEU,MAAkB,KAAa;EAC1G,IAAI,CAACV,SAAS,EAAE;IACd,OAAO,EAAE;EACX;EACA,MAAMW,IAAI,GAAG,IAAIC,GAAG,CAAClB,KAAK,CAACC,IAAI,CAACK,SAAS,CAACa,sBAAsB,CAACP,sBAAa,EAAE,KAAK,CAAC,CAAC,CACpFQ,GAAG,CAAEtB,OAAO,IAAK,CAAC,IAAAuB,sBAAa,EAACvB,OAAO,EAAE,OAAO,CAAC,EAAEA,OAAO,CAAC,CAAC,CAAC;EAChE,MAAMwB,SAAS,GAAG,IAAIJ,GAAG,CAAClB,KAAK,CAACC,IAAI,CAACK,SAAS,CAACa,sBAAsB,CAACP,sBAAa,EAAE,aAAa,CAAC,CAAC,CACjGQ,GAAG,CAAEtB,OAAO,IAAK,CAAC,IAAAuB,sBAAa,EAACvB,OAAO,EAAE,eAAe,CAAC,EAAEA,OAAO,CAAC,CAAC,CAAC;EAExE,MAAMyB,aAAa,GAAGA,CAACC,EAAU,EAAEC,OAAO,GAAG,IAAIC,GAAG,CAAS,CAAC,KAA2B;IACvF,IAAID,OAAO,CAACE,GAAG,CAACH,EAAE,CAAC,EAAE;MACnB,MAAM,IAAII,KAAK,CAAC,uCAAwCJ,EAAE,EAAG,CAAC;IAChE;IACAC,OAAO,CAACI,GAAG,CAACL,EAAE,CAAC;IACf,MAAMM,GAAG,GAAGb,IAAI,CAACc,GAAG,CAACP,EAAE,CAAC;IACxB,MAAMQ,QAAQ,GAAGV,SAAS,CAACS,GAAG,CAAC,IAAAE,kBAAS,EAACH,GAAG,EAAE,eAAe,CAAC,CAAC;IAC/D,IAAI,CAACA,GAAG,IAAI,CAACE,QAAQ,EAAE;MACrB,MAAM,IAAIJ,KAAK,CAAC,sCAAuCJ,EAAE,EAAG,CAAC;IAC/D;IACA,MAAMU,QAAQ,GAAGlB,MAAM,CAACmB,UAAU,CAAC,IAAAF,kBAAS,EAACD,QAAQ,EAAE,cAAc,CAAC,CAAC,CAACI,KAAK;IAC7E,MAAMC,MAAM,GAAGH,QAAQ,GAAGX,aAAa,CAACW,QAAQ,EAAET,OAAO,CAAC,GAAG,IAAIP,GAAG,CAAkB,CAAC;IACvFrB,aAAa,CAACmC,QAAQ,EAAE,KAAK,CAAC,CAACM,OAAO,CAAE/B,KAAK,IAAK;MAChD8B,MAAM,CAACE,GAAG,CAACC,MAAM,CAAC,IAAAnB,sBAAa,EAACd,KAAK,EAAE,MAAM,CAAC,CAAC,EAAEA,KAAK,CAACkC,SAAS,CAAC,IAAI,CAAY,CAAC;IACpF,CAAC,CAAC;IACF5C,aAAa,CAACiC,GAAG,EAAE,aAAa,CAAC,CAACQ,OAAO,CAAEI,QAAQ,IAAK;MACtD,MAAMC,KAAK,GAAGH,MAAM,CAAC,IAAAnB,sBAAa,EAACqB,QAAQ,EAAE,MAAM,CAAC,CAAC;MACrD,MAAME,UAAU,GAAG,IAAAlC,kBAAS,EAACgC,QAAQ,EAAE,KAAK,CAAC,IAAIL,MAAM,CAACN,GAAG,CAACY,KAAK,CAAC;MAClE,IAAI,CAACC,UAAU,EAAE;QACf,MAAM,IAAIhB,KAAK,CAAC,+CAAgDJ,EAAE,WAAamB,KAAK,GAAI,CAAC;MAC3F;MACA,MAAMpC,KAAK,GAAGqC,UAAU,CAACH,SAAS,CAAC,IAAI,CAAY;MACnD,MAAMjC,aAAa,GAAG,IAAAyB,kBAAS,EAACS,QAAQ,EAAE,eAAe,CAAC;MAC1D,IAAIlC,aAAa,KAAKqC,SAAS,EAAE;QAC/BxC,gBAAgB,CAACC,SAAS,EAAEC,KAAK,EAAEC,aAAa,CAAC;MACnD;MACA6B,MAAM,CAACE,GAAG,CAACI,KAAK,EAAEpC,KAAK,CAAC;IAC1B,CAAC,CAAC;IACF,OAAO8B,MAAM;EACf,CAAC;EAED,MAAMS,QAAQ,GAAG9C,KAAK,CAACC,IAAI,CAACgB,IAAI,CAAC8B,IAAI,CAAC,CAAC,CAAC,CAAC3B,GAAG,CAAEI,EAAE,IAAK;IACnD,IAAI,CAACA,EAAE,IAAI,CAAC,OAAO,CAACwB,IAAI,CAACxB,EAAE,CAAC,EAAE;MAC5B,MAAM,IAAII,KAAK,CAAC,8BAA+BJ,EAAE,EAAG,CAAC;IACvD;IACA,OAAO;MAAEA,EAAE;MAAEa,MAAM,EAAEd,aAAa,CAACC,EAAE;IAAE,CAAC;EAC1C,CAAC,CAAC;EAEF,MAAMyB,eAAyB,GAAG,EAAE;EACpC,MAAMC,KAAe,GAAG,EAAE;EAC1B,IAAIC,cAAc,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAGrD,KAAK,CAACC,IAAI,CAACqB,SAAS,CAACyB,IAAI,CAAC,CAAC,CAAC,CAAC3B,GAAG,CAAEI,EAAE,IAAKgB,MAAM,CAAChB,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;EAE9FsB,QAAQ,CAACR,OAAO,CAAC,CAAC;IAAEd,EAAE;IAAEa;EAAO,CAAC,KAAK;IACnC,MAAML,QAAQ,GAAG1B,SAAS,CAACK,eAAe,CAACC,sBAAa,EAAE,eAAe,CAAC;IAC1E,MAAM0C,UAAU,GAAGC,MAAM,CAACJ,cAAc,CAAC;IACzCA,cAAc,IAAI,CAAC;IACnBnB,QAAQ,CAAClB,cAAc,CAACF,sBAAa,EAAE,iBAAiB,EAAE0C,UAAU,CAAC;IAErE,MAAME,WAAW,GAAGxD,KAAK,CAACC,IAAI,CAACoC,MAAM,CAAC,CACnCoB,IAAI,CAAC,CAAC,CAACC,KAAK,CAAC,EAAE,CAACC,MAAM,CAAC,KAAKD,KAAK,GAAGC,MAAM,CAAC,CAC3CvC,GAAG,CAAC,CAAC,CAACuB,KAAK,EAAEpC,KAAK,CAAC,KAAK;MACvB,MAAME,KAAK,GAAG+B,MAAM,CAAC,IAAAP,kBAAS,EAAC1B,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;MACpD,MAAMqD,OAAO,GAAGpB,MAAM,CAAC,IAAAP,kBAAS,EAAC1B,KAAK,EAAE,YAAY,CAAC,IAAIoC,KAAK,CAAC;MAC/D,MAAMkB,YAAY,GAAGrB,MAAM,CAACsB,SAAS,CAACnB,KAAK,CAAC,IAAIA,KAAK,IAAI,CAAC,IAAIA,KAAK,IAAI/C,mBAAmB;MAC1F,IAAI,CAACiE,YAAY,IAAI,CAACrB,MAAM,CAACuB,aAAa,CAACtD,KAAK,CAAC,IAAI,CAAC+B,MAAM,CAACsB,SAAS,CAACF,OAAO,CAAC,IAAIA,OAAO,GAAG,CAAC,IAAIA,OAAO,GAAGjB,KAAK,EAAE;QACjH,MAAM,IAAIf,KAAK,CAAC,+CAAgDJ,EAAE,WAAamB,KAAK,GAAI,CAAC;MAC3F;MACApC,KAAK,CAACO,cAAc,CAACF,sBAAa,EAAE,QAAQ,EAAE2C,MAAM,CAACZ,KAAK,CAAC,CAAC;MAC5DX,QAAQ,CAACgC,MAAM,CAACzD,KAAK,CAAC;MACtB,MAAM0D,OAAO,GAAG,YAAazC,EAAE,IAAMmB,KAAK,IAAMlC,KAAK,GAAG,CAAC,EAAG;MAC5DwC,eAAe,CAACiB,IAAI,CAACD,OAAO,CAAC;MAC7B,OAAO;QAAEtB,KAAK;QAAEiB,OAAO;QAAEK;MAAQ,CAAC;IACpC,CAAC,CAAC;IAEJ3D,SAAS,CAAC6D,eAAe,CAACH,MAAM,CAAChC,QAAQ,CAAC;IAC1C,IAAAtB,kBAAS,EAACO,IAAI,CAACc,GAAG,CAACP,EAAE,CAAC,EAAE,eAAe,CAAC,EAAEV,cAAc,CAACF,sBAAa,EAAE,OAAO,EAAE0C,UAAU,CAAC;IAC5FE,WAAW,CAAClB,OAAO,CAAC,CAAC;MAAEK;IAAM,CAAC,KAAK;MACjC,MAAMyB,MAAM,GAAGZ,WAAW,CACvBrD,MAAM,CAAEkE,MAAM,IAAKA,MAAM,CAAC1B,KAAK,GAAGA,KAAK,IAAI0B,MAAM,CAACT,OAAO,GAAGjB,KAAK,CAAC,CAClEvB,GAAG,CAAEiD,MAAM,IAAKA,MAAM,CAACJ,OAAO,CAAC;MAClCf,KAAK,CAACgB,IAAI,CAAC,cAAe1C,EAAE,IAAMmB,KAAK,mBAAqByB,MAAM,CAACE,IAAI,CAAC,GAAG,CAAC,IAAI,MAAM,KAAM,CAAC;IAC/F,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF,IAAIrB,eAAe,CAACsB,MAAM,EAAE;IAC1BrB,KAAK,CAACsB,OAAO,CAAC,kCAAmCvB,eAAe,CAACqB,IAAI,CAAC,GAAG,CAAC,KAAM,CAAC;EACnF;EACA,OAAOpB,KAAK,CAACoB,IAAI,CAAC,IAAI,CAAC;AACzB,CAAC;AAACG,OAAA,CAAA1D,2BAAA,GAAAA,2BAAA","ignoreList":[]}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.wordValue = exports.wordNamespace = exports.wordChild = exports.wordAttribute = exports.getWordStyles = exports.createWordNumberingResolver = void 0;
7
+ const wordNamespace = exports.wordNamespace = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';
8
+ const wordChild = (element, name) => Array.from(element?.children ?? []).find(item => item.namespaceURI === wordNamespace && item.localName === name);
9
+ exports.wordChild = wordChild;
10
+ const wordAttribute = (element, name = 'val') => element?.getAttributeNS(wordNamespace, name) ?? undefined;
11
+ exports.wordAttribute = wordAttribute;
12
+ const wordValue = (element, name) => wordAttribute(wordChild(element, name));
13
+ exports.wordValue = wordValue;
14
+ const isWordFalse = value => ['0', 'false', 'off'].includes(value ?? '');
15
+ const getWordStyles = styles => {
16
+ const styleElements = Array.from(styles?.getElementsByTagNameNS(wordNamespace, 'style') ?? []);
17
+ const byId = new Map(styleElements.map(style => [wordAttribute(style, 'styleId'), style]));
18
+ const properties = (id, visited = new Set()) => {
19
+ if (!id) {
20
+ return {};
21
+ }
22
+ if (visited.has(id)) {
23
+ throw new Error(`Circular Word style inheritance: ${id}`);
24
+ }
25
+ visited.add(id);
26
+ const style = byId.get(id);
27
+ const inherited = properties(wordValue(style, 'basedOn'), visited);
28
+ const paragraph = wordChild(style, 'pPr');
29
+ const numbering = wordChild(paragraph, 'numPr');
30
+ const bold = wordChild(wordChild(style, 'rPr'), 'b');
31
+ return {
32
+ numId: wordValue(numbering, 'numId') ?? inherited.numId,
33
+ level: wordValue(numbering, 'ilvl') ?? inherited.level,
34
+ outline: wordValue(paragraph, 'outlineLvl') ?? inherited.outline,
35
+ // Word toggles bold relative to the inherited style rather than setting it absolutely.
36
+ bold: bold && !isWordFalse(wordAttribute(bold)) ? !inherited.bold : inherited.bold
37
+ };
38
+ };
39
+ return {
40
+ byId,
41
+ properties
42
+ };
43
+ };
44
+ exports.getWordStyles = getWordStyles;
45
+ const createWordNumberingResolver = (numbering, styles) => {
46
+ const numElements = Array.from(numbering?.getElementsByTagNameNS(wordNamespace, 'num') ?? []);
47
+ const nums = new Map(numElements.map(num => [wordAttribute(num, 'numId'), num]));
48
+ const activeInstances = new Map();
49
+ return paragraphProperties => {
50
+ const inherited = styles.properties(wordValue(paragraphProperties, 'pStyle'));
51
+ const numberingProperties = wordChild(paragraphProperties, 'numPr');
52
+ const explicitId = wordValue(numberingProperties, 'numId');
53
+ const inheritedAbstract = wordValue(nums.get(inherited.numId), 'abstractNumId');
54
+ const restartsInheritedList = explicitId && explicitId !== '0' && inherited.numId && inheritedAbstract && wordValue(nums.get(explicitId), 'abstractNumId') === inheritedAbstract;
55
+ if (restartsInheritedList && inherited.numId) {
56
+ // A restarted instance also governs following items that inherit the base list style.
57
+ activeInstances.set(inherited.numId, explicitId);
58
+ }
59
+ const inheritedId = inherited.numId ? activeInstances.get(inherited.numId) ?? inherited.numId : undefined;
60
+ return {
61
+ id: explicitId ?? inheritedId,
62
+ level: wordValue(numberingProperties, 'ilvl') ?? inherited.level ?? '0',
63
+ inherited
64
+ };
65
+ };
66
+ };
67
+ exports.createWordNumberingResolver = createWordNumberingResolver;
68
+ //# sourceMappingURL=wordXml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wordXml.js","names":["wordNamespace","exports","wordChild","element","name","Array","from","children","find","item","namespaceURI","localName","wordAttribute","getAttributeNS","undefined","wordValue","isWordFalse","value","includes","getWordStyles","styles","styleElements","getElementsByTagNameNS","byId","Map","map","style","properties","id","visited","Set","has","Error","add","get","inherited","paragraph","numbering","bold","numId","level","outline","createWordNumberingResolver","numElements","nums","num","activeInstances","paragraphProperties","numberingProperties","explicitId","inheritedAbstract","restartsInheritedList","set","inheritedId"],"sources":["../../../../../../../src/widgets/shared/documents/engines/wordRenderer/wordXml.ts"],"sourcesContent":["export const wordNamespace = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main';\n\nexport const wordChild = (element: Element | undefined, name: string): Element | undefined =>\n Array.from(element?.children ?? []).find((item) => item.namespaceURI === wordNamespace && item.localName === name);\n\nexport const wordAttribute = (element: Element | undefined, name = 'val'): string | undefined =>\n element?.getAttributeNS(wordNamespace, name) ?? undefined;\n\nexport const wordValue = (element: Element | undefined, name: string): string | undefined => wordAttribute(wordChild(element, name));\n\nexport type WordStyleProperties = {\n numId?: string;\n level?: string;\n outline?: string;\n bold?: boolean;\n};\n\nexport type WordStyles = {\n byId: Map<string | undefined, Element>;\n /* eslint-disable-next-line no-unused-vars */\n properties: (id: string | undefined, visited?: Set<string>) => WordStyleProperties;\n};\n\nconst isWordFalse = (value: string | undefined): boolean => ['0', 'false', 'off'].includes(value ?? '');\n\nexport const getWordStyles = (styles: Document | undefined): WordStyles => {\n const styleElements = Array.from(styles?.getElementsByTagNameNS(wordNamespace, 'style') ?? []);\n const byId = new Map(styleElements.map((style) => [wordAttribute(style, 'styleId'), style]));\n\n const properties = (id: string | undefined, visited = new Set<string>()): WordStyleProperties => {\n if (!id) {\n return {};\n }\n if (visited.has(id)) {\n throw new Error(`Circular Word style inheritance: ${ id }`);\n }\n visited.add(id);\n const style = byId.get(id);\n const inherited = properties(wordValue(style, 'basedOn'), visited);\n const paragraph = wordChild(style, 'pPr');\n const numbering = wordChild(paragraph, 'numPr');\n const bold = wordChild(wordChild(style, 'rPr'), 'b');\n return {\n numId: wordValue(numbering, 'numId') ?? inherited.numId,\n level: wordValue(numbering, 'ilvl') ?? inherited.level,\n outline: wordValue(paragraph, 'outlineLvl') ?? inherited.outline,\n // Word toggles bold relative to the inherited style rather than setting it absolutely.\n bold: bold && !isWordFalse(wordAttribute(bold)) ? !inherited.bold : inherited.bold\n };\n };\n\n return { byId, properties };\n};\n\nexport const createWordNumberingResolver = (numbering: Document | undefined, styles: WordStyles) => {\n const numElements = Array.from(numbering?.getElementsByTagNameNS(wordNamespace, 'num') ?? []);\n const nums = new Map(numElements.map((num) => [wordAttribute(num, 'numId'), num]));\n const activeInstances = new Map<string, string>();\n\n return (paragraphProperties: Element | undefined) => {\n const inherited = styles.properties(wordValue(paragraphProperties, 'pStyle'));\n const numberingProperties = wordChild(paragraphProperties, 'numPr');\n const explicitId = wordValue(numberingProperties, 'numId');\n const inheritedAbstract = wordValue(nums.get(inherited.numId), 'abstractNumId');\n const restartsInheritedList = explicitId\n && explicitId !== '0'\n && inherited.numId\n && inheritedAbstract\n && wordValue(nums.get(explicitId), 'abstractNumId') === inheritedAbstract;\n if (restartsInheritedList && inherited.numId) {\n // A restarted instance also governs following items that inherit the base list style.\n activeInstances.set(inherited.numId, explicitId);\n }\n const inheritedId = inherited.numId ? activeInstances.get(inherited.numId) ?? inherited.numId : undefined;\n return {\n id: explicitId ?? inheritedId,\n level: wordValue(numberingProperties, 'ilvl') ?? inherited.level ?? '0',\n inherited\n };\n };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "fetchDocumentAsArrayBuffer", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _documentHelpers.fetchDocumentAsArrayBuffer;
10
+ }
11
+ });
12
+ Object.defineProperty(exports, "fetchDocumentAsText", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _documentHelpers.fetchDocumentAsText;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "getDocumentExtension", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _documentHelpers.getDocumentExtension;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "getDocumentFileName", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _documentHelpers.getDocumentFileName;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "getDocumentKind", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _documentHelpers.getDocumentKind;
34
+ }
35
+ });
36
+ Object.defineProperty(exports, "resolveDocumentResource", {
37
+ enumerable: true,
38
+ get: function () {
39
+ return _documentHelpers.resolveDocumentResource;
40
+ }
41
+ });
42
+ Object.defineProperty(exports, "useDocumentContent", {
43
+ enumerable: true,
44
+ get: function () {
45
+ return _useDocumentContent.useDocumentContent;
46
+ }
47
+ });
48
+ var _documentHelpers = require("./documentHelpers");
49
+ var _useDocumentContent = require("./useDocumentContent");
50
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["_documentHelpers","require","_useDocumentContent"],"sources":["../../../../../src/widgets/shared/documents/index.ts"],"sourcesContent":["export {\n fetchDocumentAsArrayBuffer,\n fetchDocumentAsText,\n getDocumentExtension,\n getDocumentFileName,\n getDocumentKind,\n resolveDocumentResource\n} from './documentHelpers';\nexport { useDocumentContent } from './useDocumentContent';\n\nexport type { DocumentContentState } from './useDocumentContent';\nexport type {\n DocumentKind,\n DocumentLoadStatus,\n DocumentSource,\n LoadedDocument,\n ResolveResourceUrl\n} from './documents.interfaces';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AAQA,IAAAC,mBAAA,GAAAD,OAAA","ignoreList":[]}
@@ -0,0 +1,8 @@
1
+ .documentToggleGroup {
2
+ display: inline-flex;
3
+ flex-wrap: wrap;
4
+ gap: 5px;
5
+ margin: 0;
6
+ padding: 0;
7
+ border: 0;
8
+ }