@x15ventures/x15-ui-library 3.18.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.
- package/THIRD_PARTY_LICENSES.md +11182 -0
- package/dist/cjs/autoGenerated/libraryThemes.js +12 -12
- package/dist/cjs/autoGenerated/libraryThemes.js.map +1 -1
- package/dist/cjs/autoGenerated/libraryThemes.json +12 -12
- package/dist/cjs/components/design/banners/pageBanner/PageBanner.js +27 -12
- package/dist/cjs/components/design/banners/pageBanner/PageBanner.js.map +1 -1
- package/dist/cjs/components/design/card/cardHeader/CardHeaderItem.js +22 -15
- package/dist/cjs/components/design/card/cardHeader/CardHeaderItem.js.map +1 -1
- package/dist/cjs/components/design/dialog/dialog.css +4 -0
- package/dist/cjs/components/design/logos/LogoLink.js +2 -1
- package/dist/cjs/components/design/logos/LogoLink.js.map +1 -1
- package/dist/cjs/components/design/logos/VentureLogo.js +2 -1
- package/dist/cjs/components/design/logos/VentureLogo.js.map +1 -1
- package/dist/cjs/components/design/revealMore/RevealMoreBelow.js +2 -2
- package/dist/cjs/components/design/revealMore/RevealMoreBelow.js.map +1 -1
- package/dist/cjs/components/design/skeleton/Skeleton.js +15 -5
- package/dist/cjs/components/design/skeleton/Skeleton.js.map +1 -1
- package/dist/cjs/components/design/themeLoader/ThemeLoader.js +1 -1
- package/dist/cjs/components/design/themeLoader/ThemeLoader.js.map +1 -1
- package/dist/cjs/components/form/buttons/SimpleButton.js +3 -1
- package/dist/cjs/components/form/buttons/SimpleButton.js.map +1 -1
- package/dist/cjs/components/form/buttons/button.interface.js.map +1 -1
- package/dist/cjs/components/form/buttons/userPicButton/UserPicButton.js +5 -3
- package/dist/cjs/components/form/buttons/userPicButton/UserPicButton.js.map +1 -1
- package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +64 -19
- package/dist/cjs/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
- package/dist/cjs/components/navigation/link/Link.js +2 -1
- package/dist/cjs/components/navigation/link/Link.js.map +1 -1
- package/dist/cjs/components/testing/devToolbar/DevToolbar.js +5 -3
- package/dist/cjs/components/testing/devToolbar/DevToolbar.js.map +1 -1
- package/dist/cjs/constants/fileUploadTypes.js +9 -4
- package/dist/cjs/constants/fileUploadTypes.js.map +1 -1
- package/dist/cjs/helpers/dateHelpers.js +34 -23
- package/dist/cjs/helpers/dateHelpers.js.map +1 -1
- package/dist/cjs/helpers/fileHelpers.js +58 -0
- package/dist/cjs/helpers/fileHelpers.js.map +1 -0
- package/dist/cjs/helpers/index.js +44 -0
- package/dist/cjs/helpers/index.js.map +1 -1
- package/dist/cjs/helpers/interactionsHelper.js +8 -1
- package/dist/cjs/helpers/interactionsHelper.js.map +1 -1
- package/dist/cjs/helpers/objectHelpers.js +23 -9
- package/dist/cjs/helpers/objectHelpers.js.map +1 -1
- package/dist/cjs/helpers/stringHelpers.js +61 -5
- package/dist/cjs/helpers/stringHelpers.js.map +1 -1
- package/dist/cjs/helpers/urlHelpers.js +48 -0
- package/dist/cjs/helpers/urlHelpers.js.map +1 -0
- package/dist/cjs/index.js +191 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/package.json +3 -305
- package/dist/cjs/styles/index.css +18 -0
- package/dist/cjs/styles/variables/cssVars/_designVariables.css +18 -0
- package/dist/cjs/widgets/documentComments/DocumentComments.js +305 -0
- package/dist/cjs/widgets/documentComments/DocumentComments.js.map +1 -0
- package/dist/cjs/widgets/documentComments/_documentCommentsVariables.css +0 -0
- package/dist/cjs/widgets/documentComments/documentComments.css +107 -0
- package/dist/cjs/widgets/documentComments/documentComments.interfaces.js +6 -0
- package/dist/cjs/widgets/documentComments/documentComments.interfaces.js.map +1 -0
- package/dist/cjs/widgets/documentComments/index.js +19 -0
- package/dist/cjs/widgets/documentComments/index.js.map +1 -0
- package/dist/cjs/widgets/documentComparer/DocumentComparer.js +309 -0
- package/dist/cjs/widgets/documentComparer/DocumentComparer.js.map +1 -0
- package/dist/cjs/widgets/documentComparer/_documentComparerVariables.css +0 -0
- package/dist/cjs/widgets/documentComparer/documentComparer.css +117 -0
- package/dist/cjs/widgets/documentComparer/documentComparer.interfaces.js +6 -0
- package/dist/cjs/widgets/documentComparer/documentComparer.interfaces.js.map +1 -0
- package/dist/cjs/widgets/documentComparer/index.js +19 -0
- package/dist/cjs/widgets/documentComparer/index.js.map +1 -0
- package/dist/cjs/widgets/documentEditor/DocumentEditor.js +142 -0
- package/dist/cjs/widgets/documentEditor/DocumentEditor.js.map +1 -0
- package/dist/cjs/widgets/documentEditor/_documentEditorVariables.css +0 -0
- package/dist/cjs/widgets/documentEditor/documentEditor.css +33 -0
- package/dist/cjs/widgets/documentEditor/documentEditor.interfaces.js +6 -0
- package/dist/cjs/widgets/documentEditor/documentEditor.interfaces.js.map +1 -0
- package/dist/cjs/widgets/documentEditor/index.js +19 -0
- package/dist/cjs/widgets/documentEditor/index.js.map +1 -0
- package/dist/cjs/widgets/documentViewer/DocumentViewer.js +206 -0
- package/dist/cjs/widgets/documentViewer/DocumentViewer.js.map +1 -0
- package/dist/cjs/widgets/documentViewer/_documentViewerVariables.css +0 -0
- package/dist/cjs/widgets/documentViewer/documentViewer.css +82 -0
- package/dist/cjs/widgets/documentViewer/documentViewer.interfaces.js +6 -0
- package/dist/cjs/widgets/documentViewer/documentViewer.interfaces.js.map +1 -0
- package/dist/cjs/widgets/documentViewer/index.js +19 -0
- package/dist/cjs/widgets/documentViewer/index.js.map +1 -0
- package/dist/cjs/widgets/index.js +126 -0
- package/dist/cjs/widgets/index.js.map +1 -1
- package/dist/cjs/widgets/shared/documents/ToggleGroup.js +32 -0
- package/dist/cjs/widgets/shared/documents/ToggleGroup.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/_documentVariables.css +0 -0
- package/dist/cjs/widgets/shared/documents/annotations/AnnotationLayer.js +279 -0
- package/dist/cjs/widgets/shared/documents/annotations/AnnotationLayer.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/annotations/_annotationLayerVariables.css +0 -0
- package/dist/cjs/widgets/shared/documents/annotations/annotationLayer.css +65 -0
- package/dist/cjs/widgets/shared/documents/annotations/annotations.interfaces.js +21 -0
- package/dist/cjs/widgets/shared/documents/annotations/annotations.interfaces.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/annotations/highlightRegistry.js +67 -0
- package/dist/cjs/widgets/shared/documents/annotations/highlightRegistry.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/annotations/index.js +39 -0
- package/dist/cjs/widgets/shared/documents/annotations/index.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/annotations/textIndex.js +112 -0
- package/dist/cjs/widgets/shared/documents/annotations/textIndex.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/annotations/textQuoteAnchor.js +160 -0
- package/dist/cjs/widgets/shared/documents/annotations/textQuoteAnchor.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/documentHelpers.js +186 -0
- package/dist/cjs/widgets/shared/documents/documentHelpers.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/documents.interfaces.js +6 -0
- package/dist/cjs/widgets/shared/documents/documents.interfaces.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/DocumentDiff.js +73 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/DocumentDiff.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/_documentDiffVariables.css +0 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js +114 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.css +69 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js +6 -0
- package/dist/cjs/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/lazyEngines.js +19 -0
- package/dist/cjs/widgets/shared/documents/engines/lazyEngines.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js +200 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/_markdownEditorEngineVariables.css +0 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.css +50 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js +6 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js +179 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js +278 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js +208 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js +85 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/_markdownRendererVariables.css +0 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/markdownRenderer.css +78 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/index.js +64 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/index.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js +6 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js +71 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js +192 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js +86 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js +38 -0
- package/dist/cjs/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/WordRenderer.js +49 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/WordRenderer.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js +214 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js +112 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordXml.js +68 -0
- package/dist/cjs/widgets/shared/documents/engines/wordRenderer/wordXml.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/index.js +50 -0
- package/dist/cjs/widgets/shared/documents/index.js.map +1 -0
- package/dist/cjs/widgets/shared/documents/toggleGroup.css +8 -0
- package/dist/cjs/widgets/shared/documents/useDocumentContent.js +222 -0
- package/dist/cjs/widgets/shared/documents/useDocumentContent.js.map +1 -0
- package/dist/components/design/banners/pageBanner/PageBanner.d.ts.map +1 -1
- package/dist/components/design/card/cardHeader/CardHeaderItem.d.ts.map +1 -1
- package/dist/components/design/logos/LogoLink.d.ts.map +1 -1
- package/dist/components/design/logos/VentureLogo.d.ts.map +1 -1
- package/dist/components/design/skeleton/Skeleton.d.ts +1 -1
- package/dist/components/design/skeleton/Skeleton.d.ts.map +1 -1
- package/dist/components/design/themeLoader/ThemeLoader.d.ts.map +1 -1
- package/dist/components/form/buttons/SimpleButton.d.ts.map +1 -1
- package/dist/components/form/buttons/button.interface.d.ts +1 -0
- package/dist/components/form/buttons/button.interface.d.ts.map +1 -1
- package/dist/components/form/buttons/userPicButton/UserPicButton.d.ts.map +1 -1
- package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.d.ts.map +1 -1
- package/dist/components/navigation/link/Link.d.ts.map +1 -1
- package/dist/components/testing/devToolbar/DevToolbar.d.ts.map +1 -1
- package/dist/constants/fileUploadTypes.d.ts.map +1 -1
- package/dist/esm/autoGenerated/libraryThemes.js +12 -12
- package/dist/esm/autoGenerated/libraryThemes.js.map +1 -1
- package/dist/esm/autoGenerated/libraryThemes.json +12 -12
- package/dist/esm/components/design/banners/pageBanner/PageBanner.js +27 -12
- package/dist/esm/components/design/banners/pageBanner/PageBanner.js.map +1 -1
- package/dist/esm/components/design/card/cardHeader/CardHeaderItem.js +22 -15
- package/dist/esm/components/design/card/cardHeader/CardHeaderItem.js.map +1 -1
- package/dist/esm/components/design/dialog/dialog.css +4 -0
- package/dist/esm/components/design/logos/LogoLink.js +2 -1
- package/dist/esm/components/design/logos/LogoLink.js.map +1 -1
- package/dist/esm/components/design/logos/VentureLogo.js +2 -1
- package/dist/esm/components/design/logos/VentureLogo.js.map +1 -1
- package/dist/esm/components/design/revealMore/RevealMoreBelow.js +1 -1
- package/dist/esm/components/design/revealMore/RevealMoreBelow.js.map +1 -1
- package/dist/esm/components/design/skeleton/Skeleton.js +15 -5
- package/dist/esm/components/design/skeleton/Skeleton.js.map +1 -1
- package/dist/esm/components/design/themeLoader/ThemeLoader.js +1 -1
- package/dist/esm/components/design/themeLoader/ThemeLoader.js.map +1 -1
- package/dist/esm/components/form/buttons/SimpleButton.js +3 -1
- package/dist/esm/components/form/buttons/SimpleButton.js.map +1 -1
- package/dist/esm/components/form/buttons/button.interface.js.map +1 -1
- package/dist/esm/components/form/buttons/userPicButton/UserPicButton.js +5 -3
- package/dist/esm/components/form/buttons/userPicButton/UserPicButton.js.map +1 -1
- package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js +65 -19
- package/dist/esm/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.js.map +1 -1
- package/dist/esm/components/navigation/link/Link.js +2 -1
- package/dist/esm/components/navigation/link/Link.js.map +1 -1
- package/dist/esm/components/testing/devToolbar/DevToolbar.js +5 -3
- package/dist/esm/components/testing/devToolbar/DevToolbar.js.map +1 -1
- package/dist/esm/constants/fileUploadTypes.js +9 -4
- package/dist/esm/constants/fileUploadTypes.js.map +1 -1
- package/dist/esm/helpers/dateHelpers.js +34 -23
- package/dist/esm/helpers/dateHelpers.js.map +1 -1
- package/dist/esm/helpers/fileHelpers.js +48 -0
- package/dist/esm/helpers/fileHelpers.js.map +1 -0
- package/dist/esm/helpers/index.js +2 -0
- package/dist/esm/helpers/index.js.map +1 -1
- package/dist/esm/helpers/interactionsHelper.js +5 -0
- package/dist/esm/helpers/interactionsHelper.js.map +1 -1
- package/dist/esm/helpers/objectHelpers.js +23 -9
- package/dist/esm/helpers/objectHelpers.js.map +1 -1
- package/dist/esm/helpers/stringHelpers.js +61 -5
- package/dist/esm/helpers/stringHelpers.js.map +1 -1
- package/dist/esm/helpers/urlHelpers.js +40 -0
- package/dist/esm/helpers/urlHelpers.js.map +1 -0
- package/dist/esm/index.js +3 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/package.json +2 -304
- package/dist/esm/styles/index.css +18 -0
- package/dist/esm/styles/variables/cssVars/_designVariables.css +18 -0
- package/dist/esm/widgets/documentComments/DocumentComments.js +298 -0
- package/dist/esm/widgets/documentComments/DocumentComments.js.map +1 -0
- package/dist/esm/widgets/documentComments/_documentCommentsVariables.css +0 -0
- package/dist/esm/widgets/documentComments/documentComments.css +107 -0
- package/dist/esm/widgets/documentComments/documentComments.interfaces.js +2 -0
- package/dist/esm/widgets/documentComments/documentComments.interfaces.js.map +1 -0
- package/dist/esm/widgets/documentComments/index.js +2 -0
- package/dist/esm/widgets/documentComments/index.js.map +1 -0
- package/dist/esm/widgets/documentComparer/DocumentComparer.js +301 -0
- package/dist/esm/widgets/documentComparer/DocumentComparer.js.map +1 -0
- package/dist/esm/widgets/documentComparer/_documentComparerVariables.css +0 -0
- package/dist/esm/widgets/documentComparer/documentComparer.css +117 -0
- package/dist/esm/widgets/documentComparer/documentComparer.interfaces.js +2 -0
- package/dist/esm/widgets/documentComparer/documentComparer.interfaces.js.map +1 -0
- package/dist/esm/widgets/documentComparer/index.js +2 -0
- package/dist/esm/widgets/documentComparer/index.js.map +1 -0
- package/dist/esm/widgets/documentEditor/DocumentEditor.js +135 -0
- package/dist/esm/widgets/documentEditor/DocumentEditor.js.map +1 -0
- package/dist/esm/widgets/documentEditor/_documentEditorVariables.css +0 -0
- package/dist/esm/widgets/documentEditor/documentEditor.css +33 -0
- package/dist/esm/widgets/documentEditor/documentEditor.interfaces.js +2 -0
- package/dist/esm/widgets/documentEditor/documentEditor.interfaces.js.map +1 -0
- package/dist/esm/widgets/documentEditor/index.js +2 -0
- package/dist/esm/widgets/documentEditor/index.js.map +1 -0
- package/dist/esm/widgets/documentViewer/DocumentViewer.js +198 -0
- package/dist/esm/widgets/documentViewer/DocumentViewer.js.map +1 -0
- package/dist/esm/widgets/documentViewer/_documentViewerVariables.css +0 -0
- package/dist/esm/widgets/documentViewer/documentViewer.css +82 -0
- package/dist/esm/widgets/documentViewer/documentViewer.interfaces.js +2 -0
- package/dist/esm/widgets/documentViewer/documentViewer.interfaces.js.map +1 -0
- package/dist/esm/widgets/documentViewer/index.js +2 -0
- package/dist/esm/widgets/documentViewer/index.js.map +1 -0
- package/dist/esm/widgets/index.js +6 -0
- package/dist/esm/widgets/index.js.map +1 -1
- package/dist/esm/widgets/shared/documents/ToggleGroup.js +24 -0
- package/dist/esm/widgets/shared/documents/ToggleGroup.js.map +1 -0
- package/dist/esm/widgets/shared/documents/_documentVariables.css +0 -0
- package/dist/esm/widgets/shared/documents/annotations/AnnotationLayer.js +273 -0
- package/dist/esm/widgets/shared/documents/annotations/AnnotationLayer.js.map +1 -0
- package/dist/esm/widgets/shared/documents/annotations/_annotationLayerVariables.css +0 -0
- package/dist/esm/widgets/shared/documents/annotations/annotationLayer.css +65 -0
- package/dist/esm/widgets/shared/documents/annotations/annotations.interfaces.js +14 -0
- package/dist/esm/widgets/shared/documents/annotations/annotations.interfaces.js.map +1 -0
- package/dist/esm/widgets/shared/documents/annotations/highlightRegistry.js +58 -0
- package/dist/esm/widgets/shared/documents/annotations/highlightRegistry.js.map +1 -0
- package/dist/esm/widgets/shared/documents/annotations/index.js +4 -0
- package/dist/esm/widgets/shared/documents/annotations/index.js.map +1 -0
- package/dist/esm/widgets/shared/documents/annotations/textIndex.js +103 -0
- package/dist/esm/widgets/shared/documents/annotations/textIndex.js.map +1 -0
- package/dist/esm/widgets/shared/documents/annotations/textQuoteAnchor.js +150 -0
- package/dist/esm/widgets/shared/documents/annotations/textQuoteAnchor.js.map +1 -0
- package/dist/esm/widgets/shared/documents/documentHelpers.js +168 -0
- package/dist/esm/widgets/shared/documents/documentHelpers.js.map +1 -0
- package/dist/esm/widgets/shared/documents/documents.interfaces.js +2 -0
- package/dist/esm/widgets/shared/documents/documents.interfaces.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/DocumentDiff.js +65 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/DocumentDiff.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/_documentDiffVariables.css +0 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js +102 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.css +69 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js +2 -0
- package/dist/esm/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/lazyEngines.js +13 -0
- package/dist/esm/widgets/shared/documents/engines/lazyEngines.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js +191 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/_markdownEditorEngineVariables.css +0 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.css +50 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js +2 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js +170 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js +270 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js +198 -0
- package/dist/esm/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js +76 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/_markdownRendererVariables.css +0 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/markdownRenderer.css +78 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/index.js +5 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/index.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js +2 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js +64 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js +182 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js +78 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js +30 -0
- package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/WordRenderer.js +41 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/WordRenderer.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js +207 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/renderWordDocument.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js +105 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.js.map +1 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordXml.js +57 -0
- package/dist/esm/widgets/shared/documents/engines/wordRenderer/wordXml.js.map +1 -0
- package/dist/esm/widgets/shared/documents/index.js +3 -0
- package/dist/esm/widgets/shared/documents/index.js.map +1 -0
- package/dist/esm/widgets/shared/documents/toggleGroup.css +8 -0
- package/dist/esm/widgets/shared/documents/useDocumentContent.js +215 -0
- package/dist/esm/widgets/shared/documents/useDocumentContent.js.map +1 -0
- package/dist/helpers/dateHelpers.d.ts.map +1 -1
- package/dist/helpers/fileHelpers.d.ts +5 -0
- package/dist/helpers/fileHelpers.d.ts.map +1 -0
- package/dist/helpers/index.d.ts +3 -0
- package/dist/helpers/index.d.ts.map +1 -1
- package/dist/helpers/interactionsHelper.d.ts +2 -0
- package/dist/helpers/interactionsHelper.d.ts.map +1 -1
- package/dist/helpers/objectHelpers.d.ts.map +1 -1
- package/dist/helpers/stringHelpers.d.ts.map +1 -1
- package/dist/helpers/urlHelpers.d.ts +3 -0
- package/dist/helpers/urlHelpers.d.ts.map +1 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/package.json +42 -28
- package/dist/widgets/documentComments/DocumentComments.d.ts +7 -0
- package/dist/widgets/documentComments/DocumentComments.d.ts.map +1 -0
- package/dist/widgets/documentComments/documentComments.interfaces.d.ts +57 -0
- package/dist/widgets/documentComments/documentComments.interfaces.d.ts.map +1 -0
- package/dist/widgets/documentComments/index.d.ts +3 -0
- package/dist/widgets/documentComments/index.d.ts.map +1 -0
- package/dist/widgets/documentComparer/DocumentComparer.d.ts +7 -0
- package/dist/widgets/documentComparer/DocumentComparer.d.ts.map +1 -0
- package/dist/widgets/documentComparer/documentComparer.interfaces.d.ts +78 -0
- package/dist/widgets/documentComparer/documentComparer.interfaces.d.ts.map +1 -0
- package/dist/widgets/documentComparer/index.d.ts +3 -0
- package/dist/widgets/documentComparer/index.d.ts.map +1 -0
- package/dist/widgets/documentEditor/DocumentEditor.d.ts +7 -0
- package/dist/widgets/documentEditor/DocumentEditor.d.ts.map +1 -0
- package/dist/widgets/documentEditor/documentEditor.interfaces.d.ts +40 -0
- package/dist/widgets/documentEditor/documentEditor.interfaces.d.ts.map +1 -0
- package/dist/widgets/documentEditor/index.d.ts +3 -0
- package/dist/widgets/documentEditor/index.d.ts.map +1 -0
- package/dist/widgets/documentViewer/DocumentViewer.d.ts +7 -0
- package/dist/widgets/documentViewer/DocumentViewer.d.ts.map +1 -0
- package/dist/widgets/documentViewer/documentViewer.interfaces.d.ts +47 -0
- package/dist/widgets/documentViewer/documentViewer.interfaces.d.ts.map +1 -0
- package/dist/widgets/documentViewer/index.d.ts +3 -0
- package/dist/widgets/documentViewer/index.d.ts.map +1 -0
- package/dist/widgets/index.d.ts +12 -0
- package/dist/widgets/index.d.ts.map +1 -1
- package/dist/widgets/shared/documents/ToggleGroup.d.ts +15 -0
- package/dist/widgets/shared/documents/ToggleGroup.d.ts.map +1 -0
- package/dist/widgets/shared/documents/annotations/AnnotationLayer.d.ts +27 -0
- package/dist/widgets/shared/documents/annotations/AnnotationLayer.d.ts.map +1 -0
- package/dist/widgets/shared/documents/annotations/annotations.interfaces.d.ts +43 -0
- package/dist/widgets/shared/documents/annotations/annotations.interfaces.d.ts.map +1 -0
- package/dist/widgets/shared/documents/annotations/highlightRegistry.d.ts +12 -0
- package/dist/widgets/shared/documents/annotations/highlightRegistry.d.ts.map +1 -0
- package/dist/widgets/shared/documents/annotations/index.d.ts +6 -0
- package/dist/widgets/shared/documents/annotations/index.d.ts.map +1 -0
- package/dist/widgets/shared/documents/annotations/textIndex.d.ts +16 -0
- package/dist/widgets/shared/documents/annotations/textIndex.d.ts.map +1 -0
- package/dist/widgets/shared/documents/annotations/textQuoteAnchor.d.ts +15 -0
- package/dist/widgets/shared/documents/annotations/textQuoteAnchor.d.ts.map +1 -0
- package/dist/widgets/shared/documents/documentHelpers.d.ts +14 -0
- package/dist/widgets/shared/documents/documentHelpers.d.ts.map +1 -0
- package/dist/widgets/shared/documents/documents.interfaces.d.ts +20 -0
- package/dist/widgets/shared/documents/documents.interfaces.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/documentDiff/DocumentDiff.d.ts +6 -0
- package/dist/widgets/shared/documents/engines/documentDiff/DocumentDiff.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.d.ts +25 -0
- package/dist/widgets/shared/documents/engines/documentDiff/buildDocumentDiff.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.d.ts +17 -0
- package/dist/widgets/shared/documents/engines/documentDiff/documentDiff.interfaces.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/lazyEngines.d.ts +5 -0
- package/dist/widgets/shared/documents/engines/lazyEngines.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.d.ts +8 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/MarkdownEditorEngine.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.d.ts +23 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/markdownEditorEngine.interfaces.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.d.ts +12 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/markdownTextIndex.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.d.ts +8 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/sanitizeForMdx.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.d.ts +32 -0
- package/dist/widgets/shared/documents/engines/markdownEditor/sourceAnnotations.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.d.ts +12 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/MarkdownRenderer.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/index.d.ts +7 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/index.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.d.ts +16 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/markdownNode.interfaces.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.d.ts +3 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/rehypeTableCleanup.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.d.ts +6 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.d.ts +3 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.d.ts +8 -0
- package/dist/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/WordRenderer.d.ts +11 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/WordRenderer.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/renderWordDocument.d.ts +7 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/renderWordDocument.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.d.ts +3 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/wordPreviewNumbering.d.ts.map +1 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/wordXml.d.ts +21 -0
- package/dist/widgets/shared/documents/engines/wordRenderer/wordXml.d.ts.map +1 -0
- package/dist/widgets/shared/documents/index.d.ts +5 -0
- package/dist/widgets/shared/documents/index.d.ts.map +1 -0
- package/dist/widgets/shared/documents/useDocumentContent.d.ts +11 -0
- package/dist/widgets/shared/documents/useDocumentContent.d.ts.map +1 -0
- package/package.json +42 -28
- package/readme.md +49 -2
- package/dist/components/design/dialog/Dialog.test.d.ts +0 -5
- package/dist/components/design/dialog/Dialog.test.d.ts.map +0 -1
- package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.test.d.ts +0 -5
- package/dist/components/design/progressIndicators/circularProgressIndicator/CircularProgressIndicator.test.d.ts.map +0 -1
- package/dist/components/design/tooltip/Tooltip.test.d.ts +0 -2
- package/dist/components/design/tooltip/Tooltip.test.d.ts.map +0 -1
- package/dist/components/form/buttons/SimpleButton.test.d.ts +0 -5
- package/dist/components/form/buttons/SimpleButton.test.d.ts.map +0 -1
- package/dist/components/form/formFields/formFieldWrapper/FormField.test.d.ts +0 -5
- package/dist/components/form/formFields/formFieldWrapper/FormField.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/inputs/checkbox/InputCheckbox.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/inputs/checkbox/checkboxSwitch/CheckboxSwitch.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/inputs/checkbox/checkboxSwitch/CheckboxSwitch.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/inputs/file/dragAndDrop/DragAndDropFileUpload.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/inputs/file/fileAttachmentList/FileAttachmentsList.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/inputs/file/fileAttachmentList/FileAttachmentsList.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/inputs/text/InputText.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/inputs/text/InputText.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/nestedFormContext.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/select/Select.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/select/Select.test.d.ts.map +0 -1
- package/dist/components/form/formFields/subComponents/textarea/Textarea.test.d.ts +0 -5
- package/dist/components/form/formFields/subComponents/textarea/Textarea.test.d.ts.map +0 -1
- package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts +0 -5
- package/dist/components/form/hookFormWrapper/HookFormWrapper.test.d.ts.map +0 -1
- package/dist/components/form/validation/ValidationMessages.test.d.ts +0 -5
- package/dist/components/form/validation/ValidationMessages.test.d.ts.map +0 -1
- package/dist/components/navigation/bubbleNavigator/bubbleNavigatorUtilities.test.d.ts +0 -2
- package/dist/components/navigation/bubbleNavigator/bubbleNavigatorUtilities.test.d.ts.map +0 -1
- package/dist/components/navigation/menu/menuItemContent/MenuItemIcon.test.d.ts +0 -5
- package/dist/components/navigation/menu/menuItemContent/MenuItemIcon.test.d.ts.map +0 -1
- package/dist/helpers/ageHelpers.test.d.ts +0 -2
- package/dist/helpers/ageHelpers.test.d.ts.map +0 -1
- package/dist/helpers/dateHelpers.test.d.ts +0 -2
- package/dist/helpers/dateHelpers.test.d.ts.map +0 -1
- package/dist/helpers/formatters.test.d.ts +0 -5
- package/dist/helpers/formatters.test.d.ts.map +0 -1
- package/dist/helpers/iconHelpers.test.d.ts +0 -5
- package/dist/helpers/iconHelpers.test.d.ts.map +0 -1
- package/dist/helpers/numberHelpers.test.d.ts +0 -5
- package/dist/helpers/numberHelpers.test.d.ts.map +0 -1
- package/dist/helpers/objectHelpers.test.d.ts +0 -2
- package/dist/helpers/objectHelpers.test.d.ts.map +0 -1
- package/dist/helpers/stringHelpers.test.d.ts +0 -2
- package/dist/helpers/stringHelpers.test.d.ts.map +0 -1
- package/dist/hooks/InteractiveHostFocus.test.d.ts +0 -5
- package/dist/hooks/InteractiveHostFocus.test.d.ts.map +0 -1
- package/dist/widgets/processLauncher/ProcessLauncher.test.d.ts +0 -5
- 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
|
package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkPlugins.js.map
ADDED
|
@@ -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":"AAAA,SAASA,mBAAmB,EAAEC,mBAAmB,QAAQ,gBAAgB;AAGzE,MAAMC,OAAO,GAAIC,IAAkB,IAAaA,IAAI,CAACC,KAAK,IAAID,IAAI,CAACE,QAAQ,EAAEC,GAAG,CAACJ,OAAO,CAAC,CAACK,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;;AAEzG;AACA,OAAO,MAAMC,gBAAgB,GAAGA,CAAA,KAA2B;EACzD,MAAMC,SAAS,GAAIN,IAAkB,IAAW;IAC9C,IAAIA,IAAI,CAACO,IAAI,KAAK,MAAM,IAAI,eAAe,CAACC,IAAI,CAACR,IAAI,CAACC,KAAK,EAAEQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE;MAC1ET,IAAI,CAACO,IAAI,GAAG,OAAO;MACnB,OAAOP,IAAI,CAACC,KAAK;IACnB;IACAD,IAAI,CAACE,QAAQ,EAAEQ,OAAO,CAACJ,SAAS,CAAC;EACnC,CAAC;EACD,OAAOA,SAAS;AAClB,CAAC;AAED,MAAMK,kBAAkB,GAAIC,KAAqB,IAAuB;EACtE,MAAMC,UAA4B,GAAG,CAAC,EAAE,CAAC;EACzCD,KAAK,CAACF,OAAO,CAAEV,IAAI,IAAK;IACtB,IAAIc,QAA0B;IAC9B,IAAId,IAAI,CAACO,IAAI,KAAK,MAAM,EAAE;MACxBO,QAAQ,GAAG,CAACd,IAAI,CAACC,KAAK,IAAI,EAAE,EAAEc,KAAK,CAAC,OAAO,CAAC,CAACZ,GAAG,CAAEF,KAAK,IAAK,CAAC;QAAE,GAAGD,IAAI;QAAEC;MAAM,CAAC,CAAC,CAAC;IACnF,CAAC,MAAM,IAAID,IAAI,CAACE,QAAQ,EAAE;MACxBY,QAAQ,GAAGH,kBAAkB,CAACX,IAAI,CAACE,QAAQ,CAAC,CAACC,GAAG,CAAED,QAAQ,IAAK,CAAC;QAAE,GAAGF,IAAI;QAAEE;MAAS,CAAC,CAAC,CAAC;IACzF,CAAC,MAAM;MACLY,QAAQ,GAAG,CAAC,CAACd,IAAI,CAAC,CAAC;IACrB;IACAc,QAAQ,CAACJ,OAAO,CAAC,CAACM,OAAO,EAAEC,KAAK,KAAK;MACnC,IAAIA,KAAK,GAAG,CAAC,EAAE;QACbJ,UAAU,CAACK,IAAI,CAAC,EAAE,CAAC;MACrB;MACAL,UAAU,CAACA,UAAU,CAACM,MAAM,GAAG,CAAC,CAAC,CAACD,IAAI,CAAC,GAAGF,OAAO,CAAC;IACpD,CAAC,CAAC;EACJ,CAAC,CAAC;EACF,OAAOH,UAAU;AACnB,CAAC;;AAED;AACA,OAAO,MAAMO,qBAAqB,GAAGA,CAAA,KAA2B;EAC9D,MAAMd,SAAS,GAAIe,MAAoB,IAAW;IAChD,IAAI,CAACA,MAAM,CAACnB,QAAQ,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,CAAC,CAACoB,QAAQ,CAACD,MAAM,CAACd,IAAI,CAAC,EAAE;MACxF;IACF;IACAc,MAAM,CAACnB,QAAQ,GAAGmB,MAAM,CAACnB,QAAQ,CAACqB,OAAO,CAAEvB,IAAI,IAAK;MAClD,IAAIA,IAAI,CAACO,IAAI,KAAK,WAAW,EAAE;QAC7B,OAAOI,kBAAkB,CAACX,IAAI,CAACE,QAAQ,IAAI,EAAE,CAAC,CAACC,GAAG,CAAED,QAAQ,KAAM;UAAE,GAAGF,IAAI;UAAEE;QAAS,CAAC,CAAC,CAAC;MAC3F;MACAI,SAAS,CAACN,IAAI,CAAC;MACf,OAAO,CAACA,IAAI,CAAC;IACf,CAAC,CAAC;EACJ,CAAC;EACD,OAAOM,SAAS;AAClB,CAAC;AAED,MAAMkB,eAAe,GAAIxB,IAAkB,IAAW;EACpD,MAAMyB,UAAU,GAAGzB,IAAI,CAAC0B,IAAI,EAAEC,WAAW,IAAI,CAAC,CAAC;EAC/C,MAAMC,SAAS,GAAG,CAAC,GAAG,IAAIC,GAAG,CAAC,CAAC,IAAIJ,UAAU,CAACG,SAAS,IAAI,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC;EAChF5B,IAAI,CAAC0B,IAAI,GAAG;IAAE,GAAG1B,IAAI,CAAC0B,IAAI;IAAEC,WAAW,EAAE;MAAE,GAAGF,UAAU;MAAEG;IAAU;EAAE,CAAC;AACzE,CAAC;AAED,OAAO,MAAME,kBAAkB,GAAGA,CAAA,KAA2B;EAC3D,MAAMxB,SAAS,GAAIe,MAAoB,IAAW;IAChD,IAAI,CAACA,MAAM,CAACnB,QAAQ,EAAE;MACpB;IACF;IACAmB,MAAM,CAACnB,QAAQ,GAAGmB,MAAM,CAACnB,QAAQ,CAAC6B,MAAM,CAAC,CAAC/B,IAAI,EAAEiB,KAAK,EAAEe,QAAQ,KAAK;MAClE,MAAMC,QAAQ,GAAGjC,IAAI,CAACO,IAAI,KAAK,MAAM,IAAIP,IAAI,CAACC,KAAK,EAAEQ,IAAI,CAAC,CAAC,KAAKX,mBAAmB;MACnF,IAAImC,QAAQ,IAAID,QAAQ,CAACf,KAAK,GAAG,CAAC,CAAC,EAAEV,IAAI,KAAK,OAAO,EAAE;QACrDiB,eAAe,CAACQ,QAAQ,CAACf,KAAK,GAAG,CAAC,CAAC,CAAC;QACpC,OAAO,KAAK;MACd;MACA,OAAO,IAAI;IACb,CAAC,CAAC;IACFI,MAAM,CAACnB,QAAQ,CAACQ,OAAO,CAAEV,IAAI,IAAK;MAChC,IAAIA,IAAI,CAACO,IAAI,KAAK,OAAO,IAAIP,IAAI,CAACE,QAAQ,EAAE;QAC1C,MAAMgC,IAAI,GAAGlC,IAAI,CAACE,QAAQ,CAACC,GAAG,CAAC,CAACgC,GAAG,EAAEC,QAAQ,KAC3CD,GAAG,CAACjC,QAAQ,EAAEC,GAAG,CAAEkC,IAAI,KAAM;UAAEC,IAAI,EAAEvC,OAAO,CAACsC,IAAI,CAAC;UAAEE,QAAQ,EAAEH,QAAQ,KAAK;QAAE,CAAC,CAAC,CAAC,IAAI,EACtF,CAAC;QACD,IAAIvC,mBAAmB,CAACqC,IAAI,CAAC,EAAE;UAC7BV,eAAe,CAACxB,IAAI,CAAC;QACvB;MACF;MACAM,SAAS,CAACN,IAAI,CAAC;IACjB,CAAC,CAAC;EACJ,CAAC;EACD,OAAOM,SAAS;AAClB,CAAC;AAOD,MAAMkC,aAAa,GAAGA,CAACF,IAAY,EAAEG,wBAAwB,GAAG,KAAK,KAAwB;EAC3F,MAAMC,cAAc,GAAG,cAAc,CAACC,IAAI,CAACL,IAAI,CAAC;EAChD,IAAII,cAAc,EAAE;IAClB,MAAME,KAAK,GAAGF,cAAc,CAAC,CAAC,CAAC,CAAC3B,KAAK,CAAC,WAAW,CAAC,CAACZ,GAAG,CAAE0C,IAAI,IAAKA,IAAI,CAACpC,IAAI,CAAC,CAAC,CAAC;IAC7E,IAAI,CAACmC,KAAK,CAACzB,MAAM,IAAI,CAAC,IAAIsB,wBAAwB,KAAKG,KAAK,CAACE,KAAK,CAACC,OAAO,CAAC,EAAE;MAC3E,OAAO;QAAEC,MAAM,EAAE,EAAE;QAAEJ,KAAK,EAAEA,KAAK,CAACzC,GAAG,CAAE0C,IAAI,IAAK,GAAIA,IAAI,GAAI;MAAE,CAAC;IACjE;EACF;EAEA,MAAMI,eAAe,GAAG,qBAAqB,CAACN,IAAI,CAACL,IAAI,CAAC;EACxD,IAAI,CAACW,eAAe,EAAE;IACpB,OAAO,IAAI;EACb;EACA,MAAML,KAAK,GAAGK,eAAe,CAAC,CAAC,CAAC,CAAClC,KAAK,CAAC,qBAAqB,CAAC,CAACZ,GAAG,CAAE0C,IAAI,IAAKA,IAAI,CAACpC,IAAI,CAAC,CAAC,CAAC;EACxF,IAAImC,KAAK,CAACzB,MAAM,GAAG,CAAC,IAAIyB,KAAK,CAACM,IAAI,CAAEL,IAAI,IAAK,CAACA,IAAI,CAAC,EAAE;IACnD,OAAO,IAAI;EACb;EACA,OAAO;IACLG,MAAM,EAAE,GAAIC,eAAe,CAAC,CAAC,CAAC,GAAI;IAClCL,KAAK,EAAEA,KAAK,CAACzC,GAAG,CAAC,CAAC0C,IAAI,EAAE5B,KAAK,KAAMA,KAAK,GAAG2B,KAAK,CAACzB,MAAM,GAAG,CAAC,GAAG,GAAI0B,IAAI,GAAI,GAAGA,IAAK;EACpF,CAAC;AACH,CAAC;AAED,MAAMM,YAAY,GAAId,IAAkB,IACtCA,IAAI,CAACnC,QAAQ,EAAEiB,MAAM,KAAK,CAAC,IAAIkB,IAAI,CAACnC,QAAQ,CAAC,CAAC,CAAC,CAACK,IAAI,KAAK,MAAM,GAAG8B,IAAI,CAACnC,QAAQ,CAAC,CAAC,CAAC,CAACD,KAAK,IAAI,EAAE,GAAG,IAAI;AAEvG,MAAMmD,WAAW,GAAGA,CAACf,IAAkB,EAAEgB,IAAgB,KAAW;EAClEhB,IAAI,CAACnC,QAAQ,GAAG,CACd,IAAImD,IAAI,CAACL,MAAM,GAAG,CAAC;IAAEzC,IAAI,EAAE,MAAM;IAAEN,KAAK,EAAEoD,IAAI,CAACL;EAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAC9D;IACEzC,IAAI,EAAE,MAAM;IACZL,QAAQ,EAAEmD,IAAI,CAACT,KAAK,CAACzC,GAAG,CAAEF,KAAK,KAAM;MACnCM,IAAI,EAAE,UAAU;MAChBL,QAAQ,EAAE,CAAC;QAAEK,IAAI,EAAE,WAAW;QAAEL,QAAQ,EAAE,CAAC;UAAEK,IAAI,EAAE,MAAM;UAAEN;QAAM,CAAC;MAAE,CAAC;IACvE,CAAC,CAAC;EACJ,CAAC,CACF;AACH,CAAC;AAED,MAAMqD,QAAQ,GAAInB,GAA6B,IAAqBA,GAAG,EAAEjC,QAAQ,EAAE6B,MAAM,CAAEM,IAAI,IAAKA,IAAI,CAAC9B,IAAI,KAAK,WAAW,CAAC,IAAI,EAAE;AAEpI,MAAMgD,YAAY,GAAIlB,IAA8B,IAAcA,IAAI,EAAEnC,QAAQ,EAAEgD,IAAI,CAAEM,KAAK,IAAKA,KAAK,CAACjD,IAAI,KAAK,MAAM,CAAC,IAAI,KAAK;;AAEjI;AACA,MAAMkD,2BAA2B,GAAIC,KAAmB,IAAW;EACjE,MAAMxB,IAAI,GAAGwB,KAAK,CAACxD,QAAQ,EAAE6B,MAAM,CAAEI,GAAG,IAAKA,GAAG,CAAC5B,IAAI,KAAK,UAAU,CAAC,IAAI,EAAE;EAC3E2B,IAAI,CAACxB,OAAO,CAAC,CAACyB,GAAG,EAAEC,QAAQ,KAAK;IAC9BkB,QAAQ,CAACnB,GAAG,CAAC,CAACzB,OAAO,CAAC,CAAC2B,IAAI,EAAEsB,SAAS,KAAK;MACzC,MAAMrB,IAAI,GAAGa,YAAY,CAACd,IAAI,CAAC;MAC/B,MAAMgB,IAAI,GAAGf,IAAI,KAAK,IAAI,GAAG,IAAI,GAAGE,aAAa,CAACF,IAAI,EAAE,IAAI,CAAC;MAC7D,IAAIe,IAAI,EAAET,KAAK,CAACzB,MAAM,KAAK,CAAC,EAAE;QAC5B;MACF;MACA,IAAIoC,YAAY,CAACD,QAAQ,CAACpB,IAAI,CAACE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAACuB,SAAS,CAAC,CAAC,IAAIJ,YAAY,CAACD,QAAQ,CAACpB,IAAI,CAACE,QAAQ,GAAG,CAAC,CAAC,CAAC,CAACuB,SAAS,CAAC,CAAC,EAAE;QAClHP,WAAW,CAACf,IAAI,EAAEgB,IAAI,CAAC;MACzB;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC;;AAED;AACA,OAAO,MAAMO,oBAAoB,GAAGA,CAAA,KAA2B;EAC7D,MAAMtD,SAAS,GAAIN,IAAkB,IAAW;IAC9C,IAAIA,IAAI,CAACO,IAAI,KAAK,OAAO,EAAE;MACzBP,IAAI,CAACE,QAAQ,EAAEQ,OAAO,CAACJ,SAAS,CAAC;MACjCmD,2BAA2B,CAACzD,IAAI,CAAC;MACjC;IACF;IACA,IAAIA,IAAI,CAACO,IAAI,KAAK,WAAW,EAAE;MAC7B,MAAM+B,IAAI,GAAGa,YAAY,CAACnD,IAAI,CAAC;MAC/B,MAAMqD,IAAI,GAAGf,IAAI,KAAK,IAAI,GAAG,IAAI,GAAGE,aAAa,CAACF,IAAI,CAAC;MACvD,IAAIe,IAAI,EAAE;QACRD,WAAW,CAACpD,IAAI,EAAEqD,IAAI,CAAC;MACzB;IACF;IACArD,IAAI,CAACE,QAAQ,EAAEQ,OAAO,CAACJ,SAAS,CAAC;EACnC,CAAC;EACD,OAAOA,SAAS;AAClB,CAAC","ignoreList":[]}
|
package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js
ADDED
|
@@ -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
|
package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/remarkSafeTables.js.map
ADDED
|
@@ -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
|
package/dist/esm/widgets/shared/documents/engines/markdownRenderer/plugins/tableHelpers.js.map
ADDED
|
@@ -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
|