@opentiny/fluent-editor 3.20.0 → 3.20.2-alpha.0

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.
Files changed (166) hide show
  1. package/es/attributors/index.es.js +1 -1
  2. package/es/config/base64-image.es.js.map +1 -1
  3. package/es/config/editor.config.es.js.map +1 -1
  4. package/es/config/editor.utils.es.js +12 -12
  5. package/es/config/editor.utils.es.js.map +1 -1
  6. package/es/{config.es.js → config/index.es.js} +14 -7
  7. package/es/config/index.es.js.map +1 -0
  8. package/es/config/types/index.es.js +2 -2
  9. package/es/counter/index.es.js +2 -1
  10. package/es/counter/index.es.js.map +1 -1
  11. package/es/custom-clipboard.es.js +14 -14
  12. package/es/custom-clipboard.es.js.map +1 -1
  13. package/es/custom-image/BlotFormatter.es.js +1 -1
  14. package/es/custom-image/BlotFormatter.es.js.map +1 -1
  15. package/es/custom-image/actions/CustomResizeAction.es.js +6 -4
  16. package/es/custom-image/actions/CustomResizeAction.es.js.map +1 -1
  17. package/es/custom-image/image.es.js +3 -3
  18. package/es/custom-image/image.es.js.map +1 -1
  19. package/es/custom-image/specs/BlotSpec.es.js.map +1 -1
  20. package/es/custom-uploader.es.js +4 -7
  21. package/es/custom-uploader.es.js.map +1 -1
  22. package/es/emoji/emoji-list/people.es.js.map +1 -1
  23. package/es/emoji/formats/emoji-blot.es.js +2 -2
  24. package/es/emoji/formats/emoji-blot.es.js.map +1 -1
  25. package/es/emoji/modules/emoji.es.js +7 -7
  26. package/es/emoji/modules/emoji.es.js.map +1 -1
  27. package/es/emoji/modules/toolbar-emoji.es.js +15 -15
  28. package/es/emoji/modules/toolbar-emoji.es.js.map +1 -1
  29. package/es/file/modules/file-bar.es.js +3 -3
  30. package/es/file/modules/file-bar.es.js.map +1 -1
  31. package/es/fluent-editor.es.js +4 -4
  32. package/es/fluent-editor.es.js.map +1 -1
  33. package/es/format-painter/index.es.js.map +1 -1
  34. package/es/global-link/formats/work-item-link.es.js.map +1 -1
  35. package/es/global-link/index.es.js +1 -1
  36. package/es/global-link/index.es.js.map +1 -1
  37. package/es/index.es.js +17 -1
  38. package/es/index.es.js.map +1 -1
  39. package/es/link/formats/link.es.js +1 -1
  40. package/es/link/formats/link.es.js.map +1 -1
  41. package/es/link/index.es.js.map +1 -1
  42. package/es/link/modules/tooltip.es.js +3 -3
  43. package/es/link/modules/tooltip.es.js.map +1 -1
  44. package/es/mention/Mention.es.js +7 -12
  45. package/es/mention/Mention.es.js.map +1 -1
  46. package/es/quick-menu/index.es.js +1 -1
  47. package/es/quick-menu/index.es.js.map +1 -1
  48. package/es/screenshot/index.es.js +42 -7
  49. package/es/screenshot/index.es.js.map +1 -1
  50. package/es/strike/index.es.js.map +1 -1
  51. package/es/syntax/index.es.js.map +1 -1
  52. package/es/table/better-table.es.js +4 -5
  53. package/es/table/better-table.es.js.map +1 -1
  54. package/es/table/formats/list.es.js +3 -3
  55. package/es/table/formats/list.es.js.map +1 -1
  56. package/es/table/formats/table.es.js +26 -27
  57. package/es/table/formats/table.es.js.map +1 -1
  58. package/es/table/modules/table-column-tool.es.js +8 -8
  59. package/es/table/modules/table-column-tool.es.js.map +1 -1
  60. package/es/table/modules/table-operation-menu.es.js +7 -8
  61. package/es/table/modules/table-operation-menu.es.js.map +1 -1
  62. package/es/table/modules/table-scroll-bar.es.js +1 -1
  63. package/es/table/modules/table-scroll-bar.es.js.map +1 -1
  64. package/es/table/modules/table-selection.es.js +0 -1
  65. package/es/table/modules/table-selection.es.js.map +1 -1
  66. package/es/table/utils/node-matchers.es.js +14 -14
  67. package/es/table/utils/node-matchers.es.js.map +1 -1
  68. package/es/toolbar/better-picker.es.js.map +1 -1
  69. package/es/toolbar/index.es.js +1 -1
  70. package/es/toolbar/index.es.js.map +1 -1
  71. package/es/utils/debounce.es.js.map +1 -1
  72. package/es/utils/image.es.js +26 -0
  73. package/es/utils/image.es.js.map +1 -0
  74. package/es/utils/method.es.js +2 -2
  75. package/es/utils/method.es.js.map +1 -1
  76. package/es/utils/scroll-lock.es.js +47 -0
  77. package/es/utils/scroll-lock.es.js.map +1 -0
  78. package/es/video/index.es.js +6 -3
  79. package/es/video/index.es.js.map +1 -1
  80. package/lib/attributors/index.cjs.js +2 -2
  81. package/lib/config/base64-image.cjs.js.map +1 -1
  82. package/lib/config/editor.config.cjs.js.map +1 -1
  83. package/lib/config/editor.utils.cjs.js +12 -12
  84. package/lib/config/editor.utils.cjs.js.map +1 -1
  85. package/lib/{config.cjs.js → config/index.cjs.js} +27 -21
  86. package/lib/config/index.cjs.js.map +1 -0
  87. package/lib/config/types/index.cjs.js +2 -2
  88. package/lib/counter/index.cjs.js +5 -4
  89. package/lib/counter/index.cjs.js.map +1 -1
  90. package/lib/custom-clipboard.cjs.js +14 -14
  91. package/lib/custom-clipboard.cjs.js.map +1 -1
  92. package/lib/custom-image/BlotFormatter.cjs.js +1 -1
  93. package/lib/custom-image/BlotFormatter.cjs.js.map +1 -1
  94. package/lib/custom-image/actions/CustomResizeAction.cjs.js +6 -4
  95. package/lib/custom-image/actions/CustomResizeAction.cjs.js.map +1 -1
  96. package/lib/custom-image/image.cjs.js +3 -3
  97. package/lib/custom-image/image.cjs.js.map +1 -1
  98. package/lib/custom-image/specs/BlotSpec.cjs.js.map +1 -1
  99. package/lib/custom-uploader.cjs.js +4 -7
  100. package/lib/custom-uploader.cjs.js.map +1 -1
  101. package/lib/emoji/emoji-list/people.cjs.js.map +1 -1
  102. package/lib/emoji/formats/emoji-blot.cjs.js +2 -2
  103. package/lib/emoji/formats/emoji-blot.cjs.js.map +1 -1
  104. package/lib/emoji/modules/emoji.cjs.js +7 -7
  105. package/lib/emoji/modules/emoji.cjs.js.map +1 -1
  106. package/lib/emoji/modules/toolbar-emoji.cjs.js +15 -15
  107. package/lib/emoji/modules/toolbar-emoji.cjs.js.map +1 -1
  108. package/lib/file/modules/file-bar.cjs.js +3 -3
  109. package/lib/file/modules/file-bar.cjs.js.map +1 -1
  110. package/lib/fluent-editor.cjs.js +32 -32
  111. package/lib/fluent-editor.cjs.js.map +1 -1
  112. package/lib/format-painter/index.cjs.js.map +1 -1
  113. package/lib/global-link/formats/work-item-link.cjs.js.map +1 -1
  114. package/lib/global-link/index.cjs.js +1 -1
  115. package/lib/global-link/index.cjs.js.map +1 -1
  116. package/lib/index.cjs.js +16 -0
  117. package/lib/index.cjs.js.map +1 -1
  118. package/lib/link/formats/link.cjs.js +1 -1
  119. package/lib/link/formats/link.cjs.js.map +1 -1
  120. package/lib/link/index.cjs.js.map +1 -1
  121. package/lib/link/modules/tooltip.cjs.js +3 -3
  122. package/lib/link/modules/tooltip.cjs.js.map +1 -1
  123. package/lib/mention/Mention.cjs.js +7 -12
  124. package/lib/mention/Mention.cjs.js.map +1 -1
  125. package/lib/quick-menu/index.cjs.js +1 -1
  126. package/lib/quick-menu/index.cjs.js.map +1 -1
  127. package/lib/screenshot/index.cjs.js +44 -9
  128. package/lib/screenshot/index.cjs.js.map +1 -1
  129. package/lib/strike/index.cjs.js.map +1 -1
  130. package/lib/syntax/index.cjs.js.map +1 -1
  131. package/lib/table/better-table.cjs.js +4 -5
  132. package/lib/table/better-table.cjs.js.map +1 -1
  133. package/lib/table/formats/list.cjs.js +3 -3
  134. package/lib/table/formats/list.cjs.js.map +1 -1
  135. package/lib/table/formats/table.cjs.js +26 -27
  136. package/lib/table/formats/table.cjs.js.map +1 -1
  137. package/lib/table/modules/table-column-tool.cjs.js +8 -8
  138. package/lib/table/modules/table-column-tool.cjs.js.map +1 -1
  139. package/lib/table/modules/table-operation-menu.cjs.js +7 -8
  140. package/lib/table/modules/table-operation-menu.cjs.js.map +1 -1
  141. package/lib/table/modules/table-scroll-bar.cjs.js +1 -1
  142. package/lib/table/modules/table-scroll-bar.cjs.js.map +1 -1
  143. package/lib/table/modules/table-selection.cjs.js +0 -1
  144. package/lib/table/modules/table-selection.cjs.js.map +1 -1
  145. package/lib/table/utils/node-matchers.cjs.js +14 -14
  146. package/lib/table/utils/node-matchers.cjs.js.map +1 -1
  147. package/lib/toolbar/better-picker.cjs.js.map +1 -1
  148. package/lib/toolbar/index.cjs.js +1 -1
  149. package/lib/toolbar/index.cjs.js.map +1 -1
  150. package/lib/utils/debounce.cjs.js.map +1 -1
  151. package/lib/utils/image.cjs.js +26 -0
  152. package/lib/utils/image.cjs.js.map +1 -0
  153. package/lib/utils/method.cjs.js +2 -2
  154. package/lib/utils/method.cjs.js.map +1 -1
  155. package/lib/utils/scroll-lock.cjs.js +47 -0
  156. package/lib/utils/scroll-lock.cjs.js.map +1 -0
  157. package/lib/video/index.cjs.js +6 -3
  158. package/lib/video/index.cjs.js.map +1 -1
  159. package/package.json +16 -28
  160. package/{theme/style.css → style.css} +86 -17
  161. package/es/config.es.js.map +0 -1
  162. package/es/types/vue.d.es.js +0 -2
  163. package/es/types/vue.d.es.js.map +0 -1
  164. package/lib/config.cjs.js.map +0 -1
  165. package/lib/types/vue.d.cjs.js +0 -2
  166. package/lib/types/vue.d.cjs.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Mention.cjs.js","sources":["../../../src/mention/Mention.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { isNullOrUndefined } from '../config/editor.utils'\r\nimport { DEFAULT_MENTION_CHAR, ON_MENTION_LINK_REMOVE } from './constants'\r\nimport MentionLink from './MentionLink'\r\n\r\nconst { Scope } = Quill.imports['parchment']\r\nconst Delta = Quill.imports['delta']\r\n\r\ninterface MentionOption {\r\n containerClass?: string\r\n dataAttributes?: string[]\r\n defaultLink?: string\r\n itemActiveClass?: string\r\n itemKey: string\r\n itemClass?: string\r\n listClass?: string\r\n listHideClass?: string\r\n maxHeight?: number\r\n mentionChar?: string\r\n remove?: (data: any) => void\r\n renderMentionItem?: (data: any) => string | HTMLElement\r\n renderMentionText?: (data: any) => string | HTMLElement\r\n search?: (term: string) => Promise<any[]>\r\n searchKey: string\r\n select?: (data: any) => void\r\n target?: string\r\n}\r\n\r\n// @dynamic\r\nclass Mention {\r\n private readonly options: MentionOption\r\n private readonly mentionListEL: HTMLUListElement\r\n private activeMentionIndex = 0\r\n private latestMentionList: any[]\r\n private latestMentionCharPos: number\r\n private latestCaretPos: number\r\n private searchTerm = ''\r\n private needInsertBr = true\r\n private readonly defaultOptions: MentionOption = {\r\n defaultLink: '#',\r\n target: '_blank',\r\n mentionChar: DEFAULT_MENTION_CHAR,\r\n maxHeight: 200,\r\n renderMentionItem(data: any) {\r\n let mentionItem = data.name || data.id\r\n if (this.itemKey) {\r\n mentionItem = data[this.itemKey]\r\n }\r\n const dom = document.createElement('SPAN')\r\n dom.textContent = mentionItem\r\n return dom\r\n },\r\n renderMentionText(data: any) {\r\n let mentionText = data.name || data.id\r\n if (this.itemKey) {\r\n mentionText = data[this.itemKey]\r\n }\r\n return `${mentionText}`\r\n },\r\n containerClass: 'ql-mention-list-container',\r\n listClass: 'ql-mention-list',\r\n listHideClass: 'ql-mention-list--hide',\r\n itemClass: 'ql-mention-item',\r\n itemActiveClass: 'ql-mention-item--active',\r\n itemKey: 'name',\r\n searchKey: 'name',\r\n dataAttributes: ['id'],\r\n select(_data: any) {},\r\n remove(_data: any) {},\r\n }\r\n\r\n static register() {\r\n Quill.register(MentionLink)\r\n }\r\n\r\n // @ts-ignore\r\n constructor(private quill: Quill, options: MentionOption) {\r\n if (!options.search) {\r\n console.warn('please provide a search function!')\r\n return\r\n }\r\n\r\n this.options = Object.assign(this.defaultOptions, options)\r\n const container = document.createElement('div')\r\n container.classList.add('ql-mention-list-container')\r\n if (this.options.containerClass !== 'ql-mention-list-container') {\r\n container.classList.add(this.options.containerClass)\r\n }\r\n this.mentionListEL = document.createElement('ul')\r\n this.mentionListEL.classList.add(this.options.listClass, this.options.listHideClass)\r\n this.mentionListEL.style.cssText += `\r\n max-height: ${this.options.maxHeight}px;\r\n `\r\n\r\n quill.on(Quill.events.TEXT_CHANGE, this.handleTextChange)\r\n quill.keyboard.addBinding({ key: 'ArrowUp' }, this.handleArrowUpKey)\r\n quill.keyboard.addBinding({ key: 'ArrowDown' }, this.handleArrowDownKey)\r\n quill.keyboard.addBinding({ key: 'Enter' }, this.handleEnterKey)\r\n quill.keyboard.addBinding({ key: 'Tab' }, this.handleEnterKey)\r\n quill.keyboard.addBinding({ key: 'Escape' }, this.handleEscapeKey)\r\n quill.keyboard.bindings['Enter'].unshift(quill.keyboard.bindings['Enter'].pop())\r\n quill.keyboard.bindings['Tab'].unshift(quill.keyboard.bindings['Tab'].pop())\r\n quill.keyboard.bindings['Escape'].unshift(quill.keyboard.bindings['Escape'].pop())\r\n\r\n const customKeyboardEnter = {\r\n key: 'Enter',\r\n shiftKey: null,\r\n handler: (range, context) => {\r\n const lineFormats = Object.keys(context.format).reduce(\r\n (formats, format) => {\r\n if (\r\n this.quill.scroll.query(format, Scope.BLOCK)\r\n && !Array.isArray(context.format[format])\r\n ) {\r\n formats[format] = context.format[format]\r\n }\r\n return formats\r\n },\r\n {},\r\n )\r\n\r\n // fix: 解决@提醒之后插入多余空行和光标位置不对的问题\r\n let selectionIndex = range.index - this.searchTerm.length\r\n let delta = new Delta()\r\n .retain(range.index)\r\n .delete(range.length)\r\n if (this.needInsertBr) {\r\n delta = delta.insert('\\n', lineFormats)\r\n selectionIndex = range.index + 1\r\n }\r\n\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(selectionIndex, Quill.sources.SILENT)\r\n this.quill.focus()\r\n\r\n Object.keys(context.format).forEach((name) => {\r\n if (!isNullOrUndefined(lineFormats[name])) return\r\n if (Array.isArray(context.format[name])) return\r\n if (name === 'code' || name === 'link') return\r\n this.quill.format(name, context.format[name], Quill.sources.USER)\r\n })\r\n\r\n this.needInsertBr = true // 标记是否是输入@提醒的Enter\r\n },\r\n }\r\n\r\n // 用自定义的Enter替换内置的Enter\r\n quill.keyboard.bindings['Enter'] = quill.keyboard.bindings['Enter'].map((item) => {\r\n const buildinKeyboardEnter = item.format === undefined && item.shiftKey === null\r\n if (buildinKeyboardEnter) {\r\n return customKeyboardEnter\r\n }\r\n else {\r\n return item\r\n }\r\n })\r\n\r\n this.on('click', this.handleMouseClick)\r\n this.on('mouseover', this.handleMouseEnter)\r\n quill.emitter.on(ON_MENTION_LINK_REMOVE, async ({ mention, name }) => {\r\n const [result] = (mention && [mention]) || (await this.options.search(name))\r\n this.options.remove(result)\r\n })\r\n container.appendChild(this.mentionListEL)\r\n quill.container.parentElement.insertBefore(container, quill.container)\r\n }\r\n\r\n on(eventName, callback) {\r\n this.mentionListEL.addEventListener(eventName, (evt) => {\r\n let\r\n target = evt.target\r\n let targetItemEL\r\n\r\n while (this.mentionListEL.contains(target) && target !== this.mentionListEL) {\r\n if (target.classList.contains(this.options.itemClass)) {\r\n targetItemEL = target\r\n }\r\n target = target.parentElement\r\n }\r\n\r\n if (targetItemEL) {\r\n callback.call(this, targetItemEL, this.getMentionItemIndex(targetItemEL))\r\n }\r\n })\r\n }\r\n\r\n getMentionItemIndex(itemEl: Element) {\r\n return [].reduce.call(this.mentionListEL.children,\r\n (index, item, idx) => item === itemEl ? idx : index, -1)\r\n }\r\n\r\n handleTextChange = (_delta, _oldDelta, source) => {\r\n // defer handler to make sure that we can get correct quill selection range.\r\n setTimeout(() => {\r\n if (Quill.sources.USER === source) {\r\n const range = this.quill.getSelection()\r\n if (!range) {\r\n return\r\n }\r\n\r\n const caretPos = this.latestCaretPos = range.index\r\n // beforeCaretText的计算有问题,没有把图片内容和@提醒内容的非字符内容算进去\r\n const content = this.quill.getContents()\r\n const beforeCaretText = content.reduce((newText, op) => {\r\n if (typeof op.insert === 'string') {\r\n // eslint-disable-next-line no-return-assign\r\n return (newText += op.insert)\r\n }\r\n else {\r\n // eslint-disable-next-line no-return-assign\r\n return (newText += ' ') // 将图片内容和@提醒内容的非字符内容置为' ',算一个位置\r\n }\r\n }, '')\r\n const mentionCharPos = beforeCaretText.lastIndexOf(this.options.mentionChar)\r\n\r\n if (mentionCharPos > -1) {\r\n const searchTerm = beforeCaretText.substring(mentionCharPos + this.options.mentionChar.length, caretPos)\r\n this.searchTerm = searchTerm\r\n if (!''.startsWith.call(searchTerm, ' ')) {\r\n this.latestMentionCharPos = mentionCharPos\r\n this.searchMentionListByTerm(searchTerm)\r\n }\r\n else {\r\n this.hideMentionList()\r\n }\r\n }\r\n else {\r\n this.hideMentionList()\r\n }\r\n }\r\n })\r\n }\r\n\r\n handleMouseClick(_itemEl: HTMLLIElement, index: number) {\r\n this.selectMentionItem(index, true)\r\n this.quill.focus()\r\n }\r\n\r\n handleMouseEnter(_itemEl: HTMLLIElement, index: number) {\r\n this.activeMentionIndex = index\r\n this.highlightMentionItem(index)\r\n }\r\n\r\n handleArrowUpKey = () => {\r\n if (this.isOpen()) {\r\n this.activeMentionIndex\r\n = (this.activeMentionIndex + this.latestMentionList.length - 1) % this.latestMentionList.length\r\n this.highlightMentionItem(this.activeMentionIndex)\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n handleArrowDownKey = () => {\r\n if (this.isOpen()) {\r\n this.activeMentionIndex = (this.activeMentionIndex + 1) % this.latestMentionList.length\r\n this.highlightMentionItem(this.activeMentionIndex)\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n handleEnterKey = () => {\r\n if (this.isOpen()) {\r\n this.selectMentionItem()\r\n this.needInsertBr = false\r\n }\r\n return true\r\n }\r\n\r\n handleEscapeKey = () => {\r\n if (this.isOpen()) {\r\n this.hideMentionList()\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n getActiveMentionItem() {\r\n return this.mentionListEL.querySelector(`.${this.options.itemActiveClass}`)\r\n }\r\n\r\n isOpen() {\r\n return !this.mentionListEL.classList.contains(this.options.listHideClass)\r\n }\r\n\r\n async searchMentionListByTerm(term: string) {\r\n const mentionList = await this.options.search(term)\r\n this.latestMentionList = mentionList\r\n if (!mentionList || mentionList.length === 0) {\r\n return this.hideMentionList()\r\n }\r\n\r\n this.showMentionList(mentionList)\r\n }\r\n\r\n showMentionList(mentionList: any[]) {\r\n if (!this.isOpen()) {\r\n this.mentionListEL.classList.remove(this.options.listHideClass)\r\n }\r\n this.activeMentionIndex = 0\r\n this.setMentionListPos()\r\n this.render(mentionList)\r\n }\r\n\r\n hideMentionList() {\r\n if (this.isOpen()) {\r\n this.activeMentionIndex = 0\r\n this.mentionListEL.classList.add(this.options.listHideClass)\r\n }\r\n }\r\n\r\n setMentionListPos() {\r\n const cursorIndex = this.quill.selection.savedRange.index\r\n const cursorBounds = this.quill.getBounds(cursorIndex)\r\n const { left, top } = cursorBounds\r\n const container = this.quill.container\r\n const hostElement = container.parentNode as HTMLDivElement\r\n const { left: editorLeft, top: editorTop } = container.getBoundingClientRect()\r\n const { left: hostElementLeft, top: hostElementTop } = hostElement.getBoundingClientRect()\r\n const relativeLeft = editorLeft - hostElementLeft\r\n const relativeTop = editorTop - hostElementTop\r\n const menuLeft = left + relativeLeft - 5\r\n const menuTop = top + relativeTop + 20\r\n this.mentionListEL.style.cssText += `\r\n left: ${menuLeft}px;\r\n top: ${menuTop}px;\r\n `\r\n }\r\n\r\n render(mentionList: any[]) {\r\n const wrapEl = document.createElement('div');\r\n\r\n [].forEach.call(mentionList, (mentionItem, index) => {\r\n const mentionItemEl = document.createElement('li')\r\n mentionItemEl.classList.add(this.options.itemClass)\r\n if (index === this.activeMentionIndex) {\r\n mentionItemEl.classList.add(this.options.itemActiveClass)\r\n }\r\n const renderResult = this.options.renderMentionItem(mentionItem)\r\n if (typeof renderResult === 'string') {\r\n mentionItemEl.insertAdjacentHTML('afterbegin', renderResult)\r\n }\r\n else {\r\n mentionItemEl.insertAdjacentElement('afterbegin', renderResult)\r\n }\r\n wrapEl.appendChild(mentionItemEl)\r\n })\r\n\r\n this.mentionListEL.innerHTML = wrapEl.innerHTML\r\n }\r\n\r\n highlightMentionItem(index: number) {\r\n const oldActiveItem = this.getActiveMentionItem()\r\n if (oldActiveItem) {\r\n oldActiveItem.classList.remove(this.options.itemActiveClass)\r\n }\r\n\r\n const newActiveItem = this.mentionListEL.querySelector(`.${this.options.itemClass}:nth-of-type(${index + 1})`)\r\n if (newActiveItem) {\r\n newActiveItem.classList.add(this.options.itemActiveClass)\r\n this.scrollIntoView(newActiveItem)\r\n }\r\n }\r\n\r\n scrollIntoView(node: Element): void {\r\n const nodeAsAny: any = node\r\n if (nodeAsAny.scrollIntoViewIfNeeded) {\r\n nodeAsAny.scrollIntoViewIfNeeded(false)\r\n return\r\n }\r\n if (node.scrollIntoView) {\r\n node.scrollIntoView(false)\r\n return\r\n }\r\n }\r\n\r\n selectMentionItem(index = this.activeMentionIndex, isClick?: boolean) {\r\n const activeMentionItem = this.latestMentionList[index]\r\n this.insertMentionBlot(activeMentionItem, isClick)\r\n this.options.select(activeMentionItem)\r\n this.hideMentionList()\r\n }\r\n\r\n insertMentionBlot(activeMentionItem: any, isClick?: boolean) {\r\n const mention = this.options.renderMentionText(activeMentionItem)\r\n const delta = new Delta()\r\n .retain(this.latestMentionCharPos)\r\n .delete(this.latestCaretPos - this.latestMentionCharPos)\r\n .insert({\r\n [MentionLink.blotName]: {\r\n char: this.options.mentionChar,\r\n text: mention,\r\n mention: activeMentionItem,\r\n link: this.options.defaultLink,\r\n target: this.options.target,\r\n searchKey: this.options.searchKey,\r\n },\r\n })\r\n if (isClick) {\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n }\r\n else {\r\n this.quill.updateContents(delta, Quill.sources.API)\r\n }\r\n this.quill.setSelection(this.latestMentionCharPos + 1, Quill.sources.API)\r\n }\r\n}\r\n\r\nexport { Mention as default }\r\n"],"names":["DEFAULT_MENTION_CHAR","isNullOrUndefined","ON_MENTION_LINK_REMOVE","MentionLink"],"mappings":"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"}
1
+ {"version":3,"file":"Mention.cjs.js","sources":["../../../src/mention/Mention.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { isNullOrUndefined } from '../config/editor.utils'\r\nimport { DEFAULT_MENTION_CHAR, ON_MENTION_LINK_REMOVE } from './constants'\r\nimport MentionLink from './MentionLink'\r\n\r\nconst { Scope } = Quill.imports.parchment\r\nconst Delta = Quill.imports.delta\r\n\r\ninterface MentionOption {\r\n containerClass?: string\r\n dataAttributes?: string[]\r\n defaultLink?: string\r\n itemActiveClass?: string\r\n itemKey: string\r\n itemClass?: string\r\n listClass?: string\r\n listHideClass?: string\r\n maxHeight?: number\r\n mentionChar?: string\r\n remove?: (data: any) => void\r\n renderMentionItem?: (data: any) => string | HTMLElement\r\n renderMentionText?: (data: any) => string | HTMLElement\r\n search?: (term: string) => Promise<any[]>\r\n searchKey: string\r\n select?: (data: any) => void\r\n target?: string\r\n}\r\n\r\n// @dynamic\r\nclass Mention {\r\n private readonly options: MentionOption\r\n private readonly mentionListEL: HTMLUListElement\r\n private activeMentionIndex = 0\r\n private latestMentionList: any[]\r\n private latestMentionCharPos: number\r\n private latestCaretPos: number\r\n private searchTerm = ''\r\n private needInsertBr = true\r\n private readonly defaultOptions: MentionOption = {\r\n defaultLink: '#',\r\n target: '_blank',\r\n mentionChar: DEFAULT_MENTION_CHAR,\r\n maxHeight: 200,\r\n renderMentionItem(data: any) {\r\n let mentionItem = data.name || data.id\r\n if (this.itemKey) {\r\n mentionItem = data[this.itemKey]\r\n }\r\n const dom = document.createElement('SPAN')\r\n dom.textContent = mentionItem\r\n return dom\r\n },\r\n renderMentionText(data: any) {\r\n let mentionText = data.name || data.id\r\n if (this.itemKey) {\r\n mentionText = data[this.itemKey]\r\n }\r\n return `${mentionText}`\r\n },\r\n containerClass: 'ql-mention-list-container',\r\n listClass: 'ql-mention-list',\r\n listHideClass: 'ql-mention-list--hide',\r\n itemClass: 'ql-mention-item',\r\n itemActiveClass: 'ql-mention-item--active',\r\n itemKey: 'name',\r\n searchKey: 'name',\r\n dataAttributes: ['id'],\r\n select(_data: any) {},\r\n remove(_data: any) {},\r\n }\r\n\r\n static register() {\r\n Quill.register(MentionLink)\r\n }\r\n\r\n // @ts-ignore\r\n constructor(private quill: Quill, options: MentionOption) {\r\n if (!options.search) {\r\n console.warn('please provide a search function!')\r\n return\r\n }\r\n\r\n this.options = Object.assign(this.defaultOptions, options)\r\n const container = document.createElement('div')\r\n container.classList.add('ql-mention-list-container')\r\n if (this.options.containerClass !== 'ql-mention-list-container') {\r\n container.classList.add(this.options.containerClass)\r\n }\r\n this.mentionListEL = document.createElement('ul')\r\n this.mentionListEL.classList.add(this.options.listClass, this.options.listHideClass)\r\n this.mentionListEL.style.cssText += `\r\n max-height: ${this.options.maxHeight}px;\r\n `\r\n\r\n quill.on(Quill.events.TEXT_CHANGE, this.handleTextChange)\r\n quill.keyboard.addBinding({ key: 'ArrowUp' }, this.handleArrowUpKey)\r\n quill.keyboard.addBinding({ key: 'ArrowDown' }, this.handleArrowDownKey)\r\n quill.keyboard.addBinding({ key: 'Enter' }, this.handleEnterKey)\r\n quill.keyboard.addBinding({ key: 'Tab' }, this.handleEnterKey)\r\n quill.keyboard.addBinding({ key: 'Escape' }, this.handleEscapeKey)\r\n quill.keyboard.bindings.Enter.unshift(quill.keyboard.bindings.Enter.pop())\r\n quill.keyboard.bindings.Tab.unshift(quill.keyboard.bindings.Tab.pop())\r\n quill.keyboard.bindings.Escape.unshift(quill.keyboard.bindings.Escape.pop())\r\n\r\n const customKeyboardEnter = {\r\n key: 'Enter',\r\n shiftKey: null,\r\n handler: (range, context) => {\r\n const lineFormats = Object.keys(context.format).reduce(\r\n (formats, format) => {\r\n if (\r\n this.quill.scroll.query(format, Scope.BLOCK)\r\n && !Array.isArray(context.format[format])\r\n ) {\r\n formats[format] = context.format[format]\r\n }\r\n return formats\r\n },\r\n {},\r\n )\r\n\r\n // fix: 解决@提醒之后插入多余空行和光标位置不对的问题\r\n let selectionIndex = range.index - this.searchTerm.length\r\n let delta = new Delta()\r\n .retain(range.index)\r\n .delete(range.length)\r\n if (this.needInsertBr) {\r\n delta = delta.insert('\\n', lineFormats)\r\n selectionIndex = range.index + 1\r\n }\r\n\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(selectionIndex, Quill.sources.SILENT)\r\n this.quill.focus()\r\n\r\n Object.keys(context.format).forEach((name) => {\r\n if (!isNullOrUndefined(lineFormats[name])) return\r\n if (Array.isArray(context.format[name])) return\r\n if (name === 'code' || name === 'link') return\r\n this.quill.format(name, context.format[name], Quill.sources.USER)\r\n })\r\n\r\n this.needInsertBr = true // 标记是否是输入@提醒的Enter\r\n },\r\n }\r\n\r\n // 用自定义的Enter替换内置的Enter\r\n quill.keyboard.bindings.Enter = quill.keyboard.bindings.Enter.map((item) => {\r\n const buildinKeyboardEnter = item.format === undefined && item.shiftKey === null\r\n if (buildinKeyboardEnter) {\r\n return customKeyboardEnter\r\n }\r\n else {\r\n return item\r\n }\r\n })\r\n\r\n this.on('click', this.handleMouseClick)\r\n this.on('mouseover', this.handleMouseEnter)\r\n quill.emitter.on(ON_MENTION_LINK_REMOVE, async ({ mention, name }) => {\r\n const [result] = (mention && [mention]) || (await this.options.search(name))\r\n this.options.remove(result)\r\n })\r\n container.appendChild(this.mentionListEL)\r\n quill.container.parentElement.insertBefore(container, quill.container)\r\n }\r\n\r\n on(eventName, callback) {\r\n this.mentionListEL.addEventListener(eventName, (evt) => {\r\n let\r\n target = evt.target\r\n let targetItemEL\r\n\r\n while (this.mentionListEL.contains(target) && target !== this.mentionListEL) {\r\n if (target.classList.contains(this.options.itemClass)) {\r\n targetItemEL = target\r\n }\r\n target = target.parentElement\r\n }\r\n\r\n if (targetItemEL) {\r\n callback.call(this, targetItemEL, this.getMentionItemIndex(targetItemEL))\r\n }\r\n })\r\n }\r\n\r\n getMentionItemIndex(itemEl: Element) {\r\n return [].reduce.call(this.mentionListEL.children, (index, item, idx) => item === itemEl ? idx : index, -1)\r\n }\r\n\r\n handleTextChange = (_delta, _oldDelta, source) => {\r\n // defer handler to make sure that we can get correct quill selection range.\r\n setTimeout(() => {\r\n if (Quill.sources.USER === source) {\r\n const range = this.quill.getSelection()\r\n if (!range) {\r\n return\r\n }\r\n\r\n const caretPos = this.latestCaretPos = range.index\r\n // beforeCaretText的计算有问题,没有把图片内容和@提醒内容的非字符内容算进去\r\n const content = this.quill.getContents()\r\n const beforeCaretText = content.reduce((newText, op) => {\r\n if (typeof op.insert === 'string') {\r\n return (newText += op.insert)\r\n }\r\n else {\r\n return (newText += ' ') // 将图片内容和@提醒内容的非字符内容置为' ',算一个位置\r\n }\r\n }, '')\r\n const mentionCharPos = beforeCaretText.lastIndexOf(this.options.mentionChar)\r\n\r\n if (mentionCharPos > -1) {\r\n const searchTerm = beforeCaretText.substring(mentionCharPos + this.options.mentionChar.length, caretPos)\r\n this.searchTerm = searchTerm\r\n if (!''.startsWith.call(searchTerm, ' ')) {\r\n this.latestMentionCharPos = mentionCharPos\r\n this.searchMentionListByTerm(searchTerm)\r\n }\r\n else {\r\n this.hideMentionList()\r\n }\r\n }\r\n else {\r\n this.hideMentionList()\r\n }\r\n }\r\n })\r\n }\r\n\r\n handleMouseClick(_itemEl: HTMLLIElement, index: number) {\r\n this.selectMentionItem(index, true)\r\n this.quill.focus()\r\n }\r\n\r\n handleMouseEnter(_itemEl: HTMLLIElement, index: number) {\r\n this.activeMentionIndex = index\r\n this.highlightMentionItem(index)\r\n }\r\n\r\n handleArrowUpKey = () => {\r\n if (this.isOpen()) {\r\n this.activeMentionIndex\r\n = (this.activeMentionIndex + this.latestMentionList.length - 1) % this.latestMentionList.length\r\n this.highlightMentionItem(this.activeMentionIndex)\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n handleArrowDownKey = () => {\r\n if (this.isOpen()) {\r\n this.activeMentionIndex = (this.activeMentionIndex + 1) % this.latestMentionList.length\r\n this.highlightMentionItem(this.activeMentionIndex)\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n handleEnterKey = () => {\r\n if (this.isOpen()) {\r\n this.selectMentionItem()\r\n this.needInsertBr = false\r\n }\r\n return true\r\n }\r\n\r\n handleEscapeKey = () => {\r\n if (this.isOpen()) {\r\n this.hideMentionList()\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n getActiveMentionItem() {\r\n return this.mentionListEL.querySelector(`.${this.options.itemActiveClass}`)\r\n }\r\n\r\n isOpen() {\r\n return !this.mentionListEL.classList.contains(this.options.listHideClass)\r\n }\r\n\r\n async searchMentionListByTerm(term: string) {\r\n const mentionList = await this.options.search(term)\r\n this.latestMentionList = mentionList\r\n if (!mentionList || mentionList.length === 0) {\r\n return this.hideMentionList()\r\n }\r\n\r\n this.showMentionList(mentionList)\r\n }\r\n\r\n showMentionList(mentionList: any[]) {\r\n if (!this.isOpen()) {\r\n this.mentionListEL.classList.remove(this.options.listHideClass)\r\n }\r\n this.activeMentionIndex = 0\r\n this.setMentionListPos()\r\n this.render(mentionList)\r\n }\r\n\r\n hideMentionList() {\r\n if (this.isOpen()) {\r\n this.activeMentionIndex = 0\r\n this.mentionListEL.classList.add(this.options.listHideClass)\r\n }\r\n }\r\n\r\n setMentionListPos() {\r\n const cursorIndex = this.quill.selection.savedRange.index\r\n const cursorBounds = this.quill.getBounds(cursorIndex)\r\n const { left, top } = cursorBounds\r\n const container = this.quill.container\r\n const hostElement = container.parentNode as HTMLDivElement\r\n const { left: editorLeft, top: editorTop } = container.getBoundingClientRect()\r\n const { left: hostElementLeft, top: hostElementTop } = hostElement.getBoundingClientRect()\r\n const relativeLeft = editorLeft - hostElementLeft\r\n const relativeTop = editorTop - hostElementTop\r\n const menuLeft = left + relativeLeft - 5\r\n const menuTop = top + relativeTop + 20\r\n this.mentionListEL.style.cssText += `\r\n left: ${menuLeft}px;\r\n top: ${menuTop}px;\r\n `\r\n }\r\n\r\n render(mentionList: any[]) {\r\n const wrapEl = document.createElement('div');\r\n\r\n [].forEach.call(mentionList, (mentionItem, index) => {\r\n const mentionItemEl = document.createElement('li')\r\n mentionItemEl.classList.add(this.options.itemClass)\r\n if (index === this.activeMentionIndex) {\r\n mentionItemEl.classList.add(this.options.itemActiveClass)\r\n }\r\n const renderResult = this.options.renderMentionItem(mentionItem)\r\n if (typeof renderResult === 'string') {\r\n mentionItemEl.insertAdjacentHTML('afterbegin', renderResult)\r\n }\r\n else {\r\n mentionItemEl.insertAdjacentElement('afterbegin', renderResult)\r\n }\r\n wrapEl.appendChild(mentionItemEl)\r\n })\r\n\r\n this.mentionListEL.innerHTML = wrapEl.innerHTML\r\n }\r\n\r\n highlightMentionItem(index: number) {\r\n const oldActiveItem = this.getActiveMentionItem()\r\n if (oldActiveItem) {\r\n oldActiveItem.classList.remove(this.options.itemActiveClass)\r\n }\r\n\r\n const newActiveItem = this.mentionListEL.querySelector(`.${this.options.itemClass}:nth-of-type(${index + 1})`)\r\n if (newActiveItem) {\r\n newActiveItem.classList.add(this.options.itemActiveClass)\r\n this.scrollIntoView(newActiveItem)\r\n }\r\n }\r\n\r\n scrollIntoView(node: Element): void {\r\n const nodeAsAny: any = node\r\n if (nodeAsAny.scrollIntoViewIfNeeded) {\r\n nodeAsAny.scrollIntoViewIfNeeded(false)\r\n return\r\n }\r\n if (node.scrollIntoView) {\r\n node.scrollIntoView(false)\r\n }\r\n }\r\n\r\n selectMentionItem(index = this.activeMentionIndex, isClick?: boolean) {\r\n const activeMentionItem = this.latestMentionList[index]\r\n this.insertMentionBlot(activeMentionItem, isClick)\r\n this.options.select(activeMentionItem)\r\n this.hideMentionList()\r\n }\r\n\r\n insertMentionBlot(activeMentionItem: any, isClick?: boolean) {\r\n const mention = this.options.renderMentionText(activeMentionItem)\r\n const delta = new Delta()\r\n .retain(this.latestMentionCharPos)\r\n .delete(this.latestCaretPos - this.latestMentionCharPos)\r\n .insert({\r\n [MentionLink.blotName]: {\r\n char: this.options.mentionChar,\r\n text: mention,\r\n mention: activeMentionItem,\r\n link: this.options.defaultLink,\r\n target: this.options.target,\r\n searchKey: this.options.searchKey,\r\n },\r\n })\r\n if (isClick) {\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n }\r\n else {\r\n this.quill.updateContents(delta, Quill.sources.API)\r\n }\r\n this.quill.setSelection(this.latestMentionCharPos + 1, Quill.sources.API)\r\n }\r\n}\r\n\r\nexport { Mention as default }\r\n"],"names":["DEFAULT_MENTION_CHAR","isNullOrUndefined","ON_MENTION_LINK_REMOVE","MentionLink"],"mappings":"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"}
@@ -71,7 +71,7 @@ class QuickMenu {
71
71
  quill.keyboard.addBinding({ key: "ArrowUp" }, this.handleArrowUpKey);
72
72
  quill.keyboard.addBinding({ key: "ArrowDown" }, this.handleArrowDownKey);
73
73
  quill.keyboard.addBinding({ key: "Enter" }, this.handleEnterKey);
74
- quill.keyboard.bindings["Enter"].unshift(quill.keyboard.bindings["Enter"].pop());
74
+ quill.keyboard.bindings.Enter.unshift(quill.keyboard.bindings.Enter.pop());
75
75
  document.body.addEventListener("click", this.hideQuickMenu.bind(this));
76
76
  }
77
77
  isOpen() {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../../src/quick-menu/index.ts"],"sourcesContent":["import Quill from 'quill'\r\n\r\ninterface QuickMenuOptions {\r\n container: string\r\n component: any\r\n}\r\n\r\nclass QuickMenu {\r\n private container: HTMLDivElement\r\n private hostElement: HTMLDivElement\r\n private quickMenu: HTMLDivElement\r\n private quickMenuContainer: HTMLDivElement\r\n\r\n // @ts-ignore\r\n constructor(private quill: Quill, private options: QuickMenuOptions) {\r\n this.quill = quill\r\n this.options = options\r\n this.container = this.quill.container\r\n this.hostElement = this.container.parentNode as HTMLDivElement\r\n this.quickMenu = this.hostElement.querySelector('.quick-menu')\r\n this.quickMenuContainer = this.quickMenu.querySelector('.quick-menu-container')\r\n quill.keyboard.addBinding({ key: '/' }, this.handleSlashKeyDown)\r\n quill.keyboard.addBinding({ key: 'ArrowUp' }, this.handleArrowUpKey)\r\n quill.keyboard.addBinding({ key: 'ArrowDown' }, this.handleArrowDownKey)\r\n quill.keyboard.addBinding({ key: 'Enter' }, this.handleEnterKey)\r\n quill.keyboard.bindings['Enter'].unshift(quill.keyboard.bindings['Enter'].pop())\r\n document.body.addEventListener('click', this.hideQuickMenu.bind(this))\r\n }\r\n\r\n handleSlashKeyDown = (_range, context) => {\r\n const index = this.quill.selection.savedRange.index\r\n this.quill.insertText(index, '/')\r\n\r\n // 一行的第一个字符为 '/',且没有格式化,则触发快捷菜单\r\n const shouldTriggerQuickMenu = context.prefix === '' && Object.keys(context.format).length === 0\r\n if (shouldTriggerQuickMenu) {\r\n const cursorIndex = this.quill.selection.savedRange.index\r\n const cursorBounds = this.quill.getBounds(cursorIndex)\r\n const { left, top } = cursorBounds\r\n const { left: editorLeft, top: editorTop } = this.container.getBoundingClientRect()\r\n const { left: hostElementLeft, top: hostElementTop } = this.hostElement.getBoundingClientRect()\r\n const relativeLeft = editorLeft - hostElementLeft\r\n const relativeTop = editorTop - hostElementTop\r\n const menuLeft = left + relativeLeft - 5\r\n const menuTop = top + relativeTop + 20\r\n\r\n this.quickMenu.style.display = 'block'\r\n const zIndex = this.quill.options.modules.quickmenu.zIndex\r\n let style = `left:${menuLeft}px;top:${menuTop}px;`\r\n if (zIndex || zIndex === 0) {\r\n style += `z-index:${zIndex}`\r\n }\r\n this.quickMenuContainer.setAttribute('style', style)\r\n this.options.component.activeIndex = 0\r\n }\r\n else {\r\n this.quickMenu.style.display = 'none'\r\n }\r\n }\r\n\r\n private isOpen() {\r\n return this.quickMenuContainer.style.display !== 'none' && this.quickMenu.style.display === 'block'\r\n }\r\n\r\n hideQuickMenu = (event) => {\r\n if (this.quickMenuContainer && !this.quickMenuContainer.contains(event.target)) {\r\n this.quickMenuContainer.style.display = 'none'\r\n }\r\n }\r\n\r\n handleArrowUpKey = (_range, _context) => {\r\n if (this.isOpen()) {\r\n const index = this.options.component.activeIndex\r\n const total = this.options.component.quickMenus.length\r\n this.options.component.activeIndex = (index + total - 1) % total\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n handleArrowDownKey = (_range, _context) => {\r\n if (this.isOpen()) {\r\n const index = this.options.component.activeIndex\r\n const total = this.options.component.quickMenus.length\r\n this.options.component.activeIndex = (index + 1) % total\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n handleEnterKey = (_range, _context) => {\r\n if (this.isOpen()) {\r\n this.options.component.onEnter()\r\n return false\r\n }\r\n return true\r\n }\r\n}\r\n\r\nexport default QuickMenu\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../src/quick-menu/index.ts"],"sourcesContent":["import type Quill from 'quill'\r\n\r\ninterface QuickMenuOptions {\r\n container: string\r\n component: any\r\n}\r\n\r\nclass QuickMenu {\r\n private container: HTMLDivElement\r\n private hostElement: HTMLDivElement\r\n private quickMenu: HTMLDivElement\r\n private quickMenuContainer: HTMLDivElement\r\n\r\n // @ts-ignore\r\n constructor(private quill: Quill, private options: QuickMenuOptions) {\r\n this.quill = quill\r\n this.options = options\r\n this.container = this.quill.container\r\n this.hostElement = this.container.parentNode as HTMLDivElement\r\n this.quickMenu = this.hostElement.querySelector('.quick-menu')\r\n this.quickMenuContainer = this.quickMenu.querySelector('.quick-menu-container')\r\n quill.keyboard.addBinding({ key: '/' }, this.handleSlashKeyDown)\r\n quill.keyboard.addBinding({ key: 'ArrowUp' }, this.handleArrowUpKey)\r\n quill.keyboard.addBinding({ key: 'ArrowDown' }, this.handleArrowDownKey)\r\n quill.keyboard.addBinding({ key: 'Enter' }, this.handleEnterKey)\r\n quill.keyboard.bindings.Enter.unshift(quill.keyboard.bindings.Enter.pop())\r\n document.body.addEventListener('click', this.hideQuickMenu.bind(this))\r\n }\r\n\r\n handleSlashKeyDown = (_range, context) => {\r\n const index = this.quill.selection.savedRange.index\r\n this.quill.insertText(index, '/')\r\n\r\n // 一行的第一个字符为 '/',且没有格式化,则触发快捷菜单\r\n const shouldTriggerQuickMenu = context.prefix === '' && Object.keys(context.format).length === 0\r\n if (shouldTriggerQuickMenu) {\r\n const cursorIndex = this.quill.selection.savedRange.index\r\n const cursorBounds = this.quill.getBounds(cursorIndex)\r\n const { left, top } = cursorBounds\r\n const { left: editorLeft, top: editorTop } = this.container.getBoundingClientRect()\r\n const { left: hostElementLeft, top: hostElementTop } = this.hostElement.getBoundingClientRect()\r\n const relativeLeft = editorLeft - hostElementLeft\r\n const relativeTop = editorTop - hostElementTop\r\n const menuLeft = left + relativeLeft - 5\r\n const menuTop = top + relativeTop + 20\r\n\r\n this.quickMenu.style.display = 'block'\r\n const zIndex = this.quill.options.modules.quickmenu.zIndex\r\n let style = `left:${menuLeft}px;top:${menuTop}px;`\r\n if (zIndex || zIndex === 0) {\r\n style += `z-index:${zIndex}`\r\n }\r\n this.quickMenuContainer.setAttribute('style', style)\r\n this.options.component.activeIndex = 0\r\n }\r\n else {\r\n this.quickMenu.style.display = 'none'\r\n }\r\n }\r\n\r\n private isOpen() {\r\n return this.quickMenuContainer.style.display !== 'none' && this.quickMenu.style.display === 'block'\r\n }\r\n\r\n hideQuickMenu = (event) => {\r\n if (this.quickMenuContainer && !this.quickMenuContainer.contains(event.target)) {\r\n this.quickMenuContainer.style.display = 'none'\r\n }\r\n }\r\n\r\n handleArrowUpKey = (_range, _context) => {\r\n if (this.isOpen()) {\r\n const index = this.options.component.activeIndex\r\n const total = this.options.component.quickMenus.length\r\n this.options.component.activeIndex = (index + total - 1) % total\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n handleArrowDownKey = (_range, _context) => {\r\n if (this.isOpen()) {\r\n const index = this.options.component.activeIndex\r\n const total = this.options.component.quickMenus.length\r\n this.options.component.activeIndex = (index + 1) % total\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n handleEnterKey = (_range, _context) => {\r\n if (this.isOpen()) {\r\n this.options.component.onEnter()\r\n return false\r\n }\r\n return true\r\n }\r\n}\r\n\r\nexport default QuickMenu\r\n"],"names":[],"mappings":"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"}
@@ -1,17 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const Quill = require("quill");
4
+ const image = require("../utils/image.cjs.js");
5
+ const scrollLock = require("../utils/scroll-lock.cjs.js");
4
6
  const Delta = Quill.import("delta");
5
- const resolveOptions = (options) => {
7
+ function resolveOptions(options) {
6
8
  return Object.assign({
7
9
  // @ts-ignore
8
10
  Html2Canvas: window.Html2Canvas,
9
11
  useCORS: true,
12
+ scale: 1,
10
13
  foreignObjectRendering: true,
11
14
  beforeCreateImage: void 0,
12
15
  beforeCreateCanvas: void 0
13
16
  }, options);
14
- };
17
+ }
15
18
  function init() {
16
19
  const maskExits = document.querySelectorAll(".ql-screenshot-mask");
17
20
  if (maskExits) {
@@ -29,14 +32,45 @@ function init() {
29
32
  wrapper.appendChild(mask);
30
33
  wrapper.appendChild(cutter);
31
34
  document.body.appendChild(wrapper);
32
- document.body.style.overflow = "hidden";
33
35
  return { wrapper, mask, cutter, coordinate };
34
36
  }
37
+ function findParentFixed(dom) {
38
+ if (dom.tagName === "BODY") return false;
39
+ if (["fixed", "sticky"].includes(dom.parentElement.style.position)) return true;
40
+ return findParentFixed(dom.parentElement);
41
+ }
35
42
  async function renderImage(Html2Canvas, html2canvasOptions, rect, options) {
36
43
  if (options && options.beforeCreateCanvas) {
37
44
  await options.beforeCreateCanvas();
38
45
  }
39
- const canvas = await Html2Canvas(document.body, html2canvasOptions);
46
+ const canvas = await Html2Canvas(document.body, {
47
+ ...html2canvasOptions,
48
+ onclone: async (doc, el) => {
49
+ const fixedDom = Array.from(doc.querySelectorAll('*[style*="position: fixed"]'));
50
+ const stickyDom = Array.from(doc.querySelectorAll('*[style*="position: sticky"]'));
51
+ const fixedDomList = /* @__PURE__ */ new Set([...fixedDom, ...stickyDom]);
52
+ for (const dom of fixedDomList) {
53
+ if (findParentFixed(dom)) continue;
54
+ let x = 0;
55
+ let y = 0;
56
+ if (dom.style.top !== "auto") {
57
+ y = window.scrollY;
58
+ }
59
+ if (dom.style.left !== "auto") {
60
+ x = window.scrollX;
61
+ }
62
+ if (x !== 0 || y !== 0) {
63
+ dom.style.transform = `translate(${x}px, ${y}px)`;
64
+ }
65
+ }
66
+ const imgs = doc.querySelectorAll("img");
67
+ const promises = Array.from(imgs).map(async (img) => {
68
+ img.src = await image.imgToBase64(img.src);
69
+ });
70
+ await Promise.all(promises);
71
+ html2canvasOptions.onclone && await html2canvasOptions.onclone(doc, el);
72
+ }
73
+ });
40
74
  let cropCanvas = document.createElement("canvas");
41
75
  cropCanvas.width = rect.width;
42
76
  cropCanvas.height = rect.height;
@@ -64,26 +98,28 @@ function Screenshot() {
64
98
  if (!Html2Canvas) {
65
99
  throw new Error("ScreenShot module requires html2canvas. Please include the library on the page before FluentEditor.");
66
100
  }
67
- const range = this.quill.getSelection(true);
101
+ const range = this.quill.getSelection();
68
102
  const { wrapper, mask, cutter, coordinate } = init();
69
103
  const status = {
70
104
  leftClickLockFlag: false,
71
105
  start: void 0
72
106
  };
107
+ const cleanLock = scrollLock.lockScroll();
73
108
  const removeContextmenu = (event) => {
74
109
  event.preventDefault();
75
110
  wrapper.remove();
111
+ cleanLock();
76
112
  document.removeEventListener("contextmenu", removeContextmenu);
77
113
  };
78
114
  const afterShotCtrl = async (event) => {
79
115
  document.removeEventListener("mousedown", toggleRect);
80
- Object.assign(document.body.style, { overflow: null });
81
116
  const cutterRect = cutter.getBoundingClientRect();
82
117
  const target = event.target;
83
118
  wrapper.remove();
119
+ cleanLock();
84
120
  if (target && target.className === "ql-screenshot-confirm") {
85
- const image = await renderImage(Html2Canvas, html2CanvasOptions, cutterRect, { beforeCreateCanvas, beforeCreateImage });
86
- const delta = new Delta().retain(range.index).delete(range.length).insert({ image });
121
+ const image2 = await renderImage(Html2Canvas, html2CanvasOptions, cutterRect, { beforeCreateCanvas, beforeCreateImage });
122
+ const delta = new Delta().retain(range.index).delete(range.length).insert({ image: image2 });
87
123
  this.quill.updateContents(delta, Quill.sources.USER);
88
124
  this.quill.setSelection(range.index + 1, Quill.sources.SILENT);
89
125
  }
@@ -122,7 +158,6 @@ function Screenshot() {
122
158
  if (event.button === 2) {
123
159
  document.removeEventListener("mousemove", drawRect);
124
160
  document.removeEventListener("mousedown", toggleRect);
125
- console.log("right");
126
161
  document.addEventListener("contextmenu", removeContextmenu);
127
162
  return;
128
163
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../../src/screenshot/index.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport type Toolbar from 'quill/modules/toolbar'\r\nimport type html2canvas from 'html2canvas'\r\nimport type { Options as Html2CanvasOptions } from 'html2canvas'\r\n\r\nconst Delta = Quill.import('delta')\r\n\r\nexport type ScreenShotOptions = Partial<Html2CanvasOptions> & {\r\n Html2Canvas: typeof html2canvas\r\n beforeCreateCanvas: () => void | Promise<void>\r\n beforeCreateImage: (canvas: HTMLCanvasElement) => HTMLCanvasElement | string | Promise<HTMLCanvasElement | string>\r\n}\r\ntype ScreenShotOptionsInQuill = {\r\n quill: {\r\n options: {\r\n screenshot: Partial<ScreenShotOptions>\r\n }\r\n }\r\n}\r\n\r\nconst resolveOptions = (options: Partial<ScreenShotOptions>) => {\r\n return Object.assign({\r\n // @ts-ignore\r\n Html2Canvas: window.Html2Canvas,\r\n useCORS: true,\r\n foreignObjectRendering: true,\r\n beforeCreateImage: undefined,\r\n beforeCreateCanvas: undefined,\r\n }, options)\r\n}\r\n\r\nfunction init() {\r\n const maskExits = document.querySelectorAll('.ql-screenshot-mask')\r\n if (maskExits) {\r\n maskExits.forEach(item => item && item.remove())\r\n }\r\n // 创建截图图层\r\n const wrapper = document.createElement('div')\r\n wrapper.classList.add('ql-screenshot-wrapper')\r\n const mask = document.createElement('div')\r\n mask.className = 'ql-screenshot-mask'\r\n const cutter = document.createElement('div')\r\n cutter.className = 'ql-screenshot-cutter'\r\n const coordinate = document.createElement('p')\r\n coordinate.className = 'ql-screenshot-coordinate'\r\n cutter.appendChild(coordinate)\r\n wrapper.appendChild(mask)\r\n wrapper.appendChild(cutter)\r\n document.body.appendChild(wrapper)\r\n document.body.style.overflow = 'hidden'\r\n return { wrapper, mask, cutter, coordinate }\r\n}\r\n\r\nasync function renderImage(\r\n Html2Canvas: typeof html2canvas,\r\n html2canvasOptions: Partial<Html2CanvasOptions>,\r\n rect: DOMRect,\r\n options?: Omit<ScreenShotOptions, 'Html2Canvas' | keyof Html2CanvasOptions>,\r\n) {\r\n if (options && options.beforeCreateCanvas) {\r\n await options.beforeCreateCanvas()\r\n }\r\n const canvas: CanvasImageSource = await Html2Canvas(document.body, html2canvasOptions)\r\n // 当前canvas为body全局截图,从当前截图中截取想要的部分重新绘制转成base64插入富文本\r\n let cropCanvas: HTMLCanvasElement | string = document.createElement('canvas')\r\n cropCanvas.width = rect.width\r\n cropCanvas.height = rect.height\r\n const cropCanvasCtx = cropCanvas.getContext('2d')\r\n cropCanvasCtx.drawImage(\r\n canvas,\r\n rect.x + window.scrollX,\r\n rect.y + window.scrollY,\r\n rect.width,\r\n rect.height,\r\n 0,\r\n 0,\r\n rect.width,\r\n rect.height,\r\n )\r\n if (options && options.beforeCreateImage) {\r\n cropCanvas = await options.beforeCreateImage(cropCanvas)\r\n }\r\n return typeof cropCanvas === 'string' ? cropCanvas : cropCanvas.toDataURL()\r\n}\r\n\r\nexport function Screenshot(this: Toolbar & ScreenShotOptionsInQuill) {\r\n this.quill.options.screenshot = resolveOptions(this.quill.options.screenshot)\r\n const options = this.quill.options.screenshot\r\n // @ts-ignore\r\n const { Html2Canvas, beforeCreateImage, beforeCreateCanvas, ...html2CanvasOptions } = options\r\n if (!Html2Canvas) {\r\n throw new Error('ScreenShot module requires html2canvas. Please include the library on the page before FluentEditor.')\r\n }\r\n const range = this.quill.getSelection(true)\r\n const { wrapper, mask, cutter, coordinate } = init()\r\n const status: {\r\n leftClickLockFlag: boolean\r\n start?: {\r\n x: number\r\n y: number\r\n }\r\n } = {\r\n leftClickLockFlag: false,\r\n start: undefined,\r\n }\r\n\r\n const removeContextmenu = (event: Event) => {\r\n event.preventDefault()\r\n wrapper.remove()\r\n document.removeEventListener('contextmenu', removeContextmenu)\r\n }\r\n const afterShotCtrl = async (event: MouseEvent) => {\r\n document.removeEventListener('mousedown', toggleRect)\r\n Object.assign(document.body.style, { overflow: null })\r\n const cutterRect = cutter.getBoundingClientRect()\r\n const target = event.target as HTMLElement\r\n wrapper.remove()\r\n if (target && target.className === 'ql-screenshot-confirm') {\r\n const image = await renderImage(Html2Canvas, html2CanvasOptions, cutterRect, { beforeCreateCanvas, beforeCreateImage })\r\n\r\n const delta = new Delta()\r\n .retain(range.index)\r\n .delete(range.length)\r\n .insert({ image })\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT)\r\n }\r\n status.start = undefined\r\n }\r\n const drawRect = (event: MouseEvent) => {\r\n // 通过鼠标移动描绘截图图层\r\n const startX = status.start.x\r\n const startY = status.start.y\r\n const endX = event.clientX\r\n const endY = event.clientY\r\n const width = Math.abs(endX - startX)\r\n const height = Math.abs(endY - startY)\r\n const top = startY < endY ? startY : endY\r\n const left = startX < endX ? startX : endX\r\n const bottom = window.innerHeight - height - top\r\n const right = window.innerWidth - width - left\r\n\r\n const maskPath = `\r\n linear-gradient(to top, #fff, #fff) top / 100% ${top}px,\r\n linear-gradient(to bottom, #fff, #fff) bottom /100% ${bottom}px,\r\n linear-gradient(to left, #fff, #fff) left / ${left}px 100%,\r\n linear-gradient(to right, #fff, #fff) right / ${right}px 100%\r\n `\r\n Object.assign(cutter.style, {\r\n width: `${width}px`,\r\n height: `${height}px`,\r\n left: `${left}px`,\r\n top: `${top}px`,\r\n })\r\n Object.assign(mask.style, {\r\n 'mask': maskPath,\r\n '-webkit-mask-repeat': 'no-repeat',\r\n })\r\n coordinate.textContent = `${width}, ${height}`\r\n }\r\n const toggleRect = (event: MouseEvent) => {\r\n // 右键取消截图操作\r\n if (event.button === 2) {\r\n document.removeEventListener('mousemove', drawRect)\r\n document.removeEventListener('mousedown', toggleRect)\r\n console.log('right')\r\n document.addEventListener('contextmenu', removeContextmenu)\r\n return\r\n }\r\n if (!status.leftClickLockFlag) {\r\n if (status.start) {\r\n // 如果有起点,则当前触发坐标为终点,移除监听事件并添加确认和取消按钮\r\n document.removeEventListener('mousemove', drawRect)\r\n const doneBtn = document.createElement('div')\r\n doneBtn.innerHTML = `<div class=\"ql-screenshot-confirm\"></div><div class=\"ql-screenshot-cancel\"></div>`\r\n doneBtn.className = 'ql-screenshot-done'\r\n doneBtn.addEventListener('click', afterShotCtrl)\r\n coordinate.remove()\r\n cutter.appendChild(doneBtn)\r\n status.leftClickLockFlag = true\r\n }\r\n else {\r\n // 无起点则设置起点坐标,监听鼠标移动\r\n status.start = { x: event.clientX, y: event.clientY }\r\n document.addEventListener('mousemove', drawRect)\r\n }\r\n }\r\n }\r\n document.addEventListener('mousedown', toggleRect)\r\n}\r\nScreenshot.toolName = 'screenshot'\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../src/screenshot/index.ts"],"sourcesContent":["import type html2canvas from 'html2canvas'\r\nimport type { Options as Html2CanvasOptions } from 'html2canvas'\r\nimport type Toolbar from 'quill/modules/toolbar'\r\nimport Quill from 'quill'\r\nimport { imgToBase64 } from '../utils/image'\r\nimport { lockScroll } from '../utils/scroll-lock'\r\n\r\nconst Delta = Quill.import('delta')\r\n\r\nexport type ScreenShotOptions = Partial<Html2CanvasOptions> & {\r\n Html2Canvas: typeof html2canvas\r\n beforeCreateCanvas: () => void | Promise<void>\r\n beforeCreateImage: (canvas: HTMLCanvasElement) => HTMLCanvasElement | string | Promise<HTMLCanvasElement | string>\r\n}\r\ninterface ScreenShotOptionsInQuill {\r\n quill: {\r\n options: {\r\n screenshot: Partial<ScreenShotOptions>\r\n }\r\n }\r\n}\r\n\r\nfunction resolveOptions(options: Partial<ScreenShotOptions>) {\r\n return Object.assign({\r\n // @ts-ignore\r\n Html2Canvas: window.Html2Canvas,\r\n useCORS: true,\r\n scale: 1,\r\n foreignObjectRendering: true,\r\n beforeCreateImage: undefined,\r\n beforeCreateCanvas: undefined,\r\n }, options)\r\n}\r\n\r\nfunction init() {\r\n const maskExits = document.querySelectorAll('.ql-screenshot-mask')\r\n if (maskExits) {\r\n maskExits.forEach(item => item && item.remove())\r\n }\r\n // 创建截图图层\r\n const wrapper = document.createElement('div')\r\n wrapper.classList.add('ql-screenshot-wrapper')\r\n const mask = document.createElement('div')\r\n mask.className = 'ql-screenshot-mask'\r\n const cutter = document.createElement('div')\r\n cutter.className = 'ql-screenshot-cutter'\r\n const coordinate = document.createElement('p')\r\n coordinate.className = 'ql-screenshot-coordinate'\r\n cutter.appendChild(coordinate)\r\n wrapper.appendChild(mask)\r\n wrapper.appendChild(cutter)\r\n document.body.appendChild(wrapper)\r\n return { wrapper, mask, cutter, coordinate }\r\n}\r\n\r\nfunction findParentFixed(dom: HTMLElement) {\r\n if (dom.tagName === 'BODY') return false\r\n if (['fixed', 'sticky'].includes(dom.parentElement.style.position)) return true\r\n return findParentFixed(dom.parentElement)\r\n}\r\nasync function renderImage(\r\n Html2Canvas: typeof html2canvas,\r\n html2canvasOptions: Partial<Html2CanvasOptions>,\r\n rect: DOMRect,\r\n options?: Omit<ScreenShotOptions, 'Html2Canvas' | keyof Html2CanvasOptions>,\r\n) {\r\n if (options && options.beforeCreateCanvas) {\r\n await options.beforeCreateCanvas()\r\n }\r\n const canvas: CanvasImageSource = await Html2Canvas(document.body, {\r\n ...html2canvasOptions,\r\n onclone: async (doc: Document, el: HTMLElement) => {\r\n // find all fixed or sticky dom\r\n const fixedDom = Array.from(doc.querySelectorAll('*[style*=\"position: fixed\"]')) as HTMLElement[]\r\n const stickyDom = Array.from(doc.querySelectorAll('*[style*=\"position: sticky\"]')) as HTMLElement[]\r\n const fixedDomList = new Set([...fixedDom, ...stickyDom])\r\n for (const dom of fixedDomList) {\r\n // if parent dom already has fixed or sticky style\r\n // means that transform will be settle. skip\r\n if (findParentFixed(dom)) continue\r\n // use transform move to correct position\r\n let x = 0\r\n let y = 0\r\n if (dom.style.top !== 'auto') {\r\n y = window.scrollY\r\n }\r\n if (dom.style.left !== 'auto') {\r\n x = window.scrollX\r\n }\r\n if (x !== 0 || y !== 0) {\r\n dom.style.transform = `translate(${x}px, ${y}px)`\r\n }\r\n }\r\n\r\n const imgs = doc.querySelectorAll('img')\r\n const promises = Array.from(imgs).map(async (img) => {\r\n img.src = await imgToBase64(img.src)\r\n })\r\n await Promise.all(promises)\r\n html2canvasOptions.onclone && await html2canvasOptions.onclone(doc, el)\r\n },\r\n })\r\n // 当前canvas为body全局截图,从当前截图中截取想要的部分重新绘制转成base64插入富文本\r\n let cropCanvas: HTMLCanvasElement | string = document.createElement('canvas')\r\n cropCanvas.width = rect.width\r\n cropCanvas.height = rect.height\r\n const cropCanvasCtx = cropCanvas.getContext('2d')\r\n cropCanvasCtx.drawImage(\r\n canvas,\r\n rect.x + window.scrollX,\r\n rect.y + window.scrollY,\r\n rect.width,\r\n rect.height,\r\n 0,\r\n 0,\r\n rect.width,\r\n rect.height,\r\n )\r\n if (options && options.beforeCreateImage) {\r\n cropCanvas = await options.beforeCreateImage(cropCanvas)\r\n }\r\n return typeof cropCanvas === 'string' ? cropCanvas : cropCanvas.toDataURL()\r\n}\r\n\r\nexport function Screenshot(this: Toolbar & ScreenShotOptionsInQuill) {\r\n this.quill.options.screenshot = resolveOptions(this.quill.options.screenshot)\r\n const options = this.quill.options.screenshot\r\n // @ts-ignore\r\n const { Html2Canvas, beforeCreateImage, beforeCreateCanvas, ...html2CanvasOptions } = options\r\n if (!Html2Canvas) {\r\n throw new Error('ScreenShot module requires html2canvas. Please include the library on the page before FluentEditor.')\r\n }\r\n const range = this.quill.getSelection()\r\n const { wrapper, mask, cutter, coordinate } = init()\r\n const status: {\r\n leftClickLockFlag: boolean\r\n start?: {\r\n x: number\r\n y: number\r\n }\r\n } = {\r\n leftClickLockFlag: false,\r\n start: undefined,\r\n }\r\n const cleanLock = lockScroll()\r\n\r\n const removeContextmenu = (event: Event) => {\r\n event.preventDefault()\r\n wrapper.remove()\r\n cleanLock()\r\n document.removeEventListener('contextmenu', removeContextmenu)\r\n }\r\n const afterShotCtrl = async (event: MouseEvent) => {\r\n document.removeEventListener('mousedown', toggleRect)\r\n const cutterRect = cutter.getBoundingClientRect()\r\n const target = event.target as HTMLElement\r\n wrapper.remove()\r\n cleanLock()\r\n if (target && target.className === 'ql-screenshot-confirm') {\r\n const image = await renderImage(Html2Canvas, html2CanvasOptions, cutterRect, { beforeCreateCanvas, beforeCreateImage })\r\n\r\n const delta = new Delta()\r\n .retain(range.index)\r\n .delete(range.length)\r\n .insert({ image })\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT)\r\n }\r\n status.start = undefined\r\n }\r\n const drawRect = (event: MouseEvent) => {\r\n // 通过鼠标移动描绘截图图层\r\n const startX = status.start.x\r\n const startY = status.start.y\r\n const endX = event.clientX\r\n const endY = event.clientY\r\n const width = Math.abs(endX - startX)\r\n const height = Math.abs(endY - startY)\r\n const top = startY < endY ? startY : endY\r\n const left = startX < endX ? startX : endX\r\n const bottom = window.innerHeight - height - top\r\n const right = window.innerWidth - width - left\r\n\r\n const maskPath = `\r\n linear-gradient(to top, #fff, #fff) top / 100% ${top}px,\r\n linear-gradient(to bottom, #fff, #fff) bottom /100% ${bottom}px,\r\n linear-gradient(to left, #fff, #fff) left / ${left}px 100%,\r\n linear-gradient(to right, #fff, #fff) right / ${right}px 100%\r\n `\r\n Object.assign(cutter.style, {\r\n width: `${width}px`,\r\n height: `${height}px`,\r\n left: `${left}px`,\r\n top: `${top}px`,\r\n })\r\n Object.assign(mask.style, {\r\n 'mask': maskPath,\r\n '-webkit-mask-repeat': 'no-repeat',\r\n })\r\n coordinate.textContent = `${width}, ${height}`\r\n }\r\n const toggleRect = (event: MouseEvent) => {\r\n // 右键取消截图操作\r\n if (event.button === 2) {\r\n document.removeEventListener('mousemove', drawRect)\r\n document.removeEventListener('mousedown', toggleRect)\r\n document.addEventListener('contextmenu', removeContextmenu)\r\n return\r\n }\r\n if (!status.leftClickLockFlag) {\r\n if (status.start) {\r\n // 如果有起点,则当前触发坐标为终点,移除监听事件并添加确认和取消按钮\r\n document.removeEventListener('mousemove', drawRect)\r\n const doneBtn = document.createElement('div')\r\n doneBtn.innerHTML = `<div class=\"ql-screenshot-confirm\"></div><div class=\"ql-screenshot-cancel\"></div>`\r\n doneBtn.className = 'ql-screenshot-done'\r\n doneBtn.addEventListener('click', afterShotCtrl)\r\n coordinate.remove()\r\n cutter.appendChild(doneBtn)\r\n status.leftClickLockFlag = true\r\n }\r\n else {\r\n // 无起点则设置起点坐标,监听鼠标移动\r\n status.start = { x: event.clientX, y: event.clientY }\r\n document.addEventListener('mousemove', drawRect)\r\n }\r\n }\r\n }\r\n document.addEventListener('mousedown', toggleRect)\r\n}\r\nScreenshot.toolName = 'screenshot'\r\n"],"names":["imgToBase64","lockScroll","image"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../../src/strike/index.ts"],"sourcesContent":["import Quill from 'quill'\r\nconst Inline = Quill.imports['blots/inline']\r\n\r\n// @dynamic\r\nclass StrikeBlot extends Inline {\r\n static blotName: string\r\n static className: string\r\n static tagName: string\r\n // 此处删除了formats方法,当前tag非span,则并不需要进行特殊处理去重写formats方法\r\n}\r\nStrikeBlot.blotName = 'strike'\r\nStrikeBlot.tagName = 'u'\r\nStrikeBlot.className = 'ql-custom-strike'\r\n\r\nexport default StrikeBlot\r\n"],"names":[],"mappings":";;;AACA,MAAM,SAAS,MAAM,QAAQ,cAAc;AAG3C,MAAM,mBAAmB,OAAO;AAAA;AAKhC;AACA,WAAW,WAAW;AACtB,WAAW,UAAU;AACrB,WAAW,YAAY;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../src/strike/index.ts"],"sourcesContent":["import Quill from 'quill'\r\n\r\nconst Inline = Quill.imports['blots/inline']\r\n\r\n// @dynamic\r\nclass StrikeBlot extends Inline {\r\n static blotName: string\r\n static className: string\r\n static tagName: string\r\n // 此处删除了formats方法,当前tag非span,则并不需要进行特殊处理去重写formats方法\r\n}\r\nStrikeBlot.blotName = 'strike'\r\nStrikeBlot.tagName = 'u'\r\nStrikeBlot.className = 'ql-custom-strike'\r\n\r\nexport default StrikeBlot\r\n"],"names":[],"mappings":";;;AAEA,MAAM,SAAS,MAAM,QAAQ,cAAc;AAG3C,MAAM,mBAAmB,OAAO;AAAA;AAKhC;AACA,WAAW,WAAW;AACtB,WAAW,UAAU;AACrB,WAAW,YAAY;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../../src/syntax/index.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport TypeSyntax from 'quill/modules/syntax'\r\n\r\nconst Syntax = Quill.import('modules/syntax') as typeof TypeSyntax\r\n\r\n// @dynamic\r\nclass CustomSyntax extends Syntax {\r\n static DEFAULTS: { hljs: any, interval: number, languages: { key: string, label: string }[] }\r\n}\r\n\r\nCustomSyntax.DEFAULTS = {\r\n hljs: (() => {\r\n // @ts-ignore\r\n return window.hljs\r\n })(),\r\n interval: 1000,\r\n languages: [\r\n { key: 'plain', label: 'Plain' },\r\n { key: 'bash', label: 'Bash' },\r\n { key: 'cpp', label: 'C++' },\r\n { key: 'cs', label: 'C#' },\r\n { key: 'css', label: 'CSS' },\r\n { key: 'diff', label: 'Diff' },\r\n { key: 'xml', label: 'HTML/XML' },\r\n { key: 'java', label: 'Java' },\r\n { key: 'javascript', label: 'Javascript' },\r\n { key: 'markdown', label: 'Markdown' },\r\n { key: 'php', label: 'PHP' },\r\n { key: 'python', label: 'Python' },\r\n { key: 'ruby', label: 'Ruby' },\r\n { key: 'sql', label: 'SQL' },\r\n ],\r\n}\r\n\r\nexport default CustomSyntax\r\n"],"names":[],"mappings":";;;AAGA,MAAM,SAAS,MAAM,OAAO,gBAAgB;AAG5C,MAAM,qBAAqB,OAAO;AAElC;AAEA,aAAa,WAAW;AAAA,EACtB,OAAO,MAAM;AAEX,WAAO,OAAO;AAAA,EAAA,GACb;AAAA,EACH,UAAU;AAAA,EACV,WAAW;AAAA,IACT,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,IAC/B,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,IAC7B,EAAE,KAAK,OAAO,OAAO,MAAM;AAAA,IAC3B,EAAE,KAAK,MAAM,OAAO,KAAK;AAAA,IACzB,EAAE,KAAK,OAAO,OAAO,MAAM;AAAA,IAC3B,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,IAC7B,EAAE,KAAK,OAAO,OAAO,WAAW;AAAA,IAChC,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,IAC7B,EAAE,KAAK,cAAc,OAAO,aAAa;AAAA,IACzC,EAAE,KAAK,YAAY,OAAO,WAAW;AAAA,IACrC,EAAE,KAAK,OAAO,OAAO,MAAM;AAAA,IAC3B,EAAE,KAAK,UAAU,OAAO,SAAS;AAAA,IACjC,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,IAC7B,EAAE,KAAK,OAAO,OAAO,MAAM;AAAA,EAC7B;AACF;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../src/syntax/index.ts"],"sourcesContent":["import type TypeSyntax from 'quill/modules/syntax'\r\nimport Quill from 'quill'\r\n\r\nconst Syntax = Quill.import('modules/syntax') as typeof TypeSyntax\r\n\r\n// @dynamic\r\nclass CustomSyntax extends Syntax {\r\n static DEFAULTS: { hljs: any, interval: number, languages: { key: string, label: string }[] }\r\n}\r\n\r\nCustomSyntax.DEFAULTS = {\r\n hljs: (() => {\r\n // @ts-ignore\r\n return window.hljs\r\n })(),\r\n interval: 1000,\r\n languages: [\r\n { key: 'plain', label: 'Plain' },\r\n { key: 'bash', label: 'Bash' },\r\n { key: 'cpp', label: 'C++' },\r\n { key: 'cs', label: 'C#' },\r\n { key: 'css', label: 'CSS' },\r\n { key: 'diff', label: 'Diff' },\r\n { key: 'xml', label: 'HTML/XML' },\r\n { key: 'java', label: 'Java' },\r\n { key: 'javascript', label: 'Javascript' },\r\n { key: 'markdown', label: 'Markdown' },\r\n { key: 'php', label: 'PHP' },\r\n { key: 'python', label: 'Python' },\r\n { key: 'ruby', label: 'Ruby' },\r\n { key: 'sql', label: 'SQL' },\r\n ],\r\n}\r\n\r\nexport default CustomSyntax\r\n"],"names":[],"mappings":";;;AAGA,MAAM,SAAS,MAAM,OAAO,gBAAgB;AAG5C,MAAM,qBAAqB,OAAO;AAElC;AAEA,aAAa,WAAW;AAAA,EACtB,OAAO,MAAM;AAEX,WAAO,OAAO;AAAA,EAAA,GACb;AAAA,EACH,UAAU;AAAA,EACV,WAAW;AAAA,IACT,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,IAC/B,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,IAC7B,EAAE,KAAK,OAAO,OAAO,MAAM;AAAA,IAC3B,EAAE,KAAK,MAAM,OAAO,KAAK;AAAA,IACzB,EAAE,KAAK,OAAO,OAAO,MAAM;AAAA,IAC3B,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,IAC7B,EAAE,KAAK,OAAO,OAAO,WAAW;AAAA,IAChC,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,IAC7B,EAAE,KAAK,cAAc,OAAO,aAAa;AAAA,IACzC,EAAE,KAAK,YAAY,OAAO,WAAW;AAAA,IACrC,EAAE,KAAK,OAAO,OAAO,MAAM;AAAA,IAC3B,EAAE,KAAK,UAAU,OAAO,SAAS;AAAA,IACjC,EAAE,KAAK,QAAQ,OAAO,OAAO;AAAA,IAC7B,EAAE,KAAK,OAAO,OAAO,MAAM;AAAA,EAC7B;AACF;;"}
@@ -11,7 +11,7 @@ const tableScrollBar = require("./modules/table-scroll-bar.cjs.js");
11
11
  const tableSelection = require("./modules/table-selection.cjs.js");
12
12
  const nodeMatchers = require("./utils/node-matchers.cjs.js");
13
13
  const Block = Quill.imports["blots/block"];
14
- const Delta = Quill.imports["delta"];
14
+ const Delta = Quill.imports.delta;
15
15
  const Module = Quill.imports["core/module"];
16
16
  class BetterTable extends Module {
17
17
  static register() {
@@ -96,8 +96,8 @@ class BetterTable extends Module {
96
96
  }
97
97
  return true;
98
98
  });
99
- const thisBinding = quill.keyboard.bindings["Backspace"].pop();
100
- quill.keyboard.bindings["Backspace"].splice(1, 0, thisBinding);
99
+ const thisBinding = quill.keyboard.bindings.Backspace.pop();
100
+ quill.keyboard.bindings.Backspace.splice(1, 0, thisBinding);
101
101
  quill.clipboard.addMatcher("td", nodeMatchers.matchTableCell);
102
102
  quill.clipboard.addMatcher("th", nodeMatchers.matchTableHeader);
103
103
  quill.clipboard.addMatcher("table", nodeMatchers.matchTable);
@@ -131,7 +131,7 @@ class BetterTable extends Module {
131
131
  const classes = Array.from(table2.parentNode.classList);
132
132
  if (selectionStart <= tableStart && tableEnd <= selectionEnd) {
133
133
  table2.parentNode.classList.add("quill-better-table-selected");
134
- } else if (classes.indexOf("quill-better-table-selected") >= 0) {
134
+ } else if (classes.includes("quill-better-table-selected")) {
135
135
  table2.parentNode.classList.remove("quill-better-table-selected");
136
136
  }
137
137
  }
@@ -366,7 +366,6 @@ BetterTable.keyboardBindings = {
366
366
  format: ["table-col"],
367
367
  collapsed: true,
368
368
  offset: 0,
369
- // eslint-disable-next-line @typescript-eslint/no-empty-function
370
369
  handler() {
371
370
  }
372
371
  },
@@ -1 +1 @@
1
- {"version":3,"file":"better-table.cjs.js","sources":["../../../src/table/better-table.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport {\r\n getEventComposedPath,\r\n insideTable,\r\n isNullOrUndefined,\r\n isPureIE,\r\n} from '../config/editor.utils'\r\nimport Header from './formats/header'\r\nimport List from './formats/list'\r\nimport {\r\n cellId,\r\n rowId,\r\n TableBody,\r\n TableCell,\r\n TableCellLine,\r\n TableCol,\r\n TableColGroup,\r\n TableContainer,\r\n TableRow,\r\n TableViewWrapper,\r\n} from './formats/table'\r\nimport TableColumnTool from './modules/table-column-tool'\r\nimport TableOperationMenu from './modules/table-operation-menu'\r\nimport TableScrollBar from './modules/table-scroll-bar'\r\nimport TableSelection from './modules/table-selection'\r\n// import table node matchers\r\nimport {\r\n matchHeader,\r\n matchInline,\r\n matchList,\r\n matchMentionLink,\r\n matchTable,\r\n matchTableCell,\r\n matchTableHeader,\r\n matchTableRow,\r\n matchWordShapeImage,\r\n} from './utils/node-matchers'\r\n\r\nconst Block = Quill.imports['blots/block']\r\nconst Delta = Quill.imports['delta']\r\nconst Module = Quill.imports['core/module']\r\n\r\n// @dynamic\r\nclass BetterTable extends Module {\r\n static keyboardBindings: any\r\n isComposition: boolean\r\n quill: any\r\n table: any\r\n modulesContainer: any\r\n tableSelection: any\r\n subscriber: any\r\n tableOperationMenu: any\r\n columnTool: TableColumnTool\r\n tableScrollBar: TableScrollBar\r\n\r\n static register() {\r\n Quill.register(TableCol, true)\r\n Quill.register(TableColGroup, true)\r\n Quill.register(TableCellLine, true)\r\n Quill.register(TableCell, true)\r\n Quill.register(TableRow, true)\r\n Quill.register(TableBody, true)\r\n Quill.register(TableContainer, true)\r\n Quill.register(TableViewWrapper, true)\r\n // register customized Header, overwriting quill built-in Header\r\n Quill.register('formats/header', Header, true)\r\n // register customized List, overwriting quill built-in Header\r\n Quill.register('formats/list', List, true)\r\n }\r\n\r\n constructor(quill, options) {\r\n super(quill, options)\r\n\r\n // handle click on quill-better-table\r\n this.isComposition = false\r\n this.quill.root.addEventListener('mousedown', event => this.handleMouseDown(event, quill), false)\r\n this.quill.root.addEventListener('compositionend', () => this.handleCompositionend(quill), false)\r\n this.quill.root.addEventListener('compositionstart', () => this.handleCompositionstart(quill), false)\r\n this.quill.root.addEventListener('keypress', event => this.handleKeyDown(event, quill), false)\r\n\r\n // handle right click on quill-better-table\r\n this.quill.root.addEventListener(\r\n 'contextmenu',\r\n (evt) => {\r\n if (!this.table) return true\r\n evt.preventDefault()\r\n\r\n // bugfix: evt.path is undefined in Safari, FF, Micro Edge\r\n const path = getEventComposedPath(evt)\r\n if (!path || path.length <= 0) return\r\n\r\n const tableNode = path.filter((node) => {\r\n return (\r\n node.tagName && node.tagName.toUpperCase() === 'TABLE' && node.classList.contains('quill-better-table')\r\n )\r\n })[0]\r\n\r\n const rowNode = path.filter((node) => {\r\n return node.tagName && node.tagName.toUpperCase() === 'TR' && node.getAttribute('data-row')\r\n })[0]\r\n\r\n const cellNode = path.filter((node) => {\r\n return node.tagName && node.tagName.toUpperCase() === 'TD' && node.getAttribute('data-row')\r\n })[0]\r\n\r\n const isTargetCellSelected = this.tableSelection.selectedTds\r\n .map(tableCell => tableCell.domNode)\r\n .includes(cellNode)\r\n\r\n if (this.tableSelection.selectedTds.length <= 0 || !isTargetCellSelected) {\r\n this.tableSelection.setSelection(cellNode.getBoundingClientRect(), cellNode.getBoundingClientRect())\r\n }\r\n\r\n if (this.tableOperationMenu) {\r\n this.tableOperationMenu = this.tableOperationMenu.destroy()\r\n }\r\n\r\n if (tableNode) {\r\n this.tableOperationMenu = new TableOperationMenu(\r\n {\r\n table: tableNode,\r\n row: rowNode,\r\n cell: cellNode,\r\n left: evt.x + 15,\r\n top: evt.y,\r\n },\r\n quill,\r\n options.operationMenu,\r\n )\r\n }\r\n },\r\n false,\r\n )\r\n\r\n // add keyboard binding:Backspace\r\n // prevent user hits backspace to delete table cell\r\n quill.keyboard.addBinding({ key: 'Backspace' }, {}, (range, context) => {\r\n if (range.index === 0 || this.quill.getLength() <= 1) return true\r\n if (context.offset === 0 && range.length === 0) {\r\n const [prev] = this.quill.getLine(range.index - 1)\r\n const [line] = this.quill.getLine(range.index)\r\n if (!isNullOrUndefined(prev)) {\r\n if (prev.statics.blotName === 'table-cell-line' && line.statics.blotName !== 'table-cell-line') {\r\n const betterTableModule = this.quill.getModule('better-table')\r\n let tableBlot\r\n try {\r\n tableBlot = prev.parent.parent.parent.parent\r\n }\r\n catch (_e) { }\r\n if (tableBlot && tableBlot.domNode !== betterTableModule.table) {\r\n betterTableModule.hideTableTools()\r\n tableBlot.remove()\r\n this.quill.update(Quill.sources.USER)\r\n }\r\n return false\r\n }\r\n }\r\n }\r\n return true\r\n })\r\n // since only one matched bindings callback will execute.\r\n // expected my binding callback execute first\r\n // I changed the order of binding callbacks\r\n const thisBinding = quill.keyboard.bindings['Backspace'].pop()\r\n quill.keyboard.bindings['Backspace'].splice(1, 0, thisBinding)\r\n\r\n // add Matchers to match and render quill-better-table for initialization\r\n // or pasting\r\n quill.clipboard.addMatcher('td', matchTableCell)\r\n quill.clipboard.addMatcher('th', matchTableHeader)\r\n quill.clipboard.addMatcher('table', matchTable)\r\n quill.clipboard.addMatcher('h1, h2, h3, h4, h5, h6', matchHeader)\r\n quill.clipboard.addMatcher('ol, ul', matchList)\r\n quill.clipboard.addMatcher('span', matchMentionLink)\r\n quill.clipboard.addMatcher('v:imageData', matchWordShapeImage)\r\n quill.clipboard.addMatcher(Node.ELEMENT_NODE, matchInline)\r\n\r\n // remove matcher for tr tag\r\n quill.clipboard.matchers = quill.clipboard.matchers.filter((matcher) => {\r\n return matcher[0] !== 'tr'\r\n })\r\n\r\n // fix: 处理空<tr>标签被忽略的情况\r\n quill.clipboard.addMatcher('tr', matchTableRow)\r\n\r\n this.quill.on('editor-change', () => {\r\n const tableContainer = Quill.find(this.table)\r\n if (!tableContainer) {\r\n this.hideTableTools()\r\n }\r\n })\r\n\r\n this.quill.on(Quill.events.SELECTION_CHANGE, (range, _oldRange, source) => {\r\n if (!range) return\r\n const selectionStart = range.index\r\n const selectionEnd = range.index + range.length\r\n if (source === Quill.sources.USER) {\r\n const tables = this.quill.root.getElementsByTagName('table')\r\n if (tables && tables.length) {\r\n [].forEach.call(tables, (table) => {\r\n const tableContainer = Quill.find(table)\r\n if (tableContainer) {\r\n const tableStart = tableContainer.offset(this.quill.scroll)\r\n const tableEnd = tableStart + tableContainer.length()\r\n // @ts-ignore\r\n const classes = Array.from(table.parentNode.classList)\r\n\r\n if (selectionStart <= tableStart && tableEnd <= selectionEnd) {\r\n // @ts-ignore\r\n table.parentNode.classList.add('quill-better-table-selected')\r\n }\r\n else if (classes.indexOf('quill-better-table-selected') >= 0) {\r\n // @ts-ignore\r\n table.parentNode.classList.remove('quill-better-table-selected')\r\n }\r\n }\r\n })\r\n }\r\n }\r\n })\r\n }\r\n\r\n handleMouseDown(evt, quill) {\r\n // bugfix: evt.path is undefined in Safari, FF, Micro Edge\r\n const path = getEventComposedPath(evt)\r\n if (!path || path.length <= 0) return\r\n const tableNode = path.filter((node) => {\r\n return node.tagName && node.tagName.toUpperCase() === 'TABLE' && node.classList.contains('quill-better-table')\r\n })[0]\r\n if (tableNode) {\r\n tableNode.parentNode.classList.remove('quill-better-table-selected')\r\n // current table clicked\r\n if (this.table === tableNode) return\r\n // other table clicked\r\n if (this.table) {\r\n this.hideTableTools()\r\n }\r\n if (!quill.options.readOnly) { // not show table tool in readonly mode\r\n this.showTableTools(tableNode, quill)\r\n }\r\n }\r\n else if (this.table) {\r\n // other clicked\r\n this.hideTableTools()\r\n }\r\n }\r\n\r\n handleKeyDown(evt, quill) {\r\n const key = evt.key\r\n const range = quill.getSelection()\r\n if (this.isComposition || !range) return\r\n const [col] = quill.getLine(range.index)\r\n const [td] = quill.getLine(range.index - 1)\r\n if (key && key !== 'Delete' && col && range) {\r\n if (col.statics.blotName === 'table-col') {\r\n const betterTableModule = this.quill.getModule('better-table')\r\n betterTableModule.hideTableTools()\r\n quill.insertText(range.index - 1, '\\n', Quill.sources.USER)\r\n quill.setSelection(range.index, 0, Quill.sources.USER)\r\n }\r\n else if (td && td.statics.blotName === 'table-cell-line' && col.statics.blotName === 'block') {\r\n quill.insertText(range.index, '\\n', Quill.sources.USER)\r\n quill.setSelection(range.index, 0, Quill.sources.USER)\r\n }\r\n }\r\n }\r\n\r\n handleCompositionstart(quill) {\r\n this.isComposition = true\r\n const range = quill.getSelection()\r\n const [col] = quill.getLine(range.index)\r\n const [td] = quill.getLine(range.index - 1)\r\n if (col && range) {\r\n if (col.statics.blotName === 'table-col') {\r\n const betterTableModule = this.quill.getModule('better-table')\r\n betterTableModule.hideTableTools()\r\n quill.insertText(range.index - 1, '\\n\\t', Quill.sources.USER)\r\n quill.setSelection(range.index, 0, Quill.sources.USER)\r\n }\r\n else if (td && td.statics.blotName === 'table-cell-line' && col.statics.blotName === 'block') {\r\n quill.setSelection(range.index, 0, Quill.sources.USER)\r\n }\r\n }\r\n }\r\n\r\n handleCompositionend(quill) {\r\n // fix: 解决在空行行首用中文输入法输入字符,然后按退格导致插入多余空行的问题\r\n const range = quill.getSelection()\r\n const [line] = quill.getLine(range.index)\r\n const domNode = line.domNode\r\n const isInParagraph = domNode.nodeName === 'P'\r\n const isInTableCell = line.statics.blotName === 'table-cell-line'\r\n if ((isInParagraph || isInTableCell)\r\n && domNode.childNodes.length > 1\r\n && domNode.childNodes[0].nodeName === 'BR') {\r\n domNode.childNodes[0].remove()\r\n }\r\n\r\n if (isPureIE && line instanceof Block) {\r\n // 设置光标位置防止跳入下一行\r\n quill.setSelection(range.index, 0, Quill.sources.SILENT)\r\n }\r\n\r\n this.isComposition = false\r\n }\r\n\r\n getTable(range = this.quill.getSelection()) {\r\n if (isNullOrUndefined(range)) return [null, null, null, -1]\r\n const [cellLine, offset] = this.quill.getLine(range.index)\r\n if (isNullOrUndefined(cellLine) || cellLine.statics.blotName !== TableCellLine.blotName) {\r\n return [null, null, null, -1]\r\n }\r\n const cell = cellLine.tableCell()\r\n const row = cell.row()\r\n const table = row.table()\r\n return [table, row, cell, offset]\r\n }\r\n\r\n insertTable(rows, columns) {\r\n const range = this.quill.getSelection(true)\r\n const isInsideTable = insideTable(range, this.quill)\r\n if (isNullOrUndefined(range) || isInsideTable) return\r\n // let currentBlot = this.quill.getLeaf(range.index)[0]\r\n // let nextBlot = this.quill.getLeaf(range.index + 1)[0]\r\n let delta = new Delta().retain(range.index)\r\n\r\n delta.insert('\\n')\r\n // insert table column\r\n delta = new Array(columns).fill('\\n').reduce((memo, text) => {\r\n memo.insert(text, { 'table-col': true })\r\n return memo\r\n }, delta)\r\n // insert table cell line with empty line\r\n delta = new Array(rows).fill(0).reduce((memo) => {\r\n const tableRowId = rowId()\r\n return new Array(columns).fill('\\n').reduce((op, text) => {\r\n op.insert(text, { 'table-cell-line': { row: tableRowId, cell: cellId() } })\r\n return op\r\n }, memo)\r\n }, delta)\r\n\r\n const [col] = this.quill.getLine(range.index)\r\n if (col && col.statics.blotName === 'table-col') {\r\n delta.insert('\\n')\r\n }\r\n\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n\r\n // feature: 新增表格后首格自动激活编辑状态,initEvent兼容IE\r\n const [cellLine] = this.quill.getLine(range.index + columns + 1)\r\n if (cellLine) {\r\n const cell = cellLine.tableCell()\r\n const td = cell.domNode\r\n const mousedownEvent = document.createEvent('MouseEvent')\r\n const mouseupEvent = document.createEvent('MouseEvent')\r\n const keyEvent = document.createEvent('Event')\r\n mousedownEvent.initEvent('mousedown', true, false)\r\n mouseupEvent.initEvent('mouseup', true, false)\r\n keyEvent.initEvent('keypress', true, false)\r\n td.dispatchEvent(mousedownEvent)\r\n td.dispatchEvent(mouseupEvent)\r\n td.dispatchEvent(keyEvent)\r\n this.tableSelection.endTd = td\r\n }\r\n }\r\n\r\n showTableTools(table, quill) {\r\n this.table = table\r\n this.modulesContainer = document.createElement('div')\r\n this.modulesContainer.classList.add('qlbt-modules-container')\r\n // fix:表格容器插入时获取ql-tooltip容器,用insertBefore插入到它前面,避免遮挡链接浮窗\r\n const linkContainer = this.quill.root.parentNode.querySelector('.ql-tooltip ')\r\n this.quill.root.parentNode.insertBefore(this.modulesContainer, linkContainer)\r\n this.tableSelection = new TableSelection(table, quill, this.modulesContainer)\r\n this.columnTool = new TableColumnTool(table, quill, this.modulesContainer)\r\n this.tableScrollBar = new TableScrollBar(table, quill, this.modulesContainer)\r\n let timeoutID\r\n this.subscriber = () => {\r\n clearTimeout(timeoutID)\r\n timeoutID = setTimeout(this.hideTableTools, 300)\r\n }\r\n window.addEventListener('resize', this.subscriber, false)\r\n }\r\n\r\n hideTableTools() {\r\n if (this.columnTool) {\r\n this.columnTool.destroy()\r\n }\r\n if (this.tableSelection) {\r\n this.tableSelection.destroy()\r\n }\r\n if (this.tableOperationMenu) {\r\n this.tableOperationMenu.destroy()\r\n }\r\n if (this.tableScrollBar) {\r\n this.tableScrollBar.destroy()\r\n }\r\n if (this.modulesContainer) {\r\n this.modulesContainer.remove()\r\n }\r\n this.columnTool = null\r\n this.tableSelection = null\r\n this.tableOperationMenu = null\r\n this.tableScrollBar = null\r\n this.modulesContainer = null\r\n this.table = null\r\n if (this.subscriber) {\r\n window.removeEventListener('resize', this.subscriber)\r\n }\r\n }\r\n}\r\n\r\nBetterTable.keyboardBindings = {\r\n 'line delete': {\r\n key: 'Delete',\r\n shiftKey: null,\r\n format: { 'table-col': false, 'table-cell-line': false },\r\n collapsed: true,\r\n offset: 0,\r\n handler(range, context) {\r\n // fix: 当光标在编辑器最前且之后为表格时按delete不执行操作\r\n if (range.index === 0 && context.line.next && context.line.next.statics.blotName === 'table-view') {\r\n const [p] = this.quill.getLine(range.index - 1)\r\n const [col] = this.quill.getLine(range.index + 1)\r\n if (p && p.statics.blotName === 'block' && col && col.statics.blotName === 'table-col') {\r\n return false\r\n }\r\n }\r\n return true\r\n },\r\n },\r\n 'table-col enter': {\r\n key: 'Enter',\r\n shiftKey: null,\r\n format: ['table-col'],\r\n collapsed: true,\r\n offset: 0,\r\n handler(range, context) {\r\n if (context.offset === 0 && range.length === 0) {\r\n const [col] = this.quill.getLine(range.index)\r\n if (col && col.statics.blotName === 'table-col') {\r\n const betterTableModule = this.quill.getModule('better-table')\r\n betterTableModule.hideTableTools()\r\n this.quill.insertText(range.index - 1, '\\n', Quill.sources.USER)\r\n this.quill.setSelection(range.index, 0, Quill.sources.USER)\r\n }\r\n }\r\n },\r\n },\r\n 'table-col delete': {\r\n key: 'Delete',\r\n shiftKey: null,\r\n format: ['table-col'],\r\n collapsed: true,\r\n offset: 0,\r\n handler(range, context) {\r\n if (context.offset === 0 && range.length === 0) {\r\n const [col] = this.quill.getLine(range.index)\r\n if (col && col.statics.blotName === 'table-col') {\r\n const betterTableModule = this.quill.getModule('better-table')\r\n let tableBlot\r\n try {\r\n tableBlot = col.parent.parent.parent\r\n }\r\n catch (_e) { }\r\n if (tableBlot && tableBlot.domNode !== betterTableModule.table) {\r\n betterTableModule.hideTableTools()\r\n tableBlot.remove()\r\n this.quill.update(Quill.sources.USER)\r\n }\r\n }\r\n }\r\n },\r\n },\r\n 'table-col backspace': {\r\n key: 'Backspace',\r\n shiftKey: null,\r\n format: ['table-col'],\r\n collapsed: true,\r\n offset: 0,\r\n // eslint-disable-next-line @typescript-eslint/no-empty-function\r\n handler() { },\r\n },\r\n 'table-cell-line backspace': {\r\n key: 'Backspace',\r\n format: ['table-cell-line'],\r\n collapsed: true,\r\n offset: 0,\r\n handler(range) {\r\n const [line] = this.quill.getLine(range.index)\r\n // 移除原有对非table-cell-line的阻止条件,使table-cell-line前的list等内容可以被删除\r\n if (!line.prev) {\r\n return false\r\n }\r\n return true\r\n },\r\n },\r\n 'table-cell-line delete': {\r\n key: 'Delete',\r\n format: ['table-cell-line'],\r\n handler(range, _context) {\r\n // 获取table-cell-line的索引和长度\r\n const [line] = this.quill.getLine(range.index)\r\n const index = this.quill.getIndex(line)\r\n const length = line.length()\r\n if (!line.next // 当无下一个元素且满足以下情况阻止删除操作\r\n && ((!line.prev && length === 1) // 单元格内只有一个table-cell-line且无内容\r\n || (range.index !== index && range.index + 1 >= index + length))) { // 光标在有内容的table-cell-line最后\r\n return false\r\n }\r\n return true\r\n },\r\n },\r\n 'table-cell-line enter': {\r\n key: 'Enter',\r\n shiftKey: null,\r\n format: ['table-cell-line'],\r\n handler(range, context) {\r\n // fix:通过window的光标选区当前指向判断,如果为HTMLElement且为表格容器则定位至下一行\r\n const node = window.getSelection().anchorNode\r\n if (node instanceof HTMLDivElement && node.classList.contains('quill-better-table-wrapper')) {\r\n this.quill.setSelection(range.index + 1, 0, Quill.sources.USER)\r\n this.quill.focus()\r\n return\r\n }\r\n // bugfix: a unexpected new line inserted when user compositionend with hitting Enter\r\n if (this.quill.selection && this.quill.selection.composing) return\r\n const Scope = Quill.imports.parchment.Scope\r\n if (range.length > 0) {\r\n this.quill.scroll.deleteAt(range.index, range.length) // So we do not trigger text-change\r\n }\r\n const lineFormats = Object.keys(context.format).reduce((formats, format) => {\r\n if (this.quill.scroll.query(format, Scope.BLOCK) && !Array.isArray(context.format[format])) {\r\n formats[format] = context.format[format]\r\n }\r\n return formats\r\n }, {})\r\n // insert new cellLine with lineFormats\r\n this.quill.insertText(range.index, '\\n', lineFormats['table-cell-line'], Quill.sources.USER)\r\n // Earlier scroll.deleteAt might have messed up our selection,\r\n // so insertText's built in selection preservation is not reliable\r\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT)\r\n this.quill.focus()\r\n Object.keys(context.format).forEach((name) => {\r\n if (!isNullOrUndefined(lineFormats[name])) return\r\n if (Array.isArray(context.format[name])) return\r\n if (name === 'link') return\r\n this.quill.format(name, context.format[name], Quill.sources.USER)\r\n })\r\n },\r\n },\r\n}\r\n\r\nexport default BetterTable\r\n"],"names":["TableCol","TableColGroup","TableCellLine","TableCell","TableRow","TableBody","TableContainer","TableViewWrapper","Header","List","getEventComposedPath","TableOperationMenu","isNullOrUndefined","matchTableCell","matchTableHeader","matchTable","matchHeader","matchList","matchMentionLink","matchWordShapeImage","matchInline","matchTableRow","table","isPureIE","insideTable","rowId","cellId","TableSelection","TableColumnTool","TableScrollBar"],"mappings":"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"}
1
+ {"version":3,"file":"better-table.cjs.js","sources":["../../../src/table/better-table.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport {\r\n getEventComposedPath,\r\n insideTable,\r\n isNullOrUndefined,\r\n isPureIE,\r\n} from '../config/editor.utils'\r\nimport Header from './formats/header'\r\nimport List from './formats/list'\r\nimport {\r\n cellId,\r\n rowId,\r\n TableBody,\r\n TableCell,\r\n TableCellLine,\r\n TableCol,\r\n TableColGroup,\r\n TableContainer,\r\n TableRow,\r\n TableViewWrapper,\r\n} from './formats/table'\r\nimport TableColumnTool from './modules/table-column-tool'\r\nimport TableOperationMenu from './modules/table-operation-menu'\r\nimport TableScrollBar from './modules/table-scroll-bar'\r\nimport TableSelection from './modules/table-selection'\r\n// import table node matchers\r\nimport {\r\n matchHeader,\r\n matchInline,\r\n matchList,\r\n matchMentionLink,\r\n matchTable,\r\n matchTableCell,\r\n matchTableHeader,\r\n matchTableRow,\r\n matchWordShapeImage,\r\n} from './utils/node-matchers'\r\n\r\nconst Block = Quill.imports['blots/block']\r\nconst Delta = Quill.imports.delta\r\nconst Module = Quill.imports['core/module']\r\n\r\n// @dynamic\r\nclass BetterTable extends Module {\r\n static keyboardBindings: any\r\n isComposition: boolean\r\n quill: any\r\n table: any\r\n modulesContainer: any\r\n tableSelection: any\r\n subscriber: any\r\n tableOperationMenu: any\r\n columnTool: TableColumnTool\r\n tableScrollBar: TableScrollBar\r\n\r\n static register() {\r\n Quill.register(TableCol, true)\r\n Quill.register(TableColGroup, true)\r\n Quill.register(TableCellLine, true)\r\n Quill.register(TableCell, true)\r\n Quill.register(TableRow, true)\r\n Quill.register(TableBody, true)\r\n Quill.register(TableContainer, true)\r\n Quill.register(TableViewWrapper, true)\r\n // register customized Header, overwriting quill built-in Header\r\n Quill.register('formats/header', Header, true)\r\n // register customized List, overwriting quill built-in Header\r\n Quill.register('formats/list', List, true)\r\n }\r\n\r\n constructor(quill, options) {\r\n super(quill, options)\r\n\r\n // handle click on quill-better-table\r\n this.isComposition = false\r\n this.quill.root.addEventListener('mousedown', event => this.handleMouseDown(event, quill), false)\r\n this.quill.root.addEventListener('compositionend', () => this.handleCompositionend(quill), false)\r\n this.quill.root.addEventListener('compositionstart', () => this.handleCompositionstart(quill), false)\r\n this.quill.root.addEventListener('keypress', event => this.handleKeyDown(event, quill), false)\r\n\r\n // handle right click on quill-better-table\r\n this.quill.root.addEventListener(\r\n 'contextmenu',\r\n (evt) => {\r\n if (!this.table) return true\r\n evt.preventDefault()\r\n\r\n // bugfix: evt.path is undefined in Safari, FF, Micro Edge\r\n const path = getEventComposedPath(evt)\r\n if (!path || path.length <= 0) return\r\n\r\n const tableNode = path.filter((node) => {\r\n return (\r\n node.tagName && node.tagName.toUpperCase() === 'TABLE' && node.classList.contains('quill-better-table')\r\n )\r\n })[0]\r\n\r\n const rowNode = path.filter((node) => {\r\n return node.tagName && node.tagName.toUpperCase() === 'TR' && node.getAttribute('data-row')\r\n })[0]\r\n\r\n const cellNode = path.filter((node) => {\r\n return node.tagName && node.tagName.toUpperCase() === 'TD' && node.getAttribute('data-row')\r\n })[0]\r\n\r\n const isTargetCellSelected = this.tableSelection.selectedTds\r\n .map(tableCell => tableCell.domNode)\r\n .includes(cellNode)\r\n\r\n if (this.tableSelection.selectedTds.length <= 0 || !isTargetCellSelected) {\r\n this.tableSelection.setSelection(cellNode.getBoundingClientRect(), cellNode.getBoundingClientRect())\r\n }\r\n\r\n if (this.tableOperationMenu) {\r\n this.tableOperationMenu = this.tableOperationMenu.destroy()\r\n }\r\n\r\n if (tableNode) {\r\n this.tableOperationMenu = new TableOperationMenu(\r\n {\r\n table: tableNode,\r\n row: rowNode,\r\n cell: cellNode,\r\n left: evt.x + 15,\r\n top: evt.y,\r\n },\r\n quill,\r\n options.operationMenu,\r\n )\r\n }\r\n },\r\n false,\r\n )\r\n\r\n // add keyboard binding:Backspace\r\n // prevent user hits backspace to delete table cell\r\n quill.keyboard.addBinding({ key: 'Backspace' }, {}, (range, context) => {\r\n if (range.index === 0 || this.quill.getLength() <= 1) return true\r\n if (context.offset === 0 && range.length === 0) {\r\n const [prev] = this.quill.getLine(range.index - 1)\r\n const [line] = this.quill.getLine(range.index)\r\n if (!isNullOrUndefined(prev)) {\r\n if (prev.statics.blotName === 'table-cell-line' && line.statics.blotName !== 'table-cell-line') {\r\n const betterTableModule = this.quill.getModule('better-table')\r\n let tableBlot\r\n try {\r\n tableBlot = prev.parent.parent.parent.parent\r\n }\r\n catch (_e) { }\r\n if (tableBlot && tableBlot.domNode !== betterTableModule.table) {\r\n betterTableModule.hideTableTools()\r\n tableBlot.remove()\r\n this.quill.update(Quill.sources.USER)\r\n }\r\n return false\r\n }\r\n }\r\n }\r\n return true\r\n })\r\n // since only one matched bindings callback will execute.\r\n // expected my binding callback execute first\r\n // I changed the order of binding callbacks\r\n const thisBinding = quill.keyboard.bindings.Backspace.pop()\r\n quill.keyboard.bindings.Backspace.splice(1, 0, thisBinding)\r\n\r\n // add Matchers to match and render quill-better-table for initialization\r\n // or pasting\r\n quill.clipboard.addMatcher('td', matchTableCell)\r\n quill.clipboard.addMatcher('th', matchTableHeader)\r\n quill.clipboard.addMatcher('table', matchTable)\r\n quill.clipboard.addMatcher('h1, h2, h3, h4, h5, h6', matchHeader)\r\n quill.clipboard.addMatcher('ol, ul', matchList)\r\n quill.clipboard.addMatcher('span', matchMentionLink)\r\n quill.clipboard.addMatcher('v:imageData', matchWordShapeImage)\r\n quill.clipboard.addMatcher(Node.ELEMENT_NODE, matchInline)\r\n\r\n // remove matcher for tr tag\r\n quill.clipboard.matchers = quill.clipboard.matchers.filter((matcher) => {\r\n return matcher[0] !== 'tr'\r\n })\r\n\r\n // fix: 处理空<tr>标签被忽略的情况\r\n quill.clipboard.addMatcher('tr', matchTableRow)\r\n\r\n this.quill.on('editor-change', () => {\r\n const tableContainer = Quill.find(this.table)\r\n if (!tableContainer) {\r\n this.hideTableTools()\r\n }\r\n })\r\n\r\n this.quill.on(Quill.events.SELECTION_CHANGE, (range, _oldRange, source) => {\r\n if (!range) return\r\n const selectionStart = range.index\r\n const selectionEnd = range.index + range.length\r\n if (source === Quill.sources.USER) {\r\n const tables = this.quill.root.getElementsByTagName('table')\r\n if (tables && tables.length) {\r\n [].forEach.call(tables, (table) => {\r\n const tableContainer = Quill.find(table)\r\n if (tableContainer) {\r\n const tableStart = tableContainer.offset(this.quill.scroll)\r\n const tableEnd = tableStart + tableContainer.length()\r\n // @ts-ignore\r\n const classes = Array.from(table.parentNode.classList)\r\n\r\n if (selectionStart <= tableStart && tableEnd <= selectionEnd) {\r\n // @ts-ignore\r\n table.parentNode.classList.add('quill-better-table-selected')\r\n }\r\n else if (classes.includes('quill-better-table-selected')) {\r\n // @ts-ignore\r\n table.parentNode.classList.remove('quill-better-table-selected')\r\n }\r\n }\r\n })\r\n }\r\n }\r\n })\r\n }\r\n\r\n handleMouseDown(evt, quill) {\r\n // bugfix: evt.path is undefined in Safari, FF, Micro Edge\r\n const path = getEventComposedPath(evt)\r\n if (!path || path.length <= 0) return\r\n const tableNode = path.filter((node) => {\r\n return node.tagName && node.tagName.toUpperCase() === 'TABLE' && node.classList.contains('quill-better-table')\r\n })[0]\r\n if (tableNode) {\r\n tableNode.parentNode.classList.remove('quill-better-table-selected')\r\n // current table clicked\r\n if (this.table === tableNode) return\r\n // other table clicked\r\n if (this.table) {\r\n this.hideTableTools()\r\n }\r\n if (!quill.options.readOnly) { // not show table tool in readonly mode\r\n this.showTableTools(tableNode, quill)\r\n }\r\n }\r\n else if (this.table) {\r\n // other clicked\r\n this.hideTableTools()\r\n }\r\n }\r\n\r\n handleKeyDown(evt, quill) {\r\n const key = evt.key\r\n const range = quill.getSelection()\r\n if (this.isComposition || !range) return\r\n const [col] = quill.getLine(range.index)\r\n const [td] = quill.getLine(range.index - 1)\r\n if (key && key !== 'Delete' && col && range) {\r\n if (col.statics.blotName === 'table-col') {\r\n const betterTableModule = this.quill.getModule('better-table')\r\n betterTableModule.hideTableTools()\r\n quill.insertText(range.index - 1, '\\n', Quill.sources.USER)\r\n quill.setSelection(range.index, 0, Quill.sources.USER)\r\n }\r\n else if (td && td.statics.blotName === 'table-cell-line' && col.statics.blotName === 'block') {\r\n quill.insertText(range.index, '\\n', Quill.sources.USER)\r\n quill.setSelection(range.index, 0, Quill.sources.USER)\r\n }\r\n }\r\n }\r\n\r\n handleCompositionstart(quill) {\r\n this.isComposition = true\r\n const range = quill.getSelection()\r\n const [col] = quill.getLine(range.index)\r\n const [td] = quill.getLine(range.index - 1)\r\n if (col && range) {\r\n if (col.statics.blotName === 'table-col') {\r\n const betterTableModule = this.quill.getModule('better-table')\r\n betterTableModule.hideTableTools()\r\n quill.insertText(range.index - 1, '\\n\\t', Quill.sources.USER)\r\n quill.setSelection(range.index, 0, Quill.sources.USER)\r\n }\r\n else if (td && td.statics.blotName === 'table-cell-line' && col.statics.blotName === 'block') {\r\n quill.setSelection(range.index, 0, Quill.sources.USER)\r\n }\r\n }\r\n }\r\n\r\n handleCompositionend(quill) {\r\n // fix: 解决在空行行首用中文输入法输入字符,然后按退格导致插入多余空行的问题\r\n const range = quill.getSelection()\r\n const [line] = quill.getLine(range.index)\r\n const domNode = line.domNode\r\n const isInParagraph = domNode.nodeName === 'P'\r\n const isInTableCell = line.statics.blotName === 'table-cell-line'\r\n if ((isInParagraph || isInTableCell)\r\n && domNode.childNodes.length > 1\r\n && domNode.childNodes[0].nodeName === 'BR') {\r\n domNode.childNodes[0].remove()\r\n }\r\n\r\n if (isPureIE && line instanceof Block) {\r\n // 设置光标位置防止跳入下一行\r\n quill.setSelection(range.index, 0, Quill.sources.SILENT)\r\n }\r\n\r\n this.isComposition = false\r\n }\r\n\r\n getTable(range = this.quill.getSelection()) {\r\n if (isNullOrUndefined(range)) return [null, null, null, -1]\r\n const [cellLine, offset] = this.quill.getLine(range.index)\r\n if (isNullOrUndefined(cellLine) || cellLine.statics.blotName !== TableCellLine.blotName) {\r\n return [null, null, null, -1]\r\n }\r\n const cell = cellLine.tableCell()\r\n const row = cell.row()\r\n const table = row.table()\r\n return [table, row, cell, offset]\r\n }\r\n\r\n insertTable(rows, columns) {\r\n const range = this.quill.getSelection(true)\r\n const isInsideTable = insideTable(range, this.quill)\r\n if (isNullOrUndefined(range) || isInsideTable) return\r\n // let currentBlot = this.quill.getLeaf(range.index)[0]\r\n // let nextBlot = this.quill.getLeaf(range.index + 1)[0]\r\n let delta = new Delta().retain(range.index)\r\n\r\n delta.insert('\\n')\r\n // insert table column\r\n delta = new Array(columns).fill('\\n').reduce((memo, text) => {\r\n memo.insert(text, { 'table-col': true })\r\n return memo\r\n }, delta)\r\n // insert table cell line with empty line\r\n delta = new Array(rows).fill(0).reduce((memo) => {\r\n const tableRowId = rowId()\r\n return new Array(columns).fill('\\n').reduce((op, text) => {\r\n op.insert(text, { 'table-cell-line': { row: tableRowId, cell: cellId() } })\r\n return op\r\n }, memo)\r\n }, delta)\r\n\r\n const [col] = this.quill.getLine(range.index)\r\n if (col && col.statics.blotName === 'table-col') {\r\n delta.insert('\\n')\r\n }\r\n\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n\r\n // feature: 新增表格后首格自动激活编辑状态,initEvent兼容IE\r\n const [cellLine] = this.quill.getLine(range.index + columns + 1)\r\n if (cellLine) {\r\n const cell = cellLine.tableCell()\r\n const td = cell.domNode\r\n const mousedownEvent = document.createEvent('MouseEvent')\r\n const mouseupEvent = document.createEvent('MouseEvent')\r\n const keyEvent = document.createEvent('Event')\r\n mousedownEvent.initEvent('mousedown', true, false)\r\n mouseupEvent.initEvent('mouseup', true, false)\r\n keyEvent.initEvent('keypress', true, false)\r\n td.dispatchEvent(mousedownEvent)\r\n td.dispatchEvent(mouseupEvent)\r\n td.dispatchEvent(keyEvent)\r\n this.tableSelection.endTd = td\r\n }\r\n }\r\n\r\n showTableTools(table, quill) {\r\n this.table = table\r\n this.modulesContainer = document.createElement('div')\r\n this.modulesContainer.classList.add('qlbt-modules-container')\r\n // fix:表格容器插入时获取ql-tooltip容器,用insertBefore插入到它前面,避免遮挡链接浮窗\r\n const linkContainer = this.quill.root.parentNode.querySelector('.ql-tooltip ')\r\n this.quill.root.parentNode.insertBefore(this.modulesContainer, linkContainer)\r\n this.tableSelection = new TableSelection(table, quill, this.modulesContainer)\r\n this.columnTool = new TableColumnTool(table, quill, this.modulesContainer)\r\n this.tableScrollBar = new TableScrollBar(table, quill, this.modulesContainer)\r\n let timeoutID\r\n this.subscriber = () => {\r\n clearTimeout(timeoutID)\r\n timeoutID = setTimeout(this.hideTableTools, 300)\r\n }\r\n window.addEventListener('resize', this.subscriber, false)\r\n }\r\n\r\n hideTableTools() {\r\n if (this.columnTool) {\r\n this.columnTool.destroy()\r\n }\r\n if (this.tableSelection) {\r\n this.tableSelection.destroy()\r\n }\r\n if (this.tableOperationMenu) {\r\n this.tableOperationMenu.destroy()\r\n }\r\n if (this.tableScrollBar) {\r\n this.tableScrollBar.destroy()\r\n }\r\n if (this.modulesContainer) {\r\n this.modulesContainer.remove()\r\n }\r\n this.columnTool = null\r\n this.tableSelection = null\r\n this.tableOperationMenu = null\r\n this.tableScrollBar = null\r\n this.modulesContainer = null\r\n this.table = null\r\n if (this.subscriber) {\r\n window.removeEventListener('resize', this.subscriber)\r\n }\r\n }\r\n}\r\n\r\nBetterTable.keyboardBindings = {\r\n 'line delete': {\r\n key: 'Delete',\r\n shiftKey: null,\r\n format: { 'table-col': false, 'table-cell-line': false },\r\n collapsed: true,\r\n offset: 0,\r\n handler(range, context) {\r\n // fix: 当光标在编辑器最前且之后为表格时按delete不执行操作\r\n if (range.index === 0 && context.line.next && context.line.next.statics.blotName === 'table-view') {\r\n const [p] = this.quill.getLine(range.index - 1)\r\n const [col] = this.quill.getLine(range.index + 1)\r\n if (p && p.statics.blotName === 'block' && col && col.statics.blotName === 'table-col') {\r\n return false\r\n }\r\n }\r\n return true\r\n },\r\n },\r\n 'table-col enter': {\r\n key: 'Enter',\r\n shiftKey: null,\r\n format: ['table-col'],\r\n collapsed: true,\r\n offset: 0,\r\n handler(range, context) {\r\n if (context.offset === 0 && range.length === 0) {\r\n const [col] = this.quill.getLine(range.index)\r\n if (col && col.statics.blotName === 'table-col') {\r\n const betterTableModule = this.quill.getModule('better-table')\r\n betterTableModule.hideTableTools()\r\n this.quill.insertText(range.index - 1, '\\n', Quill.sources.USER)\r\n this.quill.setSelection(range.index, 0, Quill.sources.USER)\r\n }\r\n }\r\n },\r\n },\r\n 'table-col delete': {\r\n key: 'Delete',\r\n shiftKey: null,\r\n format: ['table-col'],\r\n collapsed: true,\r\n offset: 0,\r\n handler(range, context) {\r\n if (context.offset === 0 && range.length === 0) {\r\n const [col] = this.quill.getLine(range.index)\r\n if (col && col.statics.blotName === 'table-col') {\r\n const betterTableModule = this.quill.getModule('better-table')\r\n let tableBlot\r\n try {\r\n tableBlot = col.parent.parent.parent\r\n }\r\n catch (_e) { }\r\n if (tableBlot && tableBlot.domNode !== betterTableModule.table) {\r\n betterTableModule.hideTableTools()\r\n tableBlot.remove()\r\n this.quill.update(Quill.sources.USER)\r\n }\r\n }\r\n }\r\n },\r\n },\r\n 'table-col backspace': {\r\n key: 'Backspace',\r\n shiftKey: null,\r\n format: ['table-col'],\r\n collapsed: true,\r\n offset: 0,\r\n handler() { },\r\n },\r\n 'table-cell-line backspace': {\r\n key: 'Backspace',\r\n format: ['table-cell-line'],\r\n collapsed: true,\r\n offset: 0,\r\n handler(range) {\r\n const [line] = this.quill.getLine(range.index)\r\n // 移除原有对非table-cell-line的阻止条件,使table-cell-line前的list等内容可以被删除\r\n if (!line.prev) {\r\n return false\r\n }\r\n return true\r\n },\r\n },\r\n 'table-cell-line delete': {\r\n key: 'Delete',\r\n format: ['table-cell-line'],\r\n handler(range, _context) {\r\n // 获取table-cell-line的索引和长度\r\n const [line] = this.quill.getLine(range.index)\r\n const index = this.quill.getIndex(line)\r\n const length = line.length()\r\n if (!line.next // 当无下一个元素且满足以下情况阻止删除操作\r\n && ((!line.prev && length === 1) // 单元格内只有一个table-cell-line且无内容\r\n || (range.index !== index && range.index + 1 >= index + length))) { // 光标在有内容的table-cell-line最后\r\n return false\r\n }\r\n return true\r\n },\r\n },\r\n 'table-cell-line enter': {\r\n key: 'Enter',\r\n shiftKey: null,\r\n format: ['table-cell-line'],\r\n handler(range, context) {\r\n // fix:通过window的光标选区当前指向判断,如果为HTMLElement且为表格容器则定位至下一行\r\n const node = window.getSelection().anchorNode\r\n if (node instanceof HTMLDivElement && node.classList.contains('quill-better-table-wrapper')) {\r\n this.quill.setSelection(range.index + 1, 0, Quill.sources.USER)\r\n this.quill.focus()\r\n return\r\n }\r\n // bugfix: a unexpected new line inserted when user compositionend with hitting Enter\r\n if (this.quill.selection && this.quill.selection.composing) return\r\n const Scope = Quill.imports.parchment.Scope\r\n if (range.length > 0) {\r\n this.quill.scroll.deleteAt(range.index, range.length) // So we do not trigger text-change\r\n }\r\n const lineFormats = Object.keys(context.format).reduce((formats, format) => {\r\n if (this.quill.scroll.query(format, Scope.BLOCK) && !Array.isArray(context.format[format])) {\r\n formats[format] = context.format[format]\r\n }\r\n return formats\r\n }, {})\r\n // insert new cellLine with lineFormats\r\n this.quill.insertText(range.index, '\\n', lineFormats['table-cell-line'], Quill.sources.USER)\r\n // Earlier scroll.deleteAt might have messed up our selection,\r\n // so insertText's built in selection preservation is not reliable\r\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT)\r\n this.quill.focus()\r\n Object.keys(context.format).forEach((name) => {\r\n if (!isNullOrUndefined(lineFormats[name])) return\r\n if (Array.isArray(context.format[name])) return\r\n if (name === 'link') return\r\n this.quill.format(name, context.format[name], Quill.sources.USER)\r\n })\r\n },\r\n },\r\n}\r\n\r\nexport default BetterTable\r\n"],"names":["TableCol","TableColGroup","TableCellLine","TableCell","TableRow","TableBody","TableContainer","TableViewWrapper","Header","List","getEventComposedPath","TableOperationMenu","isNullOrUndefined","matchTableCell","matchTableHeader","matchTable","matchHeader","matchList","matchMentionLink","matchWordShapeImage","matchInline","matchTableRow","table","isPureIE","insideTable","rowId","cellId","TableSelection","TableColumnTool","TableScrollBar"],"mappings":"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"}
@@ -106,7 +106,7 @@ class ListItem extends Block {
106
106
  }
107
107
  optimize(context) {
108
108
  const tail = this.prev && this.prev.domNode.lastChild;
109
- if (tail && tail.className && tail.className.indexOf("ql-soft-break") >= 0) {
109
+ if (tail && tail.className && tail.className.includes("ql-soft-break")) {
110
110
  this.domNode.childNodes.forEach((v, i) => {
111
111
  if (i > 0) {
112
112
  this.prev.domNode.appendChild(v);
@@ -131,7 +131,7 @@ class ListItem extends Block {
131
131
  if (data.cell && !parentFormats.cell) {
132
132
  [...tableConfig.CELL_IDENTITY_KEYS, ...tableConfig.CELL_ATTRIBUTES].forEach((key) => (formats[key] || data[key]) && this.parent.domNode.setAttribute(`data-${key}`, formats[key] || data[key]));
133
133
  if (this.parent.parent.statics.blotName !== "table") {
134
- delete formats["list"];
134
+ delete formats.list;
135
135
  this.wrap("table", formats);
136
136
  }
137
137
  }
@@ -149,7 +149,7 @@ ListItem.requiredContainer = ListContainer;
149
149
  function getFormats(dom) {
150
150
  const formats = {};
151
151
  if (dom.tagName === "OL") {
152
- formats["list"] = dom.classList.item(0);
152
+ formats.list = dom.classList.item(0);
153
153
  }
154
154
  return [...tableConfig.CELL_ATTRIBUTES, ...tableConfig.CELL_IDENTITY_KEYS].reduce((tableFormats, attribute) => {
155
155
  if (dom.hasAttribute(`data-${attribute}`)) {