@stll/folio-core 0.0.1-placeholder.0 → 0.1.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/LICENSE +202 -0
- package/NOTICE.md +29 -0
- package/README.md +41 -0
- package/dist/_virtual/_rolldown/runtime.js +13 -0
- package/dist/ai-edits/apply.d.ts +35 -0
- package/dist/ai-edits/apply.js +683 -0
- package/dist/ai-edits/clean-text.d.ts +28 -0
- package/dist/ai-edits/clean-text.js +23 -0
- package/dist/ai-edits/headless.d.ts +225 -0
- package/dist/ai-edits/headless.js +513 -0
- package/dist/ai-edits/index.d.ts +6 -0
- package/dist/ai-edits/index.js +5 -0
- package/dist/ai-edits/inline-emphasis.d.ts +38 -0
- package/dist/ai-edits/inline-emphasis.js +78 -0
- package/dist/ai-edits/snapshot.d.ts +9 -0
- package/dist/ai-edits/snapshot.js +195 -0
- package/dist/ai-edits/types.d.ts +156 -0
- package/dist/ai-edits/types.js +0 -0
- package/dist/ai-edits/word-diff.d.ts +20 -0
- package/dist/ai-edits/word-diff.js +77 -0
- package/dist/ai-suggestions/apply.d.ts +17 -0
- package/dist/ai-suggestions/apply.js +64 -0
- package/dist/ai-suggestions/conflict.d.ts +22 -0
- package/dist/ai-suggestions/conflict.js +67 -0
- package/dist/ai-suggestions/text-positions.d.ts +21 -0
- package/dist/ai-suggestions/text-positions.js +48 -0
- package/dist/ai-suggestions/types.d.ts +199 -0
- package/dist/ai-suggestions/types.js +59 -0
- package/dist/content-controls/errors.d.ts +52 -0
- package/dist/content-controls/errors.js +36 -0
- package/dist/content-controls/findContentControls.d.ts +55 -0
- package/dist/content-controls/findContentControls.js +75 -0
- package/dist/content-controls/index.d.ts +4 -0
- package/dist/content-controls/index.js +4 -0
- package/dist/content-controls/mutateContentControls.d.ts +51 -0
- package/dist/content-controls/mutateContentControls.js +377 -0
- package/dist/controller/folioEditor.d.ts +21 -0
- package/dist/controller/folioEditor.js +29 -0
- package/dist/controller/folioEditorEvents.d.ts +23 -0
- package/dist/controller/folioEditorEvents.js +24 -0
- package/dist/controller/hiddenEditorApi.d.ts +35 -0
- package/dist/controller/hiddenEditorApi.js +112 -0
- package/dist/controller/hiddenEditorManager.d.ts +93 -0
- package/dist/controller/hiddenEditorManager.js +308 -0
- package/dist/controller/layoutPipeline.d.ts +63 -0
- package/dist/controller/layoutPipeline.js +406 -0
- package/dist/controller/layoutScheduler.d.ts +41 -0
- package/dist/controller/layoutScheduler.js +59 -0
- package/dist/controller/layoutSession.d.ts +24 -0
- package/dist/controller/layoutSession.js +13 -0
- package/dist/docx/blockContentParser.d.ts +13 -0
- package/dist/docx/blockContentParser.js +289 -0
- package/dist/docx/bookmarkParser.d.ts +178 -0
- package/dist/docx/bookmarkParser.js +246 -0
- package/dist/docx/bookmarkPlacement.d.ts +10 -0
- package/dist/docx/bookmarkPlacement.js +50 -0
- package/dist/docx/bulletMarkers.d.ts +4 -0
- package/dist/docx/bulletMarkers.js +42 -0
- package/dist/docx/commentParser.d.ts +34 -0
- package/dist/docx/commentParser.js +127 -0
- package/dist/docx/commentReferenceNormalization.d.ts +25 -0
- package/dist/docx/commentReferenceNormalization.js +97 -0
- package/dist/docx/commentReplyMarkers.d.ts +20 -0
- package/dist/docx/commentReplyMarkers.js +123 -0
- package/dist/docx/compatibility.d.ts +12 -0
- package/dist/docx/compatibility.js +77 -0
- package/dist/docx/documentParser.d.ts +65 -0
- package/dist/docx/documentParser.js +209 -0
- package/dist/docx/drawingUtils.d.ts +56 -0
- package/dist/docx/drawingUtils.js +305 -0
- package/dist/docx/fieldParser.d.ts +228 -0
- package/dist/docx/fieldParser.js +559 -0
- package/dist/docx/footnoteParser.d.ts +109 -0
- package/dist/docx/footnoteParser.js +270 -0
- package/dist/docx/headerFooterParser.d.ts +119 -0
- package/dist/docx/headerFooterParser.js +266 -0
- package/dist/docx/headerFooterRefParser.d.ts +22 -0
- package/dist/docx/headerFooterRefParser.js +52 -0
- package/dist/docx/headerFooterReferenceNormalization.d.ts +19 -0
- package/dist/docx/headerFooterReferenceNormalization.js +64 -0
- package/dist/docx/hyperlinkParser.d.ts +108 -0
- package/dist/docx/hyperlinkParser.js +230 -0
- package/dist/docx/imageParser.d.ts +93 -0
- package/dist/docx/imageParser.js +522 -0
- package/dist/docx/mathToMathml.d.ts +15 -0
- package/dist/docx/mathToMathml.js +357 -0
- package/dist/docx/modelValidation.d.ts +13 -0
- package/dist/docx/modelValidation.js +21 -0
- package/dist/docx/normalizeBaseDirection.d.ts +12 -0
- package/dist/docx/normalizeBaseDirection.js +81 -0
- package/dist/docx/notePropertiesParser.d.ts +16 -0
- package/dist/docx/notePropertiesParser.js +99 -0
- package/dist/docx/numberingParser.d.ts +86 -0
- package/dist/docx/numberingParser.js +735 -0
- package/dist/docx/numberingReferenceNormalization.d.ts +25 -0
- package/dist/docx/numberingReferenceNormalization.js +22 -0
- package/dist/docx/paragraphParser.d.ts +86 -0
- package/dist/docx/paragraphParser.js +1132 -0
- package/dist/docx/paragraphTraversal.d.ts +19 -0
- package/dist/docx/paragraphTraversal.js +76 -0
- package/dist/docx/parser.d.ts +67 -0
- package/dist/docx/parser.js +391 -0
- package/dist/docx/parserEnums.d.ts +45 -0
- package/dist/docx/parserEnums.js +70 -0
- package/dist/docx/relsParser.d.ts +160 -0
- package/dist/docx/relsParser.js +235 -0
- package/dist/docx/replyToComment.d.ts +29 -0
- package/dist/docx/replyToComment.js +73 -0
- package/dist/docx/rezip.d.ts +166 -0
- package/dist/docx/rezip.js +1194 -0
- package/dist/docx/runConsolidator.d.ts +57 -0
- package/dist/docx/runConsolidator.js +224 -0
- package/dist/docx/runParser.d.ts +78 -0
- package/dist/docx/runParser.js +661 -0
- package/dist/docx/sdtProperties.d.ts +15 -0
- package/dist/docx/sdtProperties.js +290 -0
- package/dist/docx/sdtPropertiesPatch.d.ts +16 -0
- package/dist/docx/sdtPropertiesPatch.js +144 -0
- package/dist/docx/sectionParser.d.ts +95 -0
- package/dist/docx/sectionParser.js +534 -0
- package/dist/docx/selectiveSave.d.ts +25 -0
- package/dist/docx/selectiveSave.js +247 -0
- package/dist/docx/selectiveSaveFlags.d.ts +33 -0
- package/dist/docx/selectiveSaveFlags.js +11 -0
- package/dist/docx/selectiveSaveTripwire.d.ts +33 -0
- package/dist/docx/selectiveSaveTripwire.js +79 -0
- package/dist/docx/selectiveXmlPatch.d.ts +103 -0
- package/dist/docx/selectiveXmlPatch.js +493 -0
- package/dist/docx/serializer/blockSdtSerializer.d.ts +6 -0
- package/dist/docx/serializer/blockSdtSerializer.js +88 -0
- package/dist/docx/serializer/borderSerializer.d.ts +25 -0
- package/dist/docx/serializer/borderSerializer.js +44 -0
- package/dist/docx/serializer/commentSerializer.d.ts +31 -0
- package/dist/docx/serializer/commentSerializer.js +184 -0
- package/dist/docx/serializer/documentSerializer.d.ts +65 -0
- package/dist/docx/serializer/documentSerializer.js +199 -0
- package/dist/docx/serializer/headerFooterSerializer.d.ts +12 -0
- package/dist/docx/serializer/headerFooterSerializer.js +84 -0
- package/dist/docx/serializer/noteSerializer.d.ts +19 -0
- package/dist/docx/serializer/noteSerializer.js +70 -0
- package/dist/docx/serializer/numberingSerializer.d.ts +12 -0
- package/dist/docx/serializer/numberingSerializer.js +93 -0
- package/dist/docx/serializer/paragraphSerializer.d.ts +48 -0
- package/dist/docx/serializer/paragraphSerializer.js +559 -0
- package/dist/docx/serializer/runSerializer.d.ts +56 -0
- package/dist/docx/serializer/runSerializer.js +621 -0
- package/dist/docx/serializer/sectionPropertiesSerializer.d.ts +6 -0
- package/dist/docx/serializer/sectionPropertiesSerializer.js +187 -0
- package/dist/docx/serializer/tableSerializer.d.ts +79 -0
- package/dist/docx/serializer/tableSerializer.js +422 -0
- package/dist/docx/serializer/xmlUtils.d.ts +20 -0
- package/dist/docx/serializer/xmlUtils.js +25 -0
- package/dist/docx/settingsParser.d.ts +8 -0
- package/dist/docx/settingsParser.js +36 -0
- package/dist/docx/shapeParser.d.ts +20 -0
- package/dist/docx/shapeParser.js +272 -0
- package/dist/docx/styleParser.d.ts +50 -0
- package/dist/docx/styleParser.js +905 -0
- package/dist/docx/tableParser.d.ts +202 -0
- package/dist/docx/tableParser.js +811 -0
- package/dist/docx/textBoxParser.d.ts +117 -0
- package/dist/docx/textBoxParser.js +262 -0
- package/dist/docx/themeParser.d.ts +77 -0
- package/dist/docx/themeParser.js +330 -0
- package/dist/docx/trackedMoveRangeNormalization.d.ts +22 -0
- package/dist/docx/trackedMoveRangeNormalization.js +100 -0
- package/dist/docx/unzip.d.ts +118 -0
- package/dist/docx/unzip.js +383 -0
- package/dist/docx/vmlImageParser.d.ts +16 -0
- package/dist/docx/vmlImageParser.js +100 -0
- package/dist/docx/watermarkParser.d.ts +45 -0
- package/dist/docx/watermarkParser.js +348 -0
- package/dist/docx/wrapTypes.d.ts +29 -0
- package/dist/docx/wrapTypes.js +48 -0
- package/dist/docx/xmlParser.d.ts +297 -0
- package/dist/docx/xmlParser.js +527 -0
- package/dist/fields/bookmarkPages.d.ts +13 -0
- package/dist/fields/bookmarkPages.js +66 -0
- package/dist/fields/bookmarkText.d.ts +16 -0
- package/dist/fields/bookmarkText.js +61 -0
- package/dist/fields/evaluateField.d.ts +23 -0
- package/dist/fields/evaluateField.js +77 -0
- package/dist/fields/fieldContext.d.ts +21 -0
- package/dist/fields/fieldContext.js +0 -0
- package/dist/fields/resolveFieldValues.d.ts +44 -0
- package/dist/fields/resolveFieldValues.js +204 -0
- package/dist/fields/sectionPageCounts.d.ts +11 -0
- package/dist/fields/sectionPageCounts.js +16 -0
- package/dist/fields/seqValues.d.ts +14 -0
- package/dist/fields/seqValues.js +36 -0
- package/dist/fonts/embeddedFontTable.d.ts +42 -0
- package/dist/fonts/embeddedFontTable.js +80 -0
- package/dist/fonts/embeddedFonts.d.ts +46 -0
- package/dist/fonts/embeddedFonts.js +112 -0
- package/dist/fonts/fontDeobfuscation.d.ts +30 -0
- package/dist/fonts/fontDeobfuscation.js +57 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +23 -0
- package/dist/layout-bridge/convert/footnoteLayout.d.ts +57 -0
- package/dist/layout-bridge/convert/footnoteLayout.js +316 -0
- package/dist/layout-bridge/convert/headerFooterLayout.d.ts +74 -0
- package/dist/layout-bridge/convert/headerFooterLayout.js +432 -0
- package/dist/layout-bridge/convert/templatePreviewFlow.d.ts +36 -0
- package/dist/layout-bridge/convert/templatePreviewFlow.js +176 -0
- package/dist/layout-bridge/convert/toFlowBlocks.d.ts +65 -0
- package/dist/layout-bridge/convert/toFlowBlocks.js +1309 -0
- package/dist/layout-bridge/convert/wrapEditorViewAsSurface.d.ts +17 -0
- package/dist/layout-bridge/convert/wrapEditorViewAsSurface.js +36 -0
- package/dist/layout-bridge/dom/clickToPositionDom.d.ts +66 -0
- package/dist/layout-bridge/dom/clickToPositionDom.js +304 -0
- package/dist/layout-bridge/dom/findBodyPmSpans.d.ts +7 -0
- package/dist/layout-bridge/dom/findBodyPmSpans.js +17 -0
- package/dist/layout-bridge/dom/findHfPmSpans.d.ts +62 -0
- package/dist/layout-bridge/dom/findHfPmSpans.js +197 -0
- package/dist/layout-bridge/engine/clickToPosition.d.ts +66 -0
- package/dist/layout-bridge/engine/clickToPosition.js +403 -0
- package/dist/layout-bridge/engine/hitTest.d.ts +135 -0
- package/dist/layout-bridge/engine/hitTest.js +375 -0
- package/dist/layout-bridge/engine/measuring/index.d.ts +10 -0
- package/dist/layout-bridge/engine/measuring/index.js +9 -0
- package/dist/layout-bridge/engine/selectionRects.d.ts +59 -0
- package/dist/layout-bridge/engine/selectionRects.js +485 -0
- package/dist/layout-bridge/engine/tableWidthUtils.d.ts +7 -0
- package/dist/layout-bridge/engine/tableWidthUtils.js +25 -0
- package/dist/layout-engine/index.d.ts +44 -0
- package/dist/layout-engine/index.js +691 -0
- package/dist/layout-engine/keep-together.d.ts +43 -0
- package/dist/layout-engine/keep-together.js +98 -0
- package/dist/layout-engine/layoutInstrumentation.d.ts +50 -0
- package/dist/layout-engine/layoutInstrumentation.js +43 -0
- package/dist/layout-engine/lineFlow.d.ts +8 -0
- package/dist/layout-engine/lineFlow.js +17 -0
- package/dist/layout-engine/measure/cache.d.ts +93 -0
- package/dist/layout-engine/measure/cache.js +245 -0
- package/dist/layout-engine/measure/clampFloatingWrapMargins.d.ts +20 -0
- package/dist/layout-engine/measure/clampFloatingWrapMargins.js +29 -0
- package/dist/layout-engine/measure/featureFlags.d.ts +44 -0
- package/dist/layout-engine/measure/featureFlags.js +19 -0
- package/dist/layout-engine/measure/floatingZones.d.ts +89 -0
- package/dist/layout-engine/measure/floatingZones.js +152 -0
- package/dist/layout-engine/measure/font-metrics.worker.d.ts +17 -0
- package/dist/layout-engine/measure/font-metrics.worker.js +104 -0
- package/dist/layout-engine/measure/index.d.ts +9 -0
- package/dist/layout-engine/measure/index.js +8 -0
- package/dist/layout-engine/measure/listMarkerWidth.d.ts +40 -0
- package/dist/layout-engine/measure/listMarkerWidth.js +76 -0
- package/dist/layout-engine/measure/measureBlocks.d.ts +25 -0
- package/dist/layout-engine/measure/measureBlocks.js +450 -0
- package/dist/layout-engine/measure/measureContainer.d.ts +24 -0
- package/dist/layout-engine/measure/measureContainer.js +280 -0
- package/dist/layout-engine/measure/measureHelpers.d.ts +82 -0
- package/dist/layout-engine/measure/measureHelpers.js +156 -0
- package/dist/layout-engine/measure/measureParagraph.d.ts +61 -0
- package/dist/layout-engine/measure/measureParagraph.js +724 -0
- package/dist/layout-engine/measure/measureProvider.d.ts +23 -0
- package/dist/layout-engine/measure/measureProvider.js +35 -0
- package/dist/layout-engine/measure/measureTypes.d.ts +61 -0
- package/dist/layout-engine/measure/measureTypes.js +0 -0
- package/dist/layout-engine/measure/measureWorker.d.ts +54 -0
- package/dist/layout-engine/measure/measureWorker.js +249 -0
- package/dist/layout-engine/measure/measureWorkerProtocol.d.ts +88 -0
- package/dist/layout-engine/measure/measureWorkerProtocol.js +20 -0
- package/dist/layout-engine/measure/tableCellFloating.d.ts +26 -0
- package/dist/layout-engine/measure/tableCellFloating.js +99 -0
- package/dist/layout-engine/paginator.d.ts +84 -0
- package/dist/layout-engine/paginator.js +348 -0
- package/dist/layout-engine/paragraphFragmentRange.d.ts +9 -0
- package/dist/layout-engine/paragraphFragmentRange.js +40 -0
- package/dist/layout-engine/section-breaks.d.ts +78 -0
- package/dist/layout-engine/section-breaks.js +182 -0
- package/dist/layout-engine/tableRowBreak.d.ts +23 -0
- package/dist/layout-engine/tableRowBreak.js +147 -0
- package/dist/layout-engine/textBoxFlow.d.ts +50 -0
- package/dist/layout-engine/textBoxFlow.js +160 -0
- package/dist/layout-engine/types.d.ts +1031 -0
- package/dist/layout-engine/types.js +100 -0
- package/dist/layout-painter/documentColors.d.ts +4 -0
- package/dist/layout-painter/documentColors.js +40 -0
- package/dist/layout-painter/index.d.ts +110 -0
- package/dist/layout-painter/index.js +182 -0
- package/dist/layout-painter/registry/modules/image.d.ts +6 -0
- package/dist/layout-painter/registry/modules/image.js +17 -0
- package/dist/layout-painter/registry/modules/paragraph.d.ts +6 -0
- package/dist/layout-painter/registry/modules/paragraph.js +18 -0
- package/dist/layout-painter/registry/modules/table.d.ts +6 -0
- package/dist/layout-painter/registry/modules/table.js +16 -0
- package/dist/layout-painter/registry/modules/textBox.d.ts +6 -0
- package/dist/layout-painter/registry/modules/textBox.js +13 -0
- package/dist/layout-painter/registry/modules.d.ts +6 -0
- package/dist/layout-painter/registry/modules.js +26 -0
- package/dist/layout-painter/registry/registry.d.ts +24 -0
- package/dist/layout-painter/registry/registry.js +53 -0
- package/dist/layout-painter/registry/types.d.ts +61 -0
- package/dist/layout-painter/registry/types.js +0 -0
- package/dist/layout-painter/renderFragment.d.ts +32 -0
- package/dist/layout-painter/renderFragment.js +114 -0
- package/dist/layout-painter/renderImage.d.ts +88 -0
- package/dist/layout-painter/renderImage.js +130 -0
- package/dist/layout-painter/renderPage.d.ts +264 -0
- package/dist/layout-painter/renderPage.js +1795 -0
- package/dist/layout-painter/renderParagraph.d.ts +93 -0
- package/dist/layout-painter/renderParagraph.js +1300 -0
- package/dist/layout-painter/renderTable.d.ts +36 -0
- package/dist/layout-painter/renderTable.js +432 -0
- package/dist/layout-painter/renderTextBox.d.ts +22 -0
- package/dist/layout-painter/renderTextBox.js +67 -0
- package/dist/layout-painter/renderUtils.d.ts +42 -0
- package/dist/layout-painter/renderUtils.js +30 -0
- package/dist/layout-painter/renderWatermark.d.ts +16 -0
- package/dist/layout-painter/renderWatermark.js +61 -0
- package/dist/layout-painter/sdtBoundary.d.ts +6 -0
- package/dist/layout-painter/sdtBoundary.js +28 -0
- package/dist/managers/ContextMenuManager.d.ts +28 -0
- package/dist/managers/ContextMenuManager.js +48 -0
- package/dist/managers/DocumentLoaderManager.d.ts +47 -0
- package/dist/managers/DocumentLoaderManager.js +69 -0
- package/dist/managers/EditorModeManager.d.ts +28 -0
- package/dist/managers/EditorModeManager.js +50 -0
- package/dist/managers/ErrorManager.d.ts +26 -0
- package/dist/managers/ErrorManager.js +85 -0
- package/dist/managers/FindReplaceManager.d.ts +54 -0
- package/dist/managers/FindReplaceManager.js +104 -0
- package/dist/managers/HistoryManager.d.ts +92 -0
- package/dist/managers/HistoryManager.js +193 -0
- package/dist/managers/Subscribable.d.ts +34 -0
- package/dist/managers/Subscribable.js +46 -0
- package/dist/managers/TableSelectionManager.d.ts +74 -0
- package/dist/managers/TableSelectionManager.js +225 -0
- package/dist/managers/editorShortcuts.d.ts +42 -0
- package/dist/managers/editorShortcuts.js +60 -0
- package/dist/managers/types.d.ts +41 -0
- package/dist/managers/types.js +0 -0
- package/dist/markdown/annotations.d.ts +14 -0
- package/dist/markdown/annotations.js +42 -0
- package/dist/markdown/escape.d.ts +36 -0
- package/dist/markdown/escape.js +59 -0
- package/dist/markdown/fromMarkdown.d.ts +11 -0
- package/dist/markdown/fromMarkdown.js +223 -0
- package/dist/markdown/headings.d.ts +13 -0
- package/dist/markdown/headings.js +20 -0
- package/dist/markdown/images.d.ts +13 -0
- package/dist/markdown/images.js +63 -0
- package/dist/markdown/index.d.ts +18 -0
- package/dist/markdown/index.js +33 -0
- package/dist/markdown/internals.d.ts +15 -0
- package/dist/markdown/internals.js +35 -0
- package/dist/markdown/renderBlock.d.ts +7 -0
- package/dist/markdown/renderBlock.js +68 -0
- package/dist/markdown/renderParagraph.d.ts +11 -0
- package/dist/markdown/renderParagraph.js +64 -0
- package/dist/markdown/renderRuns.d.ts +11 -0
- package/dist/markdown/renderRuns.js +265 -0
- package/dist/markdown/renderTable.d.ts +8 -0
- package/dist/markdown/renderTable.js +229 -0
- package/dist/markdown/trailers.d.ts +13 -0
- package/dist/markdown/trailers.js +54 -0
- package/dist/markdown/types.d.ts +118 -0
- package/dist/markdown/types.js +0 -0
- package/dist/model.d.ts +13 -0
- package/dist/model.js +4 -0
- package/dist/paged-layout/LayoutSelectionGate.d.ts +80 -0
- package/dist/paged-layout/LayoutSelectionGate.js +131 -0
- package/dist/paged-layout/headerFooterMargins.d.ts +73 -0
- package/dist/paged-layout/headerFooterMargins.js +120 -0
- package/dist/paged-layout/hiddenEditorScroll.d.ts +4 -0
- package/dist/paged-layout/hiddenEditorScroll.js +4 -0
- package/dist/paged-layout/incrementalMeasure.d.ts +33 -0
- package/dist/paged-layout/incrementalMeasure.js +56 -0
- package/dist/paged-layout/rangeProjection.d.ts +51 -0
- package/dist/paged-layout/rangeProjection.js +153 -0
- package/dist/paged-layout/readOnlyEditAttempt.d.ts +5 -0
- package/dist/paged-layout/readOnlyEditAttempt.js +22 -0
- package/dist/paged-layout/scrollNavigation.d.ts +23 -0
- package/dist/paged-layout/scrollNavigation.js +31 -0
- package/dist/paged-layout/scrollPageInfo.d.ts +41 -0
- package/dist/paged-layout/scrollPageInfo.js +34 -0
- package/dist/paged-layout/scrollToPmPosition.d.ts +17 -0
- package/dist/paged-layout/scrollToPmPosition.js +95 -0
- package/dist/paged-layout/sectionBlockWidths.d.ts +35 -0
- package/dist/paged-layout/sectionBlockWidths.js +52 -0
- package/dist/paged-layout/sectionGeometry.d.ts +21 -0
- package/dist/paged-layout/sectionGeometry.js +36 -0
- package/dist/paged-layout/selectionViewportRect.d.ts +29 -0
- package/dist/paged-layout/selectionViewportRect.js +55 -0
- package/dist/paged-layout/tableColumnResize.d.ts +19 -0
- package/dist/paged-layout/tableColumnResize.js +28 -0
- package/dist/paged-layout/tableInsertButtonGeometry.d.ts +15 -0
- package/dist/paged-layout/tableInsertButtonGeometry.js +15 -0
- package/dist/paged-layout/transactionDirtyRange.d.ts +7 -0
- package/dist/paged-layout/transactionDirtyRange.js +27 -0
- package/dist/paged-layout/zoomScrollAnchor.d.ts +40 -0
- package/dist/paged-layout/zoomScrollAnchor.js +25 -0
- package/dist/prosemirror/attrs/index.d.ts +80 -0
- package/dist/prosemirror/attrs/index.js +1218 -0
- package/dist/prosemirror/autospacingBase.d.ts +11 -0
- package/dist/prosemirror/autospacingBase.js +16 -0
- package/dist/prosemirror/commands/comments.d.ts +93 -0
- package/dist/prosemirror/commands/comments.js +435 -0
- package/dist/prosemirror/commands/contentControls.d.ts +45 -0
- package/dist/prosemirror/commands/contentControls.js +294 -0
- package/dist/prosemirror/commands/contentControlsBlockFill.d.ts +15 -0
- package/dist/prosemirror/commands/contentControlsBlockFill.js +19 -0
- package/dist/prosemirror/commands/formatPainter.d.ts +31 -0
- package/dist/prosemirror/commands/formatPainter.js +130 -0
- package/dist/prosemirror/commands/formatting.d.ts +32 -0
- package/dist/prosemirror/commands/formatting.js +45 -0
- package/dist/prosemirror/commands/hyperlink.d.ts +31 -0
- package/dist/prosemirror/commands/hyperlink.js +79 -0
- package/dist/prosemirror/commands/image.d.ts +59 -0
- package/dist/prosemirror/commands/image.js +219 -0
- package/dist/prosemirror/commands/index.d.ts +13 -0
- package/dist/prosemirror/commands/index.js +13 -0
- package/dist/prosemirror/commands/pageBreak.d.ts +10 -0
- package/dist/prosemirror/commands/pageBreak.js +47 -0
- package/dist/prosemirror/commands/paragraph.d.ts +39 -0
- package/dist/prosemirror/commands/paragraph.js +64 -0
- package/dist/prosemirror/commands/pastePlainText.d.ts +39 -0
- package/dist/prosemirror/commands/pastePlainText.js +67 -0
- package/dist/prosemirror/commands/table.d.ts +83 -0
- package/dist/prosemirror/commands/table.js +105 -0
- package/dist/prosemirror/conversion/fromProseDoc.d.ts +27 -0
- package/dist/prosemirror/conversion/fromProseDoc.js +1550 -0
- package/dist/prosemirror/conversion/index.d.ts +4 -0
- package/dist/prosemirror/conversion/index.js +4 -0
- package/dist/prosemirror/conversion/runShadingMark.d.ts +16 -0
- package/dist/prosemirror/conversion/runShadingMark.js +39 -0
- package/dist/prosemirror/conversion/toProseDoc.d.ts +39 -0
- package/dist/prosemirror/conversion/toProseDoc.js +1404 -0
- package/dist/prosemirror/extensions/ExtensionManager.d.ts +43 -0
- package/dist/prosemirror/extensions/ExtensionManager.js +86 -0
- package/dist/prosemirror/extensions/StarterKit.d.ts +16 -0
- package/dist/prosemirror/extensions/StarterKit.js +132 -0
- package/dist/prosemirror/extensions/core/DocExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/core/DocExtension.js +12 -0
- package/dist/prosemirror/extensions/core/HistoryExtension.d.ts +13 -0
- package/dist/prosemirror/extensions/core/HistoryExtension.js +28 -0
- package/dist/prosemirror/extensions/core/ParagraphExtension.d.ts +25 -0
- package/dist/prosemirror/extensions/core/ParagraphExtension.js +619 -0
- package/dist/prosemirror/extensions/core/TextExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/core/TextExtension.js +12 -0
- package/dist/prosemirror/extensions/create.d.ts +17 -0
- package/dist/prosemirror/extensions/create.js +129 -0
- package/dist/prosemirror/extensions/features/AutoBidiDetectionExtension.d.ts +23 -0
- package/dist/prosemirror/extensions/features/AutoBidiDetectionExtension.js +106 -0
- package/dist/prosemirror/extensions/features/BaseKeymapExtension.d.ts +8 -0
- package/dist/prosemirror/extensions/features/BaseKeymapExtension.js +172 -0
- package/dist/prosemirror/extensions/features/BidiShortcutExtension.d.ts +16 -0
- package/dist/prosemirror/extensions/features/BidiShortcutExtension.js +38 -0
- package/dist/prosemirror/extensions/features/ContentControlWidgetsExtension.d.ts +16 -0
- package/dist/prosemirror/extensions/features/ContentControlWidgetsExtension.js +21 -0
- package/dist/prosemirror/extensions/features/DropCursorExtension.d.ts +12 -0
- package/dist/prosemirror/extensions/features/DropCursorExtension.js +20 -0
- package/dist/prosemirror/extensions/features/EmptyParagraphFormatExtension.d.ts +8 -0
- package/dist/prosemirror/extensions/features/EmptyParagraphFormatExtension.js +44 -0
- package/dist/prosemirror/extensions/features/GapCursorExtension.d.ts +19 -0
- package/dist/prosemirror/extensions/features/GapCursorExtension.js +24 -0
- package/dist/prosemirror/extensions/features/ImageDragExtension.d.ts +15 -0
- package/dist/prosemirror/extensions/features/ImageDragExtension.js +66 -0
- package/dist/prosemirror/extensions/features/ImagePasteExtension.d.ts +12 -0
- package/dist/prosemirror/extensions/features/ImagePasteExtension.js +91 -0
- package/dist/prosemirror/extensions/features/ListExtension.d.ts +14 -0
- package/dist/prosemirror/extensions/features/ListExtension.js +340 -0
- package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/features/ParaIdAllocatorExtension.js +60 -0
- package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.d.ts +35 -0
- package/dist/prosemirror/extensions/features/ParagraphChangeTrackerExtension.js +188 -0
- package/dist/prosemirror/extensions/features/PasteCleanupExtension.d.ts +20 -0
- package/dist/prosemirror/extensions/features/PasteCleanupExtension.js +34 -0
- package/dist/prosemirror/extensions/features/PasteStyleInlinerExtension.d.ts +20 -0
- package/dist/prosemirror/extensions/features/PasteStyleInlinerExtension.js +145 -0
- package/dist/prosemirror/extensions/features/SelectionTrackerExtension.d.ts +10 -0
- package/dist/prosemirror/extensions/features/SelectionTrackerExtension.js +17 -0
- package/dist/prosemirror/extensions/features/bidiShortcutController.d.ts +31 -0
- package/dist/prosemirror/extensions/features/bidiShortcutController.js +27 -0
- package/dist/prosemirror/extensions/features/pasteCleanup.d.ts +31 -0
- package/dist/prosemirror/extensions/features/pasteCleanup.js +159 -0
- package/dist/prosemirror/extensions/marks/AllCapsExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/AllCapsExtension.js +24 -0
- package/dist/prosemirror/extensions/marks/BoldExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/BoldExtension.js +41 -0
- package/dist/prosemirror/extensions/marks/CharacterSpacingExtension.d.ts +14 -0
- package/dist/prosemirror/extensions/marks/CharacterSpacingExtension.js +64 -0
- package/dist/prosemirror/extensions/marks/CharacterStyleExtension.d.ts +23 -0
- package/dist/prosemirror/extensions/marks/CharacterStyleExtension.js +47 -0
- package/dist/prosemirror/extensions/marks/CommentExtension.d.ts +12 -0
- package/dist/prosemirror/extensions/marks/CommentExtension.js +38 -0
- package/dist/prosemirror/extensions/marks/FontFamilyExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/FontFamilyExtension.js +55 -0
- package/dist/prosemirror/extensions/marks/FontSizeExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/FontSizeExtension.js +47 -0
- package/dist/prosemirror/extensions/marks/FootnoteRefExtension.d.ts +11 -0
- package/dist/prosemirror/extensions/marks/FootnoteRefExtension.js +92 -0
- package/dist/prosemirror/extensions/marks/HiddenTextExtension.d.ts +23 -0
- package/dist/prosemirror/extensions/marks/HiddenTextExtension.js +35 -0
- package/dist/prosemirror/extensions/marks/HighlightExtension.d.ts +10 -0
- package/dist/prosemirror/extensions/marks/HighlightExtension.js +115 -0
- package/dist/prosemirror/extensions/marks/HyperlinkExtension.d.ts +13 -0
- package/dist/prosemirror/extensions/marks/HyperlinkExtension.js +146 -0
- package/dist/prosemirror/extensions/marks/ItalicExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/ItalicExtension.js +34 -0
- package/dist/prosemirror/extensions/marks/RtlExtension.d.ts +6 -0
- package/dist/prosemirror/extensions/marks/RtlExtension.js +21 -0
- package/dist/prosemirror/extensions/marks/RunFormattingOverrideExtension.d.ts +11 -0
- package/dist/prosemirror/extensions/marks/RunFormattingOverrideExtension.js +75 -0
- package/dist/prosemirror/extensions/marks/RunShadingExtension.d.ts +6 -0
- package/dist/prosemirror/extensions/marks/RunShadingExtension.js +38 -0
- package/dist/prosemirror/extensions/marks/SmallCapsExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/SmallCapsExtension.js +24 -0
- package/dist/prosemirror/extensions/marks/StrikeExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/StrikeExtension.js +33 -0
- package/dist/prosemirror/extensions/marks/SubscriptExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/SubscriptExtension.js +25 -0
- package/dist/prosemirror/extensions/marks/SuperscriptExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/SuperscriptExtension.js +25 -0
- package/dist/prosemirror/extensions/marks/TextColorExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/TextColorExtension.js +50 -0
- package/dist/prosemirror/extensions/marks/TextEffectExtension.d.ts +6 -0
- package/dist/prosemirror/extensions/marks/TextEffectExtension.js +35 -0
- package/dist/prosemirror/extensions/marks/TextEffectsExtensions.d.ts +31 -0
- package/dist/prosemirror/extensions/marks/TextEffectsExtensions.js +134 -0
- package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.d.ts +22 -0
- package/dist/prosemirror/extensions/marks/TrackedChangeExtensions.js +113 -0
- package/dist/prosemirror/extensions/marks/UnderlineExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/marks/UnderlineExtension.js +60 -0
- package/dist/prosemirror/extensions/marks/markUtils.d.ts +34 -0
- package/dist/prosemirror/extensions/marks/markUtils.js +233 -0
- package/dist/prosemirror/extensions/nodes/BlockSdtExtension.d.ts +22 -0
- package/dist/prosemirror/extensions/nodes/BlockSdtExtension.js +122 -0
- package/dist/prosemirror/extensions/nodes/FieldExtension.d.ts +12 -0
- package/dist/prosemirror/extensions/nodes/FieldExtension.js +87 -0
- package/dist/prosemirror/extensions/nodes/HardBreakExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/HardBreakExtension.js +38 -0
- package/dist/prosemirror/extensions/nodes/HorizontalRuleExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/HorizontalRuleExtension.js +18 -0
- package/dist/prosemirror/extensions/nodes/ImageExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/ImageExtension.js +132 -0
- package/dist/prosemirror/extensions/nodes/MathExtension.d.ts +13 -0
- package/dist/prosemirror/extensions/nodes/MathExtension.js +56 -0
- package/dist/prosemirror/extensions/nodes/PageBreakExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/PageBreakExtension.js +20 -0
- package/dist/prosemirror/extensions/nodes/SdtExtension.d.ts +12 -0
- package/dist/prosemirror/extensions/nodes/SdtExtension.js +107 -0
- package/dist/prosemirror/extensions/nodes/ShapeExtension.d.ts +30 -0
- package/dist/prosemirror/extensions/nodes/ShapeExtension.js +502 -0
- package/dist/prosemirror/extensions/nodes/TabExtension.d.ts +9 -0
- package/dist/prosemirror/extensions/nodes/TabExtension.js +27 -0
- package/dist/prosemirror/extensions/nodes/TableExtension.d.ts +34 -0
- package/dist/prosemirror/extensions/nodes/TableExtension.js +1972 -0
- package/dist/prosemirror/extensions/nodes/TextBoxExtension.d.ts +34 -0
- package/dist/prosemirror/extensions/nodes/TextBoxExtension.js +150 -0
- package/dist/prosemirror/extensions/types.d.ts +101 -0
- package/dist/prosemirror/extensions/types.js +10 -0
- package/dist/prosemirror/findReplaceSelection.d.ts +23 -0
- package/dist/prosemirror/findReplaceSelection.js +86 -0
- package/dist/prosemirror/index.d.ts +25 -0
- package/dist/prosemirror/index.js +23 -0
- package/dist/prosemirror/insertOperations.d.ts +12 -0
- package/dist/prosemirror/insertOperations.js +19 -0
- package/dist/prosemirror/paragraphDirection.d.ts +42 -0
- package/dist/prosemirror/paragraphDirection.js +33 -0
- package/dist/prosemirror/plugins/aiCitationDecorations.d.ts +40 -0
- package/dist/prosemirror/plugins/aiCitationDecorations.js +90 -0
- package/dist/prosemirror/plugins/aiSuggestionDecorations.d.ts +42 -0
- package/dist/prosemirror/plugins/aiSuggestionDecorations.js +135 -0
- package/dist/prosemirror/plugins/anonymizationDecorations.d.ts +60 -0
- package/dist/prosemirror/plugins/anonymizationDecorations.js +120 -0
- package/dist/prosemirror/plugins/autocompleteSuggestion.d.ts +123 -0
- package/dist/prosemirror/plugins/autocompleteSuggestion.js +283 -0
- package/dist/prosemirror/plugins/contentControlWidgets.d.ts +56 -0
- package/dist/prosemirror/plugins/contentControlWidgets.js +192 -0
- package/dist/prosemirror/plugins/createDocScanPlugin.d.ts +37 -0
- package/dist/prosemirror/plugins/createDocScanPlugin.js +55 -0
- package/dist/prosemirror/plugins/documentStyles.d.ts +18 -0
- package/dist/prosemirror/plugins/documentStyles.js +46 -0
- package/dist/prosemirror/plugins/index.d.ts +3 -0
- package/dist/prosemirror/plugins/index.js +3 -0
- package/dist/prosemirror/plugins/pmTextScan.d.ts +19 -0
- package/dist/prosemirror/plugins/pmTextScan.js +39 -0
- package/dist/prosemirror/plugins/selectionTracker.d.ts +43 -0
- package/dist/prosemirror/plugins/selectionTracker.js +179 -0
- package/dist/prosemirror/plugins/suggestionMode.d.ts +70 -0
- package/dist/prosemirror/plugins/suggestionMode.js +489 -0
- package/dist/prosemirror/plugins/templateDirectives.d.ts +25 -0
- package/dist/prosemirror/plugins/templateDirectives.js +67 -0
- package/dist/prosemirror/plugins/templatePreviewValues.d.ts +49 -0
- package/dist/prosemirror/plugins/templatePreviewValues.js +117 -0
- package/dist/prosemirror/plugins/templateSlashMenu.d.ts +57 -0
- package/dist/prosemirror/plugins/templateSlashMenu.js +184 -0
- package/dist/prosemirror/schema/index.d.ts +15 -0
- package/dist/prosemirror/schema/index.js +20 -0
- package/dist/prosemirror/schema/marks.d.ts +118 -0
- package/dist/prosemirror/schema/marks.js +0 -0
- package/dist/prosemirror/schema/nodes.d.ts +389 -0
- package/dist/prosemirror/schema/nodes.js +0 -0
- package/dist/prosemirror/selectionState.d.ts +23 -0
- package/dist/prosemirror/selectionState.js +111 -0
- package/dist/prosemirror/styles/index.d.ts +2 -0
- package/dist/prosemirror/styles/index.js +2 -0
- package/dist/prosemirror/styles/resolvedStyleAttrs.d.ts +32 -0
- package/dist/prosemirror/styles/resolvedStyleAttrs.js +108 -0
- package/dist/prosemirror/styles/styleResolver.d.ts +94 -0
- package/dist/prosemirror/styles/styleResolver.js +200 -0
- package/dist/prosemirror/utils/findParagraphByParaId.d.ts +26 -0
- package/dist/prosemirror/utils/findParagraphByParaId.js +37 -0
- package/dist/prosemirror/utils/tabCalculator.d.ts +110 -0
- package/dist/prosemirror/utils/tabCalculator.js +137 -0
- package/dist/prosemirror/validation.d.ts +20 -0
- package/dist/prosemirror/validation.js +177 -0
- package/dist/server.d.ts +7 -0
- package/dist/server.js +6 -0
- package/dist/style-engine/index.d.ts +3 -0
- package/dist/style-engine/index.js +2 -0
- package/dist/style-engine/styleEngine.d.ts +67 -0
- package/dist/style-engine/styleEngine.js +70 -0
- package/dist/types/block-id.d.ts +58 -0
- package/dist/types/block-id.js +61 -0
- package/dist/types/colors.d.ts +2 -0
- package/dist/types/colors.js +0 -0
- package/dist/types/content.d.ts +2 -0
- package/dist/types/content.js +0 -0
- package/dist/types/document.d.ts +7 -0
- package/dist/types/document.js +0 -0
- package/dist/types/documentEnumValues.d.ts +89 -0
- package/dist/types/documentEnumValues.js +693 -0
- package/dist/types/formatting.d.ts +2 -0
- package/dist/types/formatting.js +0 -0
- package/dist/types/index.d.ts +107 -0
- package/dist/types/index.js +0 -0
- package/dist/utils/authorColors.d.ts +16 -0
- package/dist/utils/authorColors.js +30 -0
- package/dist/utils/baseDirection.d.ts +23 -0
- package/dist/utils/baseDirection.js +34 -0
- package/dist/utils/clipboard.d.ts +126 -0
- package/dist/utils/clipboard.js +622 -0
- package/dist/utils/colorResolver.d.ts +158 -0
- package/dist/utils/colorResolver.js +557 -0
- package/dist/utils/createDocument.d.ts +50 -0
- package/dist/utils/createDocument.js +262 -0
- package/dist/utils/documentLoaderBehavior.d.ts +22 -0
- package/dist/utils/documentLoaderBehavior.js +14 -0
- package/dist/utils/docxInput.d.ts +22 -0
- package/dist/utils/docxInput.js +16 -0
- package/dist/utils/domGuards.d.ts +59 -0
- package/dist/utils/domGuards.js +82 -0
- package/dist/utils/fontFamilyMerge.d.ts +7 -0
- package/dist/utils/fontFamilyMerge.js +31 -0
- package/dist/utils/fontLoader.d.ts +50 -0
- package/dist/utils/fontLoader.js +177 -0
- package/dist/utils/fontResolver.d.ts +61 -0
- package/dist/utils/fontResolver.js +651 -0
- package/dist/utils/fontWeights.d.ts +4 -0
- package/dist/utils/fontWeights.js +4 -0
- package/dist/utils/formatToStyle.d.ts +103 -0
- package/dist/utils/formatToStyle.js +289 -0
- package/dist/utils/headerFooter.d.ts +74 -0
- package/dist/utils/headerFooter.js +257 -0
- package/dist/utils/headingCollector.d.ts +22 -0
- package/dist/utils/headingCollector.js +36 -0
- package/dist/utils/hexId.d.ts +33 -0
- package/dist/utils/hexId.js +37 -0
- package/dist/utils/imageValidation.d.ts +5 -0
- package/dist/utils/imageValidation.js +31 -0
- package/dist/utils/paragraphFormattingMerge.d.ts +14 -0
- package/dist/utils/paragraphFormattingMerge.js +68 -0
- package/dist/utils/replaceText.d.ts +17 -0
- package/dist/utils/replaceText.js +161 -0
- package/dist/utils/rotationBoundingBox.d.ts +12 -0
- package/dist/utils/rotationBoundingBox.js +36 -0
- package/dist/utils/scriptSegments.d.ts +36 -0
- package/dist/utils/scriptSegments.js +52 -0
- package/dist/utils/tableOperations.d.ts +87 -0
- package/dist/utils/tableOperations.js +259 -0
- package/dist/utils/textFormattingMerge.d.ts +6 -0
- package/dist/utils/textFormattingMerge.js +31 -0
- package/dist/utils/tiffConverter.d.ts +18 -0
- package/dist/utils/tiffConverter.js +83 -0
- package/dist/utils/units.d.ts +99 -0
- package/dist/utils/units.js +139 -0
- package/dist/utils/urlSecurity.d.ts +7 -0
- package/dist/utils/urlSecurity.js +65 -0
- package/dist/watermark/index.d.ts +39 -0
- package/dist/watermark/index.js +149 -0
- package/package.json +122 -2
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
import JSZip from "jszip";
|
|
2
|
+
//#region src/docx/unzip.ts
|
|
3
|
+
/**
|
|
4
|
+
* DOCX Unzipper
|
|
5
|
+
*
|
|
6
|
+
* Extracts all files from a DOCX ZIP archive and organizes them
|
|
7
|
+
* into a structured format for further processing.
|
|
8
|
+
*
|
|
9
|
+
* A DOCX file is a ZIP archive containing:
|
|
10
|
+
* - [Content_Types].xml - Content type declarations
|
|
11
|
+
* - word/document.xml - Main document content
|
|
12
|
+
* - word/styles.xml - Style definitions
|
|
13
|
+
* - word/theme/theme1.xml - Theme colors and fonts
|
|
14
|
+
* - word/numbering.xml - List/numbering definitions
|
|
15
|
+
* - word/fontTable.xml - Font declarations
|
|
16
|
+
* - word/settings.xml - Document settings
|
|
17
|
+
* - word/webSettings.xml - Web settings
|
|
18
|
+
* - word/header*.xml - Header content
|
|
19
|
+
* - word/footer*.xml - Footer content
|
|
20
|
+
* - word/footnotes.xml - Footnotes
|
|
21
|
+
* - word/endnotes.xml - Endnotes
|
|
22
|
+
* - word/media/* - Embedded images and media
|
|
23
|
+
* - word/_rels/document.xml.rels - Relationships
|
|
24
|
+
* - _rels/.rels - Package relationships
|
|
25
|
+
* - docProps/core.xml - Core properties
|
|
26
|
+
* - docProps/app.xml - Application properties
|
|
27
|
+
*/
|
|
28
|
+
var DocxSecurityError = class extends Error {
|
|
29
|
+
constructor(message) {
|
|
30
|
+
super(message);
|
|
31
|
+
this.name = "DocxSecurityError";
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
const DEFAULT_ALLOWED_MEDIA_MIME_TYPES = /* @__PURE__ */ new Set([
|
|
35
|
+
"image/png",
|
|
36
|
+
"image/jpeg",
|
|
37
|
+
"image/gif",
|
|
38
|
+
"image/bmp",
|
|
39
|
+
"image/tiff",
|
|
40
|
+
"image/webp"
|
|
41
|
+
]);
|
|
42
|
+
const PRESERVABLE_MEDIA_MIME_TYPES = /* @__PURE__ */ new Set([
|
|
43
|
+
...DEFAULT_ALLOWED_MEDIA_MIME_TYPES,
|
|
44
|
+
"image/svg+xml",
|
|
45
|
+
"image/x-wmf",
|
|
46
|
+
"image/x-emf"
|
|
47
|
+
]);
|
|
48
|
+
const MEBIBYTE = 1024 * 1024;
|
|
49
|
+
const DEFAULT_UNZIP_LIMITS = {
|
|
50
|
+
maxInputBytes: 50 * MEBIBYTE,
|
|
51
|
+
maxFiles: 5e3,
|
|
52
|
+
maxXmlBytes: 128 * MEBIBYTE,
|
|
53
|
+
maxMediaBytes: 25 * MEBIBYTE,
|
|
54
|
+
maxFontBytes: 10 * MEBIBYTE,
|
|
55
|
+
maxTotalUncompressedBytes: 250 * MEBIBYTE,
|
|
56
|
+
allowedMediaMimeTypes: DEFAULT_ALLOWED_MEDIA_MIME_TYPES
|
|
57
|
+
};
|
|
58
|
+
const ZIP_END_OF_CENTRAL_DIRECTORY_SIGNATURE = 101010256;
|
|
59
|
+
const ZIP_CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE = 33639248;
|
|
60
|
+
const ZIP_END_OF_CENTRAL_DIRECTORY_SIZE = 22;
|
|
61
|
+
const ZIP_END_OF_CENTRAL_DIRECTORY_WITH_COUNTS_SIZE = 12;
|
|
62
|
+
const ZIP_CENTRAL_DIRECTORY_FILE_HEADER_SIZE = 46;
|
|
63
|
+
/**
|
|
64
|
+
* Extract all content from a DOCX file
|
|
65
|
+
*
|
|
66
|
+
* @param buffer - DOCX file as ArrayBuffer
|
|
67
|
+
* @returns Promise resolving to extracted content
|
|
68
|
+
*/
|
|
69
|
+
async function unzipDocx(buffer, options = {}) {
|
|
70
|
+
const limits = createUnzipLimits(options);
|
|
71
|
+
if (buffer.byteLength > limits.maxInputBytes) throw new DocxSecurityError("DOCX file exceeds the maximum allowed size");
|
|
72
|
+
const loaded = await loadDocxZip(buffer, limits.maxFiles);
|
|
73
|
+
if (loaded.buffer.byteLength > limits.maxInputBytes) throw new DocxSecurityError("DOCX file exceeds the maximum allowed size");
|
|
74
|
+
const { zip } = loaded;
|
|
75
|
+
const entries = Object.entries(zip.files).filter(([, file]) => !file.dir);
|
|
76
|
+
if (entries.length > limits.maxFiles) throw new DocxSecurityError("DOCX file contains too many entries");
|
|
77
|
+
const content = {
|
|
78
|
+
documentXml: null,
|
|
79
|
+
stylesXml: null,
|
|
80
|
+
themeXml: null,
|
|
81
|
+
numberingXml: null,
|
|
82
|
+
fontTableXml: null,
|
|
83
|
+
settingsXml: null,
|
|
84
|
+
webSettingsXml: null,
|
|
85
|
+
headers: /* @__PURE__ */ new Map(),
|
|
86
|
+
footers: /* @__PURE__ */ new Map(),
|
|
87
|
+
footnotesXml: null,
|
|
88
|
+
endnotesXml: null,
|
|
89
|
+
commentsXml: null,
|
|
90
|
+
commentsExtensibleXml: null,
|
|
91
|
+
commentsExtendedXml: null,
|
|
92
|
+
documentRels: null,
|
|
93
|
+
packageRels: null,
|
|
94
|
+
contentTypesXml: null,
|
|
95
|
+
corePropsXml: null,
|
|
96
|
+
appPropsXml: null,
|
|
97
|
+
customPropsXml: null,
|
|
98
|
+
media: /* @__PURE__ */ new Map(),
|
|
99
|
+
fonts: /* @__PURE__ */ new Map(),
|
|
100
|
+
allXml: /* @__PURE__ */ new Map(),
|
|
101
|
+
originalZip: zip,
|
|
102
|
+
originalBuffer: loaded.buffer,
|
|
103
|
+
warnings: []
|
|
104
|
+
};
|
|
105
|
+
let totalUncompressedBytes = 0;
|
|
106
|
+
for (const [path, file] of entries) {
|
|
107
|
+
if (!isSafeDocxPath(path)) throw new DocxSecurityError("DOCX file contains an unsafe entry path");
|
|
108
|
+
if (!isPreservableDocxEntry(path)) continue;
|
|
109
|
+
const lowerPath = path.toLowerCase();
|
|
110
|
+
const declaredSize = getEntryUncompressedSize(file);
|
|
111
|
+
if (declaredSize !== null) {
|
|
112
|
+
totalUncompressedBytes += declaredSize;
|
|
113
|
+
if (totalUncompressedBytes > limits.maxTotalUncompressedBytes) throw new DocxSecurityError("DOCX file expands beyond the maximum allowed size");
|
|
114
|
+
}
|
|
115
|
+
if (lowerPath.endsWith(".xml") || lowerPath.endsWith(".rels")) {
|
|
116
|
+
assertEntrySize(path, declaredSize, limits.maxXmlBytes);
|
|
117
|
+
const xmlContent = await file.async("text");
|
|
118
|
+
assertExtractedSize(path, xmlContent.length, limits.maxXmlBytes);
|
|
119
|
+
content.allXml.set(path, xmlContent);
|
|
120
|
+
if (lowerPath === "word/document.xml") content.documentXml = xmlContent;
|
|
121
|
+
else if (lowerPath === "word/styles.xml") content.stylesXml = xmlContent;
|
|
122
|
+
else if (lowerPath === "word/theme/theme1.xml") content.themeXml = xmlContent;
|
|
123
|
+
else if (lowerPath === "word/numbering.xml") content.numberingXml = xmlContent;
|
|
124
|
+
else if (lowerPath === "word/fonttable.xml") content.fontTableXml = xmlContent;
|
|
125
|
+
else if (lowerPath === "word/settings.xml") content.settingsXml = xmlContent;
|
|
126
|
+
else if (lowerPath === "word/websettings.xml") content.webSettingsXml = xmlContent;
|
|
127
|
+
else if (lowerPath === "word/footnotes.xml") content.footnotesXml = xmlContent;
|
|
128
|
+
else if (lowerPath === "word/endnotes.xml") content.endnotesXml = xmlContent;
|
|
129
|
+
else if (lowerPath === "word/comments.xml") content.commentsXml = xmlContent;
|
|
130
|
+
else if (lowerPath === "word/commentsextensible.xml") content.commentsExtensibleXml = xmlContent;
|
|
131
|
+
else if (lowerPath === "word/commentsextended.xml") content.commentsExtendedXml = xmlContent;
|
|
132
|
+
else if (lowerPath === "word/_rels/document.xml.rels") content.documentRels = xmlContent;
|
|
133
|
+
else if (lowerPath === "_rels/.rels") content.packageRels = xmlContent;
|
|
134
|
+
else if (lowerPath === "[content_types].xml") content.contentTypesXml = xmlContent;
|
|
135
|
+
else if (lowerPath === "docprops/core.xml") content.corePropsXml = xmlContent;
|
|
136
|
+
else if (lowerPath === "docprops/app.xml") content.appPropsXml = xmlContent;
|
|
137
|
+
else if (lowerPath === "docprops/custom.xml") content.customPropsXml = xmlContent;
|
|
138
|
+
else if (/^word\/header[^/]*\.xml$/u.test(lowerPath)) {
|
|
139
|
+
const filename = path.split("/").pop() || path;
|
|
140
|
+
content.headers.set(filename, xmlContent);
|
|
141
|
+
} else if (/^word\/footer[^/]*\.xml$/u.test(lowerPath)) {
|
|
142
|
+
const filename = path.split("/").pop() || path;
|
|
143
|
+
content.footers.set(filename, xmlContent);
|
|
144
|
+
}
|
|
145
|
+
} else if (lowerPath.startsWith("word/media/")) {
|
|
146
|
+
const mimeType = getMediaMimeType(path);
|
|
147
|
+
if (!limits.allowedMediaMimeTypes.has(mimeType)) continue;
|
|
148
|
+
if (isEntryTooLarge(declaredSize, limits.maxMediaBytes)) {
|
|
149
|
+
content.warnings.push(`Skipped oversized media file: ${path}; original entry preserved for round-trip.`);
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
const binaryContent = await file.async("arraybuffer");
|
|
153
|
+
if (binaryContent.byteLength > limits.maxMediaBytes) {
|
|
154
|
+
content.warnings.push(`Skipped oversized media file: ${path}; original entry preserved for round-trip.`);
|
|
155
|
+
continue;
|
|
156
|
+
}
|
|
157
|
+
if (!isMediaContentAllowed(binaryContent, mimeType)) continue;
|
|
158
|
+
content.media.set(path, binaryContent);
|
|
159
|
+
} else if (lowerPath.startsWith("word/fonts/")) {
|
|
160
|
+
if (isEntryTooLarge(declaredSize, limits.maxFontBytes)) continue;
|
|
161
|
+
const binaryContent = await file.async("arraybuffer");
|
|
162
|
+
if (binaryContent.byteLength > limits.maxFontBytes) continue;
|
|
163
|
+
content.fonts.set(path, binaryContent);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return content;
|
|
167
|
+
}
|
|
168
|
+
async function loadDocxZip(buffer, maxFiles) {
|
|
169
|
+
try {
|
|
170
|
+
return {
|
|
171
|
+
zip: await JSZip.loadAsync(buffer),
|
|
172
|
+
buffer
|
|
173
|
+
};
|
|
174
|
+
} catch (error) {
|
|
175
|
+
const repairedBuffer = repairTruncatedEndOfCentralDirectory(buffer, maxFiles);
|
|
176
|
+
if (!repairedBuffer) throw error;
|
|
177
|
+
try {
|
|
178
|
+
return {
|
|
179
|
+
zip: await JSZip.loadAsync(repairedBuffer),
|
|
180
|
+
buffer: repairedBuffer
|
|
181
|
+
};
|
|
182
|
+
} catch {
|
|
183
|
+
throw error;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
function repairTruncatedEndOfCentralDirectory(buffer, maxFiles) {
|
|
188
|
+
const bytes = new Uint8Array(buffer);
|
|
189
|
+
const view = new DataView(buffer);
|
|
190
|
+
const eocdOffset = findLastSignature(view, bytes.byteLength, ZIP_END_OF_CENTRAL_DIRECTORY_SIGNATURE);
|
|
191
|
+
if (eocdOffset === -1) return null;
|
|
192
|
+
const eocdBytes = bytes.byteLength - eocdOffset;
|
|
193
|
+
if (eocdBytes >= ZIP_END_OF_CENTRAL_DIRECTORY_SIZE || eocdBytes < ZIP_END_OF_CENTRAL_DIRECTORY_WITH_COUNTS_SIZE) return null;
|
|
194
|
+
const diskNumber = view.getUint16(eocdOffset + 4, true);
|
|
195
|
+
const centralDirectoryDisk = view.getUint16(eocdOffset + 6, true);
|
|
196
|
+
const diskEntryCount = view.getUint16(eocdOffset + 8, true);
|
|
197
|
+
const totalEntryCount = view.getUint16(eocdOffset + 10, true);
|
|
198
|
+
if (diskNumber !== 0 || centralDirectoryDisk !== 0 || diskEntryCount !== totalEntryCount || totalEntryCount > maxFiles) return null;
|
|
199
|
+
const centralDirectory = findCentralDirectory(view, eocdOffset, totalEntryCount);
|
|
200
|
+
if (!centralDirectory) return null;
|
|
201
|
+
const repaired = new Uint8Array(eocdOffset + ZIP_END_OF_CENTRAL_DIRECTORY_SIZE);
|
|
202
|
+
repaired.set(bytes.subarray(0, eocdOffset));
|
|
203
|
+
const repairedView = new DataView(repaired.buffer);
|
|
204
|
+
repairedView.setUint32(eocdOffset, ZIP_END_OF_CENTRAL_DIRECTORY_SIGNATURE, true);
|
|
205
|
+
repairedView.setUint16(eocdOffset + 4, 0, true);
|
|
206
|
+
repairedView.setUint16(eocdOffset + 6, 0, true);
|
|
207
|
+
repairedView.setUint16(eocdOffset + 8, totalEntryCount, true);
|
|
208
|
+
repairedView.setUint16(eocdOffset + 10, totalEntryCount, true);
|
|
209
|
+
repairedView.setUint32(eocdOffset + 12, centralDirectory.size, true);
|
|
210
|
+
repairedView.setUint32(eocdOffset + 16, centralDirectory.offset, true);
|
|
211
|
+
repairedView.setUint16(eocdOffset + 20, 0, true);
|
|
212
|
+
return repaired.buffer;
|
|
213
|
+
}
|
|
214
|
+
function findCentralDirectory(view, eocdOffset, entryCount) {
|
|
215
|
+
for (let offset = 0; offset <= eocdOffset - ZIP_CENTRAL_DIRECTORY_FILE_HEADER_SIZE; offset += 1) {
|
|
216
|
+
if (view.getUint32(offset, true) !== ZIP_CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE) continue;
|
|
217
|
+
const parsed = parseCentralDirectoryAt(view, offset, eocdOffset, entryCount);
|
|
218
|
+
if (parsed) return parsed;
|
|
219
|
+
}
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
function parseCentralDirectoryAt(view, startOffset, eocdOffset, entryCount) {
|
|
223
|
+
let offset = startOffset;
|
|
224
|
+
for (let index = 0; index < entryCount; index += 1) {
|
|
225
|
+
if (offset + ZIP_CENTRAL_DIRECTORY_FILE_HEADER_SIZE > eocdOffset || view.getUint32(offset, true) !== ZIP_CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE) return null;
|
|
226
|
+
const filenameLength = view.getUint16(offset + 28, true);
|
|
227
|
+
const extraLength = view.getUint16(offset + 30, true);
|
|
228
|
+
const commentLength = view.getUint16(offset + 32, true);
|
|
229
|
+
offset += ZIP_CENTRAL_DIRECTORY_FILE_HEADER_SIZE + filenameLength + extraLength + commentLength;
|
|
230
|
+
}
|
|
231
|
+
if (offset !== eocdOffset) return null;
|
|
232
|
+
return {
|
|
233
|
+
offset: startOffset,
|
|
234
|
+
size: eocdOffset - startOffset
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
function findLastSignature(view, byteLength, signature) {
|
|
238
|
+
for (let offset = byteLength - ZIP_END_OF_CENTRAL_DIRECTORY_WITH_COUNTS_SIZE; offset >= 0; offset -= 1) if (view.getUint32(offset, true) === signature) return offset;
|
|
239
|
+
return -1;
|
|
240
|
+
}
|
|
241
|
+
function createUnzipLimits(options) {
|
|
242
|
+
return {
|
|
243
|
+
...DEFAULT_UNZIP_LIMITS,
|
|
244
|
+
...options,
|
|
245
|
+
allowedMediaMimeTypes: options.allowedMediaMimeTypes ? new Set(options.allowedMediaMimeTypes) : DEFAULT_UNZIP_LIMITS.allowedMediaMimeTypes
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
function isSafeDocxPath(path) {
|
|
249
|
+
if (!path || path.startsWith("/") || path.includes("\\")) return false;
|
|
250
|
+
return !path.split("/").some((part) => part === "..");
|
|
251
|
+
}
|
|
252
|
+
function isPreservableDocxEntry(path) {
|
|
253
|
+
if (!isSafeDocxPath(path)) return false;
|
|
254
|
+
const lowerPath = path.toLowerCase();
|
|
255
|
+
if (lowerPath.startsWith("word/media/")) return PRESERVABLE_MEDIA_MIME_TYPES.has(getMediaMimeType(path));
|
|
256
|
+
if (lowerPath.startsWith("word/fonts/")) return true;
|
|
257
|
+
if (!(lowerPath.endsWith(".xml") || lowerPath.endsWith(".rels"))) return false;
|
|
258
|
+
return lowerPath === "[content_types].xml" || lowerPath.startsWith("_rels/") || lowerPath.startsWith("docprops/") || lowerPath.startsWith("word/") || lowerPath.startsWith("customxml/");
|
|
259
|
+
}
|
|
260
|
+
function getEntryUncompressedSize(file) {
|
|
261
|
+
const metadata = file._data;
|
|
262
|
+
return typeof metadata?.uncompressedSize === "number" ? metadata.uncompressedSize : null;
|
|
263
|
+
}
|
|
264
|
+
function assertEntrySize(path, declaredSize, maxBytes) {
|
|
265
|
+
if (isEntryTooLarge(declaredSize, maxBytes)) throw new DocxSecurityError(`DOCX entry exceeds maximum size: ${path}`);
|
|
266
|
+
}
|
|
267
|
+
function isEntryTooLarge(declaredSize, maxBytes) {
|
|
268
|
+
return declaredSize !== null && declaredSize > maxBytes;
|
|
269
|
+
}
|
|
270
|
+
function assertExtractedSize(path, byteLength, maxBytes) {
|
|
271
|
+
if (byteLength > maxBytes) throw new DocxSecurityError(`DOCX entry exceeds maximum size: ${path}`);
|
|
272
|
+
}
|
|
273
|
+
function isMediaContentAllowed(data, mimeType) {
|
|
274
|
+
const bytes = new Uint8Array(data);
|
|
275
|
+
switch (mimeType) {
|
|
276
|
+
case "image/png": return bytes[0] === 137 && bytes[1] === 80 && bytes[2] === 78 && bytes[3] === 71;
|
|
277
|
+
case "image/jpeg": return bytes[0] === 255 && bytes[1] === 216;
|
|
278
|
+
case "image/gif": return bytes[0] === 71 && bytes[1] === 73 && bytes[2] === 70 && bytes[3] === 56;
|
|
279
|
+
case "image/bmp": return bytes[0] === 66 && bytes[1] === 77;
|
|
280
|
+
case "image/webp": return bytes[0] === 82 && bytes[1] === 73 && bytes[2] === 70 && bytes[3] === 70 && bytes[8] === 87 && bytes[9] === 69 && bytes[10] === 66 && bytes[11] === 80;
|
|
281
|
+
case "image/tiff": return bytes[0] === 73 && bytes[1] === 73 || bytes[0] === 77 && bytes[1] === 77;
|
|
282
|
+
default: return false;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Get a list of all files in the DOCX
|
|
287
|
+
*
|
|
288
|
+
* @param content - Extracted DOCX content
|
|
289
|
+
* @returns Array of file paths
|
|
290
|
+
*/
|
|
291
|
+
function getFileList(content) {
|
|
292
|
+
const files = [];
|
|
293
|
+
for (const path of Object.keys(content.originalZip.files)) if (!content.originalZip.files[path]?.dir && isPreservableDocxEntry(path)) files.push(path);
|
|
294
|
+
return files.toSorted();
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Get the MIME type for a media file based on extension
|
|
298
|
+
*
|
|
299
|
+
* @param path - File path
|
|
300
|
+
* @returns MIME type string
|
|
301
|
+
*/
|
|
302
|
+
function getMediaMimeType(path) {
|
|
303
|
+
switch (path.toLowerCase().split(".").pop()) {
|
|
304
|
+
case "png": return "image/png";
|
|
305
|
+
case "jpg":
|
|
306
|
+
case "jpeg": return "image/jpeg";
|
|
307
|
+
case "gif": return "image/gif";
|
|
308
|
+
case "bmp": return "image/bmp";
|
|
309
|
+
case "tif":
|
|
310
|
+
case "tiff": return "image/tiff";
|
|
311
|
+
case "wmf": return "image/x-wmf";
|
|
312
|
+
case "emf": return "image/x-emf";
|
|
313
|
+
case "svg": return "image/svg+xml";
|
|
314
|
+
case "webp": return "image/webp";
|
|
315
|
+
default: return "application/octet-stream";
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Convert media file to data URL
|
|
320
|
+
*
|
|
321
|
+
* @param data - Binary data
|
|
322
|
+
* @param mimeType - MIME type
|
|
323
|
+
* @returns Data URL string
|
|
324
|
+
*/
|
|
325
|
+
function mediaToDataUrl(data, mimeType) {
|
|
326
|
+
const bytes = new Uint8Array(data);
|
|
327
|
+
const chunks = [];
|
|
328
|
+
const chunkSize = 32768;
|
|
329
|
+
for (let offset = 0; offset < bytes.length; offset += chunkSize) {
|
|
330
|
+
const chunk = bytes.subarray(offset, offset + chunkSize);
|
|
331
|
+
chunks.push(String.fromCodePoint(...chunk));
|
|
332
|
+
}
|
|
333
|
+
return `data:${mimeType};base64,${btoa(chunks.join(""))}`;
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* Extract a specific file from the original ZIP
|
|
337
|
+
*
|
|
338
|
+
* @param content - Extracted DOCX content
|
|
339
|
+
* @param path - File path within the ZIP
|
|
340
|
+
* @returns File content as string or ArrayBuffer, or null if not found
|
|
341
|
+
*/
|
|
342
|
+
function extractFile(content, path) {
|
|
343
|
+
const file = content.originalZip.file(path);
|
|
344
|
+
if (!file || !isPreservableDocxEntry(path)) return Promise.resolve(null);
|
|
345
|
+
const lowerPath = path.toLowerCase();
|
|
346
|
+
if (lowerPath.endsWith(".xml") || lowerPath.endsWith(".rels")) return file.async("text");
|
|
347
|
+
return file.async("arraybuffer");
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* Check if a file exists in the DOCX
|
|
351
|
+
*
|
|
352
|
+
* @param content - Extracted DOCX content
|
|
353
|
+
* @param path - File path to check
|
|
354
|
+
* @returns true if file exists
|
|
355
|
+
*/
|
|
356
|
+
function hasFile(content, path) {
|
|
357
|
+
return content.originalZip.file(path) !== null;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Get summary of DOCX content
|
|
361
|
+
*
|
|
362
|
+
* @param content - Extracted DOCX content
|
|
363
|
+
* @returns Object with file counts and presence flags
|
|
364
|
+
*/
|
|
365
|
+
function getContentSummary(content) {
|
|
366
|
+
return {
|
|
367
|
+
hasDocument: content.documentXml !== null,
|
|
368
|
+
hasStyles: content.stylesXml !== null,
|
|
369
|
+
hasTheme: content.themeXml !== null,
|
|
370
|
+
hasNumbering: content.numberingXml !== null,
|
|
371
|
+
hasFontTable: content.fontTableXml !== null,
|
|
372
|
+
hasFootnotes: content.footnotesXml !== null,
|
|
373
|
+
hasEndnotes: content.endnotesXml !== null,
|
|
374
|
+
hasComments: content.commentsXml !== null,
|
|
375
|
+
headerCount: content.headers.size,
|
|
376
|
+
footerCount: content.footers.size,
|
|
377
|
+
mediaCount: content.media.size,
|
|
378
|
+
fontCount: content.fonts.size,
|
|
379
|
+
totalFiles: Object.keys(content.originalZip.files).filter((p) => !content.originalZip.files[p]?.dir).length
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
//#endregion
|
|
383
|
+
export { DocxSecurityError, extractFile, getContentSummary, getFileList, getMediaMimeType, hasFile, isPreservableDocxEntry, mediaToDataUrl, unzipDocx };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { document_d_exports } from "../types/document.js";
|
|
2
|
+
import { XmlElement } from "./xmlParser.js";
|
|
3
|
+
|
|
4
|
+
//#region src/docx/vmlImageParser.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Parse a `w:pict` element into an inline image, or null when it carries no
|
|
7
|
+
* ordinary VML picture (no resolvable `<v:imagedata>`, or a watermark shape).
|
|
8
|
+
*
|
|
9
|
+
* `rootXmlns` carries the source document/header namespace declarations. They
|
|
10
|
+
* are injected onto the captured VML so the raw replay stays self-contained
|
|
11
|
+
* when the producer bound WordprocessingML / relationship / VML namespaces to
|
|
12
|
+
* non-canonical prefixes the serializer's root does not declare.
|
|
13
|
+
*/
|
|
14
|
+
declare function parseVmlImageContent(pictElement: XmlElement, rels: document_d_exports.RelationshipMap | null, media: Map<string, document_d_exports.MediaFile> | null, rootXmlns?: Record<string, string>): document_d_exports.DrawingContent | null;
|
|
15
|
+
//#endregion
|
|
16
|
+
export { parseVmlImageContent };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { cloneWithXmlnsDeclarations, elementToXml, findAllDeep, findChild, getAttribute } from "./xmlParser.js";
|
|
2
|
+
import { pixelsToEmu } from "../utils/units.js";
|
|
3
|
+
import { resolveImageData } from "./imageParser.js";
|
|
4
|
+
import { isWatermarkShape } from "./watermarkParser.js";
|
|
5
|
+
//#region src/docx/vmlImageParser.ts
|
|
6
|
+
/**
|
|
7
|
+
* Convert a CSS length (pt/in/px/cm/mm/pc, default px) to pixels. Units are
|
|
8
|
+
* matched case-insensitively (`2IN`, `2Pt` are valid VML). The numeric part
|
|
9
|
+
* must be a single well-formed decimal, so malformed input like `1.2.3` is
|
|
10
|
+
* rejected rather than truncated to `1.2`.
|
|
11
|
+
*/
|
|
12
|
+
function cssLengthToPx(raw) {
|
|
13
|
+
if (!raw) return;
|
|
14
|
+
const match = /^(?<amount>-?(?:\d+(?:\.\d+)?|\.\d+))\s*(?<unit>pt|in|px|cm|mm|pc)?$/iu.exec(raw.trim());
|
|
15
|
+
const amountText = match?.groups?.["amount"];
|
|
16
|
+
if (amountText === void 0) return;
|
|
17
|
+
const value = Number.parseFloat(amountText);
|
|
18
|
+
if (Number.isNaN(value)) return;
|
|
19
|
+
switch (match?.groups?.["unit"]?.toLowerCase()) {
|
|
20
|
+
case "pt": return value / 72 * 96;
|
|
21
|
+
case "in": return value * 96;
|
|
22
|
+
case "cm": return value / 2.54 * 96;
|
|
23
|
+
case "mm": return value / 25.4 * 96;
|
|
24
|
+
case "pc": return value / 6 * 96;
|
|
25
|
+
case "px":
|
|
26
|
+
case void 0: return value;
|
|
27
|
+
default: return;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
/** Read a `style="k1:v1;k2:v2"` attribute into a lowercased key/value record. */
|
|
31
|
+
function parseStyleAttr(style) {
|
|
32
|
+
const out = {};
|
|
33
|
+
if (!style) return out;
|
|
34
|
+
for (const decl of style.split(";")) {
|
|
35
|
+
const colon = decl.indexOf(":");
|
|
36
|
+
if (colon < 0) continue;
|
|
37
|
+
const key = decl.slice(0, colon).trim().toLowerCase();
|
|
38
|
+
const value = decl.slice(colon + 1).trim();
|
|
39
|
+
if (key) out[key] = value;
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Read the relationship id off a `v:imagedata` element. Word writes `r:id`;
|
|
45
|
+
* some legacy / third-party generators use `r:embed` or the office-namespace
|
|
46
|
+
* `o:relid` instead, so fall back through those before the bare `id`.
|
|
47
|
+
*/
|
|
48
|
+
function readImageDataRId(imagedata) {
|
|
49
|
+
return getAttribute(imagedata, "r", "id") ?? getAttribute(imagedata, "r", "embed") ?? getAttribute(imagedata, "o", "relid") ?? getAttribute(imagedata, null, "id") ?? "";
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Parse a `w:pict` element into an inline image, or null when it carries no
|
|
53
|
+
* ordinary VML picture (no resolvable `<v:imagedata>`, or a watermark shape).
|
|
54
|
+
*
|
|
55
|
+
* `rootXmlns` carries the source document/header namespace declarations. They
|
|
56
|
+
* are injected onto the captured VML so the raw replay stays self-contained
|
|
57
|
+
* when the producer bound WordprocessingML / relationship / VML namespaces to
|
|
58
|
+
* non-canonical prefixes the serializer's root does not declare.
|
|
59
|
+
*/
|
|
60
|
+
function parseVmlImageContent(pictElement, rels, media, rootXmlns = {}) {
|
|
61
|
+
const shapes = [
|
|
62
|
+
...findAllDeep(pictElement, "v", "shape"),
|
|
63
|
+
...findAllDeep(pictElement, "v", "rect"),
|
|
64
|
+
...findAllDeep(pictElement, "v", "roundrect"),
|
|
65
|
+
...findAllDeep(pictElement, "v", "oval")
|
|
66
|
+
];
|
|
67
|
+
for (const shape of shapes) {
|
|
68
|
+
const imagedata = findChild(shape, "v", "imagedata");
|
|
69
|
+
if (!imagedata) continue;
|
|
70
|
+
const rId = readImageDataRId(imagedata);
|
|
71
|
+
if (!rId) continue;
|
|
72
|
+
if (isWatermarkShape(shape)) continue;
|
|
73
|
+
const { src, mimeType, filename } = resolveImageData(rId, rels ?? void 0, media ?? void 0);
|
|
74
|
+
const shapeStyle = parseStyleAttr(getAttribute(shape, null, "style"));
|
|
75
|
+
const widthPx = cssLengthToPx(shapeStyle["width"]);
|
|
76
|
+
const heightPx = cssLengthToPx(shapeStyle["height"]);
|
|
77
|
+
const image = {
|
|
78
|
+
type: "image",
|
|
79
|
+
rId,
|
|
80
|
+
size: {
|
|
81
|
+
width: widthPx != null ? pixelsToEmu(widthPx) : 0,
|
|
82
|
+
height: heightPx != null ? pixelsToEmu(heightPx) : 0
|
|
83
|
+
},
|
|
84
|
+
wrap: { type: "inline" }
|
|
85
|
+
};
|
|
86
|
+
if (src) image.src = src;
|
|
87
|
+
if (mimeType) image.mimeType = mimeType;
|
|
88
|
+
if (filename) image.filename = filename;
|
|
89
|
+
const title = getAttribute(imagedata, "o", "title");
|
|
90
|
+
if (title) image.title = title;
|
|
91
|
+
return {
|
|
92
|
+
type: "drawing",
|
|
93
|
+
image,
|
|
94
|
+
rawXml: elementToXml(cloneWithXmlnsDeclarations(pictElement, rootXmlns))
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
//#endregion
|
|
100
|
+
export { parseVmlImageContent };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { document_d_exports } from "../types/document.js";
|
|
2
|
+
import { XmlElement } from "./xmlParser.js";
|
|
3
|
+
|
|
4
|
+
//#region src/docx/watermarkParser.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Result of walking a header for its watermark. Carries the modeled
|
|
7
|
+
* `Watermark`, the verbatim XML of the paragraph that hosts the
|
|
8
|
+
* watermark shape (replayed on serialize so an untouched DOCX
|
|
9
|
+
* round-trips byte-exact), and a reference to that hosting paragraph
|
|
10
|
+
* so the regular body parser can skip it.
|
|
11
|
+
*/
|
|
12
|
+
type ParsedWatermark = {
|
|
13
|
+
watermark: document_d_exports.Watermark;
|
|
14
|
+
rawParagraphXml: string;
|
|
15
|
+
hostingParagraph: XmlElement;
|
|
16
|
+
/**
|
|
17
|
+
* Index where the watermark paragraph sat among block-level siblings
|
|
18
|
+
* (`w:p` / `w:tbl`) in the source header. After the host paragraph is
|
|
19
|
+
* filtered out of `content`, the serializer inserts the watermark
|
|
20
|
+
* back at this index so a header that originally placed the
|
|
21
|
+
* watermark after visible text rounds-trips with the same flow.
|
|
22
|
+
*/
|
|
23
|
+
blockIndex: number;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Whether a VML `<v:shape>` is a watermark rather than ordinary inline
|
|
27
|
+
* imagery. Text watermarks use the WordArt shapetype; picture watermarks
|
|
28
|
+
* carry a `WordPictureWatermark…` id. The VML image parser uses this to
|
|
29
|
+
* leave watermark shapes to this module, so a header watermark is not also
|
|
30
|
+
* rendered as an inline picture.
|
|
31
|
+
*/
|
|
32
|
+
declare function isWatermarkShape(shape: XmlElement): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Walk a parsed `<w:hdr>` element and return the watermark it carries,
|
|
35
|
+
* or `undefined` when none is present. Scans every candidate shape /
|
|
36
|
+
* anchor in the header so a non-watermark shape (e.g. a logo image)
|
|
37
|
+
* earlier in document order does not shadow the real watermark.
|
|
38
|
+
*
|
|
39
|
+
* Returns the modeled `Watermark`, the verbatim XML of the hosting
|
|
40
|
+
* paragraph (so the serializer can replay it byte-exact), and a
|
|
41
|
+
* reference to that paragraph so the regular body parser can skip it.
|
|
42
|
+
*/
|
|
43
|
+
declare function parseWatermark(header: XmlElement): ParsedWatermark | undefined;
|
|
44
|
+
//#endregion
|
|
45
|
+
export { ParsedWatermark, isWatermarkShape, parseWatermark };
|