@limetech/lime-elements 38.13.1 → 38.13.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/CHANGELOG.md +9 -0
- package/dist/cjs/limel-markdown.cjs.entry.js +1 -1
- package/dist/cjs/limel-prosemirror-adapter.cjs.entry.js +169 -62
- package/dist/cjs/limel-prosemirror-adapter.cjs.entry.js.map +1 -1
- package/dist/cjs/{markdown-parser-564adb69.js → markdown-parser-563c73db.js} +144 -386
- package/dist/cjs/{markdown-parser-564adb69.js.map → markdown-parser-563c73db.js.map} +1 -1
- package/dist/collection/components/markdown/link-markdown-plugin.js +30 -0
- package/dist/collection/components/markdown/link-markdown-plugin.js.map +1 -0
- package/dist/collection/components/markdown/markdown-parser.js +4 -4
- package/dist/collection/components/markdown/markdown-parser.js.map +1 -1
- package/dist/collection/components/text-editor/prosemirror-adapter/menu/menu-commands.js +3 -42
- package/dist/collection/components/text-editor/prosemirror-adapter/menu/menu-commands.js.map +1 -1
- package/dist/collection/components/text-editor/prosemirror-adapter/plugins/link/link-mark-spec.js +33 -0
- package/dist/collection/components/text-editor/prosemirror-adapter/plugins/link/link-mark-spec.js.map +1 -0
- package/dist/collection/components/text-editor/prosemirror-adapter/plugins/{link-plugin.js → link/link-plugin.js} +135 -22
- package/dist/collection/components/text-editor/prosemirror-adapter/plugins/link/link-plugin.js.map +1 -0
- package/dist/collection/components/text-editor/prosemirror-adapter/plugins/link/utils.js +39 -0
- package/dist/collection/components/text-editor/prosemirror-adapter/plugins/link/utils.js.map +1 -0
- package/dist/collection/components/text-editor/prosemirror-adapter/prosemirror-adapter.js +3 -1
- package/dist/collection/components/text-editor/prosemirror-adapter/prosemirror-adapter.js.map +1 -1
- package/dist/esm/limel-markdown.entry.js +1 -1
- package/dist/esm/limel-prosemirror-adapter.entry.js +169 -62
- package/dist/esm/limel-prosemirror-adapter.entry.js.map +1 -1
- package/dist/esm/{markdown-parser-1c1fdedc.js → markdown-parser-41d15994.js} +144 -387
- package/dist/esm/markdown-parser-41d15994.js.map +1 -0
- package/dist/lime-elements/lime-elements.esm.js +1 -1
- package/dist/lime-elements/p-6b5d588e.entry.js +2 -0
- package/dist/lime-elements/p-6b5d588e.entry.js.map +1 -0
- package/dist/lime-elements/{p-ce152b39.entry.js → p-895ae176.entry.js} +2 -2
- package/dist/lime-elements/p-95a71e89.js +8 -0
- package/dist/lime-elements/p-95a71e89.js.map +1 -0
- package/dist/types/components/markdown/link-markdown-plugin.d.ts +9 -0
- package/dist/types/components/text-editor/prosemirror-adapter/menu/menu-commands.d.ts +0 -2
- package/dist/types/components/text-editor/prosemirror-adapter/plugins/link/link-mark-spec.d.ts +10 -0
- package/dist/types/components/text-editor/prosemirror-adapter/plugins/link/utils.d.ts +3 -0
- package/package.json +1 -2
- package/dist/collection/components/text-editor/prosemirror-adapter/plugins/link-plugin.js.map +0 -1
- package/dist/esm/markdown-parser-1c1fdedc.js.map +0 -1
- package/dist/lime-elements/p-cf87519f.js +0 -8
- package/dist/lime-elements/p-cf87519f.js.map +0 -1
- package/dist/lime-elements/p-d5ac8f59.entry.js +0 -2
- package/dist/lime-elements/p-d5ac8f59.entry.js.map +0 -1
- /package/dist/lime-elements/{p-ce152b39.entry.js.map → p-895ae176.entry.js.map} +0 -0
- /package/dist/types/components/text-editor/prosemirror-adapter/plugins/{link-plugin.d.ts → link/link-plugin.d.ts} +0 -0
|
@@ -16,7 +16,8 @@ import { createRandomString } from '../../../util/random-string';
|
|
|
16
16
|
import { isItem } from '../../../components/action-bar/isItem';
|
|
17
17
|
import { cloneDeep, debounce } from 'lodash-es';
|
|
18
18
|
import { strikethrough } from './menu/menu-schema-extender';
|
|
19
|
-
import { createLinkPlugin } from './plugins/link-plugin';
|
|
19
|
+
import { createLinkPlugin } from './plugins/link/link-plugin';
|
|
20
|
+
import { linkMarkSpec } from './plugins/link/link-mark-spec';
|
|
20
21
|
import { createImageInserterPlugin } from './plugins/image/inserter';
|
|
21
22
|
import { createImageViewPlugin } from './plugins/image/view';
|
|
22
23
|
import { createMenuStateTrackingPlugin } from './plugins/menu-state-tracking-plugin';
|
|
@@ -273,6 +274,7 @@ export class ProsemirrorAdapter {
|
|
|
273
274
|
nodes: nodes,
|
|
274
275
|
marks: schema.spec.marks.append({
|
|
275
276
|
strikethrough: strikethrough,
|
|
277
|
+
link: linkMarkSpec,
|
|
276
278
|
}),
|
|
277
279
|
});
|
|
278
280
|
}
|
package/dist/collection/components/text-editor/prosemirror-adapter/prosemirror-adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prosemirror-adapter.js","sourceRoot":"","sources":["../../../../src/components/text-editor/prosemirror-adapter/prosemirror-adapter.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n Host,\n Prop,\n State,\n Watch,\n h,\n} from '@stencil/core';\nimport { EditorState, Transaction, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { Schema, DOMParser } from 'prosemirror-model';\nimport { schema } from 'prosemirror-schema-basic';\nimport { addListNodes } from 'prosemirror-schema-list';\nimport { exampleSetup } from 'prosemirror-example-setup';\nimport { keymap } from 'prosemirror-keymap';\nimport { ActionBarItem } from '../../../components/action-bar/action-bar.types';\nimport { ListSeparator } from '../../../components/list/list-item.types';\nimport { MenuCommandFactory } from './menu/menu-commands';\nimport { menuTranslationIDs, getTextEditorMenuItems } from './menu/menu-items';\nimport { ContentTypeConverter } from '../utils/content-type-converter';\nimport { MarkdownConverter } from '../utils/markdown-converter';\nimport { HTMLConverter } from '../utils/html-converter';\nimport {\n EditorMenuTypes,\n EditorTextLink,\n editorMenuTypesArray,\n} from './menu/types';\nimport translate from '../../../global/translations';\nimport { createRandomString } from '../../../util/random-string';\nimport { isItem } from '../../../components/action-bar/isItem';\nimport { cloneDeep, debounce } from 'lodash-es';\nimport { Languages } from '../../date-picker/date.types';\nimport { strikethrough } from './menu/menu-schema-extender';\nimport { createLinkPlugin } from './plugins/link-plugin';\nimport { createImageInserterPlugin } from './plugins/image/inserter';\nimport { createImageViewPlugin } from './plugins/image/view';\nimport { createMenuStateTrackingPlugin } from './plugins/menu-state-tracking-plugin';\nimport { createActionBarInteractionPlugin } from './plugins/menu-action-interaction-plugin';\nimport { CustomElementDefinition } from '../../../global/shared-types/custom-element.types';\nimport { createNodeSpec } from '../utils/plugin-factory';\nimport { createTriggerPlugin } from './plugins/trigger/factory';\nimport {\n TriggerCharacter,\n ImageInserter,\n EditorImage,\n EditorMetadata,\n EditorLink,\n} from '../text-editor.types';\nimport { getTableNodes, getTableEditingPlugins } from './plugins/table-plugin';\nimport { getImageNode, imageCache } from './plugins/image/node';\nimport { EditorUiType } from '../types';\nimport {\n getMetadataFromDoc,\n hasMetadataChanged,\n} from '../utils/metadata-utils';\n\nconst DEBOUNCE_TIMEOUT = 300;\n\n/**\n * The ProseMirror adapter offers a rich text editing experience with markdown support.\n * [Read more...](https://prosemirror.net/)\n *\n * @exampleComponent limel-example-prosemirror-adapter-basic\n * @exampleComponent limel-example-prosemirror-adapter-with-custom-menu\n * @beta\n * @private\n */\n@Component({\n tag: 'limel-prosemirror-adapter',\n shadow: { delegatesFocus: true },\n styleUrl: 'prosemirror-adapter.scss',\n})\nexport class ProsemirrorAdapter {\n /**\n * The type of content that the editor should handle and emit, defaults to `markdown`\n *\n * Assumed to be set only once, so not reactive to changes\n */\n @Prop()\n public contentType: 'markdown' | 'html' = 'markdown';\n\n /**\n * The value of the editor, expected to be markdown\n */\n @Prop()\n public value: string;\n\n /**\n * Defines the language for translations.\n */\n @Prop({ reflect: true })\n public language: Languages;\n\n /**\n * Set to `true` to disable the field.\n * Use `disabled` to indicate that the field can normally be interacted\n * with, but is currently disabled. This tells the user that if certain\n * requirements are met, the field may become enabled again.\n */\n @Prop({ reflect: true })\n public disabled?: boolean = false;\n\n /**\n * set to private to avoid usage while under development\n *\n * @private\n * @alpha\n */\n @Prop()\n customElements: CustomElementDefinition[] = [];\n\n /**\n * set to private to avoid usage while under development\n *\n * @private\n * @alpha\n */\n @Prop()\n triggerCharacters: TriggerCharacter[] = [];\n\n /**\n * Specifies the visual appearance of the editor.\n */\n @Prop()\n public ui: EditorUiType = 'standard';\n\n @Element()\n private host: HTMLLimelTextEditorElement;\n\n private portalId: string;\n\n @State()\n private view: EditorView;\n\n @State()\n private actionBarItems: Array<\n ActionBarItem<EditorMenuTypes> | ListSeparator\n > = [];\n\n @State()\n private link: EditorTextLink = { href: 'https://' };\n\n /**\n * Open state of the dialog\n */\n @State()\n public isLinkMenuOpen: boolean = false;\n\n private menuCommandFactory: MenuCommandFactory;\n private schema: Schema;\n private contentConverter: ContentTypeConverter;\n private actionBarElement: HTMLElement;\n private lastEmittedValue: string;\n private changeWaiting = false;\n private transactionFired = false;\n private lastClickedPos: number | null = null;\n private metadata: EditorMetadata = { images: [], links: [] };\n\n /**\n * Used to stop change event emitting as result of getting updated value from consumer\n */\n private suppressChangeEvent = false;\n\n /**\n * Dispatched when a change is made to the editor\n */\n @Event()\n private change: EventEmitter<string>;\n\n /**\n * Dispatched when a image is pasted into the editor\n *\n * @private\n * @alpha\n */\n @Event()\n private imagePasted: EventEmitter<ImageInserter>;\n\n /**\n * Dispatched when a image is removed from the editor\n *\n * @private\n * @alpha\n */\n @Event()\n private imageRemoved: EventEmitter<EditorImage>;\n\n /**\n * Dispatched when the metadata of the editor changes (images and links)\n *\n * @private\n * @alpha\n */\n @Event()\n private metadataChange: EventEmitter<EditorMetadata>;\n\n constructor() {\n this.portalId = createRandomString();\n }\n\n @Watch('value')\n protected watchValue(newValue: string) {\n if (!this.view) {\n return;\n }\n\n if (this.changeWaiting) {\n // A change is pending; do not update the editor's content\n return;\n }\n\n const currentContent = this.contentConverter.serialize(\n this.view,\n this.schema,\n );\n\n // If the new value is the same as the current content, do nothing\n if (newValue === currentContent) {\n return;\n }\n\n // Update the editor's content with the new value\n this.updateView(newValue);\n }\n\n public componentWillLoad() {\n this.getActionBarItems();\n this.setupContentConverter();\n }\n\n public componentDidLoad() {\n // Stencil complains loudly about triggering rerenders in\n // componentDidLoad, but we have to, so we're using setTimeout to\n // suppress the warning. /Ads\n setTimeout(() => {\n this.initializeTextEditor();\n }, 0);\n }\n\n public connectedCallback() {\n if (this.view) {\n this.initializeTextEditor();\n }\n\n this.host.addEventListener(\n 'open-editor-link-menu',\n this.handleOpenLinkMenu,\n );\n }\n\n public disconnectedCallback() {\n imageCache.clear();\n\n this.host.removeEventListener(\n 'open-editor-link-menu',\n this.handleOpenLinkMenu,\n );\n this.view?.dom?.removeEventListener('blur', this.handleBlur);\n this.view?.dom?.removeEventListener('mousedown', this.handleMouseDown);\n this.view?.destroy();\n }\n\n public render() {\n return (\n <Host onFocus={this.handleFocus}>\n <div id=\"editor\" />\n {this.renderToolbar()}\n {this.renderLinkMenu()}\n </Host>\n );\n }\n\n renderToolbar() {\n if (!this.actionBarItems.length || this.ui === 'no-toolbar') {\n return;\n }\n\n return (\n <div class=\"toolbar\">\n <limel-action-bar\n ref={(el) => (this.actionBarElement = el)}\n accessibleLabel=\"Toolbar\"\n actions={this.actionBarItems}\n onItemSelected={this.handleActionBarItem}\n />\n </div>\n );\n }\n\n renderLinkMenu() {\n if (!this.isLinkMenuOpen) {\n return;\n }\n\n return (\n <limel-portal\n containerId={this.portalId}\n visible={this.isLinkMenuOpen}\n openDirection=\"top\"\n inheritParentWidth={true}\n anchor={this.actionBarElement}\n >\n <limel-text-editor-link-menu\n link={this.link}\n isOpen={this.isLinkMenuOpen}\n onLinkChange={this.handleLinkChange}\n onCancel={this.handleCancelLinkMenu}\n onSave={this.handleSaveLinkMenu}\n />\n </limel-portal>\n );\n }\n\n private setupContentConverter() {\n if (this.contentType === 'markdown') {\n this.contentConverter = new MarkdownConverter(\n this.customElements,\n this.language,\n );\n } else if (this.contentType === 'html') {\n this.contentConverter = new HTMLConverter(this.customElements);\n } else {\n throw new Error(\n `Unsupported content type: ${this.contentType}. Only 'markdown' and 'html' are supported.`,\n );\n }\n }\n\n private getActionBarItems = () => {\n this.actionBarItems = getTextEditorMenuItems().map(\n this.getTranslatedItem,\n );\n };\n\n private getTranslatedItem = (item) => {\n const newItem = cloneDeep(item);\n\n if (isItem(item)) {\n const translationId = menuTranslationIDs[item.value];\n\n if (translationId) {\n newItem.text = translate.get(translationId, this.language);\n }\n }\n\n return newItem;\n };\n\n private async initializeTextEditor() {\n this.schema = this.initializeSchema();\n const initialDoc = await this.parseInitialContent();\n this.menuCommandFactory = new MenuCommandFactory(this.schema);\n this.view = new EditorView(\n this.host.shadowRoot.querySelector('#editor'),\n {\n state: this.createEditorState(initialDoc),\n dispatchTransaction: this.handleTransaction,\n },\n );\n\n this.view.dom.addEventListener('blur', this.handleBlur);\n this.view.dom.addEventListener('mousedown', this.handleMouseDown);\n\n if (this.value) {\n this.updateView(this.value);\n }\n }\n\n private initializeSchema() {\n let nodes = schema.spec.nodes;\n\n this.customElements.forEach((customElement) => {\n const newNodeSpec = createNodeSpec(customElement);\n const nodeName = customElement.tagName;\n\n nodes = nodes.append({ [nodeName]: newNodeSpec });\n });\n nodes = addListNodes(nodes, 'paragraph block*', 'block');\n\n if (this.contentType === 'html') {\n nodes = nodes.append(getTableNodes());\n }\n\n nodes = nodes.append(getImageNode(this.language));\n\n return new Schema({\n nodes: nodes,\n marks: schema.spec.marks.append({\n strikethrough: strikethrough,\n }),\n });\n }\n\n private async parseInitialContent() {\n const initialContentElement = document.createElement('div');\n\n if (this.value) {\n initialContentElement.innerHTML =\n await this.contentConverter.parseAsHTML(\n this.value,\n this.schema,\n );\n } else {\n initialContentElement.innerHTML = '<p></p>';\n }\n\n return DOMParser.fromSchema(this.schema).parse(initialContentElement);\n }\n\n private createEditorState(initialDoc) {\n return EditorState.create({\n doc: initialDoc,\n plugins: [\n ...exampleSetup({ schema: this.schema, menuBar: false }),\n keymap(this.menuCommandFactory.buildKeymap()),\n createTriggerPlugin(\n this.triggerCharacters,\n this.contentConverter,\n ),\n createLinkPlugin(this.handleNewLinkSelection),\n createImageInserterPlugin(this.imagePasted.emit),\n createImageViewPlugin(this.language),\n createMenuStateTrackingPlugin(\n editorMenuTypesArray,\n this.menuCommandFactory,\n this.updateActiveActionBarItems,\n ),\n createActionBarInteractionPlugin(this.menuCommandFactory),\n ...getTableEditingPlugins(this.contentType === 'html'),\n ],\n });\n }\n\n private updateActiveActionBarItems = (\n activeTypes: Record<EditorMenuTypes, boolean>,\n allowedTypes: Record<EditorMenuTypes, boolean>,\n ) => {\n const newItems = getTextEditorMenuItems().map((item) => {\n if (isItem(item)) {\n return {\n ...item,\n selected: activeTypes[item.value],\n allowed: allowedTypes[item.value],\n };\n }\n\n return item;\n });\n\n this.actionBarItems = newItems.filter((item) =>\n isItem(item) ? item.allowed : true,\n );\n };\n\n private async updateView(content: string) {\n this.suppressChangeEvent = true;\n const html = await this.contentConverter.parseAsHTML(\n content,\n this.schema,\n );\n const prosemirrorDOMparser = DOMParser.fromSchema(\n this.view.state.schema,\n );\n const domParser = new window.DOMParser();\n const doc = domParser.parseFromString(html, 'text/html');\n const prosemirrorDoc = prosemirrorDOMparser.parse(doc.body);\n const tr = this.view.state.tr;\n tr.replaceWith(0, tr.doc.content.size, prosemirrorDoc.content);\n this.view.dispatch(tr);\n\n const metadata = getMetadataFromDoc(this.view.state.doc);\n this.metadataEmitter(metadata);\n\n this.suppressChangeEvent = false;\n }\n\n private handleTransaction = (transaction: Transaction) => {\n this.transactionFired = true;\n const newState = this.view.state.apply(transaction);\n this.view.updateState(newState);\n\n if (this.suppressChangeEvent || transaction.getMeta('pointer')) {\n return;\n }\n\n const content = this.contentConverter.serialize(this.view, this.schema);\n\n if (content === this.lastEmittedValue) {\n return;\n }\n\n const metadata = getMetadataFromDoc(newState.doc);\n this.metadataEmitter(metadata);\n\n this.lastEmittedValue = content;\n this.changeWaiting = true;\n this.changeEmitter(content);\n };\n\n private metadataEmitter(metadata: EditorMetadata) {\n if (hasMetadataChanged(this.metadata, metadata)) {\n this.removeImagesFromCache(this.metadata, metadata);\n this.metadata = metadata;\n this.metadataChange.emit(metadata);\n }\n }\n\n private removeImagesFromCache(\n oldMetadata: EditorMetadata,\n newMetadata: EditorMetadata,\n ) {\n const removedImages = oldMetadata.images.filter(\n (oldImage) =>\n !newMetadata.images.some(\n (newImage) => newImage.fileInfoId === oldImage.fileInfoId,\n ),\n );\n\n removedImages.forEach((image) => {\n imageCache.delete(image.fileInfoId);\n this.imageRemoved.emit(image);\n });\n }\n\n private handleActionBarItem = (\n event: CustomEvent<ActionBarItem<EditorMenuTypes>>,\n ) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n const { value } = event.detail;\n\n if (value === EditorMenuTypes.Link) {\n this.isLinkMenuOpen = true;\n\n return;\n }\n\n const actionBarEvent = new CustomEvent('actionBarItemClick', {\n detail: event.detail,\n });\n this.view.dom.dispatchEvent(actionBarEvent);\n };\n\n private handleCancelLinkMenu = (event: CustomEvent<void>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.isLinkMenuOpen = false;\n this.link = { text: '', href: 'https://' };\n };\n\n private handleSaveLinkMenu = () => {\n this.isLinkMenuOpen = false;\n\n const saveLinkEvent = new CustomEvent('saveLinkMenu', {\n detail: {\n type: EditorMenuTypes.Link,\n link: this.link,\n },\n });\n this.view.dom.dispatchEvent(saveLinkEvent);\n\n this.link = { href: 'https://' };\n };\n\n private handleLinkChange = (event: CustomEvent<EditorTextLink>) => {\n this.link = event.detail;\n };\n\n private handleFocus = () => {\n if (!this.disabled) {\n this.view?.focus();\n\n // Workaround: On some focus interactions (especially clicking the first line and the last line),\n // ProseMirror does not dispatch a transaction or update the selection. This can cause\n // the cursor to fall back to the end of the document instead of placing it where the user clicked.\n //\n // To detect this, we wait one tick after focus. If no transaction has fired by then,\n // we assume the selection is unresolved and manually move the cursor to the last clicked position.\n this.transactionFired = false;\n setTimeout(() => {\n if (!this.transactionFired && this.lastClickedPos) {\n const { doc, tr } = this.view.state;\n const resolvedPos = doc.resolve(this.lastClickedPos);\n const selection = Selection.near(resolvedPos);\n this.view.dispatch(tr.setSelection(selection));\n }\n }, 0);\n }\n };\n\n private handleNewLinkSelection = (text: string, href: string) => {\n this.link.text = text;\n this.link.href = href || 'https://';\n };\n\n private handleOpenLinkMenu = (event: CustomEvent<EditorLink>) => {\n event.stopImmediatePropagation();\n const { href, text } = event.detail;\n this.link = { href: href, text: text };\n this.isLinkMenuOpen = true;\n };\n\n private handleMouseDown = (event: MouseEvent) => {\n const coords = { left: event.clientX, top: event.clientY };\n const result = this.view.posAtCoords(coords);\n this.lastClickedPos = result?.pos ?? null;\n };\n\n private changeEmitter = debounce((value: string) => {\n this.change.emit(value);\n this.changeWaiting = false;\n }, DEBOUNCE_TIMEOUT);\n\n private handleBlur = () => {\n this.changeEmitter.flush();\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"prosemirror-adapter.js","sourceRoot":"","sources":["../../../../src/components/text-editor/prosemirror-adapter/prosemirror-adapter.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n Host,\n Prop,\n State,\n Watch,\n h,\n} from '@stencil/core';\nimport { EditorState, Transaction, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { Schema, DOMParser } from 'prosemirror-model';\nimport { schema } from 'prosemirror-schema-basic';\nimport { addListNodes } from 'prosemirror-schema-list';\nimport { exampleSetup } from 'prosemirror-example-setup';\nimport { keymap } from 'prosemirror-keymap';\nimport { ActionBarItem } from '../../../components/action-bar/action-bar.types';\nimport { ListSeparator } from '../../../components/list/list-item.types';\nimport { MenuCommandFactory } from './menu/menu-commands';\nimport { menuTranslationIDs, getTextEditorMenuItems } from './menu/menu-items';\nimport { ContentTypeConverter } from '../utils/content-type-converter';\nimport { MarkdownConverter } from '../utils/markdown-converter';\nimport { HTMLConverter } from '../utils/html-converter';\nimport {\n EditorMenuTypes,\n EditorTextLink,\n editorMenuTypesArray,\n} from './menu/types';\nimport translate from '../../../global/translations';\nimport { createRandomString } from '../../../util/random-string';\nimport { isItem } from '../../../components/action-bar/isItem';\nimport { cloneDeep, debounce } from 'lodash-es';\nimport { Languages } from '../../date-picker/date.types';\nimport { strikethrough } from './menu/menu-schema-extender';\nimport { createLinkPlugin } from './plugins/link/link-plugin';\nimport { linkMarkSpec } from './plugins/link/link-mark-spec';\nimport { createImageInserterPlugin } from './plugins/image/inserter';\nimport { createImageViewPlugin } from './plugins/image/view';\nimport { createMenuStateTrackingPlugin } from './plugins/menu-state-tracking-plugin';\nimport { createActionBarInteractionPlugin } from './plugins/menu-action-interaction-plugin';\nimport { CustomElementDefinition } from '../../../global/shared-types/custom-element.types';\nimport { createNodeSpec } from '../utils/plugin-factory';\nimport { createTriggerPlugin } from './plugins/trigger/factory';\nimport {\n TriggerCharacter,\n ImageInserter,\n EditorImage,\n EditorMetadata,\n EditorLink,\n} from '../text-editor.types';\nimport { getTableNodes, getTableEditingPlugins } from './plugins/table-plugin';\nimport { getImageNode, imageCache } from './plugins/image/node';\nimport { EditorUiType } from '../types';\nimport {\n getMetadataFromDoc,\n hasMetadataChanged,\n} from '../utils/metadata-utils';\n\nconst DEBOUNCE_TIMEOUT = 300;\n\n/**\n * The ProseMirror adapter offers a rich text editing experience with markdown support.\n * [Read more...](https://prosemirror.net/)\n *\n * @exampleComponent limel-example-prosemirror-adapter-basic\n * @exampleComponent limel-example-prosemirror-adapter-with-custom-menu\n * @beta\n * @private\n */\n@Component({\n tag: 'limel-prosemirror-adapter',\n shadow: { delegatesFocus: true },\n styleUrl: 'prosemirror-adapter.scss',\n})\nexport class ProsemirrorAdapter {\n /**\n * The type of content that the editor should handle and emit, defaults to `markdown`\n *\n * Assumed to be set only once, so not reactive to changes\n */\n @Prop()\n public contentType: 'markdown' | 'html' = 'markdown';\n\n /**\n * The value of the editor, expected to be markdown\n */\n @Prop()\n public value: string;\n\n /**\n * Defines the language for translations.\n */\n @Prop({ reflect: true })\n public language: Languages;\n\n /**\n * Set to `true` to disable the field.\n * Use `disabled` to indicate that the field can normally be interacted\n * with, but is currently disabled. This tells the user that if certain\n * requirements are met, the field may become enabled again.\n */\n @Prop({ reflect: true })\n public disabled?: boolean = false;\n\n /**\n * set to private to avoid usage while under development\n *\n * @private\n * @alpha\n */\n @Prop()\n customElements: CustomElementDefinition[] = [];\n\n /**\n * set to private to avoid usage while under development\n *\n * @private\n * @alpha\n */\n @Prop()\n triggerCharacters: TriggerCharacter[] = [];\n\n /**\n * Specifies the visual appearance of the editor.\n */\n @Prop()\n public ui: EditorUiType = 'standard';\n\n @Element()\n private host: HTMLLimelTextEditorElement;\n\n private portalId: string;\n\n @State()\n private view: EditorView;\n\n @State()\n private actionBarItems: Array<\n ActionBarItem<EditorMenuTypes> | ListSeparator\n > = [];\n\n @State()\n private link: EditorTextLink = { href: 'https://' };\n\n /**\n * Open state of the dialog\n */\n @State()\n public isLinkMenuOpen: boolean = false;\n\n private menuCommandFactory: MenuCommandFactory;\n private schema: Schema;\n private contentConverter: ContentTypeConverter;\n private actionBarElement: HTMLElement;\n private lastEmittedValue: string;\n private changeWaiting = false;\n private transactionFired = false;\n private lastClickedPos: number | null = null;\n private metadata: EditorMetadata = { images: [], links: [] };\n\n /**\n * Used to stop change event emitting as result of getting updated value from consumer\n */\n private suppressChangeEvent = false;\n\n /**\n * Dispatched when a change is made to the editor\n */\n @Event()\n private change: EventEmitter<string>;\n\n /**\n * Dispatched when a image is pasted into the editor\n *\n * @private\n * @alpha\n */\n @Event()\n private imagePasted: EventEmitter<ImageInserter>;\n\n /**\n * Dispatched when a image is removed from the editor\n *\n * @private\n * @alpha\n */\n @Event()\n private imageRemoved: EventEmitter<EditorImage>;\n\n /**\n * Dispatched when the metadata of the editor changes (images and links)\n *\n * @private\n * @alpha\n */\n @Event()\n private metadataChange: EventEmitter<EditorMetadata>;\n\n constructor() {\n this.portalId = createRandomString();\n }\n\n @Watch('value')\n protected watchValue(newValue: string) {\n if (!this.view) {\n return;\n }\n\n if (this.changeWaiting) {\n // A change is pending; do not update the editor's content\n return;\n }\n\n const currentContent = this.contentConverter.serialize(\n this.view,\n this.schema,\n );\n\n // If the new value is the same as the current content, do nothing\n if (newValue === currentContent) {\n return;\n }\n\n // Update the editor's content with the new value\n this.updateView(newValue);\n }\n\n public componentWillLoad() {\n this.getActionBarItems();\n this.setupContentConverter();\n }\n\n public componentDidLoad() {\n // Stencil complains loudly about triggering rerenders in\n // componentDidLoad, but we have to, so we're using setTimeout to\n // suppress the warning. /Ads\n setTimeout(() => {\n this.initializeTextEditor();\n }, 0);\n }\n\n public connectedCallback() {\n if (this.view) {\n this.initializeTextEditor();\n }\n\n this.host.addEventListener(\n 'open-editor-link-menu',\n this.handleOpenLinkMenu,\n );\n }\n\n public disconnectedCallback() {\n imageCache.clear();\n\n this.host.removeEventListener(\n 'open-editor-link-menu',\n this.handleOpenLinkMenu,\n );\n this.view?.dom?.removeEventListener('blur', this.handleBlur);\n this.view?.dom?.removeEventListener('mousedown', this.handleMouseDown);\n this.view?.destroy();\n }\n\n public render() {\n return (\n <Host onFocus={this.handleFocus}>\n <div id=\"editor\" />\n {this.renderToolbar()}\n {this.renderLinkMenu()}\n </Host>\n );\n }\n\n renderToolbar() {\n if (!this.actionBarItems.length || this.ui === 'no-toolbar') {\n return;\n }\n\n return (\n <div class=\"toolbar\">\n <limel-action-bar\n ref={(el) => (this.actionBarElement = el)}\n accessibleLabel=\"Toolbar\"\n actions={this.actionBarItems}\n onItemSelected={this.handleActionBarItem}\n />\n </div>\n );\n }\n\n renderLinkMenu() {\n if (!this.isLinkMenuOpen) {\n return;\n }\n\n return (\n <limel-portal\n containerId={this.portalId}\n visible={this.isLinkMenuOpen}\n openDirection=\"top\"\n inheritParentWidth={true}\n anchor={this.actionBarElement}\n >\n <limel-text-editor-link-menu\n link={this.link}\n isOpen={this.isLinkMenuOpen}\n onLinkChange={this.handleLinkChange}\n onCancel={this.handleCancelLinkMenu}\n onSave={this.handleSaveLinkMenu}\n />\n </limel-portal>\n );\n }\n\n private setupContentConverter() {\n if (this.contentType === 'markdown') {\n this.contentConverter = new MarkdownConverter(\n this.customElements,\n this.language,\n );\n } else if (this.contentType === 'html') {\n this.contentConverter = new HTMLConverter(this.customElements);\n } else {\n throw new Error(\n `Unsupported content type: ${this.contentType}. Only 'markdown' and 'html' are supported.`,\n );\n }\n }\n\n private getActionBarItems = () => {\n this.actionBarItems = getTextEditorMenuItems().map(\n this.getTranslatedItem,\n );\n };\n\n private getTranslatedItem = (item) => {\n const newItem = cloneDeep(item);\n\n if (isItem(item)) {\n const translationId = menuTranslationIDs[item.value];\n\n if (translationId) {\n newItem.text = translate.get(translationId, this.language);\n }\n }\n\n return newItem;\n };\n\n private async initializeTextEditor() {\n this.schema = this.initializeSchema();\n const initialDoc = await this.parseInitialContent();\n this.menuCommandFactory = new MenuCommandFactory(this.schema);\n this.view = new EditorView(\n this.host.shadowRoot.querySelector('#editor'),\n {\n state: this.createEditorState(initialDoc),\n dispatchTransaction: this.handleTransaction,\n },\n );\n\n this.view.dom.addEventListener('blur', this.handleBlur);\n this.view.dom.addEventListener('mousedown', this.handleMouseDown);\n\n if (this.value) {\n this.updateView(this.value);\n }\n }\n\n private initializeSchema() {\n let nodes = schema.spec.nodes;\n\n this.customElements.forEach((customElement) => {\n const newNodeSpec = createNodeSpec(customElement);\n const nodeName = customElement.tagName;\n\n nodes = nodes.append({ [nodeName]: newNodeSpec });\n });\n nodes = addListNodes(nodes, 'paragraph block*', 'block');\n\n if (this.contentType === 'html') {\n nodes = nodes.append(getTableNodes());\n }\n\n nodes = nodes.append(getImageNode(this.language));\n\n return new Schema({\n nodes: nodes,\n marks: schema.spec.marks.append({\n strikethrough: strikethrough,\n link: linkMarkSpec,\n }),\n });\n }\n\n private async parseInitialContent() {\n const initialContentElement = document.createElement('div');\n\n if (this.value) {\n initialContentElement.innerHTML =\n await this.contentConverter.parseAsHTML(\n this.value,\n this.schema,\n );\n } else {\n initialContentElement.innerHTML = '<p></p>';\n }\n\n return DOMParser.fromSchema(this.schema).parse(initialContentElement);\n }\n\n private createEditorState(initialDoc) {\n return EditorState.create({\n doc: initialDoc,\n plugins: [\n ...exampleSetup({ schema: this.schema, menuBar: false }),\n keymap(this.menuCommandFactory.buildKeymap()),\n createTriggerPlugin(\n this.triggerCharacters,\n this.contentConverter,\n ),\n createLinkPlugin(this.handleNewLinkSelection),\n createImageInserterPlugin(this.imagePasted.emit),\n createImageViewPlugin(this.language),\n createMenuStateTrackingPlugin(\n editorMenuTypesArray,\n this.menuCommandFactory,\n this.updateActiveActionBarItems,\n ),\n createActionBarInteractionPlugin(this.menuCommandFactory),\n ...getTableEditingPlugins(this.contentType === 'html'),\n ],\n });\n }\n\n private updateActiveActionBarItems = (\n activeTypes: Record<EditorMenuTypes, boolean>,\n allowedTypes: Record<EditorMenuTypes, boolean>,\n ) => {\n const newItems = getTextEditorMenuItems().map((item) => {\n if (isItem(item)) {\n return {\n ...item,\n selected: activeTypes[item.value],\n allowed: allowedTypes[item.value],\n };\n }\n\n return item;\n });\n\n this.actionBarItems = newItems.filter((item) =>\n isItem(item) ? item.allowed : true,\n );\n };\n\n private async updateView(content: string) {\n this.suppressChangeEvent = true;\n const html = await this.contentConverter.parseAsHTML(\n content,\n this.schema,\n );\n const prosemirrorDOMparser = DOMParser.fromSchema(\n this.view.state.schema,\n );\n const domParser = new window.DOMParser();\n const doc = domParser.parseFromString(html, 'text/html');\n const prosemirrorDoc = prosemirrorDOMparser.parse(doc.body);\n const tr = this.view.state.tr;\n tr.replaceWith(0, tr.doc.content.size, prosemirrorDoc.content);\n this.view.dispatch(tr);\n\n const metadata = getMetadataFromDoc(this.view.state.doc);\n this.metadataEmitter(metadata);\n\n this.suppressChangeEvent = false;\n }\n\n private handleTransaction = (transaction: Transaction) => {\n this.transactionFired = true;\n const newState = this.view.state.apply(transaction);\n this.view.updateState(newState);\n\n if (this.suppressChangeEvent || transaction.getMeta('pointer')) {\n return;\n }\n\n const content = this.contentConverter.serialize(this.view, this.schema);\n\n if (content === this.lastEmittedValue) {\n return;\n }\n\n const metadata = getMetadataFromDoc(newState.doc);\n this.metadataEmitter(metadata);\n\n this.lastEmittedValue = content;\n this.changeWaiting = true;\n this.changeEmitter(content);\n };\n\n private metadataEmitter(metadata: EditorMetadata) {\n if (hasMetadataChanged(this.metadata, metadata)) {\n this.removeImagesFromCache(this.metadata, metadata);\n this.metadata = metadata;\n this.metadataChange.emit(metadata);\n }\n }\n\n private removeImagesFromCache(\n oldMetadata: EditorMetadata,\n newMetadata: EditorMetadata,\n ) {\n const removedImages = oldMetadata.images.filter(\n (oldImage) =>\n !newMetadata.images.some(\n (newImage) => newImage.fileInfoId === oldImage.fileInfoId,\n ),\n );\n\n removedImages.forEach((image) => {\n imageCache.delete(image.fileInfoId);\n this.imageRemoved.emit(image);\n });\n }\n\n private handleActionBarItem = (\n event: CustomEvent<ActionBarItem<EditorMenuTypes>>,\n ) => {\n event.preventDefault();\n event.stopImmediatePropagation();\n const { value } = event.detail;\n\n if (value === EditorMenuTypes.Link) {\n this.isLinkMenuOpen = true;\n\n return;\n }\n\n const actionBarEvent = new CustomEvent('actionBarItemClick', {\n detail: event.detail,\n });\n this.view.dom.dispatchEvent(actionBarEvent);\n };\n\n private handleCancelLinkMenu = (event: CustomEvent<void>) => {\n event.preventDefault();\n event.stopPropagation();\n\n this.isLinkMenuOpen = false;\n this.link = { text: '', href: 'https://' };\n };\n\n private handleSaveLinkMenu = () => {\n this.isLinkMenuOpen = false;\n\n const saveLinkEvent = new CustomEvent('saveLinkMenu', {\n detail: {\n type: EditorMenuTypes.Link,\n link: this.link,\n },\n });\n this.view.dom.dispatchEvent(saveLinkEvent);\n\n this.link = { href: 'https://' };\n };\n\n private handleLinkChange = (event: CustomEvent<EditorTextLink>) => {\n this.link = event.detail;\n };\n\n private handleFocus = () => {\n if (!this.disabled) {\n this.view?.focus();\n\n // Workaround: On some focus interactions (especially clicking the first line and the last line),\n // ProseMirror does not dispatch a transaction or update the selection. This can cause\n // the cursor to fall back to the end of the document instead of placing it where the user clicked.\n //\n // To detect this, we wait one tick after focus. If no transaction has fired by then,\n // we assume the selection is unresolved and manually move the cursor to the last clicked position.\n this.transactionFired = false;\n setTimeout(() => {\n if (!this.transactionFired && this.lastClickedPos) {\n const { doc, tr } = this.view.state;\n const resolvedPos = doc.resolve(this.lastClickedPos);\n const selection = Selection.near(resolvedPos);\n this.view.dispatch(tr.setSelection(selection));\n }\n }, 0);\n }\n };\n\n private handleNewLinkSelection = (text: string, href: string) => {\n this.link.text = text;\n this.link.href = href || 'https://';\n };\n\n private handleOpenLinkMenu = (event: CustomEvent<EditorLink>) => {\n event.stopImmediatePropagation();\n const { href, text } = event.detail;\n this.link = { href: href, text: text };\n this.isLinkMenuOpen = true;\n };\n\n private handleMouseDown = (event: MouseEvent) => {\n const coords = { left: event.clientX, top: event.clientY };\n const result = this.view.posAtCoords(coords);\n this.lastClickedPos = result?.pos ?? null;\n };\n\n private changeEmitter = debounce((value: string) => {\n this.change.emit(value);\n this.changeWaiting = false;\n }, DEBOUNCE_TIMEOUT);\n\n private handleBlur = () => {\n this.changeEmitter.flush();\n };\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as registerInstance, h } from './index-2714248e.js';
|
|
2
|
-
import { m as markdownToHTML } from './markdown-parser-
|
|
2
|
+
import { m as markdownToHTML } from './markdown-parser-41d15994.js';
|
|
3
3
|
import { g as globalConfig } from './config-656a588f.js';
|
|
4
4
|
import './_commonjsHelpers-9b95d21f.js';
|
|
5
5
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { r as registerInstance, c as createEvent, h, H as Host, g as getElement } from './index-2714248e.js';
|
|
2
|
+
import { g as getLinkAttributes, d as decodeHTML, m as markdownToHTML, s as sanitizeHTML } from './markdown-parser-41d15994.js';
|
|
2
3
|
import { k as keys$1, g as getSymbols, U as Uint8Array, a as Stack, i as getAllKeys } from './_baseIsEqual-7961b1ee.js';
|
|
3
4
|
import { a as assignValue } from './_assignValue-1f62c5ff.js';
|
|
4
5
|
import { b as baseAssignValue } from './_baseAssignValue-ba9887b3.js';
|
|
@@ -8,19 +9,18 @@ import { d as isPrototype, g as getTag, e as baseUnary, n as nodeUtil, a as isBu
|
|
|
8
9
|
import { g as getPrototype } from './_getPrototype-8096728a.js';
|
|
9
10
|
import { i as isArray } from './isArray-80298bc7.js';
|
|
10
11
|
import { i as isObjectLike } from './isObjectLike-38996507.js';
|
|
11
|
-
import { d as decodeHTML, m as markdownToHTML, s as sanitizeHTML } from './markdown-parser-1c1fdedc.js';
|
|
12
12
|
import { t as translate$1 } from './translations-489f20b3.js';
|
|
13
13
|
import { c as createRandomString } from './random-string-e74dc48d.js';
|
|
14
14
|
import { i as isItem } from './isItem-b0459122.js';
|
|
15
15
|
import { c as createFileInfo } from './files-2be62a61.js';
|
|
16
16
|
import { i as isEqual } from './isEqual-2c139334.js';
|
|
17
17
|
import { d as debounce } from './debounce-9a05c91c.js';
|
|
18
|
+
import './_commonjsHelpers-9b95d21f.js';
|
|
18
19
|
import './eq-c1c7f528.js';
|
|
19
20
|
import './_getNative-93d6bfe9.js';
|
|
20
21
|
import './_isIndex-6de44c7b.js';
|
|
21
22
|
import './isArrayLike-6597c815.js';
|
|
22
23
|
import './_defineProperty-2105cb48.js';
|
|
23
|
-
import './_commonjsHelpers-9b95d21f.js';
|
|
24
24
|
import './file-metadata-01403ecd.js';
|
|
25
25
|
import './get-icon-props-5a77e17e.js';
|
|
26
26
|
import './toNumber-a6ed64f0.js';
|
|
@@ -16898,24 +16898,15 @@ const setActiveMethodForWrap = (command, nodeType) => {
|
|
|
16898
16898
|
const createInsertLinkCommand = (schema, _, link) => {
|
|
16899
16899
|
const command = (state, dispatch) => {
|
|
16900
16900
|
const { from, to } = state.selection;
|
|
16901
|
+
const linkMark = schema.marks.link.create(getLinkAttributes(link.href, link.href));
|
|
16901
16902
|
if (from === to) {
|
|
16902
16903
|
// If no text is selected, insert new text with link
|
|
16903
|
-
const linkMark = schema.marks.link.create({
|
|
16904
|
-
href: link.href,
|
|
16905
|
-
title: link.href,
|
|
16906
|
-
target: isExternalLink(link.href) ? '_blank' : null,
|
|
16907
|
-
});
|
|
16908
16904
|
const linkText = link.text || link.href;
|
|
16909
16905
|
const newLink = schema.text(linkText, [linkMark]);
|
|
16910
16906
|
dispatch(state.tr.insert(from, newLink));
|
|
16911
16907
|
}
|
|
16912
16908
|
else {
|
|
16913
16909
|
// If text is selected, replace selected text with link text
|
|
16914
|
-
const linkMark = schema.marks.link.create({
|
|
16915
|
-
href: link.href,
|
|
16916
|
-
title: link.href,
|
|
16917
|
-
target: isExternalLink(link.href) ? '_blank' : null,
|
|
16918
|
-
});
|
|
16919
16910
|
const selectedText = state.doc.textBetween(from, to, ' ');
|
|
16920
16911
|
const newLink = schema.text(link.text || selectedText, [linkMark]);
|
|
16921
16912
|
dispatch(state.tr.replaceWith(from, to, newLink));
|
|
@@ -16989,15 +16980,6 @@ const toggleNodeType = (schema, type, attrs = {}, shouldWrap = false) => {
|
|
|
16989
16980
|
return false;
|
|
16990
16981
|
};
|
|
16991
16982
|
};
|
|
16992
|
-
const isValidUrl = (text) => {
|
|
16993
|
-
try {
|
|
16994
|
-
new URL(text);
|
|
16995
|
-
}
|
|
16996
|
-
catch (_a) {
|
|
16997
|
-
return false;
|
|
16998
|
-
}
|
|
16999
|
-
return true;
|
|
17000
|
-
};
|
|
17001
16983
|
const createSetNodeTypeCommand = (schema, nodeType, level) => {
|
|
17002
16984
|
const type = schema.nodes[nodeType];
|
|
17003
16985
|
if (!type) {
|
|
@@ -17070,27 +17052,6 @@ const createListCommand = (schema, listType) => {
|
|
|
17070
17052
|
setActiveMethodForWrap(command, type);
|
|
17071
17053
|
return command;
|
|
17072
17054
|
};
|
|
17073
|
-
const copyPasteLinkCommand = (state, dispatch) => {
|
|
17074
|
-
const { from, to } = state.selection;
|
|
17075
|
-
if (from === to) {
|
|
17076
|
-
return false;
|
|
17077
|
-
}
|
|
17078
|
-
const clipboardData = window.clipboardData;
|
|
17079
|
-
if (!clipboardData) {
|
|
17080
|
-
return false;
|
|
17081
|
-
}
|
|
17082
|
-
const copyPastedText = clipboardData.getData('text');
|
|
17083
|
-
if (!isValidUrl(copyPastedText)) {
|
|
17084
|
-
return false;
|
|
17085
|
-
}
|
|
17086
|
-
const linkMark = state.schema.marks.link.create({
|
|
17087
|
-
href: copyPastedText,
|
|
17088
|
-
target: isExternalLink(copyPastedText) ? '_blank' : null,
|
|
17089
|
-
});
|
|
17090
|
-
const selectedText = state.doc.textBetween(from, to, ' ');
|
|
17091
|
-
const newLink = state.schema.text(selectedText, [linkMark]);
|
|
17092
|
-
dispatch(state.tr.replaceWith(from, to, newLink));
|
|
17093
|
-
};
|
|
17094
17055
|
const commandMapping = {
|
|
17095
17056
|
strong: createToggleMarkCommand,
|
|
17096
17057
|
em: createToggleMarkCommand,
|
|
@@ -17129,7 +17090,6 @@ class MenuCommandFactory {
|
|
|
17129
17090
|
'Mod-Shift-X': this.getCommand(EditorMenuTypes.Strikethrough),
|
|
17130
17091
|
'Mod-`': this.getCommand(EditorMenuTypes.Code),
|
|
17131
17092
|
'Mod-Shift-C': this.getCommand(EditorMenuTypes.CodeBlock),
|
|
17132
|
-
'Mod-v': copyPasteLinkCommand,
|
|
17133
17093
|
};
|
|
17134
17094
|
}
|
|
17135
17095
|
}
|
|
@@ -26256,32 +26216,145 @@ const processClickEvent = (view, event) => {
|
|
|
26256
26216
|
}, DOUBLE_CLICK_DELAY);
|
|
26257
26217
|
return true;
|
|
26258
26218
|
};
|
|
26259
|
-
|
|
26260
|
-
|
|
26261
|
-
|
|
26219
|
+
/**
|
|
26220
|
+
* Regular expression for matching URLs, mailto links, and phone links
|
|
26221
|
+
*/
|
|
26222
|
+
const URL_REGEX = /(https?:\/\/[^\s<>"']+|mailto:[^\s<>"']+|tel:[^\s<>"']+)/g;
|
|
26223
|
+
/**
|
|
26224
|
+
* Checks if the text contains any URLs, mailto links, or phone links
|
|
26225
|
+
*/
|
|
26226
|
+
const hasUrls = (text) => {
|
|
26227
|
+
// Reset regex before use
|
|
26228
|
+
URL_REGEX.lastIndex = 0;
|
|
26229
|
+
return URL_REGEX.test(text);
|
|
26230
|
+
};
|
|
26231
|
+
/**
|
|
26232
|
+
* Creates a text node with the provided content
|
|
26233
|
+
*/
|
|
26234
|
+
const createTextNode = (schema, content) => {
|
|
26235
|
+
return schema.text(content);
|
|
26236
|
+
};
|
|
26237
|
+
/**
|
|
26238
|
+
* Creates a link node with the provided URL
|
|
26239
|
+
*/
|
|
26240
|
+
const createLinkNode = (schema, url) => {
|
|
26241
|
+
const linkMark = schema.marks.link.create(getLinkAttributes(url, url));
|
|
26242
|
+
return schema.text(url, [linkMark]);
|
|
26243
|
+
};
|
|
26244
|
+
/**
|
|
26245
|
+
* Finds all link matches in the provided text
|
|
26246
|
+
*/
|
|
26247
|
+
const findLinkMatches = (text) => {
|
|
26248
|
+
const matches = [];
|
|
26249
|
+
let match;
|
|
26250
|
+
// Reset regex before use
|
|
26251
|
+
URL_REGEX.lastIndex = 0;
|
|
26252
|
+
while ((match = URL_REGEX.exec(text)) !== null) {
|
|
26253
|
+
matches.push({
|
|
26254
|
+
url: match[0],
|
|
26255
|
+
start: match.index,
|
|
26256
|
+
end: match.index + match[0].length,
|
|
26257
|
+
});
|
|
26258
|
+
}
|
|
26259
|
+
return matches;
|
|
26260
|
+
};
|
|
26261
|
+
/**
|
|
26262
|
+
* Creates text nodes with links for any URLs, mailto links, or phone links found in the text
|
|
26263
|
+
*/
|
|
26264
|
+
const createNodesWithLinks = (text, schema) => {
|
|
26265
|
+
const nodes = [];
|
|
26266
|
+
const matches = findLinkMatches(text);
|
|
26267
|
+
if (matches.length === 0) {
|
|
26268
|
+
// No links found, just return the text as a single node
|
|
26269
|
+
return [createTextNode(schema, text)];
|
|
26270
|
+
}
|
|
26271
|
+
let lastIndex = 0;
|
|
26272
|
+
// Process each match
|
|
26273
|
+
for (const match of matches) {
|
|
26274
|
+
// Add text before the current link if any
|
|
26275
|
+
if (match.start > lastIndex) {
|
|
26276
|
+
nodes.push(createTextNode(schema, text.slice(lastIndex, match.start)));
|
|
26277
|
+
}
|
|
26278
|
+
// Add the link node
|
|
26279
|
+
nodes.push(createLinkNode(schema, match.url));
|
|
26280
|
+
lastIndex = match.end;
|
|
26281
|
+
}
|
|
26282
|
+
// Add any remaining text after the last link
|
|
26283
|
+
if (lastIndex < text.length) {
|
|
26284
|
+
nodes.push(createTextNode(schema, text.slice(lastIndex)));
|
|
26285
|
+
}
|
|
26286
|
+
return nodes;
|
|
26287
|
+
};
|
|
26288
|
+
/**
|
|
26289
|
+
* Pastes nodes at the current selection
|
|
26290
|
+
* @param view - The editor view
|
|
26291
|
+
* @param nodes - Array of nodes to paste
|
|
26292
|
+
*/
|
|
26293
|
+
const pasteAsLink = (view, nodes) => {
|
|
26294
|
+
if (nodes.length === 0) {
|
|
26295
|
+
return;
|
|
26296
|
+
}
|
|
26297
|
+
if (isSingleLinkNode(nodes)) {
|
|
26298
|
+
insertSingleLink(view, nodes[0]);
|
|
26299
|
+
}
|
|
26300
|
+
else {
|
|
26301
|
+
insertNodeFragment(view, nodes);
|
|
26302
|
+
}
|
|
26303
|
+
};
|
|
26304
|
+
/**
|
|
26305
|
+
* Checks if the nodes array contains just a single link node
|
|
26306
|
+
*/
|
|
26307
|
+
const isSingleLinkNode = (nodes) => {
|
|
26308
|
+
if (nodes.length !== 1) {
|
|
26262
26309
|
return false;
|
|
26263
26310
|
}
|
|
26264
|
-
const
|
|
26265
|
-
//
|
|
26266
|
-
if (
|
|
26267
|
-
|
|
26268
|
-
return true;
|
|
26311
|
+
const node = nodes[0];
|
|
26312
|
+
// Must be text with non-empty content
|
|
26313
|
+
if (!node.isText || !node.text || node.text.trim() === '') {
|
|
26314
|
+
return false;
|
|
26269
26315
|
}
|
|
26270
|
-
|
|
26316
|
+
// Must have a link mark (even if there are other marks, we just care about link presence)
|
|
26317
|
+
return !!node.marks.find((mark) => mark.type.name === 'link');
|
|
26271
26318
|
};
|
|
26272
|
-
|
|
26319
|
+
/**
|
|
26320
|
+
* Inserts a single link node, applying it to selected text if present
|
|
26321
|
+
*/
|
|
26322
|
+
const insertSingleLink = (view, linkNode) => {
|
|
26273
26323
|
const { state, dispatch } = view;
|
|
26274
26324
|
const { from, to } = state.selection;
|
|
26275
|
-
const linkMark =
|
|
26276
|
-
|
|
26277
|
-
|
|
26278
|
-
|
|
26279
|
-
|
|
26280
|
-
const selectedText = state.doc.textBetween(from, to, ' ') || href;
|
|
26281
|
-
const transaction = state.tr
|
|
26325
|
+
const linkMark = linkNode.marks.find((mark) => mark.type.name === 'link');
|
|
26326
|
+
// Use selected text if there's a selection, otherwise use the URL
|
|
26327
|
+
const selectedText = state.doc.textBetween(from, to, ' ') || linkMark.attrs.href;
|
|
26328
|
+
// Insert the text and add the link mark
|
|
26329
|
+
dispatch(state.tr
|
|
26282
26330
|
.insertText(selectedText, from, to)
|
|
26283
|
-
.addMark(from, from + selectedText.length, linkMark);
|
|
26284
|
-
|
|
26331
|
+
.addMark(from, from + selectedText.length, linkMark));
|
|
26332
|
+
};
|
|
26333
|
+
/**
|
|
26334
|
+
* Inserts multiple nodes as a fragment at the current selection
|
|
26335
|
+
* @param view - The editor view
|
|
26336
|
+
* @param nodes - Array of nodes to insert
|
|
26337
|
+
*/
|
|
26338
|
+
const insertNodeFragment = (view, nodes) => {
|
|
26339
|
+
const { state, dispatch } = view;
|
|
26340
|
+
const { from, to } = state.selection;
|
|
26341
|
+
// Create a fragment from the array of nodes
|
|
26342
|
+
const fragment = Fragment.fromArray(nodes);
|
|
26343
|
+
// Replace the current selection with the fragment
|
|
26344
|
+
dispatch(state.tr.replaceWith(from, to, fragment));
|
|
26345
|
+
};
|
|
26346
|
+
/**
|
|
26347
|
+
* Handles pasted content, converting URLs to links
|
|
26348
|
+
*/
|
|
26349
|
+
const processPasteEvent$1 = (view, event) => {
|
|
26350
|
+
var _a;
|
|
26351
|
+
const text = (_a = event.clipboardData) === null || _a === void 0 ? void 0 : _a.getData('text/plain');
|
|
26352
|
+
if (!text || !hasUrls(text)) {
|
|
26353
|
+
return false;
|
|
26354
|
+
}
|
|
26355
|
+
const nodes = createNodesWithLinks(text, view.state.schema);
|
|
26356
|
+
pasteAsLink(view, nodes);
|
|
26357
|
+
return true;
|
|
26285
26358
|
};
|
|
26286
26359
|
const createLinkPlugin = (updateLinkCallback) => {
|
|
26287
26360
|
return new Plugin({
|
|
@@ -26323,6 +26396,39 @@ const createLinkPlugin = (updateLinkCallback) => {
|
|
|
26323
26396
|
});
|
|
26324
26397
|
};
|
|
26325
26398
|
|
|
26399
|
+
const linkMarkSpec = {
|
|
26400
|
+
attrs: {
|
|
26401
|
+
href: { default: '' },
|
|
26402
|
+
title: { default: null },
|
|
26403
|
+
target: { default: null },
|
|
26404
|
+
rel: { default: null },
|
|
26405
|
+
referrerpolicy: { default: null },
|
|
26406
|
+
},
|
|
26407
|
+
inclusive: false,
|
|
26408
|
+
parseDOM: [
|
|
26409
|
+
{
|
|
26410
|
+
tag: 'a[href]',
|
|
26411
|
+
getAttrs: (dom) => {
|
|
26412
|
+
return {
|
|
26413
|
+
href: dom.getAttribute('href') || '',
|
|
26414
|
+
title: dom.getAttribute('title'),
|
|
26415
|
+
target: dom.getAttribute('target'),
|
|
26416
|
+
rel: dom.getAttribute('rel'),
|
|
26417
|
+
referrerpolicy: dom.getAttribute('referrerpolicy'),
|
|
26418
|
+
};
|
|
26419
|
+
},
|
|
26420
|
+
},
|
|
26421
|
+
],
|
|
26422
|
+
toDOM: (mark) => {
|
|
26423
|
+
const target = mark.attrs.target || null;
|
|
26424
|
+
const securityAttrs = {
|
|
26425
|
+
rel: target === '_blank' ? 'noopener noreferrer' : null,
|
|
26426
|
+
referrerpolicy: target === '_blank' ? 'noreferrer' : null,
|
|
26427
|
+
};
|
|
26428
|
+
return ['a', Object.assign(Object.assign({}, mark.attrs), securityAttrs), 0];
|
|
26429
|
+
},
|
|
26430
|
+
};
|
|
26431
|
+
|
|
26326
26432
|
const pluginKey = new PluginKey('imageInserterPlugin');
|
|
26327
26433
|
const createImageInserterPlugin = (imagePastedCallback) => {
|
|
26328
26434
|
return new Plugin({
|
|
@@ -28710,6 +28816,7 @@ const ProsemirrorAdapter = class {
|
|
|
28710
28816
|
nodes: nodes,
|
|
28711
28817
|
marks: schema$1.spec.marks.append({
|
|
28712
28818
|
strikethrough: strikethrough,
|
|
28819
|
+
link: linkMarkSpec,
|
|
28713
28820
|
}),
|
|
28714
28821
|
});
|
|
28715
28822
|
}
|