@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.
Files changed (213) hide show
  1. package/README.md +99 -99
  2. package/es/attributors/index.es.js +1 -1
  3. package/es/attributors/line-height.es.js.map +1 -1
  4. package/es/config/base64-image.es.js.map +1 -1
  5. package/es/config/editor.config.es.js.map +1 -1
  6. package/es/config/editor.utils.es.js +12 -12
  7. package/es/config/editor.utils.es.js.map +1 -1
  8. package/es/config/i18n/en-us.es.js.map +1 -1
  9. package/es/config/i18n/zh-cn.es.js.map +1 -1
  10. package/es/config/icons.config.es.js +4 -4
  11. package/es/config/icons.config.es.js.map +1 -1
  12. package/es/config/types/index.es.js +2 -2
  13. package/es/config.es.js +1 -1
  14. package/es/config.es.js.map +1 -1
  15. package/es/counter/index.es.js.map +1 -1
  16. package/es/custom-clipboard.es.js +14 -14
  17. package/es/custom-clipboard.es.js.map +1 -1
  18. package/es/custom-image/BlotFormatter.es.js +1 -1
  19. package/es/custom-image/BlotFormatter.es.js.map +1 -1
  20. package/es/custom-image/Options.es.js.map +1 -1
  21. package/es/custom-image/actions/Action.es.js.map +1 -1
  22. package/es/custom-image/actions/CustomResizeAction.es.js +6 -4
  23. package/es/custom-image/actions/CustomResizeAction.es.js.map +1 -1
  24. package/es/custom-image/actions/DeleteAction.es.js.map +1 -1
  25. package/es/custom-image/image.es.js +3 -3
  26. package/es/custom-image/image.es.js.map +1 -1
  27. package/es/custom-image/specs/BlotSpec.es.js.map +1 -1
  28. package/es/custom-image/specs/CustomImageSpec.es.js.map +1 -1
  29. package/es/custom-image/specs/ImageSpec.es.js.map +1 -1
  30. package/es/custom-uploader.es.js +4 -7
  31. package/es/custom-uploader.es.js.map +1 -1
  32. package/es/emoji/emoji-list/people.es.js.map +1 -1
  33. package/es/emoji/emoji-list.es.js.map +1 -1
  34. package/es/emoji/emoji-map.es.js.map +1 -1
  35. package/es/emoji/formats/emoji-blot.es.js +2 -2
  36. package/es/emoji/formats/emoji-blot.es.js.map +1 -1
  37. package/es/emoji/index.es.js.map +1 -1
  38. package/es/emoji/modules/emoji.es.js +7 -7
  39. package/es/emoji/modules/emoji.es.js.map +1 -1
  40. package/es/emoji/modules/toolbar-emoji.es.js +15 -15
  41. package/es/emoji/modules/toolbar-emoji.es.js.map +1 -1
  42. package/es/emoji/utils.es.js.map +1 -1
  43. package/es/file/formats/file.es.js.map +1 -1
  44. package/es/file/index.es.js.map +1 -1
  45. package/es/file/modules/file-bar.es.js +3 -3
  46. package/es/file/modules/file-bar.es.js.map +1 -1
  47. package/es/fluent-editor.es.js +6 -5
  48. package/es/fluent-editor.es.js.map +1 -1
  49. package/es/format-painter/index.es.js.map +1 -1
  50. package/es/global-link/constants.es.js.map +1 -1
  51. package/es/global-link/formats/customer-widget-link.es.js.map +1 -1
  52. package/es/global-link/formats/doc-link.es.js.map +1 -1
  53. package/es/global-link/formats/wiki-link.es.js.map +1 -1
  54. package/es/global-link/formats/work-item-link.es.js.map +1 -1
  55. package/es/global-link/index.es.js +1 -1
  56. package/es/global-link/index.es.js.map +1 -1
  57. package/es/global-link/utils/createTable.es.js.map +1 -1
  58. package/es/link/formats/link.es.js +1 -1
  59. package/es/link/formats/link.es.js.map +1 -1
  60. package/es/link/index.es.js.map +1 -1
  61. package/es/link/modules/tooltip.es.js +3 -3
  62. package/es/link/modules/tooltip.es.js.map +1 -1
  63. package/es/mention/Mention.es.js +7 -12
  64. package/es/mention/Mention.es.js.map +1 -1
  65. package/es/mention/MentionLink.es.js.map +1 -1
  66. package/es/mention/constants.es.js.map +1 -1
  67. package/es/quick-menu/index.es.js +1 -1
  68. package/es/quick-menu/index.es.js.map +1 -1
  69. package/es/screenshot/index.es.js +172 -135
  70. package/es/screenshot/index.es.js.map +1 -1
  71. package/es/soft-break/index.es.js.map +1 -1
  72. package/es/strike/index.es.js.map +1 -1
  73. package/es/syntax/index.es.js.map +1 -1
  74. package/es/table/better-table.es.js +4 -5
  75. package/es/table/better-table.es.js.map +1 -1
  76. package/es/table/formats/header.es.js.map +1 -1
  77. package/es/table/formats/list.es.js +3 -3
  78. package/es/table/formats/list.es.js.map +1 -1
  79. package/es/table/formats/table.es.js +26 -27
  80. package/es/table/formats/table.es.js.map +1 -1
  81. package/es/table/modules/table-column-tool.es.js +8 -8
  82. package/es/table/modules/table-column-tool.es.js.map +1 -1
  83. package/es/table/modules/table-operation-menu.es.js +7 -8
  84. package/es/table/modules/table-operation-menu.es.js.map +1 -1
  85. package/es/table/modules/table-scroll-bar.es.js +1 -1
  86. package/es/table/modules/table-scroll-bar.es.js.map +1 -1
  87. package/es/table/modules/table-selection.es.js +0 -1
  88. package/es/table/modules/table-selection.es.js.map +1 -1
  89. package/es/table/table-config.es.js.map +1 -1
  90. package/es/table/utils/index.es.js.map +1 -1
  91. package/es/table/utils/node-matchers.es.js +14 -14
  92. package/es/table/utils/node-matchers.es.js.map +1 -1
  93. package/es/toolbar/better-picker.es.js.map +1 -1
  94. package/es/toolbar/index.es.js +1 -1
  95. package/es/toolbar/index.es.js.map +1 -1
  96. package/es/utils/debounce.es.js.map +1 -1
  97. package/es/utils/image.es.js +26 -0
  98. package/es/utils/image.es.js.map +1 -0
  99. package/es/utils/method.es.js +2 -2
  100. package/es/utils/method.es.js.map +1 -1
  101. package/es/utils/scroll-lock.es.js +47 -0
  102. package/es/utils/scroll-lock.es.js.map +1 -0
  103. package/es/video/index.es.js +6 -3
  104. package/es/video/index.es.js.map +1 -1
  105. package/lib/attributors/index.cjs.js +2 -2
  106. package/lib/attributors/line-height.cjs.js.map +1 -1
  107. package/lib/config/base64-image.cjs.js.map +1 -1
  108. package/lib/config/editor.config.cjs.js.map +1 -1
  109. package/lib/config/editor.utils.cjs.js +12 -12
  110. package/lib/config/editor.utils.cjs.js.map +1 -1
  111. package/lib/config/i18n/en-us.cjs.js.map +1 -1
  112. package/lib/config/i18n/zh-cn.cjs.js.map +1 -1
  113. package/lib/config/icons.config.cjs.js +4 -4
  114. package/lib/config/icons.config.cjs.js.map +1 -1
  115. package/lib/config/types/index.cjs.js +2 -2
  116. package/lib/config.cjs.js +1 -1
  117. package/lib/config.cjs.js.map +1 -1
  118. package/lib/counter/index.cjs.js.map +1 -1
  119. package/lib/custom-clipboard.cjs.js +14 -14
  120. package/lib/custom-clipboard.cjs.js.map +1 -1
  121. package/lib/custom-image/BlotFormatter.cjs.js +1 -1
  122. package/lib/custom-image/BlotFormatter.cjs.js.map +1 -1
  123. package/lib/custom-image/Options.cjs.js.map +1 -1
  124. package/lib/custom-image/actions/Action.cjs.js.map +1 -1
  125. package/lib/custom-image/actions/CustomResizeAction.cjs.js +6 -4
  126. package/lib/custom-image/actions/CustomResizeAction.cjs.js.map +1 -1
  127. package/lib/custom-image/actions/DeleteAction.cjs.js.map +1 -1
  128. package/lib/custom-image/image.cjs.js +3 -3
  129. package/lib/custom-image/image.cjs.js.map +1 -1
  130. package/lib/custom-image/specs/BlotSpec.cjs.js.map +1 -1
  131. package/lib/custom-image/specs/CustomImageSpec.cjs.js.map +1 -1
  132. package/lib/custom-image/specs/ImageSpec.cjs.js.map +1 -1
  133. package/lib/custom-uploader.cjs.js +4 -7
  134. package/lib/custom-uploader.cjs.js.map +1 -1
  135. package/lib/emoji/emoji-list/people.cjs.js.map +1 -1
  136. package/lib/emoji/emoji-list.cjs.js.map +1 -1
  137. package/lib/emoji/emoji-map.cjs.js.map +1 -1
  138. package/lib/emoji/formats/emoji-blot.cjs.js +2 -2
  139. package/lib/emoji/formats/emoji-blot.cjs.js.map +1 -1
  140. package/lib/emoji/index.cjs.js.map +1 -1
  141. package/lib/emoji/modules/emoji.cjs.js +7 -7
  142. package/lib/emoji/modules/emoji.cjs.js.map +1 -1
  143. package/lib/emoji/modules/toolbar-emoji.cjs.js +15 -15
  144. package/lib/emoji/modules/toolbar-emoji.cjs.js.map +1 -1
  145. package/lib/emoji/utils.cjs.js.map +1 -1
  146. package/lib/file/formats/file.cjs.js.map +1 -1
  147. package/lib/file/index.cjs.js.map +1 -1
  148. package/lib/file/modules/file-bar.cjs.js +3 -3
  149. package/lib/file/modules/file-bar.cjs.js.map +1 -1
  150. package/lib/fluent-editor.cjs.js +25 -24
  151. package/lib/fluent-editor.cjs.js.map +1 -1
  152. package/lib/format-painter/index.cjs.js.map +1 -1
  153. package/lib/global-link/constants.cjs.js.map +1 -1
  154. package/lib/global-link/formats/customer-widget-link.cjs.js.map +1 -1
  155. package/lib/global-link/formats/doc-link.cjs.js.map +1 -1
  156. package/lib/global-link/formats/wiki-link.cjs.js.map +1 -1
  157. package/lib/global-link/formats/work-item-link.cjs.js.map +1 -1
  158. package/lib/global-link/index.cjs.js +1 -1
  159. package/lib/global-link/index.cjs.js.map +1 -1
  160. package/lib/global-link/utils/createTable.cjs.js.map +1 -1
  161. package/lib/link/formats/link.cjs.js +1 -1
  162. package/lib/link/formats/link.cjs.js.map +1 -1
  163. package/lib/link/index.cjs.js.map +1 -1
  164. package/lib/link/modules/tooltip.cjs.js +3 -3
  165. package/lib/link/modules/tooltip.cjs.js.map +1 -1
  166. package/lib/mention/Mention.cjs.js +7 -12
  167. package/lib/mention/Mention.cjs.js.map +1 -1
  168. package/lib/mention/MentionLink.cjs.js.map +1 -1
  169. package/lib/mention/constants.cjs.js.map +1 -1
  170. package/lib/quick-menu/index.cjs.js +1 -1
  171. package/lib/quick-menu/index.cjs.js.map +1 -1
  172. package/lib/screenshot/index.cjs.js +173 -136
  173. package/lib/screenshot/index.cjs.js.map +1 -1
  174. package/lib/soft-break/index.cjs.js.map +1 -1
  175. package/lib/strike/index.cjs.js.map +1 -1
  176. package/lib/syntax/index.cjs.js.map +1 -1
  177. package/lib/table/better-table.cjs.js +4 -5
  178. package/lib/table/better-table.cjs.js.map +1 -1
  179. package/lib/table/formats/header.cjs.js.map +1 -1
  180. package/lib/table/formats/list.cjs.js +3 -3
  181. package/lib/table/formats/list.cjs.js.map +1 -1
  182. package/lib/table/formats/table.cjs.js +26 -27
  183. package/lib/table/formats/table.cjs.js.map +1 -1
  184. package/lib/table/modules/table-column-tool.cjs.js +8 -8
  185. package/lib/table/modules/table-column-tool.cjs.js.map +1 -1
  186. package/lib/table/modules/table-operation-menu.cjs.js +7 -8
  187. package/lib/table/modules/table-operation-menu.cjs.js.map +1 -1
  188. package/lib/table/modules/table-scroll-bar.cjs.js +1 -1
  189. package/lib/table/modules/table-scroll-bar.cjs.js.map +1 -1
  190. package/lib/table/modules/table-selection.cjs.js +0 -1
  191. package/lib/table/modules/table-selection.cjs.js.map +1 -1
  192. package/lib/table/table-config.cjs.js.map +1 -1
  193. package/lib/table/utils/index.cjs.js.map +1 -1
  194. package/lib/table/utils/node-matchers.cjs.js +14 -14
  195. package/lib/table/utils/node-matchers.cjs.js.map +1 -1
  196. package/lib/toolbar/better-picker.cjs.js.map +1 -1
  197. package/lib/toolbar/index.cjs.js +1 -1
  198. package/lib/toolbar/index.cjs.js.map +1 -1
  199. package/lib/utils/debounce.cjs.js.map +1 -1
  200. package/lib/utils/image.cjs.js +26 -0
  201. package/lib/utils/image.cjs.js.map +1 -0
  202. package/lib/utils/method.cjs.js +2 -2
  203. package/lib/utils/method.cjs.js.map +1 -1
  204. package/lib/utils/scroll-lock.cjs.js +47 -0
  205. package/lib/utils/scroll-lock.cjs.js.map +1 -0
  206. package/lib/video/index.cjs.js +6 -3
  207. package/lib/video/index.cjs.js.map +1 -1
  208. package/package.json +61 -55
  209. package/{style.css → theme/style.css} +100 -14
  210. package/es/types/vue.d.es.js +0 -2
  211. package/es/types/vue.d.es.js.map +0 -1
  212. package/lib/types/vue.d.cjs.js +0 -2
  213. package/lib/types/vue.d.cjs.js.map +0 -1
@@ -1,147 +1,184 @@
1
1
  "use strict";
2
- Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const Quill = require("quill");
4
- const editor_utils = require("../config/editor.utils.cjs.js");
4
+ const image = require("../utils/image.cjs.js");
5
+ const scrollLock = require("../utils/scroll-lock.cjs.js");
5
6
  const Delta = Quill.import("delta");
6
- const _Screenshot = class _Screenshot {
7
- constructor(quill, options = {}, range) {
8
- this.quill = quill;
9
- this.options = options;
10
- this.leftClickLockFlag = false;
11
- this.removeContextmenu = (event) => {
12
- event.preventDefault();
13
- this.mask.remove();
14
- document.removeEventListener("contextmenu", this.removeContextmenu);
15
- };
16
- this.toggleRect = (event) => {
17
- if (event.button === 2) {
18
- document.removeEventListener("mousemove", this.drawRect);
19
- document.removeEventListener("mousedown", this.toggleRect);
20
- document.addEventListener("contextmenu", this.removeContextmenu);
21
- return;
22
- }
23
- if (!this.leftClickLockFlag) {
24
- if (this.start) {
25
- document.removeEventListener("mousemove", this.drawRect);
26
- const doneBtn = document.createElement("div");
27
- doneBtn.innerHTML = `<span class="ql-screenshot-ok"></span><span class="ql-screenshot-cancel"></span>`;
28
- doneBtn.className = "ql-screenshot-done";
29
- doneBtn.addEventListener("click", this.afterShotCtrl);
30
- this.coordinate.remove();
31
- this.cutter.appendChild(doneBtn);
32
- this.leftClickLockFlag = true;
33
- } else {
34
- this.start = { x: event.clientX, y: event.clientY };
35
- this.cutter.style.left = `${this.start.x}px`;
36
- this.cutter.style.top = `${this.start.y}px`;
37
- document.addEventListener("mousemove", this.drawRect);
7
+ function resolveOptions(options) {
8
+ return Object.assign({
9
+ // @ts-ignore
10
+ Html2Canvas: window.Html2Canvas,
11
+ useCORS: true,
12
+ scale: 1,
13
+ foreignObjectRendering: true,
14
+ beforeCreateImage: void 0,
15
+ beforeCreateCanvas: void 0
16
+ }, options);
17
+ }
18
+ function init() {
19
+ const maskExits = document.querySelectorAll(".ql-screenshot-mask");
20
+ if (maskExits) {
21
+ maskExits.forEach((item) => item && item.remove());
22
+ }
23
+ const wrapper = document.createElement("div");
24
+ wrapper.classList.add("ql-screenshot-wrapper");
25
+ const mask = document.createElement("div");
26
+ mask.className = "ql-screenshot-mask";
27
+ const cutter = document.createElement("div");
28
+ cutter.className = "ql-screenshot-cutter";
29
+ const coordinate = document.createElement("p");
30
+ coordinate.className = "ql-screenshot-coordinate";
31
+ cutter.appendChild(coordinate);
32
+ wrapper.appendChild(mask);
33
+ wrapper.appendChild(cutter);
34
+ document.body.appendChild(wrapper);
35
+ return { wrapper, mask, cutter, coordinate };
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
+ }
42
+ async function renderImage(Html2Canvas, html2canvasOptions, rect, options) {
43
+ if (options && options.beforeCreateCanvas) {
44
+ await options.beforeCreateCanvas();
45
+ }
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)`;
38
64
  }
39
65
  }
40
- };
41
- this.drawRect = (event) => {
42
- this.width = event.clientX - this.start.x;
43
- this.height = event.clientY - this.start.y;
44
- this.cutter.style.width = `${this.width}px`;
45
- this.cutter.style.height = `${this.height}px`;
46
- this.coordinate.innerHTML = `${this.width}<br>${this.height}`;
47
- };
48
- this.afterShotCtrl = (event) => {
49
- document.removeEventListener("mousedown", this.toggleRect);
50
- this.mask.remove();
51
- const target = event.target;
52
- if (target && target.className === "ql-screenshot-ok") {
53
- const rect = {
54
- x: this.start.x,
55
- y: this.start.y,
56
- width: this.width,
57
- height: this.height,
58
- scrollX: document.body.scrollLeft,
59
- scrollY: document.body.scrollTop,
60
- allowTaint: true,
61
- // 是否允许跨域图片渲染
62
- logging: false
63
- // 是否启用日志记录
64
- };
65
- this.renderImage(rect);
66
- }
67
- this.start = void 0;
68
- };
69
- if (this.options.Html2Canvas == null) {
70
- throw new Error(
71
- "ScreenShot module requires html2canvas. Please include the library on the page before FluentEditor."
72
- );
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);
73
72
  }
74
- this.range = range;
73
+ });
74
+ let cropCanvas = document.createElement("canvas");
75
+ cropCanvas.width = rect.width;
76
+ cropCanvas.height = rect.height;
77
+ const cropCanvasCtx = cropCanvas.getContext("2d");
78
+ cropCanvasCtx.drawImage(
79
+ canvas,
80
+ rect.x + window.scrollX,
81
+ rect.y + window.scrollY,
82
+ rect.width,
83
+ rect.height,
84
+ 0,
85
+ 0,
86
+ rect.width,
87
+ rect.height
88
+ );
89
+ if (options && options.beforeCreateImage) {
90
+ cropCanvas = await options.beforeCreateImage(cropCanvas);
75
91
  }
76
- init() {
77
- const maskExits = document.querySelectorAll(".ql-screenshot-mask");
78
- if (maskExits) {
79
- maskExits.forEach((item) => item && item.remove());
80
- }
81
- this.mask = document.createElement("div");
82
- this.mask.className = "ql-screenshot-mask";
83
- this.cutter = document.createElement("div");
84
- this.cutter.className = "ql-screenshot-cutter";
85
- this.coordinate = document.createElement("p");
86
- this.coordinate.className = "ql-screenshot-coordinate";
87
- this.insertBlock();
88
- this.cutter.appendChild(this.coordinate);
89
- this.mask.appendChild(this.cutter);
90
- document.body.appendChild(this.mask);
91
- document.addEventListener("mousedown", this.toggleRect);
92
+ return typeof cropCanvas === "string" ? cropCanvas : cropCanvas.toDataURL();
93
+ }
94
+ function Screenshot() {
95
+ this.quill.options.screenshot = resolveOptions(this.quill.options.screenshot);
96
+ const options = this.quill.options.screenshot;
97
+ const { Html2Canvas, beforeCreateImage, beforeCreateCanvas, ...html2CanvasOptions } = options;
98
+ if (!Html2Canvas) {
99
+ throw new Error("ScreenShot module requires html2canvas. Please include the library on the page before FluentEditor.");
92
100
  }
93
- insertBlock() {
94
- for (let i = 0; i < 7; i++) {
95
- const blockItem = document.createElement("div");
96
- blockItem.className = "ql-screenshot-border-block";
97
- this.cutter.appendChild(blockItem);
101
+ const range = this.quill.getSelection();
102
+ const { wrapper, mask, cutter, coordinate } = init();
103
+ const status = {
104
+ leftClickLockFlag: false,
105
+ start: void 0
106
+ };
107
+ const cleanLock = scrollLock.lockScroll();
108
+ const removeContextmenu = (event) => {
109
+ event.preventDefault();
110
+ wrapper.remove();
111
+ cleanLock();
112
+ document.removeEventListener("contextmenu", removeContextmenu);
113
+ };
114
+ const afterShotCtrl = async (event) => {
115
+ document.removeEventListener("mousedown", toggleRect);
116
+ const cutterRect = cutter.getBoundingClientRect();
117
+ const target = event.target;
118
+ wrapper.remove();
119
+ cleanLock();
120
+ if (target && target.className === "ql-screenshot-confirm") {
121
+ const image2 = await renderImage(Html2Canvas, html2CanvasOptions, cutterRect, { beforeCreateCanvas, beforeCreateImage });
122
+ const delta = new Delta().retain(range.index).delete(range.length).insert({ image: image2 });
123
+ this.quill.updateContents(delta, Quill.sources.USER);
124
+ this.quill.setSelection(range.index + 1, Quill.sources.SILENT);
98
125
  }
99
- }
100
- renderImage(rect) {
101
- if (editor_utils.isPureIE) {
102
- this.options.Html2Canvas(document.body, rect).then((canvas) => this.insertEditor(canvas));
103
- } else {
104
- this.options.Html2Canvas(document.body, {
105
- allowTaint: true,
106
- // 是否允许跨域图片渲染
107
- foreignObjectRendering: this.quill.options.screenshotOnStaticPage,
108
- // 是否使用svg方式
109
- logging: false
110
- // 是否启用日志记录
111
- }).then((canvas) => {
112
- const cropCanvas = document.createElement("canvas");
113
- cropCanvas.width = this.width;
114
- cropCanvas.height = this.height;
115
- const cropCanvasCtx = cropCanvas.getContext("2d");
116
- cropCanvasCtx.drawImage(
117
- canvas,
118
- rect.x + window.scrollX,
119
- rect.y + window.scrollY,
120
- this.width,
121
- this.height,
122
- 0,
123
- 0,
124
- this.width,
125
- this.height
126
- );
127
- this.insertEditor(cropCanvas);
128
- cropCanvas.remove();
129
- });
126
+ status.start = void 0;
127
+ };
128
+ const drawRect = (event) => {
129
+ const startX = status.start.x;
130
+ const startY = status.start.y;
131
+ const endX = event.clientX;
132
+ const endY = event.clientY;
133
+ const width = Math.abs(endX - startX);
134
+ const height = Math.abs(endY - startY);
135
+ const top = startY < endY ? startY : endY;
136
+ const left = startX < endX ? startX : endX;
137
+ const bottom = window.innerHeight - height - top;
138
+ const right = window.innerWidth - width - left;
139
+ const maskPath = `
140
+ linear-gradient(to top, #fff, #fff) top / 100% ${top}px,
141
+ linear-gradient(to bottom, #fff, #fff) bottom /100% ${bottom}px,
142
+ linear-gradient(to left, #fff, #fff) left / ${left}px 100%,
143
+ linear-gradient(to right, #fff, #fff) right / ${right}px 100%
144
+ `;
145
+ Object.assign(cutter.style, {
146
+ width: `${width}px`,
147
+ height: `${height}px`,
148
+ left: `${left}px`,
149
+ top: `${top}px`
150
+ });
151
+ Object.assign(mask.style, {
152
+ "mask": maskPath,
153
+ "-webkit-mask-repeat": "no-repeat"
154
+ });
155
+ coordinate.textContent = `${width}, ${height}`;
156
+ };
157
+ const toggleRect = (event) => {
158
+ if (event.button === 2) {
159
+ document.removeEventListener("mousemove", drawRect);
160
+ document.removeEventListener("mousedown", toggleRect);
161
+ document.addEventListener("contextmenu", removeContextmenu);
162
+ return;
130
163
  }
131
- }
132
- insertEditor(canvas) {
133
- const image = canvas.toDataURL();
134
- const delta = new Delta().retain(this.range.index).delete(this.range.length).insert({ image });
135
- this.quill.updateContents(delta, Quill.sources.USER);
136
- this.quill.setSelection(this.range.index + 1, Quill.sources.SILENT);
137
- }
138
- };
139
- _Screenshot.DEFAULTS = {
140
- Html2Canvas: (() => {
141
- return window.Html2Canvas;
142
- })(),
143
- screenshotOnStaticPage: false
144
- };
145
- let Screenshot = _Screenshot;
146
- exports.default = Screenshot;
164
+ if (!status.leftClickLockFlag) {
165
+ if (status.start) {
166
+ document.removeEventListener("mousemove", drawRect);
167
+ const doneBtn = document.createElement("div");
168
+ doneBtn.innerHTML = `<div class="ql-screenshot-confirm"></div><div class="ql-screenshot-cancel"></div>`;
169
+ doneBtn.className = "ql-screenshot-done";
170
+ doneBtn.addEventListener("click", afterShotCtrl);
171
+ coordinate.remove();
172
+ cutter.appendChild(doneBtn);
173
+ status.leftClickLockFlag = true;
174
+ } else {
175
+ status.start = { x: event.clientX, y: event.clientY };
176
+ document.addEventListener("mousemove", drawRect);
177
+ }
178
+ }
179
+ };
180
+ document.addEventListener("mousedown", toggleRect);
181
+ }
182
+ Screenshot.toolName = "screenshot";
183
+ exports.Screenshot = Screenshot;
147
184
  //# sourceMappingURL=index.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.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":["isPureIE"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs.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":["imgToBase64","lockScroll","image"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../../src/soft-break/index.ts"],"sourcesContent":["import Quill from 'quill'\r\n\r\nconst Embed = Quill.imports['blots/embed']\r\n\r\nclass SoftBreak extends Embed {\r\n static blotName: string\r\n static tagName: string\r\n static className: string\r\n domNode: any\r\n prev: any\r\n next: any\r\n remove: () => void\r\n\r\n static create() {\r\n const node = super.create()\r\n return node\r\n }\r\n\r\n optimize() {\r\n // li的开头结尾,移除软回车\r\n if (this.prev === null) {\r\n this.remove()\r\n }\r\n }\r\n\r\n length() {\r\n return 1\r\n }\r\n}\r\nSoftBreak.blotName = 'soft-break'\r\nSoftBreak.tagName = 'BR'\r\nSoftBreak.className = 'ql-soft-break'\r\n\r\nexport default SoftBreak\r\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
+ {"version":3,"file":"index.cjs.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.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'\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.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'\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;;"}
@@ -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'\nimport {\n getEventComposedPath,\n insideTable,\n isNullOrUndefined,\n isPureIE,\n} from '../config/editor.utils'\nimport Header from './formats/header'\nimport List from './formats/list'\nimport {\n cellId,\n rowId,\n TableBody,\n TableCell,\n TableCellLine,\n TableCol,\n TableColGroup,\n TableContainer,\n TableRow,\n TableViewWrapper,\n} from './formats/table'\nimport TableColumnTool from './modules/table-column-tool'\nimport TableOperationMenu from './modules/table-operation-menu'\nimport TableScrollBar from './modules/table-scroll-bar'\nimport TableSelection from './modules/table-selection'\n// import table node matchers\nimport {\n matchHeader,\n matchInline,\n matchList,\n matchMentionLink,\n matchTable,\n matchTableCell,\n matchTableHeader,\n matchTableRow,\n matchWordShapeImage,\n} from './utils/node-matchers'\n\nconst Block = Quill.imports['blots/block']\nconst Delta = Quill.imports.delta\nconst Module = Quill.imports['core/module']\n\n// @dynamic\nclass BetterTable extends Module {\n static keyboardBindings: any\n isComposition: boolean\n quill: any\n table: any\n modulesContainer: any\n tableSelection: any\n subscriber: any\n tableOperationMenu: any\n columnTool: TableColumnTool\n tableScrollBar: TableScrollBar\n\n static register() {\n Quill.register(TableCol, true)\n Quill.register(TableColGroup, true)\n Quill.register(TableCellLine, true)\n Quill.register(TableCell, true)\n Quill.register(TableRow, true)\n Quill.register(TableBody, true)\n Quill.register(TableContainer, true)\n Quill.register(TableViewWrapper, true)\n // register customized Header, overwriting quill built-in Header\n Quill.register('formats/header', Header, true)\n // register customized List, overwriting quill built-in Header\n Quill.register('formats/list', List, true)\n }\n\n constructor(quill, options) {\n super(quill, options)\n\n // handle click on quill-better-table\n this.isComposition = false\n this.quill.root.addEventListener('mousedown', event => this.handleMouseDown(event, quill), false)\n this.quill.root.addEventListener('compositionend', () => this.handleCompositionend(quill), false)\n this.quill.root.addEventListener('compositionstart', () => this.handleCompositionstart(quill), false)\n this.quill.root.addEventListener('keypress', event => this.handleKeyDown(event, quill), false)\n\n // handle right click on quill-better-table\n this.quill.root.addEventListener(\n 'contextmenu',\n (evt) => {\n if (!this.table) return true\n evt.preventDefault()\n\n // bugfix: evt.path is undefined in Safari, FF, Micro Edge\n const path = getEventComposedPath(evt)\n if (!path || path.length <= 0) return\n\n const tableNode = path.filter((node) => {\n return (\n node.tagName && node.tagName.toUpperCase() === 'TABLE' && node.classList.contains('quill-better-table')\n )\n })[0]\n\n const rowNode = path.filter((node) => {\n return node.tagName && node.tagName.toUpperCase() === 'TR' && node.getAttribute('data-row')\n })[0]\n\n const cellNode = path.filter((node) => {\n return node.tagName && node.tagName.toUpperCase() === 'TD' && node.getAttribute('data-row')\n })[0]\n\n const isTargetCellSelected = this.tableSelection.selectedTds\n .map(tableCell => tableCell.domNode)\n .includes(cellNode)\n\n if (this.tableSelection.selectedTds.length <= 0 || !isTargetCellSelected) {\n this.tableSelection.setSelection(cellNode.getBoundingClientRect(), cellNode.getBoundingClientRect())\n }\n\n if (this.tableOperationMenu) {\n this.tableOperationMenu = this.tableOperationMenu.destroy()\n }\n\n if (tableNode) {\n this.tableOperationMenu = new TableOperationMenu(\n {\n table: tableNode,\n row: rowNode,\n cell: cellNode,\n left: evt.x + 15,\n top: evt.y,\n },\n quill,\n options.operationMenu,\n )\n }\n },\n false,\n )\n\n // add keyboard binding:Backspace\n // prevent user hits backspace to delete table cell\n quill.keyboard.addBinding({ key: 'Backspace' }, {}, (range, context) => {\n if (range.index === 0 || this.quill.getLength() <= 1) return true\n if (context.offset === 0 && range.length === 0) {\n const [prev] = this.quill.getLine(range.index - 1)\n const [line] = this.quill.getLine(range.index)\n if (!isNullOrUndefined(prev)) {\n if (prev.statics.blotName === 'table-cell-line' && line.statics.blotName !== 'table-cell-line') {\n const betterTableModule = this.quill.getModule('better-table')\n let tableBlot\n try {\n tableBlot = prev.parent.parent.parent.parent\n }\n catch (_e) { }\n if (tableBlot && tableBlot.domNode !== betterTableModule.table) {\n betterTableModule.hideTableTools()\n tableBlot.remove()\n this.quill.update(Quill.sources.USER)\n }\n return false\n }\n }\n }\n return true\n })\n // since only one matched bindings callback will execute.\n // expected my binding callback execute first\n // I changed the order of binding callbacks\n const thisBinding = quill.keyboard.bindings.Backspace.pop()\n quill.keyboard.bindings.Backspace.splice(1, 0, thisBinding)\n\n // add Matchers to match and render quill-better-table for initialization\n // or pasting\n quill.clipboard.addMatcher('td', matchTableCell)\n quill.clipboard.addMatcher('th', matchTableHeader)\n quill.clipboard.addMatcher('table', matchTable)\n quill.clipboard.addMatcher('h1, h2, h3, h4, h5, h6', matchHeader)\n quill.clipboard.addMatcher('ol, ul', matchList)\n quill.clipboard.addMatcher('span', matchMentionLink)\n quill.clipboard.addMatcher('v:imageData', matchWordShapeImage)\n quill.clipboard.addMatcher(Node.ELEMENT_NODE, matchInline)\n\n // remove matcher for tr tag\n quill.clipboard.matchers = quill.clipboard.matchers.filter((matcher) => {\n return matcher[0] !== 'tr'\n })\n\n // fix: 处理空<tr>标签被忽略的情况\n quill.clipboard.addMatcher('tr', matchTableRow)\n\n this.quill.on('editor-change', () => {\n const tableContainer = Quill.find(this.table)\n if (!tableContainer) {\n this.hideTableTools()\n }\n })\n\n this.quill.on(Quill.events.SELECTION_CHANGE, (range, _oldRange, source) => {\n if (!range) return\n const selectionStart = range.index\n const selectionEnd = range.index + range.length\n if (source === Quill.sources.USER) {\n const tables = this.quill.root.getElementsByTagName('table')\n if (tables && tables.length) {\n [].forEach.call(tables, (table) => {\n const tableContainer = Quill.find(table)\n if (tableContainer) {\n const tableStart = tableContainer.offset(this.quill.scroll)\n const tableEnd = tableStart + tableContainer.length()\n // @ts-ignore\n const classes = Array.from(table.parentNode.classList)\n\n if (selectionStart <= tableStart && tableEnd <= selectionEnd) {\n // @ts-ignore\n table.parentNode.classList.add('quill-better-table-selected')\n }\n else if (classes.includes('quill-better-table-selected')) {\n // @ts-ignore\n table.parentNode.classList.remove('quill-better-table-selected')\n }\n }\n })\n }\n }\n })\n }\n\n handleMouseDown(evt, quill) {\n // bugfix: evt.path is undefined in Safari, FF, Micro Edge\n const path = getEventComposedPath(evt)\n if (!path || path.length <= 0) return\n const tableNode = path.filter((node) => {\n return node.tagName && node.tagName.toUpperCase() === 'TABLE' && node.classList.contains('quill-better-table')\n })[0]\n if (tableNode) {\n tableNode.parentNode.classList.remove('quill-better-table-selected')\n // current table clicked\n if (this.table === tableNode) return\n // other table clicked\n if (this.table) {\n this.hideTableTools()\n }\n if (!quill.options.readOnly) { // not show table tool in readonly mode\n this.showTableTools(tableNode, quill)\n }\n }\n else if (this.table) {\n // other clicked\n this.hideTableTools()\n }\n }\n\n handleKeyDown(evt, quill) {\n const key = evt.key\n const range = quill.getSelection()\n if (this.isComposition || !range) return\n const [col] = quill.getLine(range.index)\n const [td] = quill.getLine(range.index - 1)\n if (key && key !== 'Delete' && col && range) {\n if (col.statics.blotName === 'table-col') {\n const betterTableModule = this.quill.getModule('better-table')\n betterTableModule.hideTableTools()\n quill.insertText(range.index - 1, '\\n', Quill.sources.USER)\n quill.setSelection(range.index, 0, Quill.sources.USER)\n }\n else if (td && td.statics.blotName === 'table-cell-line' && col.statics.blotName === 'block') {\n quill.insertText(range.index, '\\n', Quill.sources.USER)\n quill.setSelection(range.index, 0, Quill.sources.USER)\n }\n }\n }\n\n handleCompositionstart(quill) {\n this.isComposition = true\n const range = quill.getSelection()\n const [col] = quill.getLine(range.index)\n const [td] = quill.getLine(range.index - 1)\n if (col && range) {\n if (col.statics.blotName === 'table-col') {\n const betterTableModule = this.quill.getModule('better-table')\n betterTableModule.hideTableTools()\n quill.insertText(range.index - 1, '\\n\\t', Quill.sources.USER)\n quill.setSelection(range.index, 0, Quill.sources.USER)\n }\n else if (td && td.statics.blotName === 'table-cell-line' && col.statics.blotName === 'block') {\n quill.setSelection(range.index, 0, Quill.sources.USER)\n }\n }\n }\n\n handleCompositionend(quill) {\n // fix: 解决在空行行首用中文输入法输入字符,然后按退格导致插入多余空行的问题\n const range = quill.getSelection()\n const [line] = quill.getLine(range.index)\n const domNode = line.domNode\n const isInParagraph = domNode.nodeName === 'P'\n const isInTableCell = line.statics.blotName === 'table-cell-line'\n if ((isInParagraph || isInTableCell)\n && domNode.childNodes.length > 1\n && domNode.childNodes[0].nodeName === 'BR') {\n domNode.childNodes[0].remove()\n }\n\n if (isPureIE && line instanceof Block) {\n // 设置光标位置防止跳入下一行\n quill.setSelection(range.index, 0, Quill.sources.SILENT)\n }\n\n this.isComposition = false\n }\n\n getTable(range = this.quill.getSelection()) {\n if (isNullOrUndefined(range)) return [null, null, null, -1]\n const [cellLine, offset] = this.quill.getLine(range.index)\n if (isNullOrUndefined(cellLine) || cellLine.statics.blotName !== TableCellLine.blotName) {\n return [null, null, null, -1]\n }\n const cell = cellLine.tableCell()\n const row = cell.row()\n const table = row.table()\n return [table, row, cell, offset]\n }\n\n insertTable(rows, columns) {\n const range = this.quill.getSelection(true)\n const isInsideTable = insideTable(range, this.quill)\n if (isNullOrUndefined(range) || isInsideTable) return\n // let currentBlot = this.quill.getLeaf(range.index)[0]\n // let nextBlot = this.quill.getLeaf(range.index + 1)[0]\n let delta = new Delta().retain(range.index)\n\n delta.insert('\\n')\n // insert table column\n delta = new Array(columns).fill('\\n').reduce((memo, text) => {\n memo.insert(text, { 'table-col': true })\n return memo\n }, delta)\n // insert table cell line with empty line\n delta = new Array(rows).fill(0).reduce((memo) => {\n const tableRowId = rowId()\n return new Array(columns).fill('\\n').reduce((op, text) => {\n op.insert(text, { 'table-cell-line': { row: tableRowId, cell: cellId() } })\n return op\n }, memo)\n }, delta)\n\n const [col] = this.quill.getLine(range.index)\n if (col && col.statics.blotName === 'table-col') {\n delta.insert('\\n')\n }\n\n this.quill.updateContents(delta, Quill.sources.USER)\n\n // feature: 新增表格后首格自动激活编辑状态,initEvent兼容IE\n const [cellLine] = this.quill.getLine(range.index + columns + 1)\n if (cellLine) {\n const cell = cellLine.tableCell()\n const td = cell.domNode\n const mousedownEvent = document.createEvent('MouseEvent')\n const mouseupEvent = document.createEvent('MouseEvent')\n const keyEvent = document.createEvent('Event')\n mousedownEvent.initEvent('mousedown', true, false)\n mouseupEvent.initEvent('mouseup', true, false)\n keyEvent.initEvent('keypress', true, false)\n td.dispatchEvent(mousedownEvent)\n td.dispatchEvent(mouseupEvent)\n td.dispatchEvent(keyEvent)\n this.tableSelection.endTd = td\n }\n }\n\n showTableTools(table, quill) {\n this.table = table\n this.modulesContainer = document.createElement('div')\n this.modulesContainer.classList.add('qlbt-modules-container')\n // fix:表格容器插入时获取ql-tooltip容器,用insertBefore插入到它前面,避免遮挡链接浮窗\n const linkContainer = this.quill.root.parentNode.querySelector('.ql-tooltip ')\n this.quill.root.parentNode.insertBefore(this.modulesContainer, linkContainer)\n this.tableSelection = new TableSelection(table, quill, this.modulesContainer)\n this.columnTool = new TableColumnTool(table, quill, this.modulesContainer)\n this.tableScrollBar = new TableScrollBar(table, quill, this.modulesContainer)\n let timeoutID\n this.subscriber = () => {\n clearTimeout(timeoutID)\n timeoutID = setTimeout(this.hideTableTools, 300)\n }\n window.addEventListener('resize', this.subscriber, false)\n }\n\n hideTableTools() {\n if (this.columnTool) {\n this.columnTool.destroy()\n }\n if (this.tableSelection) {\n this.tableSelection.destroy()\n }\n if (this.tableOperationMenu) {\n this.tableOperationMenu.destroy()\n }\n if (this.tableScrollBar) {\n this.tableScrollBar.destroy()\n }\n if (this.modulesContainer) {\n this.modulesContainer.remove()\n }\n this.columnTool = null\n this.tableSelection = null\n this.tableOperationMenu = null\n this.tableScrollBar = null\n this.modulesContainer = null\n this.table = null\n if (this.subscriber) {\n window.removeEventListener('resize', this.subscriber)\n }\n }\n}\n\nBetterTable.keyboardBindings = {\n 'line delete': {\n key: 'Delete',\n shiftKey: null,\n format: { 'table-col': false, 'table-cell-line': false },\n collapsed: true,\n offset: 0,\n handler(range, context) {\n // fix: 当光标在编辑器最前且之后为表格时按delete不执行操作\n if (range.index === 0 && context.line.next && context.line.next.statics.blotName === 'table-view') {\n const [p] = this.quill.getLine(range.index - 1)\n const [col] = this.quill.getLine(range.index + 1)\n if (p && p.statics.blotName === 'block' && col && col.statics.blotName === 'table-col') {\n return false\n }\n }\n return true\n },\n },\n 'table-col enter': {\n key: 'Enter',\n shiftKey: null,\n format: ['table-col'],\n collapsed: true,\n offset: 0,\n handler(range, context) {\n if (context.offset === 0 && range.length === 0) {\n const [col] = this.quill.getLine(range.index)\n if (col && col.statics.blotName === 'table-col') {\n const betterTableModule = this.quill.getModule('better-table')\n betterTableModule.hideTableTools()\n this.quill.insertText(range.index - 1, '\\n', Quill.sources.USER)\n this.quill.setSelection(range.index, 0, Quill.sources.USER)\n }\n }\n },\n },\n 'table-col delete': {\n key: 'Delete',\n shiftKey: null,\n format: ['table-col'],\n collapsed: true,\n offset: 0,\n handler(range, context) {\n if (context.offset === 0 && range.length === 0) {\n const [col] = this.quill.getLine(range.index)\n if (col && col.statics.blotName === 'table-col') {\n const betterTableModule = this.quill.getModule('better-table')\n let tableBlot\n try {\n tableBlot = col.parent.parent.parent\n }\n catch (_e) { }\n if (tableBlot && tableBlot.domNode !== betterTableModule.table) {\n betterTableModule.hideTableTools()\n tableBlot.remove()\n this.quill.update(Quill.sources.USER)\n }\n }\n }\n },\n },\n 'table-col backspace': {\n key: 'Backspace',\n shiftKey: null,\n format: ['table-col'],\n collapsed: true,\n offset: 0,\n handler() { },\n },\n 'table-cell-line backspace': {\n key: 'Backspace',\n format: ['table-cell-line'],\n collapsed: true,\n offset: 0,\n handler(range) {\n const [line] = this.quill.getLine(range.index)\n // 移除原有对非table-cell-line的阻止条件,使table-cell-line前的list等内容可以被删除\n if (!line.prev) {\n return false\n }\n return true\n },\n },\n 'table-cell-line delete': {\n key: 'Delete',\n format: ['table-cell-line'],\n handler(range, _context) {\n // 获取table-cell-line的索引和长度\n const [line] = this.quill.getLine(range.index)\n const index = this.quill.getIndex(line)\n const length = line.length()\n if (!line.next // 当无下一个元素且满足以下情况阻止删除操作\n && ((!line.prev && length === 1) // 单元格内只有一个table-cell-line且无内容\n || (range.index !== index && range.index + 1 >= index + length))) { // 光标在有内容的table-cell-line最后\n return false\n }\n return true\n },\n },\n 'table-cell-line enter': {\n key: 'Enter',\n shiftKey: null,\n format: ['table-cell-line'],\n handler(range, context) {\n // fix:通过window的光标选区当前指向判断,如果为HTMLElement且为表格容器则定位至下一行\n const node = window.getSelection().anchorNode\n if (node instanceof HTMLDivElement && node.classList.contains('quill-better-table-wrapper')) {\n this.quill.setSelection(range.index + 1, 0, Quill.sources.USER)\n this.quill.focus()\n return\n }\n // bugfix: a unexpected new line inserted when user compositionend with hitting Enter\n if (this.quill.selection && this.quill.selection.composing) return\n const Scope = Quill.imports.parchment.Scope\n if (range.length > 0) {\n this.quill.scroll.deleteAt(range.index, range.length) // So we do not trigger text-change\n }\n const lineFormats = Object.keys(context.format).reduce((formats, format) => {\n if (this.quill.scroll.query(format, Scope.BLOCK) && !Array.isArray(context.format[format])) {\n formats[format] = context.format[format]\n }\n return formats\n }, {})\n // insert new cellLine with lineFormats\n this.quill.insertText(range.index, '\\n', lineFormats['table-cell-line'], Quill.sources.USER)\n // Earlier scroll.deleteAt might have messed up our selection,\n // so insertText's built in selection preservation is not reliable\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT)\n this.quill.focus()\n Object.keys(context.format).forEach((name) => {\n if (!isNullOrUndefined(lineFormats[name])) return\n if (Array.isArray(context.format[name])) return\n if (name === 'link') return\n this.quill.format(name, context.format[name], Quill.sources.USER)\n })\n },\n },\n}\n\nexport default BetterTable\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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"}