@opentiny/fluent-editor 3.24.0 → 3.25.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/config/editor.utils.es.js.map +1 -1
- package/es/config/i18n/en-us.es.js +3 -1
- package/es/config/i18n/en-us.es.js.map +1 -1
- package/es/config/i18n/zh-cn.es.js +3 -1
- package/es/config/i18n/zh-cn.es.js.map +1 -1
- package/es/config/icons.config.es.js +4 -0
- package/es/config/icons.config.es.js.map +1 -1
- package/es/config/index.es.js +8 -4
- package/es/config/index.es.js.map +1 -1
- package/es/counter/index.es.js +4 -4
- package/es/counter/index.es.js.map +1 -1
- package/es/custom-clipboard.es.js +2 -2
- package/es/custom-clipboard.es.js.map +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.map +1 -1
- package/es/custom-image/actions/DeleteAction.es.js.map +1 -1
- 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 +70 -30
- package/es/custom-uploader.es.js.map +1 -1
- package/es/divider/index.es.js +17 -0
- package/es/divider/index.es.js.map +1 -0
- package/es/emoji/emoji-map.es.js.map +1 -1
- package/es/emoji/formats/emoji-blot.es.js.map +1 -1
- package/es/emoji/modules/emoji.es.js.map +1 -1
- 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 +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 -1
- package/es/file/modules/file-bar.es.js.map +1 -1
- package/es/fluent-editor.es.js +25 -29
- package/es/fluent-editor.es.js.map +1 -1
- package/es/format-painter/index.es.js.map +1 -1
- package/es/fullscreen/handler.es.js +2 -4
- package/es/fullscreen/handler.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.map +1 -1
- package/es/global-link/utils/createTable.es.js.map +1 -1
- package/es/i18n/index.es.js +39 -0
- package/es/i18n/index.es.js.map +1 -0
- package/es/index.es.js +3 -1
- package/es/index.es.js.map +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 +2 -3
- package/es/link/modules/tooltip.es.js.map +1 -1
- package/es/mathlive/formats.es.js.map +1 -1
- package/es/mathlive/index.es.js.map +1 -1
- package/es/mathlive/tooltip.es.js.map +1 -1
- package/es/mention/Mention.es.js.map +1 -1
- package/es/mention/MentionLink.es.js.map +1 -1
- package/es/quick-menu/index.es.js.map +1 -1
- package/es/screenshot/index.es.js.map +1 -1
- package/es/soft-break/index.es.js.map +1 -1
- package/es/syntax/index.es.js.map +1 -1
- package/es/table/better-table.es.js.map +1 -1
- package/es/table/formats/header.es.js +2 -2
- package/es/table/formats/header.es.js.map +1 -1
- package/es/table/formats/list.es.js.map +1 -1
- package/es/table/formats/table.es.js.map +1 -1
- package/es/table/modules/table-column-tool.es.js.map +1 -1
- package/es/table/modules/table-operation-menu.es.js +16 -17
- package/es/table/modules/table-operation-menu.es.js.map +1 -1
- package/es/table/modules/table-scroll-bar.es.js.map +1 -1
- package/es/table/modules/table-selection.es.js.map +1 -1
- package/es/table/modules/table-selector.es.js.map +1 -1
- package/es/table/utils/index.es.js.map +1 -1
- 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 +3 -3
- package/es/toolbar/index.es.js.map +1 -1
- package/es/toolbar/toolbar-tip.es.js +96 -94
- package/es/toolbar/toolbar-tip.es.js.map +1 -1
- package/es/utils/debounce.es.js.map +1 -1
- package/es/utils/image.es.js.map +1 -1
- package/es/utils/is.es.js +4 -0
- package/es/utils/is.es.js.map +1 -1
- package/es/utils/method.es.js.map +1 -1
- package/es/utils/scroll-lock.es.js.map +1 -1
- package/es/video/index.es.js.map +1 -1
- package/lib/config/editor.config.cjs.js.map +1 -1
- package/lib/config/editor.utils.cjs.js.map +1 -1
- package/lib/config/i18n/en-us.cjs.js +3 -1
- package/lib/config/i18n/en-us.cjs.js.map +1 -1
- package/lib/config/i18n/zh-cn.cjs.js +3 -1
- package/lib/config/i18n/zh-cn.cjs.js.map +1 -1
- package/lib/config/icons.config.cjs.js +4 -0
- package/lib/config/icons.config.cjs.js.map +1 -1
- package/lib/config/index.cjs.js +7 -3
- package/lib/config/index.cjs.js.map +1 -1
- package/lib/counter/index.cjs.js +4 -4
- package/lib/counter/index.cjs.js.map +1 -1
- package/lib/custom-clipboard.cjs.js +2 -2
- package/lib/custom-clipboard.cjs.js.map +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.map +1 -1
- package/lib/custom-image/actions/DeleteAction.cjs.js.map +1 -1
- 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 +70 -30
- package/lib/custom-uploader.cjs.js.map +1 -1
- package/lib/divider/index.cjs.js +17 -0
- package/lib/divider/index.cjs.js.map +1 -0
- 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.map +1 -1
- package/lib/emoji/modules/emoji.cjs.js.map +1 -1
- 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 +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 -1
- package/lib/file/modules/file-bar.cjs.js.map +1 -1
- package/lib/fluent-editor.cjs.js +46 -50
- package/lib/fluent-editor.cjs.js.map +1 -1
- package/lib/format-painter/index.cjs.js.map +1 -1
- package/lib/fullscreen/handler.cjs.js +2 -4
- package/lib/fullscreen/handler.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.map +1 -1
- package/lib/global-link/utils/createTable.cjs.js.map +1 -1
- package/lib/i18n/index.cjs.js +39 -0
- package/lib/i18n/index.cjs.js.map +1 -0
- package/lib/index.cjs.js +3 -1
- package/lib/index.cjs.js.map +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 +2 -3
- package/lib/link/modules/tooltip.cjs.js.map +1 -1
- package/lib/mathlive/formats.cjs.js.map +1 -1
- package/lib/mathlive/index.cjs.js.map +1 -1
- package/lib/mathlive/tooltip.cjs.js.map +1 -1
- package/lib/mention/Mention.cjs.js.map +1 -1
- package/lib/mention/MentionLink.cjs.js.map +1 -1
- package/lib/quick-menu/index.cjs.js.map +1 -1
- package/lib/screenshot/index.cjs.js.map +1 -1
- package/lib/soft-break/index.cjs.js.map +1 -1
- package/lib/syntax/index.cjs.js.map +1 -1
- package/lib/table/better-table.cjs.js.map +1 -1
- package/lib/table/formats/header.cjs.js +2 -2
- package/lib/table/formats/header.cjs.js.map +1 -1
- package/lib/table/formats/list.cjs.js.map +1 -1
- package/lib/table/formats/table.cjs.js.map +1 -1
- package/lib/table/modules/table-column-tool.cjs.js.map +1 -1
- package/lib/table/modules/table-operation-menu.cjs.js +16 -17
- package/lib/table/modules/table-operation-menu.cjs.js.map +1 -1
- package/lib/table/modules/table-scroll-bar.cjs.js.map +1 -1
- package/lib/table/modules/table-selection.cjs.js.map +1 -1
- package/lib/table/modules/table-selector.cjs.js.map +1 -1
- package/lib/table/utils/index.cjs.js.map +1 -1
- 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/toolbar/toolbar-tip.cjs.js +96 -94
- package/lib/toolbar/toolbar-tip.cjs.js.map +1 -1
- package/lib/utils/debounce.cjs.js.map +1 -1
- package/lib/utils/image.cjs.js.map +1 -1
- package/lib/utils/is.cjs.js +4 -0
- package/lib/utils/is.cjs.js.map +1 -1
- package/lib/utils/method.cjs.js.map +1 -1
- package/lib/utils/scroll-lock.cjs.js.map +1 -1
- package/lib/video/index.cjs.js.map +1 -1
- package/package.json +2 -3
- package/style.css +169 -109
- package/types/config/editor.config.d.ts +4 -0
- package/types/config/i18n/en-us.d.ts +2 -0
- package/types/config/i18n/zh-cn.d.ts +2 -0
- package/types/config/icons.config.d.ts +2 -0
- package/types/config/types/editor-config.interface.d.ts +11 -3
- package/types/config/types/type.d.ts +1 -0
- package/types/counter/index.d.ts +1 -1
- package/types/divider/index.d.ts +7 -0
- package/types/fluent-editor.d.ts +2 -5
- package/types/i18n/index.d.ts +14 -0
- package/types/index.d.ts +2 -1
- package/types/table/formats/header.d.ts +5 -4
- package/types/toolbar/toolbar-tip.d.ts +8 -7
- package/types/utils/is.d.ts +3 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
+
const Quill = require("quill");
|
|
4
|
+
const BlockEmbed = Quill.import("blots/block/embed");
|
|
5
|
+
const _DividerBlot = class _DividerBlot extends BlockEmbed {
|
|
6
|
+
static create() {
|
|
7
|
+
const node = super.create();
|
|
8
|
+
node.setAttribute("contenteditable", "false");
|
|
9
|
+
return node;
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
_DividerBlot.blotName = "divider";
|
|
13
|
+
_DividerBlot.tagName = "hr";
|
|
14
|
+
let DividerBlot = _DividerBlot;
|
|
15
|
+
Quill.register(DividerBlot);
|
|
16
|
+
exports.default = DividerBlot;
|
|
17
|
+
//# sourceMappingURL=index.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/divider/index.ts"],"sourcesContent":["import Quill from 'quill'\r\n\r\nconst BlockEmbed = Quill.import('blots/block/embed')\r\n\r\nclass DividerBlot extends BlockEmbed {\r\n static blotName = 'divider'\r\n static tagName = 'hr'\r\n\r\n static create() {\r\n const node = super.create()\r\n node.setAttribute('contenteditable', 'false')\r\n return node\r\n }\r\n}\r\n\r\nQuill.register(DividerBlot)\r\nexport default DividerBlot\r\n"],"names":[],"mappings":";;;AAEA,MAAM,aAAa,MAAM,OAAO,mBAAmB;AAEnD,MAAM,eAAN,MAAM,qBAAoB,WAAW;AAAA,EAInC,OAAO,SAAS;AACR,UAAA,OAAO,MAAM,OAAO;AACrB,SAAA,aAAa,mBAAmB,OAAO;AACrC,WAAA;AAAA,EAAA;AAEX;AARE,aAAO,WAAW;AAClB,aAAO,UAAU;AAFnB,IAAM,cAAN;AAWA,MAAM,SAAS,WAAW;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emoji-list.cjs.js","sources":["../../../src/emoji/emoji-list.ts"],"sourcesContent":["import {\r\n peopleEmoji,\r\n} from './emoji-list/index'\r\n\r\nconst emojiList = [\r\n ...peopleEmoji,\r\n]\r\n\r\nexport default emojiList\r\n"],"names":["peopleEmoji"],"mappings":";;;;AAIA,MAAM,YAAY;AAAA,EAChB,GAAGA,
|
|
1
|
+
{"version":3,"file":"emoji-list.cjs.js","sources":["../../../src/emoji/emoji-list.ts"],"sourcesContent":["import {\r\n peopleEmoji,\r\n} from './emoji-list/index'\r\n\r\nconst emojiList = [\r\n ...peopleEmoji,\r\n]\r\n\r\nexport default emojiList\r\n"],"names":["peopleEmoji"],"mappings":";;;;AAIA,MAAM,YAAY;AAAA,EAChB,GAAGA,OAAAA;AACL;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emoji-map.cjs.js","sources":["../../../src/emoji/emoji-map.ts"],"sourcesContent":["import emojiList from './emoji-list'\r\n\r\nconst emojiMap = {}\r\n\r\nemojiList.forEach((emojiListObject) => {\r\n emojiMap[emojiListObject.name] = emojiListObject\r\n})\r\n\r\nexport default emojiMap\r\n"],"names":["emojiList"],"mappings":";;;AAEA,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"emoji-map.cjs.js","sources":["../../../src/emoji/emoji-map.ts"],"sourcesContent":["import emojiList from './emoji-list'\r\n\r\nconst emojiMap = {}\r\n\r\nemojiList.forEach((emojiListObject) => {\r\n emojiMap[emojiListObject.name] = emojiListObject\r\n})\r\n\r\nexport default emojiMap\r\n"],"names":["emojiList"],"mappings":";;;AAEA,MAAM,WAAW,CAAA;AAEjBA,UAAAA,QAAU,QAAQ,CAAC,oBAAoB;AAC5B,WAAA,gBAAgB,IAAI,IAAI;AACnC,CAAC;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emoji-blot.cjs.js","sources":["../../../../src/emoji/formats/emoji-blot.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport emojiMap from '../emoji-map'\r\n\r\nconst Embed = Quill.imports['blots/embed']\r\n\r\n// @dynamic\r\nclass EmojiBlot extends Embed {\r\n static emojiClass: string\r\n static emojiPrefix: any\r\n static tagName: string\r\n static blotName: string\r\n static className: string\r\n static create(value) {\r\n const node = super.create()\r\n if (typeof value === 'object') {\r\n EmojiBlot.buildSpan(value, node)\r\n }\r\n else if (typeof value === 'string') {\r\n const valueObj = emojiMap[value]\r\n if (valueObj) {\r\n EmojiBlot.buildSpan(valueObj, node)\r\n }\r\n }\r\n // 修复在emoji后输入中文插入其中导致quill不能识别\r\n node.setAttribute('contenteditable', false)\r\n return node\r\n }\r\n\r\n static value(node) {\r\n return node.dataset.name\r\n }\r\n\r\n static buildSpan(value, node) {\r\n node.setAttribute('data-name', value.name)\r\n const emojiSpan = document.createElement('span')\r\n emojiSpan.classList.add(this.emojiClass)\r\n emojiSpan.classList.add(this.emojiPrefix + value.name)\r\n // unicode can be '1f1f5-1f1ea',see emoji-list.js.\r\n emojiSpan.textContent = String.fromCodePoint(...EmojiBlot.parseUnicode(value.unicode))\r\n node.appendChild(emojiSpan)\r\n }\r\n\r\n static parseUnicode(string) {\r\n return string.split('-').map(str => Number.parseInt(str, 16))\r\n }\r\n}\r\n\r\nEmojiBlot.blotName = 'emoji'\r\nEmojiBlot.className = 'ql-emojiblot'\r\nEmojiBlot.tagName = 'span'\r\nEmojiBlot.emojiClass = 'ap'\r\nEmojiBlot.emojiPrefix = 'ap-'\r\n\r\nexport default EmojiBlot\r\n"],"names":["emojiMap"],"mappings":";;;;AAGA,MAAM,QAAQ,MAAM,QAAQ,aAAa;AAGzC,MAAM,kBAAkB,MAAM;AAAA,EAM5B,OAAO,OAAO,OAAO;AACb,UAAA,OAAO,MAAM;
|
|
1
|
+
{"version":3,"file":"emoji-blot.cjs.js","sources":["../../../../src/emoji/formats/emoji-blot.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport emojiMap from '../emoji-map'\r\n\r\nconst Embed = Quill.imports['blots/embed']\r\n\r\n// @dynamic\r\nclass EmojiBlot extends Embed {\r\n static emojiClass: string\r\n static emojiPrefix: any\r\n static tagName: string\r\n static blotName: string\r\n static className: string\r\n static create(value) {\r\n const node = super.create()\r\n if (typeof value === 'object') {\r\n EmojiBlot.buildSpan(value, node)\r\n }\r\n else if (typeof value === 'string') {\r\n const valueObj = emojiMap[value]\r\n if (valueObj) {\r\n EmojiBlot.buildSpan(valueObj, node)\r\n }\r\n }\r\n // 修复在emoji后输入中文插入其中导致quill不能识别\r\n node.setAttribute('contenteditable', false)\r\n return node\r\n }\r\n\r\n static value(node) {\r\n return node.dataset.name\r\n }\r\n\r\n static buildSpan(value, node) {\r\n node.setAttribute('data-name', value.name)\r\n const emojiSpan = document.createElement('span')\r\n emojiSpan.classList.add(this.emojiClass)\r\n emojiSpan.classList.add(this.emojiPrefix + value.name)\r\n // unicode can be '1f1f5-1f1ea',see emoji-list.js.\r\n emojiSpan.textContent = String.fromCodePoint(...EmojiBlot.parseUnicode(value.unicode))\r\n node.appendChild(emojiSpan)\r\n }\r\n\r\n static parseUnicode(string) {\r\n return string.split('-').map(str => Number.parseInt(str, 16))\r\n }\r\n}\r\n\r\nEmojiBlot.blotName = 'emoji'\r\nEmojiBlot.className = 'ql-emojiblot'\r\nEmojiBlot.tagName = 'span'\r\nEmojiBlot.emojiClass = 'ap'\r\nEmojiBlot.emojiPrefix = 'ap-'\r\n\r\nexport default EmojiBlot\r\n"],"names":["emojiMap"],"mappings":";;;;AAGA,MAAM,QAAQ,MAAM,QAAQ,aAAa;AAGzC,MAAM,kBAAkB,MAAM;AAAA,EAM5B,OAAO,OAAO,OAAO;AACb,UAAA,OAAO,MAAM,OAAO;AACtB,QAAA,OAAO,UAAU,UAAU;AACnB,gBAAA,UAAU,OAAO,IAAI;AAAA,IAAA,WAExB,OAAO,UAAU,UAAU;AAC5B,YAAA,WAAWA,iBAAS,KAAK;AAC/B,UAAI,UAAU;AACF,kBAAA,UAAU,UAAU,IAAI;AAAA,MAAA;AAAA,IACpC;AAGG,SAAA,aAAa,mBAAmB,KAAK;AACnC,WAAA;AAAA,EAAA;AAAA,EAGT,OAAO,MAAM,MAAM;AACjB,WAAO,KAAK,QAAQ;AAAA,EAAA;AAAA,EAGtB,OAAO,UAAU,OAAO,MAAM;AACvB,SAAA,aAAa,aAAa,MAAM,IAAI;AACnC,UAAA,YAAY,SAAS,cAAc,MAAM;AACrC,cAAA,UAAU,IAAI,KAAK,UAAU;AACvC,cAAU,UAAU,IAAI,KAAK,cAAc,MAAM,IAAI;AAE3C,cAAA,cAAc,OAAO,cAAc,GAAG,UAAU,aAAa,MAAM,OAAO,CAAC;AACrF,SAAK,YAAY,SAAS;AAAA,EAAA;AAAA,EAG5B,OAAO,aAAa,QAAQ;AACnB,WAAA,OAAO,MAAM,GAAG,EAAE,IAAI,SAAO,OAAO,SAAS,KAAK,EAAE,CAAC;AAAA,EAAA;AAEhE;AAEA,UAAU,WAAW;AACrB,UAAU,YAAY;AACtB,UAAU,UAAU;AACpB,UAAU,aAAa;AACvB,UAAU,cAAc;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emoji.cjs.js","sources":["../../../../src/emoji/modules/emoji.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport emojiList from '../emoji-list'\r\n\r\nconst Module = Quill.imports['core/module']\r\n\r\n// @dynamic\r\nclass ShortNameEmoji extends Module {\r\n static DEFAULTS: {\r\n emojiList: any[]\r\n fuse: {\r\n shouldSort: boolean\r\n threshold: number\r\n location: number\r\n distance: number\r\n maxPatternLength: number\r\n minMatchCharLength: number\r\n keys: string[]\r\n }\r\n }\r\n\r\n emojiList: any\r\n quill: any\r\n fuse: any\r\n onOpen: any\r\n onClose: any\r\n container: HTMLUListElement\r\n onSelectionChange: any\r\n onTextChange: any\r\n open: boolean\r\n atIndex: any\r\n focusedButton: any\r\n isWhiteSpace: (ch: any) => boolean\r\n query: any\r\n buttons: any\r\n options: any\r\n constructor(quill, options) {\r\n super(quill, options)\r\n\r\n this.emojiList = options.emojiList\r\n\r\n this.quill = quill\r\n this.onClose = options.onClose\r\n this.onOpen = options.onOpen\r\n this.container = document.createElement('ul')\r\n this.container.classList.add('emoji_completions')\r\n this.quill.container.appendChild(this.container)\r\n this.container.style.position = 'absolute'\r\n this.container.style.display = 'none'\r\n\r\n this.onSelectionChange = this.maybeUnfocus.bind(this)\r\n this.onTextChange = this.update.bind(this)\r\n\r\n this.open = false\r\n this.atIndex = null\r\n this.focusedButton = null\r\n\r\n this.isWhiteSpace = function (ch) {\r\n let whiteSpace = false\r\n if (/\\s/.test(ch)) {\r\n whiteSpace = true\r\n }\r\n return whiteSpace\r\n }\r\n\r\n quill.keyboard.addBinding({\r\n // TODO: Once Quill supports using event.key change this to \":\"\r\n key: 186, // \":\" instead of 190 in Safari. Since it's the same key it doesn't matter if we register both.\r\n shiftKey: true,\r\n }, this.triggerPicker.bind(this))\r\n\r\n quill.keyboard.addBinding({\r\n // gecko based browsers (firefox) use 59 as the keycode for semicolon,\r\n // which makes a colon character when combined with shift\r\n key: 59,\r\n shiftKey: true,\r\n }, this.triggerPicker.bind(this))\r\n\r\n quill.keyboard.addBinding({\r\n key: 39, // ArrowRight\r\n collapsed: true,\r\n }, this.handleArrow.bind(this))\r\n\r\n quill.keyboard.addBinding({\r\n key: 40, // ArrowRight\r\n collapsed: true,\r\n }, this.handleArrow.bind(this))\r\n // TODO: Add keybindings for Enter (13) and Tab (9) directly on the quill editor\r\n }\r\n\r\n triggerPicker(range, _context) {\r\n if (this.open) return true\r\n if (range.length > 0) {\r\n this.quill.deleteText(range.index, range.length, Quill.sources.USER)\r\n }\r\n\r\n this.quill.insertText(range.index, ':', 'emoji-shortname', Quill.sources.USER)\r\n const atSignBounds = this.quill.getBounds(range.index)\r\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT)\r\n\r\n this.atIndex = range.index\r\n\r\n const paletteMaxPos = atSignBounds.left + 250\r\n if (paletteMaxPos > this.quill.container.offsetWidth) {\r\n this.container.style.left = `${atSignBounds.left - 250}px`\r\n }\r\n else {\r\n this.container.style.left = `${atSignBounds.left}px`\r\n }\r\n\r\n this.container.style.top = `${atSignBounds.top + atSignBounds.height}px`\r\n this.open = true\r\n\r\n this.quill.on('text-change', this.onTextChange)\r\n this.quill.once('selection-change', this.onSelectionChange)\r\n if (this.onOpen) {\r\n this.onOpen()\r\n }\r\n }\r\n\r\n handleArrow() {\r\n if (!this.open) return true\r\n this.buttons[0].classList.remove('emoji-active')\r\n this.buttons[0].focus()\r\n if (this.buttons.length > 1) {\r\n this.buttons[1].focus()\r\n }\r\n }\r\n\r\n update(event) {\r\n const sel = this.quill.getSelection().index\r\n if (this.atIndex >= sel) { // Deleted the at character\r\n return this.close(null)\r\n }\r\n this.query = this.quill.getText(this.atIndex + 1, sel - this.atIndex - 1)\r\n\r\n try {\r\n if (this.isWhiteSpace(this.query)) {\r\n this.close(null)\r\n return\r\n }\r\n }\r\n catch (_e) {\r\n throw new Error('Close failed')\r\n }\r\n\r\n this.query = this.query.trim()\r\n\r\n let emojis: any = this.emojiList\r\n emojis.sort((a: any, b: any) => {\r\n return a.emoji_order - b.emoji_order\r\n })\r\n\r\n if (this.query.length < this.options.fuse.minMatchCharLength || emojis.length === 0) {\r\n this.container.style.display = 'none'\r\n return\r\n }\r\n if (emojis.length > 15) { // return only 15\r\n emojis = emojis.slice(0, 15)\r\n }\r\n this.renderCompletions(emojis, event)\r\n }\r\n\r\n maybeUnfocus() {\r\n if (this.container.querySelector('*:focus')) return\r\n this.close(null)\r\n }\r\n\r\n renderCompletions(emojis, evt) {\r\n try {\r\n if (evt) {\r\n if (evt.key === 'Enter' || evt.keyCode === 13) {\r\n this.close(emojis[0], 1)\r\n this.container.style.display = 'none'\r\n return\r\n }\r\n else if (evt.key === 'Tab' || evt.keyCode === 9) {\r\n this.quill.disable()\r\n this.buttons[0].classList.remove('emoji-active')\r\n this.buttons[1].focus()\r\n return\r\n }\r\n }\r\n if (evt) return\r\n }\r\n catch (_e) {\r\n throw new Error('Render failed')\r\n }\r\n\r\n while (this.container.firstChild) {\r\n this.container.removeChild(this.container.firstChild)\r\n }\r\n const buttons = Array.from({ length: emojis.length })\r\n this.buttons = buttons\r\n\r\n const handler = (i, emoji) => (event) => {\r\n const arrowLeftKey = event.key === 'ArrowLeft' || event.keyCode === 37\r\n const arrowUpKey = event.key === 'ArrowUp' || event.keyCode === 38\r\n const arrowRightKey = event.key === 'ArrowRight' || event.keyCode === 39\r\n const arrowDownKey = event.key === 'ArrowDown' || event.keyCode === 40\r\n if (arrowRightKey || arrowDownKey) {\r\n event.preventDefault()\r\n buttons[Math.min(buttons.length - 1, i + 1)].focus()\r\n }\r\n else if (event.key === 'Tab' || event.keyCode === 9) {\r\n event.preventDefault()\r\n if ((i + 1) === buttons.length) {\r\n buttons[0].focus()\r\n return\r\n }\r\n buttons[Math.min(buttons.length - 1, i + 1)].focus()\r\n }\r\n else if (arrowLeftKey || arrowUpKey) {\r\n event.preventDefault()\r\n buttons[Math.max(0, i - 1)].focus()\r\n }\r\n else if (event.key === 'Enter' || event.keyCode === 13\r\n || event.key === ' ' || event.keyCode === 32\r\n || event.key === 'Tab' || event.keyCode === 9) {\r\n event.preventDefault()\r\n this.quill.enable()\r\n this.close(emoji)\r\n }\r\n }\r\n\r\n emojis.forEach((emoji, i) => {\r\n const li = makeElement(\r\n 'li',\r\n {},\r\n makeElement(\r\n 'button',\r\n { type: 'button' },\r\n makeElement('span', { className: `button-emoji ap ap-${emoji.name}`, innerHTML: emoji.code_decimal }),\r\n makeElement('span', { className: 'unmatched' }, emoji.shortname),\r\n ),\r\n )\r\n this.container.appendChild(li)\r\n buttons[i] = li.firstChild\r\n // Events will be GC-ed with button on each re-render:\r\n buttons[i].addEventListener('keydown', handler(i, emoji))\r\n buttons[i].addEventListener('mousedown', () => this.close(emoji))\r\n buttons[i].addEventListener('focus', () => {\r\n this.focusedButton = i\r\n })\r\n buttons[i].addEventListener('unfocus', () => {\r\n this.focusedButton = null\r\n })\r\n })\r\n\r\n this.container.style.display = 'block'\r\n // emoji palette on top\r\n if (this.quill.container.classList.contains('top-emoji')) {\r\n const x = this.container.querySelectorAll('li')\r\n let i\r\n for (i = 0; i < x.length; i++) {\r\n x[i].style.display = 'block'\r\n }\r\n\r\n const windowHeight = window.innerHeight\r\n const editorPos = this.quill.container.getBoundingClientRect().top\r\n if (editorPos > windowHeight / 2 && this.container.offsetHeight > 0) {\r\n this.container.style.top = `-${this.container.offsetHeight}px`\r\n }\r\n }\r\n\r\n buttons[0].classList.add('emoji-active')\r\n }\r\n\r\n close(value, trailingDelete = 0) {\r\n this.quill.enable()\r\n this.container.style.display = 'none'\r\n while (this.container.firstChild) {\r\n this.container.removeChild(this.container.firstChild)\r\n }\r\n this.quill.off('selection-change', this.onSelectionChange)\r\n this.quill.off('text-change', this.onTextChange)\r\n if (value) {\r\n this.quill.deleteText(this.atIndex, this.query.length + 1 + trailingDelete, Quill.sources.USER)\r\n this.quill.insertEmbed(this.atIndex, 'emoji', value, Quill.sources.USER)\r\n setTimeout(() => this.quill.setSelection(this.atIndex + 1), 0)\r\n }\r\n this.quill.focus()\r\n this.open = false\r\n if (this.onClose) {\r\n this.onClose(value)\r\n }\r\n }\r\n}\r\n\r\nShortNameEmoji.DEFAULTS = {\r\n emojiList,\r\n fuse: {\r\n shouldSort: true,\r\n threshold: 0.1,\r\n location: 0,\r\n distance: 100,\r\n maxPatternLength: 32,\r\n minMatchCharLength: 1,\r\n keys: [\r\n 'shortname',\r\n ],\r\n },\r\n}\r\n\r\nfunction makeElement(tag, attrs, ...children) {\r\n const elem = document.createElement(tag)\r\n Object.keys(attrs).forEach((key) => {\r\n elem[key] = attrs[key]\r\n })\r\n children.forEach((child) => {\r\n if (typeof child === 'string') {\r\n child = document.createTextNode(child)\r\n }\r\n elem.appendChild(child)\r\n })\r\n return elem\r\n}\r\n\r\nexport default ShortNameEmoji\r\n"],"names":["emojiList"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"emoji.cjs.js","sources":["../../../../src/emoji/modules/emoji.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport emojiList from '../emoji-list'\r\n\r\nconst Module = Quill.imports['core/module']\r\n\r\n// @dynamic\r\nclass ShortNameEmoji extends Module {\r\n static DEFAULTS: {\r\n emojiList: any[]\r\n fuse: {\r\n shouldSort: boolean\r\n threshold: number\r\n location: number\r\n distance: number\r\n maxPatternLength: number\r\n minMatchCharLength: number\r\n keys: string[]\r\n }\r\n }\r\n\r\n emojiList: any\r\n quill: any\r\n fuse: any\r\n onOpen: any\r\n onClose: any\r\n container: HTMLUListElement\r\n onSelectionChange: any\r\n onTextChange: any\r\n open: boolean\r\n atIndex: any\r\n focusedButton: any\r\n isWhiteSpace: (ch: any) => boolean\r\n query: any\r\n buttons: any\r\n options: any\r\n constructor(quill, options) {\r\n super(quill, options)\r\n\r\n this.emojiList = options.emojiList\r\n\r\n this.quill = quill\r\n this.onClose = options.onClose\r\n this.onOpen = options.onOpen\r\n this.container = document.createElement('ul')\r\n this.container.classList.add('emoji_completions')\r\n this.quill.container.appendChild(this.container)\r\n this.container.style.position = 'absolute'\r\n this.container.style.display = 'none'\r\n\r\n this.onSelectionChange = this.maybeUnfocus.bind(this)\r\n this.onTextChange = this.update.bind(this)\r\n\r\n this.open = false\r\n this.atIndex = null\r\n this.focusedButton = null\r\n\r\n this.isWhiteSpace = function (ch) {\r\n let whiteSpace = false\r\n if (/\\s/.test(ch)) {\r\n whiteSpace = true\r\n }\r\n return whiteSpace\r\n }\r\n\r\n quill.keyboard.addBinding({\r\n // TODO: Once Quill supports using event.key change this to \":\"\r\n key: 186, // \":\" instead of 190 in Safari. Since it's the same key it doesn't matter if we register both.\r\n shiftKey: true,\r\n }, this.triggerPicker.bind(this))\r\n\r\n quill.keyboard.addBinding({\r\n // gecko based browsers (firefox) use 59 as the keycode for semicolon,\r\n // which makes a colon character when combined with shift\r\n key: 59,\r\n shiftKey: true,\r\n }, this.triggerPicker.bind(this))\r\n\r\n quill.keyboard.addBinding({\r\n key: 39, // ArrowRight\r\n collapsed: true,\r\n }, this.handleArrow.bind(this))\r\n\r\n quill.keyboard.addBinding({\r\n key: 40, // ArrowRight\r\n collapsed: true,\r\n }, this.handleArrow.bind(this))\r\n // TODO: Add keybindings for Enter (13) and Tab (9) directly on the quill editor\r\n }\r\n\r\n triggerPicker(range, _context) {\r\n if (this.open) return true\r\n if (range.length > 0) {\r\n this.quill.deleteText(range.index, range.length, Quill.sources.USER)\r\n }\r\n\r\n this.quill.insertText(range.index, ':', 'emoji-shortname', Quill.sources.USER)\r\n const atSignBounds = this.quill.getBounds(range.index)\r\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT)\r\n\r\n this.atIndex = range.index\r\n\r\n const paletteMaxPos = atSignBounds.left + 250\r\n if (paletteMaxPos > this.quill.container.offsetWidth) {\r\n this.container.style.left = `${atSignBounds.left - 250}px`\r\n }\r\n else {\r\n this.container.style.left = `${atSignBounds.left}px`\r\n }\r\n\r\n this.container.style.top = `${atSignBounds.top + atSignBounds.height}px`\r\n this.open = true\r\n\r\n this.quill.on('text-change', this.onTextChange)\r\n this.quill.once('selection-change', this.onSelectionChange)\r\n if (this.onOpen) {\r\n this.onOpen()\r\n }\r\n }\r\n\r\n handleArrow() {\r\n if (!this.open) return true\r\n this.buttons[0].classList.remove('emoji-active')\r\n this.buttons[0].focus()\r\n if (this.buttons.length > 1) {\r\n this.buttons[1].focus()\r\n }\r\n }\r\n\r\n update(event) {\r\n const sel = this.quill.getSelection().index\r\n if (this.atIndex >= sel) { // Deleted the at character\r\n return this.close(null)\r\n }\r\n this.query = this.quill.getText(this.atIndex + 1, sel - this.atIndex - 1)\r\n\r\n try {\r\n if (this.isWhiteSpace(this.query)) {\r\n this.close(null)\r\n return\r\n }\r\n }\r\n catch (_e) {\r\n throw new Error('Close failed')\r\n }\r\n\r\n this.query = this.query.trim()\r\n\r\n let emojis: any = this.emojiList\r\n emojis.sort((a: any, b: any) => {\r\n return a.emoji_order - b.emoji_order\r\n })\r\n\r\n if (this.query.length < this.options.fuse.minMatchCharLength || emojis.length === 0) {\r\n this.container.style.display = 'none'\r\n return\r\n }\r\n if (emojis.length > 15) { // return only 15\r\n emojis = emojis.slice(0, 15)\r\n }\r\n this.renderCompletions(emojis, event)\r\n }\r\n\r\n maybeUnfocus() {\r\n if (this.container.querySelector('*:focus')) return\r\n this.close(null)\r\n }\r\n\r\n renderCompletions(emojis, evt) {\r\n try {\r\n if (evt) {\r\n if (evt.key === 'Enter' || evt.keyCode === 13) {\r\n this.close(emojis[0], 1)\r\n this.container.style.display = 'none'\r\n return\r\n }\r\n else if (evt.key === 'Tab' || evt.keyCode === 9) {\r\n this.quill.disable()\r\n this.buttons[0].classList.remove('emoji-active')\r\n this.buttons[1].focus()\r\n return\r\n }\r\n }\r\n if (evt) return\r\n }\r\n catch (_e) {\r\n throw new Error('Render failed')\r\n }\r\n\r\n while (this.container.firstChild) {\r\n this.container.removeChild(this.container.firstChild)\r\n }\r\n const buttons = Array.from({ length: emojis.length })\r\n this.buttons = buttons\r\n\r\n const handler = (i, emoji) => (event) => {\r\n const arrowLeftKey = event.key === 'ArrowLeft' || event.keyCode === 37\r\n const arrowUpKey = event.key === 'ArrowUp' || event.keyCode === 38\r\n const arrowRightKey = event.key === 'ArrowRight' || event.keyCode === 39\r\n const arrowDownKey = event.key === 'ArrowDown' || event.keyCode === 40\r\n if (arrowRightKey || arrowDownKey) {\r\n event.preventDefault()\r\n buttons[Math.min(buttons.length - 1, i + 1)].focus()\r\n }\r\n else if (event.key === 'Tab' || event.keyCode === 9) {\r\n event.preventDefault()\r\n if ((i + 1) === buttons.length) {\r\n buttons[0].focus()\r\n return\r\n }\r\n buttons[Math.min(buttons.length - 1, i + 1)].focus()\r\n }\r\n else if (arrowLeftKey || arrowUpKey) {\r\n event.preventDefault()\r\n buttons[Math.max(0, i - 1)].focus()\r\n }\r\n else if (event.key === 'Enter' || event.keyCode === 13\r\n || event.key === ' ' || event.keyCode === 32\r\n || event.key === 'Tab' || event.keyCode === 9) {\r\n event.preventDefault()\r\n this.quill.enable()\r\n this.close(emoji)\r\n }\r\n }\r\n\r\n emojis.forEach((emoji, i) => {\r\n const li = makeElement(\r\n 'li',\r\n {},\r\n makeElement(\r\n 'button',\r\n { type: 'button' },\r\n makeElement('span', { className: `button-emoji ap ap-${emoji.name}`, innerHTML: emoji.code_decimal }),\r\n makeElement('span', { className: 'unmatched' }, emoji.shortname),\r\n ),\r\n )\r\n this.container.appendChild(li)\r\n buttons[i] = li.firstChild\r\n // Events will be GC-ed with button on each re-render:\r\n buttons[i].addEventListener('keydown', handler(i, emoji))\r\n buttons[i].addEventListener('mousedown', () => this.close(emoji))\r\n buttons[i].addEventListener('focus', () => {\r\n this.focusedButton = i\r\n })\r\n buttons[i].addEventListener('unfocus', () => {\r\n this.focusedButton = null\r\n })\r\n })\r\n\r\n this.container.style.display = 'block'\r\n // emoji palette on top\r\n if (this.quill.container.classList.contains('top-emoji')) {\r\n const x = this.container.querySelectorAll('li')\r\n let i\r\n for (i = 0; i < x.length; i++) {\r\n x[i].style.display = 'block'\r\n }\r\n\r\n const windowHeight = window.innerHeight\r\n const editorPos = this.quill.container.getBoundingClientRect().top\r\n if (editorPos > windowHeight / 2 && this.container.offsetHeight > 0) {\r\n this.container.style.top = `-${this.container.offsetHeight}px`\r\n }\r\n }\r\n\r\n buttons[0].classList.add('emoji-active')\r\n }\r\n\r\n close(value, trailingDelete = 0) {\r\n this.quill.enable()\r\n this.container.style.display = 'none'\r\n while (this.container.firstChild) {\r\n this.container.removeChild(this.container.firstChild)\r\n }\r\n this.quill.off('selection-change', this.onSelectionChange)\r\n this.quill.off('text-change', this.onTextChange)\r\n if (value) {\r\n this.quill.deleteText(this.atIndex, this.query.length + 1 + trailingDelete, Quill.sources.USER)\r\n this.quill.insertEmbed(this.atIndex, 'emoji', value, Quill.sources.USER)\r\n setTimeout(() => this.quill.setSelection(this.atIndex + 1), 0)\r\n }\r\n this.quill.focus()\r\n this.open = false\r\n if (this.onClose) {\r\n this.onClose(value)\r\n }\r\n }\r\n}\r\n\r\nShortNameEmoji.DEFAULTS = {\r\n emojiList,\r\n fuse: {\r\n shouldSort: true,\r\n threshold: 0.1,\r\n location: 0,\r\n distance: 100,\r\n maxPatternLength: 32,\r\n minMatchCharLength: 1,\r\n keys: [\r\n 'shortname',\r\n ],\r\n },\r\n}\r\n\r\nfunction makeElement(tag, attrs, ...children) {\r\n const elem = document.createElement(tag)\r\n Object.keys(attrs).forEach((key) => {\r\n elem[key] = attrs[key]\r\n })\r\n children.forEach((child) => {\r\n if (typeof child === 'string') {\r\n child = document.createTextNode(child)\r\n }\r\n elem.appendChild(child)\r\n })\r\n return elem\r\n}\r\n\r\nexport default ShortNameEmoji\r\n"],"names":["emojiList"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolbar-emoji.cjs.js","sources":["../../../../src/emoji/modules/toolbar-emoji.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { EMOJI_SPRITE as emojiSprite } from '../../config/base64-image'\r\nimport emojiList from '../emoji-list'\r\n\r\nconst Module = Quill.imports['core/module']\r\n\r\nclass ToolbarEmoji extends Module {\r\n quill: any\r\n toolbar: any\r\n constructor(quill, options) {\r\n super(quill, options)\r\n\r\n this.quill = quill\r\n this.toolbar = quill.getModule('toolbar')\r\n if (typeof this.toolbar !== 'undefined') {\r\n this.toolbar.addHandler('emoji', this.checkPalatteExist)\r\n }\r\n\r\n // 在emoji模块加载时判断并插入emoji精灵图样式,防止重复插入\r\n let emojiStyle = document.querySelector('style#devui-emoji-sprite')\r\n if (!emojiStyle) {\r\n emojiStyle = document.createElement('style')\r\n emojiStyle.setAttribute('id', 'devui-emoji-sprite')\r\n emojiStyle.innerHTML = `.ap{background-image:url(${emojiSprite})}`\r\n document.head.appendChild(emojiStyle)\r\n }\r\n }\r\n\r\n checkPalatteExist() {\r\n const quill = this.quill\r\n fnCheckDialogOpen(quill)\r\n this.quill.on('text-change', (_delta, _oldDelta, source) => {\r\n if (source === 'user') {\r\n fnClose()\r\n fnUpdateRange(quill)\r\n }\r\n })\r\n }\r\n}\r\n\r\nfunction fnClose() {\r\n const eleEmojiPlate = document.getElementById('emoji-palette')\r\n document.getElementById('emoji-close-div').style.display = 'none'\r\n if (eleEmojiPlate) {\r\n eleEmojiPlate.remove()\r\n }\r\n}\r\n\r\nfunction fnCheckDialogOpen(quill) {\r\n const elementExists = document.getElementById('emoji-palette')\r\n if (elementExists) {\r\n elementExists.remove()\r\n }\r\n else {\r\n fnShowEmojiPalatte(quill)\r\n }\r\n}\r\n\r\nfunction fnUpdateRange(quill) {\r\n const range = quill.getSelection()\r\n return range\r\n}\r\n\r\nfunction fnShowEmojiPalatte(quill) {\r\n const eleEmojiArea = document.createElement('div')\r\n const range = quill.getSelection()\r\n const atSignBounds = quill.getBounds(range.index)\r\n\r\n quill.container.appendChild(eleEmojiArea)\r\n const containerRect = quill.container.getBoundingClientRect()\r\n const paletteMaxPos = atSignBounds.left + 250 // palette max width is 250\r\n eleEmojiArea.id = 'emoji-palette'\r\n eleEmojiArea.style.top = `${10 + atSignBounds.top + atSignBounds.height + containerRect.top}px`\r\n if (paletteMaxPos > quill.container.offsetWidth) {\r\n eleEmojiArea.style.left = `${atSignBounds.left + containerRect.left - 250}px`\r\n }\r\n else {\r\n eleEmojiArea.style.left = `${atSignBounds.left + containerRect.left}px`\r\n }\r\n\r\n const tabToolbar = document.createElement('div')\r\n tabToolbar.id = 'tab-toolbar'\r\n eleEmojiArea.appendChild(tabToolbar)\r\n\r\n // panel\r\n const panel = document.createElement('div')\r\n panel.id = 'tab-panel'\r\n eleEmojiArea.appendChild(panel)\r\n\r\n const emojiType = [\r\n { type: 'p', name: 'people', content: '<div class=\"i-people\"></div>' },\r\n { type: 'n', name: 'nature', content: '<div class=\"i-nature\"></div>' },\r\n { type: 'd', name: 'food', content: '<div class=\"i-food\"></div>' },\r\n { type: 's', name: 'symbols', content: '<div class=\"i-symbols\"></div>' },\r\n { type: 'a', name: 'activity', content: '<div class=\"i-activity\"></div>' },\r\n { type: 't', name: 'travel', content: '<div class=\"i-travel\"></div>' },\r\n { type: 'o', name: 'objects', content: '<div class=\"i-objects\"></div>' },\r\n { type: 'f', name: 'flags', content: '<div class=\"i-flags\"></div>' },\r\n ]\r\n\r\n const tabElementHolder = document.createElement('ul')\r\n tabToolbar.appendChild(tabElementHolder)\r\n\r\n if (document.getElementById('emoji-close-div') === null) {\r\n const closeDiv = document.createElement('div')\r\n closeDiv.id = 'emoji-close-div'\r\n closeDiv.addEventListener('click', fnClose, false)\r\n document.getElementsByTagName('body')[0].appendChild(closeDiv)\r\n }\r\n else {\r\n document.getElementById('emoji-close-div').style.display = 'block'\r\n }\r\n\r\n emojiType.forEach((emojiTypeItem) => {\r\n // add tab bar\r\n const tabElement = document.createElement('li')\r\n tabElement.classList.add('emoji-tab')\r\n tabElement.classList.add(`filter-${emojiTypeItem.name}`)\r\n const tabValue = emojiTypeItem.content\r\n tabElement.innerHTML = tabValue\r\n tabElement.dataset.filter = emojiTypeItem.type\r\n tabElementHolder.appendChild(tabElement)\r\n\r\n const emojiFilter = document.querySelector(`.filter-${emojiTypeItem.name}`)\r\n emojiFilter.addEventListener('click', () => {\r\n const tab = document.querySelector('.emoji-tab.active')\r\n if (tab) {\r\n tab.classList.remove('active')\r\n }\r\n emojiFilter.classList.toggle('active')\r\n fnUpdateEmojiContainer(emojiFilter, panel, quill)\r\n })\r\n })\r\n fnEmojiPanelInit(panel, quill)\r\n}\r\n\r\nfunction fnEmojiPanelInit(panel, quill) {\r\n fnEmojiElementsToPanel('p', panel, quill)\r\n document.querySelector('.filter-people').classList.add('active')\r\n}\r\n\r\nfunction fnEmojiElementsToPanel(_type, panel, quill) {\r\n const result = emojiList\r\n result.sort((a: any, b: any) => {\r\n return a.emoji_order - b.emoji_order\r\n })\r\n\r\n quill.focus()\r\n const range = fnUpdateRange(quill)\r\n\r\n result.forEach((emoji: any) => {\r\n const span = document.createElement('span')\r\n const t = document.createTextNode(emoji.shortname)\r\n span.appendChild(t)\r\n span.classList.add('bem')\r\n span.classList.add(`bem-${emoji.name}`)\r\n span.classList.add('ap')\r\n span.classList.add(`ap-${emoji.name}`)\r\n const output = String(String(emoji.code_decimal))\r\n span.innerHTML = `${output} `\r\n panel.appendChild(span)\r\n\r\n const customButton = document.querySelector(`.bem-${emoji.name}`)\r\n if (customButton) {\r\n customButton.addEventListener('click', () => {\r\n quill.insertEmbed(range.index, 'emoji', emoji, Quill.sources.USER)\r\n setTimeout(() => quill.setSelection(range.index + 1), 0)\r\n fnClose()\r\n })\r\n }\r\n })\r\n}\r\n\r\nfunction fnUpdateEmojiContainer(emojiFilter, panel, quill) {\r\n while (panel.firstChild) {\r\n panel.removeChild(panel.firstChild)\r\n }\r\n const type = emojiFilter.dataset.filter\r\n fnEmojiElementsToPanel(type, panel, quill)\r\n}\r\n\r\nexport default ToolbarEmoji\r\n"],"names":["emojiSprite","emojiList"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"toolbar-emoji.cjs.js","sources":["../../../../src/emoji/modules/toolbar-emoji.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { EMOJI_SPRITE as emojiSprite } from '../../config/base64-image'\r\nimport emojiList from '../emoji-list'\r\n\r\nconst Module = Quill.imports['core/module']\r\n\r\nclass ToolbarEmoji extends Module {\r\n quill: any\r\n toolbar: any\r\n constructor(quill, options) {\r\n super(quill, options)\r\n\r\n this.quill = quill\r\n this.toolbar = quill.getModule('toolbar')\r\n if (typeof this.toolbar !== 'undefined') {\r\n this.toolbar.addHandler('emoji', this.checkPalatteExist)\r\n }\r\n\r\n // 在emoji模块加载时判断并插入emoji精灵图样式,防止重复插入\r\n let emojiStyle = document.querySelector('style#devui-emoji-sprite')\r\n if (!emojiStyle) {\r\n emojiStyle = document.createElement('style')\r\n emojiStyle.setAttribute('id', 'devui-emoji-sprite')\r\n emojiStyle.innerHTML = `.ap{background-image:url(${emojiSprite})}`\r\n document.head.appendChild(emojiStyle)\r\n }\r\n }\r\n\r\n checkPalatteExist() {\r\n const quill = this.quill\r\n fnCheckDialogOpen(quill)\r\n this.quill.on('text-change', (_delta, _oldDelta, source) => {\r\n if (source === 'user') {\r\n fnClose()\r\n fnUpdateRange(quill)\r\n }\r\n })\r\n }\r\n}\r\n\r\nfunction fnClose() {\r\n const eleEmojiPlate = document.getElementById('emoji-palette')\r\n document.getElementById('emoji-close-div').style.display = 'none'\r\n if (eleEmojiPlate) {\r\n eleEmojiPlate.remove()\r\n }\r\n}\r\n\r\nfunction fnCheckDialogOpen(quill) {\r\n const elementExists = document.getElementById('emoji-palette')\r\n if (elementExists) {\r\n elementExists.remove()\r\n }\r\n else {\r\n fnShowEmojiPalatte(quill)\r\n }\r\n}\r\n\r\nfunction fnUpdateRange(quill) {\r\n const range = quill.getSelection()\r\n return range\r\n}\r\n\r\nfunction fnShowEmojiPalatte(quill) {\r\n const eleEmojiArea = document.createElement('div')\r\n const range = quill.getSelection()\r\n const atSignBounds = quill.getBounds(range.index)\r\n\r\n quill.container.appendChild(eleEmojiArea)\r\n const containerRect = quill.container.getBoundingClientRect()\r\n const paletteMaxPos = atSignBounds.left + 250 // palette max width is 250\r\n eleEmojiArea.id = 'emoji-palette'\r\n eleEmojiArea.style.top = `${10 + atSignBounds.top + atSignBounds.height + containerRect.top}px`\r\n if (paletteMaxPos > quill.container.offsetWidth) {\r\n eleEmojiArea.style.left = `${atSignBounds.left + containerRect.left - 250}px`\r\n }\r\n else {\r\n eleEmojiArea.style.left = `${atSignBounds.left + containerRect.left}px`\r\n }\r\n\r\n const tabToolbar = document.createElement('div')\r\n tabToolbar.id = 'tab-toolbar'\r\n eleEmojiArea.appendChild(tabToolbar)\r\n\r\n // panel\r\n const panel = document.createElement('div')\r\n panel.id = 'tab-panel'\r\n eleEmojiArea.appendChild(panel)\r\n\r\n const emojiType = [\r\n { type: 'p', name: 'people', content: '<div class=\"i-people\"></div>' },\r\n { type: 'n', name: 'nature', content: '<div class=\"i-nature\"></div>' },\r\n { type: 'd', name: 'food', content: '<div class=\"i-food\"></div>' },\r\n { type: 's', name: 'symbols', content: '<div class=\"i-symbols\"></div>' },\r\n { type: 'a', name: 'activity', content: '<div class=\"i-activity\"></div>' },\r\n { type: 't', name: 'travel', content: '<div class=\"i-travel\"></div>' },\r\n { type: 'o', name: 'objects', content: '<div class=\"i-objects\"></div>' },\r\n { type: 'f', name: 'flags', content: '<div class=\"i-flags\"></div>' },\r\n ]\r\n\r\n const tabElementHolder = document.createElement('ul')\r\n tabToolbar.appendChild(tabElementHolder)\r\n\r\n if (document.getElementById('emoji-close-div') === null) {\r\n const closeDiv = document.createElement('div')\r\n closeDiv.id = 'emoji-close-div'\r\n closeDiv.addEventListener('click', fnClose, false)\r\n document.getElementsByTagName('body')[0].appendChild(closeDiv)\r\n }\r\n else {\r\n document.getElementById('emoji-close-div').style.display = 'block'\r\n }\r\n\r\n emojiType.forEach((emojiTypeItem) => {\r\n // add tab bar\r\n const tabElement = document.createElement('li')\r\n tabElement.classList.add('emoji-tab')\r\n tabElement.classList.add(`filter-${emojiTypeItem.name}`)\r\n const tabValue = emojiTypeItem.content\r\n tabElement.innerHTML = tabValue\r\n tabElement.dataset.filter = emojiTypeItem.type\r\n tabElementHolder.appendChild(tabElement)\r\n\r\n const emojiFilter = document.querySelector(`.filter-${emojiTypeItem.name}`)\r\n emojiFilter.addEventListener('click', () => {\r\n const tab = document.querySelector('.emoji-tab.active')\r\n if (tab) {\r\n tab.classList.remove('active')\r\n }\r\n emojiFilter.classList.toggle('active')\r\n fnUpdateEmojiContainer(emojiFilter, panel, quill)\r\n })\r\n })\r\n fnEmojiPanelInit(panel, quill)\r\n}\r\n\r\nfunction fnEmojiPanelInit(panel, quill) {\r\n fnEmojiElementsToPanel('p', panel, quill)\r\n document.querySelector('.filter-people').classList.add('active')\r\n}\r\n\r\nfunction fnEmojiElementsToPanel(_type, panel, quill) {\r\n const result = emojiList\r\n result.sort((a: any, b: any) => {\r\n return a.emoji_order - b.emoji_order\r\n })\r\n\r\n quill.focus()\r\n const range = fnUpdateRange(quill)\r\n\r\n result.forEach((emoji: any) => {\r\n const span = document.createElement('span')\r\n const t = document.createTextNode(emoji.shortname)\r\n span.appendChild(t)\r\n span.classList.add('bem')\r\n span.classList.add(`bem-${emoji.name}`)\r\n span.classList.add('ap')\r\n span.classList.add(`ap-${emoji.name}`)\r\n const output = String(String(emoji.code_decimal))\r\n span.innerHTML = `${output} `\r\n panel.appendChild(span)\r\n\r\n const customButton = document.querySelector(`.bem-${emoji.name}`)\r\n if (customButton) {\r\n customButton.addEventListener('click', () => {\r\n quill.insertEmbed(range.index, 'emoji', emoji, Quill.sources.USER)\r\n setTimeout(() => quill.setSelection(range.index + 1), 0)\r\n fnClose()\r\n })\r\n }\r\n })\r\n}\r\n\r\nfunction fnUpdateEmojiContainer(emojiFilter, panel, quill) {\r\n while (panel.firstChild) {\r\n panel.removeChild(panel.firstChild)\r\n }\r\n const type = emojiFilter.dataset.filter\r\n fnEmojiElementsToPanel(type, panel, quill)\r\n}\r\n\r\nexport default ToolbarEmoji\r\n"],"names":["emojiSprite","emojiList"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.cjs.js","sources":["../../../src/emoji/utils.ts"],"sourcesContent":["export function createEmoji(emojiArr) {\r\n const emojiList = []\r\n emojiArr.forEach((emojiItem) => {\r\n const [name, unicode, shortname, codeDecimal, category, emojiOrder] = emojiItem\r\n emojiList.push({\r\n name,\r\n unicode,\r\n shortname,\r\n codeDecimal,\r\n category,\r\n emojiOrder,\r\n })\r\n })\r\n return emojiList\r\n}\r\n"],"names":[],"mappings":";;AAAO,SAAS,YAAY,UAAU;AACpC,QAAM,YAAY,
|
|
1
|
+
{"version":3,"file":"utils.cjs.js","sources":["../../../src/emoji/utils.ts"],"sourcesContent":["export function createEmoji(emojiArr) {\r\n const emojiList = []\r\n emojiArr.forEach((emojiItem) => {\r\n const [name, unicode, shortname, codeDecimal, category, emojiOrder] = emojiItem\r\n emojiList.push({\r\n name,\r\n unicode,\r\n shortname,\r\n codeDecimal,\r\n category,\r\n emojiOrder,\r\n })\r\n })\r\n return emojiList\r\n}\r\n"],"names":[],"mappings":";;AAAO,SAAS,YAAY,UAAU;AACpC,QAAM,YAAY,CAAC;AACV,WAAA,QAAQ,CAAC,cAAc;AAC9B,UAAM,CAAC,MAAM,SAAS,WAAW,aAAa,UAAU,UAAU,IAAI;AACtE,cAAU,KAAK;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EAAA,CACF;AACM,SAAA;AACT;;"}
|
|
@@ -51,6 +51,6 @@ class File extends Embed {
|
|
|
51
51
|
File.blotName = "file";
|
|
52
52
|
File.tagName = "A";
|
|
53
53
|
File.className = "ql-file-item";
|
|
54
|
-
File.PROTOCOL_WHITELIST = ["http", "https"];
|
|
54
|
+
File.PROTOCOL_WHITELIST = ["http", "https", "blob"];
|
|
55
55
|
exports.default = File;
|
|
56
56
|
//# sourceMappingURL=file.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.cjs.js","sources":["../../../../src/file/formats/file.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { sanitize } from '../../config/editor.utils'\r\n\r\nconst Embed = Quill.imports['blots/embed']\r\nconst FILE_ATTRIBUTES = ['id', 'title', 'size', 'lastModified']\r\n\r\nclass File extends Embed {\r\n static blotName: string\r\n static tagName: string\r\n static className: string\r\n static PROTOCOL_WHITELIST: string[]\r\n statics: any\r\n domNode: any\r\n\r\n static create(value) {\r\n const node = super.create(value)\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 = File.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) {\r\n return File.getFormats(domNode)\r\n }\r\n\r\n static formats(domNode) {\r\n return File.getFormats(domNode)\r\n }\r\n\r\n static getFormats(domNode) {\r\n const formats: any = {}\r\n const href = File.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) {\r\n return (sanitize(url, this.PROTOCOL_WHITELIST) && url) || ''\r\n }\r\n}\r\nFile.blotName = 'file'\r\nFile.tagName = 'A'\r\nFile.className = 'ql-file-item'\r\nFile.PROTOCOL_WHITELIST = ['http', 'https']\r\n\r\nexport default File\r\n"],"names":["sanitize"],"mappings":";;;;AAGA,MAAM,QAAQ,MAAM,QAAQ,aAAa;AACzC,MAAM,kBAAkB,CAAC,MAAM,SAAS,QAAQ,cAAc;AAE9D,MAAM,aAAa,MAAM;AAAA,EAQvB,OAAO,OAAO,OAAO;AACb,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,KAAK;AAC1C,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,
|
|
1
|
+
{"version":3,"file":"file.cjs.js","sources":["../../../../src/file/formats/file.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { sanitize } from '../../config/editor.utils'\r\n\r\nconst Embed = Quill.imports['blots/embed']\r\nconst FILE_ATTRIBUTES = ['id', 'title', 'size', 'lastModified']\r\n\r\nclass File extends Embed {\r\n static blotName: string\r\n static tagName: string\r\n static className: string\r\n static PROTOCOL_WHITELIST: string[]\r\n statics: any\r\n domNode: any\r\n\r\n static create(value) {\r\n const node = super.create(value)\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 = File.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) {\r\n return File.getFormats(domNode)\r\n }\r\n\r\n static formats(domNode) {\r\n return File.getFormats(domNode)\r\n }\r\n\r\n static getFormats(domNode) {\r\n const formats: any = {}\r\n const href = File.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) {\r\n return (sanitize(url, this.PROTOCOL_WHITELIST) && url) || ''\r\n }\r\n}\r\nFile.blotName = 'file'\r\nFile.tagName = 'A'\r\nFile.className = 'ql-file-item'\r\nFile.PROTOCOL_WHITELIST = ['http', 'https', 'blob']\r\n\r\nexport default File\r\n"],"names":["sanitize"],"mappings":";;;;AAGA,MAAM,QAAQ,MAAM,QAAQ,aAAa;AACzC,MAAM,kBAAkB,CAAC,MAAM,SAAS,QAAQ,cAAc;AAE9D,MAAM,aAAa,MAAM;AAAA,EAQvB,OAAO,OAAO,OAAO;AACb,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,KAAK;AAC1C,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,SAAS;AACb,WAAA,KAAK,WAAW,OAAO;AAAA,EAAA;AAAA,EAGhC,OAAO,QAAQ,SAAS;AACf,WAAA,KAAK,WAAW,OAAO;AAAA,EAAA;AAAA,EAGhC,OAAO,WAAW,SAAS;AACzB,UAAM,UAAe,CAAC;AACtB,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,KAAK;AACnB,WAAQA,aAAAA,SAAS,KAAK,KAAK,kBAAkB,KAAK,OAAQ;AAAA,EAAA;AAE9D;AACA,KAAK,WAAW;AAChB,KAAK,UAAU;AACf,KAAK,YAAY;AACjB,KAAK,qBAAqB,CAAC,QAAQ,SAAS,MAAM;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../../src/file/index.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport File from './formats/file'\r\nimport FileBar from './modules/file-bar'\r\n\r\nconst Module = Quill.imports['core/module']\r\n\r\nclass FileModule extends Module {\r\n quill: any\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(quill, options) {\r\n super(quill, options)\r\n this.quill = quill\r\n quill.root.addEventListener('click', event => this.clickEvent(event), false)\r\n }\r\n\r\n clickEvent(event) {\r\n event.preventDefault()\r\n const target = event.target\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":";;;;;AAIA,MAAM,SAAS,MAAM,QAAQ,aAAa;AAE1C,MAAM,mBAAmB,OAAO;AAAA,EAI9B,OAAO,WAAW;AACV,UAAA,SAAS,gBAAgBA,
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/file/index.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport File from './formats/file'\r\nimport FileBar from './modules/file-bar'\r\n\r\nconst Module = Quill.imports['core/module']\r\n\r\nclass FileModule extends Module {\r\n quill: any\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(quill, options) {\r\n super(quill, options)\r\n this.quill = quill\r\n quill.root.addEventListener('click', event => this.clickEvent(event), false)\r\n }\r\n\r\n clickEvent(event) {\r\n event.preventDefault()\r\n const target = event.target\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":";;;;;AAIA,MAAM,SAAS,MAAM,QAAQ,aAAa;AAE1C,MAAM,mBAAmB,OAAO;AAAA,EAI9B,OAAO,WAAW;AACV,UAAA,SAAS,gBAAgBA,KAAAA,SAAM,IAAI;AAAA,EAAA;AAAA,EAG3C,YAAY,OAAO,SAAS;AAC1B,UAAM,OAAO,OAAO;AACpB,SAAK,QAAQ;AACP,UAAA,KAAK,iBAAiB,SAAS,CAAA,UAAS,KAAK,WAAW,KAAK,GAAG,KAAK;AAAA,EAAA;AAAA,EAG7E,WAAW,OAAO;AAChB,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;;"}
|
|
@@ -63,7 +63,8 @@ class FileBar {
|
|
|
63
63
|
operateFile(event, operate) {
|
|
64
64
|
event.preventDefault();
|
|
65
65
|
const fileId = this.file.dataset.id || "";
|
|
66
|
-
const
|
|
66
|
+
const fileName = this.file.dataset.title || "";
|
|
67
|
+
const fileDownloadUrl = this.file.href || "";
|
|
67
68
|
if (fileId) {
|
|
68
69
|
this.quill.emitter.emit("file-change", {
|
|
69
70
|
operation: operate,
|
|
@@ -75,6 +76,7 @@ class FileBar {
|
|
|
75
76
|
a.href = fileDownloadUrl;
|
|
76
77
|
a.target = "_blank";
|
|
77
78
|
a.id = "exppub";
|
|
79
|
+
a.download = fileName;
|
|
78
80
|
document.body.appendChild(a);
|
|
79
81
|
const alink = document.getElementById("exppub");
|
|
80
82
|
alink.click();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-bar.cjs.js","sources":["../../../../src/file/modules/file-bar.ts"],"sourcesContent":["import Quill from 'quill'\r\n// devui-internal api: utils\\public-api.ts\r\n\r\nimport { Range } from 'quill/core/selection'\r\nimport { unshiftString } from '../../utils/method'\r\nimport File from '../formats/file'\r\n\r\nconst Delta = Quill.imports.delta\r\n\r\nexport default class FileBar {\r\n quill: any\r\n file: any\r\n domNode: HTMLElement\r\n fileRange: any\r\n template: string\r\n\r\n constructor(quill, target) {\r\n this.quill = quill\r\n this.file = target\r\n const fileBlot = Quill.find(target)\r\n const index = this.quill.getIndex(fileBlot)\r\n const [fileItem, offset] = this.quill.scroll.descendant(File, index)\r\n const length = fileItem && fileItem.length()\r\n this.fileRange = new Range(index - offset, length)\r\n\r\n const timestamp = Number(this.file.dataset.lastModified)\r\n const _lastModifiedDate = this.formatDate(timestamp)\r\n this.template = [\r\n // `<a class=\"ql-last-modified-date\" href=\"${this.file.href}\" target=\"_blank\">${this.file.href}</a>`,\r\n // '<span class=\"ql-split\"></span>',\r\n // `<a class=\"ql-file-preview\"><i class=\"icon-preview\"></i></a>`,\r\n `<a class=\"ql-file-download\"><i class=\"icon-download\"></i></a>`,\r\n '<a class=\"ql-file-delete\"><i class=\"icon-delete\"></i></a>',\r\n ].join('')\r\n\r\n this.createFileBar()\r\n }\r\n\r\n createFileBar() {\r\n this.domNode = document.createElement('div')\r\n this.domNode.className = 'ql-file-bar'\r\n this.domNode.innerHTML = this.template\r\n // 查看文件\r\n const filePreview = this.domNode.querySelector('a.ql-file-preview')\r\n if (filePreview) {\r\n filePreview.addEventListener('click', (event) => {\r\n this.operateFile(event, 'view')\r\n })\r\n }\r\n // 下载文件\r\n const fileDownload = this.domNode.querySelector('a.ql-file-download')\r\n if (fileDownload) {\r\n fileDownload.addEventListener('click', (event) => {\r\n this.operateFile(event, 'download')\r\n })\r\n }\r\n // 删除文件\r\n const fileDelete = this.domNode.querySelector('a.ql-file-delete')\r\n if (fileDelete) {\r\n fileDelete.addEventListener('click', (event) => {\r\n this.operateFile(event, 'delete')\r\n const delta = new Delta()\r\n .retain(this.fileRange.index)\r\n .delete(this.fileRange.length)\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(this.fileRange.index)\r\n })\r\n }\r\n\r\n this.setPosition()\r\n this.quill.root.parentNode.appendChild(this.domNode)\r\n }\r\n\r\n destroy() {\r\n if (this.domNode) {\r\n this.domNode.remove()\r\n this.domNode = null\r\n this.file = null\r\n }\r\n }\r\n\r\n operateFile(event, operate) {\r\n event.preventDefault()\r\n const fileId = this.file.dataset.id || ''\r\n const fileDownloadUrl = this.file.href\r\n if (fileId) {\r\n this.quill.emitter.emit('file-change', {\r\n operation: operate,\r\n data: { fileId, fileDownloadUrl },\r\n })\r\n }\r\n if (operate === 'download') {\r\n const a = document.createElement('a')\r\n a.href = fileDownloadUrl\r\n a.target = '_blank'\r\n a.id = 'exppub'\r\n document.body.appendChild(a)\r\n const alink = document.getElementById('exppub')\r\n alink.click()\r\n alink.parentNode.removeChild(a)\r\n }\r\n this.destroy()\r\n }\r\n\r\n setPosition() {\r\n if (this.domNode && this.file) {\r\n const parent = this.quill.root.parentNode\r\n const child = this.file.querySelector('span')\r\n const containerRect = parent.getBoundingClientRect()\r\n const fileRect = child.getBoundingClientRect()\r\n this.css(this.domNode, {\r\n left: `${fileRect.left - containerRect.left}px`,\r\n top: `${fileRect.top - containerRect.top + 10}px`,\r\n })\r\n }\r\n }\r\n\r\n css(domNode, rules) {\r\n if (typeof rules === 'object') {\r\n for (const prop in rules) {\r\n if (prop) {\r\n if (Array.isArray(rules[prop])) {\r\n // 兼容IE11浏览器\r\n rules[prop].forEach((val) => {\r\n domNode.style[prop] = val\r\n })\r\n }\r\n else {\r\n domNode.style[prop] = rules[prop]\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n formatDate(timestamp) {\r\n const date = new Date(timestamp)\r\n const year = date.getFullYear()\r\n // TODO\r\n const month = unshiftString(`${date.getMonth() + 1}`, 2, '0')\r\n const day = unshiftString(`${date.getDate()}`, 2, '0')\r\n const hour = unshiftString(`${date.getHours()}`, 2, '0')\r\n const minute = unshiftString(`${date.getMinutes()}`, 2, '0')\r\n return Number.isNaN(year) ? '--' : `${year}/${month}/${day} ${hour}:${minute}`\r\n }\r\n}\r\n"],"names":["File","Range","unshiftString"],"mappings":";;;;;;AAOA,MAAM,QAAQ,MAAM,QAAQ;AAE5B,MAAqB,QAAQ;AAAA,EAO3B,YAAY,OAAO,QAAQ;AACzB,SAAK,QAAQ;AACb,SAAK,OAAO;AACN,UAAA,WAAW,MAAM,KAAK,MAAM;AAClC,UAAM,QAAQ,KAAK,MAAM,SAAS,QAAQ;AACpC,UAAA,CAAC,UAAU,MAAM,IAAI,KAAK,MAAM,OAAO,WAAWA,
|
|
1
|
+
{"version":3,"file":"file-bar.cjs.js","sources":["../../../../src/file/modules/file-bar.ts"],"sourcesContent":["import Quill from 'quill'\r\n// devui-internal api: utils\\public-api.ts\r\n\r\nimport { Range } from 'quill/core/selection'\r\nimport { unshiftString } from '../../utils/method'\r\nimport File from '../formats/file'\r\n\r\nconst Delta = Quill.imports.delta\r\n\r\nexport default class FileBar {\r\n quill: any\r\n file: any\r\n domNode: HTMLElement\r\n fileRange: any\r\n template: string\r\n\r\n constructor(quill, target) {\r\n this.quill = quill\r\n this.file = target\r\n const fileBlot = Quill.find(target)\r\n const index = this.quill.getIndex(fileBlot)\r\n const [fileItem, offset] = this.quill.scroll.descendant(File, index)\r\n const length = fileItem && fileItem.length()\r\n this.fileRange = new Range(index - offset, length)\r\n\r\n const timestamp = Number(this.file.dataset.lastModified)\r\n const _lastModifiedDate = this.formatDate(timestamp)\r\n this.template = [\r\n // `<a class=\"ql-last-modified-date\" href=\"${this.file.href}\" target=\"_blank\">${this.file.href}</a>`,\r\n // '<span class=\"ql-split\"></span>',\r\n // `<a class=\"ql-file-preview\"><i class=\"icon-preview\"></i></a>`,\r\n `<a class=\"ql-file-download\"><i class=\"icon-download\"></i></a>`,\r\n '<a class=\"ql-file-delete\"><i class=\"icon-delete\"></i></a>',\r\n ].join('')\r\n\r\n this.createFileBar()\r\n }\r\n\r\n createFileBar() {\r\n this.domNode = document.createElement('div')\r\n this.domNode.className = 'ql-file-bar'\r\n this.domNode.innerHTML = this.template\r\n // 查看文件\r\n const filePreview = this.domNode.querySelector('a.ql-file-preview')\r\n if (filePreview) {\r\n filePreview.addEventListener('click', (event) => {\r\n this.operateFile(event, 'view')\r\n })\r\n }\r\n // 下载文件\r\n const fileDownload = this.domNode.querySelector('a.ql-file-download')\r\n if (fileDownload) {\r\n fileDownload.addEventListener('click', (event) => {\r\n this.operateFile(event, 'download')\r\n })\r\n }\r\n // 删除文件\r\n const fileDelete = this.domNode.querySelector('a.ql-file-delete')\r\n if (fileDelete) {\r\n fileDelete.addEventListener('click', (event) => {\r\n this.operateFile(event, 'delete')\r\n const delta = new Delta()\r\n .retain(this.fileRange.index)\r\n .delete(this.fileRange.length)\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(this.fileRange.index)\r\n })\r\n }\r\n\r\n this.setPosition()\r\n this.quill.root.parentNode.appendChild(this.domNode)\r\n }\r\n\r\n destroy() {\r\n if (this.domNode) {\r\n this.domNode.remove()\r\n this.domNode = null\r\n this.file = null\r\n }\r\n }\r\n\r\n operateFile(event, operate) {\r\n event.preventDefault()\r\n const fileId = this.file.dataset.id || ''\r\n const fileName = this.file.dataset.title || ''\r\n const fileDownloadUrl = this.file.href || ''\r\n if (fileId) {\r\n this.quill.emitter.emit('file-change', {\r\n operation: operate,\r\n data: { fileId, fileDownloadUrl },\r\n })\r\n }\r\n if (operate === 'download') {\r\n const a = document.createElement('a')\r\n a.href = fileDownloadUrl\r\n a.target = '_blank'\r\n a.id = 'exppub'\r\n a.download = fileName\r\n document.body.appendChild(a)\r\n const alink = document.getElementById('exppub')\r\n alink.click()\r\n alink.parentNode.removeChild(a)\r\n }\r\n this.destroy()\r\n }\r\n\r\n setPosition() {\r\n if (this.domNode && this.file) {\r\n const parent = this.quill.root.parentNode\r\n const child = this.file.querySelector('span')\r\n const containerRect = parent.getBoundingClientRect()\r\n const fileRect = child.getBoundingClientRect()\r\n this.css(this.domNode, {\r\n left: `${fileRect.left - containerRect.left}px`,\r\n top: `${fileRect.top - containerRect.top + 10}px`,\r\n })\r\n }\r\n }\r\n\r\n css(domNode, rules) {\r\n if (typeof rules === 'object') {\r\n for (const prop in rules) {\r\n if (prop) {\r\n if (Array.isArray(rules[prop])) {\r\n // 兼容IE11浏览器\r\n rules[prop].forEach((val) => {\r\n domNode.style[prop] = val\r\n })\r\n }\r\n else {\r\n domNode.style[prop] = rules[prop]\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n formatDate(timestamp) {\r\n const date = new Date(timestamp)\r\n const year = date.getFullYear()\r\n // TODO\r\n const month = unshiftString(`${date.getMonth() + 1}`, 2, '0')\r\n const day = unshiftString(`${date.getDate()}`, 2, '0')\r\n const hour = unshiftString(`${date.getHours()}`, 2, '0')\r\n const minute = unshiftString(`${date.getMinutes()}`, 2, '0')\r\n return Number.isNaN(year) ? '--' : `${year}/${month}/${day} ${hour}:${minute}`\r\n }\r\n}\r\n"],"names":["File","Range","unshiftString"],"mappings":"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"}
|
package/lib/fluent-editor.cjs.js
CHANGED
|
@@ -3,58 +3,46 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
|
|
|
3
3
|
const Quill = require("quill");
|
|
4
4
|
require("./attributors/index.cjs.js");
|
|
5
5
|
const index = require("./config/index.cjs.js");
|
|
6
|
-
const index$
|
|
6
|
+
const index$6 = require("./counter/index.cjs.js");
|
|
7
7
|
const customClipboard = require("./custom-clipboard.cjs.js");
|
|
8
8
|
const BlotFormatter = require("./custom-image/BlotFormatter.cjs.js");
|
|
9
9
|
const CustomImageSpec = require("./custom-image/specs/CustomImageSpec.cjs.js");
|
|
10
10
|
const customUploader = require("./custom-uploader.cjs.js");
|
|
11
|
-
const index$
|
|
12
|
-
const index$
|
|
11
|
+
const index$b = require("./divider/index.cjs.js");
|
|
12
|
+
const index$7 = require("./emoji/index.cjs.js");
|
|
13
|
+
const index$5 = require("./file/index.cjs.js");
|
|
13
14
|
const index$1 = require("./format-painter/index.cjs.js");
|
|
14
15
|
const handler = require("./fullscreen/handler.cjs.js");
|
|
15
|
-
const index$
|
|
16
|
-
const index$
|
|
16
|
+
const index$3 = require("./i18n/index.cjs.js");
|
|
17
|
+
const index$8 = require("./link/index.cjs.js");
|
|
18
|
+
const index$a = require("./mathlive/index.cjs.js");
|
|
17
19
|
const formats = require("./mathlive/formats.cjs.js");
|
|
18
20
|
const Mention = require("./mention/Mention.cjs.js");
|
|
19
21
|
const index$2 = require("./screenshot/index.cjs.js");
|
|
20
|
-
const index$
|
|
21
|
-
const index$
|
|
22
|
-
const index$
|
|
22
|
+
const index$d = require("./soft-break/index.cjs.js");
|
|
23
|
+
const index$c = require("./strike/index.cjs.js");
|
|
24
|
+
const index$9 = require("./syntax/index.cjs.js");
|
|
23
25
|
const betterTable = require("./table/better-table.cjs.js");
|
|
24
|
-
const index$
|
|
25
|
-
const
|
|
26
|
-
const index$c = require("./video/index.cjs.js");
|
|
26
|
+
const index$4 = require("./toolbar/index.cjs.js");
|
|
27
|
+
const index$e = require("./video/index.cjs.js");
|
|
27
28
|
const editor_config = require("./config/editor.config.cjs.js");
|
|
28
|
-
const toolbarTip = require("./toolbar/toolbar-tip.cjs.js");
|
|
29
29
|
const fontStyle = require("./attributors/font-style.cjs.js");
|
|
30
30
|
const fontSize = require("./attributors/font-size.cjs.js");
|
|
31
31
|
const lineHeight = require("./attributors/line-height.cjs.js");
|
|
32
32
|
const textIndent = require("./attributors/text-indent.cjs.js");
|
|
33
|
-
function resolveLanguageOption(options) {
|
|
34
|
-
if (is.isUndefined(options.lang)) {
|
|
35
|
-
options.lang = editor_config.defaultLanguage;
|
|
36
|
-
}
|
|
37
|
-
if (!(options.lang in editor_config.LANG_CONF)) {
|
|
38
|
-
console.warn(`The language ${options.lang} is not supported. Use the default language: ${editor_config.defaultLanguage}`);
|
|
39
|
-
options.lang = editor_config.defaultLanguage;
|
|
40
|
-
}
|
|
41
|
-
return {
|
|
42
|
-
lang: options.lang,
|
|
43
|
-
langText: Object.assign({}, editor_config.LANG_CONF[options.lang], options.langText || {})
|
|
44
|
-
};
|
|
45
|
-
}
|
|
46
33
|
class FluentEditor extends Quill {
|
|
47
34
|
constructor(container, options = {}) {
|
|
48
|
-
options = Object.assign(options, resolveLanguageOption(options || {}));
|
|
49
35
|
super(container, options);
|
|
50
36
|
this.isFullscreen = false;
|
|
51
37
|
}
|
|
52
|
-
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
38
|
+
get lang() {
|
|
39
|
+
const i18nModule = this.getModule("i18n");
|
|
40
|
+
return i18nModule ? i18nModule.options.lang : editor_config.defaultLanguage;
|
|
41
|
+
}
|
|
42
|
+
getLangText(name) {
|
|
43
|
+
const i18nModule = this.getModule("i18n");
|
|
44
|
+
if (!i18nModule) return editor_config.LANG_CONF[editor_config.defaultLanguage][name];
|
|
45
|
+
return i18nModule.options.langText[name];
|
|
58
46
|
}
|
|
59
47
|
}
|
|
60
48
|
const registerModules = function() {
|
|
@@ -65,6 +53,7 @@ const registerModules = function() {
|
|
|
65
53
|
const SnowTheme = Quill.imports["themes/snow"];
|
|
66
54
|
SnowTheme.DEFAULTS = {
|
|
67
55
|
modules: {
|
|
56
|
+
"i18n": true,
|
|
68
57
|
"keyboard": {
|
|
69
58
|
bindings: {
|
|
70
59
|
...betterTable.default.keyboardBindings
|
|
@@ -138,6 +127,12 @@ const registerModules = function() {
|
|
|
138
127
|
[index$2.Screenshot.toolName]: index$2.Screenshot,
|
|
139
128
|
"lineheight": function(value) {
|
|
140
129
|
this.quill.format("line-height", value);
|
|
130
|
+
},
|
|
131
|
+
"divider": function() {
|
|
132
|
+
const range = this.quill.getSelection(true);
|
|
133
|
+
this.quill.insertText(range.index, "\n", Quill.sources.USER);
|
|
134
|
+
this.quill.insertEmbed(range.index + 1, "divider", true, Quill.sources.USER);
|
|
135
|
+
this.quill.setSelection(range.index + 2, Quill.sources.SILENT);
|
|
141
136
|
}
|
|
142
137
|
}
|
|
143
138
|
},
|
|
@@ -160,36 +155,37 @@ const registerModules = function() {
|
|
|
160
155
|
right: '<i class="icon-text-align-right"></i>'
|
|
161
156
|
}
|
|
162
157
|
}
|
|
163
|
-
}
|
|
164
|
-
[toolbarTip.ToolbarTip.moduleName]: true
|
|
158
|
+
}
|
|
165
159
|
}
|
|
166
160
|
};
|
|
167
161
|
FluentEditor.register(
|
|
168
162
|
{
|
|
169
|
-
"modules/
|
|
163
|
+
"modules/i18n": index$3.I18N,
|
|
164
|
+
"modules/toolbar": index$4.default,
|
|
170
165
|
"modules/mention": Mention.default,
|
|
171
|
-
"modules/better-table": betterTable.default,
|
|
172
166
|
"modules/clipboard": customClipboard.default,
|
|
173
167
|
"modules/uploader": customUploader.default,
|
|
174
168
|
// 三者关联性最强
|
|
175
169
|
"modules/image": BlotFormatter.default,
|
|
176
170
|
// 三者关联性最强
|
|
177
|
-
"modules/file": index$
|
|
171
|
+
"modules/file": index$5.default,
|
|
178
172
|
// 三者关联性最强
|
|
179
|
-
"modules/counter": index$
|
|
180
|
-
"modules/emoji-toolbar": index$
|
|
181
|
-
"modules/emoji-shortname": index$
|
|
173
|
+
"modules/counter": index$6.default,
|
|
174
|
+
"modules/emoji-toolbar": index$7.default.ToolbarEmoji,
|
|
175
|
+
"modules/emoji-shortname": index$7.default.ShortNameEmoji,
|
|
182
176
|
// 'modules/global-link': GlobalLink,//暂未开发
|
|
183
|
-
"modules/link": index$
|
|
177
|
+
"modules/link": index$8.default,
|
|
184
178
|
// 报错
|
|
185
179
|
// 'modules/quickmenu': QuickMenu,//暂未开发
|
|
186
|
-
"modules/syntax": index$
|
|
187
|
-
"modules/mathlive": index$
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
"
|
|
191
|
-
"formats/
|
|
192
|
-
"formats/
|
|
180
|
+
"modules/syntax": index$9.default,
|
|
181
|
+
"modules/mathlive": index$a.default,
|
|
182
|
+
"modules/divider": index$b.default,
|
|
183
|
+
// make sure register after `HeaderList`
|
|
184
|
+
"modules/better-table": betterTable.default,
|
|
185
|
+
"formats/strike": index$c.default,
|
|
186
|
+
"formats/softBreak": index$d.default,
|
|
187
|
+
"formats/video": index$e.default,
|
|
188
|
+
"formats/emoji": index$7.default.EmojiBlot,
|
|
193
189
|
"formats/font": fontStyle.FontStyle,
|
|
194
190
|
"formats/size": fontSize.SizeStyle,
|
|
195
191
|
"formats/line-height": lineHeight.LineHeightStyle,
|
|
@@ -201,7 +197,7 @@ const registerModules = function() {
|
|
|
201
197
|
);
|
|
202
198
|
return FluentEditor;
|
|
203
199
|
};
|
|
204
|
-
const
|
|
200
|
+
const fluentEditor = registerModules();
|
|
205
201
|
exports.FluentEditor = FluentEditor;
|
|
206
|
-
exports.default =
|
|
202
|
+
exports.default = fluentEditor;
|
|
207
203
|
//# sourceMappingURL=fluent-editor.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fluent-editor.cjs.js","sources":["../../src/fluent-editor.ts"],"sourcesContent":["import type { ExpandedQuillOptions, Module, Parchment as TypeParchment } from 'quill'\r\nimport type { IEditorConfig } from './config/types'\r\nimport Quill from 'quill'\r\nimport { FontStyle, LineHeightStyle, SizeStyle, TextIndentStyle } from './attributors'\r\nimport { CHANGE_LANGUAGE_EVENT, defaultLanguage, getListValue, ICONS_CONFIG, inputFile, LANG_CONF } from './config'\r\nimport Counter from './counter' // 字符统计\r\nimport CustomClipboard from './custom-clipboard' // 粘贴板\r\nimport CustomImage from './custom-image/BlotFormatter' // 图片\r\nimport { CustomImageSpec } from './custom-image/specs/CustomImageSpec' // 图片拉伸模块\r\nimport CustomUploader from './custom-uploader' // 上传\r\nimport Emoji from './emoji' // 表情\r\nimport FileModule from './file' // 文件\r\nimport { FormatPainter } from './format-painter'\r\nimport { fullscreenHandler } from './fullscreen/handler'\r\nimport Link from './link' // 超链接\r\nimport MathliveModule from './mathlive' // latex公式\r\nimport MathliveBlot from './mathlive/formats'\r\nimport Mention from './mention/Mention' // @提醒\r\nimport { Screenshot } from './screenshot'// 截图\r\nimport SoftBreak from './soft-break' // 软回车\r\nimport Strike from './strike' // 删除线\r\nimport CustomSyntax from './syntax' // 代码块高亮\r\nimport BetterTable from './table/better-table' // 表格\r\nimport Toolbar, { ToolbarTip } from './toolbar' // 工具栏\r\nimport { isUndefined } from './utils/is'\r\nimport Video from './video' // 视频\r\n// import GlobalLink from './global-link' // 全局链接\r\n// import QuickMenu from './quick-menu' // 快捷菜单\r\nexport interface I18NOptions {\r\n lang: string\r\n langText: Record<string, string>\r\n}\r\nfunction resolveLanguageOption(options: Partial<I18NOptions>): I18NOptions {\r\n if (isUndefined(options.lang)) {\r\n options.lang = defaultLanguage\r\n }\r\n if (!(options.lang in LANG_CONF)) {\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 langText: Object.assign({}, LANG_CONF[options.lang], options.langText || {}),\r\n }\r\n}\r\nexport class FluentEditor extends Quill {\r\n isFullscreen: boolean = false\r\n options: IEditorConfig & ExpandedQuillOptions\r\n constructor(container: HTMLElement | string, options: IEditorConfig = {}) {\r\n options = Object.assign(options, resolveLanguageOption(options || {}))\r\n super(container, options)\r\n }\r\n\r\n changeLanguage(options: Partial<I18NOptions>) {\r\n const langOps = resolveLanguageOption(options)\r\n if (langOps.lang === this.options.lang) return\r\n this.options.lang = langOps.lang\r\n this.options.langText = langOps.langText\r\n this.emitter.emit(CHANGE_LANGUAGE_EVENT, this.options.lang, this.options.langText)\r\n }\r\n}\r\n\r\nconst registerModules = function () {\r\n const Icons = Quill.import('ui/icons')\r\n Object.entries(ICONS_CONFIG).forEach(([key, icon]) => {\r\n Icons[key] = icon\r\n })\r\n\r\n const SnowTheme = Quill.imports['themes/snow'] as typeof Module\r\n SnowTheme.DEFAULTS = {\r\n modules: {\r\n 'keyboard': {\r\n bindings: {\r\n ...BetterTable.keyboardBindings,\r\n },\r\n },\r\n 'toolbar': {\r\n handlers: {\r\n ...(SnowTheme.DEFAULTS as Record<string, any>).modules.toolbar.handlers,\r\n 'formula': function () {\r\n if (!this.quill.isEnabled()) return\r\n const mathlive = this.quill.getModule('mathlive')\r\n if (!mathlive) {\r\n this.quill.theme.tooltip.edit('formula')\r\n }\r\n else {\r\n mathlive.createDialog()\r\n }\r\n },\r\n 'undo': function () {\r\n this.quill.history.undo()\r\n },\r\n 'redo': function () {\r\n this.quill.history.redo()\r\n },\r\n 'better-table': function () {\r\n this.quill.getModule('better-table').insertTable(3, 3)\r\n },\r\n 'file': function () {\r\n const accept = this.quill.options?.uploadOption?.fileAccept\r\n inputFile.call(this, 'file', accept)\r\n },\r\n 'image': function () {\r\n const accept = this.quill.options?.uploadOption?.imageAccept\r\n inputFile.call(this, 'image', accept)\r\n },\r\n 'emoji': function () {},\r\n 'fullscreen': fullscreenHandler,\r\n 'list': function (value) {\r\n const range = this.quill.getSelection()\r\n const formats = this.quill.getFormat(range)\r\n const preListValue = Array.isArray(formats.list) ? formats.list[0]?.value : formats.list?.value\r\n const curListValue = getListValue(value, preListValue)\r\n // 如果设置list的选区中有表格,判断第一个table-col位置,将表格前的内容设置为list格式\r\n const lines = this.quill.getLines(range.index, range.length)\r\n const tableCols = lines.filter(line => line.statics.blotName === 'table-col' && !line.prev)\r\n if (tableCols.length) {\r\n let start = range.index\r\n // 遍历table-col群组,以之获取表格,将表格前选区设置为对应list格式\r\n tableCols.forEach((item, index) => {\r\n const table = item.domNode.closest('table.quill-better-table')\r\n const tableBlot = Quill.find(table) as TypeParchment.Blot\r\n const tableLength = tableBlot.length()\r\n const tableStart = this.quill.getIndex(item)\r\n const tableEnd = tableStart + tableLength\r\n const beforeTableRangeLength = tableStart - start\r\n // 在表格前设置列表\r\n this.quill.setSelection(start, beforeTableRangeLength, Quill.sources.SILENT)\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n table.parentNode.classList.remove('quill-better-table-selected')\r\n // 当前表格末尾为下一个选取的开始\r\n start = tableEnd\r\n if (index === tableCols.length - 1) {\r\n // 将最后一个表格之后所有选区内容设置list格式\r\n this.quill.setSelection(tableEnd, range.index + range.length - tableEnd)\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n }\r\n })\r\n }\r\n else {\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n }\r\n },\r\n [FormatPainter.toolName]: FormatPainter,\r\n [Screenshot.toolName]: Screenshot,\r\n 'lineheight': function (value) {\r\n this.quill.format('line-height', value)\r\n },\r\n },\r\n },\r\n 'better-table': {\r\n operationMenu: {\r\n color: true,\r\n },\r\n },\r\n 'image': {\r\n specs: [CustomImageSpec],\r\n overlay: {\r\n style: {\r\n border: '1px dashed rgb(68, 68, 68)',\r\n },\r\n },\r\n align: {\r\n icons: {\r\n left: '<i class=\"icon-text-align-left\"></i>',\r\n center: '<i class=\"icon-text-align-center\"></i>',\r\n right: '<i class=\"icon-text-align-right\"></i>',\r\n },\r\n },\r\n },\r\n [ToolbarTip.moduleName]: true,\r\n },\r\n }\r\n\r\n FluentEditor.register(\r\n {\r\n 'modules/toolbar': Toolbar,\r\n 'modules/mention': Mention,\r\n 'modules/better-table': BetterTable,\r\n 'modules/clipboard': CustomClipboard,\r\n 'modules/uploader': CustomUploader, // 三者关联性最强\r\n 'modules/image': CustomImage, // 三者关联性最强\r\n 'modules/file': FileModule, // 三者关联性最强\r\n 'modules/counter': Counter,\r\n 'modules/emoji-toolbar': Emoji.ToolbarEmoji,\r\n 'modules/emoji-shortname': Emoji.ShortNameEmoji,\r\n // 'modules/global-link': GlobalLink,//暂未开发\r\n 'modules/link': Link, // 报错\r\n // 'modules/quickmenu': QuickMenu,//暂未开发\r\n 'modules/syntax': CustomSyntax,\r\n 'modules/mathlive': MathliveModule,\r\n [`modules/${ToolbarTip.moduleName}`]: ToolbarTip,\r\n\r\n 'formats/strike': Strike,\r\n 'formats/softBreak': SoftBreak,\r\n 'formats/video': Video,\r\n 'formats/emoji': Emoji.EmojiBlot,\r\n 'formats/font': FontStyle,\r\n 'formats/size': SizeStyle,\r\n 'formats/line-height': LineHeightStyle,\r\n 'formats/text-indent': TextIndentStyle,\r\n [`formats/${MathliveBlot.blotName}`]: MathliveBlot,\r\n },\r\n true, // 覆盖内部模块\r\n )\r\n\r\n return FluentEditor\r\n}\r\n\r\nexport default registerModules()\r\n"],"names":["isUndefined","defaultLanguage","LANG_CONF","CHANGE_LANGUAGE_EVENT","ICONS_CONFIG","BetterTable","inputFile","fullscreenHandler","formats","getListValue","index","FormatPainter","Screenshot","CustomImageSpec","ToolbarTip","Toolbar","Mention","CustomClipboard","CustomUploader","CustomImage","FileModule","Counter","Emoji","Link","CustomSyntax","MathliveModule","Strike","SoftBreak","Video","FontStyle","SizeStyle","LineHeightStyle","TextIndentStyle","MathliveBlot"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fluent-editor.cjs.js","sources":["../../src/fluent-editor.ts"],"sourcesContent":["import type { ExpandedQuillOptions, Module, Parchment as TypeParchment } from 'quill'\r\nimport type { IEditorConfig } from './config/types'\r\nimport Quill from 'quill'\r\nimport { FontStyle, LineHeightStyle, SizeStyle, TextIndentStyle } from './attributors'\r\nimport { defaultLanguage, getListValue, ICONS_CONFIG, inputFile, LANG_CONF } from './config'\r\nimport Counter from './counter' // 字符统计\r\nimport CustomClipboard from './custom-clipboard' // 粘贴板\r\nimport CustomImage from './custom-image/BlotFormatter' // 图片\r\nimport { CustomImageSpec } from './custom-image/specs/CustomImageSpec' // 图片拉伸模块\r\nimport CustomUploader from './custom-uploader' // 上传\r\nimport DividerBlot from './divider' // 分割线\r\nimport Emoji from './emoji' // 表情\r\nimport FileModule from './file' // 文件\r\nimport { FormatPainter } from './format-painter'\r\nimport { fullscreenHandler } from './fullscreen/handler'\r\nimport { I18N } from './i18n'\r\nimport Link from './link' // 超链接\r\nimport MathliveModule from './mathlive' // latex公式\r\nimport MathliveBlot from './mathlive/formats'\r\nimport Mention from './mention/Mention' // @提醒\r\nimport { Screenshot } from './screenshot'// 截图\r\nimport SoftBreak from './soft-break' // 软回车\r\nimport Strike from './strike' // 删除线\r\nimport CustomSyntax from './syntax' // 代码块高亮\r\nimport BetterTable from './table/better-table' // 表格\r\nimport Toolbar from './toolbar' // 工具栏\r\nimport Video from './video' // 视频\r\n// import GlobalLink from './global-link' // 全局链接\r\n// import QuickMenu from './quick-menu' // 快捷菜单\r\n\r\nexport class FluentEditor extends Quill {\r\n isFullscreen: boolean = false\r\n options: IEditorConfig & ExpandedQuillOptions\r\n\r\n get lang() {\r\n const i18nModule = this.getModule('i18n') as I18N\r\n return i18nModule ? i18nModule.options.lang : defaultLanguage\r\n }\r\n\r\n constructor(container: HTMLElement | string, options: IEditorConfig = {}) {\r\n super(container, options)\r\n }\r\n\r\n getLangText(name: string) {\r\n const i18nModule = this.getModule('i18n') as I18N\r\n if (!i18nModule) return LANG_CONF[defaultLanguage][name]\r\n return i18nModule.options.langText[name]\r\n }\r\n}\r\n\r\nconst registerModules = function () {\r\n const Icons = Quill.import('ui/icons')\r\n Object.entries(ICONS_CONFIG).forEach(([key, icon]) => {\r\n Icons[key] = icon\r\n })\r\n\r\n const SnowTheme = Quill.imports['themes/snow'] as typeof Module\r\n SnowTheme.DEFAULTS = {\r\n modules: {\r\n 'i18n': true,\r\n 'keyboard': {\r\n bindings: {\r\n ...BetterTable.keyboardBindings,\r\n },\r\n },\r\n 'toolbar': {\r\n handlers: {\r\n ...(SnowTheme.DEFAULTS as Record<string, any>).modules.toolbar.handlers,\r\n 'formula': function () {\r\n if (!this.quill.isEnabled()) return\r\n const mathlive = this.quill.getModule('mathlive')\r\n if (!mathlive) {\r\n this.quill.theme.tooltip.edit('formula')\r\n }\r\n else {\r\n mathlive.createDialog()\r\n }\r\n },\r\n 'undo': function () {\r\n this.quill.history.undo()\r\n },\r\n 'redo': function () {\r\n this.quill.history.redo()\r\n },\r\n 'better-table': function () {\r\n this.quill.getModule('better-table').insertTable(3, 3)\r\n },\r\n 'file': function () {\r\n const accept = this.quill.options?.uploadOption?.fileAccept\r\n inputFile.call(this, 'file', accept)\r\n },\r\n 'image': function () {\r\n const accept = this.quill.options?.uploadOption?.imageAccept\r\n inputFile.call(this, 'image', accept)\r\n },\r\n 'emoji': function () {},\r\n 'fullscreen': fullscreenHandler,\r\n 'list': function (value) {\r\n const range = this.quill.getSelection()\r\n const formats = this.quill.getFormat(range)\r\n const preListValue = Array.isArray(formats.list) ? formats.list[0]?.value : formats.list?.value\r\n const curListValue = getListValue(value, preListValue)\r\n // 如果设置list的选区中有表格,判断第一个table-col位置,将表格前的内容设置为list格式\r\n const lines = this.quill.getLines(range.index, range.length)\r\n const tableCols = lines.filter(line => line.statics.blotName === 'table-col' && !line.prev)\r\n if (tableCols.length) {\r\n let start = range.index\r\n // 遍历table-col群组,以之获取表格,将表格前选区设置为对应list格式\r\n tableCols.forEach((item, index) => {\r\n const table = item.domNode.closest('table.quill-better-table')\r\n const tableBlot = Quill.find(table) as TypeParchment.Blot\r\n const tableLength = tableBlot.length()\r\n const tableStart = this.quill.getIndex(item)\r\n const tableEnd = tableStart + tableLength\r\n const beforeTableRangeLength = tableStart - start\r\n // 在表格前设置列表\r\n this.quill.setSelection(start, beforeTableRangeLength, Quill.sources.SILENT)\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n table.parentNode.classList.remove('quill-better-table-selected')\r\n // 当前表格末尾为下一个选取的开始\r\n start = tableEnd\r\n if (index === tableCols.length - 1) {\r\n // 将最后一个表格之后所有选区内容设置list格式\r\n this.quill.setSelection(tableEnd, range.index + range.length - tableEnd)\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n }\r\n })\r\n }\r\n else {\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n }\r\n },\r\n [FormatPainter.toolName]: FormatPainter,\r\n [Screenshot.toolName]: Screenshot,\r\n 'lineheight': function (value) {\r\n this.quill.format('line-height', value)\r\n },\r\n 'divider': function () {\r\n const range = this.quill.getSelection(true)\r\n this.quill.insertText(range.index, '\\n', Quill.sources.USER)\r\n this.quill.insertEmbed(range.index + 1, 'divider', true, Quill.sources.USER)\r\n this.quill.setSelection(range.index + 2, Quill.sources.SILENT)\r\n },\r\n },\r\n },\r\n 'better-table': {\r\n operationMenu: {\r\n color: true,\r\n },\r\n },\r\n 'image': {\r\n specs: [CustomImageSpec],\r\n overlay: {\r\n style: {\r\n border: '1px dashed rgb(68, 68, 68)',\r\n },\r\n },\r\n align: {\r\n icons: {\r\n left: '<i class=\"icon-text-align-left\"></i>',\r\n center: '<i class=\"icon-text-align-center\"></i>',\r\n right: '<i class=\"icon-text-align-right\"></i>',\r\n },\r\n },\r\n },\r\n },\r\n }\r\n\r\n FluentEditor.register(\r\n {\r\n 'modules/i18n': I18N,\r\n 'modules/toolbar': Toolbar,\r\n 'modules/mention': Mention,\r\n 'modules/clipboard': CustomClipboard,\r\n 'modules/uploader': CustomUploader, // 三者关联性最强\r\n 'modules/image': CustomImage, // 三者关联性最强\r\n 'modules/file': FileModule, // 三者关联性最强\r\n 'modules/counter': Counter,\r\n 'modules/emoji-toolbar': Emoji.ToolbarEmoji,\r\n 'modules/emoji-shortname': Emoji.ShortNameEmoji,\r\n // 'modules/global-link': GlobalLink,//暂未开发\r\n 'modules/link': Link, // 报错\r\n // 'modules/quickmenu': QuickMenu,//暂未开发\r\n 'modules/syntax': CustomSyntax,\r\n 'modules/mathlive': MathliveModule,\r\n 'modules/divider': DividerBlot,\r\n // make sure register after `HeaderList`\r\n 'modules/better-table': BetterTable,\r\n\r\n 'formats/strike': Strike,\r\n 'formats/softBreak': SoftBreak,\r\n 'formats/video': Video,\r\n 'formats/emoji': Emoji.EmojiBlot,\r\n 'formats/font': FontStyle,\r\n 'formats/size': SizeStyle,\r\n 'formats/line-height': LineHeightStyle,\r\n 'formats/text-indent': TextIndentStyle,\r\n [`formats/${MathliveBlot.blotName}`]: MathliveBlot,\r\n },\r\n true, // 覆盖内部模块\r\n )\r\n\r\n return FluentEditor\r\n}\r\n\r\nexport default registerModules()\r\n"],"names":["defaultLanguage","LANG_CONF","ICONS_CONFIG","BetterTable","inputFile","fullscreenHandler","formats","getListValue","index","FormatPainter","Screenshot","CustomImageSpec","I18N","Toolbar","Mention","CustomClipboard","CustomUploader","CustomImage","FileModule","Counter","Emoji","Link","CustomSyntax","MathliveModule","DividerBlot","Strike","SoftBreak","Video","FontStyle","SizeStyle","LineHeightStyle","TextIndentStyle","MathliveBlot"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../../src/format-painter/index.ts"],"sourcesContent":["import type { Range } from 'quill'\r\nimport type Toolbar from 'quill/modules/toolbar'\r\nimport Quill from 'quill'\r\n\r\ninterface FormatData {\r\n formatPainter: {\r\n rangeFormat: Record<string, any>\r\n isFormatterLock: boolean\r\n isFormating: boolean\r\n prepareLock: boolean\r\n }\r\n}\r\nexport function FormatPainter(this: Toolbar & FormatData) {\r\n if (!this.formatPainter) {\r\n this.formatPainter = {\r\n rangeFormat: {},\r\n isFormatterLock: false,\r\n isFormating: false,\r\n prepareLock: false,\r\n }\r\n }\r\n const [, formatterBtn] = this.controls.find(([name]) => name === FormatPainter.toolName)\r\n const formatRange = (range: Range | null) => {\r\n if (!range) return\r\n this.quill.removeFormat(range.index, range.length)\r\n for (const format in this.formatPainter.rangeFormat) {\r\n this.quill.format(format, this.formatPainter.rangeFormat[format], Quill.sources.USER)\r\n }\r\n if (!this.formatPainter.isFormatterLock) {\r\n unbindFormatSelect()\r\n }\r\n else {\r\n btnActive()\r\n }\r\n }\r\n // setTime for Toolbar.update\r\n const btnActive = () => {\r\n setTimeout(() => {\r\n formatterBtn.classList.add('ql-active')\r\n }, 0)\r\n }\r\n const btnRemoveActive = () => {\r\n setTimeout(() => {\r\n formatterBtn.classList.remove('ql-active')\r\n }, 0)\r\n }\r\n const bindFormatSelect = () => {\r\n const range = this.quill.getSelection()\r\n if (range.length === 0) return\r\n this.formatPainter.rangeFormat = this.quill.getFormat(range)\r\n this.formatPainter.isFormating = true\r\n this.quill.on(Quill.events.SELECTION_CHANGE, formatRange)\r\n btnActive()\r\n }\r\n const unbindFormatSelect = () => {\r\n this.quill.off(Quill.events.SELECTION_CHANGE, formatRange)\r\n this.formatPainter.rangeFormat = undefined\r\n btnRemoveActive()\r\n this.formatPainter.isFormating = false\r\n this.formatPainter.isFormatterLock = false\r\n }\r\n\r\n if (this.formatPainter.isFormatterLock || (this.formatPainter.isFormating && !this.formatPainter.prepareLock)) {\r\n unbindFormatSelect()\r\n }\r\n else if (this.formatPainter.isFormating && this.formatPainter.prepareLock) {\r\n this.formatPainter.isFormatterLock = true\r\n btnActive()\r\n }\r\n else {\r\n // imitate double click\r\n this.formatPainter.prepareLock = true\r\n setTimeout(() => {\r\n this.formatPainter.prepareLock = false\r\n }, 200)\r\n bindFormatSelect()\r\n }\r\n}\r\nFormatPainter.toolName = 'format-painter'\r\n"],"names":[],"mappings":";;;AAYO,SAAS,gBAA0C;AACpD,MAAA,CAAC,KAAK,eAAe;AACvB,SAAK,gBAAgB;AAAA,MACnB,aAAa,CAAC;AAAA,MACd,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,aAAa;AAAA,
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/format-painter/index.ts"],"sourcesContent":["import type { Range } from 'quill'\r\nimport type Toolbar from 'quill/modules/toolbar'\r\nimport Quill from 'quill'\r\n\r\ninterface FormatData {\r\n formatPainter: {\r\n rangeFormat: Record<string, any>\r\n isFormatterLock: boolean\r\n isFormating: boolean\r\n prepareLock: boolean\r\n }\r\n}\r\nexport function FormatPainter(this: Toolbar & FormatData) {\r\n if (!this.formatPainter) {\r\n this.formatPainter = {\r\n rangeFormat: {},\r\n isFormatterLock: false,\r\n isFormating: false,\r\n prepareLock: false,\r\n }\r\n }\r\n const [, formatterBtn] = this.controls.find(([name]) => name === FormatPainter.toolName)\r\n const formatRange = (range: Range | null) => {\r\n if (!range) return\r\n this.quill.removeFormat(range.index, range.length)\r\n for (const format in this.formatPainter.rangeFormat) {\r\n this.quill.format(format, this.formatPainter.rangeFormat[format], Quill.sources.USER)\r\n }\r\n if (!this.formatPainter.isFormatterLock) {\r\n unbindFormatSelect()\r\n }\r\n else {\r\n btnActive()\r\n }\r\n }\r\n // setTime for Toolbar.update\r\n const btnActive = () => {\r\n setTimeout(() => {\r\n formatterBtn.classList.add('ql-active')\r\n }, 0)\r\n }\r\n const btnRemoveActive = () => {\r\n setTimeout(() => {\r\n formatterBtn.classList.remove('ql-active')\r\n }, 0)\r\n }\r\n const bindFormatSelect = () => {\r\n const range = this.quill.getSelection()\r\n if (range.length === 0) return\r\n this.formatPainter.rangeFormat = this.quill.getFormat(range)\r\n this.formatPainter.isFormating = true\r\n this.quill.on(Quill.events.SELECTION_CHANGE, formatRange)\r\n btnActive()\r\n }\r\n const unbindFormatSelect = () => {\r\n this.quill.off(Quill.events.SELECTION_CHANGE, formatRange)\r\n this.formatPainter.rangeFormat = undefined\r\n btnRemoveActive()\r\n this.formatPainter.isFormating = false\r\n this.formatPainter.isFormatterLock = false\r\n }\r\n\r\n if (this.formatPainter.isFormatterLock || (this.formatPainter.isFormating && !this.formatPainter.prepareLock)) {\r\n unbindFormatSelect()\r\n }\r\n else if (this.formatPainter.isFormating && this.formatPainter.prepareLock) {\r\n this.formatPainter.isFormatterLock = true\r\n btnActive()\r\n }\r\n else {\r\n // imitate double click\r\n this.formatPainter.prepareLock = true\r\n setTimeout(() => {\r\n this.formatPainter.prepareLock = false\r\n }, 200)\r\n bindFormatSelect()\r\n }\r\n}\r\nFormatPainter.toolName = 'format-painter'\r\n"],"names":[],"mappings":";;;AAYO,SAAS,gBAA0C;AACpD,MAAA,CAAC,KAAK,eAAe;AACvB,SAAK,gBAAgB;AAAA,MACnB,aAAa,CAAC;AAAA,MACd,iBAAiB;AAAA,MACjB,aAAa;AAAA,MACb,aAAa;AAAA,IACf;AAAA,EAAA;AAEF,QAAM,GAAG,YAAY,IAAI,KAAK,SAAS,KAAK,CAAC,CAAC,IAAI,MAAM,SAAS,cAAc,QAAQ;AACjF,QAAA,cAAc,CAAC,UAAwB;AAC3C,QAAI,CAAC,MAAO;AACZ,SAAK,MAAM,aAAa,MAAM,OAAO,MAAM,MAAM;AACtC,eAAA,UAAU,KAAK,cAAc,aAAa;AAC9C,WAAA,MAAM,OAAO,QAAQ,KAAK,cAAc,YAAY,MAAM,GAAG,MAAM,QAAQ,IAAI;AAAA,IAAA;AAElF,QAAA,CAAC,KAAK,cAAc,iBAAiB;AACpB,yBAAA;AAAA,IAAA,OAEhB;AACO,gBAAA;AAAA,IAAA;AAAA,EAEd;AAEA,QAAM,YAAY,MAAM;AACtB,eAAW,MAAM;AACF,mBAAA,UAAU,IAAI,WAAW;AAAA,OACrC,CAAC;AAAA,EACN;AACA,QAAM,kBAAkB,MAAM;AAC5B,eAAW,MAAM;AACF,mBAAA,UAAU,OAAO,WAAW;AAAA,OACxC,CAAC;AAAA,EACN;AACA,QAAM,mBAAmB,MAAM;AACvB,UAAA,QAAQ,KAAK,MAAM,aAAa;AAClC,QAAA,MAAM,WAAW,EAAG;AACxB,SAAK,cAAc,cAAc,KAAK,MAAM,UAAU,KAAK;AAC3D,SAAK,cAAc,cAAc;AACjC,SAAK,MAAM,GAAG,MAAM,OAAO,kBAAkB,WAAW;AAC9C,cAAA;AAAA,EACZ;AACA,QAAM,qBAAqB,MAAM;AAC/B,SAAK,MAAM,IAAI,MAAM,OAAO,kBAAkB,WAAW;AACzD,SAAK,cAAc,cAAc;AACjB,oBAAA;AAChB,SAAK,cAAc,cAAc;AACjC,SAAK,cAAc,kBAAkB;AAAA,EACvC;AAEI,MAAA,KAAK,cAAc,mBAAoB,KAAK,cAAc,eAAe,CAAC,KAAK,cAAc,aAAc;AAC1F,uBAAA;AAAA,EAAA,WAEZ,KAAK,cAAc,eAAe,KAAK,cAAc,aAAa;AACzE,SAAK,cAAc,kBAAkB;AAC3B,cAAA;AAAA,EAAA,OAEP;AAEH,SAAK,cAAc,cAAc;AACjC,eAAW,MAAM;AACf,WAAK,cAAc,cAAc;AAAA,OAChC,GAAG;AACW,qBAAA;AAAA,EAAA;AAErB;AACA,cAAc,WAAW;;"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const index = require("../config/index.cjs.js");
|
|
4
|
-
require("../toolbar/index.cjs.js");
|
|
5
4
|
const scrollLock = require("../utils/scroll-lock.cjs.js");
|
|
6
|
-
const toolbarTip = require("../toolbar/toolbar-tip.cjs.js");
|
|
7
5
|
let exitEscHandlerBindToolbar;
|
|
8
6
|
let resizeHandlerBindToolbar;
|
|
9
7
|
let cleanLock;
|
|
@@ -28,7 +26,7 @@ function intoFullscreen(toolbar) {
|
|
|
28
26
|
btn.innerHTML = index.ICONS_CONFIG["fullscreen-exit"];
|
|
29
27
|
window.addEventListener("resize", resizeHandlerBindToolbar);
|
|
30
28
|
document.addEventListener("keydown", exitEscHandlerBindToolbar);
|
|
31
|
-
const toolbarTipModule = toolbar.quill.getModule(
|
|
29
|
+
const toolbarTipModule = toolbar.quill.getModule("toolbar-tip");
|
|
32
30
|
if (toolbarTipModule) {
|
|
33
31
|
toolbarTipModule.hideAllTips();
|
|
34
32
|
}
|
|
@@ -43,7 +41,7 @@ function exitFullscreen(toolbar) {
|
|
|
43
41
|
btn.innerHTML = index.ICONS_CONFIG.fullscreen;
|
|
44
42
|
window.removeEventListener("resize", resizeHandlerBindToolbar);
|
|
45
43
|
document.removeEventListener("keydown", exitEscHandlerBindToolbar);
|
|
46
|
-
const toolbarTipModule = toolbar.quill.getModule(
|
|
44
|
+
const toolbarTipModule = toolbar.quill.getModule("toolbar-tip");
|
|
47
45
|
if (toolbarTipModule) {
|
|
48
46
|
toolbarTipModule.hideAllTips();
|
|
49
47
|
}
|