{"version":3,"file":"use-editor-md.mjs","sources":["../../../../../../../packages/components/editor-md/src/composables/use-editor-md.ts"],"sourcesContent":["import {\n  computed,\n  nextTick,\n  onBeforeUnmount,\n  onMounted,\n  reactive,\n  ref,\n  toRaw,\n  toRefs,\n  watch,\n} from 'vue'\n\nimport { cloneDeep, debounce, throttle } from 'lodash-unified'\n// import CodeMirror from 'codemirror'\nimport { DEFAULT_TOOLBARS, GET_ALT_KEY } from '../toolbar-config'\nimport { parseHTMLStringToDomList } from '../utils'\nimport { _enforceMaxLength, refreshEditorCursor } from './helper'\nimport type { EditorMdProps, Mode } from '../editor-md-types'\nimport type { Ref } from 'vue'\n// import 'codemirror/addon/display/placeholder.js'\n// import 'codemirror/mode/markdown/markdown.js'\n\nexport function useEditorMd(props: EditorMdProps, emits: any) {\n  const {\n    imageUploadToServer,\n    hidePreviewView,\n    mode,\n    maxlength,\n    options,\n    toolbarConfig,\n    customToolbars,\n    hintConfig,\n    disableChangeEvent,\n    modelValue,\n    beforeShowHint,\n  } = toRefs(props)\n\n  const toolbars = reactive(cloneDeep(DEFAULT_TOOLBARS))\n  const editorRef = ref()\n  const renderRef = ref()\n  const overlayRef = ref()\n  const cursorRef = ref()\n  const containerRef = ref()\n  const isHintShow = ref()\n  const previewHtmlList: Ref<any[]> = ref([])\n  let editorIns: any\n  let canPreviewScrollView = false\n\n  /* 快速提示 */\n  // let hintList: any = []\n  // const activeIndex = -1\n  let cursorHint = ''\n  let cursorHintEnd = -1\n  let cursorHintStart = -1\n  let prefix: any\n  let hintShow = false\n  let CodeMirror: any\n\n  const prefixes = computed(() => {\n    const result: string[] = []\n    for (const key in hintConfig?.value) {\n      if (\n        typeof hintConfig?.value[key] === 'function' ||\n        (hintConfig?.value[key] &&\n          typeof hintConfig?.value[key].handler === 'function')\n      ) {\n        result.push(key)\n      }\n    }\n    return result\n  })\n\n  const getEditorIns = () => editorIns\n\n  const editorScroll = () => {\n    if (editorIns && renderRef.value) {\n      const scrollInfo = editorIns.getScrollInfo()\n      const height = scrollInfo.height - scrollInfo.clientHeight\n      const ratio = Number.parseFloat(scrollInfo.top) / height\n      const preview = renderRef.value.$el\n      const move = (preview.scrollHeight - preview.clientHeight) * ratio\n      preview.scrollTop = move\n    }\n  }\n\n  const previewScroll = () => {\n    const preview = renderRef.value?.$el\n    const height = preview.scrollHeight - preview.clientHeight\n    const ratio = Number.parseFloat(preview.scrollTop) / height\n    const move =\n      (editorIns.getScrollInfo().height -\n        editorIns.getScrollInfo().clientHeight) *\n      ratio\n    editorIns.scrollTo(0, move)\n  }\n\n  const previewContentChange = (html: string) => {\n    previewHtmlList.value = []\n    const domList = parseHTMLStringToDomList(html)\n    domList.forEach((ele) => {\n      if ((ele as HTMLElement).outerHTML) {\n        previewHtmlList.value.push(ele.outerHTML)\n      }\n    })\n    setTimeout(() => {\n      editorScroll()\n    })\n    nextTick(() => {\n      emits('previewContentChange', html)\n    })\n  }\n\n  const onPreviewScroll = () => {\n    if (!canPreviewScrollView) {\n      return\n    }\n    previewScroll()\n  }\n\n  const onPreviewMouseover = () => {\n    canPreviewScrollView = true\n  }\n\n  const onPreviewMouseout = () => {\n    canPreviewScrollView = false\n  }\n\n  const onChecked = (e: string) => {\n    emits('checkedChange', e)\n  }\n\n  // const scrollToFocusItem = () => {\n  //   // setTimeout(() => {\n  //   //     if (this.focusItemElement) {\n  //   //         this.focusItemElement.scrollIntoView({behavior: 'smooth', block: 'center', inline: 'nearest' });\n  //   //     }\n  //   // });\n  // }\n\n  // const setPreviousItemActive = () => {\n  //   activeIndex = activeIndex - 1 < 0 ? hintList.length - 1 : activeIndex - 1\n  // }\n\n  // const setNextItemActive = () => {\n  //   activeIndex = activeIndex + 1 <= hintList.length - 1 ? activeIndex + 1 : 0\n  // }\n\n  // const selectHintHandler = (row: any) => {\n  //   const cursor = editorIns.getCursor()\n  //   const endCh = cursorHintEnd\n  //   let startCh\n  //   let replaceText = ''\n  //   if (customHintReplaceFn?.value) {\n  //     replaceText = customHintReplaceFn.value(prefix, row)\n  //     startCh = cursorHintStart\n  //   } else {\n  //     replaceText = row.url\n  //       ? `[${prefix + row.dispalyText}](${row.url})`\n  //       : row.dispalyText\n  //     startCh = row.url ? cursorHintStart : cursorHintStart + prefix.length\n  //   }\n  //   if (editorIns.getLine(cursor.line).length === cursor.ch) {\n  //     editorIns.replaceRange(\n  //       `${replaceText} `,\n  //       { line: cursor.line, ch: startCh },\n  //       { line: cursor.line, ch: endCh }\n  //     )\n  //   } else {\n  //     editorIns.replaceRange(\n  //       replaceText,\n  //       { line: cursor.line, ch: startCh },\n  //       { line: cursor.line, ch: endCh }\n  //     )\n  //     editorIns.setCursor(cursor.line, editorIns.getCursor().ch + 1)\n  //   }\n  //   emits('selectHint', row)\n  //   editorIns.focus()\n  //   activeIndex = -1\n  // }\n\n  let timer: any\n  const attachOverlay = () => {\n    timer = setTimeout(() => {\n      cursorRef.value =\n        editorRef.value?.parentNode.querySelector('.CodeMirror-cursor') ||\n        undefined\n\n      // overlayRef.value.updatePosition()\n      isHintShow.value = true\n      hintShow = true\n    })\n  }\n\n  const hideHint = () => {\n    clearTimeout(timer)\n    isHintShow.value = false\n  }\n\n  const showHint = () => {\n    if (hintShow) {\n      hideHint()\n    }\n    attachOverlay()\n  }\n\n  const getHintList = () => {\n    let handler\n    if (typeof hintConfig.value[prefix] === 'function') {\n      handler = hintConfig.value[prefix]\n    } else if (\n      hintConfig.value[prefix] &&\n      typeof hintConfig.value[prefix].handler === 'function'\n    ) {\n      handler = hintConfig.value[prefix].handler\n    }\n\n    const callback = (replaceText: string) => {\n      const cursor = editorIns.getCursor()\n      const endCh = cursorHintEnd\n      const startCh = cursorHintStart\n      if (editorIns.getLine(cursor.line).length === cursor.ch) {\n        editorIns.replaceRange(\n          `${replaceText} `,\n          { line: cursor.line, ch: startCh },\n          { line: cursor.line, ch: endCh }\n        )\n      } else {\n        editorIns.replaceRange(\n          replaceText,\n          { line: cursor.line, ch: startCh },\n          { line: cursor.line, ch: endCh }\n        )\n        editorIns.setCursor(cursor.line, editorIns.getCursor().ch + 1)\n      }\n      editorIns.focus()\n      hideHint()\n    }\n\n    handler && handler({ prefix, cursorHint, callback })\n  }\n\n  const cursorActivityHandler = () => {\n    const cursor = editorIns.getCursor()\n    let i = prefixes.value.length\n    const value = editorIns.getLine(cursor.line).replace(/\\t/g, ' ')\n    let result = false\n    if (beforeShowHint?.value) {\n      result = beforeShowHint.value(value)\n    }\n    if (result) {\n      return\n    }\n    const selection = editorIns.getSelection()\n    const isImgRegx = /^!\\[\\S+/\n    if (selection) {\n      return\n    }\n    let nowPrefix = ''\n    let hint = ''\n    while (i >= 1) {\n      i--\n      nowPrefix = prefixes.value[i]\n      const startPos = value.lastIndexOf(nowPrefix, cursor.ch)\n      const endPos = value.includes(' ', cursor.ch)\n        ? value.indexOf(' ', cursor.ch)\n        : value.length\n      hint = value.slice(startPos, cursor.ch)\n      if (\n        startPos < 0 ||\n        !hint.includes(nowPrefix) ||\n        hint.endsWith(' ') ||\n        isImgRegx.test(hint)\n      ) {\n        cursorHint = ''\n        cursorHintStart = -1\n        cursorHintEnd = -1\n      } else {\n        prefix = prefixes.value[i]\n        cursorHint = hint.slice(prefix.length)\n        cursorHintStart = startPos\n        cursorHintEnd = endPos\n        break\n      }\n    }\n    if (cursorHintStart > -1 && hint[0]) {\n      const spacePosition = value.lastIndexOf(' ', cursor.ch)\n      if (spacePosition > cursorHintStart) {\n        return\n      }\n      /* cursor元素将动态变更，设置settimeout保持其可以获取到值 */\n      setTimeout(() => {\n        showHint()\n        getHintList()\n      })\n    } else {\n      // hintList = []\n      hideHint()\n    }\n  }\n\n  const onChange = debounce(\n    () => {\n      const content = editorIns.getValue()\n\n      if (!disableChangeEvent.value) {\n        emits('update:modelValue', content)\n        emits('contentChange', content)\n      }\n      if (!canPreviewScrollView) {\n        editorScroll()\n      }\n    },\n    disableChangeEvent.value ? 500 : 10\n  )\n\n  function modelValueChange(val: string) {\n    if (editorIns) {\n      if (val === editorIns.getValue()) {\n        return\n      }\n      editorIns.setValue(val)\n    }\n  }\n\n  const onScroll = () => {\n    if (!canPreviewScrollView) {\n      editorScroll()\n    }\n  }\n\n  const initEditor = () => {\n    editorIns = CodeMirror?.fromTextArea(editorRef.value, {\n      mode: 'markdown',\n      lineNumbers: false,\n      lineWrapping: true,\n      ...options.value,\n    })\n\n    if (maxlength.value) {\n      editorIns.setOption('maxLength', maxlength.value)\n    }\n    editorIns.setOption('readOnly', mode.value === 'readonly')\n    const shortKeys: Record<string, any> = {}\n    const flatToolbarConfig = toRaw(toolbarConfig.value)\n    const tempToolbars = { ...toolbars, ...customToolbars?.value }\n    for (const key of Object.keys(tempToolbars)) {\n      const toolbarItem = tempToolbars[key]\n      if (\n        toolbarItem.shortKeyWithCode &&\n        flatToolbarConfig.includes(toolbarItem.id)\n      ) {\n        shortKeys[toolbarItem.shortKeyWithCode.replace(/\\+/g, '-')] =\n          toolbarItem.handler?.bind(null, editorIns, toolbarItem.params)\n      }\n    }\n\n    editorIns.setOption(\n      'extraKeys',\n      Object.assign({\n        Esc: () => {\n          hideHint()\n        },\n      }),\n      shortKeys\n    )\n\n    editorIns.on('beforeChange', _enforceMaxLength)\n\n    editorIns.on(\n      'cursorActivity',\n      throttle(\n        cursorActivityHandler,\n        ((hintConfig.value && hintConfig.value.throttleTime) as number) || 300\n      )\n    )\n\n    editorIns.setSize('auto', '100%')\n    refreshEditorCursor()\n    emits('afterEditorInit', editorIns)\n    editorIns.on('change', onChange)\n    editorIns.on('scroll', onScroll)\n    setTimeout(() => {\n      emits('contentChange', editorIns.getValue())\n    }, 100)\n\n    containerRef.value.addEventListener('keydown', (e: KeyboardEvent) => {\n      let keyCombination = ''\n      if (e.ctrlKey) {\n        keyCombination += 'Ctrl-'\n      }\n      if (e.metaKey) {\n        keyCombination += '⌘-'\n      }\n      if (e.altKey) {\n        keyCombination += `${GET_ALT_KEY()}-`\n      }\n      if (e.shiftKey) {\n        keyCombination += 'Shift-'\n      }\n\n      // keyCombination += e.keyCode\n      keyCombination += e.code\n      if (\n        shortKeys[keyCombination] &&\n        typeof shortKeys[keyCombination] === 'function'\n      ) {\n        e.preventDefault()\n        shortKeys[keyCombination]()\n      }\n    })\n\n    modelValueChange(modelValue.value || '')\n  }\n\n  const onPaste = (e: ClipboardEvent) => {\n    const clipboardData = e.clipboardData\n    if (!(clipboardData && clipboardData.items)) {\n      return\n    }\n\n    if (clipboardData.items.length <= 3) {\n      for (let i = 0; i < clipboardData.items.length; i++) {\n        const item = clipboardData.items[i]\n        if (item.kind === 'file' && item.type.includes('image')) {\n          const file = item.getAsFile()\n          if (file?.size === 0) {\n            return\n          }\n\n          if (imageUploadToServer.value) {\n            const callback = ({ name, imgUrl, title }: any) => {\n              editorIns.focus()\n              editorIns.replaceSelection(`![${name}](${imgUrl} '${title}')`)\n            }\n            emits('imageUpload', { file, callback })\n          }\n        }\n      }\n    }\n  }\n\n  const onDocumentClick = (e: Event) => {\n    if (\n      isHintShow.value &&\n      e.target !== containerRef.value &&\n      !containerRef.value?.contains(e.target)\n    ) {\n      hideHint()\n    }\n  }\n\n  onMounted(async () => {\n    if (!CodeMirror) {\n      await import('codemirror/addon/display/placeholder.js')\n      await import('codemirror/mode/markdown/markdown.js')\n      const module = await import('codemirror')\n      CodeMirror = module.default\n    }\n    initEditor()\n    document.addEventListener('click', onDocumentClick)\n  })\n\n  onBeforeUnmount(() => {\n    document.removeEventListener('click', onDocumentClick)\n  })\n\n  watch(modelValue, modelValueChange)\n\n  watch(\n    imageUploadToServer,\n    (val: boolean) => {\n      if (toolbars['image'].params) {\n        toolbars['image'].params.imageUploadToServer = val\n      }\n      if (toolbars['image'].params && !toolbars['image'].params.imageUpload) {\n        toolbars['image'].params.imageUpload = (data: any) => {\n          emits('imageUpload', data)\n        }\n      }\n    },\n    { immediate: true }\n  )\n\n  watch(hidePreviewView, () => {\n    refreshEditorCursor()\n  })\n\n  watch(mode, (val: Mode) => {\n    setTimeout(() => {\n      if (editorIns) {\n        refreshEditorCursor()\n        editorIns.setOption('readOnly', val === 'readonly')\n      }\n    })\n  })\n\n  watch(maxlength, (val: number) => {\n    if (editorIns) {\n      editorIns.setOption('maxLength', val)\n    }\n  })\n\n  return {\n    editorRef,\n    overlayRef,\n    cursorRef,\n    renderRef,\n    containerRef,\n    toolbars,\n    toolbarConfig,\n    previewHtmlList,\n    isHintShow,\n    customToolbars,\n    getEditorIns,\n    onPaste,\n    previewContentChange,\n    onChecked,\n    onPreviewScroll,\n    onPreviewMouseout,\n    onPreviewMouseover,\n  }\n}\n"],"names":[],"mappings":"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"}