@opentiny/fluent-editor 3.23.0 → 3.23.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +102 -101
- package/es/attributors/font-style.es.js +1 -1
- package/es/attributors/font-style.es.js.map +1 -1
- package/es/attributors/line-height.es.js.map +1 -1
- package/es/config/base64-image.es.js.map +1 -1
- package/es/config/editor.config.es.js.map +1 -1
- package/es/config/editor.utils.es.js.map +1 -1
- package/es/config/i18n/en-us.es.js.map +1 -1
- package/es/config/i18n/zh-cn.es.js.map +1 -1
- package/es/config/icons.config.es.js.map +1 -1
- package/es/config/index.es.js.map +1 -1
- package/es/counter/index.es.js.map +1 -1
- 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 +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.map +1 -1
- package/es/emoji/emoji-list/people.es.js.map +1 -1
- package/es/emoji/emoji-list.es.js.map +1 -1
- package/es/emoji/emoji-map.es.js.map +1 -1
- package/es/emoji/formats/emoji-blot.es.js.map +1 -1
- package/es/emoji/index.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.map +1 -1
- package/es/file/index.es.js.map +1 -1
- package/es/file/modules/file-bar.es.js.map +1 -1
- package/es/fluent-editor.es.js +1 -0
- package/es/fluent-editor.es.js.map +1 -1
- package/es/global-link/constants.es.js.map +1 -1
- package/es/global-link/formats/customer-widget-link.es.js.map +1 -1
- package/es/global-link/formats/doc-link.es.js.map +1 -1
- package/es/global-link/formats/wiki-link.es.js.map +1 -1
- package/es/global-link/formats/work-item-link.es.js.map +1 -1
- package/es/global-link/index.es.js.map +1 -1
- package/es/global-link/utils/createTable.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.map +1 -1
- package/es/mathlive/formats.es.js +3 -32
- package/es/mathlive/formats.es.js.map +1 -1
- package/es/mathlive/index.es.js +23 -6
- package/es/mathlive/index.es.js.map +1 -1
- package/es/mathlive/tooltip.es.js +5 -5
- 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/mention/constants.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/strike/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.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 -12
- 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/table-config.es.js.map +1 -1
- package/es/table/utils/index.es.js.map +1 -1
- package/es/table/utils/node-matchers.es.js +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.map +1 -1
- package/es/utils/debounce.es.js.map +1 -1
- package/es/utils/method.es.js.map +1 -1
- package/es/video/index.es.js.map +1 -1
- package/lib/attributors/font-style.cjs.js +1 -1
- package/lib/attributors/font-style.cjs.js.map +1 -1
- package/lib/attributors/line-height.cjs.js.map +1 -1
- package/lib/config/base64-image.cjs.js.map +1 -1
- package/lib/config/editor.config.cjs.js.map +1 -1
- package/lib/config/editor.utils.cjs.js.map +1 -1
- package/lib/config/i18n/en-us.cjs.js.map +1 -1
- package/lib/config/i18n/zh-cn.cjs.js.map +1 -1
- package/lib/config/icons.config.cjs.js.map +1 -1
- package/lib/config/index.cjs.js.map +1 -1
- package/lib/counter/index.cjs.js.map +1 -1
- 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 +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.map +1 -1
- package/lib/emoji/emoji-list/people.cjs.js.map +1 -1
- package/lib/emoji/emoji-list.cjs.js.map +1 -1
- package/lib/emoji/emoji-map.cjs.js.map +1 -1
- package/lib/emoji/formats/emoji-blot.cjs.js.map +1 -1
- package/lib/emoji/index.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.map +1 -1
- package/lib/file/index.cjs.js.map +1 -1
- package/lib/file/modules/file-bar.cjs.js.map +1 -1
- package/lib/fluent-editor.cjs.js +1 -0
- package/lib/fluent-editor.cjs.js.map +1 -1
- package/lib/global-link/constants.cjs.js.map +1 -1
- package/lib/global-link/formats/customer-widget-link.cjs.js.map +1 -1
- package/lib/global-link/formats/doc-link.cjs.js.map +1 -1
- package/lib/global-link/formats/wiki-link.cjs.js.map +1 -1
- package/lib/global-link/formats/work-item-link.cjs.js.map +1 -1
- package/lib/global-link/index.cjs.js.map +1 -1
- package/lib/global-link/utils/createTable.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.map +1 -1
- package/lib/mathlive/formats.cjs.js +3 -32
- package/lib/mathlive/formats.cjs.js.map +1 -1
- package/lib/mathlive/index.cjs.js +22 -5
- package/lib/mathlive/index.cjs.js.map +1 -1
- package/lib/mathlive/tooltip.cjs.js +6 -6
- 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/mention/constants.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/strike/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.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 -12
- 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/table-config.cjs.js.map +1 -1
- package/lib/table/utils/index.cjs.js.map +1 -1
- package/lib/table/utils/node-matchers.cjs.js +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.map +1 -1
- package/lib/utils/debounce.cjs.js.map +1 -1
- package/lib/utils/method.cjs.js.map +1 -1
- package/lib/video/index.cjs.js.map +1 -1
- package/package.json +57 -57
- package/style.css +3 -37
- package/types/attributors/font-size.d.ts +1 -1
- package/types/attributors/font-style.d.ts +1 -1
- package/types/attributors/index.d.ts +4 -4
- package/types/attributors/line-height.d.ts +1 -1
- package/types/attributors/text-indent.d.ts +1 -1
- package/types/config/base64-image.d.ts +3 -3
- package/types/config/editor.config.d.ts +225 -225
- package/types/config/editor.utils.d.ts +42 -42
- package/types/config/i18n/en-us.d.ts +106 -106
- package/types/config/i18n/zh-cn.d.ts +106 -106
- package/types/config/icons.config.d.ts +34 -34
- package/types/config/index.d.ts +8 -8
- package/types/config/types/additional-toolbar-item.interface.d.ts +6 -7
- package/types/config/types/content-change.interface.d.ts +13 -13
- package/types/config/types/content-save.interface.d.ts +6 -6
- package/types/config/types/counter-option.interface.d.ts +7 -8
- package/types/config/types/editor-config.interface.d.ts +18 -19
- package/types/config/types/editor-modules.interface.d.ts +29 -30
- package/types/config/types/editor-toolbar.interface.d.ts +3 -4
- package/types/config/types/file-operation.interface.d.ts +10 -11
- package/types/config/types/focus-change.interface.d.ts +4 -4
- package/types/config/types/fullscreen-module.interface.d.ts +4 -4
- package/types/config/types/help-panel-item.interface.d.ts +5 -5
- package/types/config/types/help-panel-option.interface.d.ts +5 -6
- package/types/config/types/image-module.interface.d.ts +3 -3
- package/types/config/types/image-upload.interface.d.ts +5 -6
- package/types/config/types/index.d.ts +23 -23
- package/types/config/types/load-on-demand-module.interface.d.ts +5 -5
- package/types/config/types/mention-module.interface.d.ts +8 -8
- package/types/config/types/paste-change.interface.d.ts +4 -5
- package/types/config/types/quick-menu-module.interface.d.ts +3 -3
- package/types/config/types/range.interface.d.ts +4 -4
- package/types/config/types/registry-options.interface.d.ts +5 -5
- package/types/config/types/selection-change.interface.d.ts +6 -7
- package/types/config/types/toolbar-item.interface.d.ts +13 -13
- package/types/config/types/type.d.ts +3 -4
- package/types/config/types/validate-error.interface.d.ts +13 -13
- package/types/counter/index.d.ts +14 -15
- package/types/custom-clipboard.d.ts +26 -27
- package/types/custom-image/BlotFormatter.d.ts +20 -21
- package/types/custom-image/Options.d.ts +36 -36
- package/types/custom-image/actions/Action.d.ts +7 -7
- package/types/custom-image/actions/CustomResizeAction.d.ts +22 -23
- package/types/custom-image/actions/DeleteAction.d.ts +5 -6
- package/types/custom-image/image.d.ts +28 -28
- package/types/custom-image/specs/BlotSpec.d.ts +10 -11
- package/types/custom-image/specs/CustomImageSpec.d.ts +17 -18
- package/types/custom-image/specs/ImageSpec.d.ts +8 -9
- package/types/custom-uploader.d.ts +28 -29
- package/types/emoji/emoji-list/index.d.ts +1 -1
- package/types/emoji/emoji-list/people.d.ts +1 -1
- package/types/emoji/emoji-list.d.ts +2 -2
- package/types/emoji/emoji-map.d.ts +2 -2
- package/types/emoji/formats/emoji-blot.d.ts +13 -13
- package/types/emoji/index.d.ts +6 -7
- package/types/emoji/modules/emoji.d.ts +38 -38
- package/types/emoji/modules/toolbar-emoji.d.ts +8 -8
- package/types/emoji/utils.d.ts +1 -1
- package/types/file/formats/file.d.ts +15 -15
- package/types/file/index.d.ts +9 -10
- package/types/file/modules/file-bar.d.ts +14 -14
- package/types/fluent-editor.d.ts +12 -13
- package/types/format-painter/index.d.ts +13 -14
- package/types/fullscreen/handler.d.ts +1 -2
- package/types/global-link/constants.d.ts +3 -3
- package/types/global-link/formats/customer-widget-link.d.ts +14 -14
- package/types/global-link/formats/doc-link.d.ts +17 -17
- package/types/global-link/formats/wiki-link.d.ts +16 -16
- package/types/global-link/formats/work-item-link.d.ts +16 -16
- package/types/global-link/global-link-panel.d.ts +17 -18
- package/types/global-link/index.d.ts +18 -18
- package/types/global-link/utils/createTable.d.ts +1 -1
- package/types/index.d.ts +2 -3
- package/types/link/formats/link.d.ts +14 -15
- package/types/link/index.d.ts +6 -6
- package/types/link/modules/tooltip.d.ts +31 -32
- package/types/mathlive/formats.d.ts +20 -26
- package/types/mathlive/index.d.ts +7 -7
- package/types/mathlive/tooltip.d.ts +16 -15
- package/types/mention/Mention.d.ts +53 -54
- package/types/mention/MentionLink.d.ts +14 -15
- package/types/mention/constants.d.ts +3 -3
- package/types/quick-menu/index.d.ts +20 -21
- package/types/screenshot/index.d.ts +17 -18
- package/types/soft-break/index.d.ts +14 -14
- package/types/strike/index.d.ts +7 -7
- package/types/syntax/index.d.ts +12 -13
- package/types/table/better-table.d.ts +24 -25
- package/types/table/formats/header.d.ts +22 -22
- package/types/table/formats/list.d.ts +34 -34
- package/types/table/formats/table.d.ts +145 -146
- package/types/table/modules/table-column-tool.d.ts +23 -23
- package/types/table/modules/table-operation-menu.d.ts +38 -38
- package/types/table/modules/table-scroll-bar.d.ts +33 -33
- package/types/table/modules/table-selection.d.ts +37 -37
- package/types/table/table-config.d.ts +38 -38
- package/types/table/utils/index.d.ts +17 -17
- package/types/table/utils/node-matchers.d.ts +9 -9
- package/types/toolbar/better-picker.d.ts +1 -1
- package/types/toolbar/index.d.ts +7 -8
- package/types/toolbar/toolbar-tip.d.ts +6 -7
- package/types/utils/debounce.d.ts +6 -6
- package/types/utils/image.d.ts +1 -1
- package/types/utils/is.d.ts +2 -2
- package/types/utils/method.d.ts +6 -6
- package/types/utils/scroll-lock.d.ts +6 -6
- package/types/video/index.d.ts +14 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-bar.cjs.js","sources":["../../../../src/file/modules/file-bar.ts"],"sourcesContent":["import Quill from 'quill'\
|
|
1
|
+
{"version":3,"file":"file-bar.cjs.js","sources":["../../../../src/file/modules/file-bar.ts"],"sourcesContent":["import Quill from 'quill'\n// devui-internal api: utils\\public-api.ts\n\nimport { Range } from 'quill/core/selection'\nimport { unshiftString } from '../../utils/method'\nimport File from '../formats/file'\n\nconst Delta = Quill.imports.delta\n\nexport default class FileBar {\n quill: any\n file: any\n domNode: HTMLElement\n fileRange: any\n template: string\n\n constructor(quill, target) {\n this.quill = quill\n this.file = target\n const fileBlot = Quill.find(target)\n const index = this.quill.getIndex(fileBlot)\n const [fileItem, offset] = this.quill.scroll.descendant(File, index)\n const length = fileItem && fileItem.length()\n this.fileRange = new Range(index - offset, length)\n\n const timestamp = Number(this.file.dataset.lastModified)\n const _lastModifiedDate = this.formatDate(timestamp)\n this.template = [\n // `<a class=\"ql-last-modified-date\" href=\"${this.file.href}\" target=\"_blank\">${this.file.href}</a>`,\n // '<span class=\"ql-split\"></span>',\n // `<a class=\"ql-file-preview\"><i class=\"icon-preview\"></i></a>`,\n `<a class=\"ql-file-download\"><i class=\"icon-download\"></i></a>`,\n '<a class=\"ql-file-delete\"><i class=\"icon-delete\"></i></a>',\n ].join('')\n\n this.createFileBar()\n }\n\n createFileBar() {\n this.domNode = document.createElement('div')\n this.domNode.className = 'ql-file-bar'\n this.domNode.innerHTML = this.template\n // 查看文件\n const filePreview = this.domNode.querySelector('a.ql-file-preview')\n if (filePreview) {\n filePreview.addEventListener('click', (event) => {\n this.operateFile(event, 'view')\n })\n }\n // 下载文件\n const fileDownload = this.domNode.querySelector('a.ql-file-download')\n if (fileDownload) {\n fileDownload.addEventListener('click', (event) => {\n this.operateFile(event, 'download')\n })\n }\n // 删除文件\n const fileDelete = this.domNode.querySelector('a.ql-file-delete')\n if (fileDelete) {\n fileDelete.addEventListener('click', (event) => {\n this.operateFile(event, 'delete')\n const delta = new Delta()\n .retain(this.fileRange.index)\n .delete(this.fileRange.length)\n this.quill.updateContents(delta, Quill.sources.USER)\n this.quill.setSelection(this.fileRange.index)\n })\n }\n\n this.setPosition()\n this.quill.root.parentNode.appendChild(this.domNode)\n }\n\n destroy() {\n if (this.domNode) {\n this.domNode.remove()\n this.domNode = null\n this.file = null\n }\n }\n\n operateFile(event, operate) {\n event.preventDefault()\n const fileId = this.file.dataset.id || ''\n const fileDownloadUrl = this.file.href\n if (fileId) {\n this.quill.emitter.emit('file-change', {\n operation: operate,\n data: { fileId, fileDownloadUrl },\n })\n }\n if (operate === 'download') {\n const a = document.createElement('a')\n a.href = fileDownloadUrl\n a.target = '_blank'\n a.id = 'exppub'\n document.body.appendChild(a)\n const alink = document.getElementById('exppub')\n alink.click()\n alink.parentNode.removeChild(a)\n }\n this.destroy()\n }\n\n setPosition() {\n if (this.domNode && this.file) {\n const parent = this.quill.root.parentNode\n const child = this.file.querySelector('span')\n const containerRect = parent.getBoundingClientRect()\n const fileRect = child.getBoundingClientRect()\n this.css(this.domNode, {\n left: `${fileRect.left - containerRect.left}px`,\n top: `${fileRect.top - containerRect.top + 10}px`,\n })\n }\n }\n\n css(domNode, rules) {\n if (typeof rules === 'object') {\n for (const prop in rules) {\n if (prop) {\n if (Array.isArray(rules[prop])) {\n // 兼容IE11浏览器\n rules[prop].forEach((val) => {\n domNode.style[prop] = val\n })\n }\n else {\n domNode.style[prop] = rules[prop]\n }\n }\n }\n }\n }\n\n formatDate(timestamp) {\n const date = new Date(timestamp)\n const year = date.getFullYear()\n // TODO\n const month = unshiftString(`${date.getMonth() + 1}`, 2, '0')\n const day = unshiftString(`${date.getDate()}`, 2, '0')\n const hour = unshiftString(`${date.getHours()}`, 2, '0')\n const minute = unshiftString(`${date.getMinutes()}`, 2, '0')\n return Number.isNaN(year) ? '--' : `${year}/${month}/${day} ${hour}:${minute}`\n }\n}\n"],"names":["File","Range","unshiftString"],"mappings":"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"}
|
package/lib/fluent-editor.cjs.js
CHANGED
|
@@ -74,6 +74,7 @@ const registerModules = function() {
|
|
|
74
74
|
handlers: {
|
|
75
75
|
...SnowTheme.DEFAULTS.modules.toolbar.handlers,
|
|
76
76
|
"formula": function() {
|
|
77
|
+
if (!this.quill.isEnabled()) return;
|
|
77
78
|
const mathlive = this.quill.getModule("mathlive");
|
|
78
79
|
if (!mathlive) {
|
|
79
80
|
this.quill.theme.tooltip.edit("formula");
|
|
@@ -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 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 },\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,SAAS,sBAAsB,SAA4C;AACrE,MAAAA,GAAA,YAAY,QAAQ,IAAI,GAAG;AAC7B,YAAQ,OAAOC;EACjB;AACI,MAAA,EAAE,QAAQ,QAAQC,cAAAA,YAAY;AAChC,YAAQ,KAAK,gBAAgB,QAAQ,IAAI,gDAAgDD,6BAAe,EAAE;AAC1G,YAAQ,OAAOA;EACjB;AACO,SAAA;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,UAAU,OAAO,OAAO,CAAA,GAAIC,cAAA,UAAU,QAAQ,IAAI,GAAG,QAAQ,YAAY,EAAE;AAAA,EAAA;AAE/E;AACO,MAAM,qBAAqB,MAAM;AAAA,EAGtC,YAAY,WAAiC,UAAyB,IAAI;AACxE,cAAU,OAAO,OAAO,SAAS,sBAAsB,WAAW,CAAE,CAAA,CAAC;AACrE,UAAM,WAAW,OAAO;AAJF,SAAA,eAAA;AAAA,EAKxB;AAAA,EAEA,eAAe,SAA+B;AACtC,UAAA,UAAU,sBAAsB,OAAO;AAC7C,QAAI,QAAQ,SAAS,KAAK,QAAQ,KAAM;AACnC,SAAA,QAAQ,OAAO,QAAQ;AACvB,SAAA,QAAQ,WAAW,QAAQ;AAC3B,SAAA,QAAQ,KAAKC,cAAAA,uBAAuB,KAAK,QAAQ,MAAM,KAAK,QAAQ,QAAQ;AAAA,EACnF;AACF;AAEA,MAAM,kBAAkB,WAAY;AAC5B,QAAA,QAAQ,MAAM,OAAO,UAAU;AAC9B,SAAA,QAAQC,kBAAY,EAAE,QAAQ,CAAC,CAAC,KAAK,IAAI,MAAM;AACpD,UAAM,GAAG,IAAI;AAAA,EAAA,CACd;AAEK,QAAA,YAAY,MAAM,QAAQ,aAAa;AAC7C,YAAU,WAAW;AAAA,IACnB,SAAS;AAAA,MACP,YAAY;AAAA,QACV,UAAU;AAAA,UACR,GAAGC,YAAY,QAAA;AAAA,QACjB;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,UAAU;AAAA,UACR,GAAI,UAAU,SAAiC,QAAQ,QAAQ;AAAA,UAC/D,WAAW,WAAY;AACrB,kBAAM,WAAW,KAAK,MAAM,UAAU,UAAU;AAChD,gBAAI,CAAC,UAAU;AACb,mBAAK,MAAM,MAAM,QAAQ,KAAK,SAAS;AAAA,YAAA,OAEpC;AACH,uBAAS,aAAa;AAAA,YACxB;AAAA,UACF;AAAA,UACA,QAAQ,WAAY;AACb,iBAAA,MAAM,QAAQ;UACrB;AAAA,UACA,QAAQ,WAAY;AACb,iBAAA,MAAM,QAAQ;UACrB;AAAA,UACA,gBAAgB,WAAY;AAC1B,iBAAK,MAAM,UAAU,cAAc,EAAE,YAAY,GAAG,CAAC;AAAA,UACvD;AAAA,UACA,QAAQ,WAAY;;AAClB,kBAAM,UAAS,gBAAK,MAAM,YAAX,mBAAoB,iBAApB,mBAAkC;AACvCC,kBAAAA,UAAA,KAAK,MAAM,QAAQ,MAAM;AAAA,UACrC;AAAA,UACA,SAAS,WAAY;;AACnB,kBAAM,UAAS,gBAAK,MAAM,YAAX,mBAAoB,iBAApB,mBAAkC;AACvCA,kBAAAA,UAAA,KAAK,MAAM,SAAS,MAAM;AAAA,UACtC;AAAA,UACA,SAAS,WAAY;AAAA,UAAC;AAAA,UACtB,cAAcC,QAAA;AAAA,UACd,QAAQ,SAAU,OAAO;;AACjB,kBAAA,QAAQ,KAAK,MAAM,aAAa;AACtC,kBAAMC,WAAU,KAAK,MAAM,UAAU,KAAK;AAC1C,kBAAM,eAAe,MAAM,QAAQA,SAAQ,IAAI,KAAI,KAAAA,SAAQ,KAAK,CAAC,MAAd,mBAAiB,SAAQ,KAAAA,SAAQ,SAAR,mBAAc;AACpF,kBAAA,eAAeC,MAAAA,aAAa,OAAO,YAAY;AAErD,kBAAM,QAAQ,KAAK,MAAM,SAAS,MAAM,OAAO,MAAM,MAAM;AACrD,kBAAA,YAAY,MAAM,OAAO,CAAQ,SAAA,KAAK,QAAQ,aAAa,eAAe,CAAC,KAAK,IAAI;AAC1F,gBAAI,UAAU,QAAQ;AACpB,kBAAI,QAAQ,MAAM;AAER,wBAAA,QAAQ,CAAC,MAAMC,WAAU;AACjC,sBAAM,QAAQ,KAAK,QAAQ,QAAQ,0BAA0B;AACvD,sBAAA,YAAY,MAAM,KAAK,KAAK;AAC5B,sBAAA,cAAc,UAAU;AAC9B,sBAAM,aAAa,KAAK,MAAM,SAAS,IAAI;AAC3C,sBAAM,WAAW,aAAa;AAC9B,sBAAM,yBAAyB,aAAa;AAE5C,qBAAK,MAAM,aAAa,OAAO,wBAAwB,MAAM,QAAQ,MAAM;AAC3E,qBAAK,MAAM,OAAO,QAAQ,cAAc,MAAM,QAAQ,IAAI;AACpD,sBAAA,WAAW,UAAU,OAAO,6BAA6B;AAEvD,wBAAA;AACJ,oBAAAA,WAAU,UAAU,SAAS,GAAG;AAElC,uBAAK,MAAM,aAAa,UAAU,MAAM,QAAQ,MAAM,SAAS,QAAQ;AACvE,uBAAK,MAAM,OAAO,QAAQ,cAAc,MAAM,QAAQ,IAAI;AAAA,gBAC5D;AAAA,cAAA,CACD;AAAA,YAAA,OAEE;AACH,mBAAK,MAAM,OAAO,QAAQ,cAAc,MAAM,QAAQ,IAAI;AAAA,YAC5D;AAAA,UACF;AAAA,UACA,CAACC,QAAAA,cAAc,QAAQ,GAAGA,QAAA;AAAA,UAC1B,CAACC,QAAAA,WAAW,QAAQ,GAAGA,QAAA;AAAA,QACzB;AAAA,MACF;AAAA,MACA,gBAAgB;AAAA,QACd,eAAe;AAAA,UACb,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,SAAS;AAAA,QACP,OAAO,CAACC,gBAAAA,eAAe;AAAA,QACvB,SAAS;AAAA,UACP,OAAO;AAAA,YACL,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,MACA,CAACC,WAAAA,WAAW,UAAU,GAAG;AAAA,IAC3B;AAAA,EAAA;AAGW,eAAA;AAAA,IACX;AAAA,MACE,mBAAmBC,QAAA;AAAA,MACnB,mBAAmBC,QAAA;AAAA,MACnB,wBAAwBX,YAAA;AAAA,MACxB,qBAAqBY,gBAAA;AAAA,MACrB,oBAAoBC,eAAA;AAAA;AAAA,MACpB,iBAAiBC,cAAA;AAAA;AAAA,MACjB,gBAAgBC,QAAA;AAAA;AAAA,MAChB,mBAAmBC,QAAA;AAAA,MACnB,yBAAyBC,QAAM,QAAA;AAAA,MAC/B,2BAA2BA,QAAM,QAAA;AAAA;AAAA,MAEjC,gBAAgBC,QAAA;AAAA;AAAA;AAAA,MAEhB,kBAAkBC,QAAA;AAAA,MAClB,oBAAoBC,QAAA;AAAA,MACpB,CAAC,WAAWX,WAAAA,WAAW,UAAU,EAAE,GAAGA,WAAA;AAAA,MAEtC,kBAAkBY,QAAA;AAAA,MAClB,qBAAqBC,QAAA;AAAA,MACrB,iBAAiBC,QAAA;AAAA,MACjB,iBAAiBN,QAAM,QAAA;AAAA,MACvB,gBAAgBO,UAAA;AAAA,MAChB,gBAAgBC,SAAA;AAAA,MAChB,uBAAuBC,WAAA;AAAA,MACvB,uBAAuBC,WAAA;AAAA,MACvB,CAAC,WAAWC,QAAAA,QAAa,QAAQ,EAAE,GAAGA,QAAA;AAAA,IACxC;AAAA,IACA;AAAA;AAAA,EAAA;AAGK,SAAA;AACT;AAEA,MAAA,iBAAe,gBAAgB;;;"}
|
|
1
|
+
{"version":3,"file":"fluent-editor.cjs.js","sources":["../../src/fluent-editor.ts"],"sourcesContent":["import type { ExpandedQuillOptions, Module, Parchment as TypeParchment } from 'quill'\nimport type { IEditorConfig } from './config/types'\nimport Quill from 'quill'\nimport { FontStyle, LineHeightStyle, SizeStyle, TextIndentStyle } from './attributors'\nimport { CHANGE_LANGUAGE_EVENT, defaultLanguage, getListValue, ICONS_CONFIG, inputFile, LANG_CONF } from './config'\nimport Counter from './counter' // 字符统计\nimport CustomClipboard from './custom-clipboard' // 粘贴板\nimport CustomImage from './custom-image/BlotFormatter' // 图片\nimport { CustomImageSpec } from './custom-image/specs/CustomImageSpec' // 图片拉伸模块\nimport CustomUploader from './custom-uploader' // 上传\nimport Emoji from './emoji' // 表情\nimport FileModule from './file' // 文件\nimport { FormatPainter } from './format-painter'\nimport { fullscreenHandler } from './fullscreen/handler'\nimport Link from './link' // 超链接\nimport MathliveModule from './mathlive' // latex公式\nimport MathliveBlot from './mathlive/formats'\nimport Mention from './mention/Mention' // @提醒\nimport { Screenshot } from './screenshot'// 截图\nimport SoftBreak from './soft-break' // 软回车\nimport Strike from './strike' // 删除线\nimport CustomSyntax from './syntax' // 代码块高亮\nimport BetterTable from './table/better-table' // 表格\nimport Toolbar, { ToolbarTip } from './toolbar' // 工具栏\nimport { isUndefined } from './utils/is'\nimport Video from './video' // 视频\n// import GlobalLink from './global-link' // 全局链接\n// import QuickMenu from './quick-menu' // 快捷菜单\nexport interface I18NOptions {\n lang: string\n langText: Record<string, string>\n}\nfunction resolveLanguageOption(options: Partial<I18NOptions>): I18NOptions {\n if (isUndefined(options.lang)) {\n options.lang = defaultLanguage\n }\n if (!(options.lang in LANG_CONF)) {\n console.warn(`The language ${options.lang} is not supported. Use the default language: ${defaultLanguage}`)\n options.lang = defaultLanguage\n }\n return {\n lang: options.lang,\n langText: Object.assign({}, LANG_CONF[options.lang], options.langText || {}),\n }\n}\nexport class FluentEditor extends Quill {\n isFullscreen: boolean = false\n options: IEditorConfig & ExpandedQuillOptions\n constructor(container: HTMLElement | string, options: IEditorConfig = {}) {\n options = Object.assign(options, resolveLanguageOption(options || {}))\n super(container, options)\n }\n\n changeLanguage(options: Partial<I18NOptions>) {\n const langOps = resolveLanguageOption(options)\n if (langOps.lang === this.options.lang) return\n this.options.lang = langOps.lang\n this.options.langText = langOps.langText\n this.emitter.emit(CHANGE_LANGUAGE_EVENT, this.options.lang, this.options.langText)\n }\n}\n\nconst registerModules = function () {\n const Icons = Quill.import('ui/icons')\n Object.entries(ICONS_CONFIG).forEach(([key, icon]) => {\n Icons[key] = icon\n })\n\n const SnowTheme = Quill.imports['themes/snow'] as typeof Module\n SnowTheme.DEFAULTS = {\n modules: {\n 'keyboard': {\n bindings: {\n ...BetterTable.keyboardBindings,\n },\n },\n 'toolbar': {\n handlers: {\n ...(SnowTheme.DEFAULTS as Record<string, any>).modules.toolbar.handlers,\n 'formula': function () {\n if (!this.quill.isEnabled()) return\n const mathlive = this.quill.getModule('mathlive')\n if (!mathlive) {\n this.quill.theme.tooltip.edit('formula')\n }\n else {\n mathlive.createDialog()\n }\n },\n 'undo': function () {\n this.quill.history.undo()\n },\n 'redo': function () {\n this.quill.history.redo()\n },\n 'better-table': function () {\n this.quill.getModule('better-table').insertTable(3, 3)\n },\n 'file': function () {\n const accept = this.quill.options?.uploadOption?.fileAccept\n inputFile.call(this, 'file', accept)\n },\n 'image': function () {\n const accept = this.quill.options?.uploadOption?.imageAccept\n inputFile.call(this, 'image', accept)\n },\n 'emoji': function () {},\n 'fullscreen': fullscreenHandler,\n 'list': function (value) {\n const range = this.quill.getSelection()\n const formats = this.quill.getFormat(range)\n const preListValue = Array.isArray(formats.list) ? formats.list[0]?.value : formats.list?.value\n const curListValue = getListValue(value, preListValue)\n // 如果设置list的选区中有表格,判断第一个table-col位置,将表格前的内容设置为list格式\n const lines = this.quill.getLines(range.index, range.length)\n const tableCols = lines.filter(line => line.statics.blotName === 'table-col' && !line.prev)\n if (tableCols.length) {\n let start = range.index\n // 遍历table-col群组,以之获取表格,将表格前选区设置为对应list格式\n tableCols.forEach((item, index) => {\n const table = item.domNode.closest('table.quill-better-table')\n const tableBlot = Quill.find(table) as TypeParchment.Blot\n const tableLength = tableBlot.length()\n const tableStart = this.quill.getIndex(item)\n const tableEnd = tableStart + tableLength\n const beforeTableRangeLength = tableStart - start\n // 在表格前设置列表\n this.quill.setSelection(start, beforeTableRangeLength, Quill.sources.SILENT)\n this.quill.format('list', curListValue, Quill.sources.USER)\n table.parentNode.classList.remove('quill-better-table-selected')\n // 当前表格末尾为下一个选取的开始\n start = tableEnd\n if (index === tableCols.length - 1) {\n // 将最后一个表格之后所有选区内容设置list格式\n this.quill.setSelection(tableEnd, range.index + range.length - tableEnd)\n this.quill.format('list', curListValue, Quill.sources.USER)\n }\n })\n }\n else {\n this.quill.format('list', curListValue, Quill.sources.USER)\n }\n },\n [FormatPainter.toolName]: FormatPainter,\n [Screenshot.toolName]: Screenshot,\n },\n },\n 'better-table': {\n operationMenu: {\n color: true,\n },\n },\n 'image': {\n specs: [CustomImageSpec],\n overlay: {\n style: {\n border: '1px dashed rgb(68, 68, 68)',\n },\n },\n align: {\n icons: {\n left: '<i class=\"icon-text-align-left\"></i>',\n center: '<i class=\"icon-text-align-center\"></i>',\n right: '<i class=\"icon-text-align-right\"></i>',\n },\n },\n },\n [ToolbarTip.moduleName]: true,\n },\n }\n\n FluentEditor.register(\n {\n 'modules/toolbar': Toolbar,\n 'modules/mention': Mention,\n 'modules/better-table': BetterTable,\n 'modules/clipboard': CustomClipboard,\n 'modules/uploader': CustomUploader, // 三者关联性最强\n 'modules/image': CustomImage, // 三者关联性最强\n 'modules/file': FileModule, // 三者关联性最强\n 'modules/counter': Counter,\n 'modules/emoji-toolbar': Emoji.ToolbarEmoji,\n 'modules/emoji-shortname': Emoji.ShortNameEmoji,\n // 'modules/global-link': GlobalLink,//暂未开发\n 'modules/link': Link, // 报错\n // 'modules/quickmenu': QuickMenu,//暂未开发\n 'modules/syntax': CustomSyntax,\n 'modules/mathlive': MathliveModule,\n [`modules/${ToolbarTip.moduleName}`]: ToolbarTip,\n\n 'formats/strike': Strike,\n 'formats/softBreak': SoftBreak,\n 'formats/video': Video,\n 'formats/emoji': Emoji.EmojiBlot,\n 'formats/font': FontStyle,\n 'formats/size': SizeStyle,\n 'formats/line-height': LineHeightStyle,\n 'formats/text-indent': TextIndentStyle,\n [`formats/${MathliveBlot.blotName}`]: MathliveBlot,\n },\n true, // 覆盖内部模块\n )\n\n return FluentEditor\n}\n\nexport default registerModules()\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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.cjs.js","sources":["../../../src/global-link/constants.ts"],"sourcesContent":["export const ON_WIKI_LINK_REMOVE = 'wiki-link/remove'\
|
|
1
|
+
{"version":3,"file":"constants.cjs.js","sources":["../../../src/global-link/constants.ts"],"sourcesContent":["export const ON_WIKI_LINK_REMOVE = 'wiki-link/remove'\nexport const ON_DOC_LINK_REMOVE = 'doc-link/remove'\nexport const ON_WORK_ITEM_LINK_REMOVE = 'work-item-link/remove'\n"],"names":[],"mappings":";;AAAO,MAAM,sBAAsB;AAC5B,MAAM,qBAAqB;AAC3B,MAAM,2BAA2B;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customer-widget-link.cjs.js","sources":["../../../../src/global-link/formats/customer-widget-link.ts"],"sourcesContent":["import Quill from 'quill'\
|
|
1
|
+
{"version":3,"file":"customer-widget-link.cjs.js","sources":["../../../../src/global-link/formats/customer-widget-link.ts"],"sourcesContent":["import Quill from 'quill'\n\nconst BlockEmbed = Quill.imports['blots/block/embed']\n\n// @dynamic\nclass CustomerWidgetLink extends BlockEmbed {\n static blotName: string\n static tagName: string\n static className: string\n\n static create(value) {\n const node = super.create(value)\n node.setAttribute('data-widget-type', value.type)\n node.setAttribute('data-widget-id', value.id)\n node.setAttribute('src', value.value)\n return node\n }\n\n static value(domNode) {\n return {\n type: domNode.getAttribute('data-widget-type'),\n id: domNode.getAttribute('data-widget-id'),\n value: domNode.getAttribute('src'),\n }\n }\n\n constructor(scroll, domNode, data) {\n super(scroll, domNode, data)\n }\n}\n\nCustomerWidgetLink.blotName = 'customer-widget-link'\nCustomerWidgetLink.tagName = 'img'\nCustomerWidgetLink.className = 'ql-customer-widget-link'\n\nexport default CustomerWidgetLink\n"],"names":[],"mappings":";;;AAEA,MAAM,aAAa,MAAM,QAAQ,mBAAmB;AAGpD,MAAM,2BAA2B,WAAW;AAAA,EAK1C,OAAO,OAAO,OAAO;AACb,UAAA,OAAO,MAAM,OAAO,KAAK;AAC1B,SAAA,aAAa,oBAAoB,MAAM,IAAI;AAC3C,SAAA,aAAa,kBAAkB,MAAM,EAAE;AACvC,SAAA,aAAa,OAAO,MAAM,KAAK;AAC7B,WAAA;AAAA,EACT;AAAA,EAEA,OAAO,MAAM,SAAS;AACb,WAAA;AAAA,MACL,MAAM,QAAQ,aAAa,kBAAkB;AAAA,MAC7C,IAAI,QAAQ,aAAa,gBAAgB;AAAA,MACzC,OAAO,QAAQ,aAAa,KAAK;AAAA,IAAA;AAAA,EAErC;AAAA,EAEA,YAAY,QAAQ,SAAS,MAAM;AAC3B,UAAA,QAAQ,SAAS,IAAI;AAAA,EAC7B;AACF;AAEA,mBAAmB,WAAW;AAC9B,mBAAmB,UAAU;AAC7B,mBAAmB,YAAY;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doc-link.cjs.js","sources":["../../../../src/global-link/formats/doc-link.ts"],"sourcesContent":["import Quill from 'quill'\
|
|
1
|
+
{"version":3,"file":"doc-link.cjs.js","sources":["../../../../src/global-link/formats/doc-link.ts"],"sourcesContent":["import Quill from 'quill'\nimport { ON_DOC_LINK_REMOVE } from '../constants'\n\nconst Embed = Quill.imports['blots/embed']\n\n// @dynamic\nclass DocumentLink extends Embed {\n static blotName: string\n static tagName: string\n static className: string\n docData: any\n scroll: any\n\n static create(value) {\n const node = super.create(value)\n node.setAttribute('href', value.link)\n node.setAttribute('title', value.text)\n node.setAttribute('target', '_blank')\n node.setAttribute('icon-link', value.icon)\n\n const icon = document.createElement('span')\n icon.classList.add('ql-doc-link-icon')\n icon.style.background = `url(${value.icon}) no-repeat center`\n icon.style.backgroundSize = 'contain'\n\n node.insertAdjacentElement('afterbegin', icon)\n const text = document.createTextNode(value.text)\n node.appendChild(text)\n return node\n }\n\n static value(domNode) {\n return {\n link: domNode.getAttribute('href'),\n icon: domNode.getAttribute('icon-link'),\n text: domNode.textContent,\n }\n }\n\n constructor(scroll, domNode, data) {\n super(scroll, domNode, data)\n this.docData = data\n }\n\n remove() {\n this.scroll.emitter.emit(ON_DOC_LINK_REMOVE, this.docData)\n return super.remove()\n }\n}\n\nDocumentLink.blotName = 'doc-link'\nDocumentLink.tagName = 'A'\nDocumentLink.className = 'ql-doc-link'\n\nexport default DocumentLink\n"],"names":["ON_DOC_LINK_REMOVE"],"mappings":";;;;AAGA,MAAM,QAAQ,MAAM,QAAQ,aAAa;AAGzC,MAAM,qBAAqB,MAAM;AAAA,EAO/B,OAAO,OAAO,OAAO;AACb,UAAA,OAAO,MAAM,OAAO,KAAK;AAC1B,SAAA,aAAa,QAAQ,MAAM,IAAI;AAC/B,SAAA,aAAa,SAAS,MAAM,IAAI;AAChC,SAAA,aAAa,UAAU,QAAQ;AAC/B,SAAA,aAAa,aAAa,MAAM,IAAI;AAEnC,UAAA,OAAO,SAAS,cAAc,MAAM;AACrC,SAAA,UAAU,IAAI,kBAAkB;AACrC,SAAK,MAAM,aAAa,OAAO,MAAM,IAAI;AACzC,SAAK,MAAM,iBAAiB;AAEvB,SAAA,sBAAsB,cAAc,IAAI;AAC7C,UAAM,OAAO,SAAS,eAAe,MAAM,IAAI;AAC/C,SAAK,YAAY,IAAI;AACd,WAAA;AAAA,EACT;AAAA,EAEA,OAAO,MAAM,SAAS;AACb,WAAA;AAAA,MACL,MAAM,QAAQ,aAAa,MAAM;AAAA,MACjC,MAAM,QAAQ,aAAa,WAAW;AAAA,MACtC,MAAM,QAAQ;AAAA,IAAA;AAAA,EAElB;AAAA,EAEA,YAAY,QAAQ,SAAS,MAAM;AAC3B,UAAA,QAAQ,SAAS,IAAI;AAC3B,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,SAAS;AACP,SAAK,OAAO,QAAQ,KAAKA,UAAAA,oBAAoB,KAAK,OAAO;AACzD,WAAO,MAAM;EACf;AACF;AAEA,aAAa,WAAW;AACxB,aAAa,UAAU;AACvB,aAAa,YAAY;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wiki-link.cjs.js","sources":["../../../../src/global-link/formats/wiki-link.ts"],"sourcesContent":["import Quill from 'quill'\
|
|
1
|
+
{"version":3,"file":"wiki-link.cjs.js","sources":["../../../../src/global-link/formats/wiki-link.ts"],"sourcesContent":["import Quill from 'quill'\nimport { ON_WIKI_LINK_REMOVE } from '../constants'\n\nconst Embed = Quill.imports['blots/embed']\n\n// @dynamic\nclass WikiLink extends Embed {\n static blotName: string\n static tagName: string\n static className: string\n wikiData: any\n scroll: any\n\n static create(value) {\n const node = super.create(value)\n node.setAttribute('href', value.link)\n node.setAttribute('target', '_blank')\n node.setAttribute('title', value.text)\n node.textContent = value.text\n return node\n }\n\n static value(domNode) {\n return {\n link: domNode.getAttribute('href'),\n text: domNode.textContent,\n }\n }\n\n constructor(scroll, domNode, data) {\n super(scroll, domNode, data)\n this.wikiData = data\n }\n\n remove() {\n this.scroll.emitter.emit(ON_WIKI_LINK_REMOVE, this.wikiData)\n return super.remove()\n }\n}\n\nWikiLink.blotName = 'wiki-link'\nWikiLink.tagName = 'A'\nWikiLink.className = 'ql-wiki-link'\n\nexport default WikiLink\n"],"names":["ON_WIKI_LINK_REMOVE"],"mappings":";;;;AAGA,MAAM,QAAQ,MAAM,QAAQ,aAAa;AAGzC,MAAM,iBAAiB,MAAM;AAAA,EAO3B,OAAO,OAAO,OAAO;AACb,UAAA,OAAO,MAAM,OAAO,KAAK;AAC1B,SAAA,aAAa,QAAQ,MAAM,IAAI;AAC/B,SAAA,aAAa,UAAU,QAAQ;AAC/B,SAAA,aAAa,SAAS,MAAM,IAAI;AACrC,SAAK,cAAc,MAAM;AAClB,WAAA;AAAA,EACT;AAAA,EAEA,OAAO,MAAM,SAAS;AACb,WAAA;AAAA,MACL,MAAM,QAAQ,aAAa,MAAM;AAAA,MACjC,MAAM,QAAQ;AAAA,IAAA;AAAA,EAElB;AAAA,EAEA,YAAY,QAAQ,SAAS,MAAM;AAC3B,UAAA,QAAQ,SAAS,IAAI;AAC3B,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,SAAS;AACP,SAAK,OAAO,QAAQ,KAAKA,UAAAA,qBAAqB,KAAK,QAAQ;AAC3D,WAAO,MAAM;EACf;AACF;AAEA,SAAS,WAAW;AACpB,SAAS,UAAU;AACnB,SAAS,YAAY;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"work-item-link.cjs.js","sources":["../../../../src/global-link/formats/work-item-link.ts"],"sourcesContent":["import Quill from 'quill'\
|
|
1
|
+
{"version":3,"file":"work-item-link.cjs.js","sources":["../../../../src/global-link/formats/work-item-link.ts"],"sourcesContent":["import Quill from 'quill'\nimport { ON_WORK_ITEM_LINK_REMOVE } from '../constants'\nimport { createTable } from '../utils/createTable'\n\nconst BlockEmbed = Quill.imports['blots/block/embed']\n\n// @dynamic\nclass WorkItemLink extends BlockEmbed {\n static blotName: string\n static tagName: string\n static className: string\n workItemData: any\n scroll: any\n\n static create(value) {\n const node = super.create(value)\n node.setAttribute('contenteditable', 'false')\n node.setAttribute('href', value.link)\n node.setAttribute('__work_item_data__', JSON.stringify(value.data))\n const table = createTable(value.data)\n node.appendChild(table)\n return node\n }\n\n static value(domNode) {\n return {\n link: domNode.getAttribute('href'),\n data: JSON.parse(domNode.getAttribute('__work_item_data__')),\n }\n }\n\n constructor(scroll, domNode, data) {\n super(scroll, domNode, data)\n this.workItemData = data\n }\n\n remove() {\n this.scroll.emitter.emit(ON_WORK_ITEM_LINK_REMOVE, this.workItemData)\n return super.remove()\n }\n}\n\nWorkItemLink.blotName = 'work-item-link'\nWorkItemLink.tagName = 'div'\nWorkItemLink.className = 'ql-work-item-link'\n\nexport default WorkItemLink\n"],"names":["createTable","ON_WORK_ITEM_LINK_REMOVE"],"mappings":";;;;;AAIA,MAAM,aAAa,MAAM,QAAQ,mBAAmB;AAGpD,MAAM,qBAAqB,WAAW;AAAA,EAOpC,OAAO,OAAO,OAAO;AACb,UAAA,OAAO,MAAM,OAAO,KAAK;AAC1B,SAAA,aAAa,mBAAmB,OAAO;AACvC,SAAA,aAAa,QAAQ,MAAM,IAAI;AACpC,SAAK,aAAa,sBAAsB,KAAK,UAAU,MAAM,IAAI,CAAC;AAC5D,UAAA,QAAQA,YAAAA,YAAY,MAAM,IAAI;AACpC,SAAK,YAAY,KAAK;AACf,WAAA;AAAA,EACT;AAAA,EAEA,OAAO,MAAM,SAAS;AACb,WAAA;AAAA,MACL,MAAM,QAAQ,aAAa,MAAM;AAAA,MACjC,MAAM,KAAK,MAAM,QAAQ,aAAa,oBAAoB,CAAC;AAAA,IAAA;AAAA,EAE/D;AAAA,EAEA,YAAY,QAAQ,SAAS,MAAM;AAC3B,UAAA,QAAQ,SAAS,IAAI;AAC3B,SAAK,eAAe;AAAA,EACtB;AAAA,EAEA,SAAS;AACP,SAAK,OAAO,QAAQ,KAAKC,UAAAA,0BAA0B,KAAK,YAAY;AACpE,WAAO,MAAM;EACf;AACF;AAEA,aAAa,WAAW;AACxB,aAAa,UAAU;AACvB,aAAa,YAAY;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../../src/global-link/index.ts"],"sourcesContent":["import Quill from 'quill'\
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/global-link/index.ts"],"sourcesContent":["import Quill from 'quill'\nimport { getEventComposedPath } from '../config/editor.utils'\nimport CustomerWidgetLink from './formats/customer-widget-link'\nimport DocumentLink from './formats/doc-link'\nimport WikiLink from './formats/wiki-link'\nimport WorkItemLink from './formats/work-item-link'\n\nconst Module = Quill.imports['core/module']\nconst Delta = Quill.imports.delta\n\n// @dynamic\nclass GlobalLink extends Module {\n open: boolean\n wrap: any\n panel: any\n quill: any\n\n static register() {\n Quill.register('formats/wiki-link', WikiLink)\n Quill.register('formats/doc-link', DocumentLink)\n Quill.register('formats/work-item-link', WorkItemLink)\n Quill.register('formats/customer-widget-link', CustomerWidgetLink)\n }\n\n constructor(quill, options) {\n super(quill, options)\n const toolbar = quill.getModule('toolbar')\n this.open = false\n this.panel = options.component\n this.wrap = options.wrap\n const globalLinkBtn = toolbar.container && toolbar.container.querySelector('.ql-global-link')\n toolbar.addHandler('global-link', this.handleGlobalLinkButtonClick.bind(this))\n quill.root.addEventListener('click', this.onEditorClick.bind(this))\n document.body.addEventListener('click', (evt) => {\n if (!this.wrap.contains(evt.target) && !(globalLinkBtn && globalLinkBtn.contains(evt.target))) {\n this.open = false\n this.wrap.classList.add('global-link-hide')\n }\n })\n this.panel.wikiLink.subscribe(this.addWikiLink.bind(this))\n this.panel.docLink.subscribe(this.addDocLink.bind(this))\n this.panel.workItemLink.subscribe(this.addWorkItemLink.bind(this))\n if (this.panel.close) {\n this.panel.close.subscribe(this.closePanel.bind(this))\n }\n }\n\n onEditorClick(evt: any) {\n if (!evt.ctrlKey) return\n const path = getEventComposedPath(evt)\n if (!path || path.length <= 0) return\n const linkNode = path.filter((node) => {\n return node.classList && (node.classList.contains(WikiLink.className)\n || node.classList.contains(DocumentLink.className)\n || node.classList.contains(WorkItemLink.className))\n })[0]\n\n if (!linkNode) return\n\n if (linkNode.classList.contains(WikiLink.className)) {\n this.handleLinkClick(linkNode)\n }\n else if (linkNode.classList.contains(DocumentLink.className)) {\n this.handleLinkClick(linkNode)\n }\n else if (linkNode.classList.contains(WorkItemLink.className)) {\n const tableRow = path.filter((node) => {\n return node.tagName && node.tagName.toUpperCase() === 'TR'\n })[0]\n\n if (tableRow) {\n this.handleLinkClick(tableRow)\n }\n }\n }\n\n handleLinkClick(linkNode) {\n const href = linkNode.getAttribute('href')\n if (href) {\n window.open(href)\n }\n }\n\n handleGlobalLinkButtonClick(_value) {\n this.open = !this.open\n this.triggerPanel()\n }\n\n triggerPanel() {\n if (this.open) {\n this.wrap.classList.remove('global-link-hide')\n }\n else {\n this.wrap.classList.add('global-link-hide')\n }\n }\n\n addWikiLink(wikiData) {\n const index = this.quill.getSelection(true).index\n const arr: { link: any, text: any } [] = []\n const delta = arr.reduce.call(wikiData, (op: any, wiki) => {\n op.insert({\n [WikiLink.blotName]: {\n link: wiki.link,\n text: wiki.text,\n },\n })\n return op\n }, new Delta().retain(index))\n\n this.quill.updateContents(delta, Quill.sources.USER)\n this.quill.setSelection(index + 1, Quill.sources.USER)\n if (this.panel.autoClose) {\n this.closePanel()\n }\n }\n\n addDocLink(docData) {\n const index = this.quill.getSelection(true).index\n const arr: { link: any, text: any, icon: any } [] = []\n const delta = arr.reduce.call(docData, (op: any, doc) => {\n op.insert({\n [DocumentLink.blotName]: {\n link: doc.link,\n text: doc.text,\n icon: doc.icon,\n },\n })\n return op\n }, new Delta().retain(index))\n\n this.quill.updateContents(delta, Quill.sources.USER)\n this.quill.setSelection(index + 1, Quill.sources.USER)\n if (this.panel.autoClose) {\n this.closePanel()\n }\n }\n\n addWorkItemLink(workItemData) {\n const index = this.quill.getSelection(true).index\n const arr: { url: any, table: any } [] = []\n const delta = arr.reduce.call(workItemData, (op: any, workItem) => {\n op.insert({\n [WorkItemLink.blotName]: {\n link: workItem.url,\n data: workItem.table,\n },\n })\n return op\n }, new Delta().retain(index))\n\n this.quill.updateContents(delta, Quill.sources.USER)\n this.quill.setSelection(index + 1, Quill.sources.USER)\n if (this.panel.autoClose) {\n this.closePanel()\n }\n }\n\n closePanel() {\n this.open = false\n this.triggerPanel()\n }\n}\n\nexport default GlobalLink\n"],"names":["WikiLink","DocumentLink","WorkItemLink","CustomerWidgetLink","getEventComposedPath"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createTable.cjs.js","sources":["../../../../src/global-link/utils/createTable.ts"],"sourcesContent":["const tableConfig = [\
|
|
1
|
+
{"version":3,"file":"createTable.cjs.js","sources":["../../../../src/global-link/utils/createTable.ts"],"sourcesContent":["const tableConfig = [\n { title: 'Number', field: 'id', width: '100' },\n { title: 'Title', field: 'subject', width: '200' },\n { title: 'Priority', field: 'priority', width: '100' },\n { title: 'Iteration', field: 'iteration', width: '100' },\n { title: 'Status', field: 'status', width: '100' },\n { title: 'Conductor', field: 'assigned_to', width: '100' },\n]\n\nexport function createTable(data: any[]) {\n const table = document.createElement<'table'>('table')\n createColGroup(table)\n createTableHead(table)\n createTableBody(table, data)\n return table\n}\n\nfunction createColGroup(table: HTMLTableElement) {\n const colGroup = document.createElement<'colgroup'>('colgroup')\n tableConfig.forEach(({ width }) => {\n const col = document.createElement<'col'>('col')\n col.setAttribute('width', width)\n colGroup.appendChild(col)\n })\n table.insertAdjacentElement('afterbegin', colGroup)\n}\n\nfunction createTableHead(table: HTMLTableElement) {\n const tHead = table.createTHead()\n const tRow = tHead.insertRow()\n tableConfig.forEach(({ title }) => {\n const tCell = tRow.insertCell()\n tCell.textContent = title\n })\n return tHead\n}\n\nfunction createTableBody(table: HTMLTableElement, data: any[]) {\n const tBody = table.createTBody();\n\n [].forEach.call(data, (d) => {\n const tRow = tBody.insertRow()\n // @ts-ignore\n tRow.setAttribute('href', d.url)\n tableConfig.forEach(({ field }) => {\n const tCell = tRow.insertCell()\n tCell.classList.add(`work-item-${field}`)\n // @ts-ignore\n tCell.textContent = d[field]\n })\n })\n\n return tBody\n}\n"],"names":[],"mappings":";;AAAA,MAAM,cAAc;AAAA,EAClB,EAAE,OAAO,UAAU,OAAO,MAAM,OAAO,MAAM;AAAA,EAC7C,EAAE,OAAO,SAAS,OAAO,WAAW,OAAO,MAAM;AAAA,EACjD,EAAE,OAAO,YAAY,OAAO,YAAY,OAAO,MAAM;AAAA,EACrD,EAAE,OAAO,aAAa,OAAO,aAAa,OAAO,MAAM;AAAA,EACvD,EAAE,OAAO,UAAU,OAAO,UAAU,OAAO,MAAM;AAAA,EACjD,EAAE,OAAO,aAAa,OAAO,eAAe,OAAO,MAAM;AAC3D;AAEO,SAAS,YAAY,MAAa;AACjC,QAAA,QAAQ,SAAS,cAAuB,OAAO;AACrD,iBAAe,KAAK;AACpB,kBAAgB,KAAK;AACrB,kBAAgB,OAAO,IAAI;AACpB,SAAA;AACT;AAEA,SAAS,eAAe,OAAyB;AACzC,QAAA,WAAW,SAAS,cAA0B,UAAU;AAC9D,cAAY,QAAQ,CAAC,EAAE,YAAY;AAC3B,UAAA,MAAM,SAAS,cAAqB,KAAK;AAC3C,QAAA,aAAa,SAAS,KAAK;AAC/B,aAAS,YAAY,GAAG;AAAA,EAAA,CACzB;AACK,QAAA,sBAAsB,cAAc,QAAQ;AACpD;AAEA,SAAS,gBAAgB,OAAyB;AAC1C,QAAA,QAAQ,MAAM;AACd,QAAA,OAAO,MAAM;AACnB,cAAY,QAAQ,CAAC,EAAE,YAAY;AAC3B,UAAA,QAAQ,KAAK;AACnB,UAAM,cAAc;AAAA,EAAA,CACrB;AACM,SAAA;AACT;AAEA,SAAS,gBAAgB,OAAyB,MAAa;AACvD,QAAA,QAAQ,MAAM;AAEpB,GAAA,EAAG,QAAQ,KAAK,MAAM,CAAC,MAAM;AACrB,UAAA,OAAO,MAAM;AAEd,SAAA,aAAa,QAAQ,EAAE,GAAG;AAC/B,gBAAY,QAAQ,CAAC,EAAE,YAAY;AAC3B,YAAA,QAAQ,KAAK;AACnB,YAAM,UAAU,IAAI,aAAa,KAAK,EAAE;AAElC,YAAA,cAAc,EAAE,KAAK;AAAA,IAAA,CAC5B;AAAA,EAAA,CACF;AAEM,SAAA;AACT;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"link.cjs.js","sources":["../../../../src/link/formats/link.ts"],"sourcesContent":["import type TypeInline from 'quill/blots/inline'\
|
|
1
|
+
{"version":3,"file":"link.cjs.js","sources":["../../../../src/link/formats/link.ts"],"sourcesContent":["import type TypeInline from 'quill/blots/inline'\nimport Quill from 'quill'\nimport { hadProtocol, sanitize } from '../../config/editor.utils'\n\nconst Inline = Quill.import('blots/inline') as typeof TypeInline\n\n// @dynamic\nexport default class Link extends Inline {\n static blotName: string\n static tagName: string\n static SANITIZED_URL: string\n static PROTOCOL_WHITELIST: string[]\n static className: string\n static autoProtocol: string = ''\n static create(value) {\n const node = super.create(value)\n let href = value\n if (!hadProtocol(href) && this.autoProtocol) {\n href = `${this.autoProtocol}://${value}`\n }\n href = this.sanitize(href)\n node.setAttribute('href', href)\n node.setAttribute('target', '_blank')\n return node\n }\n\n static formats(domNode) {\n return domNode.getAttribute('href')\n }\n\n static sanitize(url) {\n return sanitize(url, this.PROTOCOL_WHITELIST) ? url : this.SANITIZED_URL\n }\n\n format(name, value) {\n if (name !== this.statics.blotName || [false, null].includes(value)) {\n super.format(name, value)\n }\n else {\n this.domNode.setAttribute('href', Link.sanitize(value))\n }\n }\n}\nLink.blotName = 'link'\nLink.tagName = 'A'\nLink.SANITIZED_URL = 'about:blank'\nLink.PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel']\nLink.className = 'ql-normal-link'\n"],"names":["hadProtocol","sanitize","Link"],"mappings":";;;;;AAIA,MAAM,SAAS,MAAM,OAAO,cAAc;cAG1C,mBAAkC,OAAO;AAAA,EAOvC,OAAO,OAAO,OAAO;AACb,UAAA,OAAO,MAAM,OAAO,KAAK;AAC/B,QAAI,OAAO;AACX,QAAI,CAACA,aAAAA,YAAY,IAAI,KAAK,KAAK,cAAc;AAC3C,aAAO,GAAG,KAAK,YAAY,MAAM,KAAK;AAAA,IACxC;AACO,WAAA,KAAK,SAAS,IAAI;AACpB,SAAA,aAAa,QAAQ,IAAI;AACzB,SAAA,aAAa,UAAU,QAAQ;AAC7B,WAAA;AAAA,EACT;AAAA,EAEA,OAAO,QAAQ,SAAS;AACf,WAAA,QAAQ,aAAa,MAAM;AAAA,EACpC;AAAA,EAEA,OAAO,SAAS,KAAK;AACnB,WAAOC,aAAAA,SAAS,KAAK,KAAK,kBAAkB,IAAI,MAAM,KAAK;AAAA,EAC7D;AAAA,EAEA,OAAO,MAAM,OAAO;AACd,QAAA,SAAS,KAAK,QAAQ,YAAY,CAAC,OAAO,IAAI,EAAE,SAAS,KAAK,GAAG;AAC7D,YAAA,OAAO,MAAM,KAAK;AAAA,IAAA,OAErB;AACH,WAAK,QAAQ,aAAa,QAAQ,GAAK,SAAS,KAAK,CAAC;AAAA,IACxD;AAAA,EACF;AACF,GA7BE,GAAO,eAAuB,IANhC;AAoCAC,OAAK,WAAW;AAChBA,OAAK,UAAU;AACfA,OAAK,gBAAgB;AACrBA,OAAK,qBAAqB,CAAC,QAAQ,SAAS,UAAU,KAAK;AAC3DA,OAAK,YAAY;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../../src/link/index.ts"],"sourcesContent":["import Quill from 'quill'\
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/link/index.ts"],"sourcesContent":["import Quill from 'quill'\nimport LinkBlot from './formats/link'\nimport Tooltip from './modules/tooltip'\n\nconst icons = Quill.import('ui/icons')\nconst SnowTheme = Quill.import('themes/snow')\nconst Module = Quill.import('core/module')\n\n// @dynamic\nclass Link extends Module {\n static register() {\n Quill.register('blots/link', LinkBlot, true)\n }\n\n constructor(quill, options) {\n super(quill, options)\n }\n}\n\n// @ts-expect-error\nSnowTheme.prototype.extendToolbar = function (toolbar) {\n toolbar.container.classList.add('ql-snow')\n this.buildButtons(toolbar.container.querySelectorAll('button'), icons)\n this.buildPickers(toolbar.container.querySelectorAll('select'), icons)\n this.tooltip = new Tooltip(this.quill, this.options.bounds)\n if (toolbar.container.querySelector('.ql-link')) {\n this.quill.keyboard.addBinding(\n { key: 'k', shortKey: true },\n (_range, context) => {\n toolbar.handlers.link.call(toolbar, !context.format.link)\n },\n )\n }\n}\n\nexport default Link\n"],"names":["LinkBlot","Tooltip"],"mappings":";;;;;AAIA,MAAM,QAAQ,MAAM,OAAO,UAAU;AACrC,MAAM,YAAY,MAAM,OAAO,aAAa;AAC5C,MAAM,SAAS,MAAM,OAAO,aAAa;AAGzC,MAAM,aAAa,OAAO;AAAA,EACxB,OAAO,WAAW;AACV,UAAA,SAAS,cAAcA,KAAA,SAAU,IAAI;AAAA,EAC7C;AAAA,EAEA,YAAY,OAAO,SAAS;AAC1B,UAAM,OAAO,OAAO;AAAA,EACtB;AACF;AAGA,UAAU,UAAU,gBAAgB,SAAU,SAAS;AAC7C,UAAA,UAAU,UAAU,IAAI,SAAS;AACzC,OAAK,aAAa,QAAQ,UAAU,iBAAiB,QAAQ,GAAG,KAAK;AACrE,OAAK,aAAa,QAAQ,UAAU,iBAAiB,QAAQ,GAAG,KAAK;AACrE,OAAK,UAAU,IAAIC,gBAAQ,KAAK,OAAO,KAAK,QAAQ,MAAM;AAC1D,MAAI,QAAQ,UAAU,cAAc,UAAU,GAAG;AAC/C,SAAK,MAAM,SAAS;AAAA,MAClB,EAAE,KAAK,KAAK,UAAU,KAAK;AAAA,MAC3B,CAAC,QAAQ,YAAY;AACnB,gBAAQ,SAAS,KAAK,KAAK,SAAS,CAAC,QAAQ,OAAO,IAAI;AAAA,MAC1D;AAAA,IAAA;AAAA,EAEJ;AACF;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.cjs.js","sources":["../../../../src/link/modules/tooltip.ts"],"sourcesContent":["import Quill, { Range } from 'quill'\r\nimport Emitter from 'quill/core/emitter'\r\nimport { BaseTooltip } from 'quill/themes/base'\r\nimport { debounce } from '../../../src/utils/debounce'\r\nimport { CHANGE_LANGUAGE_EVENT, LANG_CONF } from '../../config'\r\nimport { hadProtocol, isNullOrUndefined } from '../../config/editor.utils'\r\nimport LinkBlot from '../formats/link'\r\n\r\n// @dynamic\r\nexport default class Tooltip extends BaseTooltip {\r\n static TEMPLATE: string = [\r\n `<input type=\"text\" data-formula=\"e=mc^2\" data-link=\"${LANG_CONF['en-US'].linkplaceholder}\" data-video=\"Embed URL\" style=\"width: 225px;\">`,\r\n '<span class=\"ql-split\"></span>',\r\n '<a class=\"ql-preview\"><i class=\"icon-share\"></i></a>',\r\n '<a class=\"ql-remove\"><i class=\"icon-delete\"></i></a>',\r\n ].join('')\r\n\r\n isInputFocus: boolean\r\n isHover: boolean\r\n debouncedHideToolTip: any\r\n debouncedShowToolTip: any\r\n hide: any\r\n linkRange: any\r\n quill: any\r\n root: any\r\n restoreFocus: any\r\n textbox: any\r\n boundsContainer: any\r\n options: { autoProtocol: string } = {\r\n autoProtocol: 'https',\r\n }\r\n\r\n constructor(quill, bounds) {\r\n super(quill, bounds)\r\n this.setTemplate()\r\n this.isInputFocus = false\r\n this.isHover = false\r\n\r\n this.resolveOptions()\r\n LinkBlot.autoProtocol = this.options.autoProtocol\r\n this.debouncedHideToolTip = debounce(this.hideToolTip, 300)\r\n this.debouncedShowToolTip = debounce(this.showToolTip, 300)\r\n this.quill.on(CHANGE_LANGUAGE_EVENT, () => {\r\n this.setTemplate()\r\n })\r\n }\r\n\r\n setTemplate() {\r\n this.root.innerHTML = [\r\n `<input type=\"text\" data-formula=\"e=mc^2\" data-link=\"${this.quill.options.langText?.linkplaceholder}\" data-video=\"Embed URL\" style=\"width: 225px;\">`,\r\n '<span class=\"ql-split\"></span>',\r\n '<a class=\"ql-preview\"><i class=\"icon-share\"></i></a>',\r\n '<a class=\"ql-remove\"><i class=\"icon-delete\"></i></a>',\r\n ].join('')\r\n this.textbox = this.root.querySelector('input[type=\"text\"]')\r\n this.listen()\r\n }\r\n\r\n resolveOptions() {\r\n this.options = {\r\n autoProtocol: 'https',\r\n }\r\n const value = this.quill.options.autoProtocol\r\n if (value && typeof value === 'string') {\r\n this.options.autoProtocol = value\r\n }\r\n else if (typeof value === 'boolean' && !value) {\r\n this.options.autoProtocol = ''\r\n }\r\n }\r\n\r\n shouldHide() {\r\n return !this.isHover && !this.isInputFocus\r\n }\r\n\r\n hideToolTip() {\r\n if (this.shouldHide()) {\r\n this.hide()\r\n }\r\n }\r\n\r\n showToolTip(name, value, range) {\r\n if (!this.shouldHide()) {\r\n this.edit(name, value, range)\r\n }\r\n }\r\n\r\n handleMouseLeave() {\r\n this.isHover = false\r\n this.debouncedHideToolTip()\r\n }\r\n\r\n handleMouseEnter(event) {\r\n const isTooltipShow = !this.root.classList.contains('ql-hidden')\r\n if (isTooltipShow) {\r\n return\r\n }\r\n\r\n if (this.isInputFocus) {\r\n this.save()\r\n }\r\n this.isHover = true\r\n const linkNode = event.target\r\n const preview = LinkBlot.formats(linkNode)\r\n if (preview.startsWith('#')) {\r\n return\r\n }\r\n const linkBlot = Quill.find(linkNode)\r\n const index = this.quill.getIndex(linkBlot)\r\n const [link, offset] = this.quill.scroll.descendant(\r\n LinkBlot,\r\n index,\r\n )\r\n const length = link && link.length()\r\n this.linkRange = new Range(index - offset, length)\r\n this.debouncedShowToolTip('link', preview, this.linkRange)\r\n }\r\n\r\n listen() {\r\n super.listen()\r\n this.root.querySelector('a.ql-remove').addEventListener('click', (event) => {\r\n if (!isNullOrUndefined(this.linkRange)) {\r\n const range = this.linkRange\r\n this.restoreFocus()\r\n this.quill.formatText(range, 'link', false, Emitter.sources.API)\r\n delete this.linkRange\r\n }\r\n event.preventDefault()\r\n this.hide()\r\n })\r\n\r\n this.quill.root.addEventListener(\r\n 'mouseover',\r\n (event) => {\r\n if (\r\n (event.target.tagName.toUpperCase() !== 'A'\r\n || !event.target.classList.contains(LinkBlot.className))\r\n && !event.target.closest(`a.${LinkBlot.className}`)\r\n ) {\r\n return\r\n }\r\n this.handleMouseEnter(event)\r\n },\r\n false,\r\n )\r\n\r\n this.quill.root.addEventListener(\r\n 'mouseout',\r\n (event) => {\r\n if (event.target.tagName.toUpperCase() !== 'A' && !event.target.closest(`a.${LinkBlot.className}`)) {\r\n return\r\n }\r\n this.handleMouseLeave()\r\n },\r\n false,\r\n )\r\n\r\n this.root.addEventListener(\r\n 'mouseenter',\r\n () => {\r\n this.isHover = true\r\n },\r\n false,\r\n )\r\n\r\n this.root.addEventListener('mouseleave', this.handleMouseLeave.bind(this), false)\r\n\r\n this.root.querySelector('a.ql-preview').addEventListener('click', (event) => {\r\n const link = LinkBlot.sanitize(this.textbox.value)\r\n window.open(link, '_blank')\r\n event.preventDefault()\r\n })\r\n this.root.querySelector('input[type=\"text\"]').addEventListener('focus', () => {\r\n this.isInputFocus = true\r\n })\r\n this.root.querySelector('input[type=\"text\"]').addEventListener('blur', () => {\r\n this.isInputFocus = false\r\n this.save()\r\n })\r\n this.quill.on(\r\n Emitter.events.SELECTION_CHANGE,\r\n (range, _oldRange, source) => {\r\n if (isNullOrUndefined(range)) return\r\n if (source === Emitter.sources.USER) {\r\n const [link, offset] = this.quill.scroll.descendant(\r\n LinkBlot,\r\n range.index,\r\n )\r\n\r\n if (!isNullOrUndefined(link)) {\r\n this.linkRange = new Range(range.index - offset, link.length())\r\n const preview = LinkBlot.formats(link.domNode)\r\n if (!preview.startsWith('#')) {\r\n this.edit('link', preview, this.linkRange)\r\n }\r\n return\r\n }\r\n }\r\n if (this.shouldHide()) {\r\n this.hide()\r\n }\r\n },\r\n )\r\n this.quill.on(\r\n Emitter.events.TEXT_CHANGE,\r\n () => {\r\n const selection = this.quill.getSelection()\r\n const index = selection && selection.index\r\n setTimeout(() => {\r\n const link = this.quill.scroll.descendant(\r\n LinkBlot,\r\n index,\r\n )[0]\r\n if (!link) {\r\n this.handleMouseLeave()\r\n }\r\n })\r\n },\r\n )\r\n }\r\n\r\n save() {\r\n let value = this.textbox.value\r\n if (!value) return\r\n this.textbox.value = ''\r\n switch (this.root.getAttribute('data-mode')) {\r\n case 'link': {\r\n const { scrollTop } = this.quill.root\r\n if (this.options.autoProtocol) {\r\n value = this.addHttpProtocol(value)\r\n }\r\n\r\n if (this.linkRange) {\r\n this.quill.formatText(\r\n this.linkRange,\r\n 'link',\r\n value,\r\n Emitter.sources.USER,\r\n )\r\n this.restoreFocus()\r\n }\r\n else {\r\n this.restoreFocus()\r\n this.quill.format('link', value, Emitter.sources.USER)\r\n }\r\n this.quill.root.scrollTop = scrollTop\r\n break\r\n }\r\n case 'formula': {\r\n const range = this.quill.getSelection(true)\r\n if (!isNullOrUndefined(range)) {\r\n const index = range.index + range.length\r\n this.quill.insertEmbed(\r\n index,\r\n this.root.getAttribute('data-mode'),\r\n value,\r\n Emitter.sources.USER,\r\n )\r\n if (this.root.getAttribute('data-mode') === 'formula') {\r\n this.quill.insertText(index + 1, ' ', Emitter.sources.USER)\r\n }\r\n this.quill.setSelection(index + 2, Emitter.sources.USER)\r\n }\r\n break\r\n }\r\n case 'video': {\r\n const range = this.quill.getSelection(true)\r\n this.quill.insertText(range.index, '\\n', Emitter.sources.USER)\r\n this.quill.insertEmbed(range.index + 1, 'video', { src: value }, Emitter.sources.USER)\r\n this.quill.insertText(range.index + 2, '\\n', Emitter.sources.USER)\r\n this.quill.setSelection(range.index + 3, Emitter.sources.SILENT)\r\n this.textbox.value = ''\r\n this.hide()\r\n break\r\n }\r\n default:\r\n }\r\n }\r\n\r\n position(reference) {\r\n const left = reference.left\r\n const top = reference.bottom + this.quill.root.scrollTop\r\n this.root.style.left = `${left}px`\r\n this.root.style.top = `${top}px`\r\n this.root.classList.remove('ql-flip')\r\n const containerBounds = this.boundsContainer.getBoundingClientRect()\r\n const rootBounds = this.root.getBoundingClientRect()\r\n let shift = 0\r\n if (rootBounds.right > containerBounds.right) {\r\n shift = containerBounds.right - rootBounds.right\r\n this.root.style.left = `${left + shift}px`\r\n }\r\n if (rootBounds.left < containerBounds.left) {\r\n shift = containerBounds.left - rootBounds.left\r\n this.root.style.left = `${left + shift}px`\r\n }\r\n if (rootBounds.bottom > containerBounds.bottom) {\r\n const height = rootBounds.bottom - rootBounds.top\r\n const verticalShift = reference.bottom - reference.top + height\r\n const fixedTop = top - verticalShift\r\n this.root.style.top = `${fixedTop < 0 ? this.quill.root.scrollTop + reference.top : fixedTop}px`\r\n this.root.classList.add('ql-flip')\r\n }\r\n return shift\r\n }\r\n\r\n // @ts-expect-error\r\n edit(mode: string = 'link', preview = null, range) {\r\n this.linkRange = range || this.quill.selection.savedRange\r\n this.root.classList.remove('ql-hidden')\r\n this.root.classList.add('ql-editing')\r\n if (!isNullOrUndefined(preview)) {\r\n this.textbox.value = preview\r\n }\r\n else if (mode !== this.root.getAttribute('data-mode')) {\r\n this.textbox.value = ''\r\n }\r\n this.position(this.quill.getBounds(range || this.quill.selection.savedRange))\r\n if (this.textbox.value === '') {\r\n this.textbox.focus()\r\n }\r\n this.textbox.setAttribute(\r\n 'placeholder',\r\n this.textbox.getAttribute(`data-${mode}`) || '',\r\n )\r\n this.root.setAttribute('data-mode', mode)\r\n }\r\n\r\n show() {\r\n super.show()\r\n this.root.removeAttribute('data-mode')\r\n }\r\n\r\n addHttpProtocol(url: string) {\r\n let result = url\r\n if (!url) {\r\n return ''\r\n }\r\n if (!hadProtocol(url)) {\r\n result = `${this.options.autoProtocol}://${url}`\r\n }\r\n return result\r\n }\r\n}\r\n"],"names":["BaseTooltip","LinkBlot","debounce","CHANGE_LANGUAGE_EVENT","link","Range","isNullOrUndefined","hadProtocol","LANG_CONF"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tooltip.cjs.js","sources":["../../../../src/link/modules/tooltip.ts"],"sourcesContent":["import Quill, { Range } from 'quill'\nimport Emitter from 'quill/core/emitter'\nimport { BaseTooltip } from 'quill/themes/base'\nimport { debounce } from '../../../src/utils/debounce'\nimport { CHANGE_LANGUAGE_EVENT, LANG_CONF } from '../../config'\nimport { hadProtocol, isNullOrUndefined } from '../../config/editor.utils'\nimport LinkBlot from '../formats/link'\n\n// @dynamic\nexport default class Tooltip extends BaseTooltip {\n static TEMPLATE: string = [\n `<input type=\"text\" data-formula=\"e=mc^2\" data-link=\"${LANG_CONF['en-US'].linkplaceholder}\" data-video=\"Embed URL\" style=\"width: 225px;\">`,\n '<span class=\"ql-split\"></span>',\n '<a class=\"ql-preview\"><i class=\"icon-share\"></i></a>',\n '<a class=\"ql-remove\"><i class=\"icon-delete\"></i></a>',\n ].join('')\n\n isInputFocus: boolean\n isHover: boolean\n debouncedHideToolTip: any\n debouncedShowToolTip: any\n hide: any\n linkRange: any\n quill: any\n root: any\n restoreFocus: any\n textbox: any\n boundsContainer: any\n options: { autoProtocol: string } = {\n autoProtocol: 'https',\n }\n\n constructor(quill, bounds) {\n super(quill, bounds)\n this.setTemplate()\n this.isInputFocus = false\n this.isHover = false\n\n this.resolveOptions()\n LinkBlot.autoProtocol = this.options.autoProtocol\n this.debouncedHideToolTip = debounce(this.hideToolTip, 300)\n this.debouncedShowToolTip = debounce(this.showToolTip, 300)\n this.quill.on(CHANGE_LANGUAGE_EVENT, () => {\n this.setTemplate()\n })\n }\n\n setTemplate() {\n this.root.innerHTML = [\n `<input type=\"text\" data-formula=\"e=mc^2\" data-link=\"${this.quill.options.langText?.linkplaceholder}\" data-video=\"Embed URL\" style=\"width: 225px;\">`,\n '<span class=\"ql-split\"></span>',\n '<a class=\"ql-preview\"><i class=\"icon-share\"></i></a>',\n '<a class=\"ql-remove\"><i class=\"icon-delete\"></i></a>',\n ].join('')\n this.textbox = this.root.querySelector('input[type=\"text\"]')\n this.listen()\n }\n\n resolveOptions() {\n this.options = {\n autoProtocol: 'https',\n }\n const value = this.quill.options.autoProtocol\n if (value && typeof value === 'string') {\n this.options.autoProtocol = value\n }\n else if (typeof value === 'boolean' && !value) {\n this.options.autoProtocol = ''\n }\n }\n\n shouldHide() {\n return !this.isHover && !this.isInputFocus\n }\n\n hideToolTip() {\n if (this.shouldHide()) {\n this.hide()\n }\n }\n\n showToolTip(name, value, range) {\n if (!this.shouldHide()) {\n this.edit(name, value, range)\n }\n }\n\n handleMouseLeave() {\n this.isHover = false\n this.debouncedHideToolTip()\n }\n\n handleMouseEnter(event) {\n const isTooltipShow = !this.root.classList.contains('ql-hidden')\n if (isTooltipShow) {\n return\n }\n\n if (this.isInputFocus) {\n this.save()\n }\n this.isHover = true\n const linkNode = event.target\n const preview = LinkBlot.formats(linkNode)\n if (preview.startsWith('#')) {\n return\n }\n const linkBlot = Quill.find(linkNode)\n const index = this.quill.getIndex(linkBlot)\n const [link, offset] = this.quill.scroll.descendant(\n LinkBlot,\n index,\n )\n const length = link && link.length()\n this.linkRange = new Range(index - offset, length)\n this.debouncedShowToolTip('link', preview, this.linkRange)\n }\n\n listen() {\n super.listen()\n this.root.querySelector('a.ql-remove').addEventListener('click', (event) => {\n if (!isNullOrUndefined(this.linkRange)) {\n const range = this.linkRange\n this.restoreFocus()\n this.quill.formatText(range, 'link', false, Emitter.sources.API)\n delete this.linkRange\n }\n event.preventDefault()\n this.hide()\n })\n\n this.quill.root.addEventListener(\n 'mouseover',\n (event) => {\n if (\n (event.target.tagName.toUpperCase() !== 'A'\n || !event.target.classList.contains(LinkBlot.className))\n && !event.target.closest(`a.${LinkBlot.className}`)\n ) {\n return\n }\n this.handleMouseEnter(event)\n },\n false,\n )\n\n this.quill.root.addEventListener(\n 'mouseout',\n (event) => {\n if (event.target.tagName.toUpperCase() !== 'A' && !event.target.closest(`a.${LinkBlot.className}`)) {\n return\n }\n this.handleMouseLeave()\n },\n false,\n )\n\n this.root.addEventListener(\n 'mouseenter',\n () => {\n this.isHover = true\n },\n false,\n )\n\n this.root.addEventListener('mouseleave', this.handleMouseLeave.bind(this), false)\n\n this.root.querySelector('a.ql-preview').addEventListener('click', (event) => {\n const link = LinkBlot.sanitize(this.textbox.value)\n window.open(link, '_blank')\n event.preventDefault()\n })\n this.root.querySelector('input[type=\"text\"]').addEventListener('focus', () => {\n this.isInputFocus = true\n })\n this.root.querySelector('input[type=\"text\"]').addEventListener('blur', () => {\n this.isInputFocus = false\n this.save()\n })\n this.quill.on(\n Emitter.events.SELECTION_CHANGE,\n (range, _oldRange, source) => {\n if (isNullOrUndefined(range)) return\n if (source === Emitter.sources.USER) {\n const [link, offset] = this.quill.scroll.descendant(\n LinkBlot,\n range.index,\n )\n\n if (!isNullOrUndefined(link)) {\n this.linkRange = new Range(range.index - offset, link.length())\n const preview = LinkBlot.formats(link.domNode)\n if (!preview.startsWith('#')) {\n this.edit('link', preview, this.linkRange)\n }\n return\n }\n }\n if (this.shouldHide()) {\n this.hide()\n }\n },\n )\n this.quill.on(\n Emitter.events.TEXT_CHANGE,\n () => {\n const selection = this.quill.getSelection()\n const index = selection && selection.index\n setTimeout(() => {\n const link = this.quill.scroll.descendant(\n LinkBlot,\n index,\n )[0]\n if (!link) {\n this.handleMouseLeave()\n }\n })\n },\n )\n }\n\n save() {\n let value = this.textbox.value\n if (!value) return\n this.textbox.value = ''\n switch (this.root.getAttribute('data-mode')) {\n case 'link': {\n const { scrollTop } = this.quill.root\n if (this.options.autoProtocol) {\n value = this.addHttpProtocol(value)\n }\n\n if (this.linkRange) {\n this.quill.formatText(\n this.linkRange,\n 'link',\n value,\n Emitter.sources.USER,\n )\n this.restoreFocus()\n }\n else {\n this.restoreFocus()\n this.quill.format('link', value, Emitter.sources.USER)\n }\n this.quill.root.scrollTop = scrollTop\n break\n }\n case 'formula': {\n const range = this.quill.getSelection(true)\n if (!isNullOrUndefined(range)) {\n const index = range.index + range.length\n this.quill.insertEmbed(\n index,\n this.root.getAttribute('data-mode'),\n value,\n Emitter.sources.USER,\n )\n if (this.root.getAttribute('data-mode') === 'formula') {\n this.quill.insertText(index + 1, ' ', Emitter.sources.USER)\n }\n this.quill.setSelection(index + 2, Emitter.sources.USER)\n }\n break\n }\n case 'video': {\n const range = this.quill.getSelection(true)\n this.quill.insertText(range.index, '\\n', Emitter.sources.USER)\n this.quill.insertEmbed(range.index + 1, 'video', { src: value }, Emitter.sources.USER)\n this.quill.insertText(range.index + 2, '\\n', Emitter.sources.USER)\n this.quill.setSelection(range.index + 3, Emitter.sources.SILENT)\n this.textbox.value = ''\n this.hide()\n break\n }\n default:\n }\n }\n\n position(reference) {\n const left = reference.left\n const top = reference.bottom + this.quill.root.scrollTop\n this.root.style.left = `${left}px`\n this.root.style.top = `${top}px`\n this.root.classList.remove('ql-flip')\n const containerBounds = this.boundsContainer.getBoundingClientRect()\n const rootBounds = this.root.getBoundingClientRect()\n let shift = 0\n if (rootBounds.right > containerBounds.right) {\n shift = containerBounds.right - rootBounds.right\n this.root.style.left = `${left + shift}px`\n }\n if (rootBounds.left < containerBounds.left) {\n shift = containerBounds.left - rootBounds.left\n this.root.style.left = `${left + shift}px`\n }\n if (rootBounds.bottom > containerBounds.bottom) {\n const height = rootBounds.bottom - rootBounds.top\n const verticalShift = reference.bottom - reference.top + height\n const fixedTop = top - verticalShift\n this.root.style.top = `${fixedTop < 0 ? this.quill.root.scrollTop + reference.top : fixedTop}px`\n this.root.classList.add('ql-flip')\n }\n return shift\n }\n\n // @ts-expect-error\n edit(mode: string = 'link', preview = null, range) {\n this.linkRange = range || this.quill.selection.savedRange\n this.root.classList.remove('ql-hidden')\n this.root.classList.add('ql-editing')\n if (!isNullOrUndefined(preview)) {\n this.textbox.value = preview\n }\n else if (mode !== this.root.getAttribute('data-mode')) {\n this.textbox.value = ''\n }\n this.position(this.quill.getBounds(range || this.quill.selection.savedRange))\n if (this.textbox.value === '') {\n this.textbox.focus()\n }\n this.textbox.setAttribute(\n 'placeholder',\n this.textbox.getAttribute(`data-${mode}`) || '',\n )\n this.root.setAttribute('data-mode', mode)\n }\n\n show() {\n super.show()\n this.root.removeAttribute('data-mode')\n }\n\n addHttpProtocol(url: string) {\n let result = url\n if (!url) {\n return ''\n }\n if (!hadProtocol(url)) {\n result = `${this.options.autoProtocol}://${url}`\n }\n return result\n }\n}\n"],"names":["BaseTooltip","LinkBlot","debounce","CHANGE_LANGUAGE_EVENT","link","Range","isNullOrUndefined","hadProtocol","LANG_CONF"],"mappings":";;;;;;;;;;AASA,MAAqB,WAArB,MAAqB,iBAAgBA,KAAAA,YAAY;AAAA,EAuB/C,YAAY,OAAO,QAAQ;AACzB,UAAM,OAAO,MAAM;AALe,SAAA,UAAA;AAAA,MAClC,cAAc;AAAA,IAAA;AAKd,SAAK,YAAY;AACjB,SAAK,eAAe;AACpB,SAAK,UAAU;AAEf,SAAK,eAAe;AACXC,SAAAA,QAAA,eAAe,KAAK,QAAQ;AACrC,SAAK,uBAAuBC,SAAA,SAAS,KAAK,aAAa,GAAG;AAC1D,SAAK,uBAAuBA,SAAA,SAAS,KAAK,aAAa,GAAG;AACrD,SAAA,MAAM,GAAGC,cAAAA,uBAAuB,MAAM;AACzC,WAAK,YAAY;AAAA,IAAA,CAClB;AAAA,EACH;AAAA,EAEA,cAAc;;AACZ,SAAK,KAAK,YAAY;AAAA,MACpB,wDAAuD,UAAK,MAAM,QAAQ,aAAnB,mBAA6B,eAAe;AAAA,MACnG;AAAA,MACA;AAAA,MACA;AAAA,IAAA,EACA,KAAK,EAAE;AACT,SAAK,UAAU,KAAK,KAAK,cAAc,oBAAoB;AAC3D,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,iBAAiB;AACf,SAAK,UAAU;AAAA,MACb,cAAc;AAAA,IAAA;AAEV,UAAA,QAAQ,KAAK,MAAM,QAAQ;AAC7B,QAAA,SAAS,OAAO,UAAU,UAAU;AACtC,WAAK,QAAQ,eAAe;AAAA,IAErB,WAAA,OAAO,UAAU,aAAa,CAAC,OAAO;AAC7C,WAAK,QAAQ,eAAe;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,aAAa;AACX,WAAO,CAAC,KAAK,WAAW,CAAC,KAAK;AAAA,EAChC;AAAA,EAEA,cAAc;AACR,QAAA,KAAK,cAAc;AACrB,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,YAAY,MAAM,OAAO,OAAO;AAC1B,QAAA,CAAC,KAAK,cAAc;AACjB,WAAA,KAAK,MAAM,OAAO,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,mBAAmB;AACjB,SAAK,UAAU;AACf,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEA,iBAAiB,OAAO;AACtB,UAAM,gBAAgB,CAAC,KAAK,KAAK,UAAU,SAAS,WAAW;AAC/D,QAAI,eAAe;AACjB;AAAA,IACF;AAEA,QAAI,KAAK,cAAc;AACrB,WAAK,KAAK;AAAA,IACZ;AACA,SAAK,UAAU;AACf,UAAM,WAAW,MAAM;AACjB,UAAA,UAAUF,KAAAA,QAAS,QAAQ,QAAQ;AACrC,QAAA,QAAQ,WAAW,GAAG,GAAG;AAC3B;AAAA,IACF;AACM,UAAA,WAAW,MAAM,KAAK,QAAQ;AACpC,UAAM,QAAQ,KAAK,MAAM,SAAS,QAAQ;AAC1C,UAAM,CAACG,QAAM,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,MACvCH,KAAA;AAAA,MACA;AAAA,IAAA;AAEI,UAAA,SAASG,UAAQA,OAAK,OAAO;AACnC,SAAK,YAAY,IAAIC,MAAAA,MAAM,QAAQ,QAAQ,MAAM;AACjD,SAAK,qBAAqB,QAAQ,SAAS,KAAK,SAAS;AAAA,EAC3D;AAAA,EAEA,SAAS;AACP,UAAM,OAAO;AACb,SAAK,KAAK,cAAc,aAAa,EAAE,iBAAiB,SAAS,CAAC,UAAU;AAC1E,UAAI,CAACC,aAAA,kBAAkB,KAAK,SAAS,GAAG;AACtC,cAAM,QAAQ,KAAK;AACnB,aAAK,aAAa;AAClB,aAAK,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,QAAQ,GAAG;AAC/D,eAAO,KAAK;AAAA,MACd;AACA,YAAM,eAAe;AACrB,WAAK,KAAK;AAAA,IAAA,CACX;AAED,SAAK,MAAM,KAAK;AAAA,MACd;AAAA,MACA,CAAC,UAAU;AAEN,aAAA,MAAM,OAAO,QAAQ,kBAAkB,OACnC,CAAC,MAAM,OAAO,UAAU,SAASL,aAAS,SAAS,MACrD,CAAC,MAAM,OAAO,QAAQ,KAAKA,KAAA,QAAS,SAAS,EAAE,GAClD;AACA;AAAA,QACF;AACA,aAAK,iBAAiB,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,IAAA;AAGF,SAAK,MAAM,KAAK;AAAA,MACd;AAAA,MACA,CAAC,UAAU;AACT,YAAI,MAAM,OAAO,QAAQ,kBAAkB,OAAO,CAAC,MAAM,OAAO,QAAQ,KAAKA,KAAS,QAAA,SAAS,EAAE,GAAG;AAClG;AAAA,QACF;AACA,aAAK,iBAAiB;AAAA,MACxB;AAAA,MACA;AAAA,IAAA;AAGF,SAAK,KAAK;AAAA,MACR;AAAA,MACA,MAAM;AACJ,aAAK,UAAU;AAAA,MACjB;AAAA,MACA;AAAA,IAAA;AAGG,SAAA,KAAK,iBAAiB,cAAc,KAAK,iBAAiB,KAAK,IAAI,GAAG,KAAK;AAEhF,SAAK,KAAK,cAAc,cAAc,EAAE,iBAAiB,SAAS,CAAC,UAAU;AAC3E,YAAMG,SAAOH,KAAAA,QAAS,SAAS,KAAK,QAAQ,KAAK;AAC1C,aAAA,KAAKG,QAAM,QAAQ;AAC1B,YAAM,eAAe;AAAA,IAAA,CACtB;AACD,SAAK,KAAK,cAAc,oBAAoB,EAAE,iBAAiB,SAAS,MAAM;AAC5E,WAAK,eAAe;AAAA,IAAA,CACrB;AACD,SAAK,KAAK,cAAc,oBAAoB,EAAE,iBAAiB,QAAQ,MAAM;AAC3E,WAAK,eAAe;AACpB,WAAK,KAAK;AAAA,IAAA,CACX;AACD,SAAK,MAAM;AAAA,MACT,QAAQ,OAAO;AAAA,MACf,CAAC,OAAO,WAAW,WAAW;AACxB,YAAAE,aAAA,kBAAkB,KAAK,EAAG;AAC1B,YAAA,WAAW,QAAQ,QAAQ,MAAM;AACnC,gBAAM,CAACF,QAAM,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,YACvCH,KAAA;AAAA,YACA,MAAM;AAAA,UAAA;AAGJ,cAAA,CAACK,aAAAA,kBAAkBF,MAAI,GAAG;AACvB,iBAAA,YAAY,IAAIC,MAAAA,MAAM,MAAM,QAAQ,QAAQD,OAAK,QAAQ;AAC9D,kBAAM,UAAUH,KAAA,QAAS,QAAQG,OAAK,OAAO;AAC7C,gBAAI,CAAC,QAAQ,WAAW,GAAG,GAAG;AAC5B,mBAAK,KAAK,QAAQ,SAAS,KAAK,SAAS;AAAA,YAC3C;AACA;AAAA,UACF;AAAA,QACF;AACI,YAAA,KAAK,cAAc;AACrB,eAAK,KAAK;AAAA,QACZ;AAAA,MACF;AAAA,IAAA;AAEF,SAAK,MAAM;AAAA,MACT,QAAQ,OAAO;AAAA,MACf,MAAM;AACE,cAAA,YAAY,KAAK,MAAM,aAAa;AACpC,cAAA,QAAQ,aAAa,UAAU;AACrC,mBAAW,MAAM;AACT,gBAAAA,SAAO,KAAK,MAAM,OAAO;AAAA,YAC7BH,KAAA;AAAA,YACA;AAAA,YACA,CAAC;AACH,cAAI,CAACG,QAAM;AACT,iBAAK,iBAAiB;AAAA,UACxB;AAAA,QAAA,CACD;AAAA,MACH;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,OAAO;AACD,QAAA,QAAQ,KAAK,QAAQ;AACzB,QAAI,CAAC,MAAO;AACZ,SAAK,QAAQ,QAAQ;AACrB,YAAQ,KAAK,KAAK,aAAa,WAAW,GAAG;AAAA,MAC3C,KAAK,QAAQ;AACX,cAAM,EAAE,UAAc,IAAA,KAAK,MAAM;AAC7B,YAAA,KAAK,QAAQ,cAAc;AACrB,kBAAA,KAAK,gBAAgB,KAAK;AAAA,QACpC;AAEA,YAAI,KAAK,WAAW;AAClB,eAAK,MAAM;AAAA,YACT,KAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA,QAAQ,QAAQ;AAAA,UAAA;AAElB,eAAK,aAAa;AAAA,QAAA,OAEf;AACH,eAAK,aAAa;AAClB,eAAK,MAAM,OAAO,QAAQ,OAAO,QAAQ,QAAQ,IAAI;AAAA,QACvD;AACK,aAAA,MAAM,KAAK,YAAY;AAC5B;AAAA,MACF;AAAA,MACA,KAAK,WAAW;AACd,cAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AACtC,YAAA,CAACE,aAAAA,kBAAkB,KAAK,GAAG;AACvB,gBAAA,QAAQ,MAAM,QAAQ,MAAM;AAClC,eAAK,MAAM;AAAA,YACT;AAAA,YACA,KAAK,KAAK,aAAa,WAAW;AAAA,YAClC;AAAA,YACA,QAAQ,QAAQ;AAAA,UAAA;AAElB,cAAI,KAAK,KAAK,aAAa,WAAW,MAAM,WAAW;AACrD,iBAAK,MAAM,WAAW,QAAQ,GAAG,KAAK,QAAQ,QAAQ,IAAI;AAAA,UAC5D;AACA,eAAK,MAAM,aAAa,QAAQ,GAAG,QAAQ,QAAQ,IAAI;AAAA,QACzD;AACA;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AAC1C,aAAK,MAAM,WAAW,MAAM,OAAO,MAAM,QAAQ,QAAQ,IAAI;AAC7D,aAAK,MAAM,YAAY,MAAM,QAAQ,GAAG,SAAS,EAAE,KAAK,MAAM,GAAG,QAAQ,QAAQ,IAAI;AAChF,aAAA,MAAM,WAAW,MAAM,QAAQ,GAAG,MAAM,QAAQ,QAAQ,IAAI;AACjE,aAAK,MAAM,aAAa,MAAM,QAAQ,GAAG,QAAQ,QAAQ,MAAM;AAC/D,aAAK,QAAQ,QAAQ;AACrB,aAAK,KAAK;AACV;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAS,WAAW;AAClB,UAAM,OAAO,UAAU;AACvB,UAAM,MAAM,UAAU,SAAS,KAAK,MAAM,KAAK;AAC/C,SAAK,KAAK,MAAM,OAAO,GAAG,IAAI;AAC9B,SAAK,KAAK,MAAM,MAAM,GAAG,GAAG;AACvB,SAAA,KAAK,UAAU,OAAO,SAAS;AAC9B,UAAA,kBAAkB,KAAK,gBAAgB,sBAAsB;AAC7D,UAAA,aAAa,KAAK,KAAK,sBAAsB;AACnD,QAAI,QAAQ;AACR,QAAA,WAAW,QAAQ,gBAAgB,OAAO;AACpC,cAAA,gBAAgB,QAAQ,WAAW;AAC3C,WAAK,KAAK,MAAM,OAAO,GAAG,OAAO,KAAK;AAAA,IACxC;AACI,QAAA,WAAW,OAAO,gBAAgB,MAAM;AAClC,cAAA,gBAAgB,OAAO,WAAW;AAC1C,WAAK,KAAK,MAAM,OAAO,GAAG,OAAO,KAAK;AAAA,IACxC;AACI,QAAA,WAAW,SAAS,gBAAgB,QAAQ;AACxC,YAAA,SAAS,WAAW,SAAS,WAAW;AAC9C,YAAM,gBAAgB,UAAU,SAAS,UAAU,MAAM;AACzD,YAAM,WAAW,MAAM;AACvB,WAAK,KAAK,MAAM,MAAM,GAAG,WAAW,IAAI,KAAK,MAAM,KAAK,YAAY,UAAU,MAAM,QAAQ;AACvF,WAAA,KAAK,UAAU,IAAI,SAAS;AAAA,IACnC;AACO,WAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAK,OAAe,QAAQ,UAAU,MAAM,OAAO;AACjD,SAAK,YAAY,SAAS,KAAK,MAAM,UAAU;AAC1C,SAAA,KAAK,UAAU,OAAO,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,YAAY;AAChC,QAAA,CAACA,aAAAA,kBAAkB,OAAO,GAAG;AAC/B,WAAK,QAAQ,QAAQ;AAAA,IAAA,WAEd,SAAS,KAAK,KAAK,aAAa,WAAW,GAAG;AACrD,WAAK,QAAQ,QAAQ;AAAA,IACvB;AACK,SAAA,SAAS,KAAK,MAAM,UAAU,SAAS,KAAK,MAAM,UAAU,UAAU,CAAC;AACxE,QAAA,KAAK,QAAQ,UAAU,IAAI;AAC7B,WAAK,QAAQ;IACf;AACA,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK,QAAQ,aAAa,QAAQ,IAAI,EAAE,KAAK;AAAA,IAAA;AAE1C,SAAA,KAAK,aAAa,aAAa,IAAI;AAAA,EAC1C;AAAA,EAEA,OAAO;AACL,UAAM,KAAK;AACN,SAAA,KAAK,gBAAgB,WAAW;AAAA,EACvC;AAAA,EAEA,gBAAgB,KAAa;AAC3B,QAAI,SAAS;AACb,QAAI,CAAC,KAAK;AACD,aAAA;AAAA,IACT;AACI,QAAA,CAACC,aAAAA,YAAY,GAAG,GAAG;AACrB,eAAS,GAAG,KAAK,QAAQ,YAAY,MAAM,GAAG;AAAA,IAChD;AACO,WAAA;AAAA,EACT;AACF;AA7UE,SAAO,WAAmB;AAAA,EACxB,uDAAuDC,cAAA,UAAU,OAAO,EAAE,eAAe;AAAA,EACzF;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK,EAAE;AANX,IAAqB,UAArB;;"}
|
|
@@ -5,10 +5,9 @@ const Parchment = Quill.import("parchment");
|
|
|
5
5
|
const _MathliveBlot = class _MathliveBlot extends Parchment.EmbedBlot {
|
|
6
6
|
constructor(scroll, domNode) {
|
|
7
7
|
super(scroll, domNode);
|
|
8
|
-
this.
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
this.mode = dom.getAttribute("mode") || "only-read";
|
|
8
|
+
this.domNode = domNode;
|
|
9
|
+
domNode.setAttribute("contenteditable", "false");
|
|
10
|
+
this.mode = domNode.getAttribute("mode") || "only-read";
|
|
12
11
|
}
|
|
13
12
|
static create(obj) {
|
|
14
13
|
const el = super.create();
|
|
@@ -24,38 +23,10 @@ const _MathliveBlot = class _MathliveBlot extends Parchment.EmbedBlot {
|
|
|
24
23
|
mode: domNode.getAttribute("mode")
|
|
25
24
|
};
|
|
26
25
|
}
|
|
27
|
-
value() {
|
|
28
|
-
this.init();
|
|
29
|
-
return super.value();
|
|
30
|
-
}
|
|
31
|
-
init() {
|
|
32
|
-
if (this.initFlag) return;
|
|
33
|
-
if (this.mode === "only-read") return;
|
|
34
|
-
this.initFlag = true;
|
|
35
|
-
const dom = this.domNode;
|
|
36
|
-
this.quill = this.findQuillInstance();
|
|
37
|
-
if (this.mode === "dialog") {
|
|
38
|
-
dom.addEventListener("click", () => {
|
|
39
|
-
this.quill.getModule("mathlive").createDialog(dom.value);
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
26
|
html() {
|
|
44
27
|
const formula = this.domNode.value;
|
|
45
28
|
return `<math-field class="ql-math-field view" contenteditable="false" mode="${this.mode}">${formula}</math-field>`;
|
|
46
29
|
}
|
|
47
|
-
findQuillInstance() {
|
|
48
|
-
if (this.quill) return this.quill;
|
|
49
|
-
let dom = this.domNode.parentElement;
|
|
50
|
-
while (dom) {
|
|
51
|
-
const quill = dom.quill;
|
|
52
|
-
if (quill instanceof Quill) {
|
|
53
|
-
return quill;
|
|
54
|
-
}
|
|
55
|
-
dom = dom.parentElement;
|
|
56
|
-
}
|
|
57
|
-
throw new Error("not found quill instance");
|
|
58
|
-
}
|
|
59
30
|
};
|
|
60
31
|
_MathliveBlot.blotName = "mathlive";
|
|
61
32
|
_MathliveBlot.tagName = "math-field";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formats.cjs.js","sources":["../../../src/mathlive/formats.ts"],"sourcesContent":["import type { MathfieldElement } from 'mathlive'\
|
|
1
|
+
{"version":3,"file":"formats.cjs.js","sources":["../../../src/mathlive/formats.ts"],"sourcesContent":["import type { MathfieldElement } from 'mathlive'\nimport type { Root } from 'parchment'\nimport Quill from 'quill'\n\nconst Parchment = Quill.import('parchment')\ntype MathliveBlotMode = 'dialog' | 'only-read'\nexport default class MathliveBlot extends Parchment.EmbedBlot {\n static blotName = 'mathlive'\n static tagName = 'math-field'\n static className = 'ql-math-field'\n mode: MathliveBlotMode\n\n static create(obj: { value: string, mode: MathliveBlotMode }) {\n const el = super.create() as MathfieldElement\n el.setAttribute('mode', obj.mode)\n el.classList.add('view')\n el.innerHTML = obj.value\n el.setValue(obj.value)\n return el\n }\n\n static value(domNode: MathfieldElement) {\n return {\n value: domNode.value,\n mode: domNode.getAttribute('mode'),\n }\n }\n\n constructor(scroll: Root, public domNode: MathfieldElement) {\n super(scroll, domNode)\n domNode.setAttribute('contenteditable', 'false')\n this.mode = (domNode.getAttribute('mode') || 'only-read') as MathliveBlotMode\n }\n\n html() {\n const formula = this.domNode.value\n return `<math-field class=\"ql-math-field view\" contenteditable=\"false\" mode=\"${this.mode}\">${formula}</math-field>`\n }\n}\n"],"names":[],"mappings":";;;AAIA,MAAM,YAAY,MAAM,OAAO,WAAW;AAErB,MAAA,gBAAA,MAAA,sBAAqB,UAAU,UAAU;AAAA,EAsB5D,YAAY,QAAqB,SAA2B;AAC1D,UAAM,QAAQ,OAAO;AADU,SAAA,UAAA;AAEvB,YAAA,aAAa,mBAAmB,OAAO;AAC/C,SAAK,OAAQ,QAAQ,aAAa,MAAM,KAAK;AAAA,EAC/C;AAAA,EApBA,OAAO,OAAO,KAAgD;AACtD,UAAA,KAAK,MAAM;AACd,OAAA,aAAa,QAAQ,IAAI,IAAI;AAC7B,OAAA,UAAU,IAAI,MAAM;AACvB,OAAG,YAAY,IAAI;AAChB,OAAA,SAAS,IAAI,KAAK;AACd,WAAA;AAAA,EACT;AAAA,EAEA,OAAO,MAAM,SAA2B;AAC/B,WAAA;AAAA,MACL,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ,aAAa,MAAM;AAAA,IAAA;AAAA,EAErC;AAAA,EAQA,OAAO;AACC,UAAA,UAAU,KAAK,QAAQ;AAC7B,WAAO,wEAAwE,KAAK,IAAI,KAAK,OAAO;AAAA,EACtG;AACF;AA/BE,cAAO,WAAW;AAClB,cAAO,UAAU;AACjB,cAAO,YAAY;AAHA,IAAA,eAAA;;"}
|
|
@@ -1,14 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
3
|
const Quill = require("quill");
|
|
4
|
+
const formats = require("./formats.cjs.js");
|
|
4
5
|
const tooltip = require("./tooltip.cjs.js");
|
|
5
|
-
class MathliveModule
|
|
6
|
-
constructor(quill
|
|
7
|
-
|
|
8
|
-
quill.root.quill = quill;
|
|
6
|
+
class MathliveModule {
|
|
7
|
+
constructor(quill) {
|
|
8
|
+
this.quill = quill;
|
|
9
9
|
this.tooltip = new tooltip.default(quill);
|
|
10
|
+
this.quill.root.addEventListener(
|
|
11
|
+
"click",
|
|
12
|
+
(e) => {
|
|
13
|
+
if (!this.quill.isEnabled()) return;
|
|
14
|
+
const path = e.composedPath();
|
|
15
|
+
if (!path || path.length <= 0) return;
|
|
16
|
+
const mathliveNode = path.find((node) => node.tagName && node.tagName.toUpperCase() === formats.default.tagName.toUpperCase() && node.classList.contains(formats.default.className));
|
|
17
|
+
const mathliveBlot = Quill.find(mathliveNode);
|
|
18
|
+
if (mathliveBlot) {
|
|
19
|
+
const { value, mode } = formats.default.value(mathliveBlot.domNode);
|
|
20
|
+
if (mode === "dialog") {
|
|
21
|
+
this.createDialog(value);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
true
|
|
26
|
+
);
|
|
10
27
|
}
|
|
11
|
-
|
|
28
|
+
createDialog(value) {
|
|
12
29
|
this.tooltip.edit(value);
|
|
13
30
|
}
|
|
14
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../../../src/mathlive/index.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../../../src/mathlive/index.ts"],"sourcesContent":["import Quill from 'quill'\nimport MathliveBlot from './formats'\nimport MathliveTooltip from './tooltip'\n\nexport default class MathliveModule {\n tooltip: MathliveTooltip\n constructor(public quill: Quill) {\n this.tooltip = new MathliveTooltip(quill)\n\n this.quill.root.addEventListener(\n 'click',\n (e: MouseEvent) => {\n if (!this.quill.isEnabled()) return\n const path = e.composedPath() as HTMLElement[]\n if (!path || path.length <= 0) return\n\n const mathliveNode = path.find(node => node.tagName && node.tagName.toUpperCase() === MathliveBlot.tagName.toUpperCase() && node.classList.contains(MathliveBlot.className))\n const mathliveBlot = Quill.find(mathliveNode) as MathliveBlot | null\n if (mathliveBlot) {\n const { value, mode } = MathliveBlot.value(mathliveBlot.domNode)\n if (mode === 'dialog') {\n this.createDialog(value)\n }\n }\n },\n true,\n )\n }\n\n createDialog(value?: string) {\n this.tooltip.edit(value)\n }\n}\n"],"names":["MathliveTooltip","MathliveBlot"],"mappings":";;;;;AAIA,MAAqB,eAAe;AAAA,EAElC,YAAmB,OAAc;AAAd,SAAA,QAAA;AACZ,SAAA,UAAU,IAAIA,QAAA,QAAgB,KAAK;AAExC,SAAK,MAAM,KAAK;AAAA,MACd;AAAA,MACA,CAAC,MAAkB;AACjB,YAAI,CAAC,KAAK,MAAM,UAAa,EAAA;AACvB,cAAA,OAAO,EAAE;AACf,YAAI,CAAC,QAAQ,KAAK,UAAU,EAAG;AAE/B,cAAM,eAAe,KAAK,KAAK,UAAQ,KAAK,WAAW,KAAK,QAAQ,kBAAkBC,gBAAa,QAAQ,iBAAiB,KAAK,UAAU,SAASA,QAAAA,QAAa,SAAS,CAAC;AACrK,cAAA,eAAe,MAAM,KAAK,YAAY;AAC5C,YAAI,cAAc;AAChB,gBAAM,EAAE,OAAO,SAASA,QAAa,QAAA,MAAM,aAAa,OAAO;AAC/D,cAAI,SAAS,UAAU;AACrB,iBAAK,aAAa,KAAK;AAAA,UACzB;AAAA,QACF;AAAA,MACF;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,aAAa,OAAgB;AACtB,SAAA,QAAQ,KAAK,KAAK;AAAA,EACzB;AACF;;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
|
|
3
|
-
const
|
|
4
|
-
const
|
|
5
|
-
const Tooltip =
|
|
3
|
+
const Quill = require("quill");
|
|
4
|
+
const Delta = Quill.import("delta");
|
|
5
|
+
const Tooltip = Quill.import("ui/tooltip");
|
|
6
6
|
const _MathliveTooltip = class _MathliveTooltip extends Tooltip {
|
|
7
7
|
constructor(quill, boundsContainer) {
|
|
8
8
|
super(quill, boundsContainer);
|
|
@@ -52,9 +52,9 @@ const _MathliveTooltip = class _MathliveTooltip extends Tooltip {
|
|
|
52
52
|
const inputValue = this.mathliveDom.value;
|
|
53
53
|
if (!inputValue) return;
|
|
54
54
|
const index = range ? range.index : this.quill.getLength() - 1;
|
|
55
|
-
const delta = new
|
|
56
|
-
this.quill.updateContents(delta,
|
|
57
|
-
this.quill.setSelection(index + 1,
|
|
55
|
+
const delta = new Delta().retain(index).delete(this.editValue ? 1 : (range == null ? void 0 : range.length) || 0).insert({ mathlive: { value: inputValue, mode: "dialog" } });
|
|
56
|
+
this.quill.updateContents(delta, Quill.sources.USER);
|
|
57
|
+
this.quill.setSelection(index + 1, Quill.sources.SILENT);
|
|
58
58
|
this.hide();
|
|
59
59
|
}
|
|
60
60
|
position(reference) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tooltip.cjs.js","sources":["../../../src/mathlive/tooltip.ts"],"sourcesContent":["import type { MathfieldElement } from 'mathlive'\
|
|
1
|
+
{"version":3,"file":"tooltip.cjs.js","sources":["../../../src/mathlive/tooltip.ts"],"sourcesContent":["import type { MathfieldElement } from 'mathlive'\nimport type { Bounds } from 'quill/core/selection'\nimport type TypeTooltip from 'quill/ui/tooltip'\nimport Quill from 'quill'\n\nconst Delta = Quill.import('delta')\nconst Tooltip = Quill.import('ui/tooltip') as typeof TypeTooltip\nexport default class MathliveTooltip extends Tooltip {\n static TEMPLATE = ``\n\n mathliveDom: MathfieldElement\n editValue?: string\n\n constructor(quill: Quill, boundsContainer?: HTMLElement) {\n super(quill, boundsContainer)\n this.mathliveDom = document.createElement('math-field') as MathfieldElement\n this.mathliveDom.classList.add('ql-math-field')\n this.root.appendChild(this.mathliveDom)\n this.root.classList.add('math-field-tooltip')\n this.listen()\n }\n\n listen() {\n this.mathliveDom.addEventListener('blur', (event) => {\n this.hide()\n })\n this.root.addEventListener('keydown', (event) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n this.save()\n }\n else if (event.key === 'Escape') {\n event.preventDefault()\n this.cancel()\n }\n })\n }\n\n cancel() {\n this.hide()\n this.restoreFocus()\n }\n\n edit(value?: string) {\n this.editValue = value\n this.root.classList.remove('ql-hidden')\n this.root.classList.add('ql-editing')\n this.mathliveDom.setValue(value || '')\n const range = this.quill.getSelection()\n const bounds = range ? this.quill.getBounds(range) : null\n if (bounds != null) {\n this.position(bounds)\n }\n this.show()\n this.mathliveDom.focus()\n }\n\n restoreFocus() {\n this.mathliveDom.blur()\n this.quill.focus({ preventScroll: true })\n }\n\n save() {\n const range = this.quill.getSelection(true)\n const inputValue = this.mathliveDom.value\n if (!inputValue) return\n const index = range ? range.index : this.quill.getLength() - 1\n const delta = new Delta()\n .retain(index)\n .delete(this.editValue ? 1 : range?.length || 0)\n .insert({ mathlive: { value: inputValue, mode: 'dialog' } })\n this.quill.updateContents(delta, Quill.sources.USER)\n this.quill.setSelection(index + 1, Quill.sources.SILENT)\n this.hide()\n }\n\n position(reference: Bounds) {\n const adjustedReference = { ...reference }\n adjustedReference.left = reference.left + this.root.offsetWidth / 2 - reference.width / 2\n return super.position(adjustedReference)\n }\n}\n"],"names":[],"mappings":";;;AAKA,MAAM,QAAQ,MAAM,OAAO,OAAO;AAClC,MAAM,UAAU,MAAM,OAAO,YAAY;AACzC,MAAqB,mBAArB,MAAqB,yBAAwB,QAAQ;AAAA,EAMnD,YAAY,OAAc,iBAA+B;AACvD,UAAM,OAAO,eAAe;AACvB,SAAA,cAAc,SAAS,cAAc,YAAY;AACjD,SAAA,YAAY,UAAU,IAAI,eAAe;AACzC,SAAA,KAAK,YAAY,KAAK,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,oBAAoB;AAC5C,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,SAAS;AACP,SAAK,YAAY,iBAAiB,QAAQ,CAAC,UAAU;AACnD,WAAK,KAAK;AAAA,IAAA,CACX;AACD,SAAK,KAAK,iBAAiB,WAAW,CAAC,UAAU;AAC3C,UAAA,MAAM,QAAQ,SAAS;AACzB,cAAM,eAAe;AACrB,aAAK,KAAK;AAAA,MAAA,WAEH,MAAM,QAAQ,UAAU;AAC/B,cAAM,eAAe;AACrB,aAAK,OAAO;AAAA,MACd;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,SAAS;AACP,SAAK,KAAK;AACV,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,KAAK,OAAgB;AACnB,SAAK,YAAY;AACZ,SAAA,KAAK,UAAU,OAAO,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,YAAY;AAC/B,SAAA,YAAY,SAAS,SAAS,EAAE;AAC/B,UAAA,QAAQ,KAAK,MAAM,aAAa;AACtC,UAAM,SAAS,QAAQ,KAAK,MAAM,UAAU,KAAK,IAAI;AACrD,QAAI,UAAU,MAAM;AAClB,WAAK,SAAS,MAAM;AAAA,IACtB;AACA,SAAK,KAAK;AACV,SAAK,YAAY;EACnB;AAAA,EAEA,eAAe;AACb,SAAK,YAAY;AACjB,SAAK,MAAM,MAAM,EAAE,eAAe,KAAM,CAAA;AAAA,EAC1C;AAAA,EAEA,OAAO;AACL,UAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AACpC,UAAA,aAAa,KAAK,YAAY;AACpC,QAAI,CAAC,WAAY;AACjB,UAAM,QAAQ,QAAQ,MAAM,QAAQ,KAAK,MAAM,UAAc,IAAA;AACvD,UAAA,QAAQ,IAAI,MAAA,EACf,OAAO,KAAK,EACZ,OAAO,KAAK,YAAY,KAAI,+BAAO,WAAU,CAAC,EAC9C,OAAO,EAAE,UAAU,EAAE,OAAO,YAAY,MAAM,SAAS,EAAA,CAAG;AAC7D,SAAK,MAAM,eAAe,OAAO,MAAM,QAAQ,IAAI;AACnD,SAAK,MAAM,aAAa,QAAQ,GAAG,MAAM,QAAQ,MAAM;AACvD,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,SAAS,WAAmB;AACpB,UAAA,oBAAoB,EAAE,GAAG;AACb,sBAAA,OAAO,UAAU,OAAO,KAAK,KAAK,cAAc,IAAI,UAAU,QAAQ;AACjF,WAAA,MAAM,SAAS,iBAAiB;AAAA,EACzC;AACF;AAzEE,iBAAO,WAAW;AADpB,IAAqB,kBAArB;;"}
|