@opentiny/fluent-editor 4.0.0-alpha.0 → 4.0.0-alpha.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/es/config/editor.config.es.js +0 -7
- package/es/config/editor.config.es.js.map +1 -1
- package/es/config/i18n/en-us.es.js +0 -13
- package/es/config/i18n/en-us.es.js.map +1 -1
- package/es/config/i18n/zh-cn.es.js +0 -13
- package/es/config/i18n/zh-cn.es.js.map +1 -1
- package/es/config/index.es.js +6 -11
- package/es/config/index.es.js.map +1 -1
- package/es/core/fluent-editor.es.js +3 -4
- package/es/core/fluent-editor.es.js.map +1 -1
- package/es/fluent-editor.es.js +12 -3
- package/es/fluent-editor.es.js.map +1 -1
- package/es/formats/video.es.js +2 -2
- package/es/formats/video.es.js.map +1 -1
- package/es/index.es.js +3 -2
- package/es/index.es.js.map +1 -1
- package/es/modules/custom-clipboard.es.js +3 -5
- package/es/modules/custom-clipboard.es.js.map +1 -1
- package/es/modules/custom-image/BlotFormatter.es.js +1 -2
- package/es/modules/custom-image/BlotFormatter.es.js.map +1 -1
- package/es/modules/custom-image/image.es.js +4 -16
- package/es/modules/custom-image/image.es.js.map +1 -1
- package/es/modules/custom-uploader.es.js +60 -193
- package/es/modules/custom-uploader.es.js.map +1 -1
- package/es/modules/file/formats/file.es.js +12 -14
- package/es/modules/file/formats/file.es.js.map +1 -1
- package/es/modules/file/index.es.js +6 -7
- package/es/modules/file/index.es.js.map +1 -1
- package/es/modules/i18n.es.js +28 -9
- package/es/modules/i18n.es.js.map +1 -1
- package/es/modules/link/modules/tooltip.es.js +3 -2
- package/es/modules/link/modules/tooltip.es.js.map +1 -1
- package/es/modules/shortcut-key/index.es.js +17 -1
- package/es/modules/shortcut-key/index.es.js.map +1 -1
- package/es/modules/table-up/index.es.js +5 -2
- package/es/modules/table-up/index.es.js.map +1 -1
- package/es/modules/toolbar/toolbar-tip.es.js +6 -1
- package/es/modules/toolbar/toolbar-tip.es.js.map +1 -1
- package/es/themes/snow.es.js +14 -5
- package/es/themes/snow.es.js.map +1 -1
- package/es/ui/icons.es.js.map +1 -1
- package/es/utils/is.es.js +4 -0
- package/es/utils/is.es.js.map +1 -1
- package/lib/config/editor.config.cjs.js +0 -7
- package/lib/config/editor.config.cjs.js.map +1 -1
- package/lib/config/i18n/en-us.cjs.js +0 -13
- package/lib/config/i18n/en-us.cjs.js.map +1 -1
- package/lib/config/i18n/zh-cn.cjs.js +0 -13
- package/lib/config/i18n/zh-cn.cjs.js.map +1 -1
- package/lib/config/index.cjs.js +5 -10
- package/lib/config/index.cjs.js.map +1 -1
- package/lib/core/fluent-editor.cjs.js +2 -3
- package/lib/core/fluent-editor.cjs.js.map +1 -1
- package/lib/fluent-editor.cjs.js +11 -2
- package/lib/fluent-editor.cjs.js.map +1 -1
- package/lib/formats/video.cjs.js +2 -2
- package/lib/formats/video.cjs.js.map +1 -1
- package/lib/index.cjs.js +2 -1
- package/lib/index.cjs.js.map +1 -1
- package/lib/modules/custom-clipboard.cjs.js +2 -4
- package/lib/modules/custom-clipboard.cjs.js.map +1 -1
- package/lib/modules/custom-image/BlotFormatter.cjs.js +0 -1
- package/lib/modules/custom-image/BlotFormatter.cjs.js.map +1 -1
- package/lib/modules/custom-image/image.cjs.js +4 -16
- package/lib/modules/custom-image/image.cjs.js.map +1 -1
- package/lib/modules/custom-uploader.cjs.js +61 -194
- package/lib/modules/custom-uploader.cjs.js.map +1 -1
- package/lib/modules/file/formats/file.cjs.js +12 -14
- package/lib/modules/file/formats/file.cjs.js.map +1 -1
- package/lib/modules/file/index.cjs.js +6 -7
- package/lib/modules/file/index.cjs.js.map +1 -1
- package/lib/modules/i18n.cjs.js +27 -8
- package/lib/modules/i18n.cjs.js.map +1 -1
- package/lib/modules/link/modules/tooltip.cjs.js +2 -1
- package/lib/modules/link/modules/tooltip.cjs.js.map +1 -1
- package/lib/modules/shortcut-key/index.cjs.js +16 -0
- package/lib/modules/shortcut-key/index.cjs.js.map +1 -1
- package/lib/modules/table-up/index.cjs.js +5 -2
- package/lib/modules/table-up/index.cjs.js.map +1 -1
- package/lib/modules/toolbar/toolbar-tip.cjs.js +6 -1
- package/lib/modules/toolbar/toolbar-tip.cjs.js.map +1 -1
- package/lib/themes/snow.cjs.js +14 -5
- package/lib/themes/snow.cjs.js.map +1 -1
- package/lib/ui/icons.cjs.js.map +1 -1
- package/lib/utils/is.cjs.js +4 -0
- package/lib/utils/is.cjs.js.map +1 -1
- package/package.json +2 -2
- package/style.css +6 -19
- package/types/config/editor.config.d.ts +0 -274
- package/types/config/i18n/en-us.d.ts +0 -13
- package/types/config/i18n/zh-cn.d.ts +0 -13
- package/types/config/index.d.ts +1 -1
- package/types/config/types/editor-config.interface.d.ts +0 -19
- package/types/config/types/editor-modules.interface.d.ts +2 -0
- package/types/core/fluent-editor.d.ts +3 -1
- package/types/index.d.ts +2 -1
- package/types/modules/counter.d.ts +1 -1
- package/types/modules/custom-clipboard.d.ts +1 -1
- package/types/modules/custom-image/image.d.ts +8 -11
- package/types/modules/file/formats/file.d.ts +12 -8
- package/types/modules/file/index.d.ts +5 -5
- package/types/modules/i18n.d.ts +3 -3
- package/types/modules/shortcut-key/index.d.ts +4 -33
- package/types/modules/table-up/index.d.ts +26 -26
- package/types/utils/is.d.ts +2 -0
- package/types/modules/custom-uploader.d.ts +0 -31
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.cjs.js","sources":["../../../../src/modules/custom-image/image.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { isNullOrUndefined, sanitize } from '../../config/editor.utils'\r\n\r\nconst Embed = Quill.
|
|
1
|
+
{"version":3,"file":"image.cjs.js","sources":["../../../../src/modules/custom-image/image.ts"],"sourcesContent":["import type TypeEmbed from 'quill/blots/embed'\r\nimport Quill from 'quill'\r\nimport { isNullOrUndefined, sanitize } from '../../config/editor.utils'\r\n\r\nconst Embed = Quill.import('blots/embed') as typeof TypeEmbed\r\nconst ATTRIBUTES = ['alt', 'height', 'width', 'image-id']\r\n\r\nexport type ImageValue = string | { src: string }\r\nclass CustomImage extends Embed {\r\n static ID_SEED = 0\r\n static blotName: string\r\n static tagName: string\r\n domNode: any\r\n parent: any\r\n scroll: any\r\n next: any\r\n static create(value: ImageValue) {\r\n const node = super.create(value) as HTMLElement\r\n const url = typeof value === 'string' ? value : value.src\r\n if (url) {\r\n const imgURL = this.sanitize(url)\r\n if (!imgURL?.startsWith('data:image')) {\r\n node.dataset.src = imgURL\r\n }\r\n node.setAttribute('src', imgURL)\r\n }\r\n node.setAttribute('data-image-id', `img${CustomImage.ID_SEED++}`)\r\n node.setAttribute('devui-editorx-image', 'true')\r\n node.style.verticalAlign = 'baseline'\r\n return node\r\n }\r\n\r\n static formats(domNode) {\r\n return ATTRIBUTES.reduce((formats, attribute) => {\r\n if (domNode.hasAttribute(attribute)) {\r\n formats[attribute] = domNode.getAttribute(attribute)\r\n }\r\n return formats\r\n }, {})\r\n }\r\n\r\n static match(url) {\r\n return /\\.(jpe?g|gif|png)$/.test(url) || /^data:image\\/.+;base64/.test(url)\r\n }\r\n\r\n static register() {\r\n if (/Firefox/i.test(navigator.userAgent)) {\r\n setTimeout(() => {\r\n // Disable image resizing in Firefox\r\n document.execCommand('enableObjectResizing', false, 'false')\r\n }, 1)\r\n }\r\n }\r\n\r\n static sanitize(url) {\r\n return sanitize(url, ['http', 'https', 'blob', 'data']) ? url : '//:0'\r\n }\r\n\r\n static value(domNode) {\r\n const formats: any = {}\r\n const imageSrc = domNode.getAttribute('src')\r\n formats.src = this.sanitize(imageSrc)\r\n formats.hasExisted = domNode.getAttribute('devui-editorx-image')\r\n formats.imageId = domNode.dataset.imageId\r\n return formats\r\n }\r\n\r\n format(name, value) {\r\n if (ATTRIBUTES.includes(name)) {\r\n if (value) {\r\n this.domNode.setAttribute(name, value)\r\n }\r\n else {\r\n this.domNode.removeAttribute(name)\r\n }\r\n }\r\n else {\r\n super.format(name, value)\r\n }\r\n }\r\n\r\n unWrap() {\r\n this.parent.replaceWith(this)\r\n }\r\n\r\n wrap(name, value) {\r\n const wrapper = typeof name === 'string' ? this.scroll.create(name, value) : name\r\n if (!isNullOrUndefined(this.parent)) {\r\n this.parent.insertBefore(wrapper, this.next || undefined)\r\n }\r\n if (typeof wrapper.appendChild !== 'function') {\r\n throw new TypeError(`Cannot wrap ${name}`)\r\n }\r\n wrapper.appendChild(this)\r\n return wrapper\r\n }\r\n}\r\nCustomImage.blotName = 'image'\r\nCustomImage.tagName = 'IMG'\r\n\r\nexport { CustomImage as default }\r\n"],"names":["sanitize","isNullOrUndefined"],"mappings":";;;;AAIA,MAAM,QAAQ,MAAM,OAAO,aAAa;AACxC,MAAM,aAAa,CAAC,OAAO,UAAU,SAAS,UAAU;AAGxD,MAAM,eAAN,MAAM,qBAAoB,MAAM;AAAA,EAQ9B,OAAO,OAAO,OAAmB;AACzB,UAAA,OAAO,MAAM,OAAO,KAAK;AAC/B,UAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,MAAM;AACtD,QAAI,KAAK;AACD,YAAA,SAAS,KAAK,SAAS,GAAG;AAChC,UAAI,EAAC,iCAAQ,WAAW,gBAAe;AACrC,aAAK,QAAQ,MAAM;AAAA,MAAA;AAEhB,WAAA,aAAa,OAAO,MAAM;AAAA,IAAA;AAEjC,SAAK,aAAa,iBAAiB,MAAM,aAAY,SAAS,EAAE;AAC3D,SAAA,aAAa,uBAAuB,MAAM;AAC/C,SAAK,MAAM,gBAAgB;AACpB,WAAA;AAAA,EAAA;AAAA,EAGT,OAAO,QAAQ,SAAS;AACtB,WAAO,WAAW,OAAO,CAAC,SAAS,cAAc;AAC3C,UAAA,QAAQ,aAAa,SAAS,GAAG;AACnC,gBAAQ,SAAS,IAAI,QAAQ,aAAa,SAAS;AAAA,MAAA;AAE9C,aAAA;AAAA,IACT,GAAG,EAAE;AAAA,EAAA;AAAA,EAGP,OAAO,MAAM,KAAK;AAChB,WAAO,qBAAqB,KAAK,GAAG,KAAK,yBAAyB,KAAK,GAAG;AAAA,EAAA;AAAA,EAG5E,OAAO,WAAW;AAChB,QAAI,WAAW,KAAK,UAAU,SAAS,GAAG;AACxC,iBAAW,MAAM;AAEN,iBAAA,YAAY,wBAAwB,OAAO,OAAO;AAAA,SAC1D,CAAC;AAAA,IAAA;AAAA,EACN;AAAA,EAGF,OAAO,SAAS,KAAK;AACZ,WAAAA,aAAA,SAAS,KAAK,CAAC,QAAQ,SAAS,QAAQ,MAAM,CAAC,IAAI,MAAM;AAAA,EAAA;AAAA,EAGlE,OAAO,MAAM,SAAS;AACpB,UAAM,UAAe,CAAC;AAChB,UAAA,WAAW,QAAQ,aAAa,KAAK;AACnC,YAAA,MAAM,KAAK,SAAS,QAAQ;AAC5B,YAAA,aAAa,QAAQ,aAAa,qBAAqB;AACvD,YAAA,UAAU,QAAQ,QAAQ;AAC3B,WAAA;AAAA,EAAA;AAAA,EAGT,OAAO,MAAM,OAAO;AACd,QAAA,WAAW,SAAS,IAAI,GAAG;AAC7B,UAAI,OAAO;AACJ,aAAA,QAAQ,aAAa,MAAM,KAAK;AAAA,MAAA,OAElC;AACE,aAAA,QAAQ,gBAAgB,IAAI;AAAA,MAAA;AAAA,IACnC,OAEG;AACG,YAAA,OAAO,MAAM,KAAK;AAAA,IAAA;AAAA,EAC1B;AAAA,EAGF,SAAS;AACF,SAAA,OAAO,YAAY,IAAI;AAAA,EAAA;AAAA,EAG9B,KAAK,MAAM,OAAO;AACV,UAAA,UAAU,OAAO,SAAS,WAAW,KAAK,OAAO,OAAO,MAAM,KAAK,IAAI;AAC7E,QAAI,CAACC,aAAA,kBAAkB,KAAK,MAAM,GAAG;AACnC,WAAK,OAAO,aAAa,SAAS,KAAK,QAAQ,MAAS;AAAA,IAAA;AAEtD,QAAA,OAAO,QAAQ,gBAAgB,YAAY;AAC7C,YAAM,IAAI,UAAU,eAAe,IAAI,EAAE;AAAA,IAAA;AAE3C,YAAQ,YAAY,IAAI;AACjB,WAAA;AAAA,EAAA;AAEX;AAvFE,aAAO,UAAU;AADnB,IAAM,cAAN;AAyFA,YAAY,WAAW;AACvB,YAAY,UAAU;;"}
|
|
@@ -1,209 +1,76 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const Quill = require("quill");
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const Uploader = Quill.imports["modules/uploader"];
|
|
4
|
+
const is = require("../utils/is.cjs.js");
|
|
5
|
+
const Uploader = Quill.import("modules/uploader");
|
|
7
6
|
const Delta = Quill.import("delta");
|
|
8
|
-
class
|
|
9
|
-
constructor() {
|
|
10
|
-
super(
|
|
11
|
-
this.
|
|
12
|
-
|
|
13
|
-
return true;
|
|
14
|
-
}
|
|
15
|
-
return file.size <= maxSize;
|
|
16
|
-
};
|
|
17
|
-
this.isAllowedFileType = (accept, file) => {
|
|
18
|
-
if (accept) {
|
|
19
|
-
const baseMimeType = file.type.replace(/\/.*$/, "");
|
|
20
|
-
const acceptArr = typeof accept === "string" ? accept.split(",") : accept;
|
|
21
|
-
return acceptArr.some((type) => {
|
|
22
|
-
const validType = type.trim();
|
|
23
|
-
if (validType.startsWith(".")) {
|
|
24
|
-
return file.name.toLowerCase().includes(validType.toLowerCase(), file.name.toLowerCase().length - validType.toLowerCase().length);
|
|
25
|
-
} else if (/\/\*$/.test(validType)) {
|
|
26
|
-
return baseMimeType === validType.replace(/\/.*$/, "");
|
|
27
|
-
}
|
|
28
|
-
return file.type === validType;
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
return true;
|
|
32
|
-
};
|
|
7
|
+
const _FileUploader = class _FileUploader extends Uploader {
|
|
8
|
+
constructor(quill, options) {
|
|
9
|
+
super(quill, options);
|
|
10
|
+
this.quill = quill;
|
|
11
|
+
this.options = this.resolveOptions(options);
|
|
33
12
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
file: uploadOption.fileAccept
|
|
45
|
-
} || {};
|
|
46
|
-
Array.from(files).forEach((file) => {
|
|
47
|
-
var _a, _b;
|
|
48
|
-
if (file) {
|
|
49
|
-
const fileFlag = typeof isFile === "boolean" ? isFile : !/^image\/[-\w.]+$/.test(file.type);
|
|
50
|
-
const fileType = fileFlag ? "file" : "image";
|
|
51
|
-
const accept = acceptObj[fileType] || this.options[fileType];
|
|
52
|
-
if (this.isAllowedFileType(accept, file) && this.isAllowedFileSize(uploadOption == null ? void 0 : uploadOption.maxSize, file)) {
|
|
53
|
-
uploads.push(file);
|
|
54
|
-
fileFlags.push(fileFlag);
|
|
55
|
-
(_a = uploadOption == null ? void 0 : uploadOption.success) == null ? void 0 : _a.call(uploadOption, file);
|
|
56
|
-
} else {
|
|
57
|
-
rejectFlags[fileType] = true;
|
|
58
|
-
(_b = uploadOption == null ? void 0 : uploadOption.fail) == null ? void 0 : _b.call(uploadOption, file);
|
|
59
|
-
}
|
|
13
|
+
resolveOptions(options = {}) {
|
|
14
|
+
return Object.assign({
|
|
15
|
+
mimetypes: ["*"],
|
|
16
|
+
maxSize: Number.POSITIVE_INFINITY,
|
|
17
|
+
handler(range, files) {
|
|
18
|
+
return files.map((file) => URL.createObjectURL(file));
|
|
19
|
+
},
|
|
20
|
+
success() {
|
|
21
|
+
},
|
|
22
|
+
fail() {
|
|
60
23
|
}
|
|
61
|
-
});
|
|
62
|
-
this.options.handler.call(this, range, uploads, fileFlags, rejectFlags);
|
|
24
|
+
}, options);
|
|
63
25
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
var _a;
|
|
67
|
-
if ((_a = this.quill.options.uploadOption) == null ? void 0 : _a.fileUpload) {
|
|
68
|
-
const initialRange = range;
|
|
69
|
-
files.forEach((file) => {
|
|
70
|
-
var _a2;
|
|
71
|
-
const result = {
|
|
72
|
-
file,
|
|
73
|
-
callback: (res) => {
|
|
74
|
-
if (!res) {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
this.insertFileToEditor(initialRange, file, {
|
|
78
|
-
code: 0,
|
|
79
|
-
data: {
|
|
80
|
-
title: file.name,
|
|
81
|
-
size: file.size,
|
|
82
|
-
src: res.fileUrl
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
initialRange.index += 1;
|
|
86
|
-
},
|
|
87
|
-
editor: this.quill
|
|
88
|
-
};
|
|
89
|
-
(_a2 = this.quill.options.uploadOption) == null ? void 0 : _a2.fileUpload(result);
|
|
90
|
-
});
|
|
91
|
-
} else {
|
|
92
|
-
files.forEach((file) => {
|
|
93
|
-
const fileUrl = URL.createObjectURL(file);
|
|
94
|
-
const initialRange = range;
|
|
95
|
-
this.insertFileToEditor(initialRange, file, {
|
|
96
|
-
code: 0,
|
|
97
|
-
data: {
|
|
98
|
-
title: file.name,
|
|
99
|
-
size: file.size,
|
|
100
|
-
src: file.src ?? fileUrl
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
initialRange.index += 1;
|
|
104
|
-
});
|
|
105
|
-
}
|
|
26
|
+
validateFile(file) {
|
|
27
|
+
return this.options.mimetypes.some((type) => (file.type || "text/plain").match(type.replaceAll("*", ".*"))) && file.size < this.options.maxSize;
|
|
106
28
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
const oldContent = new Delta().retain(range.index).delete(range.length);
|
|
111
|
-
const videoFlag = this.uploadOption && this.uploadOption.isVideoPlay && /^video\/[-\w.]+$/.test(file.type);
|
|
112
|
-
const insertObj = videoFlag ? { video: data } : { file: data };
|
|
113
|
-
const currentContent = new Delta([{ insert: insertObj }]);
|
|
114
|
-
const newContent = oldContent.concat(currentContent);
|
|
115
|
-
this.quill.updateContents(newContent, Quill.sources.USER);
|
|
116
|
-
this.quill.setSelection(range.index + 1);
|
|
117
|
-
} else {
|
|
118
|
-
console.error("error message:", message);
|
|
119
|
-
}
|
|
29
|
+
async getFileUrls(files, range) {
|
|
30
|
+
const uploads = files.filter((file) => this.validateFile(file));
|
|
31
|
+
return this.options.handler.call(this, range, uploads);
|
|
120
32
|
}
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
]);
|
|
132
|
-
const newContent = oldContent.concat(currentContent);
|
|
133
|
-
this.quill.updateContents(newContent, Quill.sources.USER);
|
|
134
|
-
this.quill.setSelection(range.index + 1);
|
|
135
|
-
} else {
|
|
136
|
-
console.error("error message:", message);
|
|
33
|
+
async upload(range, files) {
|
|
34
|
+
const uploads = [];
|
|
35
|
+
const fails = [];
|
|
36
|
+
for (const file of Array.from(files)) {
|
|
37
|
+
if (this.validateFile(file)) {
|
|
38
|
+
uploads.push(file);
|
|
39
|
+
} else {
|
|
40
|
+
fails.push(file);
|
|
41
|
+
}
|
|
137
42
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
file: file2,
|
|
149
|
-
data: { files: [file2] },
|
|
150
|
-
hasRejectedImage,
|
|
151
|
-
callback: (res) => {
|
|
152
|
-
if (!res) {
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
if (imageEnableMultiUpload && Array.isArray(res)) {
|
|
156
|
-
res.forEach((value) => {
|
|
157
|
-
this.insertImageToEditor(initialRange, value);
|
|
158
|
-
initialRange.index += 1;
|
|
159
|
-
});
|
|
160
|
-
} else {
|
|
161
|
-
this.insertImageToEditor(initialRange, res);
|
|
162
|
-
initialRange.index += 1;
|
|
163
|
-
}
|
|
164
|
-
},
|
|
165
|
-
editor: this.quill
|
|
166
|
-
};
|
|
167
|
-
if (imageEnableMultiUpload) {
|
|
168
|
-
result.data = { files };
|
|
43
|
+
const result = await this.options.handler.call(this, range, uploads);
|
|
44
|
+
const updateDelta = result.reduce((delta, url, i) => {
|
|
45
|
+
if (is.isString(url)) {
|
|
46
|
+
const type = uploads[i].type;
|
|
47
|
+
if (type.startsWith("image/")) {
|
|
48
|
+
delta.insert({ image: url });
|
|
49
|
+
} else if (type.startsWith("video/")) {
|
|
50
|
+
delta.insert({ video: { src: url } });
|
|
51
|
+
} else {
|
|
52
|
+
delta.insert({ file: { size: uploads[i].size, title: uploads[i].name, src: url } });
|
|
169
53
|
}
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
reader.readAsDataURL(fileItem);
|
|
180
|
-
});
|
|
181
|
-
});
|
|
182
|
-
Promise.all(promises).then((images) => {
|
|
183
|
-
const update = images.reduce((delta, image) => {
|
|
184
|
-
return delta.insert({ image });
|
|
185
|
-
}, new Delta().retain(range.index).delete(range.length));
|
|
186
|
-
this.quill.updateContents(update, Quill.sources.USER);
|
|
187
|
-
this.quill.setSelection(range.index + images.length, Quill.sources.SILENT);
|
|
188
|
-
});
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
CustomUploader.DEFAULTS = {
|
|
193
|
-
file: editor_config.FILE_UPLOADER_MIME_TYPES,
|
|
194
|
-
image: editor_config.IMAGE_UPLOADER_MIME_TYPES,
|
|
195
|
-
enableMultiUpload: false,
|
|
196
|
-
handler(range, files, fileFlags, rejectFlags) {
|
|
197
|
-
const fileArr = [];
|
|
198
|
-
const imgArr = [];
|
|
199
|
-
files.forEach((file, index) => fileFlags[index] ? fileArr.push(file) : imgArr.push(file));
|
|
200
|
-
if (this.quill.options.modules.file && (fileArr.length || rejectFlags.file)) {
|
|
201
|
-
this.handleUploadFile(range, fileArr, rejectFlags.file);
|
|
54
|
+
} else {
|
|
55
|
+
delta.insert("\n");
|
|
56
|
+
}
|
|
57
|
+
return delta;
|
|
58
|
+
}, new Delta().retain(range.index).delete(range.length));
|
|
59
|
+
this.quill.updateContents(updateDelta, Quill.sources.USER);
|
|
60
|
+
this.quill.setSelection(range.index + result.length, Quill.sources.SILENT);
|
|
61
|
+
for (const file of fails) {
|
|
62
|
+
this.options.fail.call(this, file, range);
|
|
202
63
|
}
|
|
203
|
-
|
|
204
|
-
|
|
64
|
+
for (const [i, res] of result.entries()) {
|
|
65
|
+
if (is.isString(res)) {
|
|
66
|
+
this.options.success.call(this, files[i], { index: range.index + i, length: 0 });
|
|
67
|
+
} else {
|
|
68
|
+
this.options.fail.call(this, files[i], { index: range.index + i, length: 0 });
|
|
69
|
+
}
|
|
205
70
|
}
|
|
206
71
|
}
|
|
207
72
|
};
|
|
208
|
-
|
|
73
|
+
_FileUploader.DEFAULTS = {};
|
|
74
|
+
let FileUploader = _FileUploader;
|
|
75
|
+
exports.FileUploader = FileUploader;
|
|
209
76
|
//# sourceMappingURL=custom-uploader.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-uploader.cjs.js","sources":["../../../src/modules/custom-uploader.ts"],"sourcesContent":["import type { Range } from 'quill/core/quill'\r\n\r\nimport Quill from 'quill'\r\nimport {\r\n FILE_UPLOADER_MIME_TYPES,\r\n IMAGE_UPLOADER_MIME_TYPES,\r\n} from '../config/editor.config'\r\nimport {\r\n isNullOrUndefined,\r\n} from '../config/editor.utils'\r\n\r\ninterface InsertFileData {\r\n code: number\r\n message?: string\r\n data: {\r\n title: string\r\n size: number\r\n src: string\r\n }\r\n}\r\n\r\nconst Uploader = Quill.imports['modules/uploader']\r\nconst Delta = Quill.import('delta')\r\n\r\nclass CustomUploader extends Uploader {\r\n quill\r\n options\r\n\r\n upload(range, files, isFile?) {\r\n const uploads = []\r\n const fileFlags = []\r\n const rejectFlags = {\r\n file: false,\r\n image: false,\r\n }\r\n const uploadOption = this.quill.options.uploadOption\r\n const acceptObj\r\n = (uploadOption && {\r\n image: uploadOption.imageAccept,\r\n file: uploadOption.fileAccept,\r\n })\r\n || {}\r\n Array.from(files).forEach((file: any) => {\r\n if (file) {\r\n const fileFlag\r\n = typeof isFile === 'boolean'\r\n ? isFile\r\n : !/^image\\/[-\\w.]+$/.test(file.type)\r\n const fileType = fileFlag ? 'file' : 'image'\r\n const accept = acceptObj[fileType] || this.options[fileType]\r\n if (this.isAllowedFileType(accept, file) && this.isAllowedFileSize(uploadOption?.maxSize, file)) {\r\n uploads.push(file)\r\n fileFlags.push(fileFlag)\r\n uploadOption?.success?.(file)\r\n }\r\n else {\r\n rejectFlags[fileType] = true\r\n uploadOption?.fail?.(file)\r\n }\r\n }\r\n })\r\n this.options.handler.call(this, range, uploads, fileFlags, rejectFlags)\r\n }\r\n\r\n isAllowedFileSize = (maxSize: number, file: File) => {\r\n if (isNullOrUndefined(maxSize)) {\r\n return true\r\n }\r\n\r\n return file.size <= maxSize\r\n }\r\n\r\n isAllowedFileType = (accept: Array<string> | string, file: File) => {\r\n if (accept) {\r\n const baseMimeType = file.type.replace(/\\/.*$/, '')\r\n const acceptArr = typeof accept === 'string' ? accept.split(',') : accept\r\n return acceptArr.some((type: string) => {\r\n const validType = type.trim()\r\n // suffix name (e.g. '.png,.xlsx')\r\n if (validType.startsWith('.')) {\r\n return (\r\n file.name\r\n .toLowerCase()\r\n .includes(validType.toLowerCase(), file.name.toLowerCase().length - validType.toLowerCase().length)\r\n )\r\n // mime type like 'image/*'\r\n }\r\n else if (/\\/\\*$/.test(validType)) {\r\n return baseMimeType === validType.replace(/\\/.*$/, '')\r\n }\r\n // mime type like 'text/plain,application/json'\r\n return file.type === validType\r\n })\r\n }\r\n return true\r\n }\r\n\r\n // 处理上传文件\r\n handleUploadFile(range, files, _hasRejectedFile) {\r\n if (this.quill.options.uploadOption?.fileUpload) {\r\n const initialRange = range\r\n files.forEach((file) => {\r\n const result = {\r\n file,\r\n callback: (res) => {\r\n if (!res) {\r\n return\r\n }\r\n this.insertFileToEditor(initialRange, file, {\r\n code: 0,\r\n data: {\r\n title: file.name,\r\n size: file.size,\r\n src: res.fileUrl,\r\n },\r\n })\r\n initialRange.index += 1\r\n },\r\n editor: this.quill,\r\n }\r\n this.quill.options.uploadOption?.fileUpload(result)\r\n })\r\n }\r\n else {\r\n files.forEach((file) => {\r\n const fileUrl = URL.createObjectURL(file)\r\n const initialRange = range\r\n this.insertFileToEditor(initialRange, file, {\r\n code: 0,\r\n data: {\r\n title: file.name,\r\n size: file.size,\r\n src: file.src ?? fileUrl,\r\n },\r\n })\r\n initialRange.index += 1\r\n })\r\n }\r\n }\r\n\r\n // 将文件插入编辑器\r\n insertFileToEditor(range: Range, file: File, { code, message, data }: InsertFileData) {\r\n if (code === 0) {\r\n const oldContent = new Delta().retain(range.index).delete(range.length)\r\n const videoFlag = this.uploadOption && this.uploadOption.isVideoPlay && /^video\\/[-\\w.]+$/.test(file.type)\r\n const insertObj = videoFlag ? { video: data } : { file: data }\r\n const currentContent = new Delta([{ insert: insertObj }])\r\n const newContent = oldContent.concat(currentContent)\r\n this.quill.updateContents(newContent, Quill.sources.USER)\r\n this.quill.setSelection(range.index + 1)\r\n }\r\n else {\r\n console.error('error message:', message)\r\n }\r\n }\r\n\r\n // 将图片插入编辑器\r\n insertImageToEditor(range, { code, message, data }) {\r\n if (code === 0) {\r\n const { imageId, imageUrl } = data\r\n // 粘贴截图或者从外源直接拷贝的单图时,需要将编辑器中已选中的内容删除\r\n const oldContent = new Delta().retain(range.index).delete(range.length)\r\n const currentContent = new Delta([\r\n {\r\n insert: { image: imageUrl },\r\n attributes: { 'image-id': imageId },\r\n },\r\n ])\r\n const newContent = oldContent.concat(currentContent)\r\n this.quill.updateContents(newContent, Quill.sources.USER)\r\n this.quill.setSelection(range.index + 1)\r\n }\r\n else {\r\n console.error('error message:', message)\r\n }\r\n }\r\n\r\n // 处理上传图片\r\n handleUploadImage(range, { file, files }, hasRejectedImage) {\r\n if (this.quill.options.uploadOption?.imageUpload) {\r\n // const imageEnableMultiUpload = this.enableMultiUpload === true || this.enableMultiUpload?.image\r\n // 此处this获取不到enableMultiUpload\r\n const imageEnableMultiUpload = this.quill.uploader.options.enableMultiUpload === true || this.quill.uploader.options.enableMultiUpload?.image\r\n files.forEach((file) => {\r\n const initialRange = range\r\n const result = {\r\n file,\r\n data: { files: [file] },\r\n hasRejectedImage,\r\n callback: (res) => {\r\n if (!res) {\r\n return\r\n }\r\n if (imageEnableMultiUpload && Array.isArray(res)) {\r\n res.forEach((value) => {\r\n this.insertImageToEditor(initialRange, value)\r\n initialRange.index += 1\r\n })\r\n }\r\n else {\r\n this.insertImageToEditor(initialRange, res)\r\n initialRange.index += 1\r\n }\r\n },\r\n editor: this.quill,\r\n }\r\n if (imageEnableMultiUpload) {\r\n result.data = { files }\r\n }\r\n this.quill.options.uploadOption?.imageUpload(result)\r\n })\r\n }\r\n else {\r\n const promises = files.map((fileItem) => {\r\n return new Promise((resolve) => {\r\n const reader = new FileReader()\r\n reader.onload = (e: any) => {\r\n resolve(e.target.result)\r\n }\r\n reader.readAsDataURL(fileItem)\r\n })\r\n })\r\n Promise.all(promises).then((images) => {\r\n const update = images.reduce((delta: any, image) => {\r\n return delta.insert({ image })\r\n }, new Delta().retain(range.index).delete(range.length))\r\n this.quill.updateContents(update, Quill.sources.USER)\r\n this.quill.setSelection(range.index + images.length, Quill.sources.SILENT)\r\n })\r\n }\r\n }\r\n}\r\n\r\nCustomUploader.DEFAULTS = {\r\n file: FILE_UPLOADER_MIME_TYPES,\r\n image: IMAGE_UPLOADER_MIME_TYPES,\r\n enableMultiUpload: false,\r\n handler(range, files, fileFlags, rejectFlags) {\r\n const fileArr = []\r\n const imgArr = []\r\n files.forEach((file, index) => (fileFlags[index] ? fileArr.push(file) : imgArr.push(file)))\r\n if (this.quill.options.modules.file && (fileArr.length || rejectFlags.file)) {\r\n this.handleUploadFile(range, fileArr, rejectFlags.file)\r\n }\r\n if (imgArr.length || rejectFlags.image) {\r\n this.handleUploadImage(range, { file: imgArr[0], files: imgArr }, rejectFlags.image)\r\n }\r\n },\r\n}\r\n\r\nexport default CustomUploader\r\n"],"names":["isNullOrUndefined","_a","file","FILE_UPLOADER_MIME_TYPES","IMAGE_UPLOADER_MIME_TYPES"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"custom-uploader.cjs.js","sources":["../../../src/modules/custom-uploader.ts"],"sourcesContent":["import type { Range } from 'quill'\r\nimport type TypeUploader from 'quill/modules/uploader'\r\nimport type FluentEditor from '../core/fluent-editor'\r\nimport Quill from 'quill'\r\nimport { isString } from '../utils/is'\r\n\r\nconst Uploader = Quill.import('modules/uploader') as typeof TypeUploader\r\nconst Delta = Quill.import('delta')\r\n\r\ninterface UploaderOptions {\r\n mimetypes: string[]\r\n handler: (this: { quill: Quill }, range: Range, files: File[]) => void\r\n}\r\nexport interface FileUploaderOptions {\r\n mimetypes: string[]\r\n maxSize: number\r\n handler: (this: { quill: FluentEditor }, range: Range, files: File[]) => Promise<(string | false)[]> | (string | false)[]\r\n success: (this: { quill: FluentEditor }, file: File, range: Range) => void\r\n fail: (this: { quill: FluentEditor }, file: File, range: Range) => void\r\n}\r\nexport class FileUploader extends Uploader {\r\n static DEFAULTS = {} as typeof Uploader.DEFAULTS\r\n // Partial<UploaderOptions> for ts type\r\n options: Partial<UploaderOptions> & FileUploaderOptions\r\n constructor(public quill: FluentEditor, options: Partial<FileUploaderOptions>) {\r\n super(quill, options as any)\r\n this.options = this.resolveOptions(options)\r\n // paste handle in clipboard\r\n }\r\n\r\n resolveOptions(options: Partial<FileUploaderOptions> = {}) {\r\n return Object.assign({\r\n mimetypes: ['*'],\r\n maxSize: Number.POSITIVE_INFINITY,\r\n handler(range: Range, files: File[]) {\r\n return files.map(file => URL.createObjectURL(file))\r\n },\r\n success() {},\r\n fail() {},\r\n }, options)\r\n }\r\n\r\n validateFile(file: File) {\r\n return this.options.mimetypes.some(type => (file.type || 'text/plain').match(type.replaceAll('*', '.*'))) && file.size < this.options.maxSize\r\n }\r\n\r\n async getFileUrls(files: File[], range: Range) {\r\n const uploads = files.filter(file => this.validateFile(file))\r\n return this.options.handler.call(this, range, uploads)\r\n }\r\n\r\n async upload(range: Range, files: FileList | File[]) {\r\n const uploads = []\r\n const fails = []\r\n for (const file of Array.from(files)) {\r\n if (this.validateFile(file)) {\r\n uploads.push(file)\r\n }\r\n else {\r\n fails.push(file)\r\n }\r\n }\r\n const result = await this.options.handler.call(this, range, uploads)\r\n const updateDelta = result.reduce((delta, url, i) => {\r\n if (isString(url)) {\r\n const type = uploads[i].type\r\n if (type.startsWith('image/')) {\r\n delta.insert({ image: url })\r\n }\r\n else if (type.startsWith('video/')) {\r\n delta.insert({ video: { src: url } })\r\n }\r\n else {\r\n delta.insert({ file: { size: uploads[i].size, title: uploads[i].name, src: url } })\r\n }\r\n }\r\n else {\r\n delta.insert('\\n')\r\n }\r\n return delta\r\n }, new Delta().retain(range.index).delete(range.length))\r\n this.quill.updateContents(updateDelta, Quill.sources.USER)\r\n this.quill.setSelection(range.index + result.length, Quill.sources.SILENT)\r\n for (const file of fails) {\r\n this.options.fail.call(this, file, range)\r\n }\r\n for (const [i, res] of result.entries()) {\r\n if (isString(res)) {\r\n this.options.success.call(this, files[i], { index: range.index + i, length: 0 })\r\n }\r\n else {\r\n this.options.fail.call(this, files[i], { index: range.index + i, length: 0 })\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["isString"],"mappings":"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"}
|
|
@@ -2,18 +2,18 @@
|
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
3
|
const Quill = require("quill");
|
|
4
4
|
const editor_utils = require("../../../config/editor.utils.cjs.js");
|
|
5
|
-
const Embed = Quill.
|
|
5
|
+
const Embed = Quill.import("blots/embed");
|
|
6
6
|
const FILE_ATTRIBUTES = ["id", "title", "size", "lastModified"];
|
|
7
|
-
class
|
|
7
|
+
const _File = class _File extends Embed {
|
|
8
8
|
static create(value) {
|
|
9
9
|
const node = super.create(value);
|
|
10
10
|
const size = value.size / 1024;
|
|
11
11
|
const fixSize = !size ? 0 : size < 1 ? 1 : size.toFixed(0);
|
|
12
12
|
node.classList.add("icon-file");
|
|
13
|
-
node.setAttribute("contenteditable", false);
|
|
13
|
+
node.setAttribute("contenteditable", "false");
|
|
14
14
|
const fileSvg = '<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326z m1.8 562H232V136h302v216c0 23.2 18.8 42 42 42h216v494z" p-id="2307"></path></svg>';
|
|
15
15
|
node.innerHTML = `${fileSvg} ${value.title} (${fixSize} KB)`;
|
|
16
|
-
const src =
|
|
16
|
+
const src = this.sanitize(value.src);
|
|
17
17
|
if (src) {
|
|
18
18
|
node.href = src;
|
|
19
19
|
node.target = "_blank";
|
|
@@ -26,14 +26,11 @@ class File extends Embed {
|
|
|
26
26
|
return node;
|
|
27
27
|
}
|
|
28
28
|
static value(domNode) {
|
|
29
|
-
return
|
|
30
|
-
}
|
|
31
|
-
static formats(domNode) {
|
|
32
|
-
return File.getFormats(domNode);
|
|
29
|
+
return this.getFormats(domNode);
|
|
33
30
|
}
|
|
34
31
|
static getFormats(domNode) {
|
|
35
32
|
const formats = {};
|
|
36
|
-
const href =
|
|
33
|
+
const href = this.sanitize(domNode.href);
|
|
37
34
|
if (href) {
|
|
38
35
|
formats.src = href;
|
|
39
36
|
}
|
|
@@ -47,10 +44,11 @@ class File extends Embed {
|
|
|
47
44
|
static sanitize(url) {
|
|
48
45
|
return editor_utils.sanitize(url, this.PROTOCOL_WHITELIST) && url || "";
|
|
49
46
|
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
47
|
+
};
|
|
48
|
+
_File.blotName = "file";
|
|
49
|
+
_File.tagName = "A";
|
|
50
|
+
_File.className = "ql-file-item";
|
|
51
|
+
_File.PROTOCOL_WHITELIST = ["http", "https", "blob"];
|
|
52
|
+
let File = _File;
|
|
55
53
|
exports.default = File;
|
|
56
54
|
//# sourceMappingURL=file.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.cjs.js","sources":["../../../../../src/modules/file/formats/file.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { sanitize } from '../../../config/editor.utils'\r\n\r\nconst Embed = Quill.
|
|
1
|
+
{"version":3,"file":"file.cjs.js","sources":["../../../../../src/modules/file/formats/file.ts"],"sourcesContent":["import type TypeEmbed from 'quill/blots/embed'\r\nimport Quill from 'quill'\r\nimport { sanitize } from '../../../config/editor.utils'\r\n\r\nconst Embed = Quill.import('blots/embed') as typeof TypeEmbed\r\nconst FILE_ATTRIBUTES = ['id', 'title', 'size', 'lastModified']\r\n\r\nexport interface FileValue {\r\n size: number\r\n src: string\r\n title: string\r\n}\r\nclass File extends Embed {\r\n static blotName = 'file'\r\n static tagName = 'A'\r\n static className = 'ql-file-item'\r\n static PROTOCOL_WHITELIST = ['http', 'https', 'blob']\r\n\r\n static create(value: FileValue) {\r\n const node = super.create(value) as HTMLAnchorElement\r\n const size = value.size / 1024\r\n const fixSize = !size ? 0 : size < 1 ? 1 : size.toFixed(0)\r\n node.classList.add('icon-file')\r\n node.setAttribute('contenteditable', 'false')\r\n const fileSvg = '<svg viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\"><path d=\"M854.6 288.6L639.4 73.4c-6-6-14.1-9.4-22.6-9.4H192c-17.7 0-32 14.3-32 32v832c0 17.7 14.3 32 32 32h640c17.7 0 32-14.3 32-32V311.3c0-8.5-3.4-16.7-9.4-22.7zM790.2 326H602V137.8L790.2 326z m1.8 562H232V136h302v216c0 23.2 18.8 42 42 42h216v494z\" p-id=\"2307\"></path></svg>'\r\n node.innerHTML = `${fileSvg} ${value.title} (${fixSize} KB)`\r\n const src = this.sanitize(value.src)\r\n if (src) {\r\n node.href = src\r\n node.target = '_blank'\r\n }\r\n FILE_ATTRIBUTES.forEach((key) => {\r\n if (value[key]) {\r\n node.dataset[key] = value[key]\r\n }\r\n })\r\n return node\r\n }\r\n\r\n static value(domNode: HTMLAnchorElement) {\r\n return this.getFormats(domNode)\r\n }\r\n\r\n static getFormats(domNode: HTMLAnchorElement) {\r\n const formats: Record<string, string> = {}\r\n const href = this.sanitize(domNode.href)\r\n if (href) {\r\n formats.src = href\r\n }\r\n FILE_ATTRIBUTES.forEach((key) => {\r\n if (domNode.dataset[key]) {\r\n formats[key] = domNode.dataset[key]\r\n }\r\n })\r\n return formats\r\n }\r\n\r\n static sanitize(url: string) {\r\n return (sanitize(url, this.PROTOCOL_WHITELIST) && url) || ''\r\n }\r\n}\r\n\r\nexport default File\r\n"],"names":["sanitize"],"mappings":";;;;AAIA,MAAM,QAAQ,MAAM,OAAO,aAAa;AACxC,MAAM,kBAAkB,CAAC,MAAM,SAAS,QAAQ,cAAc;AAO9D,MAAM,QAAN,MAAM,cAAa,MAAM;AAAA,EAMvB,OAAO,OAAO,OAAkB;AACxB,UAAA,OAAO,MAAM,OAAO,KAAK;AACzB,UAAA,OAAO,MAAM,OAAO;AACpB,UAAA,UAAU,CAAC,OAAO,IAAI,OAAO,IAAI,IAAI,KAAK,QAAQ,CAAC;AACpD,SAAA,UAAU,IAAI,WAAW;AACzB,SAAA,aAAa,mBAAmB,OAAO;AAC5C,UAAM,UAAU;AAChB,SAAK,YAAY,GAAG,OAAO,IAAI,MAAM,KAAK,KAAK,OAAO;AACtD,UAAM,MAAM,KAAK,SAAS,MAAM,GAAG;AACnC,QAAI,KAAK;AACP,WAAK,OAAO;AACZ,WAAK,SAAS;AAAA,IAAA;AAEA,oBAAA,QAAQ,CAAC,QAAQ;AAC3B,UAAA,MAAM,GAAG,GAAG;AACd,aAAK,QAAQ,GAAG,IAAI,MAAM,GAAG;AAAA,MAAA;AAAA,IAC/B,CACD;AACM,WAAA;AAAA,EAAA;AAAA,EAGT,OAAO,MAAM,SAA4B;AAChC,WAAA,KAAK,WAAW,OAAO;AAAA,EAAA;AAAA,EAGhC,OAAO,WAAW,SAA4B;AAC5C,UAAM,UAAkC,CAAC;AACzC,UAAM,OAAO,KAAK,SAAS,QAAQ,IAAI;AACvC,QAAI,MAAM;AACR,cAAQ,MAAM;AAAA,IAAA;AAEA,oBAAA,QAAQ,CAAC,QAAQ;AAC3B,UAAA,QAAQ,QAAQ,GAAG,GAAG;AACxB,gBAAQ,GAAG,IAAI,QAAQ,QAAQ,GAAG;AAAA,MAAA;AAAA,IACpC,CACD;AACM,WAAA;AAAA,EAAA;AAAA,EAGT,OAAO,SAAS,KAAa;AAC3B,WAAQA,aAAAA,SAAS,KAAK,KAAK,kBAAkB,KAAK,OAAQ;AAAA,EAAA;AAE9D;AA/CE,MAAO,WAAW;AAClB,MAAO,UAAU;AACjB,MAAO,YAAY;AACnB,MAAO,qBAAqB,CAAC,QAAQ,SAAS,MAAM;AAJtD,IAAM,OAAN;;"}
|
|
@@ -3,16 +3,15 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
|
|
|
3
3
|
const Quill = require("quill");
|
|
4
4
|
const file = require("./formats/file.cjs.js");
|
|
5
5
|
const fileBar = require("./modules/file-bar.cjs.js");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
Quill.register("formats/file", file.default, true);
|
|
10
|
-
}
|
|
11
|
-
constructor(quill, options) {
|
|
12
|
-
super(quill, options);
|
|
6
|
+
class FileModule {
|
|
7
|
+
constructor(quill) {
|
|
8
|
+
this.quill = quill;
|
|
13
9
|
this.quill = quill;
|
|
14
10
|
quill.root.addEventListener("click", (event) => this.clickEvent(event), false);
|
|
15
11
|
}
|
|
12
|
+
static register() {
|
|
13
|
+
Quill.register("formats/file", file.default, true);
|
|
14
|
+
}
|
|
16
15
|
clickEvent(event) {
|
|
17
16
|
event.preventDefault();
|
|
18
17
|
const target = event.target;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../../../src/modules/file/index.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport File from './formats/file'\r\nimport FileBar from './modules/file-bar'\r\n\r\
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../../src/modules/file/index.ts"],"sourcesContent":["import type FluentEditor from '../../core/fluent-editor'\r\nimport Quill from 'quill'\r\nimport File from './formats/file'\r\nimport FileBar from './modules/file-bar'\r\n\r\nclass FileModule {\r\n fileBar: FileBar\r\n\r\n static register() {\r\n Quill.register('formats/file', File, true)\r\n }\r\n\r\n constructor(public quill: FluentEditor) {\r\n this.quill = quill\r\n quill.root.addEventListener('click', event => this.clickEvent(event), false)\r\n }\r\n\r\n clickEvent(event: MouseEvent) {\r\n event.preventDefault()\r\n const target = event.target as HTMLElement\r\n const fileDom = target.closest('a.ql-file-item')\r\n if (fileDom) {\r\n if (this.fileBar) {\r\n this.fileBar.destroy()\r\n }\r\n this.fileBar = new FileBar(this.quill, fileDom)\r\n }\r\n else if (this.fileBar && !target.closest('.ql-file-bar')) {\r\n this.fileBar.destroy()\r\n this.fileBar = null\r\n }\r\n }\r\n}\r\n\r\nexport default FileModule\r\n"],"names":["File","FileBar"],"mappings":";;;;;AAKA,MAAM,WAAW;AAAA,EAOf,YAAmB,OAAqB;AAArB,SAAA,QAAA;AACjB,SAAK,QAAQ;AACP,UAAA,KAAK,iBAAiB,SAAS,CAAA,UAAS,KAAK,WAAW,KAAK,GAAG,KAAK;AAAA,EAAA;AAAA,EAN7E,OAAO,WAAW;AACV,UAAA,SAAS,gBAAgBA,KAAAA,SAAM,IAAI;AAAA,EAAA;AAAA,EAQ3C,WAAW,OAAmB;AAC5B,UAAM,eAAe;AACrB,UAAM,SAAS,MAAM;AACf,UAAA,UAAU,OAAO,QAAQ,gBAAgB;AAC/C,QAAI,SAAS;AACX,UAAI,KAAK,SAAS;AAChB,aAAK,QAAQ,QAAQ;AAAA,MAAA;AAEvB,WAAK,UAAU,IAAIC,QAAAA,QAAQ,KAAK,OAAO,OAAO;AAAA,IAAA,WAEvC,KAAK,WAAW,CAAC,OAAO,QAAQ,cAAc,GAAG;AACxD,WAAK,QAAQ,QAAQ;AACrB,WAAK,UAAU;AAAA,IAAA;AAAA,EACjB;AAEJ;;"}
|
package/lib/modules/i18n.cjs.js
CHANGED
|
@@ -3,28 +3,47 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
|
|
|
3
3
|
require("../config/index.cjs.js");
|
|
4
4
|
const is = require("../utils/is.cjs.js");
|
|
5
5
|
const editor_config = require("../config/editor.config.cjs.js");
|
|
6
|
+
const langs = {};
|
|
6
7
|
class I18N {
|
|
7
8
|
constructor(quill, options) {
|
|
8
9
|
this.quill = quill;
|
|
9
|
-
this.isFullscreen = false;
|
|
10
10
|
this.options = {
|
|
11
|
-
lang: "
|
|
12
|
-
langText: editor_config.LANG_CONF["en-US"]
|
|
11
|
+
lang: ""
|
|
13
12
|
};
|
|
14
13
|
this.options = Object.assign({}, options, this.resolveLanguageOption(options || {}));
|
|
15
14
|
Promise.resolve().then(() => this.changeLanguage(this.options, true));
|
|
16
15
|
}
|
|
16
|
+
static register(inputLangs, isCover = true) {
|
|
17
|
+
for (const lang in inputLangs) {
|
|
18
|
+
const texts = inputLangs[lang];
|
|
19
|
+
if (isCover) {
|
|
20
|
+
langs[lang] = texts;
|
|
21
|
+
} else {
|
|
22
|
+
if (!langs[lang]) langs[lang] = {};
|
|
23
|
+
Object.assign(langs[lang], texts);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
static parserText(text, lang) {
|
|
28
|
+
var _a;
|
|
29
|
+
const i18nPattern = /^_i18n"([^"]*)"/;
|
|
30
|
+
const match = text.match(i18nPattern);
|
|
31
|
+
let key = text;
|
|
32
|
+
if (match) {
|
|
33
|
+
key = match[1];
|
|
34
|
+
}
|
|
35
|
+
return ((_a = langs[lang]) == null ? void 0 : _a[key]) || key;
|
|
36
|
+
}
|
|
17
37
|
resolveLanguageOption(options) {
|
|
18
38
|
if (is.isUndefined(options.lang)) {
|
|
19
39
|
options.lang = editor_config.defaultLanguage;
|
|
20
40
|
}
|
|
21
|
-
if (!(options.lang in
|
|
41
|
+
if (!(options.lang in langs)) {
|
|
22
42
|
console.warn(`The language ${options.lang} is not supported. Use the default language: ${editor_config.defaultLanguage}`);
|
|
23
43
|
options.lang = editor_config.defaultLanguage;
|
|
24
44
|
}
|
|
25
45
|
return {
|
|
26
|
-
lang: options.lang
|
|
27
|
-
langText: Object.assign({}, editor_config.LANG_CONF[options.lang], options.langText || {})
|
|
46
|
+
lang: options.lang
|
|
28
47
|
};
|
|
29
48
|
}
|
|
30
49
|
changeLanguage(options, force = false) {
|
|
@@ -32,9 +51,9 @@ class I18N {
|
|
|
32
51
|
const langOps = this.resolveLanguageOption(options);
|
|
33
52
|
if (langOps.lang === currentLang && !force) return;
|
|
34
53
|
this.options.lang = langOps.lang;
|
|
35
|
-
this.options.
|
|
36
|
-
this.quill.emitter.emit(editor_config.CHANGE_LANGUAGE_EVENT, this.options.lang, this.options.langText);
|
|
54
|
+
this.quill.emitter.emit(editor_config.CHANGE_LANGUAGE_EVENT, this.options.lang, langs[langOps.lang]);
|
|
37
55
|
}
|
|
38
56
|
}
|
|
57
|
+
exports.I18N = I18N;
|
|
39
58
|
exports.default = I18N;
|
|
40
59
|
//# sourceMappingURL=i18n.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.cjs.js","sources":["../../../src/modules/i18n.ts"],"sourcesContent":["import type FluentEditor from '../fluent-editor'\r\nimport { CHANGE_LANGUAGE_EVENT, defaultLanguage
|
|
1
|
+
{"version":3,"file":"i18n.cjs.js","sources":["../../../src/modules/i18n.ts"],"sourcesContent":["import type FluentEditor from '../fluent-editor'\r\nimport { CHANGE_LANGUAGE_EVENT, defaultLanguage } from '../config'\r\nimport { isUndefined } from '../utils/is'\r\n\r\nconst langs: Record<string, Record<string, string>> = {}\r\n\r\ninterface I18NOptions {\r\n lang: string\r\n}\r\nexport class I18N {\r\n static register(inputLangs: Record<string, Record<string, string>>, isCover: boolean = true) {\r\n for (const lang in inputLangs) {\r\n const texts = inputLangs[lang]\r\n if (isCover) {\r\n langs[lang] = texts\r\n }\r\n else {\r\n if (!langs[lang]) langs[lang] = {}\r\n Object.assign(langs[lang], texts)\r\n }\r\n }\r\n }\r\n\r\n static parserText(text: string, lang: string): string {\r\n const i18nPattern = /^_i18n\"([^\"]*)\"/\r\n const match = text.match(i18nPattern)\r\n let key = text\r\n if (match) {\r\n key = match[1]\r\n }\r\n return langs[lang]?.[key] || key\r\n }\r\n\r\n options: I18NOptions = {\r\n lang: '',\r\n }\r\n\r\n constructor(public quill: FluentEditor, options: Partial<I18NOptions>) {\r\n this.options = Object.assign({}, options, this.resolveLanguageOption(options || {}))\r\n // wait until all module registed\r\n Promise.resolve().then(() => this.changeLanguage(this.options, true))\r\n }\r\n\r\n resolveLanguageOption(options: Partial<I18NOptions>): I18NOptions {\r\n if (isUndefined(options.lang)) {\r\n options.lang = defaultLanguage\r\n }\r\n if (!(options.lang in langs)) {\r\n console.warn(`The language ${options.lang} is not supported. Use the default language: ${defaultLanguage}`)\r\n options.lang = defaultLanguage\r\n }\r\n return {\r\n lang: options.lang,\r\n }\r\n }\r\n\r\n changeLanguage(options: Partial<I18NOptions>, force: boolean = false) {\r\n const currentLang = this.options.lang\r\n const langOps = this.resolveLanguageOption(options)\r\n if (langOps.lang === currentLang && !force) return\r\n this.options.lang = langOps.lang\r\n this.quill.emitter.emit(CHANGE_LANGUAGE_EVENT, this.options.lang, langs[langOps.lang])\r\n }\r\n}\r\n\r\nexport { I18NOptions }\r\n\r\nexport default I18N\r\n"],"names":["isUndefined","defaultLanguage","CHANGE_LANGUAGE_EVENT"],"mappings":";;;;;AAIA,MAAM,QAAgD,CAAC;AAKhD,MAAM,KAAK;AAAA,EA4BhB,YAAmB,OAAqB,SAA+B;AAApD,SAAA,QAAA;AAJI,SAAA,UAAA;AAAA,MACrB,MAAM;AAAA,IACR;AAGO,SAAA,UAAU,OAAO,OAAO,CAAC,GAAG,SAAS,KAAK,sBAAsB,WAAW,CAAA,CAAE,CAAC;AAE3E,YAAA,UAAU,KAAK,MAAM,KAAK,eAAe,KAAK,SAAS,IAAI,CAAC;AAAA,EAAA;AAAA,EA9BtE,OAAO,SAAS,YAAoD,UAAmB,MAAM;AAC3F,eAAW,QAAQ,YAAY;AACvB,YAAA,QAAQ,WAAW,IAAI;AAC7B,UAAI,SAAS;AACX,cAAM,IAAI,IAAI;AAAA,MAAA,OAEX;AACH,YAAI,CAAC,MAAM,IAAI,EAAS,OAAA,IAAI,IAAI,CAAC;AACjC,eAAO,OAAO,MAAM,IAAI,GAAG,KAAK;AAAA,MAAA;AAAA,IAClC;AAAA,EACF;AAAA,EAGF,OAAO,WAAW,MAAc,MAAsB;;AACpD,UAAM,cAAc;AACd,UAAA,QAAQ,KAAK,MAAM,WAAW;AACpC,QAAI,MAAM;AACV,QAAI,OAAO;AACT,YAAM,MAAM,CAAC;AAAA,IAAA;AAEf,aAAO,WAAM,IAAI,MAAV,mBAAc,SAAQ;AAAA,EAAA;AAAA,EAa/B,sBAAsB,SAA4C;AAC5D,QAAAA,GAAA,YAAY,QAAQ,IAAI,GAAG;AAC7B,cAAQ,OAAOC,cAAA;AAAA,IAAA;AAEb,QAAA,EAAE,QAAQ,QAAQ,QAAQ;AAC5B,cAAQ,KAAK,gBAAgB,QAAQ,IAAI,gDAAgDA,cAAe,eAAA,EAAE;AAC1G,cAAQ,OAAOA,cAAA;AAAA,IAAA;AAEV,WAAA;AAAA,MACL,MAAM,QAAQ;AAAA,IAChB;AAAA,EAAA;AAAA,EAGF,eAAe,SAA+B,QAAiB,OAAO;AAC9D,UAAA,cAAc,KAAK,QAAQ;AAC3B,UAAA,UAAU,KAAK,sBAAsB,OAAO;AAClD,QAAI,QAAQ,SAAS,eAAe,CAAC,MAAO;AACvC,SAAA,QAAQ,OAAO,QAAQ;AACvB,SAAA,MAAM,QAAQ,KAAKC,cAAAA,uBAAuB,KAAK,QAAQ,MAAM,MAAM,QAAQ,IAAI,CAAC;AAAA,EAAA;AAEzF;;;"}
|
|
@@ -5,6 +5,7 @@ const Emitter = require("quill/core/emitter");
|
|
|
5
5
|
const base = require("quill/themes/base");
|
|
6
6
|
require("../../../config/index.cjs.js");
|
|
7
7
|
const editor_utils = require("../../../config/editor.utils.cjs.js");
|
|
8
|
+
const enUs = require("../../../config/i18n/en-us.cjs.js");
|
|
8
9
|
const debounce = require("../../../utils/debounce.cjs.js");
|
|
9
10
|
const link = require("../formats/link.cjs.js");
|
|
10
11
|
const editor_config = require("../../../config/editor.config.cjs.js");
|
|
@@ -296,7 +297,7 @@ const _Tooltip = class _Tooltip extends base.BaseTooltip {
|
|
|
296
297
|
}
|
|
297
298
|
};
|
|
298
299
|
_Tooltip.TEMPLATE = [
|
|
299
|
-
`<input type="text" data-formula="e=mc^2" data-link="${
|
|
300
|
+
`<input type="text" data-formula="e=mc^2" data-link="${enUs.EN_US.linkplaceholder}" data-video="Embed URL" style="width: 225px;">`,
|
|
300
301
|
'<span class="ql-split"></span>',
|
|
301
302
|
'<a class="ql-preview"><i class="icon-share"></i></a>',
|
|
302
303
|
'<a class="ql-remove"><i class="icon-delete"></i></a>'
|