@gravity-ui/markdown-editor 15.3.1 → 15.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +7 -3
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +15 -2
- package/build/cjs/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
- package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.d.ts +3 -0
- package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.js +7 -1
- package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/const.js.map +1 -1
- package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.d.ts +1 -1
- package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js +8 -2
- package/build/cjs/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
- package/build/cjs/extensions/additional/Mermaid/actions.js +12 -5
- package/build/cjs/extensions/additional/Mermaid/actions.js.map +1 -1
- package/build/cjs/extensions/additional/Mermaid/types.d.ts +3 -0
- package/build/cjs/extensions/additional/Mermaid/types.js +3 -0
- package/build/cjs/extensions/additional/Mermaid/types.js.map +1 -0
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.d.ts +1 -0
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js +14 -5
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js.map +1 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +13 -12
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.d.ts +3 -0
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js +7 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js.map +1 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.d.ts +1 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js +8 -2
- package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/actions.js +9 -2
- package/build/cjs/extensions/additional/YfmHtmlBlock/actions.js.map +1 -1
- package/build/cjs/extensions/additional/YfmHtmlBlock/types.d.ts +3 -0
- package/build/cjs/extensions/additional/YfmHtmlBlock/types.js +3 -0
- package/build/cjs/extensions/additional/YfmHtmlBlock/types.js.map +1 -0
- package/build/cjs/extensions/behavior/Autocomplete/index.d.ts +1 -0
- package/build/cjs/extensions/behavior/Autocomplete/index.js +5 -3
- package/build/cjs/extensions/behavior/Autocomplete/index.js.map +1 -1
- package/build/cjs/extensions/behavior/Autocomplete/types.d.ts +1 -1
- package/build/cjs/extensions/behavior/Autocomplete/types.js.map +1 -1
- package/build/cjs/extensions/behavior/Autocomplete/utils.d.ts +3 -0
- package/build/cjs/extensions/behavior/Autocomplete/utils.js +8 -0
- package/build/cjs/extensions/behavior/Autocomplete/utils.js.map +1 -0
- package/build/cjs/extensions/behavior/Clipboard/code.d.ts +7 -1
- package/build/cjs/extensions/behavior/Clipboard/code.js +60 -0
- package/build/cjs/extensions/behavior/Clipboard/code.js.map +1 -1
- package/build/cjs/extensions/behavior/Clipboard/index.js +2 -0
- package/build/cjs/extensions/behavior/Clipboard/index.js.map +1 -1
- package/build/cjs/extensions/behavior/CommandMenu/handler.js +6 -6
- package/build/cjs/extensions/behavior/CommandMenu/handler.js.map +1 -1
- package/build/cjs/extensions/behavior/SharedState/SharedState.d.ts +7 -0
- package/build/cjs/extensions/behavior/SharedState/SharedState.js +16 -0
- package/build/cjs/extensions/behavior/SharedState/SharedState.js.map +1 -0
- package/build/cjs/extensions/behavior/SharedState/index.d.ts +1 -0
- package/build/cjs/extensions/behavior/SharedState/index.js +5 -0
- package/build/cjs/extensions/behavior/SharedState/index.js.map +1 -0
- package/build/cjs/extensions/behavior/SharedState/plugin.d.ts +3 -0
- package/build/cjs/extensions/behavior/SharedState/plugin.js +62 -0
- package/build/cjs/extensions/behavior/SharedState/plugin.js.map +1 -0
- package/build/cjs/extensions/behavior/SharedState/types.d.ts +1 -0
- package/build/cjs/extensions/behavior/SharedState/types.js +3 -0
- package/build/cjs/extensions/behavior/SharedState/types.js.map +1 -0
- package/build/cjs/extensions/behavior/SharedState/utils.d.ts +29 -0
- package/build/cjs/extensions/behavior/SharedState/utils.js +60 -0
- package/build/cjs/extensions/behavior/SharedState/utils.js.map +1 -0
- package/build/cjs/extensions/behavior/index.d.ts +2 -0
- package/build/cjs/extensions/behavior/index.js +4 -0
- package/build/cjs/extensions/behavior/index.js.map +1 -1
- package/build/cjs/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js +7 -12
- package/build/cjs/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js.map +1 -1
- package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.d.ts +0 -1
- package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +7 -6
- package/build/cjs/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
- package/build/cjs/react-utils/index.d.ts +1 -0
- package/build/cjs/react-utils/index.js +1 -0
- package/build/cjs/react-utils/index.js.map +1 -1
- package/build/cjs/react-utils/useSharedEditingState.d.ts +5 -0
- package/build/cjs/react-utils/useSharedEditingState.js +25 -0
- package/build/cjs/react-utils/useSharedEditingState.js.map +1 -0
- package/build/cjs/toolbar/ToolbarButton.d.ts +6 -8
- package/build/cjs/toolbar/ToolbarButton.js +2 -2
- package/build/cjs/toolbar/ToolbarButton.js.map +1 -1
- package/build/cjs/toolbar/ToolbarListButton.js +7 -8
- package/build/cjs/toolbar/ToolbarListButton.js.map +1 -1
- package/build/cjs/utils/descedants.d.ts +8 -0
- package/build/cjs/utils/descedants.js +15 -0
- package/build/cjs/utils/descedants.js.map +1 -0
- package/build/cjs/utils/entity-id.d.ts +11 -0
- package/build/cjs/utils/entity-id.js +21 -0
- package/build/cjs/utils/entity-id.js.map +1 -0
- package/build/cjs/utils/index.d.ts +2 -0
- package/build/cjs/utils/index.js +2 -0
- package/build/cjs/utils/index.js.map +1 -1
- package/build/cjs/version.js +1 -1
- package/build/cjs/version.js.map +1 -1
- package/build/cjs/view/hocs/withYfmHtml/index.d.ts +2 -0
- package/build/cjs/view/hocs/withYfmHtml/index.js +2 -2
- package/build/cjs/view/hocs/withYfmHtml/index.js.map +1 -1
- package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +3 -1
- package/build/cjs/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js +8 -4
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/MermaidView.js.map +1 -1
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.d.ts +1 -0
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js +14 -1
- package/build/esm/extensions/additional/Mermaid/MermaidNodeView/NodeView.js.map +1 -1
- package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.d.ts +3 -0
- package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.js +6 -0
- package/build/esm/extensions/additional/Mermaid/MermaidSpecs/const.js.map +1 -1
- package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.d.ts +2 -2
- package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js +8 -3
- package/build/esm/extensions/additional/Mermaid/MermaidSpecs/index.js.map +1 -1
- package/build/esm/extensions/additional/Mermaid/actions.js +12 -5
- package/build/esm/extensions/additional/Mermaid/actions.js.map +1 -1
- package/build/esm/extensions/additional/Mermaid/types.d.ts +3 -0
- package/build/esm/extensions/additional/Mermaid/types.js +2 -0
- package/build/esm/extensions/additional/Mermaid/types.js.map +1 -0
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.d.ts +1 -0
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js +14 -5
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/NodeView.js.map +1 -1
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js +13 -11
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map +1 -1
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.d.ts +3 -0
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js +6 -0
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.js.map +1 -1
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.d.ts +2 -2
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js +8 -3
- package/build/esm/extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.js.map +1 -1
- package/build/esm/extensions/additional/YfmHtmlBlock/actions.js +9 -2
- package/build/esm/extensions/additional/YfmHtmlBlock/actions.js.map +1 -1
- package/build/esm/extensions/additional/YfmHtmlBlock/types.d.ts +3 -0
- package/build/esm/extensions/additional/YfmHtmlBlock/types.js +2 -0
- package/build/esm/extensions/additional/YfmHtmlBlock/types.js.map +1 -0
- package/build/esm/extensions/behavior/Autocomplete/index.d.ts +1 -0
- package/build/esm/extensions/behavior/Autocomplete/index.js +2 -1
- package/build/esm/extensions/behavior/Autocomplete/index.js.map +1 -1
- package/build/esm/extensions/behavior/Autocomplete/types.d.ts +1 -1
- package/build/esm/extensions/behavior/Autocomplete/types.js.map +1 -1
- package/build/esm/extensions/behavior/Autocomplete/utils.d.ts +3 -0
- package/build/esm/extensions/behavior/Autocomplete/utils.js +5 -0
- package/build/esm/extensions/behavior/Autocomplete/utils.js.map +1 -0
- package/build/esm/extensions/behavior/Clipboard/code.d.ts +7 -1
- package/build/esm/extensions/behavior/Clipboard/code.js +57 -0
- package/build/esm/extensions/behavior/Clipboard/code.js.map +1 -1
- package/build/esm/extensions/behavior/Clipboard/index.js +2 -0
- package/build/esm/extensions/behavior/Clipboard/index.js.map +1 -1
- package/build/esm/extensions/behavior/CommandMenu/handler.js +7 -7
- package/build/esm/extensions/behavior/CommandMenu/handler.js.map +1 -1
- package/build/esm/extensions/behavior/SharedState/SharedState.d.ts +7 -0
- package/build/esm/extensions/behavior/SharedState/SharedState.js +11 -0
- package/build/esm/extensions/behavior/SharedState/SharedState.js.map +1 -0
- package/build/esm/extensions/behavior/SharedState/index.d.ts +1 -0
- package/build/esm/extensions/behavior/SharedState/index.js +2 -0
- package/build/esm/extensions/behavior/SharedState/index.js.map +1 -0
- package/build/esm/extensions/behavior/SharedState/plugin.d.ts +3 -0
- package/build/esm/extensions/behavior/SharedState/plugin.js +59 -0
- package/build/esm/extensions/behavior/SharedState/plugin.js.map +1 -0
- package/build/esm/extensions/behavior/SharedState/types.d.ts +1 -0
- package/build/esm/extensions/behavior/SharedState/types.js +2 -0
- package/build/esm/extensions/behavior/SharedState/types.js.map +1 -0
- package/build/esm/extensions/behavior/SharedState/utils.d.ts +29 -0
- package/build/esm/extensions/behavior/SharedState/utils.js +56 -0
- package/build/esm/extensions/behavior/SharedState/utils.js.map +1 -0
- package/build/esm/extensions/behavior/index.d.ts +2 -0
- package/build/esm/extensions/behavior/index.js +4 -0
- package/build/esm/extensions/behavior/index.js.map +1 -1
- package/build/esm/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js +7 -12
- package/build/esm/extensions/markdown/Link/plugins/LinkTooltipPlugin/index.js.map +1 -1
- package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.d.ts +0 -1
- package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js +8 -7
- package/build/esm/extensions/yfm/Emoji/EmojiSuggest/EmojiHandler.js.map +1 -1
- package/build/esm/react-utils/index.d.ts +1 -0
- package/build/esm/react-utils/index.js +1 -0
- package/build/esm/react-utils/index.js.map +1 -1
- package/build/esm/react-utils/useSharedEditingState.d.ts +5 -0
- package/build/esm/react-utils/useSharedEditingState.js +22 -0
- package/build/esm/react-utils/useSharedEditingState.js.map +1 -0
- package/build/esm/toolbar/ToolbarButton.d.ts +6 -8
- package/build/esm/toolbar/ToolbarButton.js +2 -2
- package/build/esm/toolbar/ToolbarButton.js.map +1 -1
- package/build/esm/toolbar/ToolbarListButton.js +8 -9
- package/build/esm/toolbar/ToolbarListButton.js.map +1 -1
- package/build/esm/utils/descedants.d.ts +8 -0
- package/build/esm/utils/descedants.js +12 -0
- package/build/esm/utils/descedants.js.map +1 -0
- package/build/esm/utils/entity-id.d.ts +11 -0
- package/build/esm/utils/entity-id.js +16 -0
- package/build/esm/utils/entity-id.js.map +1 -0
- package/build/esm/utils/index.d.ts +2 -0
- package/build/esm/utils/index.js +2 -0
- package/build/esm/utils/index.js.map +1 -1
- package/build/esm/version.js +1 -1
- package/build/esm/version.js.map +1 -1
- package/build/esm/view/hocs/withYfmHtml/index.d.ts +2 -0
- package/build/esm/view/hocs/withYfmHtml/index.js +2 -2
- package/build/esm/view/hocs/withYfmHtml/index.js.map +1 -1
- package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js +3 -1
- package/build/esm/view/hocs/withYfmHtml/useYfmHtmlBlockRuntime.js.map +1 -1
- package/package.json +15 -4
package/build/cjs/extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"YfmHtmlBlockView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useEffect, useRef, useState} from 'react';\n\nimport {getStyles} from '@diplodoc/html-extension';\nimport type {IHTMLIFrameElementConfig} from '@diplodoc/html-extension/runtime';\nimport {Ellipsis as DotsIcon, Eye} from '@gravity-ui/icons';\nimport {Button, Icon, Label, Menu, Popup} from '@gravity-ui/uikit';\nimport debounce from 'lodash/debounce';\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from '../../../../classname';\nimport {TextAreaFixed as TextArea} from '../../../../forms/TextInput';\nimport {i18n} from '../../../../i18n/common';\nimport {useBooleanState, useElementState} from '../../../../react-utils/hooks';\nimport {removeNode} from '../../../../utils/remove-node';\nimport {YfmHtmlBlockConsts} from '../YfmHtmlBlockSpecs/const';\nimport type {YfmHtmlBlockOptions} from '../index';\n\nimport './YfmHtmlBlock.scss';\n\nexport const cnYfmHtmlBlock = cn('yfm-html-block');\nexport const STOP_EVENT_CLASSNAME = 'prosemirror-stop-event';\n\nconst b = cnYfmHtmlBlock;\n\ninterface YfmHtmlBlockViewProps {\n html: string;\n onСlick: () => void;\n config?: IHTMLIFrameElementConfig;\n}\n\nexport function generateID() {\n return Math.random().toString(36).substr(2, 8);\n}\n\nconst DEFAULT_PADDING = 20;\nconst DEFAULT_DELAY = 100;\n\nconst createLinkCLickHandler = (value: Element, document: Document) => (event: Event) => {\n event.preventDefault();\n const targetId = value.getAttribute('href');\n\n if (targetId) {\n const targetElement = document.querySelector(targetId);\n if (targetElement) {\n targetElement.scrollIntoView({behavior: 'smooth'});\n }\n }\n};\n\nconst YfmHtmlBlockPreview: React.FC<YfmHtmlBlockViewProps> = ({html, onСlick, config}) => {\n const ref = useRef<HTMLIFrameElement>(null);\n const styles = useRef<Record<string, string>>({});\n const classNames = useRef<string[]>([]);\n const resizeConfig = useRef<Record<string, number>>({});\n\n const [height, setHeight] = useState('100%');\n\n useEffect(() => {\n setStyles(config?.styles);\n setClassNames(config?.classNames);\n }, [config, ref.current?.contentWindow?.document?.body]);\n\n const handleLoadIFrame = () => {\n const contentWindow = ref.current?.contentWindow;\n\n handleResizeIFrame();\n\n if (contentWindow) {\n const frameDocument = contentWindow.document;\n frameDocument.addEventListener('dblclick', () => {\n onСlick();\n });\n }\n };\n\n const handleResizeIFrame = () => {\n if (ref.current) {\n const contentWindow = ref.current?.contentWindow;\n if (contentWindow) {\n const body = contentWindow.document.body;\n if (body) {\n const height =\n body.scrollHeight +\n (resizeConfig.current?.padding || DEFAULT_PADDING) +\n 'px';\n\n setHeight(height);\n }\n }\n }\n };\n\n const setClassNames = (newClassNames: string[] | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newClassNames) {\n const previousClassNames = classNames.current;\n\n // remove all classes that were in previousClassNames but are not in classNames\n previousClassNames.forEach((className) => {\n if (!newClassNames.includes(className)) {\n body.classList.remove(className);\n }\n });\n\n // add classes that are in classNames\n newClassNames.forEach((className) => {\n if (!body.classList.contains(className)) {\n body.classList.add(className);\n }\n });\n\n classNames.current = newClassNames;\n }\n };\n\n const setStyles = (newStyles: Record<string, string> | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newStyles) {\n const previousStyles = styles.current;\n\n // remove all styles that are in previousStyles but not in styles\n Object.keys(previousStyles).forEach((property) => {\n if (!Object.prototype.hasOwnProperty.call(newStyles, property)) {\n body.style.removeProperty(property);\n }\n });\n\n // sdd or update styles that are in styles\n Object.keys(newStyles).forEach((property) => {\n body.style.setProperty(property, newStyles[property]);\n });\n\n // update current styles to the new styles\n styles.current = newStyles;\n }\n };\n\n // finds all relative links (href^=\"#\") and changes their click behavior\n const createAnchorLinkHandlers = (type: 'add' | 'remove') => () => {\n const document = ref.current?.contentWindow!.document;\n\n if (document) {\n document.querySelectorAll('a[href^=\"#\"]').forEach((value: Element) => {\n const handler = createLinkCLickHandler(value, document);\n if (type === 'add') {\n value.addEventListener('click', handler);\n } else {\n value.removeEventListener('click', handler);\n }\n });\n }\n };\n\n useEffect(() => {\n ref.current?.addEventListener('load', handleLoadIFrame);\n ref.current?.addEventListener('load', createAnchorLinkHandlers('add'));\n return () => {\n ref.current?.removeEventListener('load', handleLoadIFrame);\n ref.current?.removeEventListener('load', createAnchorLinkHandlers('remove'));\n };\n }, [html]);\n\n useEffect(() => {\n if (ref.current) {\n const resizeObserver = new window.ResizeObserver(\n debounce(handleResizeIFrame, DEFAULT_DELAY),\n );\n resizeObserver.observe(ref.current);\n }\n }, [ref.current?.contentWindow?.document?.body]);\n\n return (\n <iframe\n style={{\n height,\n }}\n ref={ref}\n title={generateID()}\n frameBorder={0}\n className={b('content')}\n srcDoc={html}\n />\n );\n};\n\nconst CodeEditMode: React.FC<{\n initialText: string;\n onSave: (v: string) => void;\n onCancel: () => void;\n}> = ({initialText, onSave, onCancel}) => {\n const [text, setText] = useState(initialText || '\\n');\n\n return (\n <div className={b({editing: true})}>\n <div className={b('editor')}>\n <TextArea\n controlProps={{\n className: STOP_EVENT_CLASSNAME,\n }}\n value={text}\n onUpdate={(v) => {\n setText(v);\n }}\n autoFocus\n />\n\n <div className={b('controls')}>\n <div>\n <Button onClick={onCancel} view={'flat'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('cancel')}</span>\n </Button>\n <Button onClick={() => onSave(text)} view={'action'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('save')}</span>\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const YfmHtmlBlockView: React.FC<{\n getPos: () => number | undefined;\n node: Node;\n onChange: (attrs: {[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: string}) => void;\n options: YfmHtmlBlockOptions;\n view: EditorView;\n}> = ({\n onChange,\n node,\n getPos,\n view,\n options: {useConfig, sanitize, styles, baseTarget = '_parent', head: headContent = ''},\n}) => {\n const [editing, setEditing, unsetEditing, toggleEditing] = useBooleanState(\n Boolean(node.attrs[YfmHtmlBlockConsts.NodeAttrs.newCreated]),\n );\n\n const config = useConfig?.();\n\n const [menuOpen, _openMenu, closeMenu, toggleMenuOpen] = useBooleanState(false);\n const [anchorElement, setAnchorElement] = useElementState();\n\n const handleClick = () => {\n setEditing();\n };\n\n if (editing) {\n return (\n <CodeEditMode\n initialText={node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc]}\n onCancel={unsetEditing}\n onSave={(v) => {\n onChange({[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: v});\n unsetEditing();\n }}\n />\n );\n }\n\n let additional = baseTarget ? `<base target=\"${baseTarget}\">` : '';\n if (styles) {\n const stylesContent =\n typeof styles === 'string'\n ? `<link rel=\"stylesheet\" href=\"${styles}\" />`\n : `<style>${getStyles(styles)}</style>`;\n additional += stylesContent;\n }\n\n const head = `<head>${headContent || additional}</head>`;\n const body = `<body>${node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc] ?? ''}</body>`;\n const html = `<!DOCTYPE html><html>${head}${body}</html>`;\n\n const resultHtml = sanitize ? sanitize(html) : html;\n\n return (\n <div className={b()} onDoubleClick={setEditing}>\n <Label className={b('label')} icon={<Icon size={16} data={Eye} />}>\n {i18n('preview')}\n </Label>\n <YfmHtmlBlockPreview html={resultHtml} onСlick={handleClick} config={config} />\n\n <div className={b('menu')}>\n <Button\n onClick={toggleMenuOpen}\n ref={setAnchorElement}\n size=\"s\"\n className={STOP_EVENT_CLASSNAME}\n >\n <Icon data={DotsIcon} className={STOP_EVENT_CLASSNAME} />\n </Button>\n <Popup\n anchorElement={anchorElement}\n open={menuOpen}\n onOpenChange={closeMenu}\n placement=\"bottom-end\"\n >\n <Menu>\n <Menu.Item\n onClick={() => {\n toggleEditing();\n closeMenu();\n }}\n >\n {i18n('edit')}\n </Menu.Item>\n <Menu.Item\n onClick={() => {\n const pos = getPos();\n if (pos === undefined) return;\n removeNode({\n node,\n pos,\n tr: view.state.tr,\n dispatch: view.dispatch,\n });\n }}\n >\n {i18n('remove')}\n </Menu.Item>\n </Menu>\n </Popup>\n </div>\n </div>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"file":"YfmHtmlBlockView.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockNodeView/YfmHtmlBlockView.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useEffect, useMemo, useRef, useState} from 'react';\n\nimport {getStyles} from '@diplodoc/html-extension';\nimport type {IHTMLIFrameElementConfig} from '@diplodoc/html-extension/runtime';\nimport {Ellipsis as DotsIcon, Eye} from '@gravity-ui/icons';\nimport {Button, Icon, Label, Menu, Popup} from '@gravity-ui/uikit';\nimport type {Node} from 'prosemirror-model';\nimport type {EditorView} from 'prosemirror-view';\n\nimport {cn} from 'src/classname';\nimport {SharedStateKey} from 'src/extensions/behavior/SharedState';\nimport {TextAreaFixed as TextArea} from 'src/forms/TextInput';\nimport {i18n} from 'src/i18n/common';\nimport {debounce} from 'src/lodash';\nimport {useBooleanState, useElementState} from 'src/react-utils/hooks';\nimport {useSharedEditingState} from 'src/react-utils/useSharedEditingState';\nimport {removeNode} from 'src/utils/remove-node';\n\nimport {YfmHtmlBlockConsts} from '../YfmHtmlBlockSpecs/const';\nimport type {YfmHtmlBlockOptions} from '../index';\nimport type {YfmHtmlBlockEntitySharedState} from '../types';\n\nimport './YfmHtmlBlock.scss';\n\nexport const cnYfmHtmlBlock = cn('yfm-html-block');\nexport const STOP_EVENT_CLASSNAME = 'prosemirror-stop-event';\n\nconst b = cnYfmHtmlBlock;\n\ninterface YfmHtmlBlockViewProps {\n html: string;\n onClick: () => void;\n config?: IHTMLIFrameElementConfig;\n}\n\nexport function generateID() {\n return Math.random().toString(36).substr(2, 8);\n}\n\nconst DEFAULT_PADDING = 20;\nconst DEFAULT_DELAY = 100;\n\nconst createLinkCLickHandler = (value: Element, document: Document) => (event: Event) => {\n event.preventDefault();\n const targetId = value.getAttribute('href');\n\n if (targetId) {\n const targetElement = document.querySelector(targetId);\n if (targetElement) {\n targetElement.scrollIntoView({behavior: 'smooth'});\n }\n }\n};\n\nconst YfmHtmlBlockPreview: React.FC<YfmHtmlBlockViewProps> = ({html, onClick, config}) => {\n const ref = useRef<HTMLIFrameElement>(null);\n const styles = useRef<Record<string, string>>({});\n const classNames = useRef<string[]>([]);\n const resizeConfig = useRef<Record<string, number>>({});\n\n const [height, setHeight] = useState('100%');\n\n useEffect(() => {\n setStyles(config?.styles);\n setClassNames(config?.classNames);\n }, [config, ref.current?.contentWindow?.document?.body]);\n\n const handleLoadIFrame = () => {\n const contentWindow = ref.current?.contentWindow;\n\n handleResizeIFrame();\n\n if (contentWindow) {\n const frameDocument = contentWindow.document;\n frameDocument.addEventListener('dblclick', () => {\n onClick();\n });\n }\n };\n\n const handleResizeIFrame = () => {\n if (ref.current) {\n const contentWindow = ref.current?.contentWindow;\n if (contentWindow) {\n const body = contentWindow.document.body;\n if (body) {\n const height =\n body.scrollHeight +\n (resizeConfig.current?.padding || DEFAULT_PADDING) +\n 'px';\n\n setHeight(height);\n }\n }\n }\n };\n\n const setClassNames = (newClassNames: string[] | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newClassNames) {\n const previousClassNames = classNames.current;\n\n // remove all classes that were in previousClassNames but are not in classNames\n previousClassNames.forEach((className) => {\n if (!newClassNames.includes(className)) {\n body.classList.remove(className);\n }\n });\n\n // add classes that are in classNames\n newClassNames.forEach((className) => {\n if (!body.classList.contains(className)) {\n body.classList.add(className);\n }\n });\n\n classNames.current = newClassNames;\n }\n };\n\n const setStyles = (newStyles: Record<string, string> | undefined) => {\n const body = ref.current?.contentWindow?.document.body;\n\n if (body && newStyles) {\n const previousStyles = styles.current;\n\n // remove all styles that are in previousStyles but not in styles\n Object.keys(previousStyles).forEach((property) => {\n if (!Object.prototype.hasOwnProperty.call(newStyles, property)) {\n body.style.removeProperty(property);\n }\n });\n\n // sdd or update styles that are in styles\n Object.keys(newStyles).forEach((property) => {\n body.style.setProperty(property, newStyles[property]);\n });\n\n // update current styles to the new styles\n styles.current = newStyles;\n }\n };\n\n // finds all relative links (href^=\"#\") and changes their click behavior\n const createAnchorLinkHandlers = (type: 'add' | 'remove') => () => {\n const document = ref.current?.contentWindow!.document;\n\n if (document) {\n document.querySelectorAll('a[href^=\"#\"]').forEach((value: Element) => {\n const handler = createLinkCLickHandler(value, document);\n if (type === 'add') {\n value.addEventListener('click', handler);\n } else {\n value.removeEventListener('click', handler);\n }\n });\n }\n };\n\n useEffect(() => {\n ref.current?.addEventListener('load', handleLoadIFrame);\n ref.current?.addEventListener('load', createAnchorLinkHandlers('add'));\n return () => {\n ref.current?.removeEventListener('load', handleLoadIFrame);\n ref.current?.removeEventListener('load', createAnchorLinkHandlers('remove'));\n };\n }, [html]);\n\n useEffect(() => {\n if (ref.current) {\n const resizeObserver = new window.ResizeObserver(\n debounce(handleResizeIFrame, DEFAULT_DELAY),\n );\n resizeObserver.observe(ref.current);\n }\n }, [ref.current?.contentWindow?.document?.body]);\n\n return (\n <iframe\n style={{\n height,\n }}\n ref={ref}\n title={generateID()}\n frameBorder={0}\n className={b('content')}\n srcDoc={html}\n />\n );\n};\n\nconst CodeEditMode: React.FC<{\n initialText: string;\n onSave: (v: string) => void;\n onCancel: () => void;\n}> = ({initialText, onSave, onCancel}) => {\n const [text, setText] = useState(initialText || '\\n');\n\n return (\n <div className={b({editing: true})}>\n <div className={b('editor')}>\n <TextArea\n controlProps={{\n className: STOP_EVENT_CLASSNAME,\n }}\n value={text}\n onUpdate={(v) => {\n setText(v);\n }}\n autoFocus\n />\n\n <div className={b('controls')}>\n <div>\n <Button onClick={onCancel} view={'flat'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('cancel')}</span>\n </Button>\n <Button onClick={() => onSave(text)} view={'action'}>\n <span className={STOP_EVENT_CLASSNAME}>{i18n('save')}</span>\n </Button>\n </div>\n </div>\n </div>\n </div>\n );\n};\n\nexport const YfmHtmlBlockView: React.FC<{\n getPos: () => number | undefined;\n node: Node;\n onChange: (attrs: {[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: string}) => void;\n options: YfmHtmlBlockOptions;\n view: EditorView;\n}> = ({\n onChange,\n node,\n getPos,\n view,\n options: {useConfig, sanitize, styles, baseTarget = '_parent', head: headContent = ''},\n}) => {\n const entityId: string = node.attrs[YfmHtmlBlockConsts.NodeAttrs.EntityId];\n const entityKey = useMemo(\n () => SharedStateKey.define<YfmHtmlBlockEntitySharedState>({name: entityId}),\n [entityId],\n );\n\n const config = useConfig?.();\n\n const [editing, setEditing, unsetEditing] = useSharedEditingState(view, entityKey);\n const [menuOpen, _openMenu, closeMenu, toggleMenuOpen] = useBooleanState(false);\n const [anchorElement, setAnchorElement] = useElementState();\n\n if (editing) {\n return (\n <CodeEditMode\n initialText={node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc]}\n onCancel={unsetEditing}\n onSave={(v) => {\n onChange({[YfmHtmlBlockConsts.NodeAttrs.srcdoc]: v});\n unsetEditing();\n }}\n />\n );\n }\n\n let additional = baseTarget ? `<base target=\"${baseTarget}\">` : '';\n if (styles) {\n const stylesContent =\n typeof styles === 'string'\n ? `<link rel=\"stylesheet\" href=\"${styles}\" />`\n : `<style>${getStyles(styles)}</style>`;\n additional += stylesContent;\n }\n\n const head = `<head>${headContent || additional}</head>`;\n const body = `<body>${node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc] ?? ''}</body>`;\n const html = `<!DOCTYPE html><html>${head}${body}</html>`;\n\n const sanitizeFunction = typeof sanitize === 'function' ? sanitize : sanitize?.body;\n\n const resultHtml = sanitizeFunction ? sanitizeFunction(html) : html;\n\n return (\n <div className={b()} onDoubleClick={setEditing}>\n <Label className={b('label')} icon={<Icon size={16} data={Eye} />}>\n {i18n('preview')}\n </Label>\n <YfmHtmlBlockPreview html={resultHtml} onClick={setEditing} config={config} />\n\n <div className={b('menu')}>\n <Button\n onClick={toggleMenuOpen}\n ref={setAnchorElement}\n size=\"s\"\n className={STOP_EVENT_CLASSNAME}\n >\n <Icon data={DotsIcon} className={STOP_EVENT_CLASSNAME} />\n </Button>\n <Popup\n anchorElement={anchorElement}\n open={menuOpen}\n onOpenChange={closeMenu}\n placement=\"bottom-end\"\n >\n <Menu>\n <Menu.Item\n onClick={() => {\n setEditing();\n closeMenu();\n }}\n >\n {i18n('edit')}\n </Menu.Item>\n <Menu.Item\n onClick={() => {\n const pos = getPos();\n if (pos === undefined) return;\n removeNode({\n node,\n pos,\n tr: view.state.tr,\n dispatch: view.dispatch,\n });\n }}\n >\n {i18n('remove')}\n </Menu.Item>\n </Menu>\n </Popup>\n </div>\n </div>\n );\n};\n"]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export declare enum YfmHtmlBlockAttrs {
|
|
2
|
+
EntityId = "data-entity-id",
|
|
2
3
|
class = "class",
|
|
3
4
|
frameborder = "frameborder",
|
|
5
|
+
/** @deprecated This is no longer used. Removed in next major version */
|
|
4
6
|
newCreated = "newCreated",
|
|
5
7
|
srcdoc = "srcdoc",
|
|
6
8
|
style = "style"
|
|
@@ -13,3 +15,4 @@ export declare const YfmHtmlBlockConsts: {
|
|
|
13
15
|
readonly NodeAttrs: typeof YfmHtmlBlockAttrs;
|
|
14
16
|
readonly nodeType: (schema: import("prosemirror-model").Schema) => import("prosemirror-model").NodeType;
|
|
15
17
|
};
|
|
18
|
+
export declare const defaultYfmHtmlBlockEntityId: string;
|
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.YfmHtmlBlockConsts = exports.YfmHtmlBlockAction = exports.yfmHtmlBlockNodeType = exports.yfmHtmlBlockNodeName = exports.YfmHtmlBlockAttrs = void 0;
|
|
3
|
+
exports.defaultYfmHtmlBlockEntityId = exports.YfmHtmlBlockConsts = exports.YfmHtmlBlockAction = exports.yfmHtmlBlockNodeType = exports.yfmHtmlBlockNodeName = exports.YfmHtmlBlockAttrs = void 0;
|
|
4
|
+
const entity_id_1 = require("../../../../utils/entity-id.js");
|
|
4
5
|
const schema_1 = require("../../../../utils/schema.js");
|
|
5
6
|
var YfmHtmlBlockAttrs;
|
|
6
7
|
(function (YfmHtmlBlockAttrs) {
|
|
8
|
+
// @ts-expect-error error TS18055
|
|
9
|
+
YfmHtmlBlockAttrs["EntityId"] = "data-entity-id";
|
|
7
10
|
YfmHtmlBlockAttrs["class"] = "class";
|
|
8
11
|
YfmHtmlBlockAttrs["frameborder"] = "frameborder";
|
|
12
|
+
// MAJOR: remove before next major
|
|
13
|
+
/** @deprecated This is no longer used. Removed in next major version */
|
|
9
14
|
YfmHtmlBlockAttrs["newCreated"] = "newCreated";
|
|
10
15
|
YfmHtmlBlockAttrs["srcdoc"] = "srcdoc";
|
|
11
16
|
YfmHtmlBlockAttrs["style"] = "style";
|
|
@@ -18,4 +23,5 @@ exports.YfmHtmlBlockConsts = {
|
|
|
18
23
|
NodeAttrs: YfmHtmlBlockAttrs,
|
|
19
24
|
nodeType: exports.yfmHtmlBlockNodeType,
|
|
20
25
|
};
|
|
26
|
+
exports.defaultYfmHtmlBlockEntityId = exports.yfmHtmlBlockNodeName + '#0';
|
|
21
27
|
//# sourceMappingURL=const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/const.ts"],"names":[],"mappings":";;;AAAA,8DAAiD;AACjD,wDAAiD;AAEjD,IAAY,iBAUX;AAVD,WAAY,iBAAiB;IACzB,iCAAiC;IACjC,gDAAuB,CAAA;IACvB,oCAAe,CAAA;IACf,gDAA2B,CAAA;IAC3B,kCAAkC;IAClC,wEAAwE;IACxE,8CAAyB,CAAA;IACzB,sCAAiB,CAAA;IACjB,oCAAe,CAAA;AACnB,CAAC,EAVW,iBAAiB,iCAAjB,iBAAiB,QAU5B;AAEY,QAAA,oBAAoB,GAAG,gBAAgB,CAAC;AACxC,QAAA,oBAAoB,GAAG,IAAA,wBAAe,EAAC,4BAAoB,CAAC,CAAC;AAE7D,QAAA,kBAAkB,GAAG,oBAAoB,CAAC;AAE1C,QAAA,kBAAkB,GAAG;IAC9B,QAAQ,EAAE,4BAAoB;IAC9B,SAAS,EAAE,iBAAiB;IAC5B,QAAQ,EAAE,4BAAoB;CACxB,CAAC;AAEE,QAAA,2BAA2B,GAAG,4BAAoB,GAAG,IAAI,CAAC","sourcesContent":["import {entityIdAttr} from 'src/utils/entity-id';\nimport {nodeTypeFactory} from 'src/utils/schema';\n\nexport enum YfmHtmlBlockAttrs {\n // @ts-expect-error error TS18055\n EntityId = entityIdAttr,\n class = 'class',\n frameborder = 'frameborder',\n // MAJOR: remove before next major\n /** @deprecated This is no longer used. Removed in next major version */\n newCreated = 'newCreated',\n srcdoc = 'srcdoc',\n style = 'style',\n}\n\nexport const yfmHtmlBlockNodeName = 'yfm_html_block';\nexport const yfmHtmlBlockNodeType = nodeTypeFactory(yfmHtmlBlockNodeName);\n\nexport const YfmHtmlBlockAction = 'createYfmHtmlBlock';\n\nexport const YfmHtmlBlockConsts = {\n NodeName: yfmHtmlBlockNodeName,\n NodeAttrs: YfmHtmlBlockAttrs,\n nodeType: yfmHtmlBlockNodeType,\n} as const;\n\nexport const defaultYfmHtmlBlockEntityId = yfmHtmlBlockNodeName + '#0';\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type PluginOptions } from '@diplodoc/html-extension';
|
|
2
2
|
import type { ExtensionNodeSpec } from "../../../../core/index.js";
|
|
3
|
-
export { yfmHtmlBlockNodeName } from "./const.js";
|
|
3
|
+
export { yfmHtmlBlockNodeName, YfmHtmlBlockConsts } from "./const.js";
|
|
4
4
|
export interface YfmHtmlBlockSpecsOptions extends Omit<PluginOptions, 'runtimeJsPath' | 'containerClasses' | 'bundle' | 'embeddingMode'> {
|
|
5
5
|
nodeView?: ExtensionNodeSpec['view'];
|
|
6
6
|
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.YfmHtmlBlockSpecs = exports.yfmHtmlBlockNodeName = void 0;
|
|
3
|
+
exports.YfmHtmlBlockSpecs = exports.YfmHtmlBlockConsts = exports.yfmHtmlBlockNodeName = void 0;
|
|
4
4
|
const html_extension_1 = require("@diplodoc/html-extension");
|
|
5
|
+
const entity_id_1 = require("../../../../utils/entity-id.js");
|
|
5
6
|
const const_1 = require("./const.js");
|
|
6
7
|
var const_2 = require("./const.js");
|
|
7
8
|
Object.defineProperty(exports, "yfmHtmlBlockNodeName", { enumerable: true, get: function () { return const_2.yfmHtmlBlockNodeName; } });
|
|
9
|
+
Object.defineProperty(exports, "YfmHtmlBlockConsts", { enumerable: true, get: function () { return const_2.YfmHtmlBlockConsts; } });
|
|
8
10
|
const YfmHtmlBlockSpecsExtension = (builder, { nodeView, ...options }) => {
|
|
9
11
|
builder
|
|
10
12
|
.configureMd((md) => md.use((0, html_extension_1.transform)({
|
|
@@ -18,7 +20,10 @@ const YfmHtmlBlockSpecsExtension = (builder, { nodeView, ...options }) => {
|
|
|
18
20
|
name: const_1.YfmHtmlBlockConsts.NodeName,
|
|
19
21
|
type: 'node',
|
|
20
22
|
noCloseToken: true,
|
|
21
|
-
getAttrs: ({ content }) => ({
|
|
23
|
+
getAttrs: ({ content }) => ({
|
|
24
|
+
[const_1.YfmHtmlBlockConsts.NodeAttrs.srcdoc]: content,
|
|
25
|
+
[const_1.YfmHtmlBlockConsts.NodeAttrs.EntityId]: (0, entity_id_1.generateEntityId)(const_1.YfmHtmlBlockConsts.NodeName),
|
|
26
|
+
}),
|
|
22
27
|
},
|
|
23
28
|
},
|
|
24
29
|
spec: {
|
|
@@ -29,6 +34,7 @@ const YfmHtmlBlockSpecsExtension = (builder, { nodeView, ...options }) => {
|
|
|
29
34
|
[const_1.YfmHtmlBlockConsts.NodeAttrs.srcdoc]: { default: '' },
|
|
30
35
|
[const_1.YfmHtmlBlockConsts.NodeAttrs.style]: { default: null },
|
|
31
36
|
[const_1.YfmHtmlBlockConsts.NodeAttrs.newCreated]: { default: null },
|
|
37
|
+
[const_1.YfmHtmlBlockConsts.NodeAttrs.EntityId]: { default: const_1.defaultYfmHtmlBlockEntityId },
|
|
32
38
|
},
|
|
33
39
|
toDOM: (node) => ['iframe', node.attrs],
|
|
34
40
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.tsx"],"names":[],"mappings":";;;AAAA,6DAAuE;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../../src","sources":["extensions/additional/YfmHtmlBlock/YfmHtmlBlockSpecs/index.tsx"],"names":[],"mappings":";;;AAAA,6DAAuE;AAGvE,8DAAqD;AAErD,sCAAwE;AAExE,oCAAiE;AAAzD,6GAAA,oBAAoB,OAAA;AAAE,2GAAA,kBAAkB,OAAA;AAOhD,MAAM,0BAA0B,GAA4C,CACxE,OAAO,EACP,EAAC,QAAQ,EAAE,GAAG,OAAO,EAAC,EACxB,EAAE;IACA,OAAO;SACF,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAChB,EAAE,CAAC,GAAG,CACF,IAAA,0BAAS,EAAC;QACN,MAAM,EAAE,KAAK;QACb,aAAa,EAAE,QAAQ;QACvB,GAAG,OAAO;KACb,CAAC,EACF,EAAE,CACL,CACJ;SACA,OAAO,CAAC,0BAAkB,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,EAAE;YACJ,SAAS,EAAE;gBACP,IAAI,EAAE,0BAAkB,CAAC,QAAQ;gBACjC,IAAI,EAAE,MAAM;gBACZ,YAAY,EAAE,IAAI;gBAClB,QAAQ,EAAE,CAAC,EAAC,OAAO,EAAC,EAAE,EAAE,CAAC,CAAC;oBACtB,CAAC,0BAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO;oBAC9C,CAAC,0BAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAA,4BAAgB,EACrD,0BAAkB,CAAC,QAAQ,CAC9B;iBACJ,CAAC;aACL;SACJ;QACD,IAAI,EAAE;YACF,KAAK,EAAE,OAAO;YACd,KAAK,EAAE;gBACH,CAAC,0BAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAC,OAAO,EAAE,UAAU,EAAC;gBAC3D,CAAC,0BAAkB,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;gBACzD,CAAC,0BAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAC,OAAO,EAAE,EAAE,EAAC;gBACpD,CAAC,0BAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;gBACrD,CAAC,0BAAkB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC;gBAC1D,CAAC,0BAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAC,OAAO,EAAE,mCAA2B,EAAC;aAClF;YACD,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;SAC1C;QACD,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;YAClB,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YACxB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAClB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,0BAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7D,KAAK,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,EAAE,QAAQ;KACjB,CAAC,CAAC,CAAC;AACZ,CAAC,CAAC;AAEW,QAAA,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,0BAA0B,EAAE,0BAAkB,CAAC,CAAC","sourcesContent":["import {type PluginOptions, transform} from '@diplodoc/html-extension';\n\nimport type {ExtensionAuto, ExtensionNodeSpec} from '#core';\nimport {generateEntityId} from 'src/utils/entity-id';\n\nimport {YfmHtmlBlockConsts, defaultYfmHtmlBlockEntityId} from './const';\n\nexport {yfmHtmlBlockNodeName, YfmHtmlBlockConsts} from './const';\n\nexport interface YfmHtmlBlockSpecsOptions\n extends Omit<PluginOptions, 'runtimeJsPath' | 'containerClasses' | 'bundle' | 'embeddingMode'> {\n nodeView?: ExtensionNodeSpec['view'];\n}\n\nconst YfmHtmlBlockSpecsExtension: ExtensionAuto<YfmHtmlBlockSpecsOptions> = (\n builder,\n {nodeView, ...options},\n) => {\n builder\n .configureMd((md) =>\n md.use(\n transform({\n bundle: false,\n embeddingMode: 'srcdoc',\n ...options,\n }),\n {},\n ),\n )\n .addNode(YfmHtmlBlockConsts.NodeName, () => ({\n fromMd: {\n tokenSpec: {\n name: YfmHtmlBlockConsts.NodeName,\n type: 'node',\n noCloseToken: true,\n getAttrs: ({content}) => ({\n [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: content,\n [YfmHtmlBlockConsts.NodeAttrs.EntityId]: generateEntityId(\n YfmHtmlBlockConsts.NodeName,\n ),\n }),\n },\n },\n spec: {\n group: 'block',\n attrs: {\n [YfmHtmlBlockConsts.NodeAttrs.class]: {default: 'yfm-html'},\n [YfmHtmlBlockConsts.NodeAttrs.frameborder]: {default: ''},\n [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: {default: ''},\n [YfmHtmlBlockConsts.NodeAttrs.style]: {default: null},\n [YfmHtmlBlockConsts.NodeAttrs.newCreated]: {default: null},\n [YfmHtmlBlockConsts.NodeAttrs.EntityId]: {default: defaultYfmHtmlBlockEntityId},\n },\n toDOM: (node) => ['iframe', node.attrs],\n },\n toMd: (state, node) => {\n state.write('::: html');\n state.write('\\n');\n state.write(node.attrs[YfmHtmlBlockConsts.NodeAttrs.srcdoc]);\n state.ensureNewLine();\n state.write(':::');\n state.closeBlock(node);\n },\n view: nodeView,\n }));\n};\n\nexport const YfmHtmlBlockSpecs = Object.assign(YfmHtmlBlockSpecsExtension, YfmHtmlBlockConsts);\n"]}
|
|
@@ -1,16 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.addYfmHtmlBlock = void 0;
|
|
4
|
+
const SharedState_1 = require("../../behavior/SharedState/index.js");
|
|
5
|
+
const entity_id_1 = require("../../../utils/entity-id.js");
|
|
4
6
|
const const_1 = require("./YfmHtmlBlockSpecs/const.js");
|
|
5
7
|
exports.addYfmHtmlBlock = {
|
|
6
8
|
isEnable(state) {
|
|
7
9
|
return state.selection.empty;
|
|
8
10
|
},
|
|
9
11
|
run(state, dispatch, _view) {
|
|
10
|
-
|
|
12
|
+
const entityId = (0, entity_id_1.generateEntityId)(const_1.YfmHtmlBlockConsts.NodeName);
|
|
13
|
+
const sharedKey = SharedState_1.SharedStateKey.define({ name: entityId });
|
|
14
|
+
const tr = state.tr.insert(state.selection.from, (0, const_1.yfmHtmlBlockNodeType)(state.schema).create({
|
|
11
15
|
[const_1.YfmHtmlBlockConsts.NodeAttrs.srcdoc]: '\n',
|
|
12
16
|
[const_1.YfmHtmlBlockConsts.NodeAttrs.newCreated]: true,
|
|
13
|
-
|
|
17
|
+
[const_1.YfmHtmlBlockConsts.NodeAttrs.EntityId]: entityId,
|
|
18
|
+
}));
|
|
19
|
+
sharedKey.appendTransaction.set(tr, { editing: true });
|
|
20
|
+
dispatch(tr);
|
|
14
21
|
},
|
|
15
22
|
};
|
|
16
23
|
//# sourceMappingURL=actions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.js","sourceRoot":"../../../../../src","sources":["extensions/additional/YfmHtmlBlock/actions.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"actions.js","sourceRoot":"../../../../../src","sources":["extensions/additional/YfmHtmlBlock/actions.ts"],"names":[],"mappings":";;;AACA,qEAAmE;AACnE,2DAAqD;AAErD,wDAAmF;AAGtE,QAAA,eAAe,GAAe;IACvC,QAAQ,CAAC,KAAK;QACV,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC;IACjC,CAAC;IACD,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK;QACtB,MAAM,QAAQ,GAAG,IAAA,4BAAgB,EAAC,0BAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,4BAAc,CAAC,MAAM,CAAgC,EAAC,IAAI,EAAE,QAAQ,EAAC,CAAC,CAAC;QAEzF,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC,MAAM,CACtB,KAAK,CAAC,SAAS,CAAC,IAAI,EACpB,IAAA,4BAAoB,EAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;YACtC,CAAC,0BAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,IAAI;YAC3C,CAAC,0BAAkB,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,IAAI;YAC/C,CAAC,0BAAkB,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ;SACpD,CAAC,CACL,CAAC;QAEF,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAC,OAAO,EAAE,IAAI,EAAC,CAAC,CAAC;QAErD,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;CACJ,CAAC","sourcesContent":["import type {ActionSpec} from '#core';\nimport {SharedStateKey} from 'src/extensions/behavior/SharedState';\nimport {generateEntityId} from 'src/utils/entity-id';\n\nimport {YfmHtmlBlockConsts, yfmHtmlBlockNodeType} from './YfmHtmlBlockSpecs/const';\nimport type {YfmHtmlBlockEntitySharedState} from './types';\n\nexport const addYfmHtmlBlock: ActionSpec = {\n isEnable(state) {\n return state.selection.empty;\n },\n run(state, dispatch, _view) {\n const entityId = generateEntityId(YfmHtmlBlockConsts.NodeName);\n const sharedKey = SharedStateKey.define<YfmHtmlBlockEntitySharedState>({name: entityId});\n\n const tr = state.tr.insert(\n state.selection.from,\n yfmHtmlBlockNodeType(state.schema).create({\n [YfmHtmlBlockConsts.NodeAttrs.srcdoc]: '\\n',\n [YfmHtmlBlockConsts.NodeAttrs.newCreated]: true,\n [YfmHtmlBlockConsts.NodeAttrs.EntityId]: entityId,\n }),\n );\n\n sharedKey.appendTransaction.set(tr, {editing: true});\n\n dispatch(tr);\n },\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["extensions/additional/YfmHtmlBlock/types.ts"],"names":[],"mappings":"","sourcesContent":["export type YfmHtmlBlockEntitySharedState = {\n editing: boolean;\n};\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { ExtensionAuto, ExtensionDeps } from "../../../core/index.js";
|
|
2
2
|
import type { AutocompleteItem } from "./types.js";
|
|
3
3
|
export { openAutocomplete, closeAutocomplete } from 'prosemirror-autocomplete';
|
|
4
|
+
export { getAutocompleteState } from "./utils.js";
|
|
4
5
|
export declare const AutocompleteDecoClassName = "autocomplete";
|
|
5
6
|
export type AutocompleteItemFn = (deps: ExtensionDeps) => AutocompleteItem;
|
|
6
7
|
export * from "./types.js";
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Autocomplete = exports.AutocompleteDecoClassName = exports.closeAutocomplete = exports.openAutocomplete = void 0;
|
|
3
|
+
exports.Autocomplete = exports.AutocompleteDecoClassName = exports.getAutocompleteState = exports.closeAutocomplete = exports.openAutocomplete = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
-
const prosemirror_autocomplete_1 =
|
|
5
|
+
const prosemirror_autocomplete_1 = require("prosemirror-autocomplete");
|
|
6
6
|
const prosemirror_state_1 = require("prosemirror-state");
|
|
7
7
|
const lodash_1 = require("../../../lodash.js");
|
|
8
8
|
const handler_1 = require("./handler.js");
|
|
9
9
|
var prosemirror_autocomplete_2 = require("prosemirror-autocomplete");
|
|
10
10
|
Object.defineProperty(exports, "openAutocomplete", { enumerable: true, get: function () { return prosemirror_autocomplete_2.openAutocomplete; } });
|
|
11
11
|
Object.defineProperty(exports, "closeAutocomplete", { enumerable: true, get: function () { return prosemirror_autocomplete_2.closeAutocomplete; } });
|
|
12
|
+
var utils_1 = require("./utils.js");
|
|
13
|
+
Object.defineProperty(exports, "getAutocompleteState", { enumerable: true, get: function () { return utils_1.getAutocompleteState; } });
|
|
12
14
|
exports.AutocompleteDecoClassName = 'autocomplete';
|
|
13
15
|
tslib_1.__exportStar(require("./types.js"), exports);
|
|
14
16
|
/**
|
|
@@ -30,7 +32,7 @@ const Autocomplete = (builder) => {
|
|
|
30
32
|
config.push(item);
|
|
31
33
|
}
|
|
32
34
|
const handler = new handler_1.MainHandler(config, builder.logger);
|
|
33
|
-
const plugins = (0, prosemirror_autocomplete_1.
|
|
35
|
+
const plugins = (0, prosemirror_autocomplete_1.autocomplete)({
|
|
34
36
|
triggers,
|
|
35
37
|
onOpen: handler.onOpen.bind(handler),
|
|
36
38
|
onClose: handler.onClose.bind(handler),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/index.ts"],"names":[],"mappings":";;;;AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/index.ts"],"names":[],"mappings":";;;;AAAA,uEAAsD;AACtD,yDAAyC;AAGzC,+CAA2C;AAE3C,0CAAsC;AAGtC,qEAA6E;AAArE,4HAAA,gBAAgB,OAAA;AAAE,6HAAA,iBAAiB,OAAA;AAC3C,oCAA6C;AAArC,6GAAA,oBAAoB,OAAA;AACf,QAAA,yBAAyB,GAAG,cAAc,CAAC;AAGxD,qDAAwB;AAMxB;;;;;;GAMG;AACI,MAAM,YAAY,GAAkB,CAAC,OAAO,EAAE,EAAE;IACnD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyC,CAAC;IACjE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IAE7C,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,EAAE;QACvB,MAAM,QAAQ,GAA0B,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAuB,EAAE,CAAC;QACtC,KAAK,MAAM,QAAQ,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAqB,IAAA,mBAAU,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAChF,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,qBAAW,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,IAAA,uCAAY,EAAC;YACzB,QAAQ;YACR,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;YACpC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;YACxC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;SACzC,CAAC,CAAC;QAEH;;;WAGG;QACH,OAAO,OAAO,CAAC,MAAM,CACjB,IAAI,0BAAM,CAAC;YACP,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;gBACT,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE;aACrC,CAAC;SACL,CAAC,CACL,CAAC;IACN,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC,CAAC;AAnCW,QAAA,YAAY,gBAmCvB","sourcesContent":["import {autocomplete} from 'prosemirror-autocomplete';\nimport {Plugin} from 'prosemirror-state';\n\nimport type {ExtensionAuto, ExtensionDeps} from '../../../core';\nimport {isFunction} from '../../../lodash';\n\nimport {MainHandler} from './handler';\nimport type {AutocompleteItem, AutocompleteTrigger} from './types';\n\nexport {openAutocomplete, closeAutocomplete} from 'prosemirror-autocomplete';\nexport {getAutocompleteState} from './utils';\nexport const AutocompleteDecoClassName = 'autocomplete';\n\nexport type AutocompleteItemFn = (deps: ExtensionDeps) => AutocompleteItem;\nexport * from './types';\n\ntype Storage = {\n add(item: AutocompleteItem | AutocompleteItemFn): Storage;\n};\n\n/**\n * This extension is wrapper of _prosemirror-autocomplete_\n * You only need to use it once.\n * Don't add this extension many times with different options.\n * Don't import anything from the _prosemirror-autocomplete_ source package.\n * Everything you need is exported from this module.\n */\nexport const Autocomplete: ExtensionAuto = (builder) => {\n const storage = new Set<AutocompleteItem | AutocompleteItemFn>();\n builder.context.set('autocomplete', storage);\n\n builder.addPlugin((deps) => {\n const triggers: AutocompleteTrigger[] = [];\n const config: AutocompleteItem[] = [];\n for (const itemOrFn of storage) {\n const item: AutocompleteItem = isFunction(itemOrFn) ? itemOrFn(deps) : itemOrFn;\n triggers.push(item.trigger);\n config.push(item);\n }\n\n const handler = new MainHandler(config, builder.logger);\n const plugins = autocomplete({\n triggers,\n onOpen: handler.onOpen.bind(handler),\n onClose: handler.onClose.bind(handler),\n onFilter: handler.onFilter.bind(handler),\n onArrow: handler.onArrow.bind(handler),\n onEnter: handler.onEnter.bind(handler),\n });\n\n /**\n * BugFix: because _prosemirror-autocomplete_ does not handle the destruction of the view,\n * we have to handle it ourselves\n */\n return plugins.concat(\n new Plugin({\n view: () => ({\n destroy: () => handler.onDestroy(),\n }),\n }),\n );\n }, builder.Priority.VeryHigh);\n};\n\ndeclare global {\n namespace WysiwygEditor {\n interface Context {\n autocomplete: Storage;\n }\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Options, Trigger } from 'prosemirror-autocomplete';
|
|
2
|
-
export type { FromTo, AutocompleteAction, Trigger as AutocompleteTrigger, } from 'prosemirror-autocomplete';
|
|
2
|
+
export type { FromTo, AutocompleteAction, AutocompleteState, Trigger as AutocompleteTrigger, } from 'prosemirror-autocomplete';
|
|
3
3
|
export { ActionKind as AutocompleteActionKind } from 'prosemirror-autocomplete';
|
|
4
4
|
export interface AutocompleteHandler extends Pick<Options, 'onArrow' | 'onClose' | 'onEnter' | 'onFilter' | 'onOpen'> {
|
|
5
5
|
onDestroy?: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/types.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/types.ts"],"names":[],"mappings":";;;AASA,qEAA8E;AAAtE,kIAAA,UAAU,OAA0B","sourcesContent":["import type {Options, Trigger} from 'prosemirror-autocomplete';\n\nexport type {\n FromTo,\n AutocompleteAction,\n AutocompleteState,\n Trigger as AutocompleteTrigger,\n} from 'prosemirror-autocomplete';\n\nexport {ActionKind as AutocompleteActionKind} from 'prosemirror-autocomplete';\n\nexport interface AutocompleteHandler\n extends Pick<Options, 'onArrow' | 'onClose' | 'onEnter' | 'onFilter' | 'onOpen'> {\n onDestroy?: () => void;\n}\n\nexport type AutocompleteItem = {trigger: Trigger; handler: AutocompleteHandler};\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getAutocompleteState = getAutocompleteState;
|
|
4
|
+
const prosemirror_autocomplete_1 = require("prosemirror-autocomplete");
|
|
5
|
+
function getAutocompleteState(state) {
|
|
6
|
+
return prosemirror_autocomplete_1.pluginKey.getState(state) || null;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Autocomplete/utils.ts"],"names":[],"mappings":";;AAMA,oDAEC;AARD,uEAAmD;AAMnD,SAAgB,oBAAoB,CAAC,KAAkB;IACnD,OAAO,oCAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC;AAC7C,CAAC","sourcesContent":["import {pluginKey} from 'prosemirror-autocomplete';\n\nimport type {EditorState} from '#pm/state';\n\nimport type {AutocompleteState} from './types';\n\nexport function getAutocompleteState(state: EditorState): AutocompleteState | null {\n return pluginKey.getState(state) || null;\n}\n"]}
|
|
@@ -1,4 +1,10 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type EditorState, Plugin } from "../../../pm/state.js";
|
|
2
2
|
export declare function isInsideCode(state: EditorState): false | 'block' | 'inline';
|
|
3
3
|
export declare function isInsideBlockCode(state: EditorState): boolean;
|
|
4
4
|
export declare function isInsideInlineCode(state: EditorState): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* This plugin handles paste into any type of code: code block or code mark.
|
|
7
|
+
* If selection is inside code, it always prevents execution of all next paste handlers.
|
|
8
|
+
* It takes a value from following clipboard data types: uri-list, files or text data.
|
|
9
|
+
*/
|
|
10
|
+
export declare const handlePasteIntoCodePlugin: () => Plugin<any>;
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.handlePasteIntoCodePlugin = void 0;
|
|
3
4
|
exports.isInsideCode = isInsideCode;
|
|
4
5
|
exports.isInsideBlockCode = isInsideBlockCode;
|
|
5
6
|
exports.isInsideInlineCode = isInsideInlineCode;
|
|
7
|
+
const tslib_1 = require("tslib");
|
|
8
|
+
const ts_dedent_1 = tslib_1.__importDefault(require("ts-dedent"));
|
|
9
|
+
const _core_1 = require("../../../core/index.js");
|
|
10
|
+
const state_1 = require("../../../pm/state.js");
|
|
11
|
+
const utils_1 = require("./utils.js");
|
|
6
12
|
const isCodeMark = (mark) => mark.type.spec.code;
|
|
7
13
|
function isInsideCode(state) {
|
|
8
14
|
if (isInsideBlockCode(state))
|
|
@@ -24,4 +30,58 @@ function isInsideInlineCode(state) {
|
|
|
24
30
|
}
|
|
25
31
|
return fromHasCodeMark;
|
|
26
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* This plugin handles paste into any type of code: code block or code mark.
|
|
35
|
+
* If selection is inside code, it always prevents execution of all next paste handlers.
|
|
36
|
+
* It takes a value from following clipboard data types: uri-list, files or text data.
|
|
37
|
+
*/
|
|
38
|
+
const handlePasteIntoCodePlugin = () => {
|
|
39
|
+
return new state_1.Plugin({
|
|
40
|
+
props: {
|
|
41
|
+
handleDOMEvents: {
|
|
42
|
+
paste(view, event) {
|
|
43
|
+
if (!event.clipboardData)
|
|
44
|
+
return false;
|
|
45
|
+
const { clipboardData } = event;
|
|
46
|
+
const codeType = isInsideCode(view.state);
|
|
47
|
+
if (!codeType)
|
|
48
|
+
return false;
|
|
49
|
+
let text;
|
|
50
|
+
let dataFormat;
|
|
51
|
+
if ((0, utils_1.isIosSafariShare)(clipboardData)) {
|
|
52
|
+
dataFormat = utils_1.DataTransferType.UriList;
|
|
53
|
+
text = clipboardData.getData(utils_1.DataTransferType.UriList);
|
|
54
|
+
}
|
|
55
|
+
else if ((0, utils_1.isFilesOnly)(clipboardData)) {
|
|
56
|
+
dataFormat = utils_1.DataTransferType.Files;
|
|
57
|
+
text = Array.from(clipboardData.files)
|
|
58
|
+
.map((file) => file.name)
|
|
59
|
+
.join(' ');
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
dataFormat = utils_1.DataTransferType.Text;
|
|
63
|
+
text = (0, ts_dedent_1.default)(clipboardData.getData(utils_1.DataTransferType.Text));
|
|
64
|
+
}
|
|
65
|
+
if (codeType === 'inline') {
|
|
66
|
+
text = text.replaceAll('\n', '↵');
|
|
67
|
+
}
|
|
68
|
+
const { state, dispatch } = view;
|
|
69
|
+
(0, _core_1.getLoggerFromState)(state).event({
|
|
70
|
+
codeType,
|
|
71
|
+
dataFormat,
|
|
72
|
+
domEvent: 'paste',
|
|
73
|
+
event: 'paste-into-code',
|
|
74
|
+
dataTypes: clipboardData.types,
|
|
75
|
+
});
|
|
76
|
+
event.preventDefault();
|
|
77
|
+
dispatch(state.tr
|
|
78
|
+
.replaceSelectionWith(state.schema.text(text), true)
|
|
79
|
+
.scrollIntoView());
|
|
80
|
+
return true;
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
exports.handlePasteIntoCodePlugin = handlePasteIntoCodePlugin;
|
|
27
87
|
//# sourceMappingURL=code.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/code.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"code.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/code.ts"],"names":[],"mappings":"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","sourcesContent":["import dd from 'ts-dedent';\n\nimport {getLoggerFromState} from '#core';\nimport type {Mark} from '#pm/model';\nimport {type EditorState, Plugin} from '#pm/state';\n\nimport {DataTransferType, isFilesOnly, isIosSafariShare} from './utils';\n\nconst isCodeMark = (mark: Mark) => mark.type.spec.code;\n\nexport function isInsideCode(state: EditorState): false | 'block' | 'inline' {\n if (isInsideBlockCode(state)) return 'block';\n if (isInsideInlineCode(state)) return 'inline';\n return false;\n}\n\nexport function isInsideBlockCode(state: EditorState): boolean {\n // it is enough to check only $from\n // when pasting, the content is inserted into a block with the type from $from\n return Boolean(state.selection.$from.parent.type.spec.code);\n}\n\nexport function isInsideInlineCode(state: EditorState): boolean {\n // same as for block code\n const fromHasCodeMark = state.selection.$from.marks().some(isCodeMark);\n if (state.selection.empty) {\n return fromHasCodeMark || (state.storedMarks ?? []).some(isCodeMark);\n }\n return fromHasCodeMark;\n}\n\n/**\n * This plugin handles paste into any type of code: code block or code mark.\n * If selection is inside code, it always prevents execution of all next paste handlers.\n * It takes a value from following clipboard data types: uri-list, files or text data.\n */\nexport const handlePasteIntoCodePlugin = () => {\n return new Plugin({\n props: {\n handleDOMEvents: {\n paste(view, event) {\n if (!event.clipboardData) return false;\n const {clipboardData} = event;\n\n const codeType = isInsideCode(view.state);\n if (!codeType) return false;\n\n let text: string;\n let dataFormat: string;\n\n if (isIosSafariShare(clipboardData)) {\n dataFormat = DataTransferType.UriList;\n text = clipboardData.getData(DataTransferType.UriList);\n } else if (isFilesOnly(clipboardData)) {\n dataFormat = DataTransferType.Files;\n text = Array.from(clipboardData.files)\n .map((file) => file.name)\n .join(' ');\n } else {\n dataFormat = DataTransferType.Text;\n text = dd(clipboardData.getData(DataTransferType.Text));\n }\n\n if (codeType === 'inline') {\n text = text.replaceAll('\\n', '↵');\n }\n\n const {state, dispatch} = view;\n\n getLoggerFromState(state).event({\n codeType,\n dataFormat,\n domEvent: 'paste',\n event: 'paste-into-code',\n dataTypes: clipboardData.types,\n });\n\n event.preventDefault();\n dispatch(\n state.tr\n .replaceSelectionWith(state.schema.text(text), true)\n .scrollIntoView(),\n );\n\n return true;\n },\n },\n },\n });\n};\n"]}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Clipboard = exports.clipboardUtils = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
5
|
const clipboard_1 = require("./clipboard.js");
|
|
6
|
+
const code_1 = require("./code.js");
|
|
6
7
|
const clipboardUtils = tslib_1.__importStar(require("./utils.js"));
|
|
7
8
|
exports.clipboardUtils = clipboardUtils;
|
|
8
9
|
const Clipboard = (builder, opts) => {
|
|
@@ -16,6 +17,7 @@ const Clipboard = (builder, opts) => {
|
|
|
16
17
|
serializer: deps.serializer,
|
|
17
18
|
pasteFileHandler: opts.pasteFileHandler,
|
|
18
19
|
}), builder.Priority.VeryLow);
|
|
20
|
+
builder.addPlugin(code_1.handlePasteIntoCodePlugin, builder.Priority.Highest);
|
|
19
21
|
};
|
|
20
22
|
exports.Clipboard = Clipboard;
|
|
21
23
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/index.ts"],"names":[],"mappings":";;;;AAEA,8CAAmE;AACnE,mEAA0C;AAElC,wCAAc;AAIf,MAAM,SAAS,GAAoC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACxE,OAAO,CAAC,SAAS,CACb,CAAC,IAAI,EAAE,EAAE,CACL,IAAA,qBAAS,EAAC;QACN,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YAC1B,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,WAAW;SACtB,CAAC;QACF,QAAQ,EAAE,IAAI,CAAC,YAAY;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KAC1C,CAAC,EACN,OAAO,CAAC,QAAQ,CAAC,OAAO,CAC3B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../../../src","sources":["extensions/behavior/Clipboard/index.ts"],"names":[],"mappings":";;;;AAEA,8CAAmE;AACnE,oCAAiD;AACjD,mEAA0C;AAElC,wCAAc;AAIf,MAAM,SAAS,GAAoC,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE;IACxE,OAAO,CAAC,SAAS,CACb,CAAC,IAAI,EAAE,EAAE,CACL,IAAA,qBAAS,EAAC;QACN,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;YAC1B,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,WAAW;SACtB,CAAC;QACF,QAAQ,EAAE,IAAI,CAAC,YAAY;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KAC1C,CAAC,EACN,OAAO,CAAC,QAAQ,CAAC,OAAO,CAC3B,CAAC;IAEF,OAAO,CAAC,SAAS,CAAC,gCAAyB,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3E,CAAC,CAAC;AAjBW,QAAA,SAAS,aAiBpB","sourcesContent":["import type {ExtensionAuto} from '#core';\n\nimport {type ClipboardPluginOptions, clipboard} from './clipboard';\nimport {handlePasteIntoCodePlugin} from './code';\nimport * as clipboardUtils from './utils';\n\nexport {clipboardUtils};\n\nexport type ClipboardOptions = Pick<ClipboardPluginOptions, 'pasteFileHandler'>;\n\nexport const Clipboard: ExtensionAuto<ClipboardOptions> = (builder, opts) => {\n builder.addPlugin(\n (deps) =>\n clipboard({\n logger: builder.logger.nested({\n module: 'clipboard',\n plugin: 'clipboard',\n }),\n mdParser: deps.markupParser,\n textParser: deps.textParser,\n serializer: deps.serializer,\n pasteFileHandler: opts.pasteFileHandler,\n }),\n builder.Priority.VeryLow,\n );\n\n builder.addPlugin(handlePasteIntoCodePlugin, builder.Priority.Highest);\n};\n"]}
|
|
@@ -17,7 +17,6 @@ class CommandHandler {
|
|
|
17
17
|
#filteredActionsCarousel;
|
|
18
18
|
#view;
|
|
19
19
|
#anchor = null;
|
|
20
|
-
#range;
|
|
21
20
|
#filterText;
|
|
22
21
|
#popupCloser;
|
|
23
22
|
#menuProps;
|
|
@@ -104,13 +103,16 @@ class CommandHandler {
|
|
|
104
103
|
return (parentType.spec.commandMenu === false || this.#nodesIgnoreList.includes(parentType.name));
|
|
105
104
|
}
|
|
106
105
|
select() {
|
|
107
|
-
if (!this.#view
|
|
106
|
+
if (!this.#view)
|
|
108
107
|
return;
|
|
109
108
|
const action = this.#filteredActionsCarousel?.currentItem;
|
|
110
109
|
if (!action)
|
|
111
110
|
return;
|
|
111
|
+
const autocompleteState = (0, Autocomplete_1.getAutocompleteState)(this.#view.state);
|
|
112
|
+
if (!autocompleteState || !autocompleteState.active)
|
|
113
|
+
return;
|
|
112
114
|
const view = this.#view;
|
|
113
|
-
const range =
|
|
115
|
+
const { range } = autocompleteState;
|
|
114
116
|
view.dispatch(view.state.tr.deleteRange(range.from, range.to).scrollIntoView());
|
|
115
117
|
action.exec(this.#actionStorage);
|
|
116
118
|
view.focus();
|
|
@@ -156,13 +158,11 @@ class CommandHandler {
|
|
|
156
158
|
}
|
|
157
159
|
this.#view?.focus();
|
|
158
160
|
};
|
|
159
|
-
updateState({ view
|
|
161
|
+
updateState({ view }) {
|
|
160
162
|
this.#view = view;
|
|
161
|
-
this.#range = range;
|
|
162
163
|
}
|
|
163
164
|
clear() {
|
|
164
165
|
this.#view = undefined;
|
|
165
|
-
this.#range = undefined;
|
|
166
166
|
this.#anchor = null;
|
|
167
167
|
this.#filterText = undefined;
|
|
168
168
|
this.#filteredActionsCarousel = undefined;
|