@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,280 @@
|
|
|
1
|
+
import { setMeasureProvider } from "./measureProvider.js";
|
|
2
|
+
import { buildFontString, getResolvedData, ptToPx } from "./measureHelpers.js";
|
|
3
|
+
import { getCachedFontMetrics, getCachedTextWidth, getTextWidthCacheGeneration, setCachedFontMetrics, setCachedTextWidth } from "./cache.js";
|
|
4
|
+
import { hasCjk, isCjkCodePoint, segmentByScript } from "../../utils/scriptSegments.js";
|
|
5
|
+
import { canPrefetchMeasurement, prefetchMeasurement } from "./measureWorker.js";
|
|
6
|
+
import { WORKER_FONT_FINGERPRINT_TEXT, countCodePoints } from "./measureWorkerProtocol.js";
|
|
7
|
+
import { panic } from "better-result";
|
|
8
|
+
//#region src/layout-engine/measure/measureContainer.ts
|
|
9
|
+
/**
|
|
10
|
+
* Canvas-backed text measurement (the default MeasureProvider).
|
|
11
|
+
*
|
|
12
|
+
* Uses the HTML5 Canvas API to measure text runs and calculate typography
|
|
13
|
+
* metrics. Canvas-based measurement is more accurate and performant than
|
|
14
|
+
* DOM-based approaches. This module touches canvas/`document`/the worker, so it
|
|
15
|
+
* lives off the layout engine's import path: the engine measures through the
|
|
16
|
+
* pure `measureProvider.ts` seam, and a composition root installs this backend
|
|
17
|
+
* via `installCanvasMeasureProvider()` (the React editor and the bun test
|
|
18
|
+
* preload do so).
|
|
19
|
+
*
|
|
20
|
+
* Typography conventions (matching Word behavior):
|
|
21
|
+
* - ascent ≈ fontSize * 0.8 (baseline to top)
|
|
22
|
+
* - descent ≈ fontSize * 0.2 (baseline to bottom)
|
|
23
|
+
* - lineHeight from font metrics (fontBoundingBoxAscent + fontBoundingBoxDescent),
|
|
24
|
+
* falling back to fontSize * 1.0 (OOXML spec default single spacing)
|
|
25
|
+
*/
|
|
26
|
+
const DEFAULT_LINE_HEIGHT_MULTIPLIER = 1;
|
|
27
|
+
const DEFAULT_ASCENT_RATIO = .8;
|
|
28
|
+
const DEFAULT_DESCENT_RATIO = .2;
|
|
29
|
+
let canvasContext = null;
|
|
30
|
+
const workerFontFingerprintCache = /* @__PURE__ */ new Map();
|
|
31
|
+
/**
|
|
32
|
+
* Get or create a canvas 2D context for text measurement
|
|
33
|
+
*/
|
|
34
|
+
function getCanvasContext() {
|
|
35
|
+
if (!canvasContext) {
|
|
36
|
+
const canvas = typeof document !== "undefined" ? document.createElement("canvas") : null;
|
|
37
|
+
if (!canvas) panic("Canvas not available. Ensure this runs in a DOM environment.");
|
|
38
|
+
canvasContext = canvas.getContext("2d");
|
|
39
|
+
if (!canvasContext) panic("Failed to get 2D context from canvas");
|
|
40
|
+
}
|
|
41
|
+
return canvasContext;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Reset the canvas context (useful for testing)
|
|
45
|
+
*/
|
|
46
|
+
function resetCanvasContext() {
|
|
47
|
+
canvasContext = null;
|
|
48
|
+
}
|
|
49
|
+
function getWorkerFontFingerprintWidth(ctx, font) {
|
|
50
|
+
const generation = getTextWidthCacheGeneration();
|
|
51
|
+
const cached = workerFontFingerprintCache.get(font);
|
|
52
|
+
if (cached?.generation === generation) return cached.width;
|
|
53
|
+
ctx.font = font;
|
|
54
|
+
const width = ctx.measureText(WORKER_FONT_FINGERPRINT_TEXT).width;
|
|
55
|
+
workerFontFingerprintCache.set(font, {
|
|
56
|
+
generation,
|
|
57
|
+
width
|
|
58
|
+
});
|
|
59
|
+
return width;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Get typography metrics for a given font size and family
|
|
63
|
+
*
|
|
64
|
+
* Uses Canvas TextMetrics API when available for precise metrics,
|
|
65
|
+
* falls back to ratio-based approximations.
|
|
66
|
+
*/
|
|
67
|
+
function canvasGetFontMetrics(style) {
|
|
68
|
+
const fontSize = style.fontSize ?? 11;
|
|
69
|
+
const fontFamily = style.fontFamily ?? "Calibri";
|
|
70
|
+
const bold = style.bold ?? false;
|
|
71
|
+
const italic = style.italic ?? false;
|
|
72
|
+
const fontVariant = style.fontVariant;
|
|
73
|
+
const cached = getCachedFontMetrics(fontFamily, fontSize, bold, italic, fontVariant);
|
|
74
|
+
if (cached !== void 0) return {
|
|
75
|
+
fontSize,
|
|
76
|
+
ascent: cached.ascent,
|
|
77
|
+
descent: cached.descent,
|
|
78
|
+
lineHeight: cached.lineHeight,
|
|
79
|
+
fontFamily,
|
|
80
|
+
singleLineRatio: cached.singleLineRatio
|
|
81
|
+
};
|
|
82
|
+
const fontSizePx = ptToPx(fontSize);
|
|
83
|
+
let ascent = fontSizePx * DEFAULT_ASCENT_RATIO;
|
|
84
|
+
let descent = fontSizePx * DEFAULT_DESCENT_RATIO;
|
|
85
|
+
let lineHeight = fontSizePx * DEFAULT_LINE_HEIGHT_MULTIPLIER;
|
|
86
|
+
try {
|
|
87
|
+
const ctx = getCanvasContext();
|
|
88
|
+
ctx.font = buildFontString(style);
|
|
89
|
+
const metrics = ctx.measureText("Hg");
|
|
90
|
+
if (typeof metrics.actualBoundingBoxAscent === "number" && typeof metrics.actualBoundingBoxDescent === "number") {
|
|
91
|
+
ascent = metrics.actualBoundingBoxAscent;
|
|
92
|
+
descent = metrics.actualBoundingBoxDescent;
|
|
93
|
+
}
|
|
94
|
+
} catch {}
|
|
95
|
+
lineHeight = Math.max(lineHeight, ascent + descent);
|
|
96
|
+
const singleLineRatio = getResolvedData(fontFamily).singleLineRatio;
|
|
97
|
+
const result = {
|
|
98
|
+
fontSize,
|
|
99
|
+
ascent,
|
|
100
|
+
descent,
|
|
101
|
+
lineHeight,
|
|
102
|
+
fontFamily,
|
|
103
|
+
singleLineRatio
|
|
104
|
+
};
|
|
105
|
+
setCachedFontMetrics(fontFamily, fontSize, bold, italic, result, fontVariant);
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Measure the width of a text string with specific styling
|
|
110
|
+
*
|
|
111
|
+
* @param text - The text to measure
|
|
112
|
+
* @param style - Font styling properties
|
|
113
|
+
* @returns Width in pixels
|
|
114
|
+
*/
|
|
115
|
+
function canvasMeasureTextWidth(text, style) {
|
|
116
|
+
if (!text) return 0;
|
|
117
|
+
const measuredText = applyTextTransform(text, style);
|
|
118
|
+
if (style.eastAsiaFontFamily && !style.letterSpacing && hasCjk(measuredText)) return measureMixedScriptWidth(measuredText, style);
|
|
119
|
+
const ctx = getCanvasContext();
|
|
120
|
+
const font = buildFontString(style);
|
|
121
|
+
const letterSpacing = style.letterSpacing ?? 0;
|
|
122
|
+
const horizontalScale = getHorizontalScaleFactor(style);
|
|
123
|
+
const fontCacheKey = `${font}|scale:${horizontalScale}`;
|
|
124
|
+
const cached = getCachedTextWidth(measuredText, fontCacheKey, letterSpacing);
|
|
125
|
+
if (cached !== void 0) return cached;
|
|
126
|
+
ctx.font = font;
|
|
127
|
+
let width = ctx.measureText(measuredText).width;
|
|
128
|
+
if (letterSpacing) {
|
|
129
|
+
const codePoints = countCodePoints(measuredText);
|
|
130
|
+
if (codePoints > 1) width += letterSpacing * (codePoints - 1);
|
|
131
|
+
}
|
|
132
|
+
const scaledWidth = width * horizontalScale;
|
|
133
|
+
setCachedTextWidth(measuredText, fontCacheKey, letterSpacing, scaledWidth);
|
|
134
|
+
if (!canPrefetchMeasurement()) return scaledWidth;
|
|
135
|
+
const fontFingerprintWidth = getWorkerFontFingerprintWidth(ctx, font);
|
|
136
|
+
prefetchMeasurement(measuredText, font, letterSpacing, horizontalScale, fontCacheKey, fontFingerprintWidth);
|
|
137
|
+
prefetchBinarySearchProbes(measuredText, font, fontCacheKey, fontFingerprintWidth, letterSpacing, horizontalScale);
|
|
138
|
+
return scaledWidth;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Build a glyph-advance-only style for one script segment: keep the properties
|
|
142
|
+
* that change advance width (family, size, bold/italic, small-caps) and drop
|
|
143
|
+
* letter spacing, horizontal scale, transform, and the EA font so the segment
|
|
144
|
+
* takes the single-font path (no double-counting, no recursion).
|
|
145
|
+
*/
|
|
146
|
+
function glyphAdvanceStyle(style, fontFamily) {
|
|
147
|
+
const result = {};
|
|
148
|
+
if (fontFamily !== void 0) result.fontFamily = fontFamily;
|
|
149
|
+
if (style.fontSize !== void 0) result.fontSize = style.fontSize;
|
|
150
|
+
if (style.bold !== void 0) result.bold = style.bold;
|
|
151
|
+
if (style.italic !== void 0) result.italic = style.italic;
|
|
152
|
+
if (style.fontVariant !== void 0) result.fontVariant = style.fontVariant;
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Width of text whose CJK code points use `style.eastAsiaFontFamily` and whose
|
|
157
|
+
* other code points use `style.fontFamily`. Each script segment is measured
|
|
158
|
+
* with its own font (reusing the single-font cache); letter spacing and
|
|
159
|
+
* horizontal scale are applied once over the whole string so the total matches
|
|
160
|
+
* the painter, which renders the same segments as sibling spans.
|
|
161
|
+
*/
|
|
162
|
+
function measureMixedScriptWidth(measuredText, style) {
|
|
163
|
+
const letterSpacing = style.letterSpacing ?? 0;
|
|
164
|
+
const horizontalScale = getHorizontalScaleFactor(style);
|
|
165
|
+
let glyphWidth = 0;
|
|
166
|
+
for (const segment of segmentByScript(measuredText)) {
|
|
167
|
+
const fontFamily = segment.isCjk ? style.eastAsiaFontFamily : style.fontFamily;
|
|
168
|
+
glyphWidth += canvasMeasureTextWidth(segment.text, glyphAdvanceStyle(style, fontFamily));
|
|
169
|
+
}
|
|
170
|
+
let width = glyphWidth;
|
|
171
|
+
if (letterSpacing) {
|
|
172
|
+
const codePoints = countCodePoints(measuredText);
|
|
173
|
+
if (codePoints > 1) width += letterSpacing * (codePoints - 1);
|
|
174
|
+
}
|
|
175
|
+
return width * horizontalScale;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Speculatively enqueue the slice lengths that a subsequent
|
|
179
|
+
* `findMaxFittingLength` binary search is likely to probe. We pick the
|
|
180
|
+
* geometric series (full, half, quarter, eighth) which covers the
|
|
181
|
+
* majority of probe points the binary search uses, without flooding
|
|
182
|
+
* the worker for runs that will never trigger a line break.
|
|
183
|
+
*
|
|
184
|
+
* The worker is racing the main thread here: if the main thread asks
|
|
185
|
+
* for slice(0, n/2) before the worker has answered, the cache miss
|
|
186
|
+
* pays the main-thread cost as usual. When the worker wins, that probe
|
|
187
|
+
* lands on a hit.
|
|
188
|
+
*/
|
|
189
|
+
function prefetchBinarySearchProbes(text, font, fontCacheKey, fontFingerprintWidth, letterSpacing, horizontalScale) {
|
|
190
|
+
if (text.length < 4) return;
|
|
191
|
+
for (let denom = 2; denom <= 8; denom *= 2) {
|
|
192
|
+
const len = Math.floor(text.length / denom);
|
|
193
|
+
if (len < 2) break;
|
|
194
|
+
prefetchMeasurement(text.slice(0, len), font, letterSpacing, horizontalScale, fontCacheKey, fontFingerprintWidth);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Measure text and return full metrics
|
|
199
|
+
*/
|
|
200
|
+
function canvasMeasureText(text, style) {
|
|
201
|
+
const width = canvasMeasureTextWidth(text, style);
|
|
202
|
+
const metrics = canvasGetFontMetrics(style);
|
|
203
|
+
return {
|
|
204
|
+
width,
|
|
205
|
+
height: metrics.ascent + metrics.descent,
|
|
206
|
+
ascent: metrics.ascent,
|
|
207
|
+
descent: metrics.descent
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Measure a run of text and return per-character widths for click positioning
|
|
212
|
+
*
|
|
213
|
+
* @param text - The text to measure
|
|
214
|
+
* @param style - Font styling properties
|
|
215
|
+
* @returns Run measurement with width and per-character widths
|
|
216
|
+
*/
|
|
217
|
+
function canvasMeasureRun(text, style) {
|
|
218
|
+
const metrics = canvasGetFontMetrics(style);
|
|
219
|
+
if (!text) return {
|
|
220
|
+
width: 0,
|
|
221
|
+
charWidths: [],
|
|
222
|
+
metrics
|
|
223
|
+
};
|
|
224
|
+
const ctx = getCanvasContext();
|
|
225
|
+
const baseFont = buildFontString(style);
|
|
226
|
+
ctx.font = baseFont;
|
|
227
|
+
const eastAsiaFont = style.eastAsiaFontFamily !== void 0 && !style.letterSpacing ? buildFontString({
|
|
228
|
+
...style,
|
|
229
|
+
fontFamily: style.eastAsiaFontFamily
|
|
230
|
+
}) : void 0;
|
|
231
|
+
const letterSpacing = style.letterSpacing ?? 0;
|
|
232
|
+
const scale = getHorizontalScaleFactor(style);
|
|
233
|
+
const charWidths = [];
|
|
234
|
+
let totalWidth = 0;
|
|
235
|
+
let offset = 0;
|
|
236
|
+
for (const char of text) {
|
|
237
|
+
const cp = char.codePointAt(0);
|
|
238
|
+
const measured = applyTextTransform(char, style);
|
|
239
|
+
if (eastAsiaFont !== void 0) ctx.font = isCjkCodePoint(cp) ? eastAsiaFont : baseFont;
|
|
240
|
+
let charWidth = ctx.measureText(measured).width;
|
|
241
|
+
if (letterSpacing && offset + char.length < text.length) charWidth += letterSpacing;
|
|
242
|
+
charWidth *= scale;
|
|
243
|
+
charWidths.push(charWidth);
|
|
244
|
+
if (char.length === 2) charWidths.push(0);
|
|
245
|
+
totalWidth += charWidth;
|
|
246
|
+
offset += char.length;
|
|
247
|
+
}
|
|
248
|
+
return {
|
|
249
|
+
width: totalWidth,
|
|
250
|
+
charWidths,
|
|
251
|
+
metrics
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Default provider backed by the canvas measurement functions above.
|
|
256
|
+
*/
|
|
257
|
+
const canvasMeasureProvider = {
|
|
258
|
+
getFontMetrics: canvasGetFontMetrics,
|
|
259
|
+
measureTextWidth: canvasMeasureTextWidth,
|
|
260
|
+
measureText: canvasMeasureText,
|
|
261
|
+
measureRun: canvasMeasureRun
|
|
262
|
+
};
|
|
263
|
+
/**
|
|
264
|
+
* Install the canvas backend as the active MeasureProvider. Called once at each
|
|
265
|
+
* composition root (the React editor's layout pipeline and the bun test
|
|
266
|
+
* preload) before any layout runs. Explicit call, not a module side effect, so
|
|
267
|
+
* importing this module never silently swaps the active provider.
|
|
268
|
+
*/
|
|
269
|
+
const installCanvasMeasureProvider = () => {
|
|
270
|
+
setMeasureProvider(canvasMeasureProvider);
|
|
271
|
+
};
|
|
272
|
+
function applyTextTransform(text, style) {
|
|
273
|
+
if (style.textTransform === "uppercase") return text.toLocaleUpperCase();
|
|
274
|
+
return text;
|
|
275
|
+
}
|
|
276
|
+
function getHorizontalScaleFactor(style) {
|
|
277
|
+
return (style.horizontalScale ?? 100) / 100;
|
|
278
|
+
}
|
|
279
|
+
//#endregion
|
|
280
|
+
export { canvasMeasureProvider, getCanvasContext, installCanvasMeasureProvider, resetCanvasContext };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { RunFormatting } from "../types.js";
|
|
2
|
+
import { FontStyle } from "./measureTypes.js";
|
|
3
|
+
|
|
4
|
+
//#region src/layout-engine/measure/measureHelpers.d.ts
|
|
5
|
+
declare const DEFAULT_FONT_SIZE = 11;
|
|
6
|
+
declare const DEFAULT_FONT_FAMILY = "Calibri";
|
|
7
|
+
/**
|
|
8
|
+
* Build a measurement `FontStyle` from a run's formatting. Single source of
|
|
9
|
+
* truth for run → FontStyle so every measurement path (layout line-breaking,
|
|
10
|
+
* click-to-position, selection rects) carries the same fields — notably
|
|
11
|
+
* `eastAsiaFontFamily`, which must reach the measurer for CJK click/selection
|
|
12
|
+
* offsets to match what was wrapped and painted. Callers pass their own family
|
|
13
|
+
* and size fallbacks for runs that declare neither.
|
|
14
|
+
*/
|
|
15
|
+
declare function buildRunFontStyle(run: RunFormatting, fallbackFontFamily: string, fallbackFontSize: number): FontStyle;
|
|
16
|
+
/** Cached resolved font data (CSS fallback + single-line ratio) */
|
|
17
|
+
type ResolvedFontCache = {
|
|
18
|
+
cssFallback: string;
|
|
19
|
+
singleLineRatio: number;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Get the resolved font data for a font family, with caching.
|
|
23
|
+
*/
|
|
24
|
+
declare function getResolvedData(fontFamily: string): ResolvedFontCache;
|
|
25
|
+
/**
|
|
26
|
+
* Build a CSS font string from styling properties
|
|
27
|
+
*
|
|
28
|
+
* Font sizes are in points and need to be converted to pixels for canvas.
|
|
29
|
+
* 1pt = 96/72 px ≈ 1.333px at standard web DPI.
|
|
30
|
+
*
|
|
31
|
+
* Uses the font resolver to get category-appropriate fallback stacks
|
|
32
|
+
* (serif fonts get serif fallbacks, sans-serif get sans-serif, etc.)
|
|
33
|
+
* matching the same stacks used in rendering for consistent measurements.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* buildFontString({ fontFamily: "Arial", fontSize: 12, bold: true })
|
|
37
|
+
* // Returns: "800 16px Arial, Arimo, Helvetica, sans-serif" (12pt = 16px)
|
|
38
|
+
*/
|
|
39
|
+
declare function buildFontString(style: FontStyle): string;
|
|
40
|
+
/**
|
|
41
|
+
* Find the character offset at a given X position within a text run
|
|
42
|
+
*
|
|
43
|
+
* @param x - X position relative to run start
|
|
44
|
+
* @param charWidths - Per-character widths from measureRun
|
|
45
|
+
* @returns Character offset (0-based index)
|
|
46
|
+
*/
|
|
47
|
+
declare function findCharacterAtX(x: number, charWidths: number[]): number;
|
|
48
|
+
/**
|
|
49
|
+
* Get the X position of a character offset within a text run
|
|
50
|
+
*
|
|
51
|
+
* @param offset - Character offset (0-based index)
|
|
52
|
+
* @param charWidths - Per-character widths from measureRun
|
|
53
|
+
* @returns X position in pixels
|
|
54
|
+
*/
|
|
55
|
+
declare function getXForCharacter(offset: number, charWidths: number[]): number;
|
|
56
|
+
/**
|
|
57
|
+
* Convert twips to pixels
|
|
58
|
+
*/
|
|
59
|
+
declare function twipsToPx(twips: number): number;
|
|
60
|
+
/**
|
|
61
|
+
* Convert pixels to twips
|
|
62
|
+
*/
|
|
63
|
+
declare function pxToTwips(px: number): number;
|
|
64
|
+
/**
|
|
65
|
+
* Convert points to pixels
|
|
66
|
+
*/
|
|
67
|
+
declare function ptToPx(pt: number): number;
|
|
68
|
+
/**
|
|
69
|
+
* Convert pixels to points
|
|
70
|
+
*/
|
|
71
|
+
declare function pxToPt(px: number): number;
|
|
72
|
+
/**
|
|
73
|
+
* Convert OOXML half-points to pixels
|
|
74
|
+
* OOXML font sizes are in half-points (24 = 12pt)
|
|
75
|
+
*/
|
|
76
|
+
declare function halfPtToPx(halfPt: number): number;
|
|
77
|
+
/**
|
|
78
|
+
* Convert pixels to OOXML half-points
|
|
79
|
+
*/
|
|
80
|
+
declare function pxToHalfPt(px: number): number;
|
|
81
|
+
//#endregion
|
|
82
|
+
export { DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, buildFontString, buildRunFontStyle, findCharacterAtX, getResolvedData, getXForCharacter, halfPtToPx, ptToPx, pxToHalfPt, pxToPt, pxToTwips, twipsToPx };
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { resolveFontFamily } from "../../utils/fontResolver.js";
|
|
2
|
+
import "../../utils/fontWeights.js";
|
|
3
|
+
//#region src/layout-engine/measure/measureHelpers.ts
|
|
4
|
+
/**
|
|
5
|
+
* Pure measurement helpers — no canvas, no DOM, no worker.
|
|
6
|
+
*
|
|
7
|
+
* Unit conversions, font-string construction, run → FontStyle mapping, and
|
|
8
|
+
* char-offset geometry. The layout engine imports these directly so it never
|
|
9
|
+
* transitively pulls the canvas measurement backend; the canvas implementation
|
|
10
|
+
* (`measureContainer.ts`) consumes them too.
|
|
11
|
+
*/
|
|
12
|
+
const TWIPS_PER_INCH = 1440;
|
|
13
|
+
const PX_PER_INCH = 96;
|
|
14
|
+
const TWIPS_PER_PX = TWIPS_PER_INCH / PX_PER_INCH;
|
|
15
|
+
const DEFAULT_FONT_SIZE = 11;
|
|
16
|
+
const DEFAULT_FONT_FAMILY = "Calibri";
|
|
17
|
+
/**
|
|
18
|
+
* Build a measurement `FontStyle` from a run's formatting. Single source of
|
|
19
|
+
* truth for run → FontStyle so every measurement path (layout line-breaking,
|
|
20
|
+
* click-to-position, selection rects) carries the same fields — notably
|
|
21
|
+
* `eastAsiaFontFamily`, which must reach the measurer for CJK click/selection
|
|
22
|
+
* offsets to match what was wrapped and painted. Callers pass their own family
|
|
23
|
+
* and size fallbacks for runs that declare neither.
|
|
24
|
+
*/
|
|
25
|
+
function buildRunFontStyle(run, fallbackFontFamily, fallbackFontSize) {
|
|
26
|
+
return {
|
|
27
|
+
fontFamily: run.fontFamily ?? fallbackFontFamily,
|
|
28
|
+
...run.eastAsiaFontFamily !== void 0 ? { eastAsiaFontFamily: run.eastAsiaFontFamily } : {},
|
|
29
|
+
fontSize: run.fontSize ?? fallbackFontSize,
|
|
30
|
+
...run.bold !== void 0 ? { bold: run.bold } : {},
|
|
31
|
+
...run.italic !== void 0 ? { italic: run.italic } : {},
|
|
32
|
+
...run.letterSpacing !== void 0 ? { letterSpacing: run.letterSpacing } : {},
|
|
33
|
+
...run.allCaps ? { textTransform: "uppercase" } : {},
|
|
34
|
+
...run.smallCaps ? { fontVariant: "small-caps" } : {},
|
|
35
|
+
...run.horizontalScale !== void 0 ? { horizontalScale: run.horizontalScale } : {}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Cache for resolved font data */
|
|
39
|
+
const fontResolvedCache = /* @__PURE__ */ new Map();
|
|
40
|
+
/**
|
|
41
|
+
* Get the resolved font data for a font family, with caching.
|
|
42
|
+
*/
|
|
43
|
+
function getResolvedData(fontFamily) {
|
|
44
|
+
let cached = fontResolvedCache.get(fontFamily);
|
|
45
|
+
if (cached === void 0) {
|
|
46
|
+
const resolved = resolveFontFamily(fontFamily);
|
|
47
|
+
cached = {
|
|
48
|
+
cssFallback: resolved.cssFallback,
|
|
49
|
+
singleLineRatio: resolved.singleLineRatio
|
|
50
|
+
};
|
|
51
|
+
fontResolvedCache.set(fontFamily, cached);
|
|
52
|
+
}
|
|
53
|
+
return cached;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get the CSS fallback string for a font family, with caching.
|
|
57
|
+
*/
|
|
58
|
+
function getResolvedFallback(fontFamily) {
|
|
59
|
+
return getResolvedData(fontFamily).cssFallback;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Build a CSS font string from styling properties
|
|
63
|
+
*
|
|
64
|
+
* Font sizes are in points and need to be converted to pixels for canvas.
|
|
65
|
+
* 1pt = 96/72 px ≈ 1.333px at standard web DPI.
|
|
66
|
+
*
|
|
67
|
+
* Uses the font resolver to get category-appropriate fallback stacks
|
|
68
|
+
* (serif fonts get serif fallbacks, sans-serif get sans-serif, etc.)
|
|
69
|
+
* matching the same stacks used in rendering for consistent measurements.
|
|
70
|
+
*
|
|
71
|
+
* @example
|
|
72
|
+
* buildFontString({ fontFamily: "Arial", fontSize: 12, bold: true })
|
|
73
|
+
* // Returns: "800 16px Arial, Arimo, Helvetica, sans-serif" (12pt = 16px)
|
|
74
|
+
*/
|
|
75
|
+
function buildFontString(style) {
|
|
76
|
+
const parts = [];
|
|
77
|
+
if (style.italic) parts.push("italic");
|
|
78
|
+
if (style.fontVariant) parts.push(style.fontVariant);
|
|
79
|
+
if (style.bold) parts.push("800");
|
|
80
|
+
const fontSizePx = ptToPx(style.fontSize ?? 11);
|
|
81
|
+
parts.push(`${fontSizePx}px`);
|
|
82
|
+
const fontFamily = style.fontFamily ?? "Calibri";
|
|
83
|
+
parts.push(getResolvedFallback(fontFamily));
|
|
84
|
+
return parts.join(" ");
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Find the character offset at a given X position within a text run
|
|
88
|
+
*
|
|
89
|
+
* @param x - X position relative to run start
|
|
90
|
+
* @param charWidths - Per-character widths from measureRun
|
|
91
|
+
* @returns Character offset (0-based index)
|
|
92
|
+
*/
|
|
93
|
+
function findCharacterAtX(x, charWidths) {
|
|
94
|
+
if (charWidths.length === 0) return 0;
|
|
95
|
+
if (x <= 0) return 0;
|
|
96
|
+
let accumulatedWidth = 0;
|
|
97
|
+
for (let i = 0; i < charWidths.length; i++) {
|
|
98
|
+
const charWidth = charWidths[i];
|
|
99
|
+
if (x <= accumulatedWidth + charWidth / 2) return i;
|
|
100
|
+
accumulatedWidth += charWidth;
|
|
101
|
+
}
|
|
102
|
+
return charWidths.length;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get the X position of a character offset within a text run
|
|
106
|
+
*
|
|
107
|
+
* @param offset - Character offset (0-based index)
|
|
108
|
+
* @param charWidths - Per-character widths from measureRun
|
|
109
|
+
* @returns X position in pixels
|
|
110
|
+
*/
|
|
111
|
+
function getXForCharacter(offset, charWidths) {
|
|
112
|
+
if (offset <= 0 || charWidths.length === 0) return 0;
|
|
113
|
+
const clampedOffset = Math.min(offset, charWidths.length);
|
|
114
|
+
let x = 0;
|
|
115
|
+
for (let i = 0; i < clampedOffset; i++) x += charWidths[i];
|
|
116
|
+
return x;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Convert twips to pixels
|
|
120
|
+
*/
|
|
121
|
+
function twipsToPx(twips) {
|
|
122
|
+
return twips / TWIPS_PER_PX;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Convert pixels to twips
|
|
126
|
+
*/
|
|
127
|
+
function pxToTwips(px) {
|
|
128
|
+
return Math.round(px * TWIPS_PER_PX);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Convert points to pixels
|
|
132
|
+
*/
|
|
133
|
+
function ptToPx(pt) {
|
|
134
|
+
return pt * PX_PER_INCH / 72;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Convert pixels to points
|
|
138
|
+
*/
|
|
139
|
+
function pxToPt(px) {
|
|
140
|
+
return px * 72 / PX_PER_INCH;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Convert OOXML half-points to pixels
|
|
144
|
+
* OOXML font sizes are in half-points (24 = 12pt)
|
|
145
|
+
*/
|
|
146
|
+
function halfPtToPx(halfPt) {
|
|
147
|
+
return ptToPx(halfPt / 2);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Convert pixels to OOXML half-points
|
|
151
|
+
*/
|
|
152
|
+
function pxToHalfPt(px) {
|
|
153
|
+
return pxToPt(px) * 2;
|
|
154
|
+
}
|
|
155
|
+
//#endregion
|
|
156
|
+
export { DEFAULT_FONT_FAMILY, DEFAULT_FONT_SIZE, buildFontString, buildRunFontStyle, findCharacterAtX, getResolvedData, getXForCharacter, halfPtToPx, ptToPx, pxToHalfPt, pxToPt, pxToTwips, twipsToPx };
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { ParagraphBlock, ParagraphMeasure, TextRun } from "../types.js";
|
|
2
|
+
import { FloatingImageZone } from "./floatingZones.js";
|
|
3
|
+
import { clampFloatingWrapMargins } from "./clampFloatingWrapMargins.js";
|
|
4
|
+
|
|
5
|
+
//#region src/layout-engine/measure/measureParagraph.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Options for paragraph measurement
|
|
8
|
+
*/
|
|
9
|
+
type MeasureParagraphOptions = {
|
|
10
|
+
/** Floating image exclusion zones that affect line widths */floatingZones?: FloatingImageZone[]; /** Y offset of this paragraph relative to the exclusion zones (default: 0) */
|
|
11
|
+
paragraphYOffset?: number;
|
|
12
|
+
/** Field run `pmStart` -> resolved display text, so a field measures at its
|
|
13
|
+
* painted width instead of the cached fallback. */
|
|
14
|
+
fieldValues?: ReadonlyMap<number, string>;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Minimum horizontal room a line must offer before we treat it as usable for
|
|
18
|
+
* body text. Below this threshold the line is bumped past obstructing floats
|
|
19
|
+
* via `findClearLineY` instead of being rendered into the unusable sliver.
|
|
20
|
+
* Without this guard, a near-full-width float (e.g. floating table) produces
|
|
21
|
+
* a ~2px segment that collapses every wrap line to one glyph per row.
|
|
22
|
+
*/
|
|
23
|
+
declare const MIN_WRAP_SEGMENT_WIDTH = 24;
|
|
24
|
+
/**
|
|
25
|
+
* Find the next vertical position at or below `startY` where the available
|
|
26
|
+
* text width is at least `minWidth`. Used to skip lines past stacked floats
|
|
27
|
+
* when there is no horizontal room for meaningful text at the current Y.
|
|
28
|
+
*
|
|
29
|
+
* Returns `startY` if the current position already has enough room, otherwise
|
|
30
|
+
* the lowest `bottomY` of any zone currently obstructing the line. The caller
|
|
31
|
+
* is expected to re-query margins at the returned Y.
|
|
32
|
+
*
|
|
33
|
+
* Coordinates are absolute (i.e., already include any paragraphYOffset).
|
|
34
|
+
*/
|
|
35
|
+
declare function findClearLineY(startY: number, lineHeight: number, zones: FloatingImageZone[] | undefined, contentWidth: number, minWidth: number): number;
|
|
36
|
+
/**
|
|
37
|
+
* Measure a paragraph block and compute line breaks
|
|
38
|
+
*
|
|
39
|
+
* @param block - The paragraph block to measure
|
|
40
|
+
* @param maxWidth - Maximum available width for the paragraph
|
|
41
|
+
* @param options - Optional measurement options (floating zones, Y offset)
|
|
42
|
+
* @returns ParagraphMeasure with lines and total height
|
|
43
|
+
*/
|
|
44
|
+
declare function measureParagraph(block: ParagraphBlock, maxWidth: number, options?: MeasureParagraphOptions): ParagraphMeasure;
|
|
45
|
+
/**
|
|
46
|
+
* Measure multiple paragraph blocks
|
|
47
|
+
*
|
|
48
|
+
* @param blocks - Array of paragraph blocks to measure
|
|
49
|
+
* @param maxWidth - Maximum available width
|
|
50
|
+
* @returns Array of ParagraphMeasure results
|
|
51
|
+
*/
|
|
52
|
+
declare function measureParagraphs(blocks: ParagraphBlock[], maxWidth: number): ParagraphMeasure[];
|
|
53
|
+
/**
|
|
54
|
+
* Get per-character widths for a text run (for click positioning)
|
|
55
|
+
*
|
|
56
|
+
* @param run - The text run to measure
|
|
57
|
+
* @returns Array of character widths
|
|
58
|
+
*/
|
|
59
|
+
declare function getRunCharWidths(run: TextRun): number[];
|
|
60
|
+
//#endregion
|
|
61
|
+
export { type FloatingImageZone, MIN_WRAP_SEGMENT_WIDTH, MeasureParagraphOptions, clampFloatingWrapMargins, findClearLineY, getRunCharWidths, measureParagraph, measureParagraphs };
|