@opentiny/fluent-editor 3.19.4 → 3.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -99
- package/es/attributors/index.es.js +1 -1
- package/es/attributors/line-height.es.js.map +1 -1
- package/es/config/base64-image.es.js.map +1 -1
- package/es/config/editor.config.es.js.map +1 -1
- package/es/config/editor.utils.es.js +12 -12
- package/es/config/editor.utils.es.js.map +1 -1
- package/es/config/i18n/en-us.es.js.map +1 -1
- package/es/config/i18n/zh-cn.es.js.map +1 -1
- package/es/config/icons.config.es.js +4 -4
- package/es/config/icons.config.es.js.map +1 -1
- package/es/config/types/index.es.js +2 -2
- package/es/config.es.js +1 -1
- package/es/config.es.js.map +1 -1
- package/es/counter/index.es.js.map +1 -1
- package/es/custom-clipboard.es.js +14 -14
- package/es/custom-clipboard.es.js.map +1 -1
- package/es/custom-image/BlotFormatter.es.js +1 -1
- package/es/custom-image/BlotFormatter.es.js.map +1 -1
- package/es/custom-image/Options.es.js.map +1 -1
- package/es/custom-image/actions/Action.es.js.map +1 -1
- package/es/custom-image/actions/CustomResizeAction.es.js +6 -4
- package/es/custom-image/actions/CustomResizeAction.es.js.map +1 -1
- package/es/custom-image/actions/DeleteAction.es.js.map +1 -1
- package/es/custom-image/image.es.js +3 -3
- package/es/custom-image/image.es.js.map +1 -1
- package/es/custom-image/specs/BlotSpec.es.js.map +1 -1
- package/es/custom-image/specs/CustomImageSpec.es.js.map +1 -1
- package/es/custom-image/specs/ImageSpec.es.js.map +1 -1
- package/es/custom-uploader.es.js +4 -7
- package/es/custom-uploader.es.js.map +1 -1
- package/es/emoji/emoji-list/people.es.js.map +1 -1
- package/es/emoji/emoji-list.es.js.map +1 -1
- package/es/emoji/emoji-map.es.js.map +1 -1
- package/es/emoji/formats/emoji-blot.es.js +2 -2
- package/es/emoji/formats/emoji-blot.es.js.map +1 -1
- package/es/emoji/index.es.js.map +1 -1
- package/es/emoji/modules/emoji.es.js +7 -7
- package/es/emoji/modules/emoji.es.js.map +1 -1
- package/es/emoji/modules/toolbar-emoji.es.js +15 -15
- package/es/emoji/modules/toolbar-emoji.es.js.map +1 -1
- package/es/emoji/utils.es.js.map +1 -1
- package/es/file/formats/file.es.js.map +1 -1
- package/es/file/index.es.js.map +1 -1
- package/es/file/modules/file-bar.es.js +3 -3
- package/es/file/modules/file-bar.es.js.map +1 -1
- package/es/fluent-editor.es.js +6 -5
- package/es/fluent-editor.es.js.map +1 -1
- package/es/format-painter/index.es.js.map +1 -1
- package/es/global-link/constants.es.js.map +1 -1
- package/es/global-link/formats/customer-widget-link.es.js.map +1 -1
- package/es/global-link/formats/doc-link.es.js.map +1 -1
- package/es/global-link/formats/wiki-link.es.js.map +1 -1
- package/es/global-link/formats/work-item-link.es.js.map +1 -1
- package/es/global-link/index.es.js +1 -1
- package/es/global-link/index.es.js.map +1 -1
- package/es/global-link/utils/createTable.es.js.map +1 -1
- package/es/link/formats/link.es.js +1 -1
- package/es/link/formats/link.es.js.map +1 -1
- package/es/link/index.es.js.map +1 -1
- package/es/link/modules/tooltip.es.js +3 -3
- package/es/link/modules/tooltip.es.js.map +1 -1
- package/es/mention/Mention.es.js +7 -12
- package/es/mention/Mention.es.js.map +1 -1
- package/es/mention/MentionLink.es.js.map +1 -1
- package/es/mention/constants.es.js.map +1 -1
- package/es/quick-menu/index.es.js +1 -1
- package/es/quick-menu/index.es.js.map +1 -1
- package/es/screenshot/index.es.js +172 -135
- package/es/screenshot/index.es.js.map +1 -1
- package/es/soft-break/index.es.js.map +1 -1
- package/es/strike/index.es.js.map +1 -1
- package/es/syntax/index.es.js.map +1 -1
- package/es/table/better-table.es.js +4 -5
- package/es/table/better-table.es.js.map +1 -1
- package/es/table/formats/header.es.js.map +1 -1
- package/es/table/formats/list.es.js +3 -3
- package/es/table/formats/list.es.js.map +1 -1
- package/es/table/formats/table.es.js +26 -27
- package/es/table/formats/table.es.js.map +1 -1
- package/es/table/modules/table-column-tool.es.js +8 -8
- package/es/table/modules/table-column-tool.es.js.map +1 -1
- package/es/table/modules/table-operation-menu.es.js +7 -8
- package/es/table/modules/table-operation-menu.es.js.map +1 -1
- package/es/table/modules/table-scroll-bar.es.js +1 -1
- package/es/table/modules/table-scroll-bar.es.js.map +1 -1
- package/es/table/modules/table-selection.es.js +0 -1
- package/es/table/modules/table-selection.es.js.map +1 -1
- package/es/table/table-config.es.js.map +1 -1
- package/es/table/utils/index.es.js.map +1 -1
- package/es/table/utils/node-matchers.es.js +14 -14
- package/es/table/utils/node-matchers.es.js.map +1 -1
- package/es/toolbar/better-picker.es.js.map +1 -1
- package/es/toolbar/index.es.js +1 -1
- package/es/toolbar/index.es.js.map +1 -1
- package/es/utils/debounce.es.js.map +1 -1
- package/es/utils/image.es.js +26 -0
- package/es/utils/image.es.js.map +1 -0
- package/es/utils/method.es.js +2 -2
- package/es/utils/method.es.js.map +1 -1
- package/es/utils/scroll-lock.es.js +47 -0
- package/es/utils/scroll-lock.es.js.map +1 -0
- package/es/video/index.es.js +6 -3
- package/es/video/index.es.js.map +1 -1
- package/lib/attributors/index.cjs.js +2 -2
- package/lib/attributors/line-height.cjs.js.map +1 -1
- package/lib/config/base64-image.cjs.js.map +1 -1
- package/lib/config/editor.config.cjs.js.map +1 -1
- package/lib/config/editor.utils.cjs.js +12 -12
- package/lib/config/editor.utils.cjs.js.map +1 -1
- package/lib/config/i18n/en-us.cjs.js.map +1 -1
- package/lib/config/i18n/zh-cn.cjs.js.map +1 -1
- package/lib/config/icons.config.cjs.js +4 -4
- package/lib/config/icons.config.cjs.js.map +1 -1
- package/lib/config/types/index.cjs.js +2 -2
- package/lib/config.cjs.js +1 -1
- package/lib/config.cjs.js.map +1 -1
- package/lib/counter/index.cjs.js.map +1 -1
- package/lib/custom-clipboard.cjs.js +14 -14
- package/lib/custom-clipboard.cjs.js.map +1 -1
- package/lib/custom-image/BlotFormatter.cjs.js +1 -1
- package/lib/custom-image/BlotFormatter.cjs.js.map +1 -1
- package/lib/custom-image/Options.cjs.js.map +1 -1
- package/lib/custom-image/actions/Action.cjs.js.map +1 -1
- package/lib/custom-image/actions/CustomResizeAction.cjs.js +6 -4
- package/lib/custom-image/actions/CustomResizeAction.cjs.js.map +1 -1
- package/lib/custom-image/actions/DeleteAction.cjs.js.map +1 -1
- package/lib/custom-image/image.cjs.js +3 -3
- package/lib/custom-image/image.cjs.js.map +1 -1
- package/lib/custom-image/specs/BlotSpec.cjs.js.map +1 -1
- package/lib/custom-image/specs/CustomImageSpec.cjs.js.map +1 -1
- package/lib/custom-image/specs/ImageSpec.cjs.js.map +1 -1
- package/lib/custom-uploader.cjs.js +4 -7
- package/lib/custom-uploader.cjs.js.map +1 -1
- package/lib/emoji/emoji-list/people.cjs.js.map +1 -1
- package/lib/emoji/emoji-list.cjs.js.map +1 -1
- package/lib/emoji/emoji-map.cjs.js.map +1 -1
- package/lib/emoji/formats/emoji-blot.cjs.js +2 -2
- package/lib/emoji/formats/emoji-blot.cjs.js.map +1 -1
- package/lib/emoji/index.cjs.js.map +1 -1
- package/lib/emoji/modules/emoji.cjs.js +7 -7
- package/lib/emoji/modules/emoji.cjs.js.map +1 -1
- package/lib/emoji/modules/toolbar-emoji.cjs.js +15 -15
- package/lib/emoji/modules/toolbar-emoji.cjs.js.map +1 -1
- package/lib/emoji/utils.cjs.js.map +1 -1
- package/lib/file/formats/file.cjs.js.map +1 -1
- package/lib/file/index.cjs.js.map +1 -1
- package/lib/file/modules/file-bar.cjs.js +3 -3
- package/lib/file/modules/file-bar.cjs.js.map +1 -1
- package/lib/fluent-editor.cjs.js +25 -24
- package/lib/fluent-editor.cjs.js.map +1 -1
- package/lib/format-painter/index.cjs.js.map +1 -1
- package/lib/global-link/constants.cjs.js.map +1 -1
- package/lib/global-link/formats/customer-widget-link.cjs.js.map +1 -1
- package/lib/global-link/formats/doc-link.cjs.js.map +1 -1
- package/lib/global-link/formats/wiki-link.cjs.js.map +1 -1
- package/lib/global-link/formats/work-item-link.cjs.js.map +1 -1
- package/lib/global-link/index.cjs.js +1 -1
- package/lib/global-link/index.cjs.js.map +1 -1
- package/lib/global-link/utils/createTable.cjs.js.map +1 -1
- package/lib/link/formats/link.cjs.js +1 -1
- package/lib/link/formats/link.cjs.js.map +1 -1
- package/lib/link/index.cjs.js.map +1 -1
- package/lib/link/modules/tooltip.cjs.js +3 -3
- package/lib/link/modules/tooltip.cjs.js.map +1 -1
- package/lib/mention/Mention.cjs.js +7 -12
- package/lib/mention/Mention.cjs.js.map +1 -1
- package/lib/mention/MentionLink.cjs.js.map +1 -1
- package/lib/mention/constants.cjs.js.map +1 -1
- package/lib/quick-menu/index.cjs.js +1 -1
- package/lib/quick-menu/index.cjs.js.map +1 -1
- package/lib/screenshot/index.cjs.js +173 -136
- package/lib/screenshot/index.cjs.js.map +1 -1
- package/lib/soft-break/index.cjs.js.map +1 -1
- package/lib/strike/index.cjs.js.map +1 -1
- package/lib/syntax/index.cjs.js.map +1 -1
- package/lib/table/better-table.cjs.js +4 -5
- package/lib/table/better-table.cjs.js.map +1 -1
- package/lib/table/formats/header.cjs.js.map +1 -1
- package/lib/table/formats/list.cjs.js +3 -3
- package/lib/table/formats/list.cjs.js.map +1 -1
- package/lib/table/formats/table.cjs.js +26 -27
- package/lib/table/formats/table.cjs.js.map +1 -1
- package/lib/table/modules/table-column-tool.cjs.js +8 -8
- package/lib/table/modules/table-column-tool.cjs.js.map +1 -1
- package/lib/table/modules/table-operation-menu.cjs.js +7 -8
- package/lib/table/modules/table-operation-menu.cjs.js.map +1 -1
- package/lib/table/modules/table-scroll-bar.cjs.js +1 -1
- package/lib/table/modules/table-scroll-bar.cjs.js.map +1 -1
- package/lib/table/modules/table-selection.cjs.js +0 -1
- package/lib/table/modules/table-selection.cjs.js.map +1 -1
- package/lib/table/table-config.cjs.js.map +1 -1
- package/lib/table/utils/index.cjs.js.map +1 -1
- package/lib/table/utils/node-matchers.cjs.js +14 -14
- package/lib/table/utils/node-matchers.cjs.js.map +1 -1
- package/lib/toolbar/better-picker.cjs.js.map +1 -1
- package/lib/toolbar/index.cjs.js +1 -1
- package/lib/toolbar/index.cjs.js.map +1 -1
- package/lib/utils/debounce.cjs.js.map +1 -1
- package/lib/utils/image.cjs.js +26 -0
- package/lib/utils/image.cjs.js.map +1 -0
- package/lib/utils/method.cjs.js +2 -2
- package/lib/utils/method.cjs.js.map +1 -1
- package/lib/utils/scroll-lock.cjs.js +47 -0
- package/lib/utils/scroll-lock.cjs.js.map +1 -0
- package/lib/video/index.cjs.js +6 -3
- package/lib/video/index.cjs.js.map +1 -1
- package/package.json +61 -55
- package/{style.css → theme/style.css} +100 -14
- package/es/types/vue.d.es.js +0 -2
- package/es/types/vue.d.es.js.map +0 -1
- package/lib/types/vue.d.cjs.js +0 -2
- package/lib/types/vue.d.cjs.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../../../src/quick-menu/index.ts"],"sourcesContent":["import Quill from 'quill'\
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../../../src/quick-menu/index.ts"],"sourcesContent":["import type Quill from 'quill'\n\ninterface QuickMenuOptions {\n container: string\n component: any\n}\n\nclass QuickMenu {\n private container: HTMLDivElement\n private hostElement: HTMLDivElement\n private quickMenu: HTMLDivElement\n private quickMenuContainer: HTMLDivElement\n\n // @ts-ignore\n constructor(private quill: Quill, private options: QuickMenuOptions) {\n this.quill = quill\n this.options = options\n this.container = this.quill.container\n this.hostElement = this.container.parentNode as HTMLDivElement\n this.quickMenu = this.hostElement.querySelector('.quick-menu')\n this.quickMenuContainer = this.quickMenu.querySelector('.quick-menu-container')\n quill.keyboard.addBinding({ key: '/' }, this.handleSlashKeyDown)\n quill.keyboard.addBinding({ key: 'ArrowUp' }, this.handleArrowUpKey)\n quill.keyboard.addBinding({ key: 'ArrowDown' }, this.handleArrowDownKey)\n quill.keyboard.addBinding({ key: 'Enter' }, this.handleEnterKey)\n quill.keyboard.bindings.Enter.unshift(quill.keyboard.bindings.Enter.pop())\n document.body.addEventListener('click', this.hideQuickMenu.bind(this))\n }\n\n handleSlashKeyDown = (_range, context) => {\n const index = this.quill.selection.savedRange.index\n this.quill.insertText(index, '/')\n\n // 一行的第一个字符为 '/',且没有格式化,则触发快捷菜单\n const shouldTriggerQuickMenu = context.prefix === '' && Object.keys(context.format).length === 0\n if (shouldTriggerQuickMenu) {\n const cursorIndex = this.quill.selection.savedRange.index\n const cursorBounds = this.quill.getBounds(cursorIndex)\n const { left, top } = cursorBounds\n const { left: editorLeft, top: editorTop } = this.container.getBoundingClientRect()\n const { left: hostElementLeft, top: hostElementTop } = this.hostElement.getBoundingClientRect()\n const relativeLeft = editorLeft - hostElementLeft\n const relativeTop = editorTop - hostElementTop\n const menuLeft = left + relativeLeft - 5\n const menuTop = top + relativeTop + 20\n\n this.quickMenu.style.display = 'block'\n const zIndex = this.quill.options.modules.quickmenu.zIndex\n let style = `left:${menuLeft}px;top:${menuTop}px;`\n if (zIndex || zIndex === 0) {\n style += `z-index:${zIndex}`\n }\n this.quickMenuContainer.setAttribute('style', style)\n this.options.component.activeIndex = 0\n }\n else {\n this.quickMenu.style.display = 'none'\n }\n }\n\n private isOpen() {\n return this.quickMenuContainer.style.display !== 'none' && this.quickMenu.style.display === 'block'\n }\n\n hideQuickMenu = (event) => {\n if (this.quickMenuContainer && !this.quickMenuContainer.contains(event.target)) {\n this.quickMenuContainer.style.display = 'none'\n }\n }\n\n handleArrowUpKey = (_range, _context) => {\n if (this.isOpen()) {\n const index = this.options.component.activeIndex\n const total = this.options.component.quickMenus.length\n this.options.component.activeIndex = (index + total - 1) % total\n return false\n }\n return true\n }\n\n handleArrowDownKey = (_range, _context) => {\n if (this.isOpen()) {\n const index = this.options.component.activeIndex\n const total = this.options.component.quickMenus.length\n this.options.component.activeIndex = (index + 1) % total\n return false\n }\n return true\n }\n\n handleEnterKey = (_range, _context) => {\n if (this.isOpen()) {\n this.options.component.onEnter()\n return false\n }\n return true\n }\n}\n\nexport default QuickMenu\n"],"names":[],"mappings":"AAOA,MAAM,UAAU;AAAA;AAAA,EAOd,YAAoB,OAAsB,SAA2B;AAAjD,SAAA,QAAA;AAAsB,SAAA,UAAA;AAerB,SAAA,qBAAA,CAAC,QAAQ,YAAY;AACxC,YAAM,QAAQ,KAAK,MAAM,UAAU,WAAW;AACzC,WAAA,MAAM,WAAW,OAAO,GAAG;AAG1B,YAAA,yBAAyB,QAAQ,WAAW,MAAM,OAAO,KAAK,QAAQ,MAAM,EAAE,WAAW;AAC/F,UAAI,wBAAwB;AAC1B,cAAM,cAAc,KAAK,MAAM,UAAU,WAAW;AACpD,cAAM,eAAe,KAAK,MAAM,UAAU,WAAW;AAC/C,cAAA,EAAE,MAAM,IAAQ,IAAA;AAChB,cAAA,EAAE,MAAM,YAAY,KAAK,cAAc,KAAK,UAAU;AACtD,cAAA,EAAE,MAAM,iBAAiB,KAAK,mBAAmB,KAAK,YAAY;AACxE,cAAM,eAAe,aAAa;AAClC,cAAM,cAAc,YAAY;AAC1B,cAAA,WAAW,OAAO,eAAe;AACjC,cAAA,UAAU,MAAM,cAAc;AAE/B,aAAA,UAAU,MAAM,UAAU;AAC/B,cAAM,SAAS,KAAK,MAAM,QAAQ,QAAQ,UAAU;AACpD,YAAI,QAAQ,QAAQ,QAAQ,UAAU,OAAO;AACzC,YAAA,UAAU,WAAW,GAAG;AAC1B,mBAAS,WAAW,MAAM;AAAA,QAC5B;AACK,aAAA,mBAAmB,aAAa,SAAS,KAAK;AAC9C,aAAA,QAAQ,UAAU,cAAc;AAAA,MAAA,OAElC;AACE,aAAA,UAAU,MAAM,UAAU;AAAA,MACjC;AAAA,IAAA;AAOF,SAAA,gBAAgB,CAAC,UAAU;AACrB,UAAA,KAAK,sBAAsB,CAAC,KAAK,mBAAmB,SAAS,MAAM,MAAM,GAAG;AACzE,aAAA,mBAAmB,MAAM,UAAU;AAAA,MAC1C;AAAA,IAAA;AAGiB,SAAA,mBAAA,CAAC,QAAQ,aAAa;AACnC,UAAA,KAAK,UAAU;AACX,cAAA,QAAQ,KAAK,QAAQ,UAAU;AACrC,cAAM,QAAQ,KAAK,QAAQ,UAAU,WAAW;AAChD,aAAK,QAAQ,UAAU,eAAe,QAAQ,QAAQ,KAAK;AACpD,eAAA;AAAA,MACT;AACO,aAAA;AAAA,IAAA;AAGY,SAAA,qBAAA,CAAC,QAAQ,aAAa;AACrC,UAAA,KAAK,UAAU;AACX,cAAA,QAAQ,KAAK,QAAQ,UAAU;AACrC,cAAM,QAAQ,KAAK,QAAQ,UAAU,WAAW;AAChD,aAAK,QAAQ,UAAU,eAAe,QAAQ,KAAK;AAC5C,eAAA;AAAA,MACT;AACO,aAAA;AAAA,IAAA;AAGQ,SAAA,iBAAA,CAAC,QAAQ,aAAa;AACjC,UAAA,KAAK,UAAU;AACZ,aAAA,QAAQ,UAAU;AAChB,eAAA;AAAA,MACT;AACO,aAAA;AAAA,IAAA;AAhFP,SAAK,QAAQ;AACb,SAAK,UAAU;AACV,SAAA,YAAY,KAAK,MAAM;AACvB,SAAA,cAAc,KAAK,UAAU;AAClC,SAAK,YAAY,KAAK,YAAY,cAAc,aAAa;AAC7D,SAAK,qBAAqB,KAAK,UAAU,cAAc,uBAAuB;AAC9E,UAAM,SAAS,WAAW,EAAE,KAAK,OAAO,KAAK,kBAAkB;AAC/D,UAAM,SAAS,WAAW,EAAE,KAAK,aAAa,KAAK,gBAAgB;AACnE,UAAM,SAAS,WAAW,EAAE,KAAK,eAAe,KAAK,kBAAkB;AACvE,UAAM,SAAS,WAAW,EAAE,KAAK,WAAW,KAAK,cAAc;AACzD,UAAA,SAAS,SAAS,MAAM,QAAQ,MAAM,SAAS,SAAS,MAAM,IAAK,CAAA;AACzE,aAAS,KAAK,iBAAiB,SAAS,KAAK,cAAc,KAAK,IAAI,CAAC;AAAA,EACvE;AAAA,EAiCQ,SAAS;AACR,WAAA,KAAK,mBAAmB,MAAM,YAAY,UAAU,KAAK,UAAU,MAAM,YAAY;AAAA,EAC9F;AAmCF;"}
|
|
@@ -1,147 +1,184 @@
|
|
|
1
1
|
import Quill from "quill";
|
|
2
|
-
import {
|
|
2
|
+
import { imgToBase64 } from "../utils/image.es.js";
|
|
3
|
+
import { lockScroll } from "../utils/scroll-lock.es.js";
|
|
3
4
|
const Delta = Quill.import("delta");
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
5
|
+
function resolveOptions(options) {
|
|
6
|
+
return Object.assign({
|
|
7
|
+
// @ts-ignore
|
|
8
|
+
Html2Canvas: window.Html2Canvas,
|
|
9
|
+
useCORS: true,
|
|
10
|
+
scale: 1,
|
|
11
|
+
foreignObjectRendering: true,
|
|
12
|
+
beforeCreateImage: void 0,
|
|
13
|
+
beforeCreateCanvas: void 0
|
|
14
|
+
}, options);
|
|
15
|
+
}
|
|
16
|
+
function init() {
|
|
17
|
+
const maskExits = document.querySelectorAll(".ql-screenshot-mask");
|
|
18
|
+
if (maskExits) {
|
|
19
|
+
maskExits.forEach((item) => item && item.remove());
|
|
20
|
+
}
|
|
21
|
+
const wrapper = document.createElement("div");
|
|
22
|
+
wrapper.classList.add("ql-screenshot-wrapper");
|
|
23
|
+
const mask = document.createElement("div");
|
|
24
|
+
mask.className = "ql-screenshot-mask";
|
|
25
|
+
const cutter = document.createElement("div");
|
|
26
|
+
cutter.className = "ql-screenshot-cutter";
|
|
27
|
+
const coordinate = document.createElement("p");
|
|
28
|
+
coordinate.className = "ql-screenshot-coordinate";
|
|
29
|
+
cutter.appendChild(coordinate);
|
|
30
|
+
wrapper.appendChild(mask);
|
|
31
|
+
wrapper.appendChild(cutter);
|
|
32
|
+
document.body.appendChild(wrapper);
|
|
33
|
+
return { wrapper, mask, cutter, coordinate };
|
|
34
|
+
}
|
|
35
|
+
function findParentFixed(dom) {
|
|
36
|
+
if (dom.tagName === "BODY") return false;
|
|
37
|
+
if (["fixed", "sticky"].includes(dom.parentElement.style.position)) return true;
|
|
38
|
+
return findParentFixed(dom.parentElement);
|
|
39
|
+
}
|
|
40
|
+
async function renderImage(Html2Canvas, html2canvasOptions, rect, options) {
|
|
41
|
+
if (options && options.beforeCreateCanvas) {
|
|
42
|
+
await options.beforeCreateCanvas();
|
|
43
|
+
}
|
|
44
|
+
const canvas = await Html2Canvas(document.body, {
|
|
45
|
+
...html2canvasOptions,
|
|
46
|
+
onclone: async (doc, el) => {
|
|
47
|
+
const fixedDom = Array.from(doc.querySelectorAll('*[style*="position: fixed"]'));
|
|
48
|
+
const stickyDom = Array.from(doc.querySelectorAll('*[style*="position: sticky"]'));
|
|
49
|
+
const fixedDomList = /* @__PURE__ */ new Set([...fixedDom, ...stickyDom]);
|
|
50
|
+
for (const dom of fixedDomList) {
|
|
51
|
+
if (findParentFixed(dom)) continue;
|
|
52
|
+
let x = 0;
|
|
53
|
+
let y = 0;
|
|
54
|
+
if (dom.style.top !== "auto") {
|
|
55
|
+
y = window.scrollY;
|
|
56
|
+
}
|
|
57
|
+
if (dom.style.left !== "auto") {
|
|
58
|
+
x = window.scrollX;
|
|
59
|
+
}
|
|
60
|
+
if (x !== 0 || y !== 0) {
|
|
61
|
+
dom.style.transform = `translate(${x}px, ${y}px)`;
|
|
36
62
|
}
|
|
37
63
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
this.coordinate.innerHTML = `${this.width}<br>${this.height}`;
|
|
45
|
-
};
|
|
46
|
-
this.afterShotCtrl = (event) => {
|
|
47
|
-
document.removeEventListener("mousedown", this.toggleRect);
|
|
48
|
-
this.mask.remove();
|
|
49
|
-
const target = event.target;
|
|
50
|
-
if (target && target.className === "ql-screenshot-ok") {
|
|
51
|
-
const rect = {
|
|
52
|
-
x: this.start.x,
|
|
53
|
-
y: this.start.y,
|
|
54
|
-
width: this.width,
|
|
55
|
-
height: this.height,
|
|
56
|
-
scrollX: document.body.scrollLeft,
|
|
57
|
-
scrollY: document.body.scrollTop,
|
|
58
|
-
allowTaint: true,
|
|
59
|
-
// 是否允许跨域图片渲染
|
|
60
|
-
logging: false
|
|
61
|
-
// 是否启用日志记录
|
|
62
|
-
};
|
|
63
|
-
this.renderImage(rect);
|
|
64
|
-
}
|
|
65
|
-
this.start = void 0;
|
|
66
|
-
};
|
|
67
|
-
if (this.options.Html2Canvas == null) {
|
|
68
|
-
throw new Error(
|
|
69
|
-
"ScreenShot module requires html2canvas. Please include the library on the page before FluentEditor."
|
|
70
|
-
);
|
|
64
|
+
const imgs = doc.querySelectorAll("img");
|
|
65
|
+
const promises = Array.from(imgs).map(async (img) => {
|
|
66
|
+
img.src = await imgToBase64(img.src);
|
|
67
|
+
});
|
|
68
|
+
await Promise.all(promises);
|
|
69
|
+
html2canvasOptions.onclone && await html2canvasOptions.onclone(doc, el);
|
|
71
70
|
}
|
|
72
|
-
|
|
71
|
+
});
|
|
72
|
+
let cropCanvas = document.createElement("canvas");
|
|
73
|
+
cropCanvas.width = rect.width;
|
|
74
|
+
cropCanvas.height = rect.height;
|
|
75
|
+
const cropCanvasCtx = cropCanvas.getContext("2d");
|
|
76
|
+
cropCanvasCtx.drawImage(
|
|
77
|
+
canvas,
|
|
78
|
+
rect.x + window.scrollX,
|
|
79
|
+
rect.y + window.scrollY,
|
|
80
|
+
rect.width,
|
|
81
|
+
rect.height,
|
|
82
|
+
0,
|
|
83
|
+
0,
|
|
84
|
+
rect.width,
|
|
85
|
+
rect.height
|
|
86
|
+
);
|
|
87
|
+
if (options && options.beforeCreateImage) {
|
|
88
|
+
cropCanvas = await options.beforeCreateImage(cropCanvas);
|
|
73
89
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
this.cutter.className = "ql-screenshot-cutter";
|
|
83
|
-
this.coordinate = document.createElement("p");
|
|
84
|
-
this.coordinate.className = "ql-screenshot-coordinate";
|
|
85
|
-
this.insertBlock();
|
|
86
|
-
this.cutter.appendChild(this.coordinate);
|
|
87
|
-
this.mask.appendChild(this.cutter);
|
|
88
|
-
document.body.appendChild(this.mask);
|
|
89
|
-
document.addEventListener("mousedown", this.toggleRect);
|
|
90
|
+
return typeof cropCanvas === "string" ? cropCanvas : cropCanvas.toDataURL();
|
|
91
|
+
}
|
|
92
|
+
function Screenshot() {
|
|
93
|
+
this.quill.options.screenshot = resolveOptions(this.quill.options.screenshot);
|
|
94
|
+
const options = this.quill.options.screenshot;
|
|
95
|
+
const { Html2Canvas, beforeCreateImage, beforeCreateCanvas, ...html2CanvasOptions } = options;
|
|
96
|
+
if (!Html2Canvas) {
|
|
97
|
+
throw new Error("ScreenShot module requires html2canvas. Please include the library on the page before FluentEditor.");
|
|
90
98
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
99
|
+
const range = this.quill.getSelection();
|
|
100
|
+
const { wrapper, mask, cutter, coordinate } = init();
|
|
101
|
+
const status = {
|
|
102
|
+
leftClickLockFlag: false,
|
|
103
|
+
start: void 0
|
|
104
|
+
};
|
|
105
|
+
const cleanLock = lockScroll();
|
|
106
|
+
const removeContextmenu = (event) => {
|
|
107
|
+
event.preventDefault();
|
|
108
|
+
wrapper.remove();
|
|
109
|
+
cleanLock();
|
|
110
|
+
document.removeEventListener("contextmenu", removeContextmenu);
|
|
111
|
+
};
|
|
112
|
+
const afterShotCtrl = async (event) => {
|
|
113
|
+
document.removeEventListener("mousedown", toggleRect);
|
|
114
|
+
const cutterRect = cutter.getBoundingClientRect();
|
|
115
|
+
const target = event.target;
|
|
116
|
+
wrapper.remove();
|
|
117
|
+
cleanLock();
|
|
118
|
+
if (target && target.className === "ql-screenshot-confirm") {
|
|
119
|
+
const image = await renderImage(Html2Canvas, html2CanvasOptions, cutterRect, { beforeCreateCanvas, beforeCreateImage });
|
|
120
|
+
const delta = new Delta().retain(range.index).delete(range.length).insert({ image });
|
|
121
|
+
this.quill.updateContents(delta, Quill.sources.USER);
|
|
122
|
+
this.quill.setSelection(range.index + 1, Quill.sources.SILENT);
|
|
96
123
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
124
|
+
status.start = void 0;
|
|
125
|
+
};
|
|
126
|
+
const drawRect = (event) => {
|
|
127
|
+
const startX = status.start.x;
|
|
128
|
+
const startY = status.start.y;
|
|
129
|
+
const endX = event.clientX;
|
|
130
|
+
const endY = event.clientY;
|
|
131
|
+
const width = Math.abs(endX - startX);
|
|
132
|
+
const height = Math.abs(endY - startY);
|
|
133
|
+
const top = startY < endY ? startY : endY;
|
|
134
|
+
const left = startX < endX ? startX : endX;
|
|
135
|
+
const bottom = window.innerHeight - height - top;
|
|
136
|
+
const right = window.innerWidth - width - left;
|
|
137
|
+
const maskPath = `
|
|
138
|
+
linear-gradient(to top, #fff, #fff) top / 100% ${top}px,
|
|
139
|
+
linear-gradient(to bottom, #fff, #fff) bottom /100% ${bottom}px,
|
|
140
|
+
linear-gradient(to left, #fff, #fff) left / ${left}px 100%,
|
|
141
|
+
linear-gradient(to right, #fff, #fff) right / ${right}px 100%
|
|
142
|
+
`;
|
|
143
|
+
Object.assign(cutter.style, {
|
|
144
|
+
width: `${width}px`,
|
|
145
|
+
height: `${height}px`,
|
|
146
|
+
left: `${left}px`,
|
|
147
|
+
top: `${top}px`
|
|
148
|
+
});
|
|
149
|
+
Object.assign(mask.style, {
|
|
150
|
+
"mask": maskPath,
|
|
151
|
+
"-webkit-mask-repeat": "no-repeat"
|
|
152
|
+
});
|
|
153
|
+
coordinate.textContent = `${width}, ${height}`;
|
|
154
|
+
};
|
|
155
|
+
const toggleRect = (event) => {
|
|
156
|
+
if (event.button === 2) {
|
|
157
|
+
document.removeEventListener("mousemove", drawRect);
|
|
158
|
+
document.removeEventListener("mousedown", toggleRect);
|
|
159
|
+
document.addEventListener("contextmenu", removeContextmenu);
|
|
160
|
+
return;
|
|
128
161
|
}
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
}
|
|
143
|
-
|
|
162
|
+
if (!status.leftClickLockFlag) {
|
|
163
|
+
if (status.start) {
|
|
164
|
+
document.removeEventListener("mousemove", drawRect);
|
|
165
|
+
const doneBtn = document.createElement("div");
|
|
166
|
+
doneBtn.innerHTML = `<div class="ql-screenshot-confirm"></div><div class="ql-screenshot-cancel"></div>`;
|
|
167
|
+
doneBtn.className = "ql-screenshot-done";
|
|
168
|
+
doneBtn.addEventListener("click", afterShotCtrl);
|
|
169
|
+
coordinate.remove();
|
|
170
|
+
cutter.appendChild(doneBtn);
|
|
171
|
+
status.leftClickLockFlag = true;
|
|
172
|
+
} else {
|
|
173
|
+
status.start = { x: event.clientX, y: event.clientY };
|
|
174
|
+
document.addEventListener("mousemove", drawRect);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
document.addEventListener("mousedown", toggleRect);
|
|
179
|
+
}
|
|
180
|
+
Screenshot.toolName = "screenshot";
|
|
144
181
|
export {
|
|
145
|
-
Screenshot
|
|
182
|
+
Screenshot
|
|
146
183
|
};
|
|
147
184
|
//# sourceMappingURL=index.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../../../src/screenshot/index.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { isPureIE } from '../config/editor.utils'\r\n\r\nconst Delta = Quill.import('delta')\r\n\r\ninterface ScreenShotOptions {\r\n Html2Canvas: any\r\n screenshotOnStaticPage?: boolean\r\n}\r\n\r\nclass Screenshot {\r\n static DEFAULTS = {\r\n Html2Canvas: (() => {\r\n // @ts-ignore\r\n return window.Html2Canvas\r\n })(),\r\n screenshotOnStaticPage: false,\r\n }\r\n\r\n range: any\r\n cutter: HTMLDivElement\r\n mask: HTMLDivElement\r\n coordinate: HTMLDivElement\r\n width: number\r\n height: number\r\n leftClickLockFlag = false\r\n start: {\r\n x: number\r\n y: number\r\n }\r\n\r\n constructor(public quill, protected options: Partial<ScreenShotOptions> = {}, range) {\r\n if (this.options.Html2Canvas == null) {\r\n throw new Error(\r\n 'ScreenShot module requires html2canvas. Please include the library on the page before FluentEditor.',\r\n )\r\n }\r\n this.range = range\r\n }\r\n\r\n 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 this.mask = document.createElement('div')\r\n this.mask.className = 'ql-screenshot-mask'\r\n this.cutter = document.createElement('div')\r\n this.cutter.className = 'ql-screenshot-cutter'\r\n this.coordinate = document.createElement('p')\r\n this.coordinate.className = 'ql-screenshot-coordinate'\r\n this.insertBlock()\r\n this.cutter.appendChild(this.coordinate)\r\n this.mask.appendChild(this.cutter)\r\n document.body.appendChild(this.mask)\r\n document.addEventListener('mousedown', this.toggleRect)\r\n }\r\n\r\n insertBlock() {\r\n for (let i = 0; i < 7; i++) {\r\n const blockItem = document.createElement('div')\r\n blockItem.className = 'ql-screenshot-border-block'\r\n this.cutter.appendChild(blockItem)\r\n }\r\n }\r\n\r\n removeContextmenu = (event) => {\r\n event.preventDefault()\r\n this.mask.remove()\r\n document.removeEventListener('contextmenu', this.removeContextmenu)\r\n }\r\n\r\n toggleRect = (event: MouseEvent) => {\r\n // 右键取消截图操作\r\n if (event.button === 2) {\r\n document.removeEventListener('mousemove', this.drawRect)\r\n document.removeEventListener('mousedown', this.toggleRect)\r\n document.addEventListener('contextmenu', this.removeContextmenu)\r\n return\r\n }\r\n if (!this.leftClickLockFlag) {\r\n if (this.start) {\r\n // 如果有起点,则当前触发坐标为终点,移除监听事件并添加确认和取消按钮\r\n document.removeEventListener('mousemove', this.drawRect)\r\n const doneBtn = document.createElement('div')\r\n doneBtn.innerHTML = `<span class=\"ql-screenshot-ok\"></span><span class=\"ql-screenshot-cancel\"></span>`\r\n doneBtn.className = 'ql-screenshot-done'\r\n doneBtn.addEventListener('click', this.afterShotCtrl)\r\n this.coordinate.remove()\r\n this.cutter.appendChild(doneBtn)\r\n this.leftClickLockFlag = true\r\n }\r\n else {\r\n // 无起点则设置起点坐标,监听鼠标移动\r\n this.start = { x: event.clientX, y: event.clientY }\r\n this.cutter.style.left = `${this.start.x}px`\r\n this.cutter.style.top = `${this.start.y}px`\r\n document.addEventListener('mousemove', this.drawRect)\r\n }\r\n }\r\n }\r\n\r\n drawRect = (event: MouseEvent) => {\r\n // 通过鼠标移动描绘截图图层\r\n this.width = event.clientX - this.start.x\r\n this.height = event.clientY - this.start.y\r\n this.cutter.style.width = `${this.width}px`\r\n this.cutter.style.height = `${this.height}px`\r\n this.coordinate.innerHTML = `${this.width}<br>${this.height}`\r\n }\r\n\r\n afterShotCtrl = (event) => {\r\n document.removeEventListener('mousedown', this.toggleRect)\r\n this.mask.remove()\r\n const target = event.target\r\n if (target && target.className === 'ql-screenshot-ok') {\r\n const rect = {\r\n x: this.start.x,\r\n y: this.start.y,\r\n width: this.width,\r\n height: this.height,\r\n scrollX: document.body.scrollLeft,\r\n scrollY: document.body.scrollTop,\r\n allowTaint: true, // 是否允许跨域图片渲染\r\n logging: false, // 是否启用日志记录\r\n }\r\n this.renderImage(rect)\r\n }\r\n this.start = undefined\r\n }\r\n\r\n renderImage(rect) {\r\n if (isPureIE) {\r\n this.options.Html2Canvas(document.body, rect).then(canvas => this.insertEditor(canvas))\r\n }\r\n else {\r\n this.options.Html2Canvas(document.body, {\r\n allowTaint: true, // 是否允许跨域图片渲染\r\n foreignObjectRendering: this.quill.options.screenshotOnStaticPage, // 是否使用svg方式\r\n logging: false, // 是否启用日志记录\r\n }).then((canvas) => {\r\n // 当前canvas为body全局截图,从当前截图中截取想要的部分重新绘制转成base64插入富文本\r\n const cropCanvas = document.createElement('canvas')\r\n cropCanvas.width = this.width\r\n cropCanvas.height = this.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 this.width,\r\n this.height,\r\n 0,\r\n 0,\r\n this.width,\r\n this.height,\r\n )\r\n this.insertEditor(cropCanvas)\r\n cropCanvas.remove()\r\n })\r\n }\r\n }\r\n\r\n insertEditor(canvas) {\r\n const image = canvas.toDataURL()\r\n const delta = new Delta()\r\n .retain(this.range.index)\r\n .delete(this.range.length)\r\n .insert({ image })\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(this.range.index + 1, Quill.sources.SILENT)\r\n }\r\n}\r\n\r\nexport default Screenshot\r\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../../../src/screenshot/index.ts"],"sourcesContent":["import type html2canvas from 'html2canvas'\nimport type { Options as Html2CanvasOptions } from 'html2canvas'\nimport type Toolbar from 'quill/modules/toolbar'\nimport Quill from 'quill'\nimport { imgToBase64 } from '../utils/image'\nimport { lockScroll } from '../utils/scroll-lock'\n\nconst Delta = Quill.import('delta')\n\nexport type ScreenShotOptions = Partial<Html2CanvasOptions> & {\n Html2Canvas: typeof html2canvas\n beforeCreateCanvas: () => void | Promise<void>\n beforeCreateImage: (canvas: HTMLCanvasElement) => HTMLCanvasElement | string | Promise<HTMLCanvasElement | string>\n}\ninterface ScreenShotOptionsInQuill {\n quill: {\n options: {\n screenshot: Partial<ScreenShotOptions>\n }\n }\n}\n\nfunction resolveOptions(options: Partial<ScreenShotOptions>) {\n return Object.assign({\n // @ts-ignore\n Html2Canvas: window.Html2Canvas,\n useCORS: true,\n scale: 1,\n foreignObjectRendering: true,\n beforeCreateImage: undefined,\n beforeCreateCanvas: undefined,\n }, options)\n}\n\nfunction init() {\n const maskExits = document.querySelectorAll('.ql-screenshot-mask')\n if (maskExits) {\n maskExits.forEach(item => item && item.remove())\n }\n // 创建截图图层\n const wrapper = document.createElement('div')\n wrapper.classList.add('ql-screenshot-wrapper')\n const mask = document.createElement('div')\n mask.className = 'ql-screenshot-mask'\n const cutter = document.createElement('div')\n cutter.className = 'ql-screenshot-cutter'\n const coordinate = document.createElement('p')\n coordinate.className = 'ql-screenshot-coordinate'\n cutter.appendChild(coordinate)\n wrapper.appendChild(mask)\n wrapper.appendChild(cutter)\n document.body.appendChild(wrapper)\n return { wrapper, mask, cutter, coordinate }\n}\n\nfunction findParentFixed(dom: HTMLElement) {\n if (dom.tagName === 'BODY') return false\n if (['fixed', 'sticky'].includes(dom.parentElement.style.position)) return true\n return findParentFixed(dom.parentElement)\n}\nasync function renderImage(\n Html2Canvas: typeof html2canvas,\n html2canvasOptions: Partial<Html2CanvasOptions>,\n rect: DOMRect,\n options?: Omit<ScreenShotOptions, 'Html2Canvas' | keyof Html2CanvasOptions>,\n) {\n if (options && options.beforeCreateCanvas) {\n await options.beforeCreateCanvas()\n }\n const canvas: CanvasImageSource = await Html2Canvas(document.body, {\n ...html2canvasOptions,\n onclone: async (doc: Document, el: HTMLElement) => {\n // find all fixed or sticky dom\n const fixedDom = Array.from(doc.querySelectorAll('*[style*=\"position: fixed\"]')) as HTMLElement[]\n const stickyDom = Array.from(doc.querySelectorAll('*[style*=\"position: sticky\"]')) as HTMLElement[]\n const fixedDomList = new Set([...fixedDom, ...stickyDom])\n for (const dom of fixedDomList) {\n // if parent dom already has fixed or sticky style\n // means that transform will be settle. skip\n if (findParentFixed(dom)) continue\n // use transform move to correct position\n let x = 0\n let y = 0\n if (dom.style.top !== 'auto') {\n y = window.scrollY\n }\n if (dom.style.left !== 'auto') {\n x = window.scrollX\n }\n if (x !== 0 || y !== 0) {\n dom.style.transform = `translate(${x}px, ${y}px)`\n }\n }\n\n const imgs = doc.querySelectorAll('img')\n const promises = Array.from(imgs).map(async (img) => {\n img.src = await imgToBase64(img.src)\n })\n await Promise.all(promises)\n html2canvasOptions.onclone && await html2canvasOptions.onclone(doc, el)\n },\n })\n // 当前canvas为body全局截图,从当前截图中截取想要的部分重新绘制转成base64插入富文本\n let cropCanvas: HTMLCanvasElement | string = document.createElement('canvas')\n cropCanvas.width = rect.width\n cropCanvas.height = rect.height\n const cropCanvasCtx = cropCanvas.getContext('2d')\n cropCanvasCtx.drawImage(\n canvas,\n rect.x + window.scrollX,\n rect.y + window.scrollY,\n rect.width,\n rect.height,\n 0,\n 0,\n rect.width,\n rect.height,\n )\n if (options && options.beforeCreateImage) {\n cropCanvas = await options.beforeCreateImage(cropCanvas)\n }\n return typeof cropCanvas === 'string' ? cropCanvas : cropCanvas.toDataURL()\n}\n\nexport function Screenshot(this: Toolbar & ScreenShotOptionsInQuill) {\n this.quill.options.screenshot = resolveOptions(this.quill.options.screenshot)\n const options = this.quill.options.screenshot\n // @ts-ignore\n const { Html2Canvas, beforeCreateImage, beforeCreateCanvas, ...html2CanvasOptions } = options\n if (!Html2Canvas) {\n throw new Error('ScreenShot module requires html2canvas. Please include the library on the page before FluentEditor.')\n }\n const range = this.quill.getSelection()\n const { wrapper, mask, cutter, coordinate } = init()\n const status: {\n leftClickLockFlag: boolean\n start?: {\n x: number\n y: number\n }\n } = {\n leftClickLockFlag: false,\n start: undefined,\n }\n const cleanLock = lockScroll()\n\n const removeContextmenu = (event: Event) => {\n event.preventDefault()\n wrapper.remove()\n cleanLock()\n document.removeEventListener('contextmenu', removeContextmenu)\n }\n const afterShotCtrl = async (event: MouseEvent) => {\n document.removeEventListener('mousedown', toggleRect)\n const cutterRect = cutter.getBoundingClientRect()\n const target = event.target as HTMLElement\n wrapper.remove()\n cleanLock()\n if (target && target.className === 'ql-screenshot-confirm') {\n const image = await renderImage(Html2Canvas, html2CanvasOptions, cutterRect, { beforeCreateCanvas, beforeCreateImage })\n\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert({ image })\n this.quill.updateContents(delta, Quill.sources.USER)\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT)\n }\n status.start = undefined\n }\n const drawRect = (event: MouseEvent) => {\n // 通过鼠标移动描绘截图图层\n const startX = status.start.x\n const startY = status.start.y\n const endX = event.clientX\n const endY = event.clientY\n const width = Math.abs(endX - startX)\n const height = Math.abs(endY - startY)\n const top = startY < endY ? startY : endY\n const left = startX < endX ? startX : endX\n const bottom = window.innerHeight - height - top\n const right = window.innerWidth - width - left\n\n const maskPath = `\n linear-gradient(to top, #fff, #fff) top / 100% ${top}px,\n linear-gradient(to bottom, #fff, #fff) bottom /100% ${bottom}px,\n linear-gradient(to left, #fff, #fff) left / ${left}px 100%,\n linear-gradient(to right, #fff, #fff) right / ${right}px 100%\n `\n Object.assign(cutter.style, {\n width: `${width}px`,\n height: `${height}px`,\n left: `${left}px`,\n top: `${top}px`,\n })\n Object.assign(mask.style, {\n 'mask': maskPath,\n '-webkit-mask-repeat': 'no-repeat',\n })\n coordinate.textContent = `${width}, ${height}`\n }\n const toggleRect = (event: MouseEvent) => {\n // 右键取消截图操作\n if (event.button === 2) {\n document.removeEventListener('mousemove', drawRect)\n document.removeEventListener('mousedown', toggleRect)\n document.addEventListener('contextmenu', removeContextmenu)\n return\n }\n if (!status.leftClickLockFlag) {\n if (status.start) {\n // 如果有起点,则当前触发坐标为终点,移除监听事件并添加确认和取消按钮\n document.removeEventListener('mousemove', drawRect)\n const doneBtn = document.createElement('div')\n doneBtn.innerHTML = `<div class=\"ql-screenshot-confirm\"></div><div class=\"ql-screenshot-cancel\"></div>`\n doneBtn.className = 'ql-screenshot-done'\n doneBtn.addEventListener('click', afterShotCtrl)\n coordinate.remove()\n cutter.appendChild(doneBtn)\n status.leftClickLockFlag = true\n }\n else {\n // 无起点则设置起点坐标,监听鼠标移动\n status.start = { x: event.clientX, y: event.clientY }\n document.addEventListener('mousemove', drawRect)\n }\n }\n }\n document.addEventListener('mousedown', toggleRect)\n}\nScreenshot.toolName = 'screenshot'\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../../../src/soft-break/index.ts"],"sourcesContent":["import Quill from 'quill'\
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../../../src/soft-break/index.ts"],"sourcesContent":["import Quill from 'quill'\n\nconst Embed = Quill.imports['blots/embed']\n\nclass SoftBreak extends Embed {\n static blotName: string\n static tagName: string\n static className: string\n domNode: any\n prev: any\n next: any\n remove: () => void\n\n static create() {\n const node = super.create()\n return node\n }\n\n optimize() {\n // li的开头结尾,移除软回车\n if (this.prev === null) {\n this.remove()\n }\n }\n\n length() {\n return 1\n }\n}\nSoftBreak.blotName = 'soft-break'\nSoftBreak.tagName = 'BR'\nSoftBreak.className = 'ql-soft-break'\n\nexport default SoftBreak\n"],"names":[],"mappings":";AAEA,MAAM,QAAQ,MAAM,QAAQ,aAAa;AAEzC,MAAM,kBAAkB,MAAM;AAAA,EAS5B,OAAO,SAAS;AACR,UAAA,OAAO,MAAM;AACZ,WAAA;AAAA,EACT;AAAA,EAEA,WAAW;AAEL,QAAA,KAAK,SAAS,MAAM;AACtB,WAAK,OAAO;AAAA,IACd;AAAA,EACF;AAAA,EAEA,SAAS;AACA,WAAA;AAAA,EACT;AACF;AACA,UAAU,WAAW;AACrB,UAAU,UAAU;AACpB,UAAU,YAAY;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../../../src/strike/index.ts"],"sourcesContent":["import Quill from 'quill'\
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../../../src/strike/index.ts"],"sourcesContent":["import Quill from 'quill'\n\nconst Inline = Quill.imports['blots/inline']\n\n// @dynamic\nclass StrikeBlot extends Inline {\n static blotName: string\n static className: string\n static tagName: string\n // 此处删除了formats方法,当前tag非span,则并不需要进行特殊处理去重写formats方法\n}\nStrikeBlot.blotName = 'strike'\nStrikeBlot.tagName = 'u'\nStrikeBlot.className = 'ql-custom-strike'\n\nexport default StrikeBlot\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.es.js","sources":["../../../src/syntax/index.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../../../src/syntax/index.ts"],"sourcesContent":["import type TypeSyntax from 'quill/modules/syntax'\nimport Quill from 'quill'\n\nconst Syntax = Quill.import('modules/syntax') as typeof TypeSyntax\n\n// @dynamic\nclass CustomSyntax extends Syntax {\n static DEFAULTS: { hljs: any, interval: number, languages: { key: string, label: string }[] }\n}\n\nCustomSyntax.DEFAULTS = {\n hljs: (() => {\n // @ts-ignore\n return window.hljs\n })(),\n interval: 1000,\n languages: [\n { key: 'plain', label: 'Plain' },\n { key: 'bash', label: 'Bash' },\n { key: 'cpp', label: 'C++' },\n { key: 'cs', label: 'C#' },\n { key: 'css', label: 'CSS' },\n { key: 'diff', label: 'Diff' },\n { key: 'xml', label: 'HTML/XML' },\n { key: 'java', label: 'Java' },\n { key: 'javascript', label: 'Javascript' },\n { key: 'markdown', label: 'Markdown' },\n { key: 'php', label: 'PHP' },\n { key: 'python', label: 'Python' },\n { key: 'ruby', label: 'Ruby' },\n { key: 'sql', label: 'SQL' },\n ],\n}\n\nexport default CustomSyntax\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;"}
|
|
@@ -9,7 +9,7 @@ import TableScrollBar from "./modules/table-scroll-bar.es.js";
|
|
|
9
9
|
import TableSelection from "./modules/table-selection.es.js";
|
|
10
10
|
import { matchTableCell, matchTableHeader, matchTable, matchHeader, matchList, matchMentionLink, matchWordShapeImage, matchInline, matchTableRow } from "./utils/node-matchers.es.js";
|
|
11
11
|
const Block = Quill.imports["blots/block"];
|
|
12
|
-
const Delta = Quill.imports
|
|
12
|
+
const Delta = Quill.imports.delta;
|
|
13
13
|
const Module = Quill.imports["core/module"];
|
|
14
14
|
class BetterTable extends Module {
|
|
15
15
|
static register() {
|
|
@@ -94,8 +94,8 @@ class BetterTable extends Module {
|
|
|
94
94
|
}
|
|
95
95
|
return true;
|
|
96
96
|
});
|
|
97
|
-
const thisBinding = quill.keyboard.bindings
|
|
98
|
-
quill.keyboard.bindings
|
|
97
|
+
const thisBinding = quill.keyboard.bindings.Backspace.pop();
|
|
98
|
+
quill.keyboard.bindings.Backspace.splice(1, 0, thisBinding);
|
|
99
99
|
quill.clipboard.addMatcher("td", matchTableCell);
|
|
100
100
|
quill.clipboard.addMatcher("th", matchTableHeader);
|
|
101
101
|
quill.clipboard.addMatcher("table", matchTable);
|
|
@@ -129,7 +129,7 @@ class BetterTable extends Module {
|
|
|
129
129
|
const classes = Array.from(table.parentNode.classList);
|
|
130
130
|
if (selectionStart <= tableStart && tableEnd <= selectionEnd) {
|
|
131
131
|
table.parentNode.classList.add("quill-better-table-selected");
|
|
132
|
-
} else if (classes.
|
|
132
|
+
} else if (classes.includes("quill-better-table-selected")) {
|
|
133
133
|
table.parentNode.classList.remove("quill-better-table-selected");
|
|
134
134
|
}
|
|
135
135
|
}
|
|
@@ -364,7 +364,6 @@ BetterTable.keyboardBindings = {
|
|
|
364
364
|
format: ["table-col"],
|
|
365
365
|
collapsed: true,
|
|
366
366
|
offset: 0,
|
|
367
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
368
367
|
handler() {
|
|
369
368
|
}
|
|
370
369
|
},
|