@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,112 @@
|
|
|
1
|
+
import { parseRelationships, resolveRelativePath } from "../docx/relsParser.js";
|
|
2
|
+
import { unzipDocx } from "../docx/unzip.js";
|
|
3
|
+
import { deobfuscateFont, isValidFontKey } from "./fontDeobfuscation.js";
|
|
4
|
+
import { parseEmbeddedFontTable } from "./embeddedFontTable.js";
|
|
5
|
+
//#region src/fonts/embeddedFonts.ts
|
|
6
|
+
/**
|
|
7
|
+
* Embedded-font extraction.
|
|
8
|
+
*
|
|
9
|
+
* Turns the obfuscated `word/fonts/*.odttf` binaries a `.docx` carries into
|
|
10
|
+
* de-obfuscated OpenType/TrueType faces the renderer can register as
|
|
11
|
+
* `@font-face`s, so documents whose fonts are embedded (rather than installed)
|
|
12
|
+
* render in their authored fonts instead of a fallback.
|
|
13
|
+
*
|
|
14
|
+
* The core is pure and framework-free: {@link getEmbeddedFontFaces} works over
|
|
15
|
+
* already-unzipped package parts; {@link extractEmbeddedFonts} is the buffer
|
|
16
|
+
* convenience that unzips first. Neither touches the DOM. Round-trip
|
|
17
|
+
* preservation is unaffected: the serializer copies `word/fonts/*` and
|
|
18
|
+
* `fontTable.xml` from the original ZIP untouched, so this is a read-only view.
|
|
19
|
+
*
|
|
20
|
+
* Ported from eigenpal/docx-editor (see NOTICE.md).
|
|
21
|
+
*/
|
|
22
|
+
/** Pairs each embed field with the CSS weight/style it renders as. */
|
|
23
|
+
const EMBED_KINDS = [
|
|
24
|
+
{
|
|
25
|
+
ref: "embedRegular",
|
|
26
|
+
weight: 400,
|
|
27
|
+
style: "normal"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
ref: "embedBold",
|
|
31
|
+
weight: 700,
|
|
32
|
+
style: "normal"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
ref: "embedItalic",
|
|
36
|
+
weight: 400,
|
|
37
|
+
style: "italic"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
ref: "embedBoldItalic",
|
|
41
|
+
weight: 700,
|
|
42
|
+
style: "italic"
|
|
43
|
+
}
|
|
44
|
+
];
|
|
45
|
+
const FONTTABLE_RELS_BASE_PATH = "word/_rels/fontTable.xml.rels";
|
|
46
|
+
const FONTTABLE_RELS_PATH = "word/_rels/fonttable.xml.rels";
|
|
47
|
+
/** Normalize a package path for comparison: drop leading slashes, lowercase. */
|
|
48
|
+
function normalizePackagePath(path) {
|
|
49
|
+
return path.replace(/^\/+/u, "").toLowerCase();
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Find the font binary for an already-resolved package path (e.g.
|
|
53
|
+
* `word/fonts/font1.odttf`) in the unzipped font map, matched case- and
|
|
54
|
+
* leading-slash-insensitively (ZIP entry casing/prefixes vary across producers).
|
|
55
|
+
*/
|
|
56
|
+
function lookupFontData(resolvedPath, fonts) {
|
|
57
|
+
const wanted = normalizePackagePath(resolvedPath);
|
|
58
|
+
for (const [path, data] of fonts) if (normalizePackagePath(path) === wanted) return data;
|
|
59
|
+
}
|
|
60
|
+
function resolveFace(family, ref, kind, fonts, rels) {
|
|
61
|
+
const target = rels.get(ref.relId)?.target;
|
|
62
|
+
if (!target) return null;
|
|
63
|
+
const raw = lookupFontData(resolveRelativePath(FONTTABLE_RELS_BASE_PATH, target), fonts);
|
|
64
|
+
if (!raw) return null;
|
|
65
|
+
const bytes = new Uint8Array(raw);
|
|
66
|
+
const data = ref.fontKey && isValidFontKey(ref.fontKey) ? deobfuscateFont(bytes, ref.fontKey) : bytes;
|
|
67
|
+
return {
|
|
68
|
+
family,
|
|
69
|
+
style: kind.style,
|
|
70
|
+
weight: kind.weight,
|
|
71
|
+
bytes: data,
|
|
72
|
+
subsetted: ref.subsetted ?? false
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Resolve and de-obfuscate every embedded font face declared in a font table.
|
|
77
|
+
* Pure and DOM-free. Faces whose relationship or binary is missing are skipped,
|
|
78
|
+
* so the result only contains faces that produced usable bytes.
|
|
79
|
+
*/
|
|
80
|
+
function getEmbeddedFontFaces(parts) {
|
|
81
|
+
const entries = parseEmbeddedFontTable(parts.fontTableXml);
|
|
82
|
+
if (entries.length === 0) return [];
|
|
83
|
+
if (!parts.fontTableRelsXml || parts.fonts.size === 0) return [];
|
|
84
|
+
const rels = parseRelationships(parts.fontTableRelsXml);
|
|
85
|
+
const faces = [];
|
|
86
|
+
for (const entry of entries) for (const kind of EMBED_KINDS) {
|
|
87
|
+
const ref = entry[kind.ref];
|
|
88
|
+
if (!ref) continue;
|
|
89
|
+
const face = resolveFace(entry.name, ref, kind, parts.fonts, rels);
|
|
90
|
+
if (face) faces.push(face);
|
|
91
|
+
}
|
|
92
|
+
return faces;
|
|
93
|
+
}
|
|
94
|
+
function findFontTableRels(allXml) {
|
|
95
|
+
for (const [path, xml] of allXml) if (normalizePackagePath(path) === FONTTABLE_RELS_PATH) return xml;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Extract every embedded font face from a raw `.docx` buffer. Unzips the
|
|
99
|
+
* package, then resolves + de-obfuscates the faces via
|
|
100
|
+
* {@link getEmbeddedFontFaces}. Returns an empty list for documents with no
|
|
101
|
+
* embedded fonts.
|
|
102
|
+
*/
|
|
103
|
+
async function extractEmbeddedFonts(buffer) {
|
|
104
|
+
const raw = await unzipDocx(buffer);
|
|
105
|
+
return getEmbeddedFontFaces({
|
|
106
|
+
fontTableXml: raw.fontTableXml,
|
|
107
|
+
fontTableRelsXml: findFontTableRels(raw.allXml),
|
|
108
|
+
fonts: raw.fonts
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
//#endregion
|
|
112
|
+
export { extractEmbeddedFonts, getEmbeddedFontFaces };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//#region src/fonts/fontDeobfuscation.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Embedded-font de-obfuscation (ECMA-376 Part 4 §2.8.1, "Font Embedding").
|
|
4
|
+
*
|
|
5
|
+
* Word ships embedded fonts as obfuscated OpenType (`.odttf`): the first 32
|
|
6
|
+
* bytes of the font binary are XOR-scrambled with a 16-byte key; the rest of
|
|
7
|
+
* the file is untouched. The key is the font's `w:fontKey` GUID with its byte
|
|
8
|
+
* order reversed, applied to bytes 0-15 and again to bytes 16-31.
|
|
9
|
+
*
|
|
10
|
+
* Example (from the spec): GUID `001B70DC-AA60-4AD5-90EC-18A0948E1EAE` yields
|
|
11
|
+
* key bytes `AE 1E 8E 94 A0 18 EC 90 D5 4A 60 AA DC 70 1B 00`. The scheme is a
|
|
12
|
+
* pure XOR, so the same operation obfuscates and de-obfuscates.
|
|
13
|
+
*
|
|
14
|
+
* Ported from eigenpal/docx-editor (see NOTICE.md). The ODTTF scheme is an
|
|
15
|
+
* OOXML interop format, so the algorithm is reproduced faithfully.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Whether a string is a usable embedded-font obfuscation key: a 128-bit GUID,
|
|
19
|
+
* with or without braces and hyphens.
|
|
20
|
+
*/
|
|
21
|
+
declare function isValidFontKey(fontKey: string | undefined | null): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* De-obfuscate an embedded `.odttf` font into a usable OpenType/TrueType binary
|
|
24
|
+
* by XOR-ing its first 32 bytes with the reversed `w:fontKey` GUID. Returns a
|
|
25
|
+
* new array; the input is not mutated. Throws when `fontKey` is not a valid
|
|
26
|
+
* 128-bit GUID (guard with {@link isValidFontKey} first).
|
|
27
|
+
*/
|
|
28
|
+
declare function deobfuscateFont(data: Uint8Array, fontKey: string): Uint8Array<ArrayBuffer>;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { deobfuscateFont, isValidFontKey };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
//#region src/fonts/fontDeobfuscation.ts
|
|
2
|
+
/**
|
|
3
|
+
* Embedded-font de-obfuscation (ECMA-376 Part 4 §2.8.1, "Font Embedding").
|
|
4
|
+
*
|
|
5
|
+
* Word ships embedded fonts as obfuscated OpenType (`.odttf`): the first 32
|
|
6
|
+
* bytes of the font binary are XOR-scrambled with a 16-byte key; the rest of
|
|
7
|
+
* the file is untouched. The key is the font's `w:fontKey` GUID with its byte
|
|
8
|
+
* order reversed, applied to bytes 0-15 and again to bytes 16-31.
|
|
9
|
+
*
|
|
10
|
+
* Example (from the spec): GUID `001B70DC-AA60-4AD5-90EC-18A0948E1EAE` yields
|
|
11
|
+
* key bytes `AE 1E 8E 94 A0 18 EC 90 D5 4A 60 AA DC 70 1B 00`. The scheme is a
|
|
12
|
+
* pure XOR, so the same operation obfuscates and de-obfuscates.
|
|
13
|
+
*
|
|
14
|
+
* Ported from eigenpal/docx-editor (see NOTICE.md). The ODTTF scheme is an
|
|
15
|
+
* OOXML interop format, so the algorithm is reproduced faithfully.
|
|
16
|
+
*/
|
|
17
|
+
const HEADER_LENGTH = 32;
|
|
18
|
+
const KEY_LENGTH = 16;
|
|
19
|
+
/**
|
|
20
|
+
* Strip a `w:fontKey` GUID down to its 16 key bytes, in the reversed order the
|
|
21
|
+
* obfuscation applies. Returns null when the value is not a 32-hex-digit GUID.
|
|
22
|
+
*/
|
|
23
|
+
function fontKeyToReversedBytes(fontKey) {
|
|
24
|
+
const hex = fontKey.replace(/[^0-9a-fA-F]/gu, "");
|
|
25
|
+
if (hex.length !== KEY_LENGTH * 2) return null;
|
|
26
|
+
const reversed = new Uint8Array(KEY_LENGTH);
|
|
27
|
+
for (let i = 0; i < KEY_LENGTH; i++) {
|
|
28
|
+
const byte = Number.parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
|
29
|
+
if (Number.isNaN(byte)) return null;
|
|
30
|
+
reversed[KEY_LENGTH - 1 - i] = byte;
|
|
31
|
+
}
|
|
32
|
+
return reversed;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Whether a string is a usable embedded-font obfuscation key: a 128-bit GUID,
|
|
36
|
+
* with or without braces and hyphens.
|
|
37
|
+
*/
|
|
38
|
+
function isValidFontKey(fontKey) {
|
|
39
|
+
if (!fontKey) return false;
|
|
40
|
+
return fontKeyToReversedBytes(fontKey) !== null;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* De-obfuscate an embedded `.odttf` font into a usable OpenType/TrueType binary
|
|
44
|
+
* by XOR-ing its first 32 bytes with the reversed `w:fontKey` GUID. Returns a
|
|
45
|
+
* new array; the input is not mutated. Throws when `fontKey` is not a valid
|
|
46
|
+
* 128-bit GUID (guard with {@link isValidFontKey} first).
|
|
47
|
+
*/
|
|
48
|
+
function deobfuscateFont(data, fontKey) {
|
|
49
|
+
const key = fontKeyToReversedBytes(fontKey);
|
|
50
|
+
if (!key) throw new Error(`Invalid embedded-font key: "${fontKey}"`);
|
|
51
|
+
const out = new Uint8Array(data);
|
|
52
|
+
const end = Math.min(HEADER_LENGTH, out.length);
|
|
53
|
+
for (let i = 0; i < end; i++) out[i] = (out[i] ?? 0) ^ (key[i % KEY_LENGTH] ?? 0);
|
|
54
|
+
return out;
|
|
55
|
+
}
|
|
56
|
+
//#endregion
|
|
57
|
+
export { deobfuscateFont, isValidFontKey };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { FolioAIBlock, FolioAIBlockAnchor, FolioAIBlockKind, FolioAIBlockPreviewRun, FolioAIComment, FolioAIEditAppliedOperation, FolioAIEditApplyMode, FolioAIEditApplyResult, FolioAIEditOperation, FolioAIEditReviewMeta, FolioAIEditSeverity, FolioAIEditSkipReason, FolioAIEditSkippedOperation, FolioAIEditSnapshot, FolioAISignatureParty } from "./ai-edits/types.js";
|
|
2
|
+
import { applyFolioAIEditOperations } from "./ai-edits/apply.js";
|
|
3
|
+
import { document_d_exports } from "./types/document.js";
|
|
4
|
+
import { createFolioAIEditSnapshot, hashFolioAIBlockText, normalizeFolioAIBlockText } from "./ai-edits/snapshot.js";
|
|
5
|
+
import { DeriveBlockIdInput, FolioBlockId, deriveBlockId, getFolioParaIdFromBlockId, isFolioBlockId, isSequentialFolioBlockId } from "./types/block-id.js";
|
|
6
|
+
import { WordDiffSegment, diffWordSegments } from "./ai-edits/word-diff.js";
|
|
7
|
+
import { AIBarStatus, AIChatMode, AICitation, AICitationSource, AIGenerateInput, AISuggestion, AISuggestionApplyMode, AISuggestionPreset, AISuggestionSeverity, AISuggestionStatus, DEFAULT_AI_SUGGESTION_PRESETS } from "./ai-suggestions/types.js";
|
|
8
|
+
import { ApplyResult, applySuggestions } from "./ai-suggestions/apply.js";
|
|
9
|
+
import { ResolvedAnchor, isSuggestionStale, resolveSuggestionAnchor } from "./ai-suggestions/conflict.js";
|
|
10
|
+
import { PositionalText, buildPositionalText } from "./ai-suggestions/text-positions.js";
|
|
11
|
+
import { TemplatePreviewSpan, TemplatePreviewValue, TemplatePreviewValues, setTemplatePreviewValues } from "./prosemirror/plugins/templatePreviewValues.js";
|
|
12
|
+
import { DocxCompatibility } from "./docx/compatibility.js";
|
|
13
|
+
import { createDocx } from "./docx/rezip.js";
|
|
14
|
+
import { EmbeddedFont, EmbeddedFontParts, extractEmbeddedFonts, getEmbeddedFontFaces } from "./fonts/embeddedFonts.js";
|
|
15
|
+
import { CreateEmptyDocumentOptions, createEmptyDocument } from "./utils/createDocument.js";
|
|
16
|
+
import { setAISuggestionsMeta, setFocusedSuggestionMeta } from "./prosemirror/plugins/aiSuggestionDecorations.js";
|
|
17
|
+
import { scrollFolioPositionIntoView } from "./paged-layout/scrollToPmPosition.js";
|
|
18
|
+
import { getFolioCaretViewportRect, getFolioSelectionViewportRect } from "./paged-layout/selectionViewportRect.js";
|
|
19
|
+
import { AICitationRange, createAICitationDecorationsPlugin, setAICitationsMeta, setActiveCitationMeta } from "./prosemirror/plugins/aiCitationDecorations.js";
|
|
20
|
+
import { AnonymizationMatch, AnonymizationTerm, anonymizationDecorationsKey, getAnonymizationMatches, setAnonymizationTermsMeta } from "./prosemirror/plugins/anonymizationDecorations.js";
|
|
21
|
+
import { DirectiveKind, DirectiveRange, getTemplateDirectives, scanDirectives } from "./prosemirror/plugins/templateDirectives.js";
|
|
22
|
+
import { TemplateSlashMenuKeyAction, TemplateSlashMenuState, clearTemplateSlashMenu, consumeTemplateSlashQuery, getTemplateSlashMenu, resetTemplateSlashQuery, templateSlashMenuKey } from "./prosemirror/plugins/templateSlashMenu.js";
|
|
23
|
+
import { AcceptAutocompleteResult, AutocompleteSuggestionPluginOptions, AutocompleteSuggestionState, AutocompleteSuggestionStatus, AutocompleteTriggerCheck, AutocompleteTriggerOptions, AutocompleteTriggerSkipReason, DEFAULT_AUTOCOMPLETE_DEAD_ZONE_NODES, acceptAutocompleteSuggestion, acceptAutocompleteWord, appendAutocompleteToken, autocompleteSuggestionKey, autocompleteSuggestionPlugin, clearAutocompleteSuggestion, finishAutocompleteSuggestion, getAutocompleteSuggestion, shouldTriggerAutocomplete, startAutocompleteSuggestion } from "./prosemirror/plugins/autocompleteSuggestion.js";
|
|
24
|
+
import { ImageMeta, ImageRef, MarkdownOptions, MarkdownResult } from "./markdown/types.js";
|
|
25
|
+
import { fromMarkdown } from "./markdown/fromMarkdown.js";
|
|
26
|
+
import { toMarkdown, toMarkdownResult } from "./markdown/index.js";
|
|
27
|
+
type Document = document_d_exports.Document;
|
|
28
|
+
export { type AIBarStatus, type AIChatMode, type AICitation, type AICitationRange, type AICitationSource, type AIGenerateInput, type AISuggestion, type AISuggestionApplyMode, type AISuggestionPreset, type AISuggestionSeverity, type AISuggestionStatus, type AcceptAutocompleteResult, type AnonymizationMatch, type AnonymizationTerm, type ApplyResult, type AutocompleteSuggestionPluginOptions, type AutocompleteSuggestionState, type AutocompleteSuggestionStatus, type AutocompleteTriggerCheck, type AutocompleteTriggerOptions, type AutocompleteTriggerSkipReason, type CreateEmptyDocumentOptions, DEFAULT_AI_SUGGESTION_PRESETS, DEFAULT_AUTOCOMPLETE_DEAD_ZONE_NODES, type DeriveBlockIdInput, type DirectiveKind, type DirectiveRange, type Document, type DocxCompatibility, type EmbeddedFont, type EmbeddedFontParts, type FolioAIBlock, type FolioAIBlockAnchor, type FolioAIBlockKind, type FolioAIBlockPreviewRun, type FolioAIComment, type FolioAIEditAppliedOperation, type FolioAIEditApplyMode, type FolioAIEditApplyResult, type FolioAIEditOperation, type FolioAIEditReviewMeta, type FolioAIEditSeverity, type FolioAIEditSkipReason, type FolioAIEditSkippedOperation, type FolioAIEditSnapshot, type FolioAISignatureParty, type FolioBlockId, type ImageMeta, type ImageRef, type MarkdownOptions, type MarkdownResult, type PositionalText, type ResolvedAnchor, type TemplatePreviewSpan, type TemplatePreviewValue, type TemplatePreviewValues, type TemplateSlashMenuKeyAction, type TemplateSlashMenuState, type WordDiffSegment, acceptAutocompleteSuggestion, acceptAutocompleteWord, anonymizationDecorationsKey, appendAutocompleteToken, applyFolioAIEditOperations, applySuggestions, autocompleteSuggestionKey, autocompleteSuggestionPlugin, buildPositionalText, clearAutocompleteSuggestion, clearTemplateSlashMenu, consumeTemplateSlashQuery, createAICitationDecorationsPlugin, createDocx, createEmptyDocument, createFolioAIEditSnapshot, deriveBlockId, diffWordSegments, extractEmbeddedFonts, finishAutocompleteSuggestion, fromMarkdown, getAnonymizationMatches, getAutocompleteSuggestion, getEmbeddedFontFaces, getFolioCaretViewportRect, getFolioParaIdFromBlockId, getFolioSelectionViewportRect, getTemplateDirectives, getTemplateSlashMenu, hashFolioAIBlockText, isFolioBlockId, isSequentialFolioBlockId, isSuggestionStale, normalizeFolioAIBlockText, resetTemplateSlashQuery, resolveSuggestionAnchor, scanDirectives, scrollFolioPositionIntoView, setAICitationsMeta, setAISuggestionsMeta, setActiveCitationMeta, setAnonymizationTermsMeta, setFocusedSuggestionMeta, setTemplatePreviewValues, shouldTriggerAutocomplete, startAutocompleteSuggestion, templateSlashMenuKey, toMarkdown, toMarkdownResult };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createEmptyDocument } from "./utils/createDocument.js";
|
|
2
|
+
import { createDocx } from "./docx/rezip.js";
|
|
3
|
+
import { deriveBlockId, getFolioParaIdFromBlockId, isFolioBlockId, isSequentialFolioBlockId } from "./types/block-id.js";
|
|
4
|
+
import { DEFAULT_AI_SUGGESTION_PRESETS } from "./ai-suggestions/types.js";
|
|
5
|
+
import { buildPositionalText } from "./ai-suggestions/text-positions.js";
|
|
6
|
+
import { isSuggestionStale, resolveSuggestionAnchor } from "./ai-suggestions/conflict.js";
|
|
7
|
+
import { applySuggestions } from "./ai-suggestions/apply.js";
|
|
8
|
+
import { createFolioAIEditSnapshot, hashFolioAIBlockText, normalizeFolioAIBlockText } from "./ai-edits/snapshot.js";
|
|
9
|
+
import { diffWordSegments } from "./ai-edits/word-diff.js";
|
|
10
|
+
import { applyFolioAIEditOperations } from "./ai-edits/apply.js";
|
|
11
|
+
import { setAISuggestionsMeta, setFocusedSuggestionMeta } from "./prosemirror/plugins/aiSuggestionDecorations.js";
|
|
12
|
+
import { scrollFolioPositionIntoView } from "./paged-layout/scrollToPmPosition.js";
|
|
13
|
+
import { getFolioCaretViewportRect, getFolioSelectionViewportRect } from "./paged-layout/selectionViewportRect.js";
|
|
14
|
+
import { createAICitationDecorationsPlugin, setAICitationsMeta, setActiveCitationMeta } from "./prosemirror/plugins/aiCitationDecorations.js";
|
|
15
|
+
import { anonymizationDecorationsKey, getAnonymizationMatches, setAnonymizationTermsMeta } from "./prosemirror/plugins/anonymizationDecorations.js";
|
|
16
|
+
import { getTemplateDirectives, scanDirectives } from "./prosemirror/plugins/templateDirectives.js";
|
|
17
|
+
import { setTemplatePreviewValues } from "./prosemirror/plugins/templatePreviewValues.js";
|
|
18
|
+
import { clearTemplateSlashMenu, consumeTemplateSlashQuery, getTemplateSlashMenu, resetTemplateSlashQuery, templateSlashMenuKey } from "./prosemirror/plugins/templateSlashMenu.js";
|
|
19
|
+
import { DEFAULT_AUTOCOMPLETE_DEAD_ZONE_NODES, acceptAutocompleteSuggestion, acceptAutocompleteWord, appendAutocompleteToken, autocompleteSuggestionKey, autocompleteSuggestionPlugin, clearAutocompleteSuggestion, finishAutocompleteSuggestion, getAutocompleteSuggestion, shouldTriggerAutocomplete, startAutocompleteSuggestion } from "./prosemirror/plugins/autocompleteSuggestion.js";
|
|
20
|
+
import { fromMarkdown } from "./markdown/fromMarkdown.js";
|
|
21
|
+
import { toMarkdown, toMarkdownResult } from "./markdown/index.js";
|
|
22
|
+
import { extractEmbeddedFonts, getEmbeddedFontFaces } from "./fonts/embeddedFonts.js";
|
|
23
|
+
export { DEFAULT_AI_SUGGESTION_PRESETS, DEFAULT_AUTOCOMPLETE_DEAD_ZONE_NODES, acceptAutocompleteSuggestion, acceptAutocompleteWord, anonymizationDecorationsKey, appendAutocompleteToken, applyFolioAIEditOperations, applySuggestions, autocompleteSuggestionKey, autocompleteSuggestionPlugin, buildPositionalText, clearAutocompleteSuggestion, clearTemplateSlashMenu, consumeTemplateSlashQuery, createAICitationDecorationsPlugin, createDocx, createEmptyDocument, createFolioAIEditSnapshot, deriveBlockId, diffWordSegments, extractEmbeddedFonts, finishAutocompleteSuggestion, fromMarkdown, getAnonymizationMatches, getAutocompleteSuggestion, getEmbeddedFontFaces, getFolioCaretViewportRect, getFolioParaIdFromBlockId, getFolioSelectionViewportRect, getTemplateDirectives, getTemplateSlashMenu, hashFolioAIBlockText, isFolioBlockId, isSequentialFolioBlockId, isSuggestionStale, normalizeFolioAIBlockText, resetTemplateSlashQuery, resolveSuggestionAnchor, scanDirectives, scrollFolioPositionIntoView, setAICitationsMeta, setAISuggestionsMeta, setActiveCitationMeta, setAnonymizationTermsMeta, setFocusedSuggestionMeta, setTemplatePreviewValues, shouldTriggerAutocomplete, startAutocompleteSuggestion, templateSlashMenuKey, toMarkdown, toMarkdownResult };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { document_d_exports } from "../../types/document.js";
|
|
2
|
+
import { FOOTNOTE_ENTRY_MARGIN_BOTTOM, FOOTNOTE_FALLBACK_LINE_HEIGHT, FOOTNOTE_SEPARATOR_HEIGHT, FlowBlock, FootnoteContent, Measure, Page } from "../../layout-engine/types.js";
|
|
3
|
+
|
|
4
|
+
//#region src/layout-bridge/convert/footnoteLayout.d.ts
|
|
5
|
+
type MeasureBlocksFn = (blocks: FlowBlock[], contentWidth: number) => Measure[];
|
|
6
|
+
type ConvertFootnoteOptions = {
|
|
7
|
+
styles?: document_d_exports.StyleDefinitions | null;
|
|
8
|
+
theme?: document_d_exports.Theme | null;
|
|
9
|
+
measureBlocks?: MeasureBlocksFn; /** Document-wide `w:defaultTabStop` in twips — forwarded to toFlowBlocks. */
|
|
10
|
+
defaultTabStopTwips?: number;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Scan FlowBlocks for runs with footnoteRefId set.
|
|
14
|
+
* Returns a list of { footnoteId, pmPos } in document order.
|
|
15
|
+
*
|
|
16
|
+
* Recurses into table cells and text-box content so footnote references
|
|
17
|
+
* nested in tables (incl. tables-within-cells) and text boxes still reach
|
|
18
|
+
* the page-assignment step. Without this walk, inline footnote markers
|
|
19
|
+
* render inside the body but never get an entry in the per-page footnote
|
|
20
|
+
* area.
|
|
21
|
+
*/
|
|
22
|
+
declare function collectFootnoteRefs(blocks: FlowBlock[]): {
|
|
23
|
+
footnoteId: number;
|
|
24
|
+
pmPos: number;
|
|
25
|
+
}[];
|
|
26
|
+
/**
|
|
27
|
+
* After layout, determine which footnotes appear on which pages.
|
|
28
|
+
* Checks each page's fragments to see if any footnoteRef PM positions fall within.
|
|
29
|
+
*
|
|
30
|
+
* Returns Map<pageNumber, footnoteId[]> in document order.
|
|
31
|
+
*/
|
|
32
|
+
declare function mapFootnotesToPages(pages: Page[], footnoteRefs: {
|
|
33
|
+
footnoteId: number;
|
|
34
|
+
pmPos: number;
|
|
35
|
+
}[]): Map<number, number[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Convert a Footnote's content paragraphs to FlowBlocks suitable for rendering.
|
|
38
|
+
* Prepends the display number to the first run of the first paragraph.
|
|
39
|
+
*/
|
|
40
|
+
declare function convertFootnoteToContent(footnote: document_d_exports.Footnote, displayNumber: number, contentWidth: number, options?: ConvertFootnoteOptions): FootnoteContent;
|
|
41
|
+
declare function applyFootnotePresentation(blocks: FlowBlock[], displayNumber: number): FlowBlock[];
|
|
42
|
+
/**
|
|
43
|
+
* Build footnote content for all footnotes referenced in the document.
|
|
44
|
+
* Returns a Map<footnoteId, FootnoteContent>.
|
|
45
|
+
*/
|
|
46
|
+
declare function buildFootnoteContentMap(footnotes: document_d_exports.Footnote[], footnoteRefs: {
|
|
47
|
+
footnoteId: number;
|
|
48
|
+
}[], contentWidth: number, options?: ConvertFootnoteOptions): Map<number, FootnoteContent>;
|
|
49
|
+
/**
|
|
50
|
+
* Calculate per-page footnote reserved heights.
|
|
51
|
+
* Returns Map<pageNumber, reservedHeight>.
|
|
52
|
+
*/
|
|
53
|
+
declare function calculateFootnoteReservedHeights(pageFootnoteMap: Map<number, number[]>, footnoteContentMap: Map<number, {
|
|
54
|
+
height: number;
|
|
55
|
+
}>): Map<number, number>;
|
|
56
|
+
//#endregion
|
|
57
|
+
export { ConvertFootnoteOptions, FOOTNOTE_ENTRY_MARGIN_BOTTOM, FOOTNOTE_FALLBACK_LINE_HEIGHT, FOOTNOTE_SEPARATOR_HEIGHT, MeasureBlocksFn, applyFootnotePresentation, buildFootnoteContentMap, calculateFootnoteReservedHeights, collectFootnoteRefs, convertFootnoteToContent, mapFootnotesToPages };
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { DEFAULT_TEXTBOX_MARGINS, FOOTNOTE_ENTRY_MARGIN_BOTTOM, FOOTNOTE_FALLBACK_LINE_HEIGHT, FOOTNOTE_SEPARATOR_HEIGHT } from "../../layout-engine/types.js";
|
|
2
|
+
import { measureParagraph } from "../../layout-engine/measure/measureParagraph.js";
|
|
3
|
+
import { toFlowBlocks } from "./toFlowBlocks.js";
|
|
4
|
+
import { footnoteToProseDoc } from "../../prosemirror/conversion/toProseDoc.js";
|
|
5
|
+
//#region src/layout-bridge/convert/footnoteLayout.ts
|
|
6
|
+
/** Default footnote font size in points */
|
|
7
|
+
const FOOTNOTE_FONT_SIZE = 8;
|
|
8
|
+
/**
|
|
9
|
+
* Scan FlowBlocks for runs with footnoteRefId set.
|
|
10
|
+
* Returns a list of { footnoteId, pmPos } in document order.
|
|
11
|
+
*
|
|
12
|
+
* Recurses into table cells and text-box content so footnote references
|
|
13
|
+
* nested in tables (incl. tables-within-cells) and text boxes still reach
|
|
14
|
+
* the page-assignment step. Without this walk, inline footnote markers
|
|
15
|
+
* render inside the body but never get an entry in the per-page footnote
|
|
16
|
+
* area.
|
|
17
|
+
*/
|
|
18
|
+
function collectFootnoteRefs(blocks) {
|
|
19
|
+
const refs = [];
|
|
20
|
+
const walk = (containerBlocks) => {
|
|
21
|
+
for (const block of containerBlocks) if (block.kind === "paragraph") {
|
|
22
|
+
for (const run of block.runs) if (run.kind === "text" && run.footnoteRefId !== void 0) refs.push({
|
|
23
|
+
footnoteId: run.footnoteRefId,
|
|
24
|
+
pmPos: run.pmStart ?? 0
|
|
25
|
+
});
|
|
26
|
+
} else if (block.kind === "table") for (const row of block.rows) for (const cell of row.cells) walk(cell.blocks);
|
|
27
|
+
else if (block.kind === "textBox") walk(block.content);
|
|
28
|
+
};
|
|
29
|
+
walk(blocks);
|
|
30
|
+
return refs;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* After layout, determine which footnotes appear on which pages.
|
|
34
|
+
* Checks each page's fragments to see if any footnoteRef PM positions fall within.
|
|
35
|
+
*
|
|
36
|
+
* Returns Map<pageNumber, footnoteId[]> in document order.
|
|
37
|
+
*/
|
|
38
|
+
function mapFootnotesToPages(pages, footnoteRefs) {
|
|
39
|
+
const pageFootnotes = /* @__PURE__ */ new Map();
|
|
40
|
+
if (footnoteRefs.length === 0) return pageFootnotes;
|
|
41
|
+
for (const ref of footnoteRefs) for (const page of pages) {
|
|
42
|
+
let found = false;
|
|
43
|
+
for (const fragment of page.fragments) {
|
|
44
|
+
const pmStart = fragment.pmStart ?? -1;
|
|
45
|
+
const pmEnd = fragment.pmEnd ?? -1;
|
|
46
|
+
if (pmStart >= 0 && pmEnd >= 0 && ref.pmPos >= pmStart && ref.pmPos < pmEnd) {
|
|
47
|
+
const existing = pageFootnotes.get(page.number) ?? [];
|
|
48
|
+
if (!existing.includes(ref.footnoteId)) existing.push(ref.footnoteId);
|
|
49
|
+
pageFootnotes.set(page.number, existing);
|
|
50
|
+
found = true;
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
if (found) break;
|
|
55
|
+
}
|
|
56
|
+
return pageFootnotes;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Convert a Footnote's content paragraphs to FlowBlocks suitable for rendering.
|
|
60
|
+
* Prepends the display number to the first run of the first paragraph.
|
|
61
|
+
*/
|
|
62
|
+
function convertFootnoteToContent(footnote, displayNumber, contentWidth, options = {}) {
|
|
63
|
+
const proseOptions = {};
|
|
64
|
+
if (options.styles) proseOptions.styles = options.styles;
|
|
65
|
+
if (options.theme !== void 0) proseOptions.theme = options.theme;
|
|
66
|
+
const pmDoc = footnoteToProseDoc(footnote.content, proseOptions);
|
|
67
|
+
const flowOptions = {};
|
|
68
|
+
if (options.theme !== void 0) flowOptions.theme = options.theme;
|
|
69
|
+
if (options.defaultTabStopTwips !== void 0) flowOptions.defaultTabStopTwips = options.defaultTabStopTwips;
|
|
70
|
+
const blocks = applyFootnotePresentation(toFlowBlocks(pmDoc, flowOptions), displayNumber);
|
|
71
|
+
const measures = options.measureBlocks ? options.measureBlocks(blocks, contentWidth) : measureFootnoteBlocks(blocks, contentWidth);
|
|
72
|
+
let totalHeight = 0;
|
|
73
|
+
for (const measure of measures) if (measure.kind === "paragraph") totalHeight += measure.totalHeight;
|
|
74
|
+
else if (measure.kind === "table") totalHeight += measure.totalHeight;
|
|
75
|
+
else if (measure.kind === "image" || measure.kind === "textBox") totalHeight += measure.height;
|
|
76
|
+
return {
|
|
77
|
+
id: footnote.id,
|
|
78
|
+
displayNumber,
|
|
79
|
+
blocks,
|
|
80
|
+
measures,
|
|
81
|
+
height: totalHeight
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function measureFootnoteBlocks(blocks, contentWidth) {
|
|
85
|
+
return blocks.map((block) => measureFootnoteBlock(block, contentWidth));
|
|
86
|
+
}
|
|
87
|
+
function measureFootnoteBlock(block, contentWidth) {
|
|
88
|
+
switch (block.kind) {
|
|
89
|
+
case "paragraph": return measureParagraph(block, contentWidth);
|
|
90
|
+
case "table": return measureFootnoteTable(block, contentWidth);
|
|
91
|
+
case "image": return {
|
|
92
|
+
kind: "image",
|
|
93
|
+
width: block.width,
|
|
94
|
+
height: block.height
|
|
95
|
+
};
|
|
96
|
+
case "textBox": {
|
|
97
|
+
const margins = block.margins ?? DEFAULT_TEXTBOX_MARGINS;
|
|
98
|
+
const width = block.width;
|
|
99
|
+
const innerWidth = Math.max(1, width - margins.left - margins.right);
|
|
100
|
+
const innerMeasures = block.content.map((paragraph) => measureParagraph(paragraph, innerWidth));
|
|
101
|
+
let contentHeight = 0;
|
|
102
|
+
for (const measure of innerMeasures) contentHeight += measure.totalHeight;
|
|
103
|
+
return {
|
|
104
|
+
kind: "textBox",
|
|
105
|
+
width,
|
|
106
|
+
height: block.height ?? contentHeight + margins.top + margins.bottom,
|
|
107
|
+
innerMeasures
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
case "pageBreak": return { kind: "pageBreak" };
|
|
111
|
+
case "columnBreak": return { kind: "columnBreak" };
|
|
112
|
+
case "sectionBreak": return { kind: "sectionBreak" };
|
|
113
|
+
default: return block;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function resolveFootnoteTableWidth(width, widthType, contentWidth) {
|
|
117
|
+
if (!width) return;
|
|
118
|
+
if (widthType === "pct") return contentWidth * width / 5e3;
|
|
119
|
+
if (widthType === "dxa" || !widthType || widthType === "auto") return width / 1440 * 96;
|
|
120
|
+
}
|
|
121
|
+
function measureFootnoteTable(tableBlock, contentWidth) {
|
|
122
|
+
let columnWidths = tableBlock.columnWidths ?? [];
|
|
123
|
+
const explicitWidth = resolveFootnoteTableWidth(tableBlock.width, tableBlock.widthType, contentWidth);
|
|
124
|
+
if (columnWidths.length === 0) {
|
|
125
|
+
const firstRow = tableBlock.rows.at(0);
|
|
126
|
+
let colCount = 0;
|
|
127
|
+
for (const cell of firstRow?.cells ?? []) colCount += cell.colSpan ?? 1;
|
|
128
|
+
const equalWidth = (explicitWidth ?? contentWidth) / Math.max(1, colCount);
|
|
129
|
+
columnWidths = Array.from({ length: Math.max(1, colCount) }, () => equalWidth);
|
|
130
|
+
} else if (explicitWidth) {
|
|
131
|
+
const totalWidth = sumColumnWidths(columnWidths);
|
|
132
|
+
if (totalWidth > 0 && Math.abs(totalWidth - explicitWidth) > 1) {
|
|
133
|
+
const scale = explicitWidth / totalWidth;
|
|
134
|
+
columnWidths = columnWidths.map((width) => width * scale);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
const rowSpanEnds = [];
|
|
138
|
+
const rows = tableBlock.rows.map((row, rowIndex) => {
|
|
139
|
+
let columnIndex = 0;
|
|
140
|
+
const cells = row.cells.map((cell) => {
|
|
141
|
+
while ((rowSpanEnds[columnIndex] ?? 0) > rowIndex) columnIndex++;
|
|
142
|
+
const colSpan = cell.colSpan ?? 1;
|
|
143
|
+
let cellWidth = 0;
|
|
144
|
+
for (let offset = 0; offset < colSpan && columnIndex + offset < columnWidths.length; offset++) cellWidth += columnWidths[columnIndex + offset] ?? 0;
|
|
145
|
+
if (cellWidth === 0) cellWidth = cell.width ?? 100;
|
|
146
|
+
columnIndex += colSpan;
|
|
147
|
+
const padding = cell.padding ?? {
|
|
148
|
+
top: 0,
|
|
149
|
+
right: 7,
|
|
150
|
+
bottom: 0,
|
|
151
|
+
left: 7
|
|
152
|
+
};
|
|
153
|
+
const innerWidth = Math.max(1, cellWidth - padding.left - padding.right);
|
|
154
|
+
const blocks = measureFootnoteBlocks(cell.blocks, innerWidth);
|
|
155
|
+
let height = padding.top + padding.bottom;
|
|
156
|
+
for (const measure of blocks) height += getMeasureHeight(measure);
|
|
157
|
+
const cellMeasure = {
|
|
158
|
+
blocks,
|
|
159
|
+
width: cellWidth,
|
|
160
|
+
height
|
|
161
|
+
};
|
|
162
|
+
if (cell.colSpan !== void 0) cellMeasure.colSpan = cell.colSpan;
|
|
163
|
+
if (cell.rowSpan !== void 0) cellMeasure.rowSpan = cell.rowSpan;
|
|
164
|
+
if ((cell.rowSpan ?? 1) > 1) {
|
|
165
|
+
const rowSpanEnd = rowIndex + (cell.rowSpan ?? 1);
|
|
166
|
+
for (let offset = 0; offset < colSpan; offset++) rowSpanEnds[columnIndex - colSpan + offset] = rowSpanEnd;
|
|
167
|
+
}
|
|
168
|
+
return cellMeasure;
|
|
169
|
+
});
|
|
170
|
+
let contentHeight = 0;
|
|
171
|
+
for (const cell of cells) contentHeight = Math.max(contentHeight, cell.height);
|
|
172
|
+
const explicitHeight = row.height;
|
|
173
|
+
let height = contentHeight;
|
|
174
|
+
if (explicitHeight !== void 0 && row.heightRule === "exact") height = explicitHeight;
|
|
175
|
+
else if (explicitHeight !== void 0) height = Math.max(contentHeight, explicitHeight);
|
|
176
|
+
return {
|
|
177
|
+
cells,
|
|
178
|
+
height
|
|
179
|
+
};
|
|
180
|
+
});
|
|
181
|
+
let totalHeight = 0;
|
|
182
|
+
for (const row of rows) totalHeight += row.height;
|
|
183
|
+
return {
|
|
184
|
+
kind: "table",
|
|
185
|
+
rows,
|
|
186
|
+
columnWidths,
|
|
187
|
+
totalWidth: sumColumnWidths(columnWidths) || explicitWidth || contentWidth,
|
|
188
|
+
totalHeight
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
function sumColumnWidths(columnWidths) {
|
|
192
|
+
let total = 0;
|
|
193
|
+
for (const width of columnWidths) total += width;
|
|
194
|
+
return total;
|
|
195
|
+
}
|
|
196
|
+
function getMeasureHeight(measure) {
|
|
197
|
+
if (measure.kind === "paragraph" || measure.kind === "table") return measure.totalHeight;
|
|
198
|
+
if (measure.kind === "image" || measure.kind === "textBox") return measure.height;
|
|
199
|
+
return 0;
|
|
200
|
+
}
|
|
201
|
+
function applyFootnotePresentation(blocks, displayNumber) {
|
|
202
|
+
if (blocks.length === 0) return [{
|
|
203
|
+
kind: "paragraph",
|
|
204
|
+
id: `fn-empty-${displayNumber}`,
|
|
205
|
+
runs: [{
|
|
206
|
+
kind: "text",
|
|
207
|
+
text: `${displayNumber} `,
|
|
208
|
+
fontSize: FOOTNOTE_FONT_SIZE,
|
|
209
|
+
superscript: true
|
|
210
|
+
}]
|
|
211
|
+
}];
|
|
212
|
+
const output = blocks.map(applyFootnoteBlockPresentation);
|
|
213
|
+
const first = output[0];
|
|
214
|
+
if (first?.kind === "paragraph") output[0] = {
|
|
215
|
+
...first,
|
|
216
|
+
runs: [createFootnoteNumberRun(displayNumber, first), ...first.runs]
|
|
217
|
+
};
|
|
218
|
+
else output.unshift({
|
|
219
|
+
kind: "paragraph",
|
|
220
|
+
id: `fn-number-${displayNumber}`,
|
|
221
|
+
runs: [{
|
|
222
|
+
kind: "text",
|
|
223
|
+
text: `${displayNumber} `,
|
|
224
|
+
fontSize: FOOTNOTE_FONT_SIZE,
|
|
225
|
+
superscript: true
|
|
226
|
+
}]
|
|
227
|
+
});
|
|
228
|
+
return output;
|
|
229
|
+
}
|
|
230
|
+
function createFootnoteNumberRun(displayNumber, paragraph) {
|
|
231
|
+
const firstTextRun = paragraph.runs.find((run) => run.kind === "text");
|
|
232
|
+
const firstFormattedRun = paragraph.runs.find((run) => run.kind === "text" || run.kind === "tab" || run.kind === "field");
|
|
233
|
+
const numberRun = {
|
|
234
|
+
kind: "text",
|
|
235
|
+
text: firstTextRun?.text.match(/^\s/u) ? `${displayNumber}` : `${displayNumber} `,
|
|
236
|
+
fontSize: firstFormattedRun?.fontSize ?? paragraph.attrs?.defaultFontSize ?? FOOTNOTE_FONT_SIZE,
|
|
237
|
+
superscript: true
|
|
238
|
+
};
|
|
239
|
+
const fontFamily = firstFormattedRun?.fontFamily ?? paragraph.attrs?.defaultFontFamily;
|
|
240
|
+
if (fontFamily) numberRun.fontFamily = fontFamily;
|
|
241
|
+
return numberRun;
|
|
242
|
+
}
|
|
243
|
+
function applyFootnoteBlockPresentation(block) {
|
|
244
|
+
if (block.kind === "paragraph") return applyFootnoteParagraphPresentation(block);
|
|
245
|
+
if (block.kind === "table") return {
|
|
246
|
+
...block,
|
|
247
|
+
rows: block.rows.map((row) => ({
|
|
248
|
+
...row,
|
|
249
|
+
cells: row.cells.map((cell) => ({
|
|
250
|
+
...cell,
|
|
251
|
+
blocks: cell.blocks.map(applyFootnoteBlockPresentation)
|
|
252
|
+
}))
|
|
253
|
+
}))
|
|
254
|
+
};
|
|
255
|
+
if (block.kind === "textBox") return {
|
|
256
|
+
...block,
|
|
257
|
+
content: block.content.map(applyFootnoteParagraphPresentation)
|
|
258
|
+
};
|
|
259
|
+
return block;
|
|
260
|
+
}
|
|
261
|
+
function applyFootnoteParagraphPresentation(block) {
|
|
262
|
+
return {
|
|
263
|
+
...block,
|
|
264
|
+
runs: block.runs.map(applyFootnoteRunPresentation)
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
function applyFootnoteRunPresentation(run) {
|
|
268
|
+
if ((run.kind === "text" || run.kind === "tab" || run.kind === "field") && run.fontSize === void 0) return {
|
|
269
|
+
...run,
|
|
270
|
+
fontSize: FOOTNOTE_FONT_SIZE
|
|
271
|
+
};
|
|
272
|
+
return run;
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Build footnote content for all footnotes referenced in the document.
|
|
276
|
+
* Returns a Map<footnoteId, FootnoteContent>.
|
|
277
|
+
*/
|
|
278
|
+
function buildFootnoteContentMap(footnotes, footnoteRefs, contentWidth, options = {}) {
|
|
279
|
+
const contentMap = /* @__PURE__ */ new Map();
|
|
280
|
+
const footnoteById = /* @__PURE__ */ new Map();
|
|
281
|
+
for (const fn of footnotes) if (fn.noteType === "normal") footnoteById.set(fn.id, fn);
|
|
282
|
+
let displayNumber = 1;
|
|
283
|
+
const seen = /* @__PURE__ */ new Set();
|
|
284
|
+
for (const ref of footnoteRefs) {
|
|
285
|
+
if (seen.has(ref.footnoteId)) continue;
|
|
286
|
+
seen.add(ref.footnoteId);
|
|
287
|
+
const footnote = footnoteById.get(ref.footnoteId);
|
|
288
|
+
if (!footnote) continue;
|
|
289
|
+
const content = convertFootnoteToContent(footnote, displayNumber, contentWidth, options);
|
|
290
|
+
contentMap.set(ref.footnoteId, content);
|
|
291
|
+
displayNumber++;
|
|
292
|
+
}
|
|
293
|
+
return contentMap;
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Calculate per-page footnote reserved heights.
|
|
297
|
+
* Returns Map<pageNumber, reservedHeight>.
|
|
298
|
+
*/
|
|
299
|
+
function calculateFootnoteReservedHeights(pageFootnoteMap, footnoteContentMap) {
|
|
300
|
+
const reserved = /* @__PURE__ */ new Map();
|
|
301
|
+
for (const [pageNumber, footnoteIds] of pageFootnoteMap) {
|
|
302
|
+
let totalHeight = 0;
|
|
303
|
+
for (const fnId of footnoteIds) {
|
|
304
|
+
const content = footnoteContentMap.get(fnId);
|
|
305
|
+
if (content) totalHeight += content.height;
|
|
306
|
+
}
|
|
307
|
+
if (totalHeight > 0) {
|
|
308
|
+
totalHeight += 12;
|
|
309
|
+
totalHeight += footnoteIds.length * 0;
|
|
310
|
+
reserved.set(pageNumber, totalHeight);
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
return reserved;
|
|
314
|
+
}
|
|
315
|
+
//#endregion
|
|
316
|
+
export { FOOTNOTE_ENTRY_MARGIN_BOTTOM, FOOTNOTE_FALLBACK_LINE_HEIGHT, FOOTNOTE_SEPARATOR_HEIGHT, applyFootnotePresentation, buildFootnoteContentMap, calculateFootnoteReservedHeights, collectFootnoteRefs, convertFootnoteToContent, mapFootnotesToPages };
|