@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,182 @@
1
+ import { isLikelyLayoutTable, LAYOUT_TABLE_MARKER } from './tableHelpers';
2
+ const getText = node => node.value ?? node.children?.map(getText).join(' ') ?? '';
3
+
4
+ // Converted documents use `<br>` for line breaks; without raw HTML support they would vanish.
5
+ export const remarkLineBreaks = () => {
6
+ const transform = node => {
7
+ if (node.type === 'html' && /^<br\s*\/?>$/i.test(node.value?.trim() ?? '')) {
8
+ node.type = 'break';
9
+ delete node.value;
10
+ }
11
+ node.children?.forEach(transform);
12
+ };
13
+ return transform;
14
+ };
15
+ const splitInlineContent = nodes => {
16
+ const paragraphs = [[]];
17
+ nodes.forEach(node => {
18
+ let segments;
19
+ if (node.type === 'text') {
20
+ segments = (node.value ?? '').split(/\r?\n/).map(value => [{
21
+ ...node,
22
+ value
23
+ }]);
24
+ } else if (node.children) {
25
+ segments = splitInlineContent(node.children).map(children => [{
26
+ ...node,
27
+ children
28
+ }]);
29
+ } else {
30
+ segments = [[node]];
31
+ }
32
+ segments.forEach((segment, index) => {
33
+ if (index > 0) {
34
+ paragraphs.push([]);
35
+ }
36
+ paragraphs[paragraphs.length - 1].push(...segment);
37
+ });
38
+ });
39
+ return paragraphs;
40
+ };
41
+
42
+ // Source documents treat each line as its own paragraph, whereas markdown joins adjacent lines.
43
+ export const remarkParagraphBreaks = () => {
44
+ const transform = parent => {
45
+ if (!parent.children || ['list', 'listItem', 'table', 'tableCell'].includes(parent.type)) {
46
+ return;
47
+ }
48
+ parent.children = parent.children.flatMap(node => {
49
+ if (node.type === 'paragraph') {
50
+ return splitInlineContent(node.children ?? []).map(children => ({
51
+ ...node,
52
+ children
53
+ }));
54
+ }
55
+ transform(node);
56
+ return [node];
57
+ });
58
+ };
59
+ return transform;
60
+ };
61
+ const markLayoutTable = node => {
62
+ const properties = node.data?.hProperties ?? {};
63
+ const className = [...new Set([...(properties.className ?? []), 'layoutTable'])];
64
+ node.data = {
65
+ ...node.data,
66
+ hProperties: {
67
+ ...properties,
68
+ className
69
+ }
70
+ };
71
+ };
72
+ export const remarkLayoutTables = () => {
73
+ const transform = parent => {
74
+ if (!parent.children) {
75
+ return;
76
+ }
77
+ parent.children = parent.children.filter((node, index, siblings) => {
78
+ const isMarker = node.type === 'html' && node.value?.trim() === LAYOUT_TABLE_MARKER;
79
+ if (isMarker && siblings[index + 1]?.type === 'table') {
80
+ markLayoutTable(siblings[index + 1]);
81
+ return false;
82
+ }
83
+ return true;
84
+ });
85
+ parent.children.forEach(node => {
86
+ if (node.type === 'table' && node.children) {
87
+ const rows = node.children.map((row, rowIndex) => row.children?.map(cell => ({
88
+ text: getText(cell),
89
+ isHeader: rowIndex === 0
90
+ })) ?? []);
91
+ if (isLikelyLayoutTable(rows)) {
92
+ markLayoutTable(node);
93
+ }
94
+ }
95
+ transform(node);
96
+ });
97
+ };
98
+ return transform;
99
+ };
100
+ const getInlineList = (text, allowSingleLeadingBullet = false) => {
101
+ const leadingBullets = /^-\s+(.+)\.$/.exec(text);
102
+ if (leadingBullets) {
103
+ const items = leadingBullets[1].split(/\.\s+-\s+/).map(item => item.trim());
104
+ if ((items.length >= 2 || allowSingleLeadingBullet) && items.every(Boolean)) {
105
+ return {
106
+ prefix: '',
107
+ items: items.map(item => `${item}.`)
108
+ };
109
+ }
110
+ }
111
+ const prefixedBullets = /^(.*?:)\s+-\s+(.+)$/.exec(text);
112
+ if (!prefixedBullets) {
113
+ return null;
114
+ }
115
+ const items = prefixedBullets[2].split(/;\s+(?:and\s+)?-\s+/).map(item => item.trim());
116
+ if (items.length < 2 || items.some(item => !item)) {
117
+ return null;
118
+ }
119
+ return {
120
+ prefix: `${prefixedBullets[1]} `,
121
+ items: items.map((item, index) => index < items.length - 1 ? `${item};` : item)
122
+ };
123
+ };
124
+ const getPlainText = cell => cell.children?.length === 1 && cell.children[0].type === 'text' ? cell.children[0].value ?? '' : null;
125
+ const setCellList = (cell, list) => {
126
+ cell.children = [...(list.prefix ? [{
127
+ type: 'text',
128
+ value: list.prefix
129
+ }] : []), {
130
+ type: 'list',
131
+ children: list.items.map(value => ({
132
+ type: 'listItem',
133
+ children: [{
134
+ type: 'paragraph',
135
+ children: [{
136
+ type: 'text',
137
+ value
138
+ }]
139
+ }]
140
+ }))
141
+ }];
142
+ };
143
+ const getCells = row => row?.children?.filter(cell => cell.type === 'tableCell') ?? [];
144
+ const containsList = cell => cell?.children?.some(child => child.type === 'list') ?? false;
145
+
146
+ // A lone "- item." is only a list when the same column holds a list in a neighbouring row.
147
+ const convertRelatedSingleBullets = table => {
148
+ const rows = table.children?.filter(row => row.type === 'tableRow') ?? [];
149
+ rows.forEach((row, rowIndex) => {
150
+ getCells(row).forEach((cell, cellIndex) => {
151
+ const text = getPlainText(cell);
152
+ const list = text === null ? null : getInlineList(text, true);
153
+ if (list?.items.length !== 1) {
154
+ return;
155
+ }
156
+ if (containsList(getCells(rows[rowIndex - 1])[cellIndex]) || containsList(getCells(rows[rowIndex + 1])[cellIndex])) {
157
+ setCellList(cell, list);
158
+ }
159
+ });
160
+ });
161
+ };
162
+
163
+ // Table cells cannot hold markdown lists, so converters flatten them to "- a. - b." text.
164
+ export const remarkTableCellLists = () => {
165
+ const transform = node => {
166
+ if (node.type === 'table') {
167
+ node.children?.forEach(transform);
168
+ convertRelatedSingleBullets(node);
169
+ return;
170
+ }
171
+ if (node.type === 'tableCell') {
172
+ const text = getPlainText(node);
173
+ const list = text === null ? null : getInlineList(text);
174
+ if (list) {
175
+ setCellList(node, list);
176
+ }
177
+ }
178
+ node.children?.forEach(transform);
179
+ };
180
+ return transform;
181
+ };
182
+ //# sourceMappingURL=remarkPlugins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remarkPlugins.js","names":["isLikelyLayoutTable","LAYOUT_TABLE_MARKER","getText","node","value","children","map","join","remarkLineBreaks","transform","type","test","trim","forEach","splitInlineContent","nodes","paragraphs","segments","split","segment","index","push","length","remarkParagraphBreaks","parent","includes","flatMap","markLayoutTable","properties","data","hProperties","className","Set","remarkLayoutTables","filter","siblings","isMarker","rows","row","rowIndex","cell","text","isHeader","getInlineList","allowSingleLeadingBullet","leadingBullets","exec","items","item","every","Boolean","prefix","prefixedBullets","some","getPlainText","setCellList","list","getCells","containsList","child","convertRelatedSingleBullets","table","cellIndex","remarkTableCellLists"],"sources":["../../../../../../../../src/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.ts"],"sourcesContent":["import { isLikelyLayoutTable, LAYOUT_TABLE_MARKER } from './tableHelpers';\nimport { MarkdownNode, MarkdownTransformer } from './markdownNode.interfaces';\n\nconst getText = (node: MarkdownNode): string => node.value ?? node.children?.map(getText).join(' ') ?? '';\n\n// Converted documents use `<br>` for line breaks; without raw HTML support they would vanish.\nexport const remarkLineBreaks = (): MarkdownTransformer => {\n const transform = (node: MarkdownNode): void => {\n if (node.type === 'html' && /^<br\\s*\\/?>$/i.test(node.value?.trim() ?? '')) {\n node.type = 'break';\n delete node.value;\n }\n node.children?.forEach(transform);\n };\n return transform;\n};\n\nconst splitInlineContent = (nodes: MarkdownNode[]): MarkdownNode[][] => {\n const paragraphs: MarkdownNode[][] = [[]];\n nodes.forEach((node) => {\n let segments: MarkdownNode[][];\n if (node.type === 'text') {\n segments = (node.value ?? '').split(/\\r?\\n/).map((value) => [{ ...node, value }]);\n } else if (node.children) {\n segments = splitInlineContent(node.children).map((children) => [{ ...node, children }]);\n } else {\n segments = [[node]];\n }\n segments.forEach((segment, index) => {\n if (index > 0) {\n paragraphs.push([]);\n }\n paragraphs[paragraphs.length - 1].push(...segment);\n });\n });\n return paragraphs;\n};\n\n// Source documents treat each line as its own paragraph, whereas markdown joins adjacent lines.\nexport const remarkParagraphBreaks = (): MarkdownTransformer => {\n const transform = (parent: MarkdownNode): void => {\n if (!parent.children || ['list', 'listItem', 'table', 'tableCell'].includes(parent.type)) {\n return;\n }\n parent.children = parent.children.flatMap((node) => {\n if (node.type === 'paragraph') {\n return splitInlineContent(node.children ?? []).map((children) => ({ ...node, children }));\n }\n transform(node);\n return [node];\n });\n };\n return transform;\n};\n\nconst markLayoutTable = (node: MarkdownNode): void => {\n const properties = node.data?.hProperties ?? {};\n const className = [...new Set([...(properties.className ?? []), 'layoutTable'])];\n node.data = { ...node.data, hProperties: { ...properties, className } };\n};\n\nexport const remarkLayoutTables = (): MarkdownTransformer => {\n const transform = (parent: MarkdownNode): void => {\n if (!parent.children) {\n return;\n }\n parent.children = parent.children.filter((node, index, siblings) => {\n const isMarker = node.type === 'html' && node.value?.trim() === LAYOUT_TABLE_MARKER;\n if (isMarker && siblings[index + 1]?.type === 'table') {\n markLayoutTable(siblings[index + 1]);\n return false;\n }\n return true;\n });\n parent.children.forEach((node) => {\n if (node.type === 'table' && node.children) {\n const rows = node.children.map((row, rowIndex) =>\n row.children?.map((cell) => ({ text: getText(cell), isHeader: rowIndex === 0 })) ?? []\n );\n if (isLikelyLayoutTable(rows)) {\n markLayoutTable(node);\n }\n }\n transform(node);\n });\n };\n return transform;\n};\n\ntype InlineList = {\n prefix: string;\n items: string[];\n};\n\nconst getInlineList = (text: string, allowSingleLeadingBullet = false): InlineList | null => {\n const leadingBullets = /^-\\s+(.+)\\.$/.exec(text);\n if (leadingBullets) {\n const items = leadingBullets[1].split(/\\.\\s+-\\s+/).map((item) => item.trim());\n if ((items.length >= 2 || allowSingleLeadingBullet) && items.every(Boolean)) {\n return { prefix: '', items: items.map((item) => `${ item }.`) };\n }\n }\n\n const prefixedBullets = /^(.*?:)\\s+-\\s+(.+)$/.exec(text);\n if (!prefixedBullets) {\n return null;\n }\n const items = prefixedBullets[2].split(/;\\s+(?:and\\s+)?-\\s+/).map((item) => item.trim());\n if (items.length < 2 || items.some((item) => !item)) {\n return null;\n }\n return {\n prefix: `${ prefixedBullets[1] } `,\n items: items.map((item, index) => (index < items.length - 1 ? `${ item };` : item))\n };\n};\n\nconst getPlainText = (cell: MarkdownNode): string | null =>\n cell.children?.length === 1 && cell.children[0].type === 'text' ? cell.children[0].value ?? '' : null;\n\nconst setCellList = (cell: MarkdownNode, list: InlineList): void => {\n cell.children = [\n ...(list.prefix ? [{ type: 'text', value: list.prefix }] : []),\n {\n type: 'list',\n children: list.items.map((value) => ({\n type: 'listItem',\n children: [{ type: 'paragraph', children: [{ type: 'text', value }] }]\n }))\n }\n ];\n};\n\nconst getCells = (row: MarkdownNode | undefined): MarkdownNode[] => row?.children?.filter((cell) => cell.type === 'tableCell') ?? [];\n\nconst containsList = (cell: MarkdownNode | undefined): boolean => cell?.children?.some((child) => child.type === 'list') ?? false;\n\n// A lone \"- item.\" is only a list when the same column holds a list in a neighbouring row.\nconst convertRelatedSingleBullets = (table: MarkdownNode): void => {\n const rows = table.children?.filter((row) => row.type === 'tableRow') ?? [];\n rows.forEach((row, rowIndex) => {\n getCells(row).forEach((cell, cellIndex) => {\n const text = getPlainText(cell);\n const list = text === null ? null : getInlineList(text, true);\n if (list?.items.length !== 1) {\n return;\n }\n if (containsList(getCells(rows[rowIndex - 1])[cellIndex]) || containsList(getCells(rows[rowIndex + 1])[cellIndex])) {\n setCellList(cell, list);\n }\n });\n });\n};\n\n// Table cells cannot hold markdown lists, so converters flatten them to \"- a. - b.\" text.\nexport const remarkTableCellLists = (): MarkdownTransformer => {\n const transform = (node: MarkdownNode): void => {\n if (node.type === 'table') {\n node.children?.forEach(transform);\n convertRelatedSingleBullets(node);\n return;\n }\n if (node.type === 'tableCell') {\n const text = getPlainText(node);\n const list = text === null ? null : getInlineList(text);\n if (list) {\n setCellList(node, list);\n }\n }\n node.children?.forEach(transform);\n };\n return transform;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,78 @@
1
+ import DOMPurify from 'dompurify';
2
+ import { hasMeaningfulTableText } from './tableHelpers';
3
+ const ALLOWED_TABLE_TAGS = ['table', 'thead', 'tbody', 'tfoot', 'tr', 'th', 'td', 'caption', 'colgroup', 'col', 'p', 'br', 'strong', 'em', 'b', 'i', 'u', 'del', 's', 'code', 'pre', 'ul', 'ol', 'li', 'a', 'img', 'span', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'];
4
+ const ALLOWED_TABLE_ATTRIBUTES = ['colspan', 'rowspan', 'href', 'src', 'alt', 'title', 'class'];
5
+ const ALLOWED_CLASS_NAMES = ['layoutTable'];
6
+ const toHastProperties = element => {
7
+ const properties = {};
8
+ Array.from(element.attributes).forEach(({
9
+ name,
10
+ value
11
+ }) => {
12
+ if (name === 'class') {
13
+ const className = value.split(/\s+/).filter(item => ALLOWED_CLASS_NAMES.includes(item));
14
+ if (className.length) {
15
+ properties.className = className;
16
+ }
17
+ } else if (name === 'colspan' || name === 'rowspan') {
18
+ const span = Number(value);
19
+ if (Number.isInteger(span) && span > 0) {
20
+ properties[name === 'colspan' ? 'colSpan' : 'rowSpan'] = span;
21
+ }
22
+ } else {
23
+ properties[name] = value;
24
+ }
25
+ });
26
+ return properties;
27
+ };
28
+ const toHast = node => {
29
+ if (node.nodeType === Node.TEXT_NODE) {
30
+ return {
31
+ type: 'text',
32
+ value: node.textContent ?? ''
33
+ };
34
+ }
35
+ if (node.nodeType !== Node.ELEMENT_NODE) {
36
+ return null;
37
+ }
38
+ const element = node;
39
+ return {
40
+ type: 'element',
41
+ tagName: element.tagName.toLowerCase(),
42
+ properties: toHastProperties(element),
43
+ children: Array.from(element.childNodes).map(toHast).filter(child => child !== null)
44
+ };
45
+ };
46
+ const sanitizeTable = html => {
47
+ const fragment = DOMPurify.sanitize(html, {
48
+ ALLOWED_TAGS: ALLOWED_TABLE_TAGS,
49
+ ALLOWED_ATTR: ALLOWED_TABLE_ATTRIBUTES,
50
+ RETURN_DOM_FRAGMENT: true
51
+ });
52
+ const meaningfulNodes = Array.from(fragment.childNodes).filter(child => child.nodeType !== Node.TEXT_NODE || hasMeaningfulTableText(child.textContent ?? ''));
53
+ const [onlyNode] = meaningfulNodes;
54
+ return meaningfulNodes.length === 1 && onlyNode instanceof Element && onlyNode.tagName === 'TABLE' ? onlyNode : null;
55
+ };
56
+
57
+ // Converters fall back to raw `<table>` HTML for merged cells, which markdown cannot express.
58
+ // Only a single, sanitised table is rendered; any other raw HTML stays inert text.
59
+ export const remarkSafeTables = () => {
60
+ const transform = node => {
61
+ if (node.type === 'html' && /^<table(?:\s|>)/i.test(node.value?.trim() ?? '')) {
62
+ const table = sanitizeTable(node.value ?? '');
63
+ const hast = table ? toHast(table) : null;
64
+ if (hast?.type === 'element') {
65
+ node.type = 'safeDocumentTable';
66
+ node.data = {
67
+ hName: 'table',
68
+ hProperties: hast.properties,
69
+ hChildren: hast.children
70
+ };
71
+ delete node.value;
72
+ }
73
+ }
74
+ node.children?.forEach(transform);
75
+ };
76
+ return transform;
77
+ };
78
+ //# sourceMappingURL=remarkSafeTables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remarkSafeTables.js","names":["DOMPurify","hasMeaningfulTableText","ALLOWED_TABLE_TAGS","ALLOWED_TABLE_ATTRIBUTES","ALLOWED_CLASS_NAMES","toHastProperties","element","properties","Array","from","attributes","forEach","name","value","className","split","filter","item","includes","length","span","Number","isInteger","toHast","node","nodeType","Node","TEXT_NODE","type","textContent","ELEMENT_NODE","tagName","toLowerCase","children","childNodes","map","child","sanitizeTable","html","fragment","sanitize","ALLOWED_TAGS","ALLOWED_ATTR","RETURN_DOM_FRAGMENT","meaningfulNodes","onlyNode","Element","remarkSafeTables","transform","test","trim","table","hast","data","hName","hProperties","hChildren"],"sources":["../../../../../../../../src/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.ts"],"sourcesContent":["import DOMPurify from 'dompurify';\n\nimport { hasMeaningfulTableText } from './tableHelpers';\nimport { MarkdownNode, MarkdownTransformer } from './markdownNode.interfaces';\n\nconst ALLOWED_TABLE_TAGS = [\n 'table', 'thead', 'tbody', 'tfoot', 'tr', 'th', 'td', 'caption', 'colgroup', 'col',\n 'p', 'br', 'strong', 'em', 'b', 'i', 'u', 'del', 's', 'code', 'pre', 'ul', 'ol', 'li',\n 'a', 'img', 'span', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6'\n];\nconst ALLOWED_TABLE_ATTRIBUTES = ['colspan', 'rowspan', 'href', 'src', 'alt', 'title', 'class'];\nconst ALLOWED_CLASS_NAMES = ['layoutTable'];\n\ntype HastNode =\n | { type: 'text'; value: string }\n | { type: 'element'; tagName: string; properties: Record<string, unknown>; children: HastNode[] };\n\nconst toHastProperties = (element: Element): Record<string, unknown> => {\n const properties: Record<string, unknown> = {};\n Array.from(element.attributes).forEach(({ name, value }) => {\n if (name === 'class') {\n const className = value.split(/\\s+/).filter((item) => ALLOWED_CLASS_NAMES.includes(item));\n if (className.length) {\n properties.className = className;\n }\n } else if (name === 'colspan' || name === 'rowspan') {\n const span = Number(value);\n if (Number.isInteger(span) && span > 0) {\n properties[name === 'colspan' ? 'colSpan' : 'rowSpan'] = span;\n }\n } else {\n properties[name] = value;\n }\n });\n return properties;\n};\n\nconst toHast = (node: Node): HastNode | null => {\n if (node.nodeType === Node.TEXT_NODE) {\n return { type: 'text', value: node.textContent ?? '' };\n }\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n const element = node as Element;\n return {\n type: 'element',\n tagName: element.tagName.toLowerCase(),\n properties: toHastProperties(element),\n children: Array.from(element.childNodes).map(toHast).filter((child): child is HastNode => child !== null)\n };\n};\n\nconst sanitizeTable = (html: string): Element | null => {\n const fragment = DOMPurify.sanitize(html, {\n ALLOWED_TAGS: ALLOWED_TABLE_TAGS,\n ALLOWED_ATTR: ALLOWED_TABLE_ATTRIBUTES,\n RETURN_DOM_FRAGMENT: true\n });\n const meaningfulNodes = Array.from(fragment.childNodes).filter((child) =>\n child.nodeType !== Node.TEXT_NODE || hasMeaningfulTableText(child.textContent ?? '')\n );\n const [onlyNode] = meaningfulNodes;\n return meaningfulNodes.length === 1 && onlyNode instanceof Element && onlyNode.tagName === 'TABLE' ? onlyNode : null;\n};\n\n// Converters fall back to raw `<table>` HTML for merged cells, which markdown cannot express.\n// Only a single, sanitised table is rendered; any other raw HTML stays inert text.\nexport const remarkSafeTables = (): MarkdownTransformer => {\n const transform = (node: MarkdownNode): void => {\n if (node.type === 'html' && /^<table(?:\\s|>)/i.test(node.value?.trim() ?? '')) {\n const table = sanitizeTable(node.value ?? '');\n const hast = table ? toHast(table) : null;\n if (hast?.type === 'element') {\n node.type = 'safeDocumentTable';\n node.data = {\n hName: 'table',\n hProperties: hast.properties as Record<string, unknown> & { className?: string[] },\n hChildren: hast.children\n };\n delete node.value;\n }\n }\n node.children?.forEach(transform);\n };\n return transform;\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,30 @@
1
+ // Converters can emit this marker before a table they know is used for layout rather than data.
2
+ export const LAYOUT_TABLE_MARKER = '<!-- layoutTable -->';
3
+
4
+ // Zero-width spaces and byte-order marks are common in converted cells and carry no content.
5
+ const INVISIBLE_CHARACTERS = [0x200b, 0xfeff].map(code => String.fromCharCode(code));
6
+ export const hasMeaningfulTableText = text => Array.from(text).some(character => !/\s/.test(character) && !INVISIBLE_CHARACTERS.includes(character));
7
+ const isProse = text => text.trim().length > 40 && text.trim().split(/\s+/).length >= 8;
8
+ const isLabelAndBodyRow = row => {
9
+ const label = row[0]?.text.trim() ?? '';
10
+ const body = row[1]?.text.trim() ?? '';
11
+ return label.length > 0 && label.length <= 90 && label.split(/\s+/).length <= 12 && !/[.!?]$/.test(label) && isProse(body) && body.length > label.length * 2;
12
+ };
13
+
14
+ // Documents converted from Word often use one- or two-column tables to lay out prose
15
+ // (a short label beside a paragraph). Those read better styled as text than as a data grid.
16
+ export const isLikelyLayoutTable = rows => {
17
+ const meaningfulRows = rows.filter(row => row.some(cell => cell.text.trim()));
18
+ if (!meaningfulRows.length || Math.max(...meaningfulRows.map(row => row.length)) > 2) {
19
+ return false;
20
+ }
21
+ if (meaningfulRows[0].every(cell => cell.isHeader && cell.text.trim())) {
22
+ return false;
23
+ }
24
+ const layoutRows = meaningfulRows.filter(row => {
25
+ const populated = row.filter(cell => cell.text.trim());
26
+ return populated.length === 1 ? isProse(populated[0].text) : isLabelAndBodyRow(row);
27
+ });
28
+ return layoutRows.length >= Math.max(1, Math.ceil(meaningfulRows.length * 0.6));
29
+ };
30
+ //# sourceMappingURL=tableHelpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tableHelpers.js","names":["LAYOUT_TABLE_MARKER","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;AACA,OAAO,MAAMA,mBAAmB,GAAG,sBAAsB;;AAEzD;AACA,MAAMC,oBAAoB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAACC,GAAG,CAAEC,IAAI,IAAKC,MAAM,CAACC,YAAY,CAACF,IAAI,CAAC,CAAC;AAEtF,OAAO,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;AAE1G,MAAMG,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;AACA,OAAO,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","ignoreList":[]}
@@ -0,0 +1,41 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { renderWordDocument } from './renderWordDocument';
3
+ export const WordRenderer = ({
4
+ arrayBuffer,
5
+ title,
6
+ cssClass = '',
7
+ loadingIndicator = null,
8
+ onError
9
+ }) => {
10
+ const [previewDocument, setPreviewDocument] = useState(null);
11
+ useEffect(() => {
12
+ let isCurrent = true;
13
+ setPreviewDocument(null);
14
+ renderWordDocument(arrayBuffer).then(html => {
15
+ if (isCurrent) {
16
+ setPreviewDocument(html);
17
+ }
18
+ }).catch(error => {
19
+ if (isCurrent) {
20
+ onError?.(error);
21
+ }
22
+ });
23
+ return () => {
24
+ isCurrent = false;
25
+ };
26
+ }, [arrayBuffer, onError]);
27
+ if (previewDocument === null) {
28
+ return /*#__PURE__*/React.createElement(React.Fragment, null, loadingIndicator);
29
+ }
30
+
31
+ // An empty sandbox blocks scripts, forms and same-origin access; the CSP inside the document
32
+ // additionally blocks any network requests from the converted content.
33
+ return /*#__PURE__*/React.createElement("iframe", {
34
+ title: title,
35
+ className: `wordRenderer ${cssClass}`.trim(),
36
+ sandbox: "",
37
+ srcDoc: previewDocument
38
+ });
39
+ };
40
+ export default WordRenderer;
41
+ //# sourceMappingURL=WordRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WordRenderer.js","names":["React","useEffect","useState","renderWordDocument","WordRenderer","arrayBuffer","title","cssClass","loadingIndicator","onError","previewDocument","setPreviewDocument","isCurrent","then","html","catch","error","createElement","Fragment","className","trim","sandbox","srcDoc"],"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,OAAOA,KAAK,IAAmBC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAEjE,SAASC,kBAAkB,QAAQ,sBAAsB;AAYzD,OAAO,MAAMC,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,GAAGT,QAAQ,CAAgB,IAAI,CAAC;EAE3ED,SAAS,CAAC,MAAM;IACd,IAAIW,SAAS,GAAG,IAAI;IACpBD,kBAAkB,CAAC,IAAI,CAAC;IACxBR,kBAAkB,CAACE,WAAW,CAAC,CAC5BQ,IAAI,CAAEC,IAAI,IAAK;MACd,IAAIF,SAAS,EAAE;QACbD,kBAAkB,CAACG,IAAI,CAAC;MAC1B;IACF,CAAC,CAAC,CACDC,KAAK,CAAEC,KAAc,IAAK;MACzB,IAAIJ,SAAS,EAAE;QACbH,OAAO,GAAGO,KAAK,CAAC;MAClB;IACF,CAAC,CAAC;IACJ,OAAO,MAAM;MACXJ,SAAS,GAAG,KAAK;IACnB,CAAC;EACH,CAAC,EAAE,CAACP,WAAW,EAAEI,OAAO,CAAC,CAAC;EAE1B,IAAIC,eAAe,KAAK,IAAI,EAAE;IAC5B,oBAAOV,KAAA,CAAAiB,aAAA,CAAAjB,KAAA,CAAAkB,QAAA,QAAIV,gBAAoB,CAAC;EAClC;;EAEA;EACA;EACA,oBAAOR,KAAA,CAAAiB,aAAA;IAAQX,KAAK,EAAGA,KAAO;IAACa,SAAS,EAAG,gBAAiBZ,QAAQ,EAAG,CAACa,IAAI,CAAC,CAAG;IAACC,OAAO,EAAC,EAAE;IAACC,MAAM,EAAGZ;EAAiB,CAAE,CAAC;AAC3H,CAAC;AAED,eAAeN,YAAY","ignoreList":[]}
@@ -0,0 +1,207 @@
1
+ import { renderAsync } from 'docx-preview';
2
+ import DOMPurify from 'dompurify';
3
+ import JSZip from 'jszip';
4
+ import { prepareWordPreviewNumbering } from './wordPreviewNumbering';
5
+ import { createWordNumberingResolver, getWordStyles, wordAttribute, wordChild, wordNamespace, wordValue } from './wordXml';
6
+
7
+ // The preview runs in a sandboxed iframe that cannot read the host page's CSS variables.
8
+ const PAGE_GUTTER = '15px';
9
+ const CONTENT_SECURITY_POLICY = 'default-src \'none\'; img-src data:; font-src data:; style-src \'unsafe-inline\';';
10
+
11
+ /*
12
+ Limits against "zip bombs": a small .docx can declare, or simply contain, gigabytes of compressed
13
+ content. The sizes a zip declares cannot be trusted, so every entry is decompressed through a
14
+ stream that stops once the running total passes the limit, into a new zip that docx-preview reads.
15
+ Its own decompression then only ever sees content whose size has been measured.
16
+ */
17
+ export const WORD_DOCUMENT_LIMITS = {
18
+ maxFileBytes: 50 * 1024 * 1024,
19
+ maxUncompressedBytes: 200 * 1024 * 1024,
20
+ maxEntries: 5000
21
+ };
22
+
23
+ // Documented by JSZip but missing from its typings.
24
+
25
+ const TOO_LARGE = 'This Word document is too large to preview.';
26
+ const readZipEntry = (file, budget) => new Promise((resolve, reject) => {
27
+ const chunks = [];
28
+ let length = 0;
29
+ const stream = file.internalStream('uint8array');
30
+ stream.on('data', chunk => {
31
+ budget.remaining -= chunk.length;
32
+ if (budget.remaining < 0) {
33
+ stream.pause();
34
+ reject(new Error(TOO_LARGE));
35
+ return;
36
+ }
37
+ chunks.push(chunk);
38
+ length += chunk.length;
39
+ }).on('error', reject).on('end', () => {
40
+ const content = new Uint8Array(length);
41
+ let offset = 0;
42
+ chunks.forEach(chunk => {
43
+ content.set(chunk, offset);
44
+ offset += chunk.length;
45
+ });
46
+ resolve(content);
47
+ }).resume();
48
+ });
49
+ const loadBoundedZip = async arrayBuffer => {
50
+ if (arrayBuffer.byteLength > WORD_DOCUMENT_LIMITS.maxFileBytes) {
51
+ throw new Error(TOO_LARGE);
52
+ }
53
+ const zip = await JSZip.loadAsync(arrayBuffer);
54
+ const entries = Object.values(zip.files).filter(file => !file.dir);
55
+ if (entries.length > WORD_DOCUMENT_LIMITS.maxEntries) {
56
+ throw new Error(TOO_LARGE);
57
+ }
58
+ const bounded = new JSZip();
59
+ const budget = {
60
+ remaining: WORD_DOCUMENT_LIMITS.maxUncompressedBytes
61
+ };
62
+ // Sequential, so the budget is spent in order and the first entry over it stops the rest.
63
+ for (const file of entries) {
64
+ bounded.file(file.name, await readZipEntry(file, budget));
65
+ }
66
+ return bounded;
67
+ };
68
+ const parseWordPart = async (zip, name) => {
69
+ const file = zip.file(`word/${name}.xml`);
70
+ if (!file) {
71
+ return undefined;
72
+ }
73
+ const xml = new DOMParser().parseFromString(await file.async('string'), 'application/xml');
74
+ if (xml.querySelector('parsererror')) {
75
+ throw new Error(`Invalid Word XML: ${name}`);
76
+ }
77
+ return xml;
78
+ };
79
+ const hasLatinFont = fonts => Boolean(wordAttribute(fonts, 'ascii') || wordAttribute(fonts, 'asciiTheme'));
80
+
81
+ // docx-preview replaces the whole CSS font-family when a style only names an East Asian font,
82
+ // so copy the Latin font each style would otherwise inherit.
83
+ const inheritLatinFonts = (styleDefinitions, styles) => {
84
+ const defaultFonts = styleDefinitions?.getElementsByTagNameNS(wordNamespace, 'rPrDefault')[0]?.getElementsByTagNameNS(wordNamespace, 'rFonts')[0];
85
+ const resolveLatinFont = (styleId, visited = new Set()) => {
86
+ if (!styleId) {
87
+ return defaultFonts;
88
+ }
89
+ if (visited.has(styleId)) {
90
+ throw new Error(`Circular Word style inheritance: ${styleId}`);
91
+ }
92
+ visited.add(styleId);
93
+ const style = styles.byId.get(styleId);
94
+ const fonts = wordChild(wordChild(style, 'rPr'), 'rFonts');
95
+ return hasLatinFont(fonts) ? fonts : resolveLatinFont(wordValue(style, 'basedOn'), visited);
96
+ };
97
+ styles.byId.forEach((style, id) => {
98
+ const fonts = wordChild(wordChild(style, 'rPr'), 'rFonts');
99
+ if (!fonts || hasLatinFont(fonts)) {
100
+ return;
101
+ }
102
+ const inheritedFonts = resolveLatinFont(id);
103
+ ['ascii', 'asciiTheme'].forEach(name => {
104
+ const font = wordAttribute(inheritedFonts, name);
105
+ if (font) {
106
+ fonts.setAttributeNS(wordNamespace, `w:${name}`, font);
107
+ }
108
+ });
109
+ });
110
+ };
111
+ const ensureChild = (source, parent, name, prepend = false) => {
112
+ let child = wordChild(parent, name);
113
+ if (!child) {
114
+ child = source.createElementNS(wordNamespace, `w:${name}`);
115
+ if (prepend) {
116
+ parent.prepend(child);
117
+ } else {
118
+ parent.append(child);
119
+ }
120
+ }
121
+ return child;
122
+ };
123
+ const isPageBreak = element => element.localName === 'lastRenderedPageBreak' || element.localName === 'br' && wordAttribute(element, 'type') === 'page';
124
+
125
+ // A leading inline page break otherwise produces an empty numbered fragment before the paragraph.
126
+ const convertLeadingPageBreaks = (source, paragraph) => {
127
+ const runContent = Array.from(paragraph.getElementsByTagNameNS(wordNamespace, 'r')).flatMap(run => Array.from(run.children).filter(child => child.localName !== 'rPr'));
128
+ for (const child of runContent) {
129
+ if (!isPageBreak(child)) {
130
+ break;
131
+ }
132
+ const properties = ensureChild(source, paragraph, 'pPr', true);
133
+ ensureChild(source, properties, 'pageBreakBefore').setAttributeNS(wordNamespace, 'w:val', '1');
134
+ child.remove();
135
+ }
136
+ };
137
+ const applyResolvedNumbering = (source, paragraph, resolveNumbering) => {
138
+ const {
139
+ id,
140
+ level
141
+ } = resolveNumbering(wordChild(paragraph, 'pPr'));
142
+ if (!id || id === '0') {
143
+ return;
144
+ }
145
+ const numbering = ensureChild(source, ensureChild(source, paragraph, 'pPr', true), 'numPr');
146
+ ensureChild(source, numbering, 'numId').setAttributeNS(wordNamespace, 'w:val', id);
147
+ ensureChild(source, numbering, 'ilvl').setAttributeNS(wordNamespace, 'w:val', level);
148
+ };
149
+ const wrapPreviewDocument = html => `<!doctype html><html><head><meta charset="utf-8">
150
+ <meta http-equiv="Content-Security-Policy" content="${CONTENT_SECURITY_POLICY}">
151
+ </head><body>${html}
152
+ <style>body { margin: 0; } .docx-wrapper { padding: ${PAGE_GUTTER}; align-items: flex-start; }
153
+ .docx-wrapper > section.docx { flex-shrink: 0; margin: 0 auto ${PAGE_GUTTER}; }
154
+ .docx-wrapper p { text-indent: 0 !important; margin-inline-start: 0 !important; }</style>
155
+ </body></html>`;
156
+
157
+ /*
158
+ Renders a .docx file to a self-contained, sanitised HTML document for a sandboxed iframe.
159
+ The Word XML is patched first to fix fonts, page breaks and list numbering that docx-preview
160
+ would otherwise render incorrectly.
161
+ */
162
+ export const renderWordDocument = async arrayBuffer => {
163
+ const zip = await loadBoundedZip(arrayBuffer);
164
+ const source = await parseWordPart(zip, 'document');
165
+ if (!source) {
166
+ throw new Error('DOCX is missing word/document.xml.');
167
+ }
168
+ const styleDefinitions = await parseWordPart(zip, 'styles');
169
+ const styles = getWordStyles(styleDefinitions);
170
+ inheritLatinFonts(styleDefinitions, styles);
171
+ if (styleDefinitions) {
172
+ zip.file('word/styles.xml', new XMLSerializer().serializeToString(styleDefinitions));
173
+ }
174
+ const numberingDefinitions = await parseWordPart(zip, 'numbering');
175
+ const resolveNumbering = createWordNumberingResolver(numberingDefinitions, styles);
176
+ Array.from(source.getElementsByTagNameNS(wordNamespace, 'p')).forEach(paragraph => {
177
+ convertLeadingPageBreaks(source, paragraph);
178
+ applyResolvedNumbering(source, paragraph, resolveNumbering);
179
+ });
180
+ const numberingCss = prepareWordPreviewNumbering(numberingDefinitions, styles);
181
+ if (numberingDefinitions) {
182
+ zip.file('word/numbering.xml', new XMLSerializer().serializeToString(numberingDefinitions));
183
+ }
184
+ zip.file('word/document.xml', new XMLSerializer().serializeToString(source));
185
+ const container = document.createElement('div');
186
+ await renderAsync(await zip.generateAsync({
187
+ type: 'arraybuffer'
188
+ }), container, undefined, {
189
+ useBase64URL: true,
190
+ ignoreLastRenderedPageBreak: false,
191
+ renderAltChunks: false
192
+ });
193
+ const numberingStyle = document.createElement('style');
194
+ numberingStyle.textContent = numberingCss;
195
+ container.append(numberingStyle);
196
+ container.querySelectorAll('section.docx').forEach(page => {
197
+ if (page.style.width) {
198
+ // Scale fixed-width pages down to fit narrow viewers instead of scrolling sideways.
199
+ page.style.setProperty('zoom', `min(1, calc((100vw - 2 * ${PAGE_GUTTER}) / ${page.style.width}))`);
200
+ }
201
+ });
202
+ return wrapPreviewDocument(DOMPurify.sanitize(container.innerHTML, {
203
+ ADD_TAGS: ['style'],
204
+ FORCE_BODY: true
205
+ }));
206
+ };
207
+ //# sourceMappingURL=renderWordDocument.js.map