{"version":3,"file":"editor.mjs","sources":["../../../../../../packages/components/editor/src/editor.vue"],"sourcesContent":["<template>\n  <div\n    :class=\"[\n      ns.b(),\n      border ? ns.m('border') : '',\n      resize ? ns.m('resize') : '',\n      disabled ? ns.m('disabled') : '',\n    ]\"\n    @click=\"handleClick\"\n  >\n    <div :class=\"ns.b('prepend')\">\n      <slot name=\"prepend\" />\n    </div>\n    <editor-content :class=\"ns.b('wrapper')\" :editor=\"editor\" />\n    <div :class=\"ns.b('append')\">\n      <slot name=\"append\" />\n    </div>\n    <span v-if=\"isWordLimitVisible\" :class=\"ns.e('count')\">\n      <span :class=\"ns.e('count-inner')\">\n        {{ textLength }} / {{ maxLength }}\n      </span>\n    </span>\n    <slot name=\"character-count\" v-bind=\"{ count: textLength }\" />\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, onBeforeUnmount, onMounted, ref, watch } from 'vue'\nimport { useNamespace } from 'element-plus'\nimport { EditorContent, useEditor } from '@tiptap/vue-3'\nimport StarterKit from '@tiptap/starter-kit'\nimport Mention from '@tiptap/extension-mention'\nimport Placeholder from '@tiptap/extension-placeholder'\nimport CharacterCount from '@tiptap/extension-character-count'\nimport Underline from '@tiptap/extension-underline'\nimport Image from '@tiptap/extension-image'\nimport TextAlign from '@tiptap/extension-text-align'\nimport Link from '@tiptap/extension-link'\nimport TextStyle from '@tiptap/extension-text-style'\nimport { UPDATE_MODEL_EVENT } from '@element-plus/constants'\nimport Tag from './plugins/tag/index'\nimport Video from './plugins/video/index'\nimport Component from './plugins/component/index'\nimport FontSize from './plugins/font-size/index'\nimport { useSuggestion } from './mention/suggestion'\nimport { editorEmits, editorProps } from './editor'\nimport type { EditorOptions } from '@tiptap/core'\nimport type {\n  EnterValues,\n  ISetImageOptions,\n  ISetVideOptions,\n  InsertContentOptions,\n  MentionOption,\n} from './types'\n\ndefineOptions({\n  name: 'ElEditor',\n})\n\nconst slots = defineSlots<{\n  prepend(): any\n  append(): any\n  header(): any\n  content(props: { items: MentionOption[] }): any\n  label(props: { item: MentionOption; index: number }): any\n  footer(): any\n  'character-count'(props: { count: number }): any\n}>()\n\nconst props = defineProps(editorProps)\nconst emit = defineEmits(editorEmits)\n\nconst ns = useNamespace('editor')\n\nconst textLength = ref(0)\nconst maxLength = computed(() => Number(props.maxlength))\nconst isWordLimitVisible = computed(() => maxLength.value !== 0)\n\nconst { suggestion, getVisible } = useSuggestion({\n  char: props.prefix,\n  options: props.options,\n  tooltipProps: props.tooltipProps,\n  slots,\n})\n\nconst handleClick = () => {\n  focus()\n}\n\nconst setTextLength = () => {\n  const richEditor = editor.value\n  if (richEditor && (isWordLimitVisible.value || slots['character-count'])) {\n    textLength.value = richEditor.storage.characterCount.characters()\n  }\n}\n\nconst focus = () => {\n  const richEditor = editor.value\n  return richEditor?.commands?.focus()\n}\n\nconst getHtml = () => {\n  const richEditor = editor.value\n  return richEditor?.getHTML() ?? ''\n}\n\nconst getText = () => {\n  const richEditor = editor.value\n  return richEditor?.getText() ?? ''\n}\n\nconst insertHtml = (html: string, options?: InsertContentOptions) => {\n  const richEditor = editor.value\n  richEditor && richEditor.chain().insertContent(html, options).focus().run()\n}\n\nconst resetHtml = (html: string) => {\n  const richEditor = editor.value\n  richEditor && richEditor.commands.setContent(html, false)\n}\n\nconst setImage = (options: ISetImageOptions) => {\n  const richEditor = editor.value\n  richEditor && richEditor.chain().focus().setImage(options).run()\n}\n\nconst setVideo = (options: ISetVideOptions) => {\n  let attrs = ''\n  Object.entries(options).forEach(([key, value]) => {\n    attrs += `${key}=\"${value}\" `\n  })\n  insertHtml(`<video ${attrs}></video>`)\n}\n\nconst options: Partial<EditorOptions> = {\n  extensions: [\n    Tag,\n    Video,\n    Component,\n    Underline,\n    Link.configure({\n      validate: (link) => /^https?:\\/\\//.test(link),\n    }),\n    TextAlign.configure({\n      types: ['heading', 'paragraph'],\n    }),\n    Image.configure({\n      inline: true,\n      allowBase64: false,\n      HTMLAttributes: {\n        class: 'tiptap-image',\n      },\n    }),\n    StarterKit.configure({\n      bulletList: {\n        keepMarks: true,\n      },\n      orderedList: {\n        keepMarks: true,\n      },\n    }),\n    CharacterCount.configure({\n      limit: isWordLimitVisible.value ? maxLength.value : null,\n    }),\n    Mention.configure({\n      HTMLAttributes: {\n        class: 'tiptap-mention',\n      },\n      suggestion,\n      deleteTriggerWithBackspace: true,\n    }),\n    Placeholder.configure({\n      emptyEditorClass: 'tiptap-placeholder',\n      placeholder: props.placeholder,\n    }),\n    FontSize,\n    TextStyle,\n    ...props.extensions,\n  ],\n  content: props.modelValue,\n  editable: !props.disabled,\n  onUpdate: () => {\n    emit(UPDATE_MODEL_EVENT, getHtml())\n  },\n  editorProps: {\n    handleKeyDown(view, event) {\n      if (props.disableEnterEmit) return false\n      const hasSpecialKey = [event.shiftKey, event.ctrlKey].some((bool) => bool)\n      if (!getVisible() && event.key === 'Enter' && !hasSpecialKey) {\n        event.preventDefault()\n        const values: EnterValues = {\n          html: getHtml(),\n          text: getText(),\n        }\n        emit('enter', values)\n        return true\n      }\n      return false\n    },\n  },\n  ...props.editorOptions,\n}\nconst editor: any = useEditor(options)\n\nwatch(\n  () => props.modelValue,\n  (value) => {\n    if (!editor.value) return\n    setTextLength()\n    if (getHtml() === value) return\n    resetHtml(value)\n    setTextLength() // 异步数据源赋值时需要更新\n  }\n)\n\nwatch(\n  () => props.disabled,\n  (value: boolean) => {\n    const editable = !value\n    editor.value.setEditable(editable)\n  }\n)\n\nonMounted(() => {\n  setTextLength()\n})\n\nonBeforeUnmount(() => {\n  editor.value?.destroy()\n})\n\ndefineExpose({\n  editor,\n  getHtml,\n  getText,\n  resetHtml,\n  insertHtml,\n  setImage,\n  setVideo,\n})\n</script>\n"],"names":["_useSlots","options"],"mappings":"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"}