markdown-flow-ui 0.3.2-dev.2 → 0.3.2
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/README.md +0 -13
- package/dist/_virtual/index.es8.js +2 -2
- package/dist/_virtual/index.es9.js +2 -2
- package/dist/_virtual/index8.cjs +1 -1
- package/dist/_virtual/index9.cjs +1 -1
- package/dist/assets/markdown-flow-ui.css +1 -1
- package/dist/components/ContentRender/IframeSandbox.cjs.map +1 -1
- package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
- package/dist/components/ContentRender/utils/video-markdown-run.cjs.map +1 -1
- package/dist/components/ContentRender/utils/video-markdown-run.es.js.map +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomButton.cjs.map +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomButton.es.js.map +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomControl.cjs.map +1 -1
- package/dist/components/MarkdownFlow/ScrollToBottomControl.es.js.map +1 -1
- package/dist/components/MarkdownFlow/useScrollToBottom.cjs.map +1 -1
- package/dist/components/MarkdownFlow/useScrollToBottom.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.d.ts +2 -2
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js +323 -562
- package/dist/components/MarkdownFlowEditor/MarkdownFlowEditor.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.d.ts +0 -8
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.es.js +64 -107
- package/dist/components/MarkdownFlowEditor/components/EditorToolbar.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/editor-context.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/editor-context.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/editor-context.es.js +4 -10
- package/dist/components/MarkdownFlowEditor/editor-context.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/editorI18n.d.ts +0 -308
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js +87 -115
- package/dist/components/MarkdownFlowEditor/locales/ar-SA.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.es.js +88 -116
- package/dist/components/MarkdownFlowEditor/locales/de-DE.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js +88 -116
- package/dist/components/MarkdownFlowEditor/locales/en-US.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js +80 -108
- package/dist/components/MarkdownFlowEditor/locales/es-ES.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.es.js +82 -110
- package/dist/components/MarkdownFlowEditor/locales/fil-PH.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js +86 -114
- package/dist/components/MarkdownFlowEditor/locales/fr-FR.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.es.js +88 -116
- package/dist/components/MarkdownFlowEditor/locales/ja-JP.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js +85 -113
- package/dist/components/MarkdownFlowEditor/locales/th-TH.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.es.js +94 -122
- package/dist/components/MarkdownFlowEditor/locales/ur-PK.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.es.js +74 -102
- package/dist/components/MarkdownFlowEditor/locales/vi-VN.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.d.ts +1 -15
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js +72 -100
- package/dist/components/MarkdownFlowEditor/locales/zh-CN.json.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.d.ts +2 -1
- package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.es.js +62 -53
- package/dist/components/MarkdownFlowEditor/plugins/ImgPlaceholder.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.d.ts +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/PlaceholderWidget.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs +3 -3
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.d.ts +1 -5
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js +149 -154
- package/dist/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.d.ts +2 -1
- package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.es.js +53 -42
- package/dist/components/MarkdownFlowEditor/plugins/VideoPlaceholder.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/types.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/types.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/types.d.ts +1 -11
- package/dist/components/MarkdownFlowEditor/types.es.js +2 -2
- package/dist/components/MarkdownFlowEditor/types.es.js.map +1 -1
- package/dist/components/MarkdownFlowEditor/utils.cjs +1 -1
- package/dist/components/MarkdownFlowEditor/utils.cjs.map +1 -1
- package/dist/components/MarkdownFlowEditor/utils.d.ts +0 -10
- package/dist/components/MarkdownFlowEditor/utils.es.js +59 -73
- package/dist/components/MarkdownFlowEditor/utils.es.js.map +1 -1
- package/dist/components/Slide/MarkdownSlideScaling.cjs.map +1 -1
- package/dist/components/Slide/MarkdownSlideScaling.es.js.map +1 -1
- package/dist/components/Slide/MobilePlayerSettingsSheet.es.js +16 -16
- package/dist/components/Slide/Player.cjs.map +1 -1
- package/dist/components/Slide/Player.es.js.map +1 -1
- package/dist/components/Slide/Slide.cjs.map +1 -1
- package/dist/components/Slide/Slide.es.js.map +1 -1
- package/dist/components/Slide/SubtitleOverlay.cjs.map +1 -1
- package/dist/components/Slide/SubtitleOverlay.es.js.map +1 -1
- package/dist/components/Slide/slideI18n.cjs.map +1 -1
- package/dist/components/Slide/slideI18n.es.js.map +1 -1
- package/dist/components/Slide/useSlide.cjs.map +1 -1
- package/dist/components/Slide/useSlide.es.js.map +1 -1
- package/dist/components/Slide/utils/streamingNavigation.cjs.map +1 -1
- package/dist/components/Slide/utils/streamingNavigation.es.js.map +1 -1
- package/dist/components/ui/dialog.cjs +1 -1
- package/dist/components/ui/dialog.cjs.map +1 -1
- package/dist/components/ui/dialog.es.js +27 -27
- package/dist/components/ui/dialog.es.js.map +1 -1
- package/dist/lib/interaction-defaults.cjs.map +1 -1
- package/dist/lib/interaction-defaults.es.js.map +1 -1
- package/dist/markdown-flow-ui-lib.css +1 -1
- package/dist/markdown-flow-ui.css +1 -1
- package/dist/node_modules/@braintree/sanitize-url/dist/index.cjs +1 -1
- package/dist/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
- package/dist/node_modules/@radix-ui/react-context/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-context/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-context/dist/index.es.js +34 -49
- package/dist/node_modules/@radix-ui/react-context/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-dialog/dist/index.cjs +1 -5
- package/dist/node_modules/@radix-ui/react-dialog/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-dialog/dist/index.es.js +206 -220
- package/dist/node_modules/@radix-ui/react-dialog/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive/dist/index.es.js +50 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/primitive/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs/dist/index.es.js +34 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-compose-refs/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context/dist/index.es.js +82 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-context/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/dist/index.es.js +216 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-dismissable-layer/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id/dist/index.es.js +15 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-id/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal/dist/index.es.js +18 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-portal/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence/dist/index.es.js +104 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-presence/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive/dist/index.es.js +39 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-primitive/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref/dist/index.es.js +13 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-callback-ref/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state/dist/index.es.js +70 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-controllable-state/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-effect-event/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-effect-event/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-effect-event/dist/index.es.js +20 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-effect-event/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect/dist/index.es.js +7 -0
- package/dist/node_modules/@radix-ui/react-dialog/node_modules/@radix-ui/react-use-layout-effect/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.es.js +18 -9
- package/dist/node_modules/@radix-ui/react-focus-guards/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.es.js +148 -100
- package/dist/node_modules/@radix-ui/react-focus-scope/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-compose-refs/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-compose-refs/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-compose-refs/dist/index.es.js +34 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-compose-refs/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive/dist/index.es.js +39 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-primitive/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-use-callback-ref/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-use-callback-ref/dist/index.es.js +13 -0
- package/dist/node_modules/@radix-ui/react-focus-scope/node_modules/@radix-ui/react-use-callback-ref/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-id/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-id/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-id/dist/index.es.js +8 -8
- package/dist/node_modules/@radix-ui/react-id/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-primitive/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-primitive/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-primitive/dist/index.es.js +1 -1
- package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.es.js +50 -0
- package/dist/node_modules/@radix-ui/react-primitive/node_modules/@radix-ui/react-slot/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-slot/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-slot/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-slot/dist/index.es.js +80 -41
- package/dist/node_modules/@radix-ui/react-slot/dist/index.es.js.map +1 -1
- package/dist/node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs/dist/index.es.js +34 -0
- package/dist/node_modules/@radix-ui/react-slot/node_modules/@radix-ui/react-compose-refs/dist/index.es.js.map +1 -0
- package/dist/node_modules/@radix-ui/react-tooltip/dist/index.cjs +1 -1
- package/dist/node_modules/@radix-ui/react-tooltip/dist/index.cjs.map +1 -1
- package/dist/node_modules/@radix-ui/react-tooltip/dist/index.es.js +1 -1
- package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.cjs +2 -0
- package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.cjs.map +1 -0
- package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.es.js +12 -0
- package/dist/node_modules/@radix-ui/react-tooltip/node_modules/@radix-ui/react-slot/dist/index.es.js.map +1 -0
- package/dist/node_modules/classnames/index.cjs +1 -1
- package/dist/node_modules/classnames/index.es.js +1 -1
- package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.cjs +2 -2
- package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.cjs.map +1 -1
- package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.es.js +75 -72
- package/dist/node_modules/react-remove-scroll/dist/es2015/SideEffect.es.js.map +1 -1
- package/package.json +10 -10
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.cjs +0 -2
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.cjs.map +0 -1
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.d.ts +0 -17
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.es.js +0 -46
- package/dist/components/MarkdownFlowEditor/components/CustomPopover.es.js.map +0 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.cjs +0 -2
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.cjs.map +0 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.d.ts +0 -18
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.es.js +0 -184
- package/dist/components/MarkdownFlowEditor/components/VariableSearchDropdown.es.js.map +0 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs +0 -2
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.cjs.map +0 -1
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.d.ts +0 -11
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js +0 -172
- package/dist/components/MarkdownFlowEditor/components/VariableSelect.es.js.map +0 -1
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.cjs +0 -2
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.cjs.map +0 -1
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.d.ts +0 -3
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.es.js +0 -32
- package/dist/components/MarkdownFlowEditor/components/icons/SearchBracesIcon.es.js.map +0 -1
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.cjs +0 -3
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.cjs.map +0 -1
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.d.ts +0 -9
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.es.js +0 -53
- package/dist/components/MarkdownFlowEditor/plugins/VariablePlaceholder.es.js.map +0 -1
- package/dist/components/ui/popover.cjs +0 -2
- package/dist/components/ui/popover.cjs.map +0 -1
- package/dist/components/ui/popover.es.js +0 -24
- package/dist/components/ui/popover.es.js.map +0 -1
- package/dist/node_modules/@radix-ui/react-popover/dist/index.cjs +0 -2
- package/dist/node_modules/@radix-ui/react-popover/dist/index.cjs.map +0 -1
- package/dist/node_modules/@radix-ui/react-popover/dist/index.es.js +0 -241
- package/dist/node_modules/@radix-ui/react-popover/dist/index.es.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/braces.cjs +0 -7
- package/dist/node_modules/lucide-react/dist/esm/icons/braces.cjs.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/braces.es.js +0 -25
- package/dist/node_modules/lucide-react/dist/esm/icons/braces.es.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/plus.cjs +0 -7
- package/dist/node_modules/lucide-react/dist/esm/icons/plus.cjs.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/plus.es.js +0 -16
- package/dist/node_modules/lucide-react/dist/esm/icons/plus.es.js.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/search.cjs +0 -7
- package/dist/node_modules/lucide-react/dist/esm/icons/search.cjs.map +0 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/search.es.js +0 -16
- package/dist/node_modules/lucide-react/dist/esm/icons/search.es.js.map +0 -1
- /package/dist/components/MarkdownFlowEditor/plugins/{VariablePlaceholder.test.d.ts → MediaPlaceholder.variables.test.d.ts} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SyntaxHighlighter.es.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.ts"],"sourcesContent":["import {\n Decoration,\n DecorationSet,\n EditorView,\n ViewPlugin,\n ViewUpdate,\n} from \"@codemirror/view\";\nimport { RangeSetBuilder } from \"@codemirror/state\";\nimport { getMarkdownSourceAnalysis } from \"../../ContentRender/utils/inline-code-ranges\";\nimport { INTERACTION_CONTENT_SOURCE, isEscape } from \"remark-flow\";\n\nimport {\n findVariableMarkers,\n findDocumentVariableMarkers,\n trimVariablePadding,\n} from \"../utils\";\n\nconst commentRegex = /<!--[\\s\\S]*?-->/g;\n\n// An unfinished marker still owns its tail, so nested syntax stays literal while typing.\nconst interactionVariableRanges = (text: string) => {\n const markers = findVariableMarkers(text);\n const pending = text.indexOf(\"{{\", markers.at(-1)?.end ?? 0);\n return pending === -1\n ? markers\n : [...markers, { start: pending, end: text.length, name: null }];\n};\n// The grammar's own definition of where an interaction ends, so a `\\]` an option escaped does\n// not cut the highlight short, and the same `(?!\\()` the parser uses, so `?[text](url)` stays a\n// markdown link. Taken from remark-flow rather than written again here: the editor and the\n// parser have to agree about what they are looking at.\nconst controlBlockRegex = new RegExp(\n `\\\\?\\\\[(${INTERACTION_CONTENT_SOURCE})\\\\](?!\\\\()`,\n \"g\"\n);\n\nconst documentControlRanges = (text: string) =>\n getMarkdownSourceAnalysis(text).interactions;\n\nexport interface SyntaxHighlightRange {\n from: number;\n to: number;\n className: string;\n}\n\nfunction collectMultilineFixedOutputRanges(\n docText: string,\n isInsideVariable: (position: number) => boolean\n): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let pendingStart: number | null = null;\n let lineStart = 0;\n\n while (lineStart <= docText.length) {\n const newlineIndex = docText.indexOf(\"\\n\", lineStart);\n const lineEnd = newlineIndex === -1 ? docText.length : newlineIndex;\n const lineText = docText.slice(lineStart, lineEnd);\n\n if (lineText.trim() === \"!===\" && !isInsideVariable(lineStart)) {\n if (pendingStart === null) {\n pendingStart = lineStart;\n } else {\n ranges.push({\n from: pendingStart,\n to: lineEnd,\n className: \"syntax-fixed\",\n });\n pendingStart = null;\n }\n }\n\n if (newlineIndex === -1) {\n break;\n }\n\n lineStart = newlineIndex + 1;\n }\n\n return ranges;\n}\n\nfunction collectSingleLineFixedOutputRanges(\n docText: string,\n commentRanges: SyntaxHighlightRange[],\n isInsideVariable: (position: number) => boolean\n): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let commentIndex = 0;\n\n const isInsideComment = (index: number) => {\n while (\n commentIndex < commentRanges.length &&\n commentRanges[commentIndex].to <= index\n ) {\n commentIndex++;\n }\n\n const range = commentRanges[commentIndex];\n return !!range && index >= range.from && index < range.to;\n };\n\n let lineStart = 0;\n while (lineStart <= docText.length) {\n const newlineIndex = docText.indexOf(\"\\n\", lineStart);\n const lineEnd = newlineIndex === -1 ? docText.length : newlineIndex;\n const lineText = docText.slice(lineStart, lineEnd);\n const markerPositions: number[] = [];\n let searchFrom = 0;\n\n while (searchFrom < lineText.length) {\n const markerOffset = lineText.indexOf(\"===\", searchFrom);\n if (markerOffset === -1) {\n break;\n }\n\n const markerIndex = lineStart + markerOffset;\n const isNegated = markerIndex > 0 && docText[markerIndex - 1] === \"!\";\n if (\n !isNegated &&\n !isInsideComment(markerIndex) &&\n !isInsideVariable(markerIndex)\n ) {\n markerPositions.push(markerIndex);\n }\n\n searchFrom = markerOffset + 3;\n }\n\n for (let i = 0; i + 1 < markerPositions.length; i += 2) {\n ranges.push({\n from: markerPositions[i],\n to: markerPositions[i + 1] + 3,\n className: \"syntax-fixed\",\n });\n }\n\n if (newlineIndex === -1) {\n break;\n }\n\n lineStart = newlineIndex + 1;\n }\n\n return ranges;\n}\n\nfunction collectCommentRanges(\n docText: string,\n isInsideVariable: (position: number) => boolean\n): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let match;\n\n commentRegex.lastIndex = 0;\n while ((match = commentRegex.exec(docText)) !== null) {\n if (isInsideVariable(match.index)) continue;\n ranges.push({\n from: match.index,\n to: match.index + match[0].length,\n className: \"syntax-comment\",\n });\n }\n\n return ranges;\n}\n\n/**\n * Collects non-overlapping fixed-output and comment wrapper ranges.\n *\n * @param docText - Document text to scan.\n * @returns Outer syntax highlight ranges sorted by document position.\n */\nexport function collectOuterBlockRanges(\n docText: string\n): SyntaxHighlightRange[] {\n const variables = findDocumentVariableMarkers(docText);\n const isInsideVariable = (position: number) =>\n variables.some(\n (marker) => position >= marker.start && position < marker.end\n );\n const commentRanges = collectCommentRanges(docText, isInsideVariable);\n const blockRanges = [\n ...collectMultilineFixedOutputRanges(docText, isInsideVariable),\n ...collectSingleLineFixedOutputRanges(\n docText,\n commentRanges,\n isInsideVariable\n ),\n ...commentRanges,\n ].sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return b.to - a.to;\n });\n\n const outerRanges: SyntaxHighlightRange[] = [];\n\n for (const range of blockRanges) {\n const lastOuter = outerRanges[outerRanges.length - 1];\n if (!lastOuter || range.from >= lastOuter.to) {\n outerRanges.push(range);\n }\n }\n\n return outerRanges;\n}\n\n/**\n * Collects all custom syntax highlight ranges for editor decorations.\n *\n * @param docText - Document text to scan.\n * @param isCursorInside - Returns true when the current cursor is inside a range.\n * @returns Non-overlapping syntax highlight ranges sorted by document position.\n */\nexport function collectSyntaxHighlightRanges(\n docText: string,\n isCursorInside: (from: number, to: number) => boolean = () => false,\n questionMode = false\n): SyntaxHighlightRange[] {\n const matches: SyntaxHighlightRange[] = [];\n const documentVariables = findDocumentVariableMarkers(docText);\n const occupied: { from: number; to: number }[] = [];\n\n controlBlockRegex.lastIndex = 0;\n\n // Prevent overlapping decorations so styling stays deterministic\n const isOverlapping = (from: number, to: number) =>\n occupied.some((range) => !(to <= range.from || from >= range.to));\n\n const addMatch = (from: number, to: number, className: string) => {\n if (from >= to) return false;\n if (isOverlapping(from, to)) return false;\n occupied.push({ from, to });\n matches.push({ from, to, className });\n return true;\n };\n\n // 1. Outer block ranges win over any syntax inside them.\n for (const range of collectOuterBlockRanges(docText)) {\n addMatch(range.from, range.to, range.className);\n }\n\n // 2. Control Blocks\n for (const control of documentControlRanges(docText)) {\n // Native Markdown owns document boundaries. The shared token grammar still\n // supplies the exact source offsets used for individual editor decorations.\n controlBlockRegex.lastIndex = control.start;\n const match = controlBlockRegex.exec(docText);\n if (\n !match ||\n match.index !== control.start ||\n match.index + match[0].length !== control.end\n )\n continue;\n const fullStart = match.index;\n const fullEnd = match.index + match[0].length;\n const content = match[1];\n const contentStart = fullStart + 2; // after ?[\n if (\n isOverlapping(fullStart, fullEnd) ||\n documentVariables.some(\n (marker) => marker.start <= fullStart && fullStart < marker.end\n )\n ) {\n continue;\n }\n\n // Outer brackets and question mark\n addMatch(fullStart, fullStart + 1, \"syntax-keyword\"); // ?\n addMatch(fullStart + 1, fullStart + 2, \"syntax-bracket\"); // [\n addMatch(fullEnd - 1, fullEnd, \"syntax-bracket\"); // ]\n\n const variables = interactionVariableRanges(content);\n const firstVariable = variables[0];\n const percentIndex = firstVariable ? firstVariable.start - 1 : -1;\n const hasLeadingAssignment =\n percentIndex >= 0 &&\n content[percentIndex] === \"%\" &&\n trimVariablePadding(content.slice(0, percentIndex)) === \"\";\n if (content.startsWith(\"%\") || hasLeadingAssignment) {\n // Input / Select\n let percentClass = \"syntax-percent-invalid\";\n if (firstVariable && hasLeadingAssignment) {\n const varFrom = contentStart + firstVariable.start;\n const varTo = contentStart + firstVariable.end;\n const cursorInsideVar = isCursorInside(varFrom, varTo);\n percentClass =\n firstVariable.name !== null && !cursorInsideVar\n ? \"syntax-percent-valid\"\n : \"syntax-percent-invalid\";\n }\n const percentStart =\n contentStart + (hasLeadingAssignment ? percentIndex : 0);\n addMatch(percentStart, percentStart + 1, percentClass); // %\n\n const operatorRanges: { from: number; to: number }[] = [];\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedTokenRanges: { from: number; to: number }[] = [];\n\n // Keep a variable name atomic even when it contains option punctuation.\n for (const variable of variables) {\n variableRanges.push({\n from: contentStart + variable.start,\n to: contentStart + variable.end,\n className:\n variable.name === null\n ? \"syntax-variable-invalid\"\n : \"syntax-variable\",\n });\n }\n\n // Inner operators | || ... -- skipping any an option escaped, the way the parser does.\n // Painted as separators, they told the author the grammar had split an option that it\n // had in fact left whole.\n let scanIndex = 0;\n while (scanIndex < content.length) {\n const variable = variableRanges.find(\n (range) => contentStart + scanIndex === range.from\n );\n if (variable) {\n scanIndex = variable.to - contentStart;\n continue;\n }\n if (isEscape(content, scanIndex)) {\n scanIndex += 2;\n continue;\n }\n const operator = content.startsWith(\"||\", scanIndex)\n ? \"||\"\n : content[scanIndex] === \"|\"\n ? \"|\"\n : content.startsWith(\"...\", scanIndex)\n ? \"...\"\n : null;\n if (!operator) {\n scanIndex += 1;\n continue;\n }\n operatorRanges.push({\n from: contentStart + scanIndex,\n to: contentStart + scanIndex + operator.length,\n });\n scanIndex += operator.length;\n }\n\n const allTokens = [\n ...operatorRanges.map((range) => ({\n ...range,\n className: \"syntax-keyword\",\n })),\n ...variableRanges.map((range) => ({\n ...range,\n className: range.className,\n })),\n ].sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of allTokens) {\n if (\n token.className.startsWith(\"syntax-variable\") &&\n isCursorInside(token.from, token.to)\n ) {\n continue;\n }\n if (addMatch(token.from, token.to, token.className)) {\n appliedTokenRanges.push({ from: token.from, to: token.to });\n }\n }\n\n // Content (Dark Blue) for remaining text segments\n const stringStart = percentStart + 1;\n const stringEnd = fullEnd - 1;\n let cursor = stringStart;\n const sortedApplied = appliedTokenRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of sortedApplied) {\n if (cursor < token.from) {\n addMatch(cursor, token.from, \"syntax-string\");\n }\n cursor = Math.max(cursor, token.to);\n }\n if (cursor < stringEnd) {\n addMatch(cursor, stringEnd, \"syntax-string\");\n }\n } else {\n // Button ?[text]\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedVariableRanges: { from: number; to: number }[] = [];\n\n for (const variable of interactionVariableRanges(content)) {\n variableRanges.push({\n from: contentStart + variable.start,\n to: contentStart + variable.end,\n className:\n variable.name === null\n ? \"syntax-variable-invalid\"\n : \"syntax-variable\",\n });\n }\n\n const sortedVariables = variableRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const variable of sortedVariables) {\n if (\n variable.className.startsWith(\"syntax-variable\") &&\n isCursorInside(variable.from, variable.to)\n ) {\n continue;\n }\n if (addMatch(variable.from, variable.to, variable.className)) {\n appliedVariableRanges.push({ from: variable.from, to: variable.to });\n }\n }\n\n const buttonTextStart = contentStart;\n const buttonTextEnd = fullEnd - 1;\n let cursor = buttonTextStart;\n\n for (const variable of appliedVariableRanges) {\n if (cursor < variable.from) {\n addMatch(cursor, variable.from, \"syntax-button-text\");\n }\n cursor = Math.max(cursor, variable.to);\n }\n if (cursor < buttonTextEnd) {\n addMatch(cursor, buttonTextEnd, \"syntax-button-text\");\n }\n }\n }\n\n // 3. Variables (only if not already decorated; invalid ones stay default outside control blocks)\n for (const variable of questionMode ? [] : documentVariables) {\n if (\n variable.name !== null &&\n !isCursorInside(variable.start, variable.end)\n ) {\n addMatch(variable.start, variable.end, \"syntax-variable\");\n }\n }\n\n // Sort matches by 'from' asc, then 'to' desc (longest first)\n matches.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return b.to - a.to;\n });\n\n return matches;\n}\n\nfunction buildDecorations(\n view: EditorView,\n questionMode = false\n): DecorationSet {\n const builder = new RangeSetBuilder<Decoration>();\n const docText = view.state.doc.toString();\n const matches = collectSyntaxHighlightRanges(\n docText,\n (from, to) => {\n return view.state.selection.ranges.some((range) => {\n return range.from >= from && range.to <= to;\n });\n },\n questionMode\n );\n\n for (const m of matches) {\n if (m.from < m.to) {\n try {\n builder.add(m.from, m.to, Decoration.mark({ class: m.className }));\n } catch (e) {\n console.warn(\"SyntaxHighlighter: Failed to add decoration\", m, e);\n }\n }\n }\n\n return builder.finish();\n}\n\nconst createSyntaxHighlighter = (questionMode = false) =>\n ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view, questionMode);\n }\n\n update(update: ViewUpdate) {\n if (\n update.docChanged ||\n update.viewportChanged ||\n update.selectionSet\n ) {\n this.decorations = buildDecorations(update.view, questionMode);\n }\n }\n },\n {\n decorations: (instance) => instance.decorations,\n }\n );\n\nconst SyntaxHighlighter = createSyntaxHighlighter();\nexport const QuestionSyntaxHighlighter = createSyntaxHighlighter(true);\n\nexport default SyntaxHighlighter;\n"],"names":["commentRegex","interactionVariableRanges","text","markers","findVariableMarkers","pending","controlBlockRegex","INTERACTION_CONTENT_SOURCE","documentControlRanges","getMarkdownSourceAnalysis","collectMultilineFixedOutputRanges","docText","isInsideVariable","ranges","pendingStart","lineStart","newlineIndex","lineEnd","collectSingleLineFixedOutputRanges","commentRanges","commentIndex","isInsideComment","index","range","lineText","markerPositions","searchFrom","markerOffset","markerIndex","i","collectCommentRanges","match","collectOuterBlockRanges","variables","findDocumentVariableMarkers","position","marker","blockRanges","a","b","outerRanges","lastOuter","collectSyntaxHighlightRanges","isCursorInside","questionMode","matches","documentVariables","occupied","isOverlapping","from","to","addMatch","className","control","fullStart","fullEnd","content","contentStart","firstVariable","percentIndex","hasLeadingAssignment","trimVariablePadding","percentClass","varFrom","varTo","cursorInsideVar","percentStart","operatorRanges","variableRanges","appliedTokenRanges","variable","scanIndex","isEscape","operator","allTokens","token","stringStart","stringEnd","cursor","sortedApplied","appliedVariableRanges","sortedVariables","buttonTextStart","buttonTextEnd","buildDecorations","view","builder","RangeSetBuilder","m","Decoration","e","createSyntaxHighlighter","ViewPlugin","update","instance","SyntaxHighlighter","QuestionSyntaxHighlighter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SyntaxHighlighter.es.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/SyntaxHighlighter.ts"],"sourcesContent":["import {\n Decoration,\n DecorationSet,\n EditorView,\n ViewPlugin,\n ViewUpdate,\n} from \"@codemirror/view\";\nimport { RangeSetBuilder } from \"@codemirror/state\";\nimport { getMarkdownSourceAnalysis } from \"../../ContentRender/utils/inline-code-ranges\";\nimport { INTERACTION_CONTENT_SOURCE, isEscape } from \"remark-flow\";\n\nimport {\n findVariableMarkers,\n findDocumentVariableMarkers,\n trimVariablePadding,\n} from \"../utils\";\n\nconst commentRegex = /<!--[\\s\\S]*?-->/g;\n\n// An unfinished marker still owns its tail, so nested syntax stays literal while typing.\nconst interactionVariableRanges = (text: string) => {\n const markers = findVariableMarkers(text);\n const pending = text.indexOf(\"{{\", markers.at(-1)?.end ?? 0);\n return pending === -1\n ? markers\n : [...markers, { start: pending, end: text.length, name: null }];\n};\n// The grammar's own definition of where an interaction ends, so a `\\]` an option escaped does\n// not cut the highlight short, and the same `(?!\\()` the parser uses, so `?[text](url)` stays a\n// markdown link. Taken from remark-flow rather than written again here: the editor and the\n// parser have to agree about what they are looking at.\nconst controlBlockRegex = new RegExp(\n `\\\\?\\\\[(${INTERACTION_CONTENT_SOURCE})\\\\](?!\\\\()`,\n \"g\"\n);\n\nconst documentControlRanges = (text: string) =>\n getMarkdownSourceAnalysis(text).interactions;\n\nexport interface SyntaxHighlightRange {\n from: number;\n to: number;\n className: string;\n}\n\nfunction collectMultilineFixedOutputRanges(\n docText: string,\n isInsideVariable: (position: number) => boolean\n): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let pendingStart: number | null = null;\n let lineStart = 0;\n\n while (lineStart <= docText.length) {\n const newlineIndex = docText.indexOf(\"\\n\", lineStart);\n const lineEnd = newlineIndex === -1 ? docText.length : newlineIndex;\n const lineText = docText.slice(lineStart, lineEnd);\n\n if (lineText.trim() === \"!===\" && !isInsideVariable(lineStart)) {\n if (pendingStart === null) {\n pendingStart = lineStart;\n } else {\n ranges.push({\n from: pendingStart,\n to: lineEnd,\n className: \"syntax-fixed\",\n });\n pendingStart = null;\n }\n }\n\n if (newlineIndex === -1) {\n break;\n }\n\n lineStart = newlineIndex + 1;\n }\n\n return ranges;\n}\n\nfunction collectSingleLineFixedOutputRanges(\n docText: string,\n commentRanges: SyntaxHighlightRange[],\n isInsideVariable: (position: number) => boolean\n): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let commentIndex = 0;\n\n const isInsideComment = (index: number) => {\n while (\n commentIndex < commentRanges.length &&\n commentRanges[commentIndex].to <= index\n ) {\n commentIndex++;\n }\n\n const range = commentRanges[commentIndex];\n return !!range && index >= range.from && index < range.to;\n };\n\n let lineStart = 0;\n while (lineStart <= docText.length) {\n const newlineIndex = docText.indexOf(\"\\n\", lineStart);\n const lineEnd = newlineIndex === -1 ? docText.length : newlineIndex;\n const lineText = docText.slice(lineStart, lineEnd);\n const markerPositions: number[] = [];\n let searchFrom = 0;\n\n while (searchFrom < lineText.length) {\n const markerOffset = lineText.indexOf(\"===\", searchFrom);\n if (markerOffset === -1) {\n break;\n }\n\n const markerIndex = lineStart + markerOffset;\n const isNegated = markerIndex > 0 && docText[markerIndex - 1] === \"!\";\n if (\n !isNegated &&\n !isInsideComment(markerIndex) &&\n !isInsideVariable(markerIndex)\n ) {\n markerPositions.push(markerIndex);\n }\n\n searchFrom = markerOffset + 3;\n }\n\n for (let i = 0; i + 1 < markerPositions.length; i += 2) {\n ranges.push({\n from: markerPositions[i],\n to: markerPositions[i + 1] + 3,\n className: \"syntax-fixed\",\n });\n }\n\n if (newlineIndex === -1) {\n break;\n }\n\n lineStart = newlineIndex + 1;\n }\n\n return ranges;\n}\n\nfunction collectCommentRanges(\n docText: string,\n isInsideVariable: (position: number) => boolean\n): SyntaxHighlightRange[] {\n const ranges: SyntaxHighlightRange[] = [];\n let match;\n\n commentRegex.lastIndex = 0;\n while ((match = commentRegex.exec(docText)) !== null) {\n if (isInsideVariable(match.index)) continue;\n ranges.push({\n from: match.index,\n to: match.index + match[0].length,\n className: \"syntax-comment\",\n });\n }\n\n return ranges;\n}\n\n/**\n * Collects non-overlapping fixed-output and comment wrapper ranges.\n *\n * @param docText - Document text to scan.\n * @returns Outer syntax highlight ranges sorted by document position.\n */\nexport function collectOuterBlockRanges(\n docText: string\n): SyntaxHighlightRange[] {\n const variables = findDocumentVariableMarkers(docText);\n const isInsideVariable = (position: number) =>\n variables.some(\n (marker) => position >= marker.start && position < marker.end\n );\n const commentRanges = collectCommentRanges(docText, isInsideVariable);\n const blockRanges = [\n ...collectMultilineFixedOutputRanges(docText, isInsideVariable),\n ...collectSingleLineFixedOutputRanges(\n docText,\n commentRanges,\n isInsideVariable\n ),\n ...commentRanges,\n ].sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return b.to - a.to;\n });\n\n const outerRanges: SyntaxHighlightRange[] = [];\n\n for (const range of blockRanges) {\n const lastOuter = outerRanges[outerRanges.length - 1];\n if (!lastOuter || range.from >= lastOuter.to) {\n outerRanges.push(range);\n }\n }\n\n return outerRanges;\n}\n\n/**\n * Collects all custom syntax highlight ranges for editor decorations.\n *\n * @param docText - Document text to scan.\n * @param isCursorInside - Returns true when the current cursor is inside a range.\n * @returns Non-overlapping syntax highlight ranges sorted by document position.\n */\nexport function collectSyntaxHighlightRanges(\n docText: string,\n isCursorInside: (from: number, to: number) => boolean = () => false\n): SyntaxHighlightRange[] {\n const matches: SyntaxHighlightRange[] = [];\n const documentVariables = findDocumentVariableMarkers(docText);\n const occupied: { from: number; to: number }[] = [];\n\n controlBlockRegex.lastIndex = 0;\n\n // Prevent overlapping decorations so styling stays deterministic\n const isOverlapping = (from: number, to: number) =>\n occupied.some((range) => !(to <= range.from || from >= range.to));\n\n const addMatch = (from: number, to: number, className: string) => {\n if (from >= to) return false;\n if (isOverlapping(from, to)) return false;\n occupied.push({ from, to });\n matches.push({ from, to, className });\n return true;\n };\n\n // 1. Outer block ranges win over any syntax inside them.\n for (const range of collectOuterBlockRanges(docText)) {\n addMatch(range.from, range.to, range.className);\n }\n\n // 2. Control Blocks\n for (const control of documentControlRanges(docText)) {\n // Native Markdown owns document boundaries. The shared token grammar still\n // supplies the exact source offsets used for individual editor decorations.\n controlBlockRegex.lastIndex = control.start;\n const match = controlBlockRegex.exec(docText);\n if (\n !match ||\n match.index !== control.start ||\n match.index + match[0].length !== control.end\n )\n continue;\n const fullStart = match.index;\n const fullEnd = match.index + match[0].length;\n const content = match[1];\n const contentStart = fullStart + 2; // after ?[\n if (\n isOverlapping(fullStart, fullEnd) ||\n documentVariables.some(\n (marker) => marker.start <= fullStart && fullStart < marker.end\n )\n ) {\n continue;\n }\n\n // Outer brackets and question mark\n addMatch(fullStart, fullStart + 1, \"syntax-keyword\"); // ?\n addMatch(fullStart + 1, fullStart + 2, \"syntax-bracket\"); // [\n addMatch(fullEnd - 1, fullEnd, \"syntax-bracket\"); // ]\n\n const variables = interactionVariableRanges(content);\n const firstVariable = variables[0];\n const percentIndex = firstVariable ? firstVariable.start - 1 : -1;\n const hasLeadingAssignment =\n percentIndex >= 0 &&\n content[percentIndex] === \"%\" &&\n trimVariablePadding(content.slice(0, percentIndex)) === \"\";\n if (content.startsWith(\"%\") || hasLeadingAssignment) {\n // Input / Select\n let percentClass = \"syntax-percent-invalid\";\n if (firstVariable && hasLeadingAssignment) {\n const varFrom = contentStart + firstVariable.start;\n const varTo = contentStart + firstVariable.end;\n const cursorInsideVar = isCursorInside(varFrom, varTo);\n percentClass =\n firstVariable.name !== null && !cursorInsideVar\n ? \"syntax-percent-valid\"\n : \"syntax-percent-invalid\";\n }\n const percentStart =\n contentStart + (hasLeadingAssignment ? percentIndex : 0);\n addMatch(percentStart, percentStart + 1, percentClass); // %\n\n const operatorRanges: { from: number; to: number }[] = [];\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedTokenRanges: { from: number; to: number }[] = [];\n\n // Keep a variable name atomic even when it contains option punctuation.\n for (const variable of variables) {\n variableRanges.push({\n from: contentStart + variable.start,\n to: contentStart + variable.end,\n className:\n variable.name === null\n ? \"syntax-variable-invalid\"\n : \"syntax-variable\",\n });\n }\n\n // Inner operators | || ... -- skipping any an option escaped, the way the parser does.\n // Painted as separators, they told the author the grammar had split an option that it\n // had in fact left whole.\n let scanIndex = 0;\n while (scanIndex < content.length) {\n const variable = variableRanges.find(\n (range) => contentStart + scanIndex === range.from\n );\n if (variable) {\n scanIndex = variable.to - contentStart;\n continue;\n }\n if (isEscape(content, scanIndex)) {\n scanIndex += 2;\n continue;\n }\n const operator = content.startsWith(\"||\", scanIndex)\n ? \"||\"\n : content[scanIndex] === \"|\"\n ? \"|\"\n : content.startsWith(\"...\", scanIndex)\n ? \"...\"\n : null;\n if (!operator) {\n scanIndex += 1;\n continue;\n }\n operatorRanges.push({\n from: contentStart + scanIndex,\n to: contentStart + scanIndex + operator.length,\n });\n scanIndex += operator.length;\n }\n\n const allTokens = [\n ...operatorRanges.map((range) => ({\n ...range,\n className: \"syntax-keyword\",\n })),\n ...variableRanges.map((range) => ({\n ...range,\n className: range.className,\n })),\n ].sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of allTokens) {\n if (\n token.className.startsWith(\"syntax-variable\") &&\n isCursorInside(token.from, token.to)\n ) {\n continue;\n }\n if (addMatch(token.from, token.to, token.className)) {\n appliedTokenRanges.push({ from: token.from, to: token.to });\n }\n }\n\n // Content (Dark Blue) for remaining text segments\n const stringStart = percentStart + 1;\n const stringEnd = fullEnd - 1;\n let cursor = stringStart;\n const sortedApplied = appliedTokenRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const token of sortedApplied) {\n if (cursor < token.from) {\n addMatch(cursor, token.from, \"syntax-string\");\n }\n cursor = Math.max(cursor, token.to);\n }\n if (cursor < stringEnd) {\n addMatch(cursor, stringEnd, \"syntax-string\");\n }\n } else {\n // Button ?[text]\n const variableRanges: { from: number; to: number; className: string }[] =\n [];\n const appliedVariableRanges: { from: number; to: number }[] = [];\n\n for (const variable of interactionVariableRanges(content)) {\n variableRanges.push({\n from: contentStart + variable.start,\n to: contentStart + variable.end,\n className:\n variable.name === null\n ? \"syntax-variable-invalid\"\n : \"syntax-variable\",\n });\n }\n\n const sortedVariables = variableRanges.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return a.to - b.to;\n });\n\n for (const variable of sortedVariables) {\n if (\n variable.className.startsWith(\"syntax-variable\") &&\n isCursorInside(variable.from, variable.to)\n ) {\n continue;\n }\n if (addMatch(variable.from, variable.to, variable.className)) {\n appliedVariableRanges.push({ from: variable.from, to: variable.to });\n }\n }\n\n const buttonTextStart = contentStart;\n const buttonTextEnd = fullEnd - 1;\n let cursor = buttonTextStart;\n\n for (const variable of appliedVariableRanges) {\n if (cursor < variable.from) {\n addMatch(cursor, variable.from, \"syntax-button-text\");\n }\n cursor = Math.max(cursor, variable.to);\n }\n if (cursor < buttonTextEnd) {\n addMatch(cursor, buttonTextEnd, \"syntax-button-text\");\n }\n }\n }\n\n // 3. Variables (only if not already decorated; invalid ones stay default outside control blocks)\n for (const variable of documentVariables) {\n if (\n variable.name !== null &&\n !isCursorInside(variable.start, variable.end)\n ) {\n addMatch(variable.start, variable.end, \"syntax-variable\");\n }\n }\n\n // Sort matches by 'from' asc, then 'to' desc (longest first)\n matches.sort((a, b) => {\n if (a.from !== b.from) return a.from - b.from;\n return b.to - a.to;\n });\n\n return matches;\n}\n\nfunction buildDecorations(view: EditorView): DecorationSet {\n const builder = new RangeSetBuilder<Decoration>();\n const docText = view.state.doc.toString();\n const matches = collectSyntaxHighlightRanges(docText, (from, to) => {\n return view.state.selection.ranges.some((range) => {\n return range.from >= from && range.to <= to;\n });\n });\n\n for (const m of matches) {\n if (m.from < m.to) {\n try {\n builder.add(m.from, m.to, Decoration.mark({ class: m.className }));\n } catch (e) {\n console.warn(\"SyntaxHighlighter: Failed to add decoration\", m, e);\n }\n }\n }\n\n return builder.finish();\n}\n\nconst SyntaxHighlighter = ViewPlugin.fromClass(\n class {\n decorations: DecorationSet;\n\n constructor(view: EditorView) {\n this.decorations = buildDecorations(view);\n }\n\n update(update: ViewUpdate) {\n if (update.docChanged || update.viewportChanged || update.selectionSet) {\n this.decorations = buildDecorations(update.view);\n }\n }\n },\n {\n decorations: (instance) => instance.decorations,\n }\n);\n\nexport default SyntaxHighlighter;\n"],"names":["commentRegex","interactionVariableRanges","text","markers","findVariableMarkers","pending","controlBlockRegex","INTERACTION_CONTENT_SOURCE","documentControlRanges","getMarkdownSourceAnalysis","collectMultilineFixedOutputRanges","docText","isInsideVariable","ranges","pendingStart","lineStart","newlineIndex","lineEnd","collectSingleLineFixedOutputRanges","commentRanges","commentIndex","isInsideComment","index","range","lineText","markerPositions","searchFrom","markerOffset","markerIndex","i","collectCommentRanges","match","collectOuterBlockRanges","variables","findDocumentVariableMarkers","position","marker","blockRanges","a","b","outerRanges","lastOuter","collectSyntaxHighlightRanges","isCursorInside","matches","documentVariables","occupied","isOverlapping","from","to","addMatch","className","control","fullStart","fullEnd","content","contentStart","firstVariable","percentIndex","hasLeadingAssignment","trimVariablePadding","percentClass","varFrom","varTo","cursorInsideVar","percentStart","operatorRanges","variableRanges","appliedTokenRanges","variable","scanIndex","isEscape","operator","allTokens","token","stringStart","stringEnd","cursor","sortedApplied","appliedVariableRanges","sortedVariables","buttonTextStart","buttonTextEnd","buildDecorations","view","builder","RangeSetBuilder","m","Decoration","e","SyntaxHighlighter","ViewPlugin","update","instance"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const c=require("../../../node_modules/@codemirror/view/dist/index.cjs"),U=require("../types.cjs"),V=require("../utils.cjs"),D=require("./PlaceholderWidget.cjs"),u=require("./mediaPlaceholderLabels.cjs"),q=require("../../../_virtual/index.cjs"),L=/===\s*<iframe\s[^>]*data-tag="video"[^>]*><\/iframe>\s*===|<iframe\s[^>]*data-tag="video"[^>]*><\/iframe>/gi,n=(e,r)=>{const t=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),s=new RegExp(`${t}="([^"]*)"`,"i"),a=e.match(s);return a?a[1]:""},d=e=>e.replace(/"/g,'"').replace(/&/g,"&"),v=e=>{const r=q.distExports.findDocumentVariableMarkers(e.state.doc.toString()).filter(t=>t.name!==null);return new c.MatchDecorator({regexp:L,decoration:(t,s,a)=>{const R=a+t[0].length;if(r.some(o=>a<o.end&&R>o.start))return null;const h=t?.[0]||"",i=V.unwrapFixedOutput(h),b=/^\s*===/.test(h),g=n(i,"src"),m=n(i,"data-title"),p=n(i,"data-url"),f=m?d(m):"",l=g?d(g):"",w=p?d(p):"";let x=w||l;try{if(!w&&l){const P=new URLSearchParams(new URL(l).search).get("url");P&&(x=decodeURIComponent(P))}}catch(o){console.warn("Failed to decode video URL:",o)}return c.Decoration.replace({widget:new D.default(f||s.state.facet(u.mediaPlaceholderLabels).video,{tag:"video",url:x,title:f,fixedOutput:b},"tag-video",U.SelectedOption.Video,s)})}})},S=c.ViewPlugin.fromClass(class{constructor(e){this.matcher=v(e),this.placeholders=this.matcher.createDeco(e)}update(e){if(e.docChanged&&(this.matcher=v(e.view)),e.docChanged||e.startState.facet(u.mediaPlaceholderLabels)!==e.state.facet(u.mediaPlaceholderLabels)){this.placeholders=this.matcher.createDeco(e.view);return}this.placeholders=this.matcher.updateDeco(e,this.placeholders)}},{decorations:e=>e.placeholders,provide:e=>c.EditorView.atomicRanges.of(r=>r.plugin(e)?.placeholders||c.Decoration.none)});exports.default=S;
|
|
2
2
|
//# sourceMappingURL=VideoPlaceholder.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoPlaceholder.cjs","sources":["../../../../src/components/MarkdownFlowEditor/plugins/VideoPlaceholder.ts"],"sourcesContent":["import {\n EditorView,\n Decoration,\n DecorationSet,\n ViewPlugin,\n ViewUpdate,\n MatchDecorator,\n} from \"@codemirror/view\";\nimport { SelectedOption } from \"../types\";\nimport { unwrapFixedOutput } from \"../utils\";\nimport PlaceholderWidget from \"./PlaceholderWidget\";\nimport { mediaPlaceholderLabels } from \"./mediaPlaceholderLabels\";\n\nconst biliVideoContextRegexp =\n /===\\s*<iframe\\s[^>]*data-tag=\"video\"[^>]*><\\/iframe>\\s*===|<iframe\\s[^>]*data-tag=\"video\"[^>]*><\\/iframe>/gi;\n\nconst extractAttrValue = (markup: string, attr: string) => {\n const escapedAttr = attr.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexp = new RegExp(`${escapedAttr}=\"([^\"]*)\"`, \"i\");\n const match = markup.match(regexp);\n return match ? match[1] : \"\";\n};\n\nconst decodeHtmlEntities = (value: string) =>\n value.replace(/"/g, '\"').replace(/&/g, \"&\");\n\nconst
|
|
1
|
+
{"version":3,"file":"VideoPlaceholder.cjs","sources":["../../../../src/components/MarkdownFlowEditor/plugins/VideoPlaceholder.ts"],"sourcesContent":["import {\n EditorView,\n Decoration,\n DecorationSet,\n ViewPlugin,\n ViewUpdate,\n MatchDecorator,\n} from \"@codemirror/view\";\nimport { SelectedOption } from \"../types\";\nimport { findDocumentVariableMarkers, unwrapFixedOutput } from \"../utils\";\nimport PlaceholderWidget from \"./PlaceholderWidget\";\nimport { mediaPlaceholderLabels } from \"./mediaPlaceholderLabels\";\n\nconst biliVideoContextRegexp =\n /===\\s*<iframe\\s[^>]*data-tag=\"video\"[^>]*><\\/iframe>\\s*===|<iframe\\s[^>]*data-tag=\"video\"[^>]*><\\/iframe>/gi;\n\nconst extractAttrValue = (markup: string, attr: string) => {\n const escapedAttr = attr.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexp = new RegExp(`${escapedAttr}=\"([^\"]*)\"`, \"i\");\n const match = markup.match(regexp);\n return match ? match[1] : \"\";\n};\n\nconst decodeHtmlEntities = (value: string) =>\n value.replace(/"/g, '\"').replace(/&/g, \"&\");\n\nconst createBiliUrlMatcher = (view: EditorView) => {\n const variables = findDocumentVariableMarkers(\n view.state.doc.toString()\n ).filter((marker) => marker.name !== null);\n return new MatchDecorator({\n regexp: biliVideoContextRegexp,\n decoration: (match, view, from) => {\n const to = from + match[0].length;\n if (variables.some((marker) => from < marker.end && to > marker.start)) {\n return null;\n }\n const source = match?.[0] || \"\";\n const iframeMarkup = unwrapFixedOutput(source);\n const fixedOutput = /^\\s*===/.test(source);\n const srcValueRaw = extractAttrValue(iframeMarkup, \"src\");\n const titleAttrRaw = extractAttrValue(iframeMarkup, \"data-title\");\n const dataUrlAttrRaw = extractAttrValue(iframeMarkup, \"data-url\");\n const titleAttr = titleAttrRaw ? decodeHtmlEntities(titleAttrRaw) : \"\";\n const decodedSrcValue = srcValueRaw\n ? decodeHtmlEntities(srcValueRaw)\n : \"\";\n const storedDataUrl = dataUrlAttrRaw\n ? decodeHtmlEntities(dataUrlAttrRaw)\n : \"\";\n // Extract and decode the original URL from stored attributes or API endpoint\n let originalUrl = storedDataUrl || decodedSrcValue;\n try {\n if (!storedDataUrl && decodedSrcValue) {\n const urlParams = new URLSearchParams(\n new URL(decodedSrcValue).search\n );\n const encodedUrl = urlParams.get(\"url\");\n if (encodedUrl) {\n originalUrl = decodeURIComponent(encodedUrl);\n }\n }\n } catch (error) {\n console.warn(\"Failed to decode video URL:\", error);\n }\n\n return Decoration.replace({\n widget: new PlaceholderWidget(\n titleAttr || view.state.facet(mediaPlaceholderLabels).video,\n {\n tag: \"video\",\n url: originalUrl, // Decoded original Bilibili URL\n title: titleAttr, // title from data-title attribute\n fixedOutput,\n },\n \"tag-video\",\n SelectedOption.Video,\n view\n ),\n });\n },\n });\n};\n\nconst VideoPlaceholder = ViewPlugin.fromClass(\n class {\n placeholders: DecorationSet;\n matcher: MatchDecorator;\n constructor(view: EditorView) {\n this.matcher = createBiliUrlMatcher(view);\n this.placeholders = this.matcher.createDeco(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged) {\n this.matcher = createBiliUrlMatcher(update.view);\n }\n if (\n update.docChanged ||\n update.startState.facet(mediaPlaceholderLabels) !==\n update.state.facet(mediaPlaceholderLabels)\n ) {\n this.placeholders = this.matcher.createDeco(update.view);\n return;\n }\n this.placeholders = this.matcher.updateDeco(update, this.placeholders);\n }\n },\n {\n decorations: (instance) => instance.placeholders,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => {\n return view.plugin(plugin)?.placeholders || Decoration.none;\n }),\n }\n);\n\nexport default VideoPlaceholder;\n"],"names":["biliVideoContextRegexp","extractAttrValue","markup","attr","escapedAttr","regexp","match","decodeHtmlEntities","value","createBiliUrlMatcher","view","variables","findDocumentVariableMarkers","marker","MatchDecorator","from","to","source","iframeMarkup","unwrapFixedOutput","fixedOutput","srcValueRaw","titleAttrRaw","dataUrlAttrRaw","titleAttr","decodedSrcValue","storedDataUrl","originalUrl","encodedUrl","error","Decoration","PlaceholderWidget","mediaPlaceholderLabels","SelectedOption","VideoPlaceholder","ViewPlugin","update","instance","plugin","EditorView"],"mappings":"iWAaMA,EACJ,8GAEIC,EAAmB,CAACC,EAAgBC,IAAiB,CACzD,MAAMC,EAAcD,EAAK,QAAQ,sBAAuB,MAAM,EACxDE,EAAS,IAAI,OAAO,GAAGD,CAAW,aAAc,GAAG,EACnDE,EAAQJ,EAAO,MAAMG,CAAM,EACjC,OAAOC,EAAQA,EAAM,CAAC,EAAI,EAC5B,EAEMC,EAAsBC,GAC1BA,EAAM,QAAQ,UAAW,GAAG,EAAE,QAAQ,SAAU,GAAG,EAE/CC,EAAwBC,GAAqB,CACjD,MAAMC,EAAYC,EAAAA,YAAAA,4BAChBF,EAAK,MAAM,IAAI,SAAA,CAAS,EACxB,OAAQG,GAAWA,EAAO,OAAS,IAAI,EACzC,OAAO,IAAIC,EAAAA,eAAe,CACxB,OAAQd,EACR,WAAY,CAACM,EAAOI,EAAMK,IAAS,CACjC,MAAMC,EAAKD,EAAOT,EAAM,CAAC,EAAE,OAC3B,GAAIK,EAAU,KAAME,GAAWE,EAAOF,EAAO,KAAOG,EAAKH,EAAO,KAAK,EACnE,OAAO,KAET,MAAMI,EAASX,IAAQ,CAAC,GAAK,GACvBY,EAAeC,EAAAA,kBAAkBF,CAAM,EACvCG,EAAc,UAAU,KAAKH,CAAM,EACnCI,EAAcpB,EAAiBiB,EAAc,KAAK,EAClDI,EAAerB,EAAiBiB,EAAc,YAAY,EAC1DK,EAAiBtB,EAAiBiB,EAAc,UAAU,EAC1DM,EAAYF,EAAef,EAAmBe,CAAY,EAAI,GAC9DG,EAAkBJ,EACpBd,EAAmBc,CAAW,EAC9B,GACEK,EAAgBH,EAClBhB,EAAmBgB,CAAc,EACjC,GAEJ,IAAII,EAAcD,GAAiBD,EACnC,GAAI,CACF,GAAI,CAACC,GAAiBD,EAAiB,CAIrC,MAAMG,EAHY,IAAI,gBACpB,IAAI,IAAIH,CAAe,EAAE,MAAA,EAEE,IAAI,KAAK,EAClCG,IACFD,EAAc,mBAAmBC,CAAU,EAE/C,CACF,OAASC,EAAO,CACd,QAAQ,KAAK,8BAA+BA,CAAK,CACnD,CAEA,OAAOC,EAAAA,WAAW,QAAQ,CACxB,OAAQ,IAAIC,EAAAA,QACVP,GAAad,EAAK,MAAM,MAAMsB,EAAAA,sBAAsB,EAAE,MACtD,CACE,IAAK,QACL,IAAKL,EACL,MAAOH,EACP,YAAAJ,CAAA,EAEF,YACAa,EAAAA,eAAe,MACfvB,CAAA,CACF,CACD,CACH,CAAA,CACD,CACH,EAEMwB,EAAmBC,EAAAA,WAAW,UAClC,KAAM,CAGJ,YAAYzB,EAAkB,CAC5B,KAAK,QAAUD,EAAqBC,CAAI,EACxC,KAAK,aAAe,KAAK,QAAQ,WAAWA,CAAI,CAClD,CACA,OAAO0B,EAAoB,CAIzB,GAHIA,EAAO,aACT,KAAK,QAAU3B,EAAqB2B,EAAO,IAAI,GAG/CA,EAAO,YACPA,EAAO,WAAW,MAAMJ,wBAAsB,IAC5CI,EAAO,MAAM,MAAMJ,EAAAA,sBAAsB,EAC3C,CACA,KAAK,aAAe,KAAK,QAAQ,WAAWI,EAAO,IAAI,EACvD,MACF,CACA,KAAK,aAAe,KAAK,QAAQ,WAAWA,EAAQ,KAAK,YAAY,CACvE,CAAA,EAEF,CACE,YAAcC,GAAaA,EAAS,aACpC,QAAUC,GACRC,EAAAA,WAAW,aAAa,GAAI7B,GACnBA,EAAK,OAAO4B,CAAM,GAAG,cAAgBR,EAAAA,WAAW,IACxD,CAAA,CAEP"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { DecorationSet, ViewPlugin, ViewUpdate } from '@codemirror/view';
|
|
1
|
+
import { DecorationSet, ViewPlugin, ViewUpdate, MatchDecorator } from '@codemirror/view';
|
|
2
2
|
declare const VideoPlaceholder: ViewPlugin<{
|
|
3
3
|
placeholders: DecorationSet;
|
|
4
|
+
matcher: MatchDecorator;
|
|
4
5
|
update(update: ViewUpdate): void;
|
|
5
6
|
}, undefined>;
|
|
6
7
|
export default VideoPlaceholder;
|
|
@@ -1,60 +1,71 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { SelectedOption as
|
|
3
|
-
import { unwrapFixedOutput as
|
|
4
|
-
import
|
|
1
|
+
import { ViewPlugin as D, EditorView as P, Decoration as U, MatchDecorator as A } from "../../../node_modules/@codemirror/view/dist/index.es.js";
|
|
2
|
+
import { SelectedOption as C } from "../types.es.js";
|
|
3
|
+
import { unwrapFixedOutput as S } from "../utils.es.js";
|
|
4
|
+
import b from "./PlaceholderWidget.es.js";
|
|
5
5
|
import { mediaPlaceholderLabels as d } from "./mediaPlaceholderLabels.es.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
6
|
+
import { d as E } from "../../../_virtual/index.es.js";
|
|
7
|
+
const L = /===\s*<iframe\s[^>]*data-tag="video"[^>]*><\/iframe>\s*===|<iframe\s[^>]*data-tag="video"[^>]*><\/iframe>/gi, l = (e, r) => {
|
|
8
|
+
const t = r.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), c = new RegExp(`${t}="([^"]*)"`, "i"), o = e.match(c);
|
|
9
|
+
return o ? o[1] : "";
|
|
10
|
+
}, n = (e) => e.replace(/"/g, '"').replace(/&/g, "&"), R = (e) => {
|
|
11
|
+
const r = E.findDocumentVariableMarkers(
|
|
12
|
+
e.state.doc.toString()
|
|
13
|
+
).filter((t) => t.name !== null);
|
|
14
|
+
return new A({
|
|
15
|
+
regexp: L,
|
|
16
|
+
decoration: (t, c, o) => {
|
|
17
|
+
const V = o + t[0].length;
|
|
18
|
+
if (r.some((a) => o < a.end && V > a.start))
|
|
19
|
+
return null;
|
|
20
|
+
const m = t?.[0] || "", s = S(m), v = /^\s*===/.test(m), h = l(s, "src"), p = l(s, "data-title"), u = l(s, "data-url"), f = p ? n(p) : "", i = h ? n(h) : "", g = u ? n(u) : "";
|
|
21
|
+
let w = g || i;
|
|
22
|
+
try {
|
|
23
|
+
if (!g && i) {
|
|
24
|
+
const x = new URLSearchParams(
|
|
25
|
+
new URL(i).search
|
|
26
|
+
).get("url");
|
|
27
|
+
x && (w = decodeURIComponent(x));
|
|
28
|
+
}
|
|
29
|
+
} catch (a) {
|
|
30
|
+
console.warn("Failed to decode video URL:", a);
|
|
18
31
|
}
|
|
19
|
-
|
|
20
|
-
|
|
32
|
+
return U.replace({
|
|
33
|
+
widget: new b(
|
|
34
|
+
f || c.state.facet(d).video,
|
|
35
|
+
{
|
|
36
|
+
tag: "video",
|
|
37
|
+
url: w,
|
|
38
|
+
// Decoded original Bilibili URL
|
|
39
|
+
title: f,
|
|
40
|
+
// title from data-title attribute
|
|
41
|
+
fixedOutput: v
|
|
42
|
+
},
|
|
43
|
+
"tag-video",
|
|
44
|
+
C.Video,
|
|
45
|
+
c
|
|
46
|
+
)
|
|
47
|
+
});
|
|
21
48
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
u || t.state.facet(d).video,
|
|
25
|
-
{
|
|
26
|
-
tag: "video",
|
|
27
|
-
url: h,
|
|
28
|
-
// Decoded original Bilibili URL
|
|
29
|
-
title: u,
|
|
30
|
-
// title from data-title attribute
|
|
31
|
-
fixedOutput: a
|
|
32
|
-
},
|
|
33
|
-
"tag-video",
|
|
34
|
-
v.Video,
|
|
35
|
-
t
|
|
36
|
-
)
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
}), M = U.fromClass(
|
|
49
|
+
});
|
|
50
|
+
}, y = D.fromClass(
|
|
40
51
|
class {
|
|
41
52
|
constructor(e) {
|
|
42
|
-
this.placeholders =
|
|
53
|
+
this.matcher = R(e), this.placeholders = this.matcher.createDeco(e);
|
|
43
54
|
}
|
|
44
55
|
update(e) {
|
|
45
|
-
if (e.startState.facet(d) !== e.state.facet(d)) {
|
|
46
|
-
this.placeholders =
|
|
56
|
+
if (e.docChanged && (this.matcher = R(e.view)), e.docChanged || e.startState.facet(d) !== e.state.facet(d)) {
|
|
57
|
+
this.placeholders = this.matcher.createDeco(e.view);
|
|
47
58
|
return;
|
|
48
59
|
}
|
|
49
|
-
this.placeholders =
|
|
60
|
+
this.placeholders = this.matcher.updateDeco(e, this.placeholders);
|
|
50
61
|
}
|
|
51
62
|
},
|
|
52
63
|
{
|
|
53
64
|
decorations: (e) => e.placeholders,
|
|
54
|
-
provide: (e) =>
|
|
65
|
+
provide: (e) => P.atomicRanges.of((r) => r.plugin(e)?.placeholders || U.none)
|
|
55
66
|
}
|
|
56
67
|
);
|
|
57
68
|
export {
|
|
58
|
-
|
|
69
|
+
y as default
|
|
59
70
|
};
|
|
60
71
|
//# sourceMappingURL=VideoPlaceholder.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoPlaceholder.es.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/VideoPlaceholder.ts"],"sourcesContent":["import {\n EditorView,\n Decoration,\n DecorationSet,\n ViewPlugin,\n ViewUpdate,\n MatchDecorator,\n} from \"@codemirror/view\";\nimport { SelectedOption } from \"../types\";\nimport { unwrapFixedOutput } from \"../utils\";\nimport PlaceholderWidget from \"./PlaceholderWidget\";\nimport { mediaPlaceholderLabels } from \"./mediaPlaceholderLabels\";\n\nconst biliVideoContextRegexp =\n /===\\s*<iframe\\s[^>]*data-tag=\"video\"[^>]*><\\/iframe>\\s*===|<iframe\\s[^>]*data-tag=\"video\"[^>]*><\\/iframe>/gi;\n\nconst extractAttrValue = (markup: string, attr: string) => {\n const escapedAttr = attr.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexp = new RegExp(`${escapedAttr}=\"([^\"]*)\"`, \"i\");\n const match = markup.match(regexp);\n return match ? match[1] : \"\";\n};\n\nconst decodeHtmlEntities = (value: string) =>\n value.replace(/"/g, '\"').replace(/&/g, \"&\");\n\nconst
|
|
1
|
+
{"version":3,"file":"VideoPlaceholder.es.js","sources":["../../../../src/components/MarkdownFlowEditor/plugins/VideoPlaceholder.ts"],"sourcesContent":["import {\n EditorView,\n Decoration,\n DecorationSet,\n ViewPlugin,\n ViewUpdate,\n MatchDecorator,\n} from \"@codemirror/view\";\nimport { SelectedOption } from \"../types\";\nimport { findDocumentVariableMarkers, unwrapFixedOutput } from \"../utils\";\nimport PlaceholderWidget from \"./PlaceholderWidget\";\nimport { mediaPlaceholderLabels } from \"./mediaPlaceholderLabels\";\n\nconst biliVideoContextRegexp =\n /===\\s*<iframe\\s[^>]*data-tag=\"video\"[^>]*><\\/iframe>\\s*===|<iframe\\s[^>]*data-tag=\"video\"[^>]*><\\/iframe>/gi;\n\nconst extractAttrValue = (markup: string, attr: string) => {\n const escapedAttr = attr.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const regexp = new RegExp(`${escapedAttr}=\"([^\"]*)\"`, \"i\");\n const match = markup.match(regexp);\n return match ? match[1] : \"\";\n};\n\nconst decodeHtmlEntities = (value: string) =>\n value.replace(/"/g, '\"').replace(/&/g, \"&\");\n\nconst createBiliUrlMatcher = (view: EditorView) => {\n const variables = findDocumentVariableMarkers(\n view.state.doc.toString()\n ).filter((marker) => marker.name !== null);\n return new MatchDecorator({\n regexp: biliVideoContextRegexp,\n decoration: (match, view, from) => {\n const to = from + match[0].length;\n if (variables.some((marker) => from < marker.end && to > marker.start)) {\n return null;\n }\n const source = match?.[0] || \"\";\n const iframeMarkup = unwrapFixedOutput(source);\n const fixedOutput = /^\\s*===/.test(source);\n const srcValueRaw = extractAttrValue(iframeMarkup, \"src\");\n const titleAttrRaw = extractAttrValue(iframeMarkup, \"data-title\");\n const dataUrlAttrRaw = extractAttrValue(iframeMarkup, \"data-url\");\n const titleAttr = titleAttrRaw ? decodeHtmlEntities(titleAttrRaw) : \"\";\n const decodedSrcValue = srcValueRaw\n ? decodeHtmlEntities(srcValueRaw)\n : \"\";\n const storedDataUrl = dataUrlAttrRaw\n ? decodeHtmlEntities(dataUrlAttrRaw)\n : \"\";\n // Extract and decode the original URL from stored attributes or API endpoint\n let originalUrl = storedDataUrl || decodedSrcValue;\n try {\n if (!storedDataUrl && decodedSrcValue) {\n const urlParams = new URLSearchParams(\n new URL(decodedSrcValue).search\n );\n const encodedUrl = urlParams.get(\"url\");\n if (encodedUrl) {\n originalUrl = decodeURIComponent(encodedUrl);\n }\n }\n } catch (error) {\n console.warn(\"Failed to decode video URL:\", error);\n }\n\n return Decoration.replace({\n widget: new PlaceholderWidget(\n titleAttr || view.state.facet(mediaPlaceholderLabels).video,\n {\n tag: \"video\",\n url: originalUrl, // Decoded original Bilibili URL\n title: titleAttr, // title from data-title attribute\n fixedOutput,\n },\n \"tag-video\",\n SelectedOption.Video,\n view\n ),\n });\n },\n });\n};\n\nconst VideoPlaceholder = ViewPlugin.fromClass(\n class {\n placeholders: DecorationSet;\n matcher: MatchDecorator;\n constructor(view: EditorView) {\n this.matcher = createBiliUrlMatcher(view);\n this.placeholders = this.matcher.createDeco(view);\n }\n update(update: ViewUpdate) {\n if (update.docChanged) {\n this.matcher = createBiliUrlMatcher(update.view);\n }\n if (\n update.docChanged ||\n update.startState.facet(mediaPlaceholderLabels) !==\n update.state.facet(mediaPlaceholderLabels)\n ) {\n this.placeholders = this.matcher.createDeco(update.view);\n return;\n }\n this.placeholders = this.matcher.updateDeco(update, this.placeholders);\n }\n },\n {\n decorations: (instance) => instance.placeholders,\n provide: (plugin) =>\n EditorView.atomicRanges.of((view) => {\n return view.plugin(plugin)?.placeholders || Decoration.none;\n }),\n }\n);\n\nexport default VideoPlaceholder;\n"],"names":["biliVideoContextRegexp","extractAttrValue","markup","attr","escapedAttr","regexp","match","decodeHtmlEntities","value","createBiliUrlMatcher","view","variables","findDocumentVariableMarkers","marker","MatchDecorator","from","to","source","iframeMarkup","unwrapFixedOutput","fixedOutput","srcValueRaw","titleAttrRaw","dataUrlAttrRaw","titleAttr","decodedSrcValue","storedDataUrl","originalUrl","encodedUrl","error","Decoration","PlaceholderWidget","mediaPlaceholderLabels","SelectedOption","VideoPlaceholder","ViewPlugin","update","instance","plugin","EditorView"],"mappings":";;;;;;AAaA,MAAMA,IACJ,+GAEIC,IAAmB,CAACC,GAAgBC,MAAiB;AACzD,QAAMC,IAAcD,EAAK,QAAQ,uBAAuB,MAAM,GACxDE,IAAS,IAAI,OAAO,GAAGD,CAAW,cAAc,GAAG,GACnDE,IAAQJ,EAAO,MAAMG,CAAM;AACjC,SAAOC,IAAQA,EAAM,CAAC,IAAI;AAC5B,GAEMC,IAAqB,CAACC,MAC1BA,EAAM,QAAQ,WAAW,GAAG,EAAE,QAAQ,UAAU,GAAG,GAE/CC,IAAuB,CAACC,MAAqB;AACjD,QAAMC,IAAYC,EAAAA;AAAAA,IAChBF,EAAK,MAAM,IAAI,SAAA;AAAA,EAAS,EACxB,OAAO,CAACG,MAAWA,EAAO,SAAS,IAAI;AACzC,SAAO,IAAIC,EAAe;AAAA,IACxB,QAAQd;AAAA,IACR,YAAY,CAACM,GAAOI,GAAMK,MAAS;AACjC,YAAMC,IAAKD,IAAOT,EAAM,CAAC,EAAE;AAC3B,UAAIK,EAAU,KAAK,CAACE,MAAWE,IAAOF,EAAO,OAAOG,IAAKH,EAAO,KAAK;AACnE,eAAO;AAET,YAAMI,IAASX,IAAQ,CAAC,KAAK,IACvBY,IAAeC,EAAkBF,CAAM,GACvCG,IAAc,UAAU,KAAKH,CAAM,GACnCI,IAAcpB,EAAiBiB,GAAc,KAAK,GAClDI,IAAerB,EAAiBiB,GAAc,YAAY,GAC1DK,IAAiBtB,EAAiBiB,GAAc,UAAU,GAC1DM,IAAYF,IAAef,EAAmBe,CAAY,IAAI,IAC9DG,IAAkBJ,IACpBd,EAAmBc,CAAW,IAC9B,IACEK,IAAgBH,IAClBhB,EAAmBgB,CAAc,IACjC;AAEJ,UAAII,IAAcD,KAAiBD;AACnC,UAAI;AACF,YAAI,CAACC,KAAiBD,GAAiB;AAIrC,gBAAMG,IAHY,IAAI;AAAA,YACpB,IAAI,IAAIH,CAAe,EAAE;AAAA,UAAA,EAEE,IAAI,KAAK;AACtC,UAAIG,MACFD,IAAc,mBAAmBC,CAAU;AAAA,QAE/C;AAAA,MACF,SAASC,GAAO;AACd,gBAAQ,KAAK,+BAA+BA,CAAK;AAAA,MACnD;AAEA,aAAOC,EAAW,QAAQ;AAAA,QACxB,QAAQ,IAAIC;AAAA,UACVP,KAAad,EAAK,MAAM,MAAMsB,CAAsB,EAAE;AAAA,UACtD;AAAA,YACE,KAAK;AAAA,YACL,KAAKL;AAAA;AAAA,YACL,OAAOH;AAAA;AAAA,YACP,aAAAJ;AAAA,UAAA;AAAA,UAEF;AAAA,UACAa,EAAe;AAAA,UACfvB;AAAAA,QAAA;AAAA,MACF,CACD;AAAA,IACH;AAAA,EAAA,CACD;AACH,GAEMwB,IAAmBC,EAAW;AAAA,EAClC,MAAM;AAAA,IAGJ,YAAYzB,GAAkB;AAC5B,WAAK,UAAUD,EAAqBC,CAAI,GACxC,KAAK,eAAe,KAAK,QAAQ,WAAWA,CAAI;AAAA,IAClD;AAAA,IACA,OAAO0B,GAAoB;AAIzB,UAHIA,EAAO,eACT,KAAK,UAAU3B,EAAqB2B,EAAO,IAAI,IAG/CA,EAAO,cACPA,EAAO,WAAW,MAAMJ,CAAsB,MAC5CI,EAAO,MAAM,MAAMJ,CAAsB,GAC3C;AACA,aAAK,eAAe,KAAK,QAAQ,WAAWI,EAAO,IAAI;AACvD;AAAA,MACF;AACA,WAAK,eAAe,KAAK,QAAQ,WAAWA,GAAQ,KAAK,YAAY;AAAA,IACvE;AAAA,EAAA;AAAA,EAEF;AAAA,IACE,aAAa,CAACC,MAAaA,EAAS;AAAA,IACpC,SAAS,CAACC,MACRC,EAAW,aAAa,GAAG,CAAC7B,MACnBA,EAAK,OAAO4B,CAAM,GAAG,gBAAgBR,EAAW,IACxD;AAAA,EAAA;AAEP;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var r=(e=>(e.FixedText="fixedText",e.Divider="divider",e.Video="video",e.Image="Image",e.Empty="",e))(r||{});exports.SelectedOption=r;
|
|
2
2
|
//# sourceMappingURL=types.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.cjs","sources":["../../../src/components/MarkdownFlowEditor/types.ts"],"sourcesContent":["import React from \"react\";\n\nenum SelectedOption {\n FixedText = \"fixedText\",\n Divider = \"divider\",\n Video = \"video\",\n Image = \"Image\",\n
|
|
1
|
+
{"version":3,"file":"types.cjs","sources":["../../../src/components/MarkdownFlowEditor/types.ts"],"sourcesContent":["import React from \"react\";\n\nenum SelectedOption {\n FixedText = \"fixedText\",\n Divider = \"divider\",\n Video = \"video\",\n Image = \"Image\",\n Empty = \"\",\n}\n\ninterface SelectContentInfo {\n type: SelectedOption;\n value: {\n resourceTitle?: string;\n resourceUrl?: string;\n scalePercent?: number;\n };\n from: number;\n to: number;\n}\n\ninterface IEditorContext {\n selectedOption: SelectedOption;\n setSelectedOption: (selectedOption: SelectedOption) => void;\n dialogOpen: boolean;\n setDialogOpen: (dialogOpen: boolean) => void;\n}\n\ninterface Variable {\n name: string;\n label?: string;\n}\n\ntype EditorAction =\n | {\n key: string;\n label: string;\n icon?: React.ReactNode;\n disabled?: boolean;\n onClick?: (api: EditorApi) => void;\n tooltip?: string;\n }\n | {\n key: string;\n render: (api: EditorApi) => React.ReactNode;\n disabled?: boolean;\n };\n\ninterface EditorApi {\n insertTextAtCursor: (text: string) => void;\n replaceSelection: (text: string) => void;\n focus: () => void;\n getContent: () => string;\n setContent: (text: string) => void;\n}\n\nexport { SelectedOption };\nexport type {\n SelectContentInfo,\n IEditorContext,\n Variable,\n EditorAction,\n EditorApi,\n};\n"],"names":["SelectedOption"],"mappings":"gFAEA,IAAKA,GAAAA,IACHA,EAAA,UAAY,YACZA,EAAA,QAAU,UACVA,EAAA,MAAQ,QACRA,EAAA,MAAQ,QACRA,EAAA,MAAQ,GALLA,IAAAA,GAAA,CAAA,CAAA"}
|
|
@@ -4,7 +4,6 @@ declare enum SelectedOption {
|
|
|
4
4
|
Divider = "divider",
|
|
5
5
|
Video = "video",
|
|
6
6
|
Image = "Image",
|
|
7
|
-
Variable = "variable",
|
|
8
7
|
Empty = ""
|
|
9
8
|
}
|
|
10
9
|
interface SelectContentInfo {
|
|
@@ -13,24 +12,15 @@ interface SelectContentInfo {
|
|
|
13
12
|
resourceTitle?: string;
|
|
14
13
|
resourceUrl?: string;
|
|
15
14
|
scalePercent?: number;
|
|
16
|
-
variableName?: string;
|
|
17
15
|
};
|
|
18
16
|
from: number;
|
|
19
17
|
to: number;
|
|
20
18
|
}
|
|
21
|
-
interface PopoverPosition {
|
|
22
|
-
x: number;
|
|
23
|
-
y: number;
|
|
24
|
-
}
|
|
25
19
|
interface IEditorContext {
|
|
26
20
|
selectedOption: SelectedOption;
|
|
27
21
|
setSelectedOption: (selectedOption: SelectedOption) => void;
|
|
28
22
|
dialogOpen: boolean;
|
|
29
23
|
setDialogOpen: (dialogOpen: boolean) => void;
|
|
30
|
-
popoverOpen: boolean;
|
|
31
|
-
setPopoverOpen: (popoverOpen: boolean) => void;
|
|
32
|
-
popoverPosition: PopoverPosition | null;
|
|
33
|
-
setPopoverPosition: (position: PopoverPosition | null) => void;
|
|
34
24
|
}
|
|
35
25
|
interface Variable {
|
|
36
26
|
name: string;
|
|
@@ -56,4 +46,4 @@ interface EditorApi {
|
|
|
56
46
|
setContent: (text: string) => void;
|
|
57
47
|
}
|
|
58
48
|
export { SelectedOption };
|
|
59
|
-
export type { SelectContentInfo, IEditorContext, Variable,
|
|
49
|
+
export type { SelectContentInfo, IEditorContext, Variable, EditorAction, EditorApi, };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
var
|
|
1
|
+
var x = /* @__PURE__ */ ((r) => (r.FixedText = "fixedText", r.Divider = "divider", r.Video = "video", r.Image = "Image", r.Empty = "", r))(x || {});
|
|
2
2
|
export {
|
|
3
|
-
|
|
3
|
+
x as SelectedOption
|
|
4
4
|
};
|
|
5
5
|
//# sourceMappingURL=types.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.es.js","sources":["../../../src/components/MarkdownFlowEditor/types.ts"],"sourcesContent":["import React from \"react\";\n\nenum SelectedOption {\n FixedText = \"fixedText\",\n Divider = \"divider\",\n Video = \"video\",\n Image = \"Image\",\n
|
|
1
|
+
{"version":3,"file":"types.es.js","sources":["../../../src/components/MarkdownFlowEditor/types.ts"],"sourcesContent":["import React from \"react\";\n\nenum SelectedOption {\n FixedText = \"fixedText\",\n Divider = \"divider\",\n Video = \"video\",\n Image = \"Image\",\n Empty = \"\",\n}\n\ninterface SelectContentInfo {\n type: SelectedOption;\n value: {\n resourceTitle?: string;\n resourceUrl?: string;\n scalePercent?: number;\n };\n from: number;\n to: number;\n}\n\ninterface IEditorContext {\n selectedOption: SelectedOption;\n setSelectedOption: (selectedOption: SelectedOption) => void;\n dialogOpen: boolean;\n setDialogOpen: (dialogOpen: boolean) => void;\n}\n\ninterface Variable {\n name: string;\n label?: string;\n}\n\ntype EditorAction =\n | {\n key: string;\n label: string;\n icon?: React.ReactNode;\n disabled?: boolean;\n onClick?: (api: EditorApi) => void;\n tooltip?: string;\n }\n | {\n key: string;\n render: (api: EditorApi) => React.ReactNode;\n disabled?: boolean;\n };\n\ninterface EditorApi {\n insertTextAtCursor: (text: string) => void;\n replaceSelection: (text: string) => void;\n focus: () => void;\n getContent: () => string;\n setContent: (text: string) => void;\n}\n\nexport { SelectedOption };\nexport type {\n SelectContentInfo,\n IEditorContext,\n Variable,\n EditorAction,\n EditorApi,\n};\n"],"names":["SelectedOption"],"mappings":"AAEA,IAAKA,sBAAAA,OACHA,EAAA,YAAY,aACZA,EAAA,UAAU,WACVA,EAAA,QAAQ,SACRA,EAAA,QAAQ,SACRA,EAAA,QAAQ,IALLA,IAAAA,KAAA,CAAA,CAAA;"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("./types.cjs"),$=require("./utils/video.cjs");require("../../_virtual/index.cjs");const a="===",f=(t,e)=>{switch(t){case u.SelectedOption.Image:return{resourceUrl:e.url,resourceTitle:e.title,scalePercent:e.scalePercent};case u.SelectedOption.Video:return{resourceUrl:e.url,resourceTitle:e.title};default:return{resourceUrl:e.url??"",resourceTitle:e.title??""}}};function b(t,e){return i=>{const r=i.matchBefore(/\/(\w*)$/);if(!r)return null;const c=(n,o,s,l,m)=>{n.dispatch({changes:{from:s,to:l,insert:""}}),t(m)};return{from:r.from,to:r.to,options:[{label:e?.image??"Image",apply:(n,o,s,l)=>{c(n,o,s,l,u.SelectedOption.Image)}},{label:e?.video??"Video",apply:(n,o,s,l)=>{c(n,o,s,l,u.SelectedOption.Video)}}],filter:!1}}}const g=t=>$.getVideoEmbedUrl(t),d=t=>t.replace(/&/g,"&").replace(/"/g,"""),w=t=>t.replace(/([\[\]\\])/g,"\\$1"),h=t=>Math.max(1,Math.min(1e3,Math.round(t))),p=t=>{const e=t.trim();return e?new RegExp(`^${a}\\s*[\\s\\S]*?\\s*${a}$`).test(e)?e:`${a} ${e} ${a}`:`${a}${a}`},x=t=>{const e=t.trim(),i=new RegExp(`^${a}\\s*([\\s\\S]*?)\\s*${a}$`);return(e.match(i)?.[1]??e).trim()},V=({resourceUrl:t,resourceTitle:e,scalePercent:i})=>{const r=typeof i=="number"?h(i):void 0,c=d(t),n=e?d(e):void 0,o=e?w(e):"",s=typeof r=="number"&&r!==100?` width="${r}%"`:"",l=n?` alt="${n}" title="${n}"`:"",m=!r||r===100?``:`<img src="${c}"${l}${s} />`;return p(m)},S=(t,e)=>{const i=g(t),r=e?d(e):"",c=d(t),n=d(i),o=`<iframe data-tag="video" data-title="${r}" data-url="${c}" class="w-full aspect-video rounded-lg border-0" src="${n}" allowfullscreen="" allow="autoplay; encrypted-media"></iframe>`;return p(o)};exports.createSlashCommands=b;exports.findDocumentVariableMarkers=index.distExports.findDocumentVariableMarkers;exports.findVariableMarkers=index.distExports.findVariableMarkers;exports.getEmbedUrl=g;exports.getImageContentToInsert=V;exports.getVideoContentToInsert=S;exports.normalizeVariableName=index.distExports.normalizeVariableName;exports.parseContentInfo=f;exports.trimVariablePadding=index.distExports.trimVariablePadding;exports.unwrapFixedOutput=x;exports.wrapWithFixedOutput=p;
|
|
2
2
|
//# sourceMappingURL=utils.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.cjs","sources":["../../../src/components/MarkdownFlowEditor/utils.ts"],"sourcesContent":["import {\n type Completion,\n type CompletionContext,\n type CompletionResult,\n} from \"@codemirror/autocomplete\";\nimport { EditorView } from \"@codemirror/view\";\nimport { SelectedOption } from \"./types\";\nimport { getVideoEmbedUrl } from \"./utils/video\";\n\nimport {\n createVariableExpressionRegex,\n extractVariableNames,\n findVariableMarkers,\n findDocumentVariableMarkers,\n formatVariableReference,\n formatVariableAssignment,\n isValidVariableName,\n normalizeVariableName,\n trimVariablePadding,\n} from \"remark-flow\";\n\nconst FIXED_OUTPUT_MARKER = \"===\";\nconst createVariableExpressionRegexp = () =>\n createVariableExpressionRegex(\"gu\");\n\nconst parseContentInfo = (\n type: SelectedOption,\n dataset: { title?: string; url?: string; scalePercent?: number }\n) => {\n switch (type) {\n case SelectedOption.Image:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n scalePercent: dataset.scalePercent,\n };\n\n case SelectedOption.Video:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n };\n case SelectedOption.Variable:\n return {\n variableName: normalizeVariableName(dataset.title ?? \"\") ?? undefined,\n };\n default:\n return {\n resourceUrl: dataset.url ?? \"\",\n resourceTitle: dataset.title ?? \"\",\n };\n }\n};\n\nfunction createSlashCommands(\n onSelectOption: (selectedOption: SelectedOption) => void,\n labels?: {\n divider?: string;\n fixedText?: string;\n image?: string;\n video?: string;\n variable?: string;\n },\n { enableVariables = true }: { enableVariables?: boolean } = {}\n) {\n return (context: CompletionContext): CompletionResult | null => {\n const word = context.matchBefore(/\\/(\\w*)$/);\n if (!word) return null;\n\n const handleSelect = (\n view: EditorView,\n _: any,\n from: number,\n to: number,\n selectedOption: SelectedOption\n ) => {\n view.dispatch({\n changes: { from, to, insert: \"\" },\n });\n onSelectOption(selectedOption);\n };\n\n return {\n from: word.from,\n to: word.to,\n options: [\n // {\n // label: labels?.divider ?? \"Divider\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.Divider);\n // },\n // },\n // {\n // label: labels?.fixedText ?? \"Fixed Text\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.FixedText);\n // },\n // },\n ...(enableVariables\n ? [\n {\n label: labels?.variable ?? \"Variable\",\n apply: (\n view: EditorView,\n _: Completion,\n from: number,\n to: number\n ) => {\n handleSelect(view, _, from, to, SelectedOption.Variable);\n },\n },\n ]\n : []),\n {\n label: labels?.image ?? \"Image\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Image);\n },\n },\n {\n label: labels?.video ?? \"Video\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Video);\n },\n },\n ],\n filter: false,\n };\n };\n}\n\nconst getEmbedUrl = (url: string) => {\n return getVideoEmbedUrl(url);\n};\n\nconst escapeHtmlAttribute = (value: string) =>\n value.replace(/&/g, \"&\").replace(/\"/g, \""\");\n\nconst escapeMarkdownText = (text: string) =>\n text.replace(/([\\[\\]\\\\])/g, \"\\\\$1\");\n\nconst clampScalePercent = (value: number) =>\n Math.max(1, Math.min(1000, Math.round(value)));\n\nconst wrapWithFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n if (!normalizedContent) {\n return `${FIXED_OUTPUT_MARKER}${FIXED_OUTPUT_MARKER}`;\n }\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*[\\\\s\\\\S]*?\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n if (wrappedPattern.test(normalizedContent)) {\n return normalizedContent;\n }\n return `${FIXED_OUTPUT_MARKER} ${normalizedContent} ${FIXED_OUTPUT_MARKER}`;\n};\n\nconst unwrapFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*([\\\\s\\\\S]*?)\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n const match = normalizedContent.match(wrappedPattern);\n return (match?.[1] ?? normalizedContent).trim();\n};\n\nconst getImageContentToInsert = ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n}: {\n resourceUrl: string;\n resourceTitle?: string;\n scalePercent?: number;\n}) => {\n const clampedScale =\n typeof scalePercent === \"number\"\n ? clampScalePercent(scalePercent)\n : undefined;\n const sanitizedHtmlUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : undefined;\n const markdownTitle = resourceTitle ? escapeMarkdownText(resourceTitle) : \"\";\n const widthAttribute =\n typeof clampedScale === \"number\" && clampedScale !== 100\n ? ` width=\"${clampedScale}%\"`\n : \"\";\n const htmlTitleAttributes = sanitizedTitle\n ? ` alt=\"${sanitizedTitle}\" title=\"${sanitizedTitle}\"`\n : \"\";\n const imageMarkup =\n !clampedScale || clampedScale === 100\n ? ``\n : `<img src=\"${sanitizedHtmlUrl}\"${htmlTitleAttributes}${widthAttribute} />`;\n\n return wrapWithFixedOutput(imageMarkup);\n};\n\nconst getVideoContentToInsert = (\n resourceUrl: string,\n resourceTitle: string\n) => {\n const embedUrl = getEmbedUrl(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : \"\";\n const sanitizedResourceUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedEmbedUrl = escapeHtmlAttribute(embedUrl);\n const videoMarkup = `<iframe data-tag=\"video\" data-title=\"${sanitizedTitle}\" data-url=\"${sanitizedResourceUrl}\" class=\"w-full aspect-video rounded-lg border-0\" src=\"${sanitizedEmbedUrl}\" allowfullscreen=\"\" allow=\"autoplay; encrypted-media\"></iframe>`;\n\n return wrapWithFixedOutput(videoMarkup);\n};\n\nexport {\n createSlashCommands,\n parseContentInfo,\n getEmbedUrl,\n getImageContentToInsert,\n getVideoContentToInsert,\n isValidVariableName,\n normalizeVariableName,\n trimVariablePadding,\n extractVariableNames,\n findVariableMarkers,\n findDocumentVariableMarkers,\n formatVariableReference,\n formatVariableAssignment,\n createVariableExpressionRegexp,\n wrapWithFixedOutput,\n unwrapFixedOutput,\n};\n"],"names":["FIXED_OUTPUT_MARKER","parseContentInfo","type","dataset","SelectedOption","normalizeVariableName","createSlashCommands","onSelectOption","labels","enableVariables","context","word","handleSelect","view","_","from","to","selectedOption","getEmbedUrl","url","getVideoEmbedUrl","escapeHtmlAttribute","value","escapeMarkdownText","text","clampScalePercent","wrapWithFixedOutput","content","normalizedContent","unwrapFixedOutput","wrappedPattern","getImageContentToInsert","resourceUrl","resourceTitle","scalePercent","clampedScale","sanitizedHtmlUrl","sanitizedTitle","markdownTitle","widthAttribute","htmlTitleAttributes","imageMarkup","getVideoContentToInsert","embedUrl","sanitizedResourceUrl","sanitizedEmbedUrl","videoMarkup"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.cjs","sources":["../../../src/components/MarkdownFlowEditor/utils.ts"],"sourcesContent":["import {\n type CompletionContext,\n type CompletionResult,\n} from \"@codemirror/autocomplete\";\nimport { EditorView } from \"@codemirror/view\";\nimport { SelectedOption } from \"./types\";\nimport { getVideoEmbedUrl } from \"./utils/video\";\n\nimport {\n createVariableExpressionRegex,\n extractVariableNames,\n findVariableMarkers,\n findDocumentVariableMarkers,\n formatVariableReference,\n formatVariableAssignment,\n isValidVariableName,\n normalizeVariableName,\n trimVariablePadding,\n} from \"remark-flow\";\n\nconst FIXED_OUTPUT_MARKER = \"===\";\nconst createVariableExpressionRegexp = () =>\n createVariableExpressionRegex(\"gu\");\n\nconst parseContentInfo = (\n type: SelectedOption,\n dataset: { title?: string; url?: string; scalePercent?: number }\n) => {\n switch (type) {\n case SelectedOption.Image:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n scalePercent: dataset.scalePercent,\n };\n\n case SelectedOption.Video:\n return {\n resourceUrl: dataset.url,\n resourceTitle: dataset.title,\n };\n default:\n return {\n resourceUrl: dataset.url ?? \"\",\n resourceTitle: dataset.title ?? \"\",\n };\n }\n};\n\nfunction createSlashCommands(\n onSelectOption: (selectedOption: SelectedOption) => void,\n labels?: {\n divider?: string;\n fixedText?: string;\n image?: string;\n video?: string;\n }\n) {\n return (context: CompletionContext): CompletionResult | null => {\n const word = context.matchBefore(/\\/(\\w*)$/);\n if (!word) return null;\n\n const handleSelect = (\n view: EditorView,\n _: any,\n from: number,\n to: number,\n selectedOption: SelectedOption\n ) => {\n view.dispatch({\n changes: { from, to, insert: \"\" },\n });\n onSelectOption(selectedOption);\n };\n\n return {\n from: word.from,\n to: word.to,\n options: [\n // {\n // label: labels?.divider ?? \"Divider\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.Divider);\n // },\n // },\n // {\n // label: labels?.fixedText ?? \"Fixed Text\",\n // apply: (view, _, from, to) => {\n // handleSelect(view, _, from, to, SelectedOption.FixedText);\n // },\n // },\n {\n label: labels?.image ?? \"Image\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Image);\n },\n },\n {\n label: labels?.video ?? \"Video\",\n apply: (view, _, from, to) => {\n handleSelect(view, _, from, to, SelectedOption.Video);\n },\n },\n ],\n filter: false,\n };\n };\n}\n\nconst getEmbedUrl = (url: string) => {\n return getVideoEmbedUrl(url);\n};\n\nconst escapeHtmlAttribute = (value: string) =>\n value.replace(/&/g, \"&\").replace(/\"/g, \""\");\n\nconst escapeMarkdownText = (text: string) =>\n text.replace(/([\\[\\]\\\\])/g, \"\\\\$1\");\n\nconst clampScalePercent = (value: number) =>\n Math.max(1, Math.min(1000, Math.round(value)));\n\nconst wrapWithFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n if (!normalizedContent) {\n return `${FIXED_OUTPUT_MARKER}${FIXED_OUTPUT_MARKER}`;\n }\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*[\\\\s\\\\S]*?\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n if (wrappedPattern.test(normalizedContent)) {\n return normalizedContent;\n }\n return `${FIXED_OUTPUT_MARKER} ${normalizedContent} ${FIXED_OUTPUT_MARKER}`;\n};\n\nconst unwrapFixedOutput = (content: string) => {\n const normalizedContent = content.trim();\n const wrappedPattern = new RegExp(\n `^${FIXED_OUTPUT_MARKER}\\\\s*([\\\\s\\\\S]*?)\\\\s*${FIXED_OUTPUT_MARKER}$`\n );\n const match = normalizedContent.match(wrappedPattern);\n return (match?.[1] ?? normalizedContent).trim();\n};\n\nconst getImageContentToInsert = ({\n resourceUrl,\n resourceTitle,\n scalePercent,\n}: {\n resourceUrl: string;\n resourceTitle?: string;\n scalePercent?: number;\n}) => {\n const clampedScale =\n typeof scalePercent === \"number\"\n ? clampScalePercent(scalePercent)\n : undefined;\n const sanitizedHtmlUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : undefined;\n const markdownTitle = resourceTitle ? escapeMarkdownText(resourceTitle) : \"\";\n const widthAttribute =\n typeof clampedScale === \"number\" && clampedScale !== 100\n ? ` width=\"${clampedScale}%\"`\n : \"\";\n const htmlTitleAttributes = sanitizedTitle\n ? ` alt=\"${sanitizedTitle}\" title=\"${sanitizedTitle}\"`\n : \"\";\n const imageMarkup =\n !clampedScale || clampedScale === 100\n ? ``\n : `<img src=\"${sanitizedHtmlUrl}\"${htmlTitleAttributes}${widthAttribute} />`;\n\n return wrapWithFixedOutput(imageMarkup);\n};\n\nconst getVideoContentToInsert = (\n resourceUrl: string,\n resourceTitle: string\n) => {\n const embedUrl = getEmbedUrl(resourceUrl);\n const sanitizedTitle = resourceTitle\n ? escapeHtmlAttribute(resourceTitle)\n : \"\";\n const sanitizedResourceUrl = escapeHtmlAttribute(resourceUrl);\n const sanitizedEmbedUrl = escapeHtmlAttribute(embedUrl);\n const videoMarkup = `<iframe data-tag=\"video\" data-title=\"${sanitizedTitle}\" data-url=\"${sanitizedResourceUrl}\" class=\"w-full aspect-video rounded-lg border-0\" src=\"${sanitizedEmbedUrl}\" allowfullscreen=\"\" allow=\"autoplay; encrypted-media\"></iframe>`;\n\n return wrapWithFixedOutput(videoMarkup);\n};\n\nexport {\n createSlashCommands,\n parseContentInfo,\n getEmbedUrl,\n getImageContentToInsert,\n getVideoContentToInsert,\n isValidVariableName,\n normalizeVariableName,\n trimVariablePadding,\n extractVariableNames,\n findVariableMarkers,\n findDocumentVariableMarkers,\n formatVariableReference,\n formatVariableAssignment,\n createVariableExpressionRegexp,\n wrapWithFixedOutput,\n unwrapFixedOutput,\n};\n"],"names":["FIXED_OUTPUT_MARKER","parseContentInfo","type","dataset","SelectedOption","createSlashCommands","onSelectOption","labels","context","word","handleSelect","view","_","from","to","selectedOption","getEmbedUrl","url","getVideoEmbedUrl","escapeHtmlAttribute","value","escapeMarkdownText","text","clampScalePercent","wrapWithFixedOutput","content","normalizedContent","unwrapFixedOutput","wrappedPattern","getImageContentToInsert","resourceUrl","resourceTitle","scalePercent","clampedScale","sanitizedHtmlUrl","sanitizedTitle","markdownTitle","widthAttribute","htmlTitleAttributes","imageMarkup","getVideoContentToInsert","embedUrl","sanitizedResourceUrl","sanitizedEmbedUrl","videoMarkup"],"mappings":"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"}
|
|
@@ -10,26 +10,16 @@ declare const parseContentInfo: (type: SelectedOption, dataset: {
|
|
|
10
10
|
resourceUrl: string | undefined;
|
|
11
11
|
resourceTitle: string | undefined;
|
|
12
12
|
scalePercent: number | undefined;
|
|
13
|
-
variableName?: undefined;
|
|
14
13
|
} | {
|
|
15
14
|
resourceUrl: string | undefined;
|
|
16
15
|
resourceTitle: string | undefined;
|
|
17
16
|
scalePercent?: undefined;
|
|
18
|
-
variableName?: undefined;
|
|
19
|
-
} | {
|
|
20
|
-
variableName: string | undefined;
|
|
21
|
-
resourceUrl?: undefined;
|
|
22
|
-
resourceTitle?: undefined;
|
|
23
|
-
scalePercent?: undefined;
|
|
24
17
|
};
|
|
25
18
|
declare function createSlashCommands(onSelectOption: (selectedOption: SelectedOption) => void, labels?: {
|
|
26
19
|
divider?: string;
|
|
27
20
|
fixedText?: string;
|
|
28
21
|
image?: string;
|
|
29
22
|
video?: string;
|
|
30
|
-
variable?: string;
|
|
31
|
-
}, { enableVariables }?: {
|
|
32
|
-
enableVariables?: boolean;
|
|
33
23
|
}): (context: CompletionContext) => CompletionResult | null;
|
|
34
24
|
declare const getEmbedUrl: (url: string) => string;
|
|
35
25
|
declare const wrapWithFixedOutput: (content: string) => string;
|