@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,147 +1,184 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const Quill = require("quill");
|
|
4
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
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
|
-
|
|
128
|
-
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
|
|
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'\
|
|
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'\
|
|
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
|
|
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
|
|
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
|
|
100
|
-
quill.keyboard.bindings
|
|
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.
|
|
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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"}
|