velo-text 1.0.0-beta.1
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/CHANGELOG.md +70 -0
- package/LICENSE +21 -0
- package/README.md +122 -0
- package/dist/adapters/backend/index.d.ts +4 -0
- package/dist/adapters/backend/index.d.ts.map +1 -0
- package/dist/adapters/backend/index.js +3 -0
- package/dist/adapters/backend/index.js.map +1 -0
- package/dist/adapters/backend/pdf-http.d.ts +48 -0
- package/dist/adapters/backend/pdf-http.d.ts.map +1 -0
- package/dist/adapters/backend/pdf-http.js +117 -0
- package/dist/adapters/backend/pdf-http.js.map +1 -0
- package/dist/adapters/backend/sinks.d.ts +7 -0
- package/dist/adapters/backend/sinks.d.ts.map +1 -0
- package/dist/adapters/backend/sinks.js +43 -0
- package/dist/adapters/backend/sinks.js.map +1 -0
- package/dist/adapters/browser/index.d.ts +11 -0
- package/dist/adapters/browser/index.d.ts.map +1 -0
- package/dist/adapters/browser/index.js +51 -0
- package/dist/adapters/browser/index.js.map +1 -0
- package/dist/adapters/postgres-contract/index.d.ts +45 -0
- package/dist/adapters/postgres-contract/index.d.ts.map +1 -0
- package/dist/adapters/postgres-contract/index.js +108 -0
- package/dist/adapters/postgres-contract/index.js.map +1 -0
- package/dist/adapters/s3-compatible/index.d.ts +46 -0
- package/dist/adapters/s3-compatible/index.d.ts.map +1 -0
- package/dist/adapters/s3-compatible/index.js +106 -0
- package/dist/adapters/s3-compatible/index.js.map +1 -0
- package/dist/adapters/vanilla.d.ts +5 -0
- package/dist/adapters/vanilla.d.ts.map +1 -0
- package/dist/adapters/vanilla.js +6 -0
- package/dist/adapters/vanilla.js.map +1 -0
- package/dist/assets/dimensions/index.d.ts +12 -0
- package/dist/assets/dimensions/index.d.ts.map +1 -0
- package/dist/assets/dimensions/index.js +46 -0
- package/dist/assets/dimensions/index.js.map +1 -0
- package/dist/assets/hashing/index.d.ts +7 -0
- package/dist/assets/hashing/index.d.ts.map +1 -0
- package/dist/assets/hashing/index.js +21 -0
- package/dist/assets/hashing/index.js.map +1 -0
- package/dist/assets/icons/index.d.ts +25 -0
- package/dist/assets/icons/index.d.ts.map +1 -0
- package/dist/assets/icons/index.js +107 -0
- package/dist/assets/icons/index.js.map +1 -0
- package/dist/assets/png/placeholder.d.ts +4 -0
- package/dist/assets/png/placeholder.d.ts.map +1 -0
- package/dist/assets/png/placeholder.js +13 -0
- package/dist/assets/png/placeholder.js.map +1 -0
- package/dist/assets/sniff/index.d.ts +13 -0
- package/dist/assets/sniff/index.d.ts.map +1 -0
- package/dist/assets/sniff/index.js +41 -0
- package/dist/assets/sniff/index.js.map +1 -0
- package/dist/assets/store/index.d.ts +56 -0
- package/dist/assets/store/index.d.ts.map +1 -0
- package/dist/assets/store/index.js +102 -0
- package/dist/assets/store/index.js.map +1 -0
- package/dist/assets/svg/index.d.ts +7 -0
- package/dist/assets/svg/index.d.ts.map +1 -0
- package/dist/assets/svg/index.js +82 -0
- package/dist/assets/svg/index.js.map +1 -0
- package/dist/core/equation/html.d.ts +3 -0
- package/dist/core/equation/html.d.ts.map +1 -0
- package/dist/core/equation/html.js +138 -0
- package/dist/core/equation/html.js.map +1 -0
- package/dist/core/equation/index.d.ts +19 -0
- package/dist/core/equation/index.d.ts.map +1 -0
- package/dist/core/equation/index.js +107 -0
- package/dist/core/equation/index.js.map +1 -0
- package/dist/core/events/index.d.ts +13 -0
- package/dist/core/events/index.d.ts.map +1 -0
- package/dist/core/events/index.js +18 -0
- package/dist/core/events/index.js.map +1 -0
- package/dist/core/history/history.d.ts +29 -0
- package/dist/core/history/history.d.ts.map +1 -0
- package/dist/core/history/history.js +55 -0
- package/dist/core/history/history.js.map +1 -0
- package/dist/core/history/index.d.ts +2 -0
- package/dist/core/history/index.d.ts.map +1 -0
- package/dist/core/history/index.js +2 -0
- package/dist/core/history/index.js.map +1 -0
- package/dist/core/model/block.d.ts +121 -0
- package/dist/core/model/block.d.ts.map +1 -0
- package/dist/core/model/block.js +2 -0
- package/dist/core/model/block.js.map +1 -0
- package/dist/core/model/document.d.ts +70 -0
- package/dist/core/model/document.d.ts.map +1 -0
- package/dist/core/model/document.js +2 -0
- package/dist/core/model/document.js.map +1 -0
- package/dist/core/model/factories.d.ts +35 -0
- package/dist/core/model/factories.d.ts.map +1 -0
- package/dist/core/model/factories.js +115 -0
- package/dist/core/model/factories.js.map +1 -0
- package/dist/core/model/index.d.ts +4 -0
- package/dist/core/model/index.d.ts.map +1 -0
- package/dist/core/model/index.js +4 -0
- package/dist/core/model/index.js.map +1 -0
- package/dist/core/model/inline.d.ts +43 -0
- package/dist/core/model/inline.d.ts.map +1 -0
- package/dist/core/model/inline.js +2 -0
- package/dist/core/model/inline.js.map +1 -0
- package/dist/core/model/primitives.d.ts +36 -0
- package/dist/core/model/primitives.d.ts.map +1 -0
- package/dist/core/model/primitives.js +3 -0
- package/dist/core/model/primitives.js.map +1 -0
- package/dist/core/model/table-look.d.ts +12 -0
- package/dist/core/model/table-look.d.ts.map +1 -0
- package/dist/core/model/table-look.js +99 -0
- package/dist/core/model/table-look.js.map +1 -0
- package/dist/core/model/types.d.ts +5 -0
- package/dist/core/model/types.d.ts.map +1 -0
- package/dist/core/model/types.js +5 -0
- package/dist/core/model/types.js.map +1 -0
- package/dist/core/normalize/index.d.ts +2 -0
- package/dist/core/normalize/index.d.ts.map +1 -0
- package/dist/core/normalize/index.js +2 -0
- package/dist/core/normalize/index.js.map +1 -0
- package/dist/core/normalize/normalize.d.ts +8 -0
- package/dist/core/normalize/normalize.d.ts.map +1 -0
- package/dist/core/normalize/normalize.js +145 -0
- package/dist/core/normalize/normalize.js.map +1 -0
- package/dist/core/operations/index.d.ts +2 -0
- package/dist/core/operations/index.d.ts.map +1 -0
- package/dist/core/operations/index.js +2 -0
- package/dist/core/operations/index.js.map +1 -0
- package/dist/core/operations/operations.d.ts +53 -0
- package/dist/core/operations/operations.d.ts.map +1 -0
- package/dist/core/operations/operations.js +92 -0
- package/dist/core/operations/operations.js.map +1 -0
- package/dist/core/plugin/index.d.ts +84 -0
- package/dist/core/plugin/index.d.ts.map +1 -0
- package/dist/core/plugin/index.js +137 -0
- package/dist/core/plugin/index.js.map +1 -0
- package/dist/core/schema/canonical.d.ts +6 -0
- package/dist/core/schema/canonical.d.ts.map +1 -0
- package/dist/core/schema/canonical.js +42 -0
- package/dist/core/schema/canonical.js.map +1 -0
- package/dist/core/schema/index.d.ts +3 -0
- package/dist/core/schema/index.d.ts.map +1 -0
- package/dist/core/schema/index.js +3 -0
- package/dist/core/schema/index.js.map +1 -0
- package/dist/core/schema/validator.d.ts +23 -0
- package/dist/core/schema/validator.d.ts.map +1 -0
- package/dist/core/schema/validator.js +276 -0
- package/dist/core/schema/validator.js.map +1 -0
- package/dist/core/selection/index.d.ts +2 -0
- package/dist/core/selection/index.d.ts.map +1 -0
- package/dist/core/selection/index.js +2 -0
- package/dist/core/selection/index.js.map +1 -0
- package/dist/core/selection/selection.d.ts +12 -0
- package/dist/core/selection/selection.d.ts.map +1 -0
- package/dist/core/selection/selection.js +38 -0
- package/dist/core/selection/selection.js.map +1 -0
- package/dist/editor-web/accessibility/index.d.ts +40 -0
- package/dist/editor-web/accessibility/index.d.ts.map +1 -0
- package/dist/editor-web/accessibility/index.js +170 -0
- package/dist/editor-web/accessibility/index.js.map +1 -0
- package/dist/editor-web/clipboard/index.d.ts +52 -0
- package/dist/editor-web/clipboard/index.d.ts.map +1 -0
- package/dist/editor-web/clipboard/index.js +154 -0
- package/dist/editor-web/clipboard/index.js.map +1 -0
- package/dist/editor-web/controller/column-presets.d.ts +9 -0
- package/dist/editor-web/controller/column-presets.d.ts.map +1 -0
- package/dist/editor-web/controller/column-presets.js +11 -0
- package/dist/editor-web/controller/column-presets.js.map +1 -0
- package/dist/editor-web/controller/column-resize.d.ts +6 -0
- package/dist/editor-web/controller/column-resize.d.ts.map +1 -0
- package/dist/editor-web/controller/column-resize.js +119 -0
- package/dist/editor-web/controller/column-resize.js.map +1 -0
- package/dist/editor-web/controller/columns-ui.d.ts +5 -0
- package/dist/editor-web/controller/columns-ui.d.ts.map +1 -0
- package/dist/editor-web/controller/columns-ui.js +107 -0
- package/dist/editor-web/controller/columns-ui.js.map +1 -0
- package/dist/editor-web/controller/commands.d.ts +27 -0
- package/dist/editor-web/controller/commands.d.ts.map +1 -0
- package/dist/editor-web/controller/commands.js +198 -0
- package/dist/editor-web/controller/commands.js.map +1 -0
- package/dist/editor-web/controller/format-commands.d.ts +12 -0
- package/dist/editor-web/controller/format-commands.d.ts.map +1 -0
- package/dist/editor-web/controller/format-commands.js +77 -0
- package/dist/editor-web/controller/format-commands.js.map +1 -0
- package/dist/editor-web/controller/handles.d.ts +7 -0
- package/dist/editor-web/controller/handles.d.ts.map +1 -0
- package/dist/editor-web/controller/handles.js +205 -0
- package/dist/editor-web/controller/handles.js.map +1 -0
- package/dist/editor-web/controller/host.d.ts +8 -0
- package/dist/editor-web/controller/host.d.ts.map +1 -0
- package/dist/editor-web/controller/host.js +48 -0
- package/dist/editor-web/controller/host.js.map +1 -0
- package/dist/editor-web/controller/image-resize.d.ts +9 -0
- package/dist/editor-web/controller/image-resize.d.ts.map +1 -0
- package/dist/editor-web/controller/image-resize.js +163 -0
- package/dist/editor-web/controller/image-resize.js.map +1 -0
- package/dist/editor-web/controller/index.d.ts +6 -0
- package/dist/editor-web/controller/index.d.ts.map +1 -0
- package/dist/editor-web/controller/index.js +190 -0
- package/dist/editor-web/controller/index.js.map +1 -0
- package/dist/editor-web/controller/nesting.d.ts +27 -0
- package/dist/editor-web/controller/nesting.d.ts.map +1 -0
- package/dist/editor-web/controller/nesting.js +218 -0
- package/dist/editor-web/controller/nesting.js.map +1 -0
- package/dist/editor-web/controller/place-overlay.d.ts +6 -0
- package/dist/editor-web/controller/place-overlay.d.ts.map +1 -0
- package/dist/editor-web/controller/place-overlay.js +55 -0
- package/dist/editor-web/controller/place-overlay.js.map +1 -0
- package/dist/editor-web/controller/size-picker.d.ts +28 -0
- package/dist/editor-web/controller/size-picker.d.ts.map +1 -0
- package/dist/editor-web/controller/size-picker.js +177 -0
- package/dist/editor-web/controller/size-picker.js.map +1 -0
- package/dist/editor-web/controller/table-resize.d.ts +14 -0
- package/dist/editor-web/controller/table-resize.d.ts.map +1 -0
- package/dist/editor-web/controller/table-resize.js +178 -0
- package/dist/editor-web/controller/table-resize.js.map +1 -0
- package/dist/editor-web/controller/table-ui.d.ts +5 -0
- package/dist/editor-web/controller/table-ui.d.ts.map +1 -0
- package/dist/editor-web/controller/table-ui.js +214 -0
- package/dist/editor-web/controller/table-ui.js.map +1 -0
- package/dist/editor-web/controller/types.d.ts +95 -0
- package/dist/editor-web/controller/types.d.ts.map +1 -0
- package/dist/editor-web/controller/types.js +4 -0
- package/dist/editor-web/controller/types.js.map +1 -0
- package/dist/editor-web/controller/variable-ui.d.ts +5 -0
- package/dist/editor-web/controller/variable-ui.d.ts.map +1 -0
- package/dist/editor-web/controller/variable-ui.js +75 -0
- package/dist/editor-web/controller/variable-ui.js.map +1 -0
- package/dist/editor-web/images/index.d.ts +9 -0
- package/dist/editor-web/images/index.d.ts.map +1 -0
- package/dist/editor-web/images/index.js +18 -0
- package/dist/editor-web/images/index.js.map +1 -0
- package/dist/editor-web/index.d.ts +10 -0
- package/dist/editor-web/index.d.ts.map +1 -0
- package/dist/editor-web/index.js +10 -0
- package/dist/editor-web/index.js.map +1 -0
- package/dist/editor-web/input/index.d.ts +75 -0
- package/dist/editor-web/input/index.d.ts.map +1 -0
- package/dist/editor-web/input/index.js +151 -0
- package/dist/editor-web/input/index.js.map +1 -0
- package/dist/editor-web/tables/index.d.ts +47 -0
- package/dist/editor-web/tables/index.d.ts.map +1 -0
- package/dist/editor-web/tables/index.js +159 -0
- package/dist/editor-web/tables/index.js.map +1 -0
- package/dist/editor-web/toolbar/index.d.ts +17 -0
- package/dist/editor-web/toolbar/index.d.ts.map +1 -0
- package/dist/editor-web/toolbar/index.js +36 -0
- package/dist/editor-web/toolbar/index.js.map +1 -0
- package/dist/editor-web/ux/attach.d.ts +21 -0
- package/dist/editor-web/ux/attach.d.ts.map +1 -0
- package/dist/editor-web/ux/attach.js +61 -0
- package/dist/editor-web/ux/attach.js.map +1 -0
- package/dist/editor-web/ux/command-palette.d.ts +11 -0
- package/dist/editor-web/ux/command-palette.d.ts.map +1 -0
- package/dist/editor-web/ux/command-palette.js +135 -0
- package/dist/editor-web/ux/command-palette.js.map +1 -0
- package/dist/editor-web/ux/equation-editor.d.ts +11 -0
- package/dist/editor-web/ux/equation-editor.d.ts.map +1 -0
- package/dist/editor-web/ux/equation-editor.js +130 -0
- package/dist/editor-web/ux/equation-editor.js.map +1 -0
- package/dist/editor-web/ux/equation-palette.d.ts +11 -0
- package/dist/editor-web/ux/equation-palette.d.ts.map +1 -0
- package/dist/editor-web/ux/equation-palette.js +90 -0
- package/dist/editor-web/ux/equation-palette.js.map +1 -0
- package/dist/editor-web/ux/find-replace.d.ts +6 -0
- package/dist/editor-web/ux/find-replace.d.ts.map +1 -0
- package/dist/editor-web/ux/find-replace.js +125 -0
- package/dist/editor-web/ux/find-replace.js.map +1 -0
- package/dist/editor-web/ux/find-text.d.ts +10 -0
- package/dist/editor-web/ux/find-text.d.ts.map +1 -0
- package/dist/editor-web/ux/find-text.js +101 -0
- package/dist/editor-web/ux/find-text.js.map +1 -0
- package/dist/editor-web/ux/image-drop.d.ts +7 -0
- package/dist/editor-web/ux/image-drop.d.ts.map +1 -0
- package/dist/editor-web/ux/image-drop.js +198 -0
- package/dist/editor-web/ux/image-drop.js.map +1 -0
- package/dist/editor-web/ux/link-ui.d.ts +6 -0
- package/dist/editor-web/ux/link-ui.d.ts.map +1 -0
- package/dist/editor-web/ux/link-ui.js +50 -0
- package/dist/editor-web/ux/link-ui.js.map +1 -0
- package/dist/editor-web/ux/outline.d.ts +9 -0
- package/dist/editor-web/ux/outline.d.ts.map +1 -0
- package/dist/editor-web/ux/outline.js +48 -0
- package/dist/editor-web/ux/outline.js.map +1 -0
- package/dist/editor-web/ux/page-preview.d.ts +6 -0
- package/dist/editor-web/ux/page-preview.d.ts.map +1 -0
- package/dist/editor-web/ux/page-preview.js +90 -0
- package/dist/editor-web/ux/page-preview.js.map +1 -0
- package/dist/editor-web/ux/selection-bubble.d.ts +6 -0
- package/dist/editor-web/ux/selection-bubble.d.ts.map +1 -0
- package/dist/editor-web/ux/selection-bubble.js +79 -0
- package/dist/editor-web/ux/selection-bubble.js.map +1 -0
- package/dist/editor-web/ux/shortcuts-sheet.d.ts +6 -0
- package/dist/editor-web/ux/shortcuts-sheet.d.ts.map +1 -0
- package/dist/editor-web/ux/shortcuts-sheet.js +58 -0
- package/dist/editor-web/ux/shortcuts-sheet.js.map +1 -0
- package/dist/editor-web/view/index.d.ts +3 -0
- package/dist/editor-web/view/index.d.ts.map +1 -0
- package/dist/editor-web/view/index.js +3 -0
- package/dist/editor-web/view/index.js.map +1 -0
- package/dist/editor-web/view/parse-inlines.d.ts +15 -0
- package/dist/editor-web/view/parse-inlines.d.ts.map +1 -0
- package/dist/editor-web/view/parse-inlines.js +107 -0
- package/dist/editor-web/view/parse-inlines.js.map +1 -0
- package/dist/editor-web/view/parse.d.ts +8 -0
- package/dist/editor-web/view/parse.d.ts.map +1 -0
- package/dist/editor-web/view/parse.js +238 -0
- package/dist/editor-web/view/parse.js.map +1 -0
- package/dist/editor-web/view/reconcile.d.ts +26 -0
- package/dist/editor-web/view/reconcile.d.ts.map +1 -0
- package/dist/editor-web/view/reconcile.js +142 -0
- package/dist/editor-web/view/reconcile.js.map +1 -0
- package/dist/editor-web/view/render.d.ts +14 -0
- package/dist/editor-web/view/render.d.ts.map +1 -0
- package/dist/editor-web/view/render.js +162 -0
- package/dist/editor-web/view/render.js.map +1 -0
- package/dist/export/docx/document-xml.d.ts +3 -0
- package/dist/export/docx/document-xml.d.ts.map +1 -0
- package/dist/export/docx/document-xml.js +218 -0
- package/dist/export/docx/document-xml.js.map +1 -0
- package/dist/export/docx/package-parts.d.ts +9 -0
- package/dist/export/docx/package-parts.d.ts.map +1 -0
- package/dist/export/docx/package-parts.js +91 -0
- package/dist/export/docx/package-parts.js.map +1 -0
- package/dist/export/docx/writer.d.ts +17 -0
- package/dist/export/docx/writer.d.ts.map +1 -0
- package/dist/export/docx/writer.js +48 -0
- package/dist/export/docx/writer.js.map +1 -0
- package/dist/export/images/downsample.d.ts +19 -0
- package/dist/export/images/downsample.d.ts.map +1 -0
- package/dist/export/images/downsample.js +64 -0
- package/dist/export/images/downsample.js.map +1 -0
- package/dist/export/images/png-encode.d.ts +4 -0
- package/dist/export/images/png-encode.d.ts.map +1 -0
- package/dist/export/images/png-encode.js +86 -0
- package/dist/export/images/png-encode.js.map +1 -0
- package/dist/export/images/prepare.d.ts +22 -0
- package/dist/export/images/prepare.d.ts.map +1 -0
- package/dist/export/images/prepare.js +29 -0
- package/dist/export/images/prepare.js.map +1 -0
- package/dist/export/images/rasterize.d.ts +7 -0
- package/dist/export/images/rasterize.d.ts.map +1 -0
- package/dist/export/images/rasterize.js +62 -0
- package/dist/export/images/rasterize.js.map +1 -0
- package/dist/export/index.d.ts +45 -0
- package/dist/export/index.d.ts.map +1 -0
- package/dist/export/index.js +52 -0
- package/dist/export/index.js.map +1 -0
- package/dist/export/layout/index.d.ts +23 -0
- package/dist/export/layout/index.d.ts.map +1 -0
- package/dist/export/layout/index.js +18 -0
- package/dist/export/layout/index.js.map +1 -0
- package/dist/export/layout/layout-blocks.d.ts +5 -0
- package/dist/export/layout/layout-blocks.d.ts.map +1 -0
- package/dist/export/layout/layout-blocks.js +91 -0
- package/dist/export/layout/layout-blocks.js.map +1 -0
- package/dist/export/layout/layout-flow.d.ts +25 -0
- package/dist/export/layout/layout-flow.d.ts.map +1 -0
- package/dist/export/layout/layout-flow.js +23 -0
- package/dist/export/layout/layout-flow.js.map +1 -0
- package/dist/export/layout/layout-structured.d.ts +4 -0
- package/dist/export/layout/layout-structured.d.ts.map +1 -0
- package/dist/export/layout/layout-structured.js +153 -0
- package/dist/export/layout/layout-structured.js.map +1 -0
- package/dist/export/layout/layout-types.d.ts +35 -0
- package/dist/export/layout/layout-types.d.ts.map +1 -0
- package/dist/export/layout/layout-types.js +2 -0
- package/dist/export/layout/layout-types.js.map +1 -0
- package/dist/export/layout/pagination.d.ts +9 -0
- package/dist/export/layout/pagination.d.ts.map +1 -0
- package/dist/export/layout/pagination.js +38 -0
- package/dist/export/layout/pagination.js.map +1 -0
- package/dist/export/layout/text.d.ts +47 -0
- package/dist/export/layout/text.d.ts.map +1 -0
- package/dist/export/layout/text.js +119 -0
- package/dist/export/layout/text.js.map +1 -0
- package/dist/export/layout/units.d.ts +30 -0
- package/dist/export/layout/units.d.ts.map +1 -0
- package/dist/export/layout/units.js +55 -0
- package/dist/export/layout/units.js.map +1 -0
- package/dist/export/odt/writer.d.ts +24 -0
- package/dist/export/odt/writer.d.ts.map +1 -0
- package/dist/export/odt/writer.js +258 -0
- package/dist/export/odt/writer.js.map +1 -0
- package/dist/export/pdf/assemble.d.ts +9 -0
- package/dist/export/pdf/assemble.d.ts.map +1 -0
- package/dist/export/pdf/assemble.js +105 -0
- package/dist/export/pdf/assemble.js.map +1 -0
- package/dist/export/pdf/diagnostics.d.ts +11 -0
- package/dist/export/pdf/diagnostics.d.ts.map +1 -0
- package/dist/export/pdf/diagnostics.js +88 -0
- package/dist/export/pdf/diagnostics.js.map +1 -0
- package/dist/export/pdf/equation.d.ts +55 -0
- package/dist/export/pdf/equation.d.ts.map +1 -0
- package/dist/export/pdf/equation.js +301 -0
- package/dist/export/pdf/equation.js.map +1 -0
- package/dist/export/pdf/export-pdf.d.ts +33 -0
- package/dist/export/pdf/export-pdf.d.ts.map +1 -0
- package/dist/export/pdf/export-pdf.js +54 -0
- package/dist/export/pdf/export-pdf.js.map +1 -0
- package/dist/export/pdf/fonts.d.ts +7 -0
- package/dist/export/pdf/fonts.d.ts.map +1 -0
- package/dist/export/pdf/fonts.js +15 -0
- package/dist/export/pdf/fonts.js.map +1 -0
- package/dist/export/pdf/image.d.ts +27 -0
- package/dist/export/pdf/image.d.ts.map +1 -0
- package/dist/export/pdf/image.js +271 -0
- package/dist/export/pdf/image.js.map +1 -0
- package/dist/export/pdf/layout-pages.d.ts +9 -0
- package/dist/export/pdf/layout-pages.d.ts.map +1 -0
- package/dist/export/pdf/layout-pages.js +174 -0
- package/dist/export/pdf/layout-pages.js.map +1 -0
- package/dist/export/pdf/layout-table.d.ts +29 -0
- package/dist/export/pdf/layout-table.d.ts.map +1 -0
- package/dist/export/pdf/layout-table.js +216 -0
- package/dist/export/pdf/layout-table.js.map +1 -0
- package/dist/export/pdf/page-metrics.d.ts +11 -0
- package/dist/export/pdf/page-metrics.d.ts.map +1 -0
- package/dist/export/pdf/page-metrics.js +14 -0
- package/dist/export/pdf/page-metrics.js.map +1 -0
- package/dist/export/pdf/pdf-model.d.ts +36 -0
- package/dist/export/pdf/pdf-model.d.ts.map +1 -0
- package/dist/export/pdf/pdf-model.js +4 -0
- package/dist/export/pdf/pdf-model.js.map +1 -0
- package/dist/export/pdf/stream.d.ts +6 -0
- package/dist/export/pdf/stream.d.ts.map +1 -0
- package/dist/export/pdf/stream.js +213 -0
- package/dist/export/pdf/stream.js.map +1 -0
- package/dist/export/pdf/writer.d.ts +26 -0
- package/dist/export/pdf/writer.d.ts.map +1 -0
- package/dist/export/pdf/writer.js +31 -0
- package/dist/export/pdf/writer.js.map +1 -0
- package/dist/export/validate.d.ts +29 -0
- package/dist/export/validate.d.ts.map +1 -0
- package/dist/export/validate.js +127 -0
- package/dist/export/validate.js.map +1 -0
- package/dist/export/xml/writer.d.ts +19 -0
- package/dist/export/xml/writer.d.ts.map +1 -0
- package/dist/export/xml/writer.js +57 -0
- package/dist/export/xml/writer.js.map +1 -0
- package/dist/export/zip/crc32.d.ts +2 -0
- package/dist/export/zip/crc32.d.ts.map +1 -0
- package/dist/export/zip/crc32.js +20 -0
- package/dist/export/zip/crc32.js.map +1 -0
- package/dist/export/zip/deflate.d.ts +15 -0
- package/dist/export/zip/deflate.d.ts.map +1 -0
- package/dist/export/zip/deflate.js +28 -0
- package/dist/export/zip/deflate.js.map +1 -0
- package/dist/export/zip/index.d.ts +3 -0
- package/dist/export/zip/index.d.ts.map +1 -0
- package/dist/export/zip/index.js +3 -0
- package/dist/export/zip/index.js.map +1 -0
- package/dist/export/zip/zipWriter.d.ts +23 -0
- package/dist/export/zip/zipWriter.d.ts.map +1 -0
- package/dist/export/zip/zipWriter.js +123 -0
- package/dist/export/zip/zipWriter.js.map +1 -0
- package/dist/public-api/index.d.ts +46 -0
- package/dist/public-api/index.d.ts.map +1 -0
- package/dist/public-api/index.js +40 -0
- package/dist/public-api/index.js.map +1 -0
- package/dist/template/diagnostics/index.d.ts +8 -0
- package/dist/template/diagnostics/index.d.ts.map +1 -0
- package/dist/template/diagnostics/index.js +4 -0
- package/dist/template/diagnostics/index.js.map +1 -0
- package/dist/template/formatter/index.d.ts +9 -0
- package/dist/template/formatter/index.d.ts.map +1 -0
- package/dist/template/formatter/index.js +27 -0
- package/dist/template/formatter/index.js.map +1 -0
- package/dist/template/index.d.ts +3 -0
- package/dist/template/index.d.ts.map +1 -0
- package/dist/template/index.js +3 -0
- package/dist/template/index.js.map +1 -0
- package/dist/template/parser/parser.d.ts +42 -0
- package/dist/template/parser/parser.d.ts.map +1 -0
- package/dist/template/parser/parser.js +135 -0
- package/dist/template/parser/parser.js.map +1 -0
- package/dist/template/resolver/format.d.ts +11 -0
- package/dist/template/resolver/format.d.ts.map +1 -0
- package/dist/template/resolver/format.js +80 -0
- package/dist/template/resolver/format.js.map +1 -0
- package/dist/template/resolver/resolver.d.ts +31 -0
- package/dist/template/resolver/resolver.d.ts.map +1 -0
- package/dist/template/resolver/resolver.js +218 -0
- package/dist/template/resolver/resolver.js.map +1 -0
- package/dist/theme/index.d.ts +26 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +87 -0
- package/dist/theme/index.js.map +1 -0
- package/package.json +110 -0
- package/schemas/portable-doc-v1.json +250 -0
- package/themes/base.css +71 -0
- package/themes/components.css +135 -0
- package/themes/editor-chrome.css +174 -0
- package/themes/editor-columns.css +121 -0
- package/themes/editor-overlays.css +464 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/assets/sniff/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,eAAe,CAAC;AAEpF,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAgC5E;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,SAAS,CAE9D"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function sniffImage(bytes, declared) {
|
|
2
|
+
if (bytes.length < 4)
|
|
3
|
+
return { mediaType: null, valid: false, reason: "too-short" };
|
|
4
|
+
// PNG: 89 50 4E 47
|
|
5
|
+
if (bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47) {
|
|
6
|
+
const mediaType = "image/png";
|
|
7
|
+
if (declared && declared !== mediaType)
|
|
8
|
+
return { mediaType, valid: false, reason: "mime-mismatch" };
|
|
9
|
+
return { mediaType, valid: true };
|
|
10
|
+
}
|
|
11
|
+
// JPEG: FF D8 FF
|
|
12
|
+
if (bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) {
|
|
13
|
+
const mediaType = "image/jpeg";
|
|
14
|
+
if (declared && declared !== mediaType && declared !== "image/jpg")
|
|
15
|
+
return { mediaType, valid: false, reason: "mime-mismatch" };
|
|
16
|
+
return { mediaType, valid: true };
|
|
17
|
+
}
|
|
18
|
+
// WebP: RIFF....WEBP
|
|
19
|
+
if (bytes[0] === 0x52 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x46) {
|
|
20
|
+
const header = new TextDecoder().decode(bytes.slice(8, 12));
|
|
21
|
+
if (header === "WEBP") {
|
|
22
|
+
const mediaType = "image/webp";
|
|
23
|
+
if (declared && declared !== mediaType)
|
|
24
|
+
return { mediaType, valid: false, reason: "mime-mismatch" };
|
|
25
|
+
return { mediaType, valid: true };
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
// SVG: empieza con <svg o <?xml
|
|
29
|
+
const head = new TextDecoder().decode(bytes.slice(0, 200)).trimStart();
|
|
30
|
+
if (head.startsWith("<svg") || head.startsWith("<?xml")) {
|
|
31
|
+
const mediaType = "image/svg+xml";
|
|
32
|
+
if (declared && declared !== mediaType)
|
|
33
|
+
return { mediaType, valid: false, reason: "mime-mismatch" };
|
|
34
|
+
return { mediaType, valid: true };
|
|
35
|
+
}
|
|
36
|
+
return { mediaType: null, valid: false, reason: "unknown-format" };
|
|
37
|
+
}
|
|
38
|
+
export function isAllowedMediaType(mt) {
|
|
39
|
+
return ["image/png", "image/jpeg", "image/webp", "image/svg+xml"].includes(mt);
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/assets/sniff/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Asset store — Phase 5.2 / 5.2.3
|
|
3
|
+
* Interface create/put/confirm/get/delete with idempotent retries, cancellation support,
|
|
4
|
+
* transactional references, dedupe by sha256 per tenant, deferred GC and audit.
|
|
5
|
+
*/
|
|
6
|
+
import type { AssetRef } from "../../core/model/types.js";
|
|
7
|
+
export interface AssetRecord extends AssetRef {
|
|
8
|
+
tenantId: string;
|
|
9
|
+
status: "pending" | "confirmed" | "orphaned" | "deleted";
|
|
10
|
+
createdAt: string;
|
|
11
|
+
confirmedAt?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface CreateIntent {
|
|
14
|
+
tenantId: string;
|
|
15
|
+
sha256: string;
|
|
16
|
+
byteLength: number;
|
|
17
|
+
mediaType: AssetRef["mediaType"];
|
|
18
|
+
fileName: string;
|
|
19
|
+
}
|
|
20
|
+
export interface AssetStore {
|
|
21
|
+
/** Create an upload intent — returns existing asset if deduped */
|
|
22
|
+
createIntent(intent: CreateIntent): Promise<{
|
|
23
|
+
asset: AssetRecord;
|
|
24
|
+
isDuplicate: boolean;
|
|
25
|
+
uploadUrl?: string;
|
|
26
|
+
}>;
|
|
27
|
+
/** Confirm after PUT to storage */
|
|
28
|
+
confirm(assetId: string, tenantId: string): Promise<AssetRecord>;
|
|
29
|
+
/** Get asset by id */
|
|
30
|
+
get(assetId: string, tenantId: string): Promise<AssetRecord | null>;
|
|
31
|
+
/** Get by sha256 (dedupe lookup) */
|
|
32
|
+
getByHash(sha256: string, tenantId: string): Promise<AssetRecord | null>;
|
|
33
|
+
/** Add reference from document to asset (transactional) */
|
|
34
|
+
addReference(documentId: string, assetId: string, tenantId: string): Promise<void>;
|
|
35
|
+
/** Remove reference */
|
|
36
|
+
removeReference(documentId: string, assetId: string, tenantId: string): Promise<void>;
|
|
37
|
+
/** Garbage collect orphaned assets older than threshold */
|
|
38
|
+
gc(olderThanMs?: number): Promise<string[]>;
|
|
39
|
+
/** List assets for tenant with keyset pagination */
|
|
40
|
+
list(tenantId: string, opts?: {
|
|
41
|
+
limit?: number;
|
|
42
|
+
cursor?: string;
|
|
43
|
+
}): Promise<{
|
|
44
|
+
assets: AssetRecord[];
|
|
45
|
+
nextCursor?: string;
|
|
46
|
+
}>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* In-memory implementation — deterministic, suitable for tests and as reference for PG implementation.
|
|
50
|
+
* Dedupe is per-tenant by sha256 (unique constraint in PG: UNIQUE(tenant_id, sha256)).
|
|
51
|
+
*/
|
|
52
|
+
export declare function createInMemoryAssetStore(): AssetStore & {
|
|
53
|
+
storage: Map<string, AssetRecord>;
|
|
54
|
+
refs: Map<string, Set<string>>;
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/assets/store/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,kEAAkE;IAClE,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9G,mCAAmC;IACnC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACjE,sBAAsB;IACtB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACpE,oCAAoC;IACpC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACzE,2DAA2D;IAC3D,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,uBAAuB;IACvB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtF,2DAA2D;IAC3D,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,oDAAoD;IACpD,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7H;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,UAAU,GAAG;IAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;CAAE,CAuF7H"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory implementation — deterministic, suitable for tests and as reference for PG implementation.
|
|
3
|
+
* Dedupe is per-tenant by sha256 (unique constraint in PG: UNIQUE(tenant_id, sha256)).
|
|
4
|
+
*/
|
|
5
|
+
export function createInMemoryAssetStore() {
|
|
6
|
+
const assets = new Map(); // key: tenantId:assetId
|
|
7
|
+
const byHash = new Map(); // key: tenantId:sha256
|
|
8
|
+
const refs = new Map(); // key: documentId -> Set<assetId>
|
|
9
|
+
const key = (tenantId, assetId) => `${tenantId}:${assetId}`;
|
|
10
|
+
const hashKey = (tenantId, sha256) => `${tenantId}:${sha256}`;
|
|
11
|
+
return {
|
|
12
|
+
storage: assets,
|
|
13
|
+
refs,
|
|
14
|
+
async createIntent(intent) {
|
|
15
|
+
const existing = byHash.get(hashKey(intent.tenantId, intent.sha256));
|
|
16
|
+
if (existing)
|
|
17
|
+
return { asset: existing, isDuplicate: true };
|
|
18
|
+
const id = `ast_${Math.random().toString(36).slice(2, 10)}_${Date.now().toString(36)}`;
|
|
19
|
+
const now = new Date().toISOString();
|
|
20
|
+
const rec = {
|
|
21
|
+
id,
|
|
22
|
+
kind: "image",
|
|
23
|
+
mediaType: intent.mediaType,
|
|
24
|
+
storageKey: `tenants/${intent.tenantId}/assets/${id}`,
|
|
25
|
+
sha256: intent.sha256,
|
|
26
|
+
byteLength: intent.byteLength,
|
|
27
|
+
alt: intent.fileName,
|
|
28
|
+
tenantId: intent.tenantId,
|
|
29
|
+
status: "pending",
|
|
30
|
+
createdAt: now,
|
|
31
|
+
};
|
|
32
|
+
assets.set(key(intent.tenantId, id), rec);
|
|
33
|
+
byHash.set(hashKey(intent.tenantId, intent.sha256), rec);
|
|
34
|
+
return { asset: rec, isDuplicate: false, uploadUrl: `https://storage.example/upload/${id}` };
|
|
35
|
+
},
|
|
36
|
+
async confirm(assetId, tenantId) {
|
|
37
|
+
const rec = assets.get(key(tenantId, assetId));
|
|
38
|
+
if (!rec)
|
|
39
|
+
throw new Error("asset not found");
|
|
40
|
+
rec.status = "confirmed";
|
|
41
|
+
rec.confirmedAt = new Date().toISOString();
|
|
42
|
+
return rec;
|
|
43
|
+
},
|
|
44
|
+
async get(assetId, tenantId) {
|
|
45
|
+
return assets.get(key(tenantId, assetId)) ?? null;
|
|
46
|
+
},
|
|
47
|
+
async getByHash(sha256, tenantId) {
|
|
48
|
+
return byHash.get(hashKey(tenantId, sha256)) ?? null;
|
|
49
|
+
},
|
|
50
|
+
async addReference(documentId, assetId, tenantId) {
|
|
51
|
+
const rec = assets.get(key(tenantId, assetId));
|
|
52
|
+
if (!rec)
|
|
53
|
+
throw new Error("asset not found");
|
|
54
|
+
if (!refs.has(documentId))
|
|
55
|
+
refs.set(documentId, new Set());
|
|
56
|
+
refs.get(documentId).add(assetId);
|
|
57
|
+
},
|
|
58
|
+
async removeReference(documentId, assetId) {
|
|
59
|
+
refs.get(documentId)?.delete(assetId);
|
|
60
|
+
// Mark orphaned if no remaining refs across all docs
|
|
61
|
+
let stillReferenced = false;
|
|
62
|
+
for (const set of refs.values())
|
|
63
|
+
if (set.has(assetId))
|
|
64
|
+
stillReferenced = true;
|
|
65
|
+
if (!stillReferenced) {
|
|
66
|
+
// Find asset record to mark orphaned
|
|
67
|
+
for (const rec of assets.values())
|
|
68
|
+
if (rec.id === assetId)
|
|
69
|
+
rec.status = "orphaned";
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
async gc(olderThanMs = 24 * 60 * 60 * 1000) {
|
|
73
|
+
const cut = Date.now() - olderThanMs;
|
|
74
|
+
const deleted = [];
|
|
75
|
+
for (const [k, rec] of assets.entries()) {
|
|
76
|
+
if (rec.status === "orphaned" && new Date(rec.createdAt).getTime() < cut) {
|
|
77
|
+
assets.delete(k);
|
|
78
|
+
byHash.delete(hashKey(rec.tenantId, rec.sha256));
|
|
79
|
+
deleted.push(rec.id);
|
|
80
|
+
// Remove from refs
|
|
81
|
+
for (const set of refs.values())
|
|
82
|
+
set.delete(rec.id);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return deleted;
|
|
86
|
+
},
|
|
87
|
+
async list(tenantId, opts = {}) {
|
|
88
|
+
const limit = opts.limit ?? 20;
|
|
89
|
+
const all = [...assets.values()].filter((a) => a.tenantId === tenantId).sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
90
|
+
let start = 0;
|
|
91
|
+
if (opts.cursor) {
|
|
92
|
+
const idx = all.findIndex((a) => a.id === opts.cursor);
|
|
93
|
+
if (idx !== -1)
|
|
94
|
+
start = idx + 1;
|
|
95
|
+
}
|
|
96
|
+
const sliced = all.slice(start, start + limit);
|
|
97
|
+
const nextCursor = all.length > start + limit ? sliced[sliced.length - 1].id : undefined;
|
|
98
|
+
return { assets: sliced, nextCursor };
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/assets/store/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/assets/svg/index.ts"],"names":[],"mappings":"AAoDA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CA6B3D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SVG sanitization — Phase 5.1.3
|
|
3
|
+
* Safe internal XML parser, element/attribute allowlist, no scripts/events/network.
|
|
4
|
+
*/
|
|
5
|
+
const ALLOWED_ELEMENTS = new Set([
|
|
6
|
+
"svg",
|
|
7
|
+
"g",
|
|
8
|
+
"path",
|
|
9
|
+
"rect",
|
|
10
|
+
"circle",
|
|
11
|
+
"ellipse",
|
|
12
|
+
"line",
|
|
13
|
+
"polyline",
|
|
14
|
+
"polygon",
|
|
15
|
+
"text",
|
|
16
|
+
"tspan",
|
|
17
|
+
"defs",
|
|
18
|
+
"use",
|
|
19
|
+
"clipPath",
|
|
20
|
+
"mask",
|
|
21
|
+
"linearGradient",
|
|
22
|
+
"radialGradient",
|
|
23
|
+
"stop",
|
|
24
|
+
]);
|
|
25
|
+
const ALLOWED_ATTRS = new Set([
|
|
26
|
+
"width",
|
|
27
|
+
"height",
|
|
28
|
+
"viewBox",
|
|
29
|
+
"xmlns",
|
|
30
|
+
"d",
|
|
31
|
+
"x",
|
|
32
|
+
"y",
|
|
33
|
+
"cx",
|
|
34
|
+
"cy",
|
|
35
|
+
"r",
|
|
36
|
+
"rx",
|
|
37
|
+
"ry",
|
|
38
|
+
"fill",
|
|
39
|
+
"stroke",
|
|
40
|
+
"stroke-width",
|
|
41
|
+
"transform",
|
|
42
|
+
"opacity",
|
|
43
|
+
"id",
|
|
44
|
+
"class",
|
|
45
|
+
"offset",
|
|
46
|
+
"stop-color",
|
|
47
|
+
"stop-opacity",
|
|
48
|
+
]);
|
|
49
|
+
const FORBIDDEN_ATTRS_PREFIX = ["on", "href", "xlink:href"];
|
|
50
|
+
export function sanitizeSvg(svgText) {
|
|
51
|
+
const removed = [];
|
|
52
|
+
// Fast rejection: scripts, foreignObject, event handlers, external URLs
|
|
53
|
+
if (/<script/i.test(svgText))
|
|
54
|
+
removed.push("script");
|
|
55
|
+
if (/<foreignObject/i.test(svgText))
|
|
56
|
+
removed.push("foreignObject");
|
|
57
|
+
if (/javascript:/i.test(svgText))
|
|
58
|
+
removed.push("javascript-url");
|
|
59
|
+
if (/\bon\w+\s*=/i.test(svgText))
|
|
60
|
+
removed.push("event-handler");
|
|
61
|
+
// Very simple parser: flag non-allowlisted elements
|
|
62
|
+
const tagRe = /<\/?([a-zA-Z0-9:]+)[^>]*>/g;
|
|
63
|
+
let m;
|
|
64
|
+
while ((m = tagRe.exec(svgText)) !== null) {
|
|
65
|
+
const tag = m[1].toLowerCase();
|
|
66
|
+
const base = tag.split(":").pop();
|
|
67
|
+
if (!ALLOWED_ELEMENTS.has(base) && !base.startsWith("svg")) {
|
|
68
|
+
// permitir svg root
|
|
69
|
+
if (base !== "svg" && !removed.includes(`element:${base}`))
|
|
70
|
+
removed.push(`element:${base}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Attribute filtering: remove dangerous attributes
|
|
74
|
+
let sanitized = svgText
|
|
75
|
+
.replace(/<script[\s\S]*?<\/script>/gi, "")
|
|
76
|
+
.replace(/<foreignObject[\s\S]*?<\/foreignObject>/gi, "")
|
|
77
|
+
.replace(/\s+on\w+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/gi, "");
|
|
78
|
+
// Valid if script/event was removed and output differs; critical elements keep invalid flag (simplified)
|
|
79
|
+
const valid = !removed.includes("script") || sanitized !== svgText;
|
|
80
|
+
return { sanitized, removed, valid: removed.length === 0 || valid };
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/assets/svg/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,KAAK;IACL,GAAG;IACH,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS;IACT,MAAM;IACN,UAAU;IACV,SAAS;IACT,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,UAAU;IACV,MAAM;IACN,gBAAgB;IAChB,gBAAgB;IAChB,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,OAAO;IACP,QAAQ;IACR,SAAS;IACT,OAAO;IACP,GAAG;IACH,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,QAAQ;IACR,cAAc;IACd,WAAW;IACX,SAAS;IACT,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,YAAY;IACZ,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAQ5D,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,wEAAwE;IACxE,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACnE,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACjE,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAEhE,oDAAoD;IACpD,MAAM,KAAK,GAAG,4BAA4B,CAAC;IAC3C,IAAI,CAAyB,CAAC;IAC9B,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC;QACnC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,oBAAoB;YACpB,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,IAAI,SAAS,GAAG,OAAO;SACpB,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC;SAC1C,OAAO,CAAC,2CAA2C,EAAE,EAAE,CAAC;SACxD,OAAO,CAAC,4CAA4C,EAAE,EAAE,CAAC,CAAC;IAE7D,yGAAyG;IACzG,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,SAAS,KAAK,OAAO,CAAC;IACnE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;AACtE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../src/core/equation/html.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAgI/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/** Recursive LaTeX → HTML for the v1 subset (nested \frac / \sqrt / ^ / _). */
|
|
2
|
+
const GREEK = {
|
|
3
|
+
alpha: "α", beta: "β", gamma: "γ", delta: "δ", epsilon: "ε", zeta: "ζ", eta: "η",
|
|
4
|
+
theta: "θ", iota: "ι", kappa: "κ", lambda: "λ", mu: "μ", nu: "ν", xi: "ξ", omicron: "ο",
|
|
5
|
+
pi: "π", rho: "ρ", sigma: "σ", tau: "τ", upsilon: "υ", phi: "φ", chi: "χ", psi: "ψ", omega: "ω",
|
|
6
|
+
Gamma: "Γ", Delta: "Δ", Theta: "Θ", Lambda: "Λ", Xi: "Ξ", Pi: "Π", Sigma: "Σ", Phi: "Φ", Psi: "Ψ", Omega: "Ω",
|
|
7
|
+
infty: "∞",
|
|
8
|
+
};
|
|
9
|
+
const OPS = {
|
|
10
|
+
iiint: "∭", iint: "∬", oint: "∮", int: "∫", sum: "∑", prod: "∏",
|
|
11
|
+
Leftrightarrow: "⇔", Rightarrow: "⇒", Leftarrow: "⇐",
|
|
12
|
+
leftrightarrow: "↔", rightarrow: "→", leftarrow: "←", mapsto: "↦",
|
|
13
|
+
uparrow: "↑", downarrow: "↓", to: "→",
|
|
14
|
+
otimes: "⊗", oplus: "⊕", times: "×", cdot: "·", circ: "∘",
|
|
15
|
+
div: "÷", pm: "±", mp: "∓", partial: "∂", nabla: "∇",
|
|
16
|
+
approx: "≈", neq: "≠", leq: "≤", geq: "≥", equiv: "≡", propto: "∝",
|
|
17
|
+
notin: "∉", emptyset: "∅", subset: "⊂", supset: "⊃",
|
|
18
|
+
cup: "∪", cap: "∩", forall: "∀", exists: "∃", in: "∈",
|
|
19
|
+
lfloor: "⌊", rfloor: "⌋", lceil: "⌈", rceil: "⌉",
|
|
20
|
+
sin: "sin", cos: "cos", tan: "tan", log: "log", ln: "ln",
|
|
21
|
+
exp: "exp", lim: "lim", max: "max", min: "min", det: "det",
|
|
22
|
+
};
|
|
23
|
+
function escapeHtml(s) {
|
|
24
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
25
|
+
}
|
|
26
|
+
function takeGroup(src, i) {
|
|
27
|
+
while (src[i] === " ")
|
|
28
|
+
i++;
|
|
29
|
+
if (src[i] !== "{") {
|
|
30
|
+
if (src[i] === "\\") {
|
|
31
|
+
let j = i + 1;
|
|
32
|
+
while (j < src.length && /[a-zA-Z]/.test(src[j]))
|
|
33
|
+
j++;
|
|
34
|
+
if (j === i + 1 && j < src.length)
|
|
35
|
+
j++;
|
|
36
|
+
return { inner: src.slice(i, j), next: j };
|
|
37
|
+
}
|
|
38
|
+
return { inner: src[i] ?? "", next: i + 1 };
|
|
39
|
+
}
|
|
40
|
+
let depth = 0;
|
|
41
|
+
for (let j = i; j < src.length; j++) {
|
|
42
|
+
if (src[j] === "\\" && (src[j + 1] === "{" || src[j + 1] === "}")) {
|
|
43
|
+
j++;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (src[j] === "{")
|
|
47
|
+
depth++;
|
|
48
|
+
else if (src[j] === "}") {
|
|
49
|
+
depth--;
|
|
50
|
+
if (depth === 0)
|
|
51
|
+
return { inner: src.slice(i + 1, j), next: j + 1 };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return { inner: src.slice(i + 1), next: src.length };
|
|
55
|
+
}
|
|
56
|
+
function convert(src) {
|
|
57
|
+
let i = 0;
|
|
58
|
+
let out = "";
|
|
59
|
+
while (i < src.length) {
|
|
60
|
+
const c = src[i];
|
|
61
|
+
if (c === "{") {
|
|
62
|
+
const g = takeGroup(src, i);
|
|
63
|
+
out += convert(g.inner);
|
|
64
|
+
i = g.next;
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (c === "}") {
|
|
68
|
+
i++;
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
if (c === "^" || c === "_") {
|
|
72
|
+
const tag = c === "^" ? "sup" : "sub";
|
|
73
|
+
i++;
|
|
74
|
+
const g = takeGroup(src, i);
|
|
75
|
+
out += `<${tag}>${convert(g.inner)}</${tag}>`;
|
|
76
|
+
i = g.next;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (c === "\\") {
|
|
80
|
+
const n = src[i + 1];
|
|
81
|
+
if (n && !/[a-zA-Z]/.test(n)) {
|
|
82
|
+
i += 2;
|
|
83
|
+
if (n === "\\")
|
|
84
|
+
out += "<br>";
|
|
85
|
+
else if (n === "{" || n === "}" || n === "_" || n === "%")
|
|
86
|
+
out += escapeHtml(n);
|
|
87
|
+
else if (n === ",")
|
|
88
|
+
out += "\u2009";
|
|
89
|
+
else
|
|
90
|
+
out += escapeHtml(n);
|
|
91
|
+
continue;
|
|
92
|
+
}
|
|
93
|
+
let j = i + 1;
|
|
94
|
+
while (j < src.length && /[a-zA-Z]/.test(src[j]))
|
|
95
|
+
j++;
|
|
96
|
+
const name = src.slice(i + 1, j);
|
|
97
|
+
i = j;
|
|
98
|
+
while (src[i] === " ")
|
|
99
|
+
i++;
|
|
100
|
+
if (name === "frac") {
|
|
101
|
+
const a = takeGroup(src, i);
|
|
102
|
+
const b = takeGroup(src, a.next);
|
|
103
|
+
out += `<span class="pde-frac"><span class="pde-frac-num">${convert(a.inner)}</span><span class="pde-frac-den">${convert(b.inner)}</span></span>`;
|
|
104
|
+
i = b.next;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
if (name === "sqrt") {
|
|
108
|
+
const a = takeGroup(src, i);
|
|
109
|
+
out += `<span class="pde-sqrt"><svg class="pde-sqrt-sym" viewBox="0 0 12 18" preserveAspectRatio="none" aria-hidden="true"><path d="M1 9 L3.2 16.5 L8 1.2 H12" fill="none" stroke="currentColor" stroke-width="1.35" stroke-linejoin="round" stroke-linecap="square"/></svg><span class="pde-sqrt-inner">${convert(a.inner)}</span></span>`;
|
|
110
|
+
i = a.next;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
if (name === "left" || name === "right")
|
|
114
|
+
continue;
|
|
115
|
+
if (name === "begin" || name === "end") {
|
|
116
|
+
const g = takeGroup(src, i);
|
|
117
|
+
i = g.next;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
if (name === "hat" || name === "bar" || name === "vec" || name === "tilde") {
|
|
121
|
+
const g = takeGroup(src, i);
|
|
122
|
+
const mark = name === "hat" ? "̂" : name === "bar" ? "̄" : name === "vec" ? "⃗" : "̃";
|
|
123
|
+
out += `${convert(g.inner)}${mark}`;
|
|
124
|
+
i = g.next;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
out += GREEK[name] ?? OPS[name] ?? escapeHtml(`\\${name}`);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
out += c === " " ? " " : escapeHtml(c);
|
|
131
|
+
i++;
|
|
132
|
+
}
|
|
133
|
+
return out;
|
|
134
|
+
}
|
|
135
|
+
export function latexToHtml(latex) {
|
|
136
|
+
return convert(latex);
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../../src/core/equation/html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LaTeX equation helper — simple subset for v1
|
|
3
|
+
* Roadmap 2.1: "Ecuacciones latex sencillas" (corrected to "Ecuaciones LaTeX sencillas").
|
|
4
|
+
* Provides validation, sanitization and lightweight HTML rendering without external dependencies.
|
|
5
|
+
* Complex macros (\def, \input, etc.) are rejected by the validator.
|
|
6
|
+
*/
|
|
7
|
+
export declare const MAX_LATEX_LENGTH = 2000;
|
|
8
|
+
export interface LatexValidationResult {
|
|
9
|
+
valid: boolean;
|
|
10
|
+
errors: Array<{
|
|
11
|
+
code: string;
|
|
12
|
+
message: string;
|
|
13
|
+
}>;
|
|
14
|
+
}
|
|
15
|
+
export declare function validateLatex(latex: string): LatexValidationResult;
|
|
16
|
+
export { latexToHtml } from "./html.js";
|
|
17
|
+
export declare function latexToPlainText(latex: string): string;
|
|
18
|
+
export declare const equationCss = "\n.pde-equation {\n font-family: \"Cambria Math\", \"Latin Modern Math\", \"STIX Two Math\", serif;\n display: inline-block;\n vertical-align: middle;\n background: var(--pde-color-surface, #f7f8fa);\n border: 1px solid var(--pde-color-border, #d8dce3);\n border-radius: var(--pde-radius-sm, 4px);\n padding: 1px 6px;\n margin: 4px;\n white-space: nowrap;\n color: var(--pde-color-text, #17191c);\n}\n.pde-equation sup {\n font-size: 0.72em;\n vertical-align: super;\n line-height: 0;\n}\n.pde-equation sub {\n font-size: 0.72em;\n vertical-align: sub;\n line-height: 0;\n}\n.pde-equation--block {\n display: block;\n text-align: center;\n margin: 12px auto;\n padding: 8px 12px;\n max-width: 90%;\n white-space: normal;\n}\n.pde-frac { display: inline-block; vertical-align: middle; text-align: center; margin: 0 2px; line-height: 1.15; }\n.pde-frac-num { display: block; border-bottom: 1.5px solid currentColor; padding: 0 5px 1px; }\n.pde-frac-den { display: block; padding: 1px 5px 0; }\n.pde-sqrt { display: inline-flex; align-items: stretch; vertical-align: middle; }\n.pde-sqrt-sym { width: 0.62em; min-height: 1.05em; flex-shrink: 0; display: block; overflow: visible; }\n.pde-sqrt-inner { border-top: 1.35px solid currentColor; padding: 0.08em 0.28em 0.06em 0.04em; margin-left: -1px; line-height: 1.2; }\n";
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/equation/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAiCrC,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAuBlE;AAED,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,eAAO,MAAM,WAAW,8zCAqCvB,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LaTeX equation helper — simple subset for v1
|
|
3
|
+
* Roadmap 2.1: "Ecuacciones latex sencillas" (corrected to "Ecuaciones LaTeX sencillas").
|
|
4
|
+
* Provides validation, sanitization and lightweight HTML rendering without external dependencies.
|
|
5
|
+
* Complex macros (\def, \input, etc.) are rejected by the validator.
|
|
6
|
+
*/
|
|
7
|
+
export const MAX_LATEX_LENGTH = 2000;
|
|
8
|
+
const FORBIDDEN_COMMANDS = new Set(["\\input", "\\write", "\\def", "\\include", "\\catcode", "\\openout", "\\immediate", "\\loop", "\\repeat"]);
|
|
9
|
+
const ALLOWED_SIMPLE_COMMANDS = new Set([
|
|
10
|
+
"\\frac",
|
|
11
|
+
"\\sqrt",
|
|
12
|
+
"\\sum",
|
|
13
|
+
"\\int",
|
|
14
|
+
"\\alpha",
|
|
15
|
+
"\\beta",
|
|
16
|
+
"\\gamma",
|
|
17
|
+
"\\delta",
|
|
18
|
+
"\\epsilon",
|
|
19
|
+
"\\pi",
|
|
20
|
+
"\\theta",
|
|
21
|
+
"\\lambda",
|
|
22
|
+
"\\mu",
|
|
23
|
+
"\\sigma",
|
|
24
|
+
"\\omega",
|
|
25
|
+
"\\cdot",
|
|
26
|
+
"\\times",
|
|
27
|
+
"\\div",
|
|
28
|
+
"\\pm",
|
|
29
|
+
"\\leq",
|
|
30
|
+
"\\geq",
|
|
31
|
+
"\\neq",
|
|
32
|
+
"\\infty",
|
|
33
|
+
"\\rightarrow",
|
|
34
|
+
"\\left",
|
|
35
|
+
"\\right",
|
|
36
|
+
]);
|
|
37
|
+
export function validateLatex(latex) {
|
|
38
|
+
const errors = [];
|
|
39
|
+
if (!latex || !latex.trim())
|
|
40
|
+
errors.push({ code: "required", message: "latex required" });
|
|
41
|
+
if (latex.length > MAX_LATEX_LENGTH)
|
|
42
|
+
errors.push({ code: "too-long", message: `max ${MAX_LATEX_LENGTH} chars` });
|
|
43
|
+
for (const forb of FORBIDDEN_COMMANDS) {
|
|
44
|
+
if (latex.includes(forb))
|
|
45
|
+
errors.push({ code: "forbidden-command", message: `forbidden ${forb}` });
|
|
46
|
+
}
|
|
47
|
+
// Balanced braces check
|
|
48
|
+
let depth = 0;
|
|
49
|
+
for (const ch of latex) {
|
|
50
|
+
if (ch === "{")
|
|
51
|
+
depth++;
|
|
52
|
+
if (ch === "}") {
|
|
53
|
+
depth--;
|
|
54
|
+
if (depth < 0) {
|
|
55
|
+
errors.push({ code: "unbalanced-braces", message: "unbalanced braces" });
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
if (depth !== 0 && !errors.some((e) => e.code === "unbalanced-braces")) {
|
|
61
|
+
errors.push({ code: "unbalanced-braces", message: "unbalanced braces" });
|
|
62
|
+
}
|
|
63
|
+
return { valid: errors.length === 0, errors };
|
|
64
|
+
}
|
|
65
|
+
export { latexToHtml } from "./html.js";
|
|
66
|
+
export function latexToPlainText(latex) {
|
|
67
|
+
return `$${latex}$`;
|
|
68
|
+
}
|
|
69
|
+
export const equationCss = `
|
|
70
|
+
.pde-equation {
|
|
71
|
+
font-family: "Cambria Math", "Latin Modern Math", "STIX Two Math", serif;
|
|
72
|
+
display: inline-block;
|
|
73
|
+
vertical-align: middle;
|
|
74
|
+
background: var(--pde-color-surface, #f7f8fa);
|
|
75
|
+
border: 1px solid var(--pde-color-border, #d8dce3);
|
|
76
|
+
border-radius: var(--pde-radius-sm, 4px);
|
|
77
|
+
padding: 1px 6px;
|
|
78
|
+
margin: 4px;
|
|
79
|
+
white-space: nowrap;
|
|
80
|
+
color: var(--pde-color-text, #17191c);
|
|
81
|
+
}
|
|
82
|
+
.pde-equation sup {
|
|
83
|
+
font-size: 0.72em;
|
|
84
|
+
vertical-align: super;
|
|
85
|
+
line-height: 0;
|
|
86
|
+
}
|
|
87
|
+
.pde-equation sub {
|
|
88
|
+
font-size: 0.72em;
|
|
89
|
+
vertical-align: sub;
|
|
90
|
+
line-height: 0;
|
|
91
|
+
}
|
|
92
|
+
.pde-equation--block {
|
|
93
|
+
display: block;
|
|
94
|
+
text-align: center;
|
|
95
|
+
margin: 12px auto;
|
|
96
|
+
padding: 8px 12px;
|
|
97
|
+
max-width: 90%;
|
|
98
|
+
white-space: normal;
|
|
99
|
+
}
|
|
100
|
+
.pde-frac { display: inline-block; vertical-align: middle; text-align: center; margin: 0 2px; line-height: 1.15; }
|
|
101
|
+
.pde-frac-num { display: block; border-bottom: 1.5px solid currentColor; padding: 0 5px 1px; }
|
|
102
|
+
.pde-frac-den { display: block; padding: 1px 5px 0; }
|
|
103
|
+
.pde-sqrt { display: inline-flex; align-items: stretch; vertical-align: middle; }
|
|
104
|
+
.pde-sqrt-sym { width: 0.62em; min-height: 1.05em; flex-shrink: 0; display: block; overflow: visible; }
|
|
105
|
+
.pde-sqrt-inner { border-top: 1.35px solid currentColor; padding: 0.08em 0.28em 0.06em 0.04em; margin-left: -1px; line-height: 1.2; }
|
|
106
|
+
`;
|
|
107
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/equation/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAErC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAEhJ,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,OAAO;IACP,SAAS;IACT,QAAQ;IACR,SAAS;IACT,SAAS;IACT,WAAW;IACX,MAAM;IACN,SAAS;IACT,UAAU;IACV,MAAM;IACN,SAAS;IACT,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,cAAc;IACd,QAAQ;IACR,SAAS;CACV,CAAC,CAAC;AAOH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,MAAM,GAAoC,EAAE,CAAC;IACnD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC1F,IAAI,KAAK,CAAC,MAAM,GAAG,gBAAgB;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,gBAAgB,QAAQ,EAAE,CAAC,CAAC;IACjH,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,aAAa,IAAI,EAAE,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,wBAAwB;IACxB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;QACxB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;gBACzE,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,EAAE,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,IAAI,KAAK,GAAG,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC1B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type DocEventType = "beforeChange" | "afterChange" | "selectionChange" | "validate";
|
|
2
|
+
export interface DocEvent<T = unknown> {
|
|
3
|
+
type: DocEventType;
|
|
4
|
+
payload: T;
|
|
5
|
+
timestamp: string;
|
|
6
|
+
}
|
|
7
|
+
export type EventHandler<T = unknown> = (e: DocEvent<T>) => void;
|
|
8
|
+
export declare class EventEmitter {
|
|
9
|
+
private handlers;
|
|
10
|
+
on<T>(type: DocEventType, handler: EventHandler<T>): () => void;
|
|
11
|
+
emit<T>(type: DocEventType, payload: T): void;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|