@opentiny/fluent-editor 3.20.0 → 3.20.2-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/es/attributors/index.es.js +1 -1
- package/es/config/base64-image.es.js.map +1 -1
- package/es/config/editor.config.es.js.map +1 -1
- package/es/config/editor.utils.es.js +12 -12
- package/es/config/editor.utils.es.js.map +1 -1
- package/es/{config.es.js → config/index.es.js} +14 -7
- package/es/config/index.es.js.map +1 -0
- package/es/config/types/index.es.js +2 -2
- package/es/counter/index.es.js +2 -1
- package/es/counter/index.es.js.map +1 -1
- package/es/custom-clipboard.es.js +14 -14
- package/es/custom-clipboard.es.js.map +1 -1
- package/es/custom-image/BlotFormatter.es.js +1 -1
- package/es/custom-image/BlotFormatter.es.js.map +1 -1
- package/es/custom-image/actions/CustomResizeAction.es.js +6 -4
- package/es/custom-image/actions/CustomResizeAction.es.js.map +1 -1
- package/es/custom-image/image.es.js +3 -3
- package/es/custom-image/image.es.js.map +1 -1
- package/es/custom-image/specs/BlotSpec.es.js.map +1 -1
- package/es/custom-uploader.es.js +4 -7
- package/es/custom-uploader.es.js.map +1 -1
- package/es/emoji/emoji-list/people.es.js.map +1 -1
- package/es/emoji/formats/emoji-blot.es.js +2 -2
- package/es/emoji/formats/emoji-blot.es.js.map +1 -1
- package/es/emoji/modules/emoji.es.js +7 -7
- package/es/emoji/modules/emoji.es.js.map +1 -1
- package/es/emoji/modules/toolbar-emoji.es.js +15 -15
- package/es/emoji/modules/toolbar-emoji.es.js.map +1 -1
- package/es/file/modules/file-bar.es.js +3 -3
- package/es/file/modules/file-bar.es.js.map +1 -1
- package/es/fluent-editor.es.js +4 -4
- package/es/fluent-editor.es.js.map +1 -1
- package/es/format-painter/index.es.js.map +1 -1
- package/es/global-link/formats/work-item-link.es.js.map +1 -1
- package/es/global-link/index.es.js +1 -1
- package/es/global-link/index.es.js.map +1 -1
- package/es/index.es.js +17 -1
- package/es/index.es.js.map +1 -1
- package/es/link/formats/link.es.js +1 -1
- package/es/link/formats/link.es.js.map +1 -1
- package/es/link/index.es.js.map +1 -1
- package/es/link/modules/tooltip.es.js +3 -3
- package/es/link/modules/tooltip.es.js.map +1 -1
- package/es/mention/Mention.es.js +7 -12
- package/es/mention/Mention.es.js.map +1 -1
- package/es/quick-menu/index.es.js +1 -1
- package/es/quick-menu/index.es.js.map +1 -1
- package/es/screenshot/index.es.js +42 -7
- package/es/screenshot/index.es.js.map +1 -1
- package/es/strike/index.es.js.map +1 -1
- package/es/syntax/index.es.js.map +1 -1
- package/es/table/better-table.es.js +4 -5
- package/es/table/better-table.es.js.map +1 -1
- package/es/table/formats/list.es.js +3 -3
- package/es/table/formats/list.es.js.map +1 -1
- package/es/table/formats/table.es.js +26 -27
- package/es/table/formats/table.es.js.map +1 -1
- package/es/table/modules/table-column-tool.es.js +8 -8
- package/es/table/modules/table-column-tool.es.js.map +1 -1
- package/es/table/modules/table-operation-menu.es.js +7 -8
- package/es/table/modules/table-operation-menu.es.js.map +1 -1
- package/es/table/modules/table-scroll-bar.es.js +1 -1
- package/es/table/modules/table-scroll-bar.es.js.map +1 -1
- package/es/table/modules/table-selection.es.js +0 -1
- package/es/table/modules/table-selection.es.js.map +1 -1
- package/es/table/utils/node-matchers.es.js +14 -14
- package/es/table/utils/node-matchers.es.js.map +1 -1
- package/es/toolbar/better-picker.es.js.map +1 -1
- package/es/toolbar/index.es.js +1 -1
- package/es/toolbar/index.es.js.map +1 -1
- package/es/utils/debounce.es.js.map +1 -1
- package/es/utils/image.es.js +26 -0
- package/es/utils/image.es.js.map +1 -0
- package/es/utils/method.es.js +2 -2
- package/es/utils/method.es.js.map +1 -1
- package/es/utils/scroll-lock.es.js +47 -0
- package/es/utils/scroll-lock.es.js.map +1 -0
- package/es/video/index.es.js +6 -3
- package/es/video/index.es.js.map +1 -1
- package/lib/attributors/index.cjs.js +2 -2
- package/lib/config/base64-image.cjs.js.map +1 -1
- package/lib/config/editor.config.cjs.js.map +1 -1
- package/lib/config/editor.utils.cjs.js +12 -12
- package/lib/config/editor.utils.cjs.js.map +1 -1
- package/lib/{config.cjs.js → config/index.cjs.js} +27 -21
- package/lib/config/index.cjs.js.map +1 -0
- package/lib/config/types/index.cjs.js +2 -2
- package/lib/counter/index.cjs.js +5 -4
- package/lib/counter/index.cjs.js.map +1 -1
- package/lib/custom-clipboard.cjs.js +14 -14
- package/lib/custom-clipboard.cjs.js.map +1 -1
- package/lib/custom-image/BlotFormatter.cjs.js +1 -1
- package/lib/custom-image/BlotFormatter.cjs.js.map +1 -1
- package/lib/custom-image/actions/CustomResizeAction.cjs.js +6 -4
- package/lib/custom-image/actions/CustomResizeAction.cjs.js.map +1 -1
- package/lib/custom-image/image.cjs.js +3 -3
- package/lib/custom-image/image.cjs.js.map +1 -1
- package/lib/custom-image/specs/BlotSpec.cjs.js.map +1 -1
- package/lib/custom-uploader.cjs.js +4 -7
- package/lib/custom-uploader.cjs.js.map +1 -1
- package/lib/emoji/emoji-list/people.cjs.js.map +1 -1
- package/lib/emoji/formats/emoji-blot.cjs.js +2 -2
- package/lib/emoji/formats/emoji-blot.cjs.js.map +1 -1
- package/lib/emoji/modules/emoji.cjs.js +7 -7
- package/lib/emoji/modules/emoji.cjs.js.map +1 -1
- package/lib/emoji/modules/toolbar-emoji.cjs.js +15 -15
- package/lib/emoji/modules/toolbar-emoji.cjs.js.map +1 -1
- package/lib/file/modules/file-bar.cjs.js +3 -3
- package/lib/file/modules/file-bar.cjs.js.map +1 -1
- package/lib/fluent-editor.cjs.js +32 -32
- package/lib/fluent-editor.cjs.js.map +1 -1
- package/lib/format-painter/index.cjs.js.map +1 -1
- package/lib/global-link/formats/work-item-link.cjs.js.map +1 -1
- package/lib/global-link/index.cjs.js +1 -1
- package/lib/global-link/index.cjs.js.map +1 -1
- package/lib/index.cjs.js +16 -0
- package/lib/index.cjs.js.map +1 -1
- package/lib/link/formats/link.cjs.js +1 -1
- package/lib/link/formats/link.cjs.js.map +1 -1
- package/lib/link/index.cjs.js.map +1 -1
- package/lib/link/modules/tooltip.cjs.js +3 -3
- package/lib/link/modules/tooltip.cjs.js.map +1 -1
- package/lib/mention/Mention.cjs.js +7 -12
- package/lib/mention/Mention.cjs.js.map +1 -1
- package/lib/quick-menu/index.cjs.js +1 -1
- package/lib/quick-menu/index.cjs.js.map +1 -1
- package/lib/screenshot/index.cjs.js +44 -9
- package/lib/screenshot/index.cjs.js.map +1 -1
- package/lib/strike/index.cjs.js.map +1 -1
- package/lib/syntax/index.cjs.js.map +1 -1
- package/lib/table/better-table.cjs.js +4 -5
- package/lib/table/better-table.cjs.js.map +1 -1
- package/lib/table/formats/list.cjs.js +3 -3
- package/lib/table/formats/list.cjs.js.map +1 -1
- package/lib/table/formats/table.cjs.js +26 -27
- package/lib/table/formats/table.cjs.js.map +1 -1
- package/lib/table/modules/table-column-tool.cjs.js +8 -8
- package/lib/table/modules/table-column-tool.cjs.js.map +1 -1
- package/lib/table/modules/table-operation-menu.cjs.js +7 -8
- package/lib/table/modules/table-operation-menu.cjs.js.map +1 -1
- package/lib/table/modules/table-scroll-bar.cjs.js +1 -1
- package/lib/table/modules/table-scroll-bar.cjs.js.map +1 -1
- package/lib/table/modules/table-selection.cjs.js +0 -1
- package/lib/table/modules/table-selection.cjs.js.map +1 -1
- package/lib/table/utils/node-matchers.cjs.js +14 -14
- package/lib/table/utils/node-matchers.cjs.js.map +1 -1
- package/lib/toolbar/better-picker.cjs.js.map +1 -1
- package/lib/toolbar/index.cjs.js +1 -1
- package/lib/toolbar/index.cjs.js.map +1 -1
- package/lib/utils/debounce.cjs.js.map +1 -1
- package/lib/utils/image.cjs.js +26 -0
- package/lib/utils/image.cjs.js.map +1 -0
- package/lib/utils/method.cjs.js +2 -2
- package/lib/utils/method.cjs.js.map +1 -1
- package/lib/utils/scroll-lock.cjs.js +47 -0
- package/lib/utils/scroll-lock.cjs.js.map +1 -0
- package/lib/video/index.cjs.js +6 -3
- package/lib/video/index.cjs.js.map +1 -1
- package/package.json +16 -28
- package/{theme/style.css → style.css} +86 -17
- package/es/config.es.js.map +0 -1
- package/es/types/vue.d.es.js +0 -2
- package/es/types/vue.d.es.js.map +0 -1
- package/lib/config.cjs.js.map +0 -1
- package/lib/types/vue.d.cjs.js +0 -2
- package/lib/types/vue.d.cjs.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.cjs.js","sources":["../../../../src/table/formats/list.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { CELL_ATTRIBUTES, CELL_IDENTITY_KEYS } from '../table-config'\r\n\r\nconst Block = Quill.imports['blots/block']\r\nconst Container = Quill.imports['blots/container']\r\n\r\n// @dynamic\r\nclass ListContainer extends Container {\r\n static allowedChildren: any\r\n static blotName: string\r\n static tagName: string\r\n replaceWith: any\r\n domNode: any\r\n parent: any\r\n statics: any\r\n wrap: any\r\n\r\n format(name, value) {\r\n const { row, cell, rowspan, colspan } = this.domNode.dataset\r\n if (name === ListContainer.blotName) {\r\n if (value) {\r\n super.format(name, { row, cell, rowspan, colspan })\r\n }\r\n else if (row) {\r\n this.replaceWith('table-cell-line', { row, cell, rowspan, colspan })\r\n }\r\n }\r\n }\r\n}\r\n/**\r\n * bugfix: quill源码中(quill/core/editor.js 272行)在处理拷贝时\r\n * hard code了这个blotName用于处理ol中的li。所以在quill\r\n * 源码内写法不变的情况下这个名字不能改,否则拷贝有bug\r\n */\r\nListContainer.blotName = 'list-container'\r\nListContainer.tagName = 'OL'\r\n\r\n// @dynamic\r\nclass ListItem extends Block {\r\n static blotName: string\r\n static tagName: string\r\n static requiredContainer: typeof ListContainer\r\n statics: any\r\n attachUI: any\r\n domNode: any\r\n replaceWith: any\r\n parent: any\r\n wrap: any\r\n children: any\r\n prev: any\r\n remove: () => void\r\n\r\n static create(value) {\r\n const node = super.create()\r\n if (typeof value === 'string') {\r\n value = { value }\r\n }\r\n else {\r\n [...CELL_IDENTITY_KEYS, ...CELL_ATTRIBUTES].forEach((key) => {\r\n if (value[key]) {\r\n node.dataset[key] = value[key]\r\n }\r\n })\r\n }\r\n node.classList.add(value.value)\r\n return node\r\n }\r\n\r\n static formats(domNode) {\r\n const formats: any = {}\r\n formats.value = domNode.classList.item(0) || undefined\r\n\r\n return [...CELL_ATTRIBUTES, ...CELL_IDENTITY_KEYS].reduce((tableFormats, key) => {\r\n if (domNode.dataset[key]) {\r\n tableFormats[key] = domNode.dataset[key]\r\n }\r\n return tableFormats\r\n }, formats)\r\n }\r\n\r\n static register() {\r\n Quill.register({ 'formats/list-container': ListContainer }, true)\r\n }\r\n\r\n constructor(scroll, domNode) {\r\n super(scroll, domNode)\r\n const quill = Quill.find(scroll.domNode.parentNode)\r\n const range = quill.getSelection()\r\n if (range) {\r\n const [line] = quill.getLine(range.index)\r\n const td = line.domNode.closest('td')\r\n if (td) {\r\n [...CELL_IDENTITY_KEYS, ...CELL_ATTRIBUTES].forEach(key =>\r\n td.dataset[key] && domNode.setAttribute(`data-${key}`, td.dataset[key]))\r\n }\r\n }\r\n\r\n const ui = domNode.ownerDocument.createElement('span')\r\n const listEventHandler = (e) => {\r\n if (!scroll.isEnabled()) return\r\n const { value } = this.statics.formats(domNode, scroll)\r\n if (value === 'checked') {\r\n this.format('list', 'unchecked')\r\n e.preventDefault()\r\n }\r\n else if (value === 'unchecked') {\r\n this.format('list', 'checked')\r\n e.preventDefault()\r\n }\r\n }\r\n ui.addEventListener('mousedown', listEventHandler)\r\n ui.addEventListener('touchstart', listEventHandler)\r\n this.attachUI(ui)\r\n }\r\n\r\n format(name, value) {\r\n if (name !== ListItem.blotName) {\r\n super.format(name, value)\r\n return\r\n }\r\n const type = (value && typeof value === 'object') ? value.value : value\r\n const oldClass = this.domNode.classList[0]\r\n const tdDom = this.domNode.closest('.editing-select-able')\r\n const tableCellBlot = tdDom && Quill.find(tdDom)\r\n const images = this.domNode.querySelectorAll('img[data-image-id]')\r\n if (!type || type === oldClass) {\r\n // 消除格式或相同list抵消格式时恢复图片对齐,li转化为table-cell-line\r\n if (images && images.length) {\r\n images.forEach((img) => {\r\n img.style.verticalAlign = 'baseLine'\r\n })\r\n }\r\n if (tableCellBlot && tableCellBlot.statics.blotName === 'table') {\r\n const tableCellFormats = tableCellBlot.formats()\r\n this.replaceWith('table-cell-line', tableCellFormats)\r\n // fix: 移除list格式时移除父级的ol或ul,避免table-cell-line判断无td自动生成td容器\r\n if (this.parent.statics.blotName === ListContainer.blotName) {\r\n this.parent.unwrap()\r\n }\r\n }\r\n else {\r\n super.format(name, value)\r\n }\r\n }\r\n else if (oldClass) {\r\n this.domNode.className = this.domNode.className.replace(oldClass, type)\r\n }\r\n else {\r\n this.domNode.classList.add(type)\r\n }\r\n }\r\n\r\n optimize(context) {\r\n // 判断前一个li是否包含软回车,如果包含则将当前li与之合并后移除\r\n const tail = this.prev && this.prev.domNode.lastChild\r\n if (tail && tail.className && tail.className.indexOf('ql-soft-break') >= 0) {\r\n // 合并dom\r\n this.domNode.childNodes.forEach((v, i) => {\r\n if (i > 0) {\r\n this.prev.domNode.appendChild(v)\r\n }\r\n })\r\n this.remove()\r\n return\r\n }\r\n\r\n super.optimize(context)\r\n\r\n // list类型\r\n const parentFormats = getFormats(this.parent.domNode)\r\n const formats = ListItem.formats(this.domNode)\r\n // 单元格属性\r\n const data = this.domNode.dataset || []\r\n const images = this.domNode.querySelectorAll('img[data-image-id]')\r\n\r\n // li更新后判断父容器的对应属性是否与自身一致,如果不一致则向上覆盖\r\n if (parentFormats.list !== formats.value) {\r\n const oldClass = this.parent.domNode.classList[0]\r\n if (oldClass) {\r\n this.parent.domNode.className = this.parent.domNode.className.replace(oldClass, formats.value)\r\n }\r\n else {\r\n this.parent.domNode.classList.add(formats.value)\r\n }\r\n }\r\n\r\n if (data.cell && !parentFormats.cell) {\r\n [...CELL_IDENTITY_KEYS, ...CELL_ATTRIBUTES].forEach(key =>\r\n (formats[key] || data[key]) && this.parent.domNode.setAttribute(`data-${key}`, formats[key] || data[key]))\r\n // 如果父容器不在表格内则用单元格包裹\r\n if (this.parent.parent.statics.blotName !== 'table') {\r\n delete formats['list']\r\n this.wrap('table', formats)\r\n }\r\n }\r\n\r\n // 当list中包含图片时,设置图片顶对齐\r\n if (images) {\r\n images.forEach((img) => {\r\n img.style.verticalAlign = 'top'\r\n })\r\n }\r\n }\r\n}\r\n\r\nListItem.blotName = 'list'\r\nListItem.tagName = 'LI'\r\n\r\nListContainer.allowedChildren = [ListItem]\r\nListItem.requiredContainer = ListContainer\r\n\r\n// 属性读取方法:兼容table-cell-line、ol、li\r\n// 因为构造时当前range对应的元素最开始是table-cell-line,然后是li,且ol的formats方法不允许覆写,会导致报错,所以整合一个兼容方法来读取需要的属性。\r\nfunction getFormats(dom): any {\r\n const formats = {}\r\n\r\n if (dom.tagName === 'OL') {\r\n formats['list'] = dom.classList.item(0)\r\n }\r\n\r\n return [...CELL_ATTRIBUTES, ...CELL_IDENTITY_KEYS].reduce((tableFormats, attribute) => {\r\n if (dom.hasAttribute(`data-${attribute}`)) {\r\n tableFormats[attribute] = dom.getAttribute(`data-${attribute}`) || undefined\r\n }\r\n return tableFormats\r\n }, formats)\r\n}\r\n\r\nexport { ListContainer, ListItem as default }\r\n"],"names":["CELL_IDENTITY_KEYS","CELL_ATTRIBUTES"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"list.cjs.js","sources":["../../../../src/table/formats/list.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { CELL_ATTRIBUTES, CELL_IDENTITY_KEYS } from '../table-config'\r\n\r\nconst Block = Quill.imports['blots/block']\r\nconst Container = Quill.imports['blots/container']\r\n\r\n// @dynamic\r\nclass ListContainer extends Container {\r\n static allowedChildren: any\r\n static blotName: string\r\n static tagName: string\r\n replaceWith: any\r\n domNode: any\r\n parent: any\r\n statics: any\r\n wrap: any\r\n\r\n format(name, value) {\r\n const { row, cell, rowspan, colspan } = this.domNode.dataset\r\n if (name === ListContainer.blotName) {\r\n if (value) {\r\n super.format(name, { row, cell, rowspan, colspan })\r\n }\r\n else if (row) {\r\n this.replaceWith('table-cell-line', { row, cell, rowspan, colspan })\r\n }\r\n }\r\n }\r\n}\r\n/**\r\n * bugfix: quill源码中(quill/core/editor.js 272行)在处理拷贝时\r\n * hard code了这个blotName用于处理ol中的li。所以在quill\r\n * 源码内写法不变的情况下这个名字不能改,否则拷贝有bug\r\n */\r\nListContainer.blotName = 'list-container'\r\nListContainer.tagName = 'OL'\r\n\r\n// @dynamic\r\nclass ListItem extends Block {\r\n static blotName: string\r\n static tagName: string\r\n static requiredContainer: typeof ListContainer\r\n statics: any\r\n attachUI: any\r\n domNode: any\r\n replaceWith: any\r\n parent: any\r\n wrap: any\r\n children: any\r\n prev: any\r\n remove: () => void\r\n\r\n static create(value) {\r\n const node = super.create()\r\n if (typeof value === 'string') {\r\n value = { value }\r\n }\r\n else {\r\n [...CELL_IDENTITY_KEYS, ...CELL_ATTRIBUTES].forEach((key) => {\r\n if (value[key]) {\r\n node.dataset[key] = value[key]\r\n }\r\n })\r\n }\r\n node.classList.add(value.value)\r\n return node\r\n }\r\n\r\n static formats(domNode) {\r\n const formats: any = {}\r\n formats.value = domNode.classList.item(0) || undefined\r\n\r\n return [...CELL_ATTRIBUTES, ...CELL_IDENTITY_KEYS].reduce((tableFormats, key) => {\r\n if (domNode.dataset[key]) {\r\n tableFormats[key] = domNode.dataset[key]\r\n }\r\n return tableFormats\r\n }, formats)\r\n }\r\n\r\n static register() {\r\n Quill.register({ 'formats/list-container': ListContainer }, true)\r\n }\r\n\r\n constructor(scroll, domNode) {\r\n super(scroll, domNode)\r\n const quill = Quill.find(scroll.domNode.parentNode)\r\n const range = quill.getSelection()\r\n if (range) {\r\n const [line] = quill.getLine(range.index)\r\n const td = line.domNode.closest('td')\r\n if (td) {\r\n [...CELL_IDENTITY_KEYS, ...CELL_ATTRIBUTES].forEach(key =>\r\n td.dataset[key] && domNode.setAttribute(`data-${key}`, td.dataset[key]))\r\n }\r\n }\r\n\r\n const ui = domNode.ownerDocument.createElement('span')\r\n const listEventHandler = (e) => {\r\n if (!scroll.isEnabled()) return\r\n const { value } = this.statics.formats(domNode, scroll)\r\n if (value === 'checked') {\r\n this.format('list', 'unchecked')\r\n e.preventDefault()\r\n }\r\n else if (value === 'unchecked') {\r\n this.format('list', 'checked')\r\n e.preventDefault()\r\n }\r\n }\r\n ui.addEventListener('mousedown', listEventHandler)\r\n ui.addEventListener('touchstart', listEventHandler)\r\n this.attachUI(ui)\r\n }\r\n\r\n format(name, value) {\r\n if (name !== ListItem.blotName) {\r\n super.format(name, value)\r\n return\r\n }\r\n const type = (value && typeof value === 'object') ? value.value : value\r\n const oldClass = this.domNode.classList[0]\r\n const tdDom = this.domNode.closest('.editing-select-able')\r\n const tableCellBlot = tdDom && Quill.find(tdDom)\r\n const images = this.domNode.querySelectorAll('img[data-image-id]')\r\n if (!type || type === oldClass) {\r\n // 消除格式或相同list抵消格式时恢复图片对齐,li转化为table-cell-line\r\n if (images && images.length) {\r\n images.forEach((img) => {\r\n img.style.verticalAlign = 'baseLine'\r\n })\r\n }\r\n if (tableCellBlot && tableCellBlot.statics.blotName === 'table') {\r\n const tableCellFormats = tableCellBlot.formats()\r\n this.replaceWith('table-cell-line', tableCellFormats)\r\n // fix: 移除list格式时移除父级的ol或ul,避免table-cell-line判断无td自动生成td容器\r\n if (this.parent.statics.blotName === ListContainer.blotName) {\r\n this.parent.unwrap()\r\n }\r\n }\r\n else {\r\n super.format(name, value)\r\n }\r\n }\r\n else if (oldClass) {\r\n this.domNode.className = this.domNode.className.replace(oldClass, type)\r\n }\r\n else {\r\n this.domNode.classList.add(type)\r\n }\r\n }\r\n\r\n optimize(context) {\r\n // 判断前一个li是否包含软回车,如果包含则将当前li与之合并后移除\r\n const tail = this.prev && this.prev.domNode.lastChild\r\n if (tail && tail.className && tail.className.includes('ql-soft-break')) {\r\n // 合并dom\r\n this.domNode.childNodes.forEach((v, i) => {\r\n if (i > 0) {\r\n this.prev.domNode.appendChild(v)\r\n }\r\n })\r\n this.remove()\r\n return\r\n }\r\n\r\n super.optimize(context)\r\n\r\n // list类型\r\n const parentFormats = getFormats(this.parent.domNode)\r\n const formats = ListItem.formats(this.domNode)\r\n // 单元格属性\r\n const data = this.domNode.dataset || []\r\n const images = this.domNode.querySelectorAll('img[data-image-id]')\r\n\r\n // li更新后判断父容器的对应属性是否与自身一致,如果不一致则向上覆盖\r\n if (parentFormats.list !== formats.value) {\r\n const oldClass = this.parent.domNode.classList[0]\r\n if (oldClass) {\r\n this.parent.domNode.className = this.parent.domNode.className.replace(oldClass, formats.value)\r\n }\r\n else {\r\n this.parent.domNode.classList.add(formats.value)\r\n }\r\n }\r\n\r\n if (data.cell && !parentFormats.cell) {\r\n [...CELL_IDENTITY_KEYS, ...CELL_ATTRIBUTES].forEach(key =>\r\n (formats[key] || data[key]) && this.parent.domNode.setAttribute(`data-${key}`, formats[key] || data[key]))\r\n // 如果父容器不在表格内则用单元格包裹\r\n if (this.parent.parent.statics.blotName !== 'table') {\r\n delete formats.list\r\n this.wrap('table', formats)\r\n }\r\n }\r\n\r\n // 当list中包含图片时,设置图片顶对齐\r\n if (images) {\r\n images.forEach((img) => {\r\n img.style.verticalAlign = 'top'\r\n })\r\n }\r\n }\r\n}\r\n\r\nListItem.blotName = 'list'\r\nListItem.tagName = 'LI'\r\n\r\nListContainer.allowedChildren = [ListItem]\r\nListItem.requiredContainer = ListContainer\r\n\r\n// 属性读取方法:兼容table-cell-line、ol、li\r\n// 因为构造时当前range对应的元素最开始是table-cell-line,然后是li,且ol的formats方法不允许覆写,会导致报错,所以整合一个兼容方法来读取需要的属性。\r\nfunction getFormats(dom): any {\r\n const formats = {}\r\n\r\n if (dom.tagName === 'OL') {\r\n formats.list = dom.classList.item(0)\r\n }\r\n\r\n return [...CELL_ATTRIBUTES, ...CELL_IDENTITY_KEYS].reduce((tableFormats, attribute) => {\r\n if (dom.hasAttribute(`data-${attribute}`)) {\r\n tableFormats[attribute] = dom.getAttribute(`data-${attribute}`) || undefined\r\n }\r\n return tableFormats\r\n }, formats)\r\n}\r\n\r\nexport { ListContainer, ListItem as default }\r\n"],"names":["CELL_IDENTITY_KEYS","CELL_ATTRIBUTES"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const Quill = require("quill");
|
|
4
|
-
const method = require("../../utils/method.cjs.js");
|
|
5
4
|
const editor_utils = require("../../config/editor.utils.cjs.js");
|
|
5
|
+
const method = require("../../utils/method.cjs.js");
|
|
6
6
|
const tableConfig = require("../table-config.cjs.js");
|
|
7
7
|
const index = require("../utils/index.cjs.js");
|
|
8
8
|
const header = require("./header.cjs.js");
|
|
@@ -32,8 +32,8 @@ class TableCellLine extends Block {
|
|
|
32
32
|
}
|
|
33
33
|
static formats(domNode) {
|
|
34
34
|
const formats = {};
|
|
35
|
-
if (formats
|
|
36
|
-
formats
|
|
35
|
+
if (formats.list) {
|
|
36
|
+
formats.list = domNode.classList.item(0);
|
|
37
37
|
}
|
|
38
38
|
return reduceFormats(domNode, formats);
|
|
39
39
|
}
|
|
@@ -58,7 +58,7 @@ class TableCellLine extends Block {
|
|
|
58
58
|
});
|
|
59
59
|
}
|
|
60
60
|
format(name, value) {
|
|
61
|
-
if ([...tableConfig.CELL_ATTRIBUTES, ...tableConfig.CELL_IDENTITY_KEYS, "parent-bg"].
|
|
61
|
+
if ([...tableConfig.CELL_ATTRIBUTES, ...tableConfig.CELL_IDENTITY_KEYS, "parent-bg"].includes(name)) {
|
|
62
62
|
if (value) {
|
|
63
63
|
this.domNode.setAttribute(`data-${name}`, value);
|
|
64
64
|
} else {
|
|
@@ -167,10 +167,10 @@ class TableCell extends Container {
|
|
|
167
167
|
formats() {
|
|
168
168
|
const formats = {};
|
|
169
169
|
if (this.domNode.hasAttribute("data-row")) {
|
|
170
|
-
formats
|
|
170
|
+
formats.row = this.domNode.getAttribute("data-row");
|
|
171
171
|
}
|
|
172
172
|
if (this.domNode.hasAttribute("data-cell")) {
|
|
173
|
-
formats
|
|
173
|
+
formats.cell = this.domNode.getAttribute("data-cell");
|
|
174
174
|
}
|
|
175
175
|
return tableConfig.CELL_ATTRIBUTES.reduce((tableFormats, attribute) => {
|
|
176
176
|
if (this.domNode.hasAttribute(attribute)) {
|
|
@@ -191,7 +191,8 @@ class TableCell extends Container {
|
|
|
191
191
|
child.format(name, value);
|
|
192
192
|
});
|
|
193
193
|
}
|
|
194
|
-
/**
|
|
194
|
+
/**
|
|
195
|
+
* this method is for TableCellLine to change cell background color
|
|
195
196
|
* if use `format('cell-bg', value)` will loop trigger
|
|
196
197
|
* TableCellLine.optimize -> TableCell.format -> TableCellLine.optimize ...
|
|
197
198
|
*/
|
|
@@ -205,10 +206,10 @@ class TableCell extends Container {
|
|
|
205
206
|
format(name, value) {
|
|
206
207
|
const quill = Quill.find(this.scroll.domNode.parentNode);
|
|
207
208
|
switch (true) {
|
|
208
|
-
case tableConfig.CELL_ATTRIBUTES.
|
|
209
|
+
case tableConfig.CELL_ATTRIBUTES.includes(name):
|
|
209
210
|
this.toggleAttribute(name, value);
|
|
210
211
|
break;
|
|
211
|
-
case ["row", "cell"].
|
|
212
|
+
case ["row", "cell"].includes(name):
|
|
212
213
|
this.toggleAttribute(`data-${name}`, value);
|
|
213
214
|
break;
|
|
214
215
|
case name === "background": {
|
|
@@ -226,12 +227,14 @@ class TableCell extends Container {
|
|
|
226
227
|
quill.setSelection(start, length, Quill.sources.USER);
|
|
227
228
|
quill.format(name, value, Quill.sources.USER);
|
|
228
229
|
quill.setSelection(start);
|
|
230
|
+
break;
|
|
229
231
|
}
|
|
230
232
|
case name === "cell-bg": {
|
|
231
233
|
this.toggleAttribute("data-cell-bg", value);
|
|
232
234
|
this.toggleAttribute("data-parent-bg", value);
|
|
233
235
|
this.formatChildren(name, value);
|
|
234
236
|
this.setCellBg(value);
|
|
237
|
+
break;
|
|
235
238
|
}
|
|
236
239
|
}
|
|
237
240
|
}
|
|
@@ -272,7 +275,7 @@ class TableCell extends Container {
|
|
|
272
275
|
const formats = {};
|
|
273
276
|
const firstChild = domNode.childNodes[0];
|
|
274
277
|
if (firstChild && domNode.tagName === "OL") {
|
|
275
|
-
formats
|
|
278
|
+
formats.list = firstChild.classList.item(0);
|
|
276
279
|
}
|
|
277
280
|
return reduceFormats(domNode, formats);
|
|
278
281
|
}
|
|
@@ -375,7 +378,7 @@ class TableCol extends Block {
|
|
|
375
378
|
}, {});
|
|
376
379
|
}
|
|
377
380
|
format(name, value) {
|
|
378
|
-
if (tableConfig.COL_ATTRIBUTES.
|
|
381
|
+
if (tableConfig.COL_ATTRIBUTES.includes(name)) {
|
|
379
382
|
this.domNode.setAttribute(`${name}`, value || tableConfig.COL_DEFAULT[name]);
|
|
380
383
|
} else {
|
|
381
384
|
super.format(name, value);
|
|
@@ -473,7 +476,7 @@ class TableContainer extends Container {
|
|
|
473
476
|
const tableCol = col.formats()[TableCol.blotName];
|
|
474
477
|
let tableColWidth = tableConfig.COL_DEFAULT.width;
|
|
475
478
|
if (tableCol && tableCol.width) {
|
|
476
|
-
tableColWidth = parseInt(tableCol.width, 10);
|
|
479
|
+
tableColWidth = Number.parseInt(tableCol.width, 10);
|
|
477
480
|
}
|
|
478
481
|
sumWidth = sumWidth + tableColWidth;
|
|
479
482
|
return sumWidth;
|
|
@@ -495,8 +498,8 @@ class TableContainer extends Container {
|
|
|
495
498
|
}
|
|
496
499
|
colGroup.children.forEach((col) => {
|
|
497
500
|
if (maxTds && col.domNode.width === "auto") {
|
|
498
|
-
const width = getComputedStyle(maxTds[tdIndex])
|
|
499
|
-
const num = parseInt(width, 10);
|
|
501
|
+
const width = getComputedStyle(maxTds[tdIndex]).width;
|
|
502
|
+
const num = Number.parseInt(width, 10);
|
|
500
503
|
col.domNode.width = num < tableConfig.COL_DEFAULT.width && tableConfig.COL_DEFAULT.width || num;
|
|
501
504
|
}
|
|
502
505
|
tdIndex++;
|
|
@@ -542,7 +545,7 @@ class TableContainer extends Container {
|
|
|
542
545
|
cell.remove();
|
|
543
546
|
});
|
|
544
547
|
modifiedCells.forEach((cell) => {
|
|
545
|
-
const cellColspan = parseInt(cell.formats().colspan, 10);
|
|
548
|
+
const cellColspan = Number.parseInt(cell.formats().colspan, 10);
|
|
546
549
|
cell.format("colspan", cellColspan - delIndexes.length);
|
|
547
550
|
});
|
|
548
551
|
this.updateTableWidth();
|
|
@@ -598,7 +601,7 @@ class TableContainer extends Container {
|
|
|
598
601
|
});
|
|
599
602
|
});
|
|
600
603
|
modifiedCells.forEach((cell) => {
|
|
601
|
-
const cellRowspan = parseInt(cell.formats().rowspan, 10);
|
|
604
|
+
const cellRowspan = Number.parseInt(cell.formats().rowspan, 10);
|
|
602
605
|
const curRowspan = cellRowspan - removedRowsLength;
|
|
603
606
|
cell.domNode.removeAttribute("style");
|
|
604
607
|
cell.format("rowspan", curRowspan);
|
|
@@ -676,11 +679,7 @@ class TableContainer extends Container {
|
|
|
676
679
|
const cellFormats = cell.formats();
|
|
677
680
|
const tableCell = this.scroll.create(
|
|
678
681
|
TableCell.blotName,
|
|
679
|
-
{
|
|
680
|
-
...tableConfig.CELL_DEFAULT,
|
|
681
|
-
row: rId,
|
|
682
|
-
rowspan: cellFormats.rowspan
|
|
683
|
-
}
|
|
682
|
+
{ ...tableConfig.CELL_DEFAULT, row: rId, rowspan: cellFormats.rowspan }
|
|
684
683
|
);
|
|
685
684
|
const cellLine = this.scroll.create(TableCellLine.blotName, {
|
|
686
685
|
row: rId,
|
|
@@ -709,7 +708,7 @@ class TableContainer extends Container {
|
|
|
709
708
|
}
|
|
710
709
|
modifiedCells.forEach((cell) => {
|
|
711
710
|
const cellColspan = cell.formats().colspan;
|
|
712
|
-
cell.format("colspan", parseInt(cellColspan, 10) + 1);
|
|
711
|
+
cell.format("colspan", Number.parseInt(cellColspan, 10) + 1);
|
|
713
712
|
affectedCells.push(cell);
|
|
714
713
|
});
|
|
715
714
|
affectedCells.sort((cellA, cellB) => {
|
|
@@ -774,7 +773,7 @@ class TableContainer extends Container {
|
|
|
774
773
|
affectedCells.push(tableCell);
|
|
775
774
|
});
|
|
776
775
|
modifiedCells.forEach((cell) => {
|
|
777
|
-
const cellRowspan = parseInt(cell.formats().rowspan, 10);
|
|
776
|
+
const cellRowspan = Number.parseInt(cell.formats().rowspan, 10);
|
|
778
777
|
cell.format("rowspan", cellRowspan + 1);
|
|
779
778
|
affectedCells.push(cell);
|
|
780
779
|
});
|
|
@@ -803,7 +802,7 @@ class TableContainer extends Container {
|
|
|
803
802
|
result = tableCell;
|
|
804
803
|
if (rowspan > 1) {
|
|
805
804
|
const minHeight = tableConfig.CELL_MIN_HEIGHT * rowspan + rowspan - 1;
|
|
806
|
-
const cellHeight = parseInt(tableCell.domNode.style.height, 10) || 0;
|
|
805
|
+
const cellHeight = Number.parseInt(tableCell.domNode.style.height, 10) || 0;
|
|
807
806
|
if (cellHeight < minHeight) {
|
|
808
807
|
tableCell.domNode.style.height = `${minHeight}px`;
|
|
809
808
|
}
|
|
@@ -815,10 +814,10 @@ class TableContainer extends Container {
|
|
|
815
814
|
const cId = mergedCell.children.head.domNode.getAttribute("data-cell");
|
|
816
815
|
mergedCell.children.forEach((cellLine) => {
|
|
817
816
|
cellLine.domNode.setAttribute("data-parent-bg", mergedCell.domNode.style.backgroundColor);
|
|
818
|
-
if (cellLine.children
|
|
819
|
-
cellLine.children
|
|
817
|
+
if (cellLine.children.head.domNode.style) {
|
|
818
|
+
cellLine.children.head.domNode.style.backgroundColor = mergedCell.domNode.style.backgroundColor;
|
|
820
819
|
}
|
|
821
|
-
if (!cellLine.prev || cellLine.domNode.
|
|
820
|
+
if (!cellLine.prev || cellLine.domNode.textContent.trim()) {
|
|
822
821
|
cellLine.format("cell", cId);
|
|
823
822
|
cellLine.format("row", rId);
|
|
824
823
|
cellLine.format("colspan", colspan);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.cjs.js","sources":["../../../../src/table/formats/table.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { compare } from '../../utils/method'\r\nimport { isNullOrUndefined } from '../../config/editor.utils'\r\nimport {\r\n CELL_ATTRIBUTES,\r\n CELL_DEFAULT,\r\n CELL_IDENTITY_KEYS,\r\n CELL_MIN_HEIGHT,\r\n COL_ATTRIBUTES,\r\n COL_DEFAULT,\r\n ERROR_LIMIT,\r\n} from '../table-config'\r\nimport { getRelativeRect } from '../utils'\r\nimport Header from './header'\r\nimport ListItem, { ListContainer } from './list'\r\n\r\nconst Break = Quill.imports['blots/break']\r\nconst Block = Quill.imports['blots/block']\r\nconst Container = Quill.imports['blots/container']\r\n\r\n// @dynamic\r\nclass TableCellLine extends Block {\r\n static requiredContainer: any\r\n static tagName: string\r\n static className: string\r\n static blotName: any\r\n domNode: any\r\n statics: any\r\n wrap: any\r\n parent: any\r\n\r\n static create(value) {\r\n const node = super.create(value)\r\n\r\n // fix: when td has background-color, quill can't set it to table-cell blot\r\n if (value.tdBgColor) {\r\n node.setAttribute(`data-parent-bg`, value.tdBgColor)\r\n delete value.tdBgColor\r\n }\r\n\r\n CELL_IDENTITY_KEYS.forEach((key) => {\r\n const identityMaker = key === 'row' ? rowId : cellId\r\n node.setAttribute(`data-${key}`, value[key] || identityMaker())\r\n })\r\n\r\n CELL_ATTRIBUTES.forEach((attrName) => {\r\n const keyValue = value[attrName] || CELL_DEFAULT[attrName]\r\n keyValue && node.setAttribute(`data-${attrName}`, keyValue)\r\n })\r\n\r\n if (value.height) {\r\n node.setAttribute('height', value.height)\r\n }\r\n\r\n return node\r\n }\r\n\r\n static formats(domNode) {\r\n const formats = {}\r\n if (formats['list']) {\r\n formats['list'] = domNode.classList.item(0)\r\n }\r\n return reduceFormats(domNode, formats)\r\n }\r\n\r\n toggleAttribute(name, value) {\r\n if (value) {\r\n this.domNode.setAttribute(name, value)\r\n }\r\n else {\r\n this.domNode.removeAttribute(name)\r\n }\r\n }\r\n\r\n formatChildren(name, value) {\r\n this.children.forEach((child) => {\r\n child.format && child.format(name, value)\r\n if (!child.domNode.style) {\r\n return\r\n }\r\n if (child.domNode.tagName === 'SPAN' && value) {\r\n child.domNode.style.backgroundColor = value\r\n }\r\n else {\r\n child.domNode.style.backgroundColor = 'initial'\r\n }\r\n })\r\n }\r\n\r\n format(name, value) {\r\n if ([...CELL_ATTRIBUTES, ...CELL_IDENTITY_KEYS, 'parent-bg'].indexOf(name) > -1) {\r\n if (value) {\r\n this.domNode.setAttribute(`data-${name}`, value)\r\n }\r\n else {\r\n this.domNode.removeAttribute(`data-${name}`)\r\n }\r\n }\r\n else if (name === 'header') {\r\n if (!value) {\r\n return\r\n }\r\n const { row, cell, rowspan, colspan }: any = TableCellLine.formats(this.domNode)\r\n super.format(name, {\r\n value,\r\n row,\r\n cell,\r\n rowspan,\r\n colspan,\r\n })\r\n }\r\n else {\r\n super.format(name, value)\r\n }\r\n switch (true) {\r\n case name === 'cell-bg': {\r\n this.toggleAttribute('data-cell-bg', value)\r\n }\r\n }\r\n }\r\n\r\n optimize(context) {\r\n super.optimize(context)\r\n\r\n // cover shadowBlot's wrap call, pass params parentBlot initialize\r\n // needed\r\n const { row, cell, rowspan, colspan, cellBg } = this.domNode.dataset\r\n const formats: Record<string, any> = TableCellLine.formats(this.domNode)\r\n const parentFormats = this.parent.formats()\r\n if (this.statics.requiredContainer && !(this.parent instanceof this.statics.requiredContainer)) {\r\n this.wrap(this.statics.requiredContainer.blotName, { row, cell, rowspan, colspan, cellBg })\r\n }\r\n else if (!compare(formats, parentFormats)) {\r\n this.parent.format('row', formats.row)\r\n this.parent.format('cell', formats.cell)\r\n this.parent.format('rowspan', formats.rowspan)\r\n this.parent.format('colspan', formats.colspan)\r\n formats['cell-bg'] && this.parent.setCellBg(formats['cell-bg'])\r\n }\r\n\r\n const parentHeight = this.domNode.getAttribute('height')\r\n if (parentHeight) {\r\n this.parent.domNode.style.height = parentHeight\r\n }\r\n }\r\n\r\n tableCell() {\r\n return this.parent\r\n }\r\n}\r\nTableCellLine.blotName = 'table-cell-line'\r\nTableCellLine.className = 'qlbt-cell-line'\r\nTableCellLine.tagName = 'DIV'\r\n\r\n// @dynamic\r\nclass TableCell extends Container {\r\n static allowedChildren: any\r\n static blotName: any\r\n static requiredContainer: any\r\n static tagName: string\r\n next: any\r\n children: any\r\n parent: any\r\n domNode: any\r\n statics: any\r\n wrap: any\r\n splitAfter: any\r\n prev: any\r\n scroll: any\r\n\r\n static create(value = { row: rowId() }) {\r\n const node = super.create(value)\r\n\r\n CELL_IDENTITY_KEYS.forEach((key) => {\r\n node.setAttribute(`data-${key}`, value[key])\r\n })\r\n\r\n CELL_ATTRIBUTES.forEach((attrName) => {\r\n if (value[attrName]) {\r\n node.setAttribute(attrName, value[attrName])\r\n }\r\n })\r\n\r\n return node\r\n }\r\n\r\n static formats(domNode) {\r\n const formats = {\r\n height: undefined,\r\n row: undefined,\r\n }\r\n\r\n formats.height = domNode.getAttribute('height') || undefined\r\n\r\n if (domNode.hasAttribute('data-row')) {\r\n formats.row = domNode.getAttribute('data-row')\r\n }\r\n\r\n if (domNode.hasAttribute('data-cell-bg')) {\r\n formats['cell-bg'] = domNode.getAttribute('data-cell-bg') || undefined\r\n }\r\n return CELL_ATTRIBUTES.reduce((formats, attribute) => {\r\n if (domNode.hasAttribute(attribute)) {\r\n formats[attribute] = domNode.getAttribute(attribute)\r\n }\r\n\r\n return formats\r\n }, formats)\r\n }\r\n\r\n checkMerge() {\r\n if (super.checkMerge() && !isNullOrUndefined(this.next.children.head)) {\r\n const getCellId = (node) => {\r\n return (\r\n (node.formats && node.formats()[node.statics.blotName]) || {\r\n cell: node.domNode.getAttribute('data-cell'),\r\n }\r\n )\r\n }\r\n const thisHead = getCellId(this.children.head)\r\n const thisTail = getCellId(this.children.tail)\r\n const nextHead = getCellId(this.next.children.head)\r\n const nextTail = getCellId(this.next.children.tail)\r\n return thisHead.cell === thisTail.cell && thisHead.cell === nextHead.cell && thisHead.cell === nextTail.cell\r\n }\r\n return false\r\n }\r\n\r\n cellOffset() {\r\n if (this.parent) {\r\n return this.parent.children.indexOf(this)\r\n }\r\n return -1\r\n }\r\n\r\n formats() {\r\n const formats = {}\r\n\r\n if (this.domNode.hasAttribute('data-row')) {\r\n formats['row'] = this.domNode.getAttribute('data-row')\r\n }\r\n if (this.domNode.hasAttribute('data-cell')) {\r\n formats['cell'] = this.domNode.getAttribute('data-cell')\r\n }\r\n\r\n return CELL_ATTRIBUTES.reduce((tableFormats, attribute) => {\r\n if (this.domNode.hasAttribute(attribute)) {\r\n tableFormats[attribute] = this.domNode.getAttribute(attribute)\r\n }\r\n\r\n return tableFormats\r\n }, formats)\r\n }\r\n\r\n toggleAttribute(name, value) {\r\n if (value) {\r\n this.domNode.setAttribute(name, value)\r\n }\r\n else {\r\n this.domNode.removeAttribute(name)\r\n }\r\n }\r\n\r\n formatChildren(name, value) {\r\n this.children.forEach((child) => {\r\n child.format(name, value)\r\n })\r\n }\r\n\r\n /** this method is for TableCellLine to change cell background color\r\n * if use `format('cell-bg', value)` will loop trigger\r\n * TableCellLine.optimize -> TableCell.format -> TableCellLine.optimize ...\r\n */\r\n setCellBg(value?: string) {\r\n if (value) {\r\n this.domNode.style.backgroundColor = value\r\n }\r\n else {\r\n this.domNode.style.backgroundColor = 'initial'\r\n }\r\n }\r\n\r\n format(name, value) {\r\n const quill = Quill.find(this.scroll.domNode.parentNode)\r\n switch (true) {\r\n case CELL_ATTRIBUTES.indexOf(name) > -1:\r\n this.toggleAttribute(name, value)\r\n break\r\n case ['row', 'cell'].indexOf(name) > -1:\r\n this.toggleAttribute(`data-${name}`, value)\r\n break\r\n case name === 'background': {\r\n const hasBgColor = this.domNode.querySelectorAll('div.qlbt-cell-line[data-parent-bg]')\r\n hasBgColor.forEach(child => child.removeAttribute('data-parent-bg'))\r\n this.domNode.style.background = ''\r\n this.domNode.style.backgroundColor = value\r\n this.children.head.format('parent-bg', value)\r\n break\r\n }\r\n // TODO: 其他格式可同理实现,但已有格式清除时会清除所有格式,待解决\r\n case name === 'size': {\r\n const start = quill.getIndex(this.children.head)\r\n const total = quill.getIndex(this.children.tail) + this.children.tail.length()\r\n const length = total - start > 0 ? total - start : 0\r\n quill.setSelection(start, length, Quill.sources.USER)\r\n quill.format(name, value, Quill.sources.USER)\r\n // 设置选区后需清除选区,否则会固定处理选区内容\r\n quill.setSelection(start)\r\n }\r\n case name === 'cell-bg': {\r\n this.toggleAttribute('data-cell-bg', value)\r\n this.toggleAttribute('data-parent-bg', value)\r\n this.formatChildren(name, value)\r\n this.setCellBg(value)\r\n }\r\n }\r\n }\r\n\r\n optimize(context) {\r\n // fix: when td has background-color, quill can't set it to table-cell bolt\r\n const hasBg: any = Array.from(this.domNode.childNodes).find((item: any) => item.getAttribute('data-parent-bg'))\r\n const bgColor = hasBg && hasBg.getAttribute('data-parent-bg')\r\n if (bgColor && bgColor !== this.domNode.style.backgroundColor) {\r\n this.domNode.style.backgroundColor = bgColor\r\n }\r\n\r\n const rId = this.domNode.getAttribute('data-row')\r\n if (this.statics.requiredContainer && !(this.parent instanceof this.statics.requiredContainer)) {\r\n this.wrap(this.statics.requiredContainer.blotName, {\r\n row: rId,\r\n })\r\n }\r\n else if (rId !== this.parent.formats().row) {\r\n this.parent.format('row', rId)\r\n }\r\n\r\n this.children.forEach((child) => {\r\n if (isNullOrUndefined(child.next)) {\r\n return\r\n }\r\n const childFormats: any = this.getFormat(child.domNode)\r\n const nextFormats: any = this.getFormat(child.next.domNode)\r\n if (childFormats.cell !== nextFormats.cell) {\r\n const next = this.splitAfter(child)\r\n if (next) {\r\n next.optimize()\r\n }\r\n // We might be able to merge with prev now\r\n if (this.prev) {\r\n this.prev.optimize()\r\n }\r\n }\r\n })\r\n\r\n super.optimize(context)\r\n }\r\n\r\n // 兼容读取TableCell中的子blot,包括table-cell-line、line、head\r\n getFormat(domNode) {\r\n const formats = {}\r\n const firstChild = domNode.childNodes[0]\r\n if (firstChild && domNode.tagName === 'OL') {\r\n formats['list'] = firstChild.classList.item(0)\r\n }\r\n\r\n return reduceFormats(domNode, formats)\r\n }\r\n\r\n row() {\r\n return this.parent\r\n }\r\n\r\n rowOffset() {\r\n if (this.row()) {\r\n return -1\r\n }\r\n return this.row().rowOffset()\r\n }\r\n\r\n table() {\r\n return this.row() && this.row().table()\r\n }\r\n}\r\nTableCell.blotName = 'table'\r\nTableCell.tagName = 'TD'\r\n\r\n// @dynamic\r\nclass TableRow extends Container {\r\n static requiredContainer: any\r\n static allowedChildren: any\r\n static blotName: string\r\n static tagName: string\r\n next: any\r\n children: any\r\n domNode: any\r\n statics: any\r\n wrap: any\r\n splitAfter: any\r\n enforceAllowedChildren: any\r\n uiNode: any\r\n parent: any\r\n prev: any\r\n\r\n static create(value) {\r\n const node = super.create(value)\r\n if (value.row) {\r\n node.setAttribute('data-row', value.row)\r\n }\r\n return node\r\n }\r\n\r\n checkMerge() {\r\n if (super.checkMerge() && !isNullOrUndefined(this.next.children.head)) {\r\n const thisHead = this.children.head.formats()\r\n const thisTail = this.children.tail.formats()\r\n const nextHead = this.next.children.head.formats()\r\n const nextTail = this.next.children.tail.formats()\r\n\r\n return thisHead.row === thisTail.row && thisHead.row === nextHead.row && thisHead.row === nextTail.row\r\n }\r\n return false\r\n }\r\n\r\n formats() {\r\n return ['row'].reduce((formats, attrName) => {\r\n if (this.domNode.hasAttribute(`data-${attrName}`)) {\r\n formats[attrName] = this.domNode.getAttribute(`data-${attrName}`)\r\n }\r\n return formats\r\n }, {})\r\n }\r\n\r\n format(key, value) {\r\n this.domNode.setAttribute(`data-${key}`, value)\r\n }\r\n\r\n optimize(context) {\r\n // optimize function of ShadowBlot\r\n if (this.statics.requiredContainer && !(this.parent instanceof this.statics.requiredContainer)) {\r\n this.wrap(this.statics.requiredContainer.blotName)\r\n }\r\n\r\n this.children.forEach((child) => {\r\n if (isNullOrUndefined(child.next)) {\r\n return\r\n }\r\n const childFormats = child.formats()\r\n const nextFormats = child.next.formats()\r\n if (childFormats.row !== nextFormats.row) {\r\n const next = this.splitAfter(child)\r\n if (next) {\r\n next.optimize()\r\n }\r\n if (this.prev) {\r\n this.prev.optimize()\r\n }\r\n }\r\n })\r\n\r\n super.optimize(context)\r\n }\r\n\r\n rowOffset() {\r\n if (!this.parent) {\r\n return -1\r\n }\r\n return this.parent.children.indexOf(this)\r\n }\r\n\r\n table() {\r\n return this.parent && this.parent.parent\r\n }\r\n}\r\nTableRow.blotName = 'table-row'\r\nTableRow.tagName = 'TR'\r\n\r\n// @dynamic\r\nclass TableBody extends Container {\r\n static requiredContainer: any\r\n static allowedChildren: any\r\n static blotName: string\r\n static tagName: string\r\n}\r\nTableBody.blotName = 'table-body'\r\nTableBody.tagName = 'TBODY'\r\n\r\n// @dynamic\r\nclass TableCol extends Block {\r\n static requiredContainer: any\r\n static blotName: string\r\n static tagName: string\r\n domNode: any\r\n\r\n static create(value) {\r\n const node = super.create(value)\r\n COL_ATTRIBUTES.forEach((attrName) => {\r\n node.setAttribute(`${attrName}`, value[attrName] || COL_DEFAULT[attrName])\r\n })\r\n return node\r\n }\r\n\r\n static formats(domNode) {\r\n return COL_ATTRIBUTES.reduce((formats, attribute) => {\r\n if (domNode.hasAttribute(`${attribute}`)) {\r\n formats[attribute] = domNode.getAttribute(`${attribute}`) || undefined\r\n }\r\n return formats\r\n }, {})\r\n }\r\n\r\n format(name, value) {\r\n if (COL_ATTRIBUTES.indexOf(name) > -1) {\r\n this.domNode.setAttribute(`${name}`, value || COL_DEFAULT[name])\r\n }\r\n else {\r\n super.format(name, value)\r\n }\r\n }\r\n\r\n html() {\r\n return this.domNode.outerHTML\r\n }\r\n}\r\nTableCol.blotName = 'table-col'\r\nTableCol.tagName = 'col'\r\n\r\n// @dynamic\r\nclass TableColGroup extends Container {\r\n static requiredContainer: any\r\n static allowedChildren: any\r\n static blotName: string\r\n static tagName: string\r\n parent: any\r\n statics: any\r\n\r\n optimize(context) {\r\n super.optimize(context)\r\n // optimize 是当前slot更新后调用的callback方法,当TableBody更新后判断父容器的存在和类型相符则调用更新表格宽度方法更新宽度\r\n // 切记不要在当前slot内调用能改变当前slot的方法,会造成无限循环,一般通过子更新改变父较好\r\n if (this.parent && this.statics.requiredContainer && this.parent instanceof this.statics.requiredContainer) {\r\n this.parent.updateTableWidth()\r\n }\r\n // 此时colgroup创建完毕,检查colgroup的col数量是否正确\r\n // fix:colgroup的col数量不正确导致最后一列宽度为空\r\n if (this.parent.parent.domNode.className === 'quill-better-table-wrapper'\r\n && this.parent.parent.domNode.tagName === 'DIV'\r\n && this.parent.domNode.children.length >= 2\r\n && this.parent.domNode.children[0].tagName === 'COLGROUP'\r\n && this.parent.domNode.children[1].tagName === 'TBODY'\r\n ) {\r\n let trId = ''\r\n let colSpan = 0\r\n let colgroupNumber = 0\r\n for (let i = 0; i < this.parent.domNode.children.length; i++) {\r\n if (this.parent.domNode.children[i].tagName === 'TBODY') {\r\n if (trId === '') {\r\n trId = this.parent.domNode.children[i].children[0].getAttribute('data-row')\r\n }\r\n colSpan = this.findTdColspanInTbody(this.parent.domNode.children[i], trId)\r\n }\r\n else if (this.parent.domNode.children[i].tagName === 'COLGROUP') {\r\n colgroupNumber = this.parent.domNode.children[i].children.length\r\n }\r\n }\r\n let elementSibling = this.parent.domNode.nextElementSibling\r\n\r\n while (elementSibling && elementSibling.tagName === 'TABLE') {\r\n for (let i = 0; i < elementSibling.children.length; i++) {\r\n if (elementSibling.children[i].tagName === 'TBODY') {\r\n colSpan += this.findTdColspanInTbody(elementSibling.children[i], trId)\r\n }\r\n }\r\n elementSibling = elementSibling.nextElementSibling\r\n }\r\n\r\n if (colgroupNumber < colSpan) {\r\n const length = colSpan - colgroupNumber\r\n\r\n for (let i = 0; i < length; i++) {\r\n const newCol = document.createElement('col')\r\n newCol.width = this.parent.domNode.children[0].children[this.parent.domNode.children[0].children.length - 1].width\r\n const newBr = document.createElement('br')\r\n newCol.appendChild(newBr)\r\n this.parent.domNode.children[0].appendChild(newCol)\r\n this.parent.domNode.style.width += newCol.width\r\n }\r\n }\r\n }\r\n }\r\n\r\n // this.parent.domNode.children[1].children[0].children[0].colSpan\r\n findTdColspanInTbody(tbody, trId) {\r\n let colSpan = 0\r\n // let tbodyChildrenLength\r\n for (let i = 0; i < tbody.children.length; i++) {\r\n if (tbody.children[i].getAttribute('data-row') !== trId) {\r\n return colSpan\r\n }\r\n for (let j = 0; j < tbody.children[i].children.length; j++) {\r\n if (tbody.children[i].children[j].colSpan) {\r\n colSpan += tbody.children[i].children[j].colSpan\r\n }\r\n }\r\n }\r\n return colSpan\r\n }\r\n}\r\nTableColGroup.blotName = 'table-col-group'\r\nTableColGroup.tagName = 'colgroup'\r\n\r\n// @dynamic\r\nclass TableContainer extends Container {\r\n static blotName: string\r\n static className: string\r\n static tagName: string\r\n static requiredContainer: any\r\n static allowedChildren: any\r\n domNode: any\r\n parent: any\r\n children: any\r\n descendants: any\r\n scroll: any\r\n remove: any\r\n static create() {\r\n const node = super.create()\r\n return node\r\n }\r\n\r\n constructor(scroll, domNode) {\r\n super(scroll, domNode)\r\n domNode.setAttribute('contenteditable', false)\r\n this.updateTableWidth()\r\n }\r\n\r\n updateTableWidth() {\r\n let colGroup = this.colGroup()\r\n if (!colGroup) {\r\n // undo时原表格dom被移除,因此colGroup和domNode都不对应当前新表格,需从父容器dom树重新获取\r\n // 如果表格有style属性则不为新添加表格,避免错误赋值\r\n if (this.parent && this.parent.children.head && this.domNode.hasAttribute('style')) {\r\n colGroup = this.parent.children.head.children.head\r\n this.domNode = this.parent.children.head.domNode\r\n }\r\n else if (this.domNode.tagName === 'TABLE') {\r\n // this.domNode.forEach\r\n return\r\n }\r\n else {\r\n return\r\n }\r\n }\r\n const tableWidth = colGroup.children.reduce((sumWidth, col) => {\r\n // 兼容 table-col 不存在的情况\r\n const tableCol = col.formats()[TableCol.blotName]\r\n let tableColWidth = COL_DEFAULT.width\r\n if (tableCol && tableCol.width) {\r\n tableColWidth = parseInt(tableCol.width, 10)\r\n }\r\n sumWidth = sumWidth + tableColWidth\r\n return sumWidth\r\n }, 0)\r\n this.domNode.removeAttribute('style')\r\n this.domNode.style.width = `${tableWidth}px`\r\n // 当表格加载结束后修正width设定为auto的列宽度\r\n if (colGroup.next) {\r\n setTimeout(() => {\r\n let tdIndex = 0\r\n let maxTds\r\n const colNum = colGroup.children.length\r\n const tableRows = this.descendants(TableRow)\r\n // 查询单元格数等于列数的行作为宽度赋值依据\r\n for (let i = 0; i < tableRows.length; i++) {\r\n const tds = tableRows[i].domNode.querySelectorAll('td')\r\n if (tds.length === colNum) {\r\n maxTds = tds\r\n break\r\n }\r\n }\r\n colGroup.children.forEach((col) => {\r\n if (maxTds && col.domNode.width === 'auto') {\r\n const width = getComputedStyle(maxTds[tdIndex])['width']\r\n const num = parseInt(width, 10)\r\n col.domNode.width = (num < COL_DEFAULT.width && COL_DEFAULT.width) || num\r\n }\r\n tdIndex++\r\n })\r\n })\r\n }\r\n }\r\n\r\n cells(column) {\r\n return this.rows().map(row => row.children.at(column))\r\n }\r\n\r\n colGroup() {\r\n return this.children.head\r\n }\r\n\r\n deleteColumns(compareRect, delIndexes = [], editorWrapper) {\r\n const [body] = this.descendants(TableBody)\r\n if (isNullOrUndefined(body) || isNullOrUndefined(body.children.head)) {\r\n return\r\n }\r\n\r\n const tableCells = this.descendants(TableCell)\r\n const removedCells = []\r\n const modifiedCells = []\r\n\r\n tableCells.forEach((cell) => {\r\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper)\r\n\r\n if (cellRect.x + ERROR_LIMIT > compareRect.x && cellRect.x1 - ERROR_LIMIT < compareRect.x1) {\r\n removedCells.push(cell)\r\n }\r\n else if (cellRect.x < compareRect.x + ERROR_LIMIT && cellRect.x1 > compareRect.x1 - ERROR_LIMIT) {\r\n modifiedCells.push(cell)\r\n }\r\n })\r\n\r\n if (removedCells.length === tableCells.length) {\r\n this.tableDestroy()\r\n return true\r\n }\r\n\r\n // remove the matches column tool cell\r\n delIndexes.forEach(() => {\r\n const col = this.colGroup().children.at(delIndexes[0])\r\n if (!col || this.colGroup().children.at(delIndexes[0]).domNode !== this.colGroup().domNode.children[delIndexes[0]]) {\r\n this.colGroup().domNode.removeChild(this.colGroup().domNode.children[delIndexes[0]])\r\n }\r\n else {\r\n col.remove()\r\n }\r\n })\r\n\r\n removedCells.forEach((cell) => {\r\n cell.remove()\r\n })\r\n\r\n modifiedCells.forEach((cell) => {\r\n const cellColspan = parseInt(cell.formats().colspan, 10)\r\n // const cellWidth = parseInt(cell.formats().width, 10);\r\n cell.format('colspan', cellColspan - delIndexes.length)\r\n })\r\n\r\n this.updateTableWidth()\r\n }\r\n\r\n deleteRow(compareRect, editorWrapper) {\r\n const [body] = this.descendants(TableBody)\r\n if (isNullOrUndefined(body) || isNullOrUndefined(body.children.head)) {\r\n return\r\n }\r\n\r\n const tableCells = this.descendants(TableCell)\r\n const tableRows = this.descendants(TableRow)\r\n const removedCells = [] // cells to be removed\r\n const modifiedCells = [] // cells to be modified\r\n const fallCells = [] // cells to fall into next row\r\n\r\n tableCells.forEach((cell) => {\r\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper)\r\n\r\n if (cellRect.y > compareRect.y - ERROR_LIMIT && cellRect.y1 < compareRect.y1 + ERROR_LIMIT) {\r\n removedCells.push(cell)\r\n }\r\n else if (cellRect.y < compareRect.y + ERROR_LIMIT && cellRect.y1 > compareRect.y1 - ERROR_LIMIT) {\r\n modifiedCells.push(cell)\r\n\r\n if (Math.abs(cellRect.y - compareRect.y) < ERROR_LIMIT) {\r\n fallCells.push(cell)\r\n }\r\n }\r\n })\r\n\r\n if (removedCells.length === tableCells.length) {\r\n this.tableDestroy()\r\n return\r\n }\r\n\r\n // compute length of removed rows\r\n const removedRowsLength = this.rows().reduce((sum, row) => {\r\n const rowRect = getRelativeRect(row.domNode.getBoundingClientRect(), editorWrapper)\r\n\r\n if (rowRect.y > compareRect.y - ERROR_LIMIT && rowRect.y1 < compareRect.y1 + ERROR_LIMIT) {\r\n sum += 1\r\n }\r\n return sum\r\n }, 0)\r\n\r\n // it must execute before the table layout changed with other operation\r\n fallCells.forEach((cell) => {\r\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper)\r\n const nextRow = cell.parent.next\r\n const cellsInNextRow = nextRow.children\r\n\r\n const refCell = cellsInNextRow.reduce((ref, compareCell) => {\r\n const compareCellRect = getRelativeRect(compareCell.domNode.getBoundingClientRect(), editorWrapper)\r\n if (cellRect.x1 - compareCellRect.x < ERROR_LIMIT) {\r\n ref = compareCell\r\n }\r\n return ref\r\n }, null)\r\n\r\n nextRow.insertBefore(cell, refCell)\r\n const curRowId = nextRow.formats().row\r\n cell.format('row', curRowId)\r\n cell.children.forEach((cellLine) => {\r\n cellLine.format('row', curRowId)\r\n })\r\n })\r\n\r\n modifiedCells.forEach((cell) => {\r\n const cellRowspan = parseInt(cell.formats().rowspan, 10)\r\n const curRowspan = cellRowspan - removedRowsLength\r\n cell.domNode.removeAttribute('style')\r\n cell.format('rowspan', curRowspan)\r\n cell.children.forEach((cellLine) => {\r\n cellLine.format('rowspan', curRowspan)\r\n })\r\n })\r\n\r\n removedCells.forEach((cell) => {\r\n cell.remove()\r\n })\r\n\r\n // fix: There will be a empty tr left if i delete the last row of a table,\r\n // this will cause the bottom border of the table to disappear,\r\n // and the empty tr will execute the matchTableRow method.\r\n tableRows.forEach((row) => {\r\n if (row.children.length === 0) {\r\n row.remove()\r\n }\r\n })\r\n }\r\n\r\n tableDestroy() {\r\n const quill = Quill.find(this.scroll.domNode.parentNode)\r\n const tableModule = quill.getModule('better-table')\r\n this.remove()\r\n tableModule.hideTableTools()\r\n quill.update(Quill.sources.USER)\r\n }\r\n\r\n insertCell(tableRow, ref, bg = '') {\r\n const id = cellId()\r\n const rId = tableRow.formats().row\r\n const tableCell = this.scroll.create(\r\n TableCell.blotName,\r\n { ...CELL_DEFAULT, row: rId },\r\n )\r\n tableCell.domNode.style.backgroundColor = bg\r\n const cellLine = this.scroll.create(TableCellLine.blotName, {\r\n row: rId,\r\n cell: id,\r\n })\r\n tableCell.appendChild(cellLine)\r\n\r\n if (ref) {\r\n tableRow.insertBefore(tableCell, ref)\r\n }\r\n else {\r\n tableRow.appendChild(tableCell)\r\n }\r\n }\r\n\r\n insertColumn(compareRect, colIndex, isRight = true, editorWrapper) {\r\n const [body] = this.descendants(TableBody)\r\n const [tableColGroup] = this.descendants(TableColGroup)\r\n const tableCols = this.descendants(TableCol)\r\n const addAsideCells = []\r\n const modifiedCells = []\r\n const affectedCells = []\r\n\r\n if (isNullOrUndefined(body) || isNullOrUndefined(body.children.head)) {\r\n return\r\n }\r\n const tableCells = this.descendants(TableCell)\r\n tableCells.forEach((cell) => {\r\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper)\r\n\r\n if (isRight) {\r\n if (Math.abs(cellRect.x1 - compareRect.x1) < ERROR_LIMIT) {\r\n // the right of selected boundary equal to the right of table cell,\r\n // add a new table cell right aside this table cell\r\n addAsideCells.push(cell)\r\n }\r\n else if (compareRect.x1 - cellRect.x > ERROR_LIMIT && compareRect.x1 - cellRect.x1 < -ERROR_LIMIT) {\r\n // the right of selected boundary is inside this table cell\r\n // colspan of this table cell will increase 1\r\n modifiedCells.push(cell)\r\n }\r\n }\r\n else {\r\n if (Math.abs(cellRect.x - compareRect.x) < ERROR_LIMIT) {\r\n // left of selected boundary equal to left of table cell,\r\n // add a new table cell left aside this table cell\r\n addAsideCells.push(cell)\r\n }\r\n else if (compareRect.x - cellRect.x > ERROR_LIMIT && compareRect.x - cellRect.x1 < -ERROR_LIMIT) {\r\n // the left of selected boundary is inside this table cell\r\n // colspan of this table cell will increase 1\r\n modifiedCells.push(cell)\r\n }\r\n }\r\n })\r\n\r\n addAsideCells.forEach((cell) => {\r\n const ref = isRight ? cell.next : cell\r\n const id = cellId()\r\n const tableRow = cell.parent\r\n const rId = tableRow.formats().row\r\n const cellFormats = cell.formats()\r\n const tableCell = this.scroll.create(\r\n TableCell.blotName,\r\n { ...CELL_DEFAULT, row: rId,\r\n rowspan: cellFormats.rowspan },\r\n )\r\n const cellLine = this.scroll.create(TableCellLine.blotName, {\r\n row: rId,\r\n cell: id,\r\n rowspan: cellFormats.rowspan,\r\n })\r\n tableCell.appendChild(cellLine)\r\n\r\n if (ref) {\r\n tableRow.insertBefore(tableCell, ref)\r\n }\r\n else {\r\n tableRow.appendChild(tableCell)\r\n }\r\n affectedCells.push(tableCell)\r\n })\r\n\r\n // insert new tableCol\r\n const tableCol = this.scroll.create(TableCol.blotName, true)\r\n let colRef\r\n if (isRight) {\r\n colRef = tableCols[colIndex] && tableCols[colIndex].next\r\n }\r\n else {\r\n colRef = tableCols[colIndex]\r\n }\r\n\r\n if (colRef) {\r\n tableColGroup.insertBefore(tableCol, colRef)\r\n }\r\n else {\r\n tableColGroup.appendChild(tableCol)\r\n }\r\n\r\n modifiedCells.forEach((cell) => {\r\n const cellColspan = cell.formats().colspan\r\n cell.format('colspan', parseInt(cellColspan, 10) + 1)\r\n affectedCells.push(cell)\r\n })\r\n\r\n affectedCells.sort((cellA, cellB) => {\r\n const y1 = cellA.domNode.getBoundingClientRect().y\r\n const y2 = cellB.domNode.getBoundingClientRect().y\r\n return y1 - y2\r\n })\r\n\r\n this.updateTableWidth()\r\n return affectedCells\r\n }\r\n\r\n insertRow(compareRect, isDown, editorWrapper) {\r\n const [body] = this.descendants(TableBody)\r\n if (isNullOrUndefined(body) || isNullOrUndefined(body.children.head)) {\r\n return\r\n }\r\n\r\n const tableCells = this.descendants(TableCell)\r\n const rId = rowId()\r\n const newRow = this.scroll.create(TableRow.blotName, {\r\n row: rId,\r\n })\r\n const addBelowCells = []\r\n const modifiedCells = []\r\n const affectedCells = []\r\n\r\n tableCells.forEach((cell) => {\r\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper)\r\n\r\n if (isDown) {\r\n if (Math.abs(cellRect.y1 - compareRect.y1) < ERROR_LIMIT) {\r\n addBelowCells.push(cell)\r\n }\r\n else if (compareRect.y1 - cellRect.y > ERROR_LIMIT && compareRect.y1 - cellRect.y1 < -ERROR_LIMIT) {\r\n modifiedCells.push(cell)\r\n }\r\n }\r\n else {\r\n if (Math.abs(cellRect.y - compareRect.y) < ERROR_LIMIT) {\r\n addBelowCells.push(cell)\r\n }\r\n else if (compareRect.y - cellRect.y > ERROR_LIMIT && compareRect.y - cellRect.y1 < -ERROR_LIMIT) {\r\n modifiedCells.push(cell)\r\n }\r\n }\r\n })\r\n\r\n // ordered table cells with rect.x, fix error for inserting\r\n // new table cell in complicated table with wrong order.\r\n const sortFunc = (cellA, cellB) => {\r\n const x1 = cellA.domNode.getBoundingClientRect().x\r\n const x2 = cellB.domNode.getBoundingClientRect().x\r\n return x1 - x2\r\n }\r\n addBelowCells.sort(sortFunc)\r\n\r\n addBelowCells.forEach((cell) => {\r\n const cId = cellId()\r\n const cellFormats = cell.formats()\r\n\r\n const tableCell = this.scroll.create(\r\n TableCell.blotName,\r\n { ...CELL_DEFAULT, row: rId, cell: cId, colspan: cellFormats.colspan },\r\n )\r\n const cellLine = this.scroll.create(TableCellLine.blotName, {\r\n row: rId,\r\n cell: cId,\r\n colspan: cellFormats.colspan,\r\n })\r\n const empty = this.scroll.create(Break.blotName)\r\n cellLine.appendChild(empty)\r\n tableCell.appendChild(cellLine)\r\n newRow.appendChild(tableCell)\r\n affectedCells.push(tableCell)\r\n })\r\n\r\n modifiedCells.forEach((cell) => {\r\n const cellRowspan = parseInt(cell.formats().rowspan, 10)\r\n cell.format('rowspan', cellRowspan + 1)\r\n affectedCells.push(cell)\r\n })\r\n\r\n const refRow = this.rows().find((row) => {\r\n const rowRect = getRelativeRect(row.domNode.getBoundingClientRect(), editorWrapper)\r\n if (isDown) {\r\n return Math.abs(rowRect.y - compareRect.y - compareRect.height) < ERROR_LIMIT\r\n }\r\n else {\r\n return Math.abs(rowRect.y - compareRect.y) < ERROR_LIMIT\r\n }\r\n })\r\n body.insertBefore(newRow, refRow)\r\n\r\n // reordering affectedCells\r\n affectedCells.sort(sortFunc)\r\n return affectedCells\r\n }\r\n\r\n mergeCells(_compareRect, mergingCells, rowspan, colspan, _editorWrapper) {\r\n const mergedCell = mergingCells.reduce((result, tableCell, index) => {\r\n if (index !== 0) {\r\n if (result) {\r\n tableCell.moveChildren(result)\r\n }\r\n tableCell.remove()\r\n }\r\n else {\r\n tableCell.format('colspan', colspan)\r\n tableCell.format('rowspan', rowspan)\r\n result = tableCell\r\n if (rowspan > 1) {\r\n // fix: 比较当前单元格高度样式与rowspan最小高度,小于则设置高度,不判断实际高度,因为合并时这一刻实际高度可能高于最小高度\r\n const minHeight = CELL_MIN_HEIGHT * rowspan + rowspan - 1\r\n const cellHeight = parseInt(tableCell.domNode.style.height, 10) || 0\r\n if (cellHeight < minHeight) {\r\n tableCell.domNode.style.height = `${minHeight}px`\r\n }\r\n }\r\n }\r\n\r\n return result\r\n }, null)\r\n\r\n const rId = mergedCell.domNode.getAttribute('data-row')\r\n const cId = mergedCell.children.head.domNode.getAttribute('data-cell')\r\n mergedCell.children.forEach((cellLine) => {\r\n cellLine.domNode.setAttribute('data-parent-bg', mergedCell.domNode.style.backgroundColor)\r\n if (cellLine.children['head'].domNode.style) {\r\n cellLine.children['head'].domNode.style.backgroundColor = mergedCell.domNode.style.backgroundColor\r\n }\r\n\r\n if (!cellLine.prev || cellLine.domNode.innerText.trim()) {\r\n cellLine.format('cell', cId)\r\n cellLine.format('row', rId)\r\n cellLine.format('colspan', colspan)\r\n cellLine.format('rowspan', rowspan)\r\n }\r\n else {\r\n cellLine.remove()\r\n }\r\n })\r\n\r\n return mergedCell\r\n }\r\n\r\n unmergeCells(unmergingCells, editorWrapper) {\r\n let cellFormats: any = {}\r\n let cellRowspan = 1\r\n let cellColspan = 1\r\n\r\n unmergingCells.forEach((tableCell) => {\r\n const tableCellBgColor = tableCell.domNode.style.backgroundColor\r\n cellFormats = tableCell.formats()\r\n cellRowspan = cellFormats.rowspan\r\n cellColspan = cellFormats.colspan\r\n\r\n if (cellColspan > 1) {\r\n const ref = tableCell.next\r\n const row = tableCell.row()\r\n tableCell.format('colspan', 1)\r\n if (tableCell.domNode.children && tableCell.domNode.children[0].tagName === 'DIV' && tableCell.domNode.children[0].getAttribute('data-colspan')) {\r\n tableCell.domNode.children[0].setAttribute('data-colspan', 1)\r\n }\r\n for (let colspanIndex = cellColspan; colspanIndex > 1; colspanIndex--) {\r\n this.insertCell(row, ref, tableCellBgColor)\r\n }\r\n }\r\n\r\n if (cellRowspan > 1) {\r\n let rowspanIndex = cellRowspan\r\n let nextRow = tableCell.row().next\r\n while (rowspanIndex > 1) {\r\n const refInNextRow = nextRow.children.reduce((result, cell) => {\r\n const compareRect = getRelativeRect(tableCell.domNode.getBoundingClientRect(), editorWrapper)\r\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper)\r\n if (Math.abs(compareRect.x1 - cellRect.x) < ERROR_LIMIT) {\r\n result = cell\r\n }\r\n return result\r\n }, null)\r\n\r\n for (let colspanIndex = cellColspan; colspanIndex > 0; colspanIndex--) {\r\n this.insertCell(nextRow, refInNextRow, tableCellBgColor)\r\n }\r\n\r\n rowspanIndex -= 1\r\n nextRow = nextRow.next\r\n }\r\n\r\n tableCell.domNode.removeAttribute('style')\r\n if (tableCell.domNode.children && tableCell.domNode.children[0].tagName === 'DIV' && tableCell.domNode.children[0].getAttribute('data-rowspan')) {\r\n tableCell.domNode.children[0].setAttribute('data-rowspan', 1)\r\n }\r\n tableCell.format('rowspan', 1)\r\n }\r\n })\r\n }\r\n\r\n emptyCells(selectedTds) {\r\n selectedTds.forEach((selectedTd) => {\r\n // 构造空的table cell line, 优先使用单元格已有rowId和cellId,避免从table-cell-line向上层td提交id时不一致导致错位\r\n const cellFormats = selectedTd.formats()\r\n const cellLine = this.scroll.create(TableCellLine.blotName, {\r\n row: cellFormats.row || rowId(),\r\n cell: cellFormats.cell || cellId(),\r\n rowspan: cellFormats.rowspan,\r\n colspan: cellFormats.colspan,\r\n })\r\n const empty = this.scroll.create(Break.blotName)\r\n cellLine.appendChild(empty)\r\n\r\n selectedTd.domNode.innerHTML = ''\r\n selectedTd.appendChild(cellLine)\r\n })\r\n }\r\n\r\n rows() {\r\n const body = this.children.tail\r\n if (isNullOrUndefined(body)) {\r\n return []\r\n }\r\n return body.children.map(row => row)\r\n }\r\n}\r\nTableContainer.blotName = 'ql-table-container'\r\nTableContainer.className = 'quill-better-table'\r\nTableContainer.tagName = 'TABLE'\r\n\r\n// @dynamic\r\nclass TableViewWrapper extends Container {\r\n static blotName: string\r\n static tagName: string\r\n static className: string\r\n static allowedChildren: any\r\n constructor(scroll, domNode) {\r\n super(scroll, domNode)\r\n const quill = Quill.find(scroll.domNode.parentNode)\r\n // fix: 只读模式时超长表格默认包含滚动条\r\n if (quill.options.readOnly) {\r\n domNode.style.overflow = 'auto'\r\n }\r\n domNode.addEventListener(\r\n 'scroll',\r\n (e) => {\r\n const tableModule = quill.getModule('better-table')\r\n if (tableModule.columnTool) {\r\n tableModule.columnTool.domNode.scrollLeft = e.target.scrollLeft\r\n }\r\n\r\n if (tableModule.tableSelection && tableModule.tableSelection.selectedTds.length > 0) {\r\n tableModule.tableSelection.repositionHelpLines()\r\n }\r\n },\r\n false,\r\n )\r\n }\r\n}\r\nTableViewWrapper.blotName = 'table-view'\r\nTableViewWrapper.className = 'quill-better-table-wrapper'\r\nTableViewWrapper.tagName = 'DIV'\r\n\r\nTableViewWrapper.allowedChildren = [TableContainer]\r\nTableContainer.requiredContainer = TableViewWrapper\r\n\r\nTableContainer.allowedChildren = [TableBody, TableColGroup]\r\nTableBody.requiredContainer = TableContainer\r\n\r\nTableBody.allowedChildren = [TableRow]\r\nTableRow.requiredContainer = TableBody\r\n\r\nTableRow.allowedChildren = [TableCell]\r\nTableCell.requiredContainer = TableRow\r\n\r\nTableCell.allowedChildren = [TableCellLine, Header, ListItem, ListContainer]\r\nTableCellLine.requiredContainer = TableCell\r\n\r\nTableColGroup.allowedChildren = [TableCol]\r\nTableColGroup.requiredContainer = TableContainer\r\n\r\nTableCol.requiredContainer = TableColGroup\r\n\r\nfunction rowId() {\r\n const id = Math.random().toString(36).slice(2, 6)\r\n return `row-${id}`\r\n}\r\n\r\nfunction cellId() {\r\n const id = Math.random().toString(36).slice(2, 6)\r\n return `cell-${id}`\r\n}\r\n\r\nfunction reduceFormats(domNode: HTMLElement, formats: Record<string, any>) {\r\n return [...CELL_ATTRIBUTES, ...CELL_IDENTITY_KEYS].reduce((tableFormats, attribute) => {\r\n if (domNode.hasAttribute(`data-${attribute}`)) {\r\n tableFormats[attribute] = domNode.getAttribute(`data-${attribute}`) || undefined\r\n }\r\n return tableFormats\r\n }, formats)\r\n}\r\n\r\nexport {\r\n CELL_ATTRIBUTES,\r\n CELL_IDENTITY_KEYS,\r\n cellId,\r\n rowId,\r\n TableBody,\r\n TableCell,\r\n TableCellLine,\r\n TableCol,\r\n TableColGroup,\r\n TableContainer,\r\n TableRow,\r\n TableViewWrapper,\r\n}\r\n"],"names":["CELL_IDENTITY_KEYS","CELL_ATTRIBUTES","CELL_DEFAULT","compare","formats","isNullOrUndefined","COL_ATTRIBUTES","COL_DEFAULT","getRelativeRect","ERROR_LIMIT","index","CELL_MIN_HEIGHT","Header","ListItem","ListContainer"],"mappings":";;;;;;;;;AAgBA,MAAM,QAAQ,MAAM,QAAQ,aAAa;AACzC,MAAM,QAAQ,MAAM,QAAQ,aAAa;AACzC,MAAM,YAAY,MAAM,QAAQ,iBAAiB;AAGjD,MAAM,sBAAsB,MAAM;AAAA,EAUhC,OAAO,OAAO,OAAO;AACb,UAAA,OAAO,MAAM,OAAO,KAAK;AAG/B,QAAI,MAAM,WAAW;AACd,WAAA,aAAa,kBAAkB,MAAM,SAAS;AACnD,aAAO,MAAM;AAAA,IACf;AAEmBA,mCAAA,QAAQ,CAAC,QAAQ;AAC5B,YAAA,gBAAgB,QAAQ,QAAQ,QAAQ;AACzC,WAAA,aAAa,QAAQ,GAAG,IAAI,MAAM,GAAG,KAAK,eAAe;AAAA,IAAA,CAC/D;AAEeC,gCAAA,QAAQ,CAAC,aAAa;AACpC,YAAM,WAAW,MAAM,QAAQ,KAAKC,yBAAa,QAAQ;AACzD,kBAAY,KAAK,aAAa,QAAQ,QAAQ,IAAI,QAAQ;AAAA,IAAA,CAC3D;AAED,QAAI,MAAM,QAAQ;AACX,WAAA,aAAa,UAAU,MAAM,MAAM;AAAA,IAC1C;AAEO,WAAA;AAAA,EACT;AAAA,EAEA,OAAO,QAAQ,SAAS;AACtB,UAAM,UAAU,CAAA;AACZ,QAAA,QAAQ,MAAM,GAAG;AACnB,cAAQ,MAAM,IAAI,QAAQ,UAAU,KAAK,CAAC;AAAA,IAC5C;AACO,WAAA,cAAc,SAAS,OAAO;AAAA,EACvC;AAAA,EAEA,gBAAgB,MAAM,OAAO;AAC3B,QAAI,OAAO;AACJ,WAAA,QAAQ,aAAa,MAAM,KAAK;AAAA,IAAA,OAElC;AACE,WAAA,QAAQ,gBAAgB,IAAI;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,eAAe,MAAM,OAAO;AACrB,SAAA,SAAS,QAAQ,CAAC,UAAU;AAC/B,YAAM,UAAU,MAAM,OAAO,MAAM,KAAK;AACpC,UAAA,CAAC,MAAM,QAAQ,OAAO;AACxB;AAAA,MACF;AACA,UAAI,MAAM,QAAQ,YAAY,UAAU,OAAO;AACvC,cAAA,QAAQ,MAAM,kBAAkB;AAAA,MAAA,OAEnC;AACG,cAAA,QAAQ,MAAM,kBAAkB;AAAA,MACxC;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,OAAO,MAAM,OAAO;AACd,QAAA,CAAC,GAAGD,6BAAiB,GAAGD,gCAAoB,WAAW,EAAE,QAAQ,IAAI,IAAI,IAAI;AAC/E,UAAI,OAAO;AACT,aAAK,QAAQ,aAAa,QAAQ,IAAI,IAAI,KAAK;AAAA,MAAA,OAE5C;AACH,aAAK,QAAQ,gBAAgB,QAAQ,IAAI,EAAE;AAAA,MAC7C;AAAA,IAAA,WAEO,SAAS,UAAU;AAC1B,UAAI,CAAC,OAAO;AACV;AAAA,MACF;AACM,YAAA,EAAE,KAAK,MAAM,SAAS,YAAiB,cAAc,QAAQ,KAAK,OAAO;AAC/E,YAAM,OAAO,MAAM;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IAAA,OAEE;AACG,YAAA,OAAO,MAAM,KAAK;AAAA,IAC1B;AACA,YAAQ,MAAM;AAAA,MACZ,KAAK,SAAS,WAAW;AAClB,aAAA,gBAAgB,gBAAgB,KAAK;AAAA,MAC5C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAS,SAAS;AAChB,UAAM,SAAS,OAAO;AAIhB,UAAA,EAAE,KAAK,MAAM,SAAS,SAAS,WAAW,KAAK,QAAQ;AAC7D,UAAM,UAA+B,cAAc,QAAQ,KAAK,OAAO;AACjE,UAAA,gBAAgB,KAAK,OAAO,QAAQ;AACtC,QAAA,KAAK,QAAQ,qBAAqB,EAAE,KAAK,kBAAkB,KAAK,QAAQ,oBAAoB;AACzF,WAAA,KAAK,KAAK,QAAQ,kBAAkB,UAAU,EAAE,KAAK,MAAM,SAAS,SAAS,OAAQ,CAAA;AAAA,IAEnF,WAAA,CAACG,OAAAA,QAAQ,SAAS,aAAa,GAAG;AACzC,WAAK,OAAO,OAAO,OAAO,QAAQ,GAAG;AACrC,WAAK,OAAO,OAAO,QAAQ,QAAQ,IAAI;AACvC,WAAK,OAAO,OAAO,WAAW,QAAQ,OAAO;AAC7C,WAAK,OAAO,OAAO,WAAW,QAAQ,OAAO;AAC7C,cAAQ,SAAS,KAAK,KAAK,OAAO,UAAU,QAAQ,SAAS,CAAC;AAAA,IAChE;AAEA,UAAM,eAAe,KAAK,QAAQ,aAAa,QAAQ;AACvD,QAAI,cAAc;AACX,WAAA,OAAO,QAAQ,MAAM,SAAS;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,YAAY;AACV,WAAO,KAAK;AAAA,EACd;AACF;AACA,cAAc,WAAW;AACzB,cAAc,YAAY;AAC1B,cAAc,UAAU;AAGxB,MAAM,kBAAkB,UAAU;AAAA,EAehC,OAAO,OAAO,QAAQ,EAAE,KAAK,WAAW;AAChC,UAAA,OAAO,MAAM,OAAO,KAAK;AAEZH,mCAAA,QAAQ,CAAC,QAAQ;AAClC,WAAK,aAAa,QAAQ,GAAG,IAAI,MAAM,GAAG,CAAC;AAAA,IAAA,CAC5C;AAEeC,gCAAA,QAAQ,CAAC,aAAa;AAChC,UAAA,MAAM,QAAQ,GAAG;AACnB,aAAK,aAAa,UAAU,MAAM,QAAQ,CAAC;AAAA,MAC7C;AAAA,IAAA,CACD;AAEM,WAAA;AAAA,EACT;AAAA,EAEA,OAAO,QAAQ,SAAS;AACtB,UAAM,UAAU;AAAA,MACd,QAAQ;AAAA,MACR,KAAK;AAAA,IAAA;AAGP,YAAQ,SAAS,QAAQ,aAAa,QAAQ,KAAK;AAE/C,QAAA,QAAQ,aAAa,UAAU,GAAG;AAC5B,cAAA,MAAM,QAAQ,aAAa,UAAU;AAAA,IAC/C;AAEI,QAAA,QAAQ,aAAa,cAAc,GAAG;AACxC,cAAQ,SAAS,IAAI,QAAQ,aAAa,cAAc,KAAK;AAAA,IAC/D;AACA,WAAOA,4BAAgB,OAAO,CAACG,UAAS,cAAc;AAChD,UAAA,QAAQ,aAAa,SAAS,GAAG;AACnCA,iBAAQ,SAAS,IAAI,QAAQ,aAAa,SAAS;AAAA,MACrD;AAEOA,aAAAA;AAAAA,OACN,OAAO;AAAA,EACZ;AAAA,EAEA,aAAa;AACP,QAAA,MAAM,gBAAgB,CAACC,aAAAA,kBAAkB,KAAK,KAAK,SAAS,IAAI,GAAG;AAC/D,YAAA,YAAY,CAAC,SAAS;AAEvB,eAAA,KAAK,WAAW,KAAK,UAAU,KAAK,QAAQ,QAAQ,KAAM;AAAA,UACzD,MAAM,KAAK,QAAQ,aAAa,WAAW;AAAA,QAAA;AAAA,MAC7C;AAGJ,YAAM,WAAW,UAAU,KAAK,SAAS,IAAI;AAC7C,YAAM,WAAW,UAAU,KAAK,SAAS,IAAI;AAC7C,YAAM,WAAW,UAAU,KAAK,KAAK,SAAS,IAAI;AAClD,YAAM,WAAW,UAAU,KAAK,KAAK,SAAS,IAAI;AAC3C,aAAA,SAAS,SAAS,SAAS,QAAQ,SAAS,SAAS,SAAS,QAAQ,SAAS,SAAS,SAAS;AAAA,IAC1G;AACO,WAAA;AAAA,EACT;AAAA,EAEA,aAAa;AACX,QAAI,KAAK,QAAQ;AACf,aAAO,KAAK,OAAO,SAAS,QAAQ,IAAI;AAAA,IAC1C;AACO,WAAA;AAAA,EACT;AAAA,EAEA,UAAU;AACR,UAAM,UAAU,CAAA;AAEhB,QAAI,KAAK,QAAQ,aAAa,UAAU,GAAG;AACzC,cAAQ,KAAK,IAAI,KAAK,QAAQ,aAAa,UAAU;AAAA,IACvD;AACA,QAAI,KAAK,QAAQ,aAAa,WAAW,GAAG;AAC1C,cAAQ,MAAM,IAAI,KAAK,QAAQ,aAAa,WAAW;AAAA,IACzD;AAEA,WAAOJ,4BAAgB,OAAO,CAAC,cAAc,cAAc;AACzD,UAAI,KAAK,QAAQ,aAAa,SAAS,GAAG;AACxC,qBAAa,SAAS,IAAI,KAAK,QAAQ,aAAa,SAAS;AAAA,MAC/D;AAEO,aAAA;AAAA,OACN,OAAO;AAAA,EACZ;AAAA,EAEA,gBAAgB,MAAM,OAAO;AAC3B,QAAI,OAAO;AACJ,WAAA,QAAQ,aAAa,MAAM,KAAK;AAAA,IAAA,OAElC;AACE,WAAA,QAAQ,gBAAgB,IAAI;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,eAAe,MAAM,OAAO;AACrB,SAAA,SAAS,QAAQ,CAAC,UAAU;AACzB,YAAA,OAAO,MAAM,KAAK;AAAA,IAAA,CACzB;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAU,OAAgB;AACxB,QAAI,OAAO;AACJ,WAAA,QAAQ,MAAM,kBAAkB;AAAA,IAAA,OAElC;AACE,WAAA,QAAQ,MAAM,kBAAkB;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,OAAO;AAClB,UAAM,QAAQ,MAAM,KAAK,KAAK,OAAO,QAAQ,UAAU;AACvD,YAAQ,MAAM;AAAA,MACZ,KAAKA,4BAAgB,QAAQ,IAAI,IAAI;AAC9B,aAAA,gBAAgB,MAAM,KAAK;AAChC;AAAA,MACF,KAAK,CAAC,OAAO,MAAM,EAAE,QAAQ,IAAI,IAAI;AACnC,aAAK,gBAAgB,QAAQ,IAAI,IAAI,KAAK;AAC1C;AAAA,MACF,KAAK,SAAS,cAAc;AAC1B,cAAM,aAAa,KAAK,QAAQ,iBAAiB,oCAAoC;AACrF,mBAAW,QAAQ,CAAA,UAAS,MAAM,gBAAgB,gBAAgB,CAAC;AAC9D,aAAA,QAAQ,MAAM,aAAa;AAC3B,aAAA,QAAQ,MAAM,kBAAkB;AACrC,aAAK,SAAS,KAAK,OAAO,aAAa,KAAK;AAC5C;AAAA,MACF;AAAA,MAEA,KAAK,SAAS,QAAQ;AACpB,cAAM,QAAQ,MAAM,SAAS,KAAK,SAAS,IAAI;AACzC,cAAA,QAAQ,MAAM,SAAS,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,KAAK,OAAO;AAC7E,cAAM,SAAS,QAAQ,QAAQ,IAAI,QAAQ,QAAQ;AACnD,cAAM,aAAa,OAAO,QAAQ,MAAM,QAAQ,IAAI;AACpD,cAAM,OAAO,MAAM,OAAO,MAAM,QAAQ,IAAI;AAE5C,cAAM,aAAa,KAAK;AAAA,MAC1B;AAAA,MACA,KAAK,SAAS,WAAW;AAClB,aAAA,gBAAgB,gBAAgB,KAAK;AACrC,aAAA,gBAAgB,kBAAkB,KAAK;AACvC,aAAA,eAAe,MAAM,KAAK;AAC/B,aAAK,UAAU,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAS,SAAS;AAEhB,UAAM,QAAa,MAAM,KAAK,KAAK,QAAQ,UAAU,EAAE,KAAK,CAAC,SAAc,KAAK,aAAa,gBAAgB,CAAC;AAC9G,UAAM,UAAU,SAAS,MAAM,aAAa,gBAAgB;AAC5D,QAAI,WAAW,YAAY,KAAK,QAAQ,MAAM,iBAAiB;AACxD,WAAA,QAAQ,MAAM,kBAAkB;AAAA,IACvC;AAEA,UAAM,MAAM,KAAK,QAAQ,aAAa,UAAU;AAC5C,QAAA,KAAK,QAAQ,qBAAqB,EAAE,KAAK,kBAAkB,KAAK,QAAQ,oBAAoB;AAC9F,WAAK,KAAK,KAAK,QAAQ,kBAAkB,UAAU;AAAA,QACjD,KAAK;AAAA,MAAA,CACN;AAAA,IAAA,WAEM,QAAQ,KAAK,OAAO,QAAA,EAAU,KAAK;AACrC,WAAA,OAAO,OAAO,OAAO,GAAG;AAAA,IAC/B;AAEK,SAAA,SAAS,QAAQ,CAAC,UAAU;AAC3B,UAAAI,aAAA,kBAAkB,MAAM,IAAI,GAAG;AACjC;AAAA,MACF;AACA,YAAM,eAAoB,KAAK,UAAU,MAAM,OAAO;AACtD,YAAM,cAAmB,KAAK,UAAU,MAAM,KAAK,OAAO;AACtD,UAAA,aAAa,SAAS,YAAY,MAAM;AACpC,cAAA,OAAO,KAAK,WAAW,KAAK;AAClC,YAAI,MAAM;AACR,eAAK,SAAS;AAAA,QAChB;AAEA,YAAI,KAAK,MAAM;AACb,eAAK,KAAK;QACZ;AAAA,MACF;AAAA,IAAA,CACD;AAED,UAAM,SAAS,OAAO;AAAA,EACxB;AAAA;AAAA,EAGA,UAAU,SAAS;AACjB,UAAM,UAAU,CAAA;AACV,UAAA,aAAa,QAAQ,WAAW,CAAC;AACnC,QAAA,cAAc,QAAQ,YAAY,MAAM;AAC1C,cAAQ,MAAM,IAAI,WAAW,UAAU,KAAK,CAAC;AAAA,IAC/C;AAEO,WAAA,cAAc,SAAS,OAAO;AAAA,EACvC;AAAA,EAEA,MAAM;AACJ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,YAAY;AACN,QAAA,KAAK,OAAO;AACP,aAAA;AAAA,IACT;AACO,WAAA,KAAK,MAAM;EACpB;AAAA,EAEA,QAAQ;AACN,WAAO,KAAK,IAAI,KAAK,KAAK,IAAA,EAAM;EAClC;AACF;AACA,UAAU,WAAW;AACrB,UAAU,UAAU;AAGpB,MAAM,iBAAiB,UAAU;AAAA,EAgB/B,OAAO,OAAO,OAAO;AACb,UAAA,OAAO,MAAM,OAAO,KAAK;AAC/B,QAAI,MAAM,KAAK;AACR,WAAA,aAAa,YAAY,MAAM,GAAG;AAAA,IACzC;AACO,WAAA;AAAA,EACT;AAAA,EAEA,aAAa;AACP,QAAA,MAAM,gBAAgB,CAACA,aAAAA,kBAAkB,KAAK,KAAK,SAAS,IAAI,GAAG;AACrE,YAAM,WAAW,KAAK,SAAS,KAAK,QAAQ;AAC5C,YAAM,WAAW,KAAK,SAAS,KAAK,QAAQ;AAC5C,YAAM,WAAW,KAAK,KAAK,SAAS,KAAK;AACzC,YAAM,WAAW,KAAK,KAAK,SAAS,KAAK;AAElC,aAAA,SAAS,QAAQ,SAAS,OAAO,SAAS,QAAQ,SAAS,OAAO,SAAS,QAAQ,SAAS;AAAA,IACrG;AACO,WAAA;AAAA,EACT;AAAA,EAEA,UAAU;AACR,WAAO,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,aAAa;AAC3C,UAAI,KAAK,QAAQ,aAAa,QAAQ,QAAQ,EAAE,GAAG;AACjD,gBAAQ,QAAQ,IAAI,KAAK,QAAQ,aAAa,QAAQ,QAAQ,EAAE;AAAA,MAClE;AACO,aAAA;AAAA,IACT,GAAG,CAAE,CAAA;AAAA,EACP;AAAA,EAEA,OAAO,KAAK,OAAO;AACjB,SAAK,QAAQ,aAAa,QAAQ,GAAG,IAAI,KAAK;AAAA,EAChD;AAAA,EAEA,SAAS,SAAS;AAEZ,QAAA,KAAK,QAAQ,qBAAqB,EAAE,KAAK,kBAAkB,KAAK,QAAQ,oBAAoB;AAC9F,WAAK,KAAK,KAAK,QAAQ,kBAAkB,QAAQ;AAAA,IACnD;AAEK,SAAA,SAAS,QAAQ,CAAC,UAAU;AAC3B,UAAAA,aAAA,kBAAkB,MAAM,IAAI,GAAG;AACjC;AAAA,MACF;AACM,YAAA,eAAe,MAAM;AACrB,YAAA,cAAc,MAAM,KAAK,QAAQ;AACnC,UAAA,aAAa,QAAQ,YAAY,KAAK;AAClC,cAAA,OAAO,KAAK,WAAW,KAAK;AAClC,YAAI,MAAM;AACR,eAAK,SAAS;AAAA,QAChB;AACA,YAAI,KAAK,MAAM;AACb,eAAK,KAAK;QACZ;AAAA,MACF;AAAA,IAAA,CACD;AAED,UAAM,SAAS,OAAO;AAAA,EACxB;AAAA,EAEA,YAAY;AACN,QAAA,CAAC,KAAK,QAAQ;AACT,aAAA;AAAA,IACT;AACA,WAAO,KAAK,OAAO,SAAS,QAAQ,IAAI;AAAA,EAC1C;AAAA,EAEA,QAAQ;AACC,WAAA,KAAK,UAAU,KAAK,OAAO;AAAA,EACpC;AACF;AACA,SAAS,WAAW;AACpB,SAAS,UAAU;AAGnB,MAAM,kBAAkB,UAAU;AAKlC;AACA,UAAU,WAAW;AACrB,UAAU,UAAU;AAGpB,MAAM,iBAAiB,MAAM;AAAA,EAM3B,OAAO,OAAO,OAAO;AACb,UAAA,OAAO,MAAM,OAAO,KAAK;AAChBC,+BAAA,QAAQ,CAAC,aAAa;AAC9B,WAAA,aAAa,GAAG,QAAQ,IAAI,MAAM,QAAQ,KAAKC,YAAAA,YAAY,QAAQ,CAAC;AAAA,IAAA,CAC1E;AACM,WAAA;AAAA,EACT;AAAA,EAEA,OAAO,QAAQ,SAAS;AACtB,WAAOD,2BAAe,OAAO,CAAC,SAAS,cAAc;AACnD,UAAI,QAAQ,aAAa,GAAG,SAAS,EAAE,GAAG;AACxC,gBAAQ,SAAS,IAAI,QAAQ,aAAa,GAAG,SAAS,EAAE,KAAK;AAAA,MAC/D;AACO,aAAA;AAAA,IACT,GAAG,CAAE,CAAA;AAAA,EACP;AAAA,EAEA,OAAO,MAAM,OAAO;AAClB,QAAIA,YAAe,eAAA,QAAQ,IAAI,IAAI,IAAI;AAChC,WAAA,QAAQ,aAAa,GAAG,IAAI,IAAI,SAASC,YAAAA,YAAY,IAAI,CAAC;AAAA,IAAA,OAE5D;AACG,YAAA,OAAO,MAAM,KAAK;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,OAAO;AACL,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;AACA,SAAS,WAAW;AACpB,SAAS,UAAU;AAGnB,MAAM,sBAAsB,UAAU;AAAA,EAQpC,SAAS,SAAS;AAChB,UAAM,SAAS,OAAO;AAGlB,QAAA,KAAK,UAAU,KAAK,QAAQ,qBAAqB,KAAK,kBAAkB,KAAK,QAAQ,mBAAmB;AAC1G,WAAK,OAAO;IACd;AAGA,QAAI,KAAK,OAAO,OAAO,QAAQ,cAAc,gCACxC,KAAK,OAAO,OAAO,QAAQ,YAAY,SACvC,KAAK,OAAO,QAAQ,SAAS,UAAU,KACvC,KAAK,OAAO,QAAQ,SAAS,CAAC,EAAE,YAAY,cAC5C,KAAK,OAAO,QAAQ,SAAS,CAAC,EAAE,YAAY,SAC/C;AACA,UAAI,OAAO;AACX,UAAI,UAAU;AACd,UAAI,iBAAiB;AACZ,eAAA,IAAI,GAAG,IAAI,KAAK,OAAO,QAAQ,SAAS,QAAQ,KAAK;AAC5D,YAAI,KAAK,OAAO,QAAQ,SAAS,CAAC,EAAE,YAAY,SAAS;AACvD,cAAI,SAAS,IAAI;AACR,mBAAA,KAAK,OAAO,QAAQ,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,aAAa,UAAU;AAAA,UAC5E;AACU,oBAAA,KAAK,qBAAqB,KAAK,OAAO,QAAQ,SAAS,CAAC,GAAG,IAAI;AAAA,QAAA,WAElE,KAAK,OAAO,QAAQ,SAAS,CAAC,EAAE,YAAY,YAAY;AAC/D,2BAAiB,KAAK,OAAO,QAAQ,SAAS,CAAC,EAAE,SAAS;AAAA,QAC5D;AAAA,MACF;AACI,UAAA,iBAAiB,KAAK,OAAO,QAAQ;AAElC,aAAA,kBAAkB,eAAe,YAAY,SAAS;AAC3D,iBAAS,IAAI,GAAG,IAAI,eAAe,SAAS,QAAQ,KAAK;AACvD,cAAI,eAAe,SAAS,CAAC,EAAE,YAAY,SAAS;AAClD,uBAAW,KAAK,qBAAqB,eAAe,SAAS,CAAC,GAAG,IAAI;AAAA,UACvE;AAAA,QACF;AACA,yBAAiB,eAAe;AAAA,MAClC;AAEA,UAAI,iBAAiB,SAAS;AAC5B,cAAM,SAAS,UAAU;AAEzB,iBAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AACzB,gBAAA,SAAS,SAAS,cAAc,KAAK;AAC3C,iBAAO,QAAQ,KAAK,OAAO,QAAQ,SAAS,CAAC,EAAE,SAAS,KAAK,OAAO,QAAQ,SAAS,CAAC,EAAE,SAAS,SAAS,CAAC,EAAE;AACvG,gBAAA,QAAQ,SAAS,cAAc,IAAI;AACzC,iBAAO,YAAY,KAAK;AACxB,eAAK,OAAO,QAAQ,SAAS,CAAC,EAAE,YAAY,MAAM;AAClD,eAAK,OAAO,QAAQ,MAAM,SAAS,OAAO;AAAA,QAC5C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,qBAAqB,OAAO,MAAM;AAChC,QAAI,UAAU;AAEd,aAAS,IAAI,GAAG,IAAI,MAAM,SAAS,QAAQ,KAAK;AAC9C,UAAI,MAAM,SAAS,CAAC,EAAE,aAAa,UAAU,MAAM,MAAM;AAChD,eAAA;AAAA,MACT;AACS,eAAA,IAAI,GAAG,IAAI,MAAM,SAAS,CAAC,EAAE,SAAS,QAAQ,KAAK;AAC1D,YAAI,MAAM,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,SAAS;AACzC,qBAAW,MAAM,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AACO,WAAA;AAAA,EACT;AACF;AACA,cAAc,WAAW;AACzB,cAAc,UAAU;AAGxB,MAAM,uBAAuB,UAAU;AAAA,EAYrC,OAAO,SAAS;AACR,UAAA,OAAO,MAAM;AACZ,WAAA;AAAA,EACT;AAAA,EAEA,YAAY,QAAQ,SAAS;AAC3B,UAAM,QAAQ,OAAO;AACb,YAAA,aAAa,mBAAmB,KAAK;AAC7C,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,mBAAmB;AACb,QAAA,WAAW,KAAK;AACpB,QAAI,CAAC,UAAU;AAGT,UAAA,KAAK,UAAU,KAAK,OAAO,SAAS,QAAQ,KAAK,QAAQ,aAAa,OAAO,GAAG;AAClF,mBAAW,KAAK,OAAO,SAAS,KAAK,SAAS;AAC9C,aAAK,UAAU,KAAK,OAAO,SAAS,KAAK;AAAA,MAElC,WAAA,KAAK,QAAQ,YAAY,SAAS;AAEzC;AAAA,MAAA,OAEG;AACH;AAAA,MACF;AAAA,IACF;AACA,UAAM,aAAa,SAAS,SAAS,OAAO,CAAC,UAAU,QAAQ;AAE7D,YAAM,WAAW,IAAI,QAAQ,EAAE,SAAS,QAAQ;AAChD,UAAI,gBAAgBA,YAAY,YAAA;AAC5B,UAAA,YAAY,SAAS,OAAO;AACd,wBAAA,SAAS,SAAS,OAAO,EAAE;AAAA,MAC7C;AACA,iBAAW,WAAW;AACf,aAAA;AAAA,OACN,CAAC;AACC,SAAA,QAAQ,gBAAgB,OAAO;AACpC,SAAK,QAAQ,MAAM,QAAQ,GAAG,UAAU;AAExC,QAAI,SAAS,MAAM;AACjB,iBAAW,MAAM;AACf,YAAI,UAAU;AACV,YAAA;AACE,cAAA,SAAS,SAAS,SAAS;AAC3B,cAAA,YAAY,KAAK,YAAY,QAAQ;AAE3C,iBAAS,IAAI,GAAG,IAAI,UAAU,QAAQ,KAAK;AACzC,gBAAM,MAAM,UAAU,CAAC,EAAE,QAAQ,iBAAiB,IAAI;AAClD,cAAA,IAAI,WAAW,QAAQ;AAChB,qBAAA;AACT;AAAA,UACF;AAAA,QACF;AACS,iBAAA,SAAS,QAAQ,CAAC,QAAQ;AACjC,cAAI,UAAU,IAAI,QAAQ,UAAU,QAAQ;AAC1C,kBAAM,QAAQ,iBAAiB,OAAO,OAAO,CAAC,EAAE,OAAO;AACjD,kBAAA,MAAM,SAAS,OAAO,EAAE;AAC9B,gBAAI,QAAQ,QAAS,MAAMA,YAAY,YAAA,SAASA,YAAAA,YAAY,SAAU;AAAA,UACxE;AACA;AAAA,QAAA,CACD;AAAA,MAAA,CACF;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ;AACL,WAAA,KAAK,OAAO,IAAI,SAAO,IAAI,SAAS,GAAG,MAAM,CAAC;AAAA,EACvD;AAAA,EAEA,WAAW;AACT,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,cAAc,aAAa,aAAa,CAAA,GAAI,eAAe;AACzD,UAAM,CAAC,IAAI,IAAI,KAAK,YAAY,SAAS;AACzC,QAAIF,aAAAA,kBAAkB,IAAI,KAAKA,aAAAA,kBAAkB,KAAK,SAAS,IAAI,GAAG;AACpE;AAAA,IACF;AAEM,UAAA,aAAa,KAAK,YAAY,SAAS;AAC7C,UAAM,eAAe,CAAA;AACrB,UAAM,gBAAgB,CAAA;AAEX,eAAA,QAAQ,CAAC,SAAS;AAC3B,YAAM,WAAWG,MAAAA,gBAAgB,KAAK,QAAQ,sBAAA,GAAyB,aAAa;AAEhF,UAAA,SAAS,IAAIC,YAAc,cAAA,YAAY,KAAK,SAAS,KAAKA,YAAAA,cAAc,YAAY,IAAI;AAC1F,qBAAa,KAAK,IAAI;AAAA,MACxB,WACS,SAAS,IAAI,YAAY,IAAIA,2BAAe,SAAS,KAAK,YAAY,KAAKA,YAAAA,aAAa;AAC/F,sBAAc,KAAK,IAAI;AAAA,MACzB;AAAA,IAAA,CACD;AAEG,QAAA,aAAa,WAAW,WAAW,QAAQ;AAC7C,WAAK,aAAa;AACX,aAAA;AAAA,IACT;AAGA,eAAW,QAAQ,MAAM;AACjB,YAAA,MAAM,KAAK,SAAS,EAAE,SAAS,GAAG,WAAW,CAAC,CAAC;AACjD,UAAA,CAAC,OAAO,KAAK,WAAW,SAAS,GAAG,WAAW,CAAC,CAAC,EAAE,YAAY,KAAK,WAAW,QAAQ,SAAS,WAAW,CAAC,CAAC,GAAG;AAClH,aAAK,SAAS,EAAE,QAAQ,YAAY,KAAK,WAAW,QAAQ,SAAS,WAAW,CAAC,CAAC,CAAC;AAAA,MAAA,OAEhF;AACH,YAAI,OAAO;AAAA,MACb;AAAA,IAAA,CACD;AAEY,iBAAA,QAAQ,CAAC,SAAS;AAC7B,WAAK,OAAO;AAAA,IAAA,CACb;AAEa,kBAAA,QAAQ,CAAC,SAAS;AAC9B,YAAM,cAAc,SAAS,KAAK,QAAQ,EAAE,SAAS,EAAE;AAEvD,WAAK,OAAO,WAAW,cAAc,WAAW,MAAM;AAAA,IAAA,CACvD;AAED,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,UAAU,aAAa,eAAe;AACpC,UAAM,CAAC,IAAI,IAAI,KAAK,YAAY,SAAS;AACzC,QAAIJ,aAAAA,kBAAkB,IAAI,KAAKA,aAAAA,kBAAkB,KAAK,SAAS,IAAI,GAAG;AACpE;AAAA,IACF;AAEM,UAAA,aAAa,KAAK,YAAY,SAAS;AACvC,UAAA,YAAY,KAAK,YAAY,QAAQ;AAC3C,UAAM,eAAe,CAAA;AACrB,UAAM,gBAAgB,CAAA;AACtB,UAAM,YAAY,CAAA;AAEP,eAAA,QAAQ,CAAC,SAAS;AAC3B,YAAM,WAAWG,MAAAA,gBAAgB,KAAK,QAAQ,sBAAA,GAAyB,aAAa;AAEhF,UAAA,SAAS,IAAI,YAAY,IAAIC,YAAAA,eAAe,SAAS,KAAK,YAAY,KAAKA,yBAAa;AAC1F,qBAAa,KAAK,IAAI;AAAA,MACxB,WACS,SAAS,IAAI,YAAY,IAAIA,2BAAe,SAAS,KAAK,YAAY,KAAKA,YAAAA,aAAa;AAC/F,sBAAc,KAAK,IAAI;AAEvB,YAAI,KAAK,IAAI,SAAS,IAAI,YAAY,CAAC,IAAIA,yBAAa;AACtD,oBAAU,KAAK,IAAI;AAAA,QACrB;AAAA,MACF;AAAA,IAAA,CACD;AAEG,QAAA,aAAa,WAAW,WAAW,QAAQ;AAC7C,WAAK,aAAa;AAClB;AAAA,IACF;AAGA,UAAM,oBAAoB,KAAK,KAAA,EAAO,OAAO,CAAC,KAAK,QAAQ;AACzD,YAAM,UAAUD,MAAAA,gBAAgB,IAAI,QAAQ,sBAAA,GAAyB,aAAa;AAE9E,UAAA,QAAQ,IAAI,YAAY,IAAIC,YAAAA,eAAe,QAAQ,KAAK,YAAY,KAAKA,yBAAa;AACjF,eAAA;AAAA,MACT;AACO,aAAA;AAAA,OACN,CAAC;AAGM,cAAA,QAAQ,CAAC,SAAS;AAC1B,YAAM,WAAWD,MAAAA,gBAAgB,KAAK,QAAQ,sBAAA,GAAyB,aAAa;AAC9E,YAAA,UAAU,KAAK,OAAO;AAC5B,YAAM,iBAAiB,QAAQ;AAE/B,YAAM,UAAU,eAAe,OAAO,CAAC,KAAK,gBAAgB;AAC1D,cAAM,kBAAkBA,MAAAA,gBAAgB,YAAY,QAAQ,sBAAA,GAAyB,aAAa;AAClG,YAAI,SAAS,KAAK,gBAAgB,IAAIC,YAAAA,aAAa;AAC3C,gBAAA;AAAA,QACR;AACO,eAAA;AAAA,SACN,IAAI;AAEC,cAAA,aAAa,MAAM,OAAO;AAC5B,YAAA,WAAW,QAAQ,QAAA,EAAU;AAC9B,WAAA,OAAO,OAAO,QAAQ;AACtB,WAAA,SAAS,QAAQ,CAAC,aAAa;AACzB,iBAAA,OAAO,OAAO,QAAQ;AAAA,MAAA,CAChC;AAAA,IAAA,CACF;AAEa,kBAAA,QAAQ,CAAC,SAAS;AAC9B,YAAM,cAAc,SAAS,KAAK,QAAQ,EAAE,SAAS,EAAE;AACvD,YAAM,aAAa,cAAc;AAC5B,WAAA,QAAQ,gBAAgB,OAAO;AAC/B,WAAA,OAAO,WAAW,UAAU;AAC5B,WAAA,SAAS,QAAQ,CAAC,aAAa;AACzB,iBAAA,OAAO,WAAW,UAAU;AAAA,MAAA,CACtC;AAAA,IAAA,CACF;AAEY,iBAAA,QAAQ,CAAC,SAAS;AAC7B,WAAK,OAAO;AAAA,IAAA,CACb;AAKS,cAAA,QAAQ,CAAC,QAAQ;AACrB,UAAA,IAAI,SAAS,WAAW,GAAG;AAC7B,YAAI,OAAO;AAAA,MACb;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,eAAe;AACb,UAAM,QAAQ,MAAM,KAAK,KAAK,OAAO,QAAQ,UAAU;AACjD,UAAA,cAAc,MAAM,UAAU,cAAc;AAClD,SAAK,OAAO;AACZ,gBAAY,eAAe;AACrB,UAAA,OAAO,MAAM,QAAQ,IAAI;AAAA,EACjC;AAAA,EAEA,WAAW,UAAU,KAAK,KAAK,IAAI;AACjC,UAAM,KAAK;AACL,UAAA,MAAM,SAAS,QAAA,EAAU;AACzB,UAAA,YAAY,KAAK,OAAO;AAAA,MAC5B,UAAU;AAAA,MACV,EAAE,GAAGP,YAAAA,cAAc,KAAK,IAAI;AAAA,IAAA;AAEpB,cAAA,QAAQ,MAAM,kBAAkB;AAC1C,UAAM,WAAW,KAAK,OAAO,OAAO,cAAc,UAAU;AAAA,MAC1D,KAAK;AAAA,MACL,MAAM;AAAA,IAAA,CACP;AACD,cAAU,YAAY,QAAQ;AAE9B,QAAI,KAAK;AACE,eAAA,aAAa,WAAW,GAAG;AAAA,IAAA,OAEjC;AACH,eAAS,YAAY,SAAS;AAAA,IAChC;AAAA,EACF;AAAA,EAEA,aAAa,aAAa,UAAU,UAAU,MAAM,eAAe;AACjE,UAAM,CAAC,IAAI,IAAI,KAAK,YAAY,SAAS;AACzC,UAAM,CAAC,aAAa,IAAI,KAAK,YAAY,aAAa;AAChD,UAAA,YAAY,KAAK,YAAY,QAAQ;AAC3C,UAAM,gBAAgB,CAAA;AACtB,UAAM,gBAAgB,CAAA;AACtB,UAAM,gBAAgB,CAAA;AAEtB,QAAIG,aAAAA,kBAAkB,IAAI,KAAKA,aAAAA,kBAAkB,KAAK,SAAS,IAAI,GAAG;AACpE;AAAA,IACF;AACM,UAAA,aAAa,KAAK,YAAY,SAAS;AAClC,eAAA,QAAQ,CAAC,SAAS;AAC3B,YAAM,WAAWG,MAAAA,gBAAgB,KAAK,QAAQ,sBAAA,GAAyB,aAAa;AAEpF,UAAI,SAAS;AACX,YAAI,KAAK,IAAI,SAAS,KAAK,YAAY,EAAE,IAAIC,yBAAa;AAGxD,wBAAc,KAAK,IAAI;AAAA,QACzB,WACS,YAAY,KAAK,SAAS,IAAIA,YAAAA,eAAe,YAAY,KAAK,SAAS,KAAK,CAACA,YAAAA,aAAa;AAGjG,wBAAc,KAAK,IAAI;AAAA,QACzB;AAAA,MAAA,OAEG;AACH,YAAI,KAAK,IAAI,SAAS,IAAI,YAAY,CAAC,IAAIA,yBAAa;AAGtD,wBAAc,KAAK,IAAI;AAAA,QACzB,WACS,YAAY,IAAI,SAAS,IAAIA,YAAAA,eAAe,YAAY,IAAI,SAAS,KAAK,CAACA,YAAAA,aAAa;AAG/F,wBAAc,KAAK,IAAI;AAAA,QACzB;AAAA,MACF;AAAA,IAAA,CACD;AAEa,kBAAA,QAAQ,CAAC,SAAS;AACxB,YAAA,MAAM,UAAU,KAAK,OAAO;AAClC,YAAM,KAAK;AACX,YAAM,WAAW,KAAK;AAChB,YAAA,MAAM,SAAS,QAAA,EAAU;AACzB,YAAA,cAAc,KAAK;AACnB,YAAA,YAAY,KAAK,OAAO;AAAA,QAC5B,UAAU;AAAA,QACV;AAAA,UAAE,GAAGP,YAAA;AAAA,UAAc,KAAK;AAAA,UACtB,SAAS,YAAY;AAAA,QAAQ;AAAA,MAAA;AAEjC,YAAM,WAAW,KAAK,OAAO,OAAO,cAAc,UAAU;AAAA,QAC1D,KAAK;AAAA,QACL,MAAM;AAAA,QACN,SAAS,YAAY;AAAA,MAAA,CACtB;AACD,gBAAU,YAAY,QAAQ;AAE9B,UAAI,KAAK;AACE,iBAAA,aAAa,WAAW,GAAG;AAAA,MAAA,OAEjC;AACH,iBAAS,YAAY,SAAS;AAAA,MAChC;AACA,oBAAc,KAAK,SAAS;AAAA,IAAA,CAC7B;AAGD,UAAM,WAAW,KAAK,OAAO,OAAO,SAAS,UAAU,IAAI;AACvD,QAAA;AACJ,QAAI,SAAS;AACX,eAAS,UAAU,QAAQ,KAAK,UAAU,QAAQ,EAAE;AAAA,IAAA,OAEjD;AACH,eAAS,UAAU,QAAQ;AAAA,IAC7B;AAEA,QAAI,QAAQ;AACI,oBAAA,aAAa,UAAU,MAAM;AAAA,IAAA,OAExC;AACH,oBAAc,YAAY,QAAQ;AAAA,IACpC;AAEc,kBAAA,QAAQ,CAAC,SAAS;AACxB,YAAA,cAAc,KAAK,QAAA,EAAU;AACnC,WAAK,OAAO,WAAW,SAAS,aAAa,EAAE,IAAI,CAAC;AACpD,oBAAc,KAAK,IAAI;AAAA,IAAA,CACxB;AAEa,kBAAA,KAAK,CAAC,OAAO,UAAU;AACnC,YAAM,KAAK,MAAM,QAAQ,sBAAA,EAAwB;AACjD,YAAM,KAAK,MAAM,QAAQ,sBAAA,EAAwB;AACjD,aAAO,KAAK;AAAA,IAAA,CACb;AAED,SAAK,iBAAiB;AACf,WAAA;AAAA,EACT;AAAA,EAEA,UAAU,aAAa,QAAQ,eAAe;AAC5C,UAAM,CAAC,IAAI,IAAI,KAAK,YAAY,SAAS;AACzC,QAAIG,aAAAA,kBAAkB,IAAI,KAAKA,aAAAA,kBAAkB,KAAK,SAAS,IAAI,GAAG;AACpE;AAAA,IACF;AAEM,UAAA,aAAa,KAAK,YAAY,SAAS;AAC7C,UAAM,MAAM;AACZ,UAAM,SAAS,KAAK,OAAO,OAAO,SAAS,UAAU;AAAA,MACnD,KAAK;AAAA,IAAA,CACN;AACD,UAAM,gBAAgB,CAAA;AACtB,UAAM,gBAAgB,CAAA;AACtB,UAAM,gBAAgB,CAAA;AAEX,eAAA,QAAQ,CAAC,SAAS;AAC3B,YAAM,WAAWG,MAAAA,gBAAgB,KAAK,QAAQ,sBAAA,GAAyB,aAAa;AAEpF,UAAI,QAAQ;AACV,YAAI,KAAK,IAAI,SAAS,KAAK,YAAY,EAAE,IAAIC,yBAAa;AACxD,wBAAc,KAAK,IAAI;AAAA,QACzB,WACS,YAAY,KAAK,SAAS,IAAIA,YAAAA,eAAe,YAAY,KAAK,SAAS,KAAK,CAACA,YAAAA,aAAa;AACjG,wBAAc,KAAK,IAAI;AAAA,QACzB;AAAA,MAAA,OAEG;AACH,YAAI,KAAK,IAAI,SAAS,IAAI,YAAY,CAAC,IAAIA,yBAAa;AACtD,wBAAc,KAAK,IAAI;AAAA,QACzB,WACS,YAAY,IAAI,SAAS,IAAIA,YAAAA,eAAe,YAAY,IAAI,SAAS,KAAK,CAACA,YAAAA,aAAa;AAC/F,wBAAc,KAAK,IAAI;AAAA,QACzB;AAAA,MACF;AAAA,IAAA,CACD;AAIK,UAAA,WAAW,CAAC,OAAO,UAAU;AACjC,YAAM,KAAK,MAAM,QAAQ,sBAAA,EAAwB;AACjD,YAAM,KAAK,MAAM,QAAQ,sBAAA,EAAwB;AACjD,aAAO,KAAK;AAAA,IAAA;AAEd,kBAAc,KAAK,QAAQ;AAEb,kBAAA,QAAQ,CAAC,SAAS;AAC9B,YAAM,MAAM;AACN,YAAA,cAAc,KAAK;AAEnB,YAAA,YAAY,KAAK,OAAO;AAAA,QAC5B,UAAU;AAAA,QACV,EAAE,GAAGP,YAAAA,cAAc,KAAK,KAAK,MAAM,KAAK,SAAS,YAAY,QAAQ;AAAA,MAAA;AAEvE,YAAM,WAAW,KAAK,OAAO,OAAO,cAAc,UAAU;AAAA,QAC1D,KAAK;AAAA,QACL,MAAM;AAAA,QACN,SAAS,YAAY;AAAA,MAAA,CACtB;AACD,YAAM,QAAQ,KAAK,OAAO,OAAO,MAAM,QAAQ;AAC/C,eAAS,YAAY,KAAK;AAC1B,gBAAU,YAAY,QAAQ;AAC9B,aAAO,YAAY,SAAS;AAC5B,oBAAc,KAAK,SAAS;AAAA,IAAA,CAC7B;AAEa,kBAAA,QAAQ,CAAC,SAAS;AAC9B,YAAM,cAAc,SAAS,KAAK,QAAQ,EAAE,SAAS,EAAE;AAClD,WAAA,OAAO,WAAW,cAAc,CAAC;AACtC,oBAAc,KAAK,IAAI;AAAA,IAAA,CACxB;AAED,UAAM,SAAS,KAAK,KAAO,EAAA,KAAK,CAAC,QAAQ;AACvC,YAAM,UAAUM,MAAAA,gBAAgB,IAAI,QAAQ,sBAAA,GAAyB,aAAa;AAClF,UAAI,QAAQ;AACH,eAAA,KAAK,IAAI,QAAQ,IAAI,YAAY,IAAI,YAAY,MAAM,IAAIC;MAAA,OAE/D;AACH,eAAO,KAAK,IAAI,QAAQ,IAAI,YAAY,CAAC,IAAIA;MAC/C;AAAA,IAAA,CACD;AACI,SAAA,aAAa,QAAQ,MAAM;AAGhC,kBAAc,KAAK,QAAQ;AACpB,WAAA;AAAA,EACT;AAAA,EAEA,WAAW,cAAc,cAAc,SAAS,SAAS,gBAAgB;AACvE,UAAM,aAAa,aAAa,OAAO,CAAC,QAAQ,WAAWC,WAAU;AACnE,UAAIA,WAAU,GAAG;AACf,YAAI,QAAQ;AACV,oBAAU,aAAa,MAAM;AAAA,QAC/B;AACA,kBAAU,OAAO;AAAA,MAAA,OAEd;AACO,kBAAA,OAAO,WAAW,OAAO;AACzB,kBAAA,OAAO,WAAW,OAAO;AAC1B,iBAAA;AACT,YAAI,UAAU,GAAG;AAET,gBAAA,YAAYC,YAAkB,kBAAA,UAAU,UAAU;AACxD,gBAAM,aAAa,SAAS,UAAU,QAAQ,MAAM,QAAQ,EAAE,KAAK;AACnE,cAAI,aAAa,WAAW;AAC1B,sBAAU,QAAQ,MAAM,SAAS,GAAG,SAAS;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAEO,aAAA;AAAA,OACN,IAAI;AAEP,UAAM,MAAM,WAAW,QAAQ,aAAa,UAAU;AACtD,UAAM,MAAM,WAAW,SAAS,KAAK,QAAQ,aAAa,WAAW;AAC1D,eAAA,SAAS,QAAQ,CAAC,aAAa;AACxC,eAAS,QAAQ,aAAa,kBAAkB,WAAW,QAAQ,MAAM,eAAe;AACxF,UAAI,SAAS,SAAS,MAAM,EAAE,QAAQ,OAAO;AAClC,iBAAA,SAAS,MAAM,EAAE,QAAQ,MAAM,kBAAkB,WAAW,QAAQ,MAAM;AAAA,MACrF;AAEA,UAAI,CAAC,SAAS,QAAQ,SAAS,QAAQ,UAAU,QAAQ;AAC9C,iBAAA,OAAO,QAAQ,GAAG;AAClB,iBAAA,OAAO,OAAO,GAAG;AACjB,iBAAA,OAAO,WAAW,OAAO;AACzB,iBAAA,OAAO,WAAW,OAAO;AAAA,MAAA,OAE/B;AACH,iBAAS,OAAO;AAAA,MAClB;AAAA,IAAA,CACD;AAEM,WAAA;AAAA,EACT;AAAA,EAEA,aAAa,gBAAgB,eAAe;AAC1C,QAAI,cAAmB,CAAA;AACvB,QAAI,cAAc;AAClB,QAAI,cAAc;AAEH,mBAAA,QAAQ,CAAC,cAAc;AAC9B,YAAA,mBAAmB,UAAU,QAAQ,MAAM;AACjD,oBAAc,UAAU;AACxB,oBAAc,YAAY;AAC1B,oBAAc,YAAY;AAE1B,UAAI,cAAc,GAAG;AACnB,cAAM,MAAM,UAAU;AAChB,cAAA,MAAM,UAAU;AACZ,kBAAA,OAAO,WAAW,CAAC;AAC7B,YAAI,UAAU,QAAQ,YAAY,UAAU,QAAQ,SAAS,CAAC,EAAE,YAAY,SAAS,UAAU,QAAQ,SAAS,CAAC,EAAE,aAAa,cAAc,GAAG;AAC/I,oBAAU,QAAQ,SAAS,CAAC,EAAE,aAAa,gBAAgB,CAAC;AAAA,QAC9D;AACA,iBAAS,eAAe,aAAa,eAAe,GAAG,gBAAgB;AAChE,eAAA,WAAW,KAAK,KAAK,gBAAgB;AAAA,QAC5C;AAAA,MACF;AAEA,UAAI,cAAc,GAAG;AACnB,YAAI,eAAe;AACf,YAAA,UAAU,UAAU,IAAA,EAAM;AAC9B,eAAO,eAAe,GAAG;AACvB,gBAAM,eAAe,QAAQ,SAAS,OAAO,CAAC,QAAQ,SAAS;AAC7D,kBAAM,cAAcH,MAAAA,gBAAgB,UAAU,QAAQ,sBAAA,GAAyB,aAAa;AAC5F,kBAAM,WAAWA,MAAAA,gBAAgB,KAAK,QAAQ,sBAAA,GAAyB,aAAa;AACpF,gBAAI,KAAK,IAAI,YAAY,KAAK,SAAS,CAAC,IAAIC,yBAAa;AAC9C,uBAAA;AAAA,YACX;AACO,mBAAA;AAAA,aACN,IAAI;AAEP,mBAAS,eAAe,aAAa,eAAe,GAAG,gBAAgB;AAChE,iBAAA,WAAW,SAAS,cAAc,gBAAgB;AAAA,UACzD;AAEgB,0BAAA;AAChB,oBAAU,QAAQ;AAAA,QACpB;AAEU,kBAAA,QAAQ,gBAAgB,OAAO;AACzC,YAAI,UAAU,QAAQ,YAAY,UAAU,QAAQ,SAAS,CAAC,EAAE,YAAY,SAAS,UAAU,QAAQ,SAAS,CAAC,EAAE,aAAa,cAAc,GAAG;AAC/I,oBAAU,QAAQ,SAAS,CAAC,EAAE,aAAa,gBAAgB,CAAC;AAAA,QAC9D;AACU,kBAAA,OAAO,WAAW,CAAC;AAAA,MAC/B;AAAA,IAAA,CACD;AAAA,EACH;AAAA,EAEA,WAAW,aAAa;AACV,gBAAA,QAAQ,CAAC,eAAe;AAE5B,YAAA,cAAc,WAAW;AAC/B,YAAM,WAAW,KAAK,OAAO,OAAO,cAAc,UAAU;AAAA,QAC1D,KAAK,YAAY,OAAO,MAAM;AAAA,QAC9B,MAAM,YAAY,QAAQ,OAAO;AAAA,QACjC,SAAS,YAAY;AAAA,QACrB,SAAS,YAAY;AAAA,MAAA,CACtB;AACD,YAAM,QAAQ,KAAK,OAAO,OAAO,MAAM,QAAQ;AAC/C,eAAS,YAAY,KAAK;AAE1B,iBAAW,QAAQ,YAAY;AAC/B,iBAAW,YAAY,QAAQ;AAAA,IAAA,CAChC;AAAA,EACH;AAAA,EAEA,OAAO;AACC,UAAA,OAAO,KAAK,SAAS;AACvB,QAAAJ,aAAAA,kBAAkB,IAAI,GAAG;AAC3B,aAAO;IACT;AACA,WAAO,KAAK,SAAS,IAAI,CAAA,QAAO,GAAG;AAAA,EACrC;AACF;AACA,eAAe,WAAW;AAC1B,eAAe,YAAY;AAC3B,eAAe,UAAU;AAGzB,MAAM,yBAAyB,UAAU;AAAA,EAKvC,YAAY,QAAQ,SAAS;AAC3B,UAAM,QAAQ,OAAO;AACrB,UAAM,QAAQ,MAAM,KAAK,OAAO,QAAQ,UAAU;AAE9C,QAAA,MAAM,QAAQ,UAAU;AAC1B,cAAQ,MAAM,WAAW;AAAA,IAC3B;AACQ,YAAA;AAAA,MACN;AAAA,MACA,CAAC,MAAM;AACC,cAAA,cAAc,MAAM,UAAU,cAAc;AAClD,YAAI,YAAY,YAAY;AAC1B,sBAAY,WAAW,QAAQ,aAAa,EAAE,OAAO;AAAA,QACvD;AAEA,YAAI,YAAY,kBAAkB,YAAY,eAAe,YAAY,SAAS,GAAG;AACnF,sBAAY,eAAe;QAC7B;AAAA,MACF;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AACF;AACA,iBAAiB,WAAW;AAC5B,iBAAiB,YAAY;AAC7B,iBAAiB,UAAU;AAE3B,iBAAiB,kBAAkB,CAAC,cAAc;AAClD,eAAe,oBAAoB;AAEnC,eAAe,kBAAkB,CAAC,WAAW,aAAa;AAC1D,UAAU,oBAAoB;AAE9B,UAAU,kBAAkB,CAAC,QAAQ;AACrC,SAAS,oBAAoB;AAE7B,SAAS,kBAAkB,CAAC,SAAS;AACrC,UAAU,oBAAoB;AAE9B,UAAU,kBAAkB,CAAC,eAAeO,OAAA,SAAQC,cAAUC,KAAa,aAAA;AAC3E,cAAc,oBAAoB;AAElC,cAAc,kBAAkB,CAAC,QAAQ;AACzC,cAAc,oBAAoB;AAElC,SAAS,oBAAoB;AAE7B,SAAS,QAAQ;AACT,QAAA,KAAK,KAAK,SAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAChD,SAAO,OAAO,EAAE;AAClB;AAEA,SAAS,SAAS;AACV,QAAA,KAAK,KAAK,SAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC;AAChD,SAAO,QAAQ,EAAE;AACnB;AAEA,SAAS,cAAc,SAAsB,SAA8B;AAClE,SAAA,CAAC,GAAGb,YAAAA,iBAAiB,GAAGD,YAAAA,kBAAkB,EAAE,OAAO,CAAC,cAAc,cAAc;AACrF,QAAI,QAAQ,aAAa,QAAQ,SAAS,EAAE,GAAG;AAC7C,mBAAa,SAAS,IAAI,QAAQ,aAAa,QAAQ,SAAS,EAAE,KAAK;AAAA,IACzE;AACO,WAAA;AAAA,KACN,OAAO;AACZ;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"table.cjs.js","sources":["../../../../src/table/formats/table.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { isNullOrUndefined } from '../../config/editor.utils'\r\nimport { compare } from '../../utils/method'\r\nimport {\r\n CELL_ATTRIBUTES,\r\n CELL_DEFAULT,\r\n CELL_IDENTITY_KEYS,\r\n CELL_MIN_HEIGHT,\r\n COL_ATTRIBUTES,\r\n COL_DEFAULT,\r\n ERROR_LIMIT,\r\n} from '../table-config'\r\nimport { getRelativeRect } from '../utils'\r\nimport Header from './header'\r\nimport ListItem, { ListContainer } from './list'\r\n\r\nconst Break = Quill.imports['blots/break']\r\nconst Block = Quill.imports['blots/block']\r\nconst Container = Quill.imports['blots/container']\r\n\r\n// @dynamic\r\nclass TableCellLine extends Block {\r\n static requiredContainer: any\r\n static tagName: string\r\n static className: string\r\n static blotName: any\r\n domNode: any\r\n statics: any\r\n wrap: any\r\n parent: any\r\n\r\n static create(value) {\r\n const node = super.create(value)\r\n\r\n // fix: when td has background-color, quill can't set it to table-cell blot\r\n if (value.tdBgColor) {\r\n node.setAttribute(`data-parent-bg`, value.tdBgColor)\r\n delete value.tdBgColor\r\n }\r\n\r\n CELL_IDENTITY_KEYS.forEach((key) => {\r\n const identityMaker = key === 'row' ? rowId : cellId\r\n node.setAttribute(`data-${key}`, value[key] || identityMaker())\r\n })\r\n\r\n CELL_ATTRIBUTES.forEach((attrName) => {\r\n const keyValue = value[attrName] || CELL_DEFAULT[attrName]\r\n keyValue && node.setAttribute(`data-${attrName}`, keyValue)\r\n })\r\n\r\n if (value.height) {\r\n node.setAttribute('height', value.height)\r\n }\r\n\r\n return node\r\n }\r\n\r\n static formats(domNode) {\r\n const formats = {}\r\n if (formats.list) {\r\n formats.list = domNode.classList.item(0)\r\n }\r\n return reduceFormats(domNode, formats)\r\n }\r\n\r\n toggleAttribute(name, value) {\r\n if (value) {\r\n this.domNode.setAttribute(name, value)\r\n }\r\n else {\r\n this.domNode.removeAttribute(name)\r\n }\r\n }\r\n\r\n formatChildren(name, value) {\r\n this.children.forEach((child) => {\r\n child.format && child.format(name, value)\r\n if (!child.domNode.style) {\r\n return\r\n }\r\n if (child.domNode.tagName === 'SPAN' && value) {\r\n child.domNode.style.backgroundColor = value\r\n }\r\n else {\r\n child.domNode.style.backgroundColor = 'initial'\r\n }\r\n })\r\n }\r\n\r\n format(name, value) {\r\n if ([...CELL_ATTRIBUTES, ...CELL_IDENTITY_KEYS, 'parent-bg'].includes(name)) {\r\n if (value) {\r\n this.domNode.setAttribute(`data-${name}`, value)\r\n }\r\n else {\r\n this.domNode.removeAttribute(`data-${name}`)\r\n }\r\n }\r\n else if (name === 'header') {\r\n if (!value) {\r\n return\r\n }\r\n const { row, cell, rowspan, colspan }: any = TableCellLine.formats(this.domNode)\r\n super.format(name, {\r\n value,\r\n row,\r\n cell,\r\n rowspan,\r\n colspan,\r\n })\r\n }\r\n else {\r\n super.format(name, value)\r\n }\r\n switch (true) {\r\n case name === 'cell-bg': {\r\n this.toggleAttribute('data-cell-bg', value)\r\n }\r\n }\r\n }\r\n\r\n optimize(context) {\r\n super.optimize(context)\r\n\r\n // cover shadowBlot's wrap call, pass params parentBlot initialize\r\n // needed\r\n const { row, cell, rowspan, colspan, cellBg } = this.domNode.dataset\r\n const formats: Record<string, any> = TableCellLine.formats(this.domNode)\r\n const parentFormats = this.parent.formats()\r\n if (this.statics.requiredContainer && !(this.parent instanceof this.statics.requiredContainer)) {\r\n this.wrap(this.statics.requiredContainer.blotName, { row, cell, rowspan, colspan, cellBg })\r\n }\r\n else if (!compare(formats, parentFormats)) {\r\n this.parent.format('row', formats.row)\r\n this.parent.format('cell', formats.cell)\r\n this.parent.format('rowspan', formats.rowspan)\r\n this.parent.format('colspan', formats.colspan)\r\n formats['cell-bg'] && this.parent.setCellBg(formats['cell-bg'])\r\n }\r\n\r\n const parentHeight = this.domNode.getAttribute('height')\r\n if (parentHeight) {\r\n this.parent.domNode.style.height = parentHeight\r\n }\r\n }\r\n\r\n tableCell() {\r\n return this.parent\r\n }\r\n}\r\nTableCellLine.blotName = 'table-cell-line'\r\nTableCellLine.className = 'qlbt-cell-line'\r\nTableCellLine.tagName = 'DIV'\r\n\r\n// @dynamic\r\nclass TableCell extends Container {\r\n static allowedChildren: any\r\n static blotName: any\r\n static requiredContainer: any\r\n static tagName: string\r\n next: any\r\n children: any\r\n parent: any\r\n domNode: any\r\n statics: any\r\n wrap: any\r\n splitAfter: any\r\n prev: any\r\n scroll: any\r\n\r\n static create(value = { row: rowId() }) {\r\n const node = super.create(value)\r\n\r\n CELL_IDENTITY_KEYS.forEach((key) => {\r\n node.setAttribute(`data-${key}`, value[key])\r\n })\r\n\r\n CELL_ATTRIBUTES.forEach((attrName) => {\r\n if (value[attrName]) {\r\n node.setAttribute(attrName, value[attrName])\r\n }\r\n })\r\n\r\n return node\r\n }\r\n\r\n static formats(domNode) {\r\n const formats = {\r\n height: undefined,\r\n row: undefined,\r\n }\r\n\r\n formats.height = domNode.getAttribute('height') || undefined\r\n\r\n if (domNode.hasAttribute('data-row')) {\r\n formats.row = domNode.getAttribute('data-row')\r\n }\r\n\r\n if (domNode.hasAttribute('data-cell-bg')) {\r\n formats['cell-bg'] = domNode.getAttribute('data-cell-bg') || undefined\r\n }\r\n return CELL_ATTRIBUTES.reduce((formats, attribute) => {\r\n if (domNode.hasAttribute(attribute)) {\r\n formats[attribute] = domNode.getAttribute(attribute)\r\n }\r\n\r\n return formats\r\n }, formats)\r\n }\r\n\r\n checkMerge() {\r\n if (super.checkMerge() && !isNullOrUndefined(this.next.children.head)) {\r\n const getCellId = (node) => {\r\n return (\r\n (node.formats && node.formats()[node.statics.blotName]) || {\r\n cell: node.domNode.getAttribute('data-cell'),\r\n }\r\n )\r\n }\r\n const thisHead = getCellId(this.children.head)\r\n const thisTail = getCellId(this.children.tail)\r\n const nextHead = getCellId(this.next.children.head)\r\n const nextTail = getCellId(this.next.children.tail)\r\n return thisHead.cell === thisTail.cell && thisHead.cell === nextHead.cell && thisHead.cell === nextTail.cell\r\n }\r\n return false\r\n }\r\n\r\n cellOffset() {\r\n if (this.parent) {\r\n return this.parent.children.indexOf(this)\r\n }\r\n return -1\r\n }\r\n\r\n formats() {\r\n const formats = {}\r\n\r\n if (this.domNode.hasAttribute('data-row')) {\r\n formats.row = this.domNode.getAttribute('data-row')\r\n }\r\n if (this.domNode.hasAttribute('data-cell')) {\r\n formats.cell = this.domNode.getAttribute('data-cell')\r\n }\r\n\r\n return CELL_ATTRIBUTES.reduce((tableFormats, attribute) => {\r\n if (this.domNode.hasAttribute(attribute)) {\r\n tableFormats[attribute] = this.domNode.getAttribute(attribute)\r\n }\r\n\r\n return tableFormats\r\n }, formats)\r\n }\r\n\r\n toggleAttribute(name, value) {\r\n if (value) {\r\n this.domNode.setAttribute(name, value)\r\n }\r\n else {\r\n this.domNode.removeAttribute(name)\r\n }\r\n }\r\n\r\n formatChildren(name, value) {\r\n this.children.forEach((child) => {\r\n child.format(name, value)\r\n })\r\n }\r\n\r\n /**\r\n * this method is for TableCellLine to change cell background color\r\n * if use `format('cell-bg', value)` will loop trigger\r\n * TableCellLine.optimize -> TableCell.format -> TableCellLine.optimize ...\r\n */\r\n setCellBg(value?: string) {\r\n if (value) {\r\n this.domNode.style.backgroundColor = value\r\n }\r\n else {\r\n this.domNode.style.backgroundColor = 'initial'\r\n }\r\n }\r\n\r\n format(name, value) {\r\n const quill = Quill.find(this.scroll.domNode.parentNode)\r\n switch (true) {\r\n case CELL_ATTRIBUTES.includes(name):\r\n this.toggleAttribute(name, value)\r\n break\r\n case ['row', 'cell'].includes(name):\r\n this.toggleAttribute(`data-${name}`, value)\r\n break\r\n case name === 'background': {\r\n const hasBgColor = this.domNode.querySelectorAll('div.qlbt-cell-line[data-parent-bg]')\r\n hasBgColor.forEach(child => child.removeAttribute('data-parent-bg'))\r\n this.domNode.style.background = ''\r\n this.domNode.style.backgroundColor = value\r\n this.children.head.format('parent-bg', value)\r\n break\r\n }\r\n // TODO: 其他格式可同理实现,但已有格式清除时会清除所有格式,待解决\r\n case name === 'size': {\r\n const start = quill.getIndex(this.children.head)\r\n const total = quill.getIndex(this.children.tail) + this.children.tail.length()\r\n const length = total - start > 0 ? total - start : 0\r\n quill.setSelection(start, length, Quill.sources.USER)\r\n quill.format(name, value, Quill.sources.USER)\r\n // 设置选区后需清除选区,否则会固定处理选区内容\r\n quill.setSelection(start)\r\n break\r\n }\r\n case name === 'cell-bg': {\r\n this.toggleAttribute('data-cell-bg', value)\r\n this.toggleAttribute('data-parent-bg', value)\r\n this.formatChildren(name, value)\r\n this.setCellBg(value)\r\n break\r\n }\r\n }\r\n }\r\n\r\n optimize(context) {\r\n // fix: when td has background-color, quill can't set it to table-cell bolt\r\n const hasBg: any = Array.from(this.domNode.childNodes).find((item: any) => item.getAttribute('data-parent-bg'))\r\n const bgColor = hasBg && hasBg.getAttribute('data-parent-bg')\r\n if (bgColor && bgColor !== this.domNode.style.backgroundColor) {\r\n this.domNode.style.backgroundColor = bgColor\r\n }\r\n\r\n const rId = this.domNode.getAttribute('data-row')\r\n if (this.statics.requiredContainer && !(this.parent instanceof this.statics.requiredContainer)) {\r\n this.wrap(this.statics.requiredContainer.blotName, {\r\n row: rId,\r\n })\r\n }\r\n else if (rId !== this.parent.formats().row) {\r\n this.parent.format('row', rId)\r\n }\r\n\r\n this.children.forEach((child) => {\r\n if (isNullOrUndefined(child.next)) {\r\n return\r\n }\r\n const childFormats: any = this.getFormat(child.domNode)\r\n const nextFormats: any = this.getFormat(child.next.domNode)\r\n if (childFormats.cell !== nextFormats.cell) {\r\n const next = this.splitAfter(child)\r\n if (next) {\r\n next.optimize()\r\n }\r\n // We might be able to merge with prev now\r\n if (this.prev) {\r\n this.prev.optimize()\r\n }\r\n }\r\n })\r\n\r\n super.optimize(context)\r\n }\r\n\r\n // 兼容读取TableCell中的子blot,包括table-cell-line、line、head\r\n getFormat(domNode) {\r\n const formats = {}\r\n const firstChild = domNode.childNodes[0]\r\n if (firstChild && domNode.tagName === 'OL') {\r\n formats.list = firstChild.classList.item(0)\r\n }\r\n\r\n return reduceFormats(domNode, formats)\r\n }\r\n\r\n row() {\r\n return this.parent\r\n }\r\n\r\n rowOffset() {\r\n if (this.row()) {\r\n return -1\r\n }\r\n return this.row().rowOffset()\r\n }\r\n\r\n table() {\r\n return this.row() && this.row().table()\r\n }\r\n}\r\nTableCell.blotName = 'table'\r\nTableCell.tagName = 'TD'\r\n\r\n// @dynamic\r\nclass TableRow extends Container {\r\n static requiredContainer: any\r\n static allowedChildren: any\r\n static blotName: string\r\n static tagName: string\r\n next: any\r\n children: any\r\n domNode: any\r\n statics: any\r\n wrap: any\r\n splitAfter: any\r\n enforceAllowedChildren: any\r\n uiNode: any\r\n parent: any\r\n prev: any\r\n\r\n static create(value) {\r\n const node = super.create(value)\r\n if (value.row) {\r\n node.setAttribute('data-row', value.row)\r\n }\r\n return node\r\n }\r\n\r\n checkMerge() {\r\n if (super.checkMerge() && !isNullOrUndefined(this.next.children.head)) {\r\n const thisHead = this.children.head.formats()\r\n const thisTail = this.children.tail.formats()\r\n const nextHead = this.next.children.head.formats()\r\n const nextTail = this.next.children.tail.formats()\r\n\r\n return thisHead.row === thisTail.row && thisHead.row === nextHead.row && thisHead.row === nextTail.row\r\n }\r\n return false\r\n }\r\n\r\n formats() {\r\n return ['row'].reduce((formats, attrName) => {\r\n if (this.domNode.hasAttribute(`data-${attrName}`)) {\r\n formats[attrName] = this.domNode.getAttribute(`data-${attrName}`)\r\n }\r\n return formats\r\n }, {})\r\n }\r\n\r\n format(key, value) {\r\n this.domNode.setAttribute(`data-${key}`, value)\r\n }\r\n\r\n optimize(context) {\r\n // optimize function of ShadowBlot\r\n if (this.statics.requiredContainer && !(this.parent instanceof this.statics.requiredContainer)) {\r\n this.wrap(this.statics.requiredContainer.blotName)\r\n }\r\n\r\n this.children.forEach((child) => {\r\n if (isNullOrUndefined(child.next)) {\r\n return\r\n }\r\n const childFormats = child.formats()\r\n const nextFormats = child.next.formats()\r\n if (childFormats.row !== nextFormats.row) {\r\n const next = this.splitAfter(child)\r\n if (next) {\r\n next.optimize()\r\n }\r\n if (this.prev) {\r\n this.prev.optimize()\r\n }\r\n }\r\n })\r\n\r\n super.optimize(context)\r\n }\r\n\r\n rowOffset() {\r\n if (!this.parent) {\r\n return -1\r\n }\r\n return this.parent.children.indexOf(this)\r\n }\r\n\r\n table() {\r\n return this.parent && this.parent.parent\r\n }\r\n}\r\nTableRow.blotName = 'table-row'\r\nTableRow.tagName = 'TR'\r\n\r\n// @dynamic\r\nclass TableBody extends Container {\r\n static requiredContainer: any\r\n static allowedChildren: any\r\n static blotName: string\r\n static tagName: string\r\n}\r\nTableBody.blotName = 'table-body'\r\nTableBody.tagName = 'TBODY'\r\n\r\n// @dynamic\r\nclass TableCol extends Block {\r\n static requiredContainer: any\r\n static blotName: string\r\n static tagName: string\r\n domNode: any\r\n\r\n static create(value) {\r\n const node = super.create(value)\r\n COL_ATTRIBUTES.forEach((attrName) => {\r\n node.setAttribute(`${attrName}`, value[attrName] || COL_DEFAULT[attrName])\r\n })\r\n return node\r\n }\r\n\r\n static formats(domNode) {\r\n return COL_ATTRIBUTES.reduce((formats, attribute) => {\r\n if (domNode.hasAttribute(`${attribute}`)) {\r\n formats[attribute] = domNode.getAttribute(`${attribute}`) || undefined\r\n }\r\n return formats\r\n }, {})\r\n }\r\n\r\n format(name, value) {\r\n if (COL_ATTRIBUTES.includes(name)) {\r\n this.domNode.setAttribute(`${name}`, value || COL_DEFAULT[name])\r\n }\r\n else {\r\n super.format(name, value)\r\n }\r\n }\r\n\r\n html() {\r\n return this.domNode.outerHTML\r\n }\r\n}\r\nTableCol.blotName = 'table-col'\r\nTableCol.tagName = 'col'\r\n\r\n// @dynamic\r\nclass TableColGroup extends Container {\r\n static requiredContainer: any\r\n static allowedChildren: any\r\n static blotName: string\r\n static tagName: string\r\n parent: any\r\n statics: any\r\n\r\n optimize(context) {\r\n super.optimize(context)\r\n // optimize 是当前slot更新后调用的callback方法,当TableBody更新后判断父容器的存在和类型相符则调用更新表格宽度方法更新宽度\r\n // 切记不要在当前slot内调用能改变当前slot的方法,会造成无限循环,一般通过子更新改变父较好\r\n if (this.parent && this.statics.requiredContainer && this.parent instanceof this.statics.requiredContainer) {\r\n this.parent.updateTableWidth()\r\n }\r\n // 此时colgroup创建完毕,检查colgroup的col数量是否正确\r\n // fix:colgroup的col数量不正确导致最后一列宽度为空\r\n if (this.parent.parent.domNode.className === 'quill-better-table-wrapper'\r\n && this.parent.parent.domNode.tagName === 'DIV'\r\n && this.parent.domNode.children.length >= 2\r\n && this.parent.domNode.children[0].tagName === 'COLGROUP'\r\n && this.parent.domNode.children[1].tagName === 'TBODY'\r\n ) {\r\n let trId = ''\r\n let colSpan = 0\r\n let colgroupNumber = 0\r\n for (let i = 0; i < this.parent.domNode.children.length; i++) {\r\n if (this.parent.domNode.children[i].tagName === 'TBODY') {\r\n if (trId === '') {\r\n trId = this.parent.domNode.children[i].children[0].getAttribute('data-row')\r\n }\r\n colSpan = this.findTdColspanInTbody(this.parent.domNode.children[i], trId)\r\n }\r\n else if (this.parent.domNode.children[i].tagName === 'COLGROUP') {\r\n colgroupNumber = this.parent.domNode.children[i].children.length\r\n }\r\n }\r\n let elementSibling = this.parent.domNode.nextElementSibling\r\n\r\n while (elementSibling && elementSibling.tagName === 'TABLE') {\r\n for (let i = 0; i < elementSibling.children.length; i++) {\r\n if (elementSibling.children[i].tagName === 'TBODY') {\r\n colSpan += this.findTdColspanInTbody(elementSibling.children[i], trId)\r\n }\r\n }\r\n elementSibling = elementSibling.nextElementSibling\r\n }\r\n\r\n if (colgroupNumber < colSpan) {\r\n const length = colSpan - colgroupNumber\r\n\r\n for (let i = 0; i < length; i++) {\r\n const newCol = document.createElement('col')\r\n newCol.width = this.parent.domNode.children[0].children[this.parent.domNode.children[0].children.length - 1].width\r\n const newBr = document.createElement('br')\r\n newCol.appendChild(newBr)\r\n this.parent.domNode.children[0].appendChild(newCol)\r\n this.parent.domNode.style.width += newCol.width\r\n }\r\n }\r\n }\r\n }\r\n\r\n // this.parent.domNode.children[1].children[0].children[0].colSpan\r\n findTdColspanInTbody(tbody, trId) {\r\n let colSpan = 0\r\n // let tbodyChildrenLength\r\n for (let i = 0; i < tbody.children.length; i++) {\r\n if (tbody.children[i].getAttribute('data-row') !== trId) {\r\n return colSpan\r\n }\r\n for (let j = 0; j < tbody.children[i].children.length; j++) {\r\n if (tbody.children[i].children[j].colSpan) {\r\n colSpan += tbody.children[i].children[j].colSpan\r\n }\r\n }\r\n }\r\n return colSpan\r\n }\r\n}\r\nTableColGroup.blotName = 'table-col-group'\r\nTableColGroup.tagName = 'colgroup'\r\n\r\n// @dynamic\r\nclass TableContainer extends Container {\r\n static blotName: string\r\n static className: string\r\n static tagName: string\r\n static requiredContainer: any\r\n static allowedChildren: any\r\n domNode: any\r\n parent: any\r\n children: any\r\n descendants: any\r\n scroll: any\r\n remove: any\r\n static create() {\r\n const node = super.create()\r\n return node\r\n }\r\n\r\n constructor(scroll, domNode) {\r\n super(scroll, domNode)\r\n domNode.setAttribute('contenteditable', false)\r\n this.updateTableWidth()\r\n }\r\n\r\n updateTableWidth() {\r\n let colGroup = this.colGroup()\r\n if (!colGroup) {\r\n // undo时原表格dom被移除,因此colGroup和domNode都不对应当前新表格,需从父容器dom树重新获取\r\n // 如果表格有style属性则不为新添加表格,避免错误赋值\r\n if (this.parent && this.parent.children.head && this.domNode.hasAttribute('style')) {\r\n colGroup = this.parent.children.head.children.head\r\n this.domNode = this.parent.children.head.domNode\r\n }\r\n else if (this.domNode.tagName === 'TABLE') {\r\n // this.domNode.forEach\r\n return\r\n }\r\n else {\r\n return\r\n }\r\n }\r\n const tableWidth = colGroup.children.reduce((sumWidth, col) => {\r\n // 兼容 table-col 不存在的情况\r\n const tableCol = col.formats()[TableCol.blotName]\r\n let tableColWidth = COL_DEFAULT.width\r\n if (tableCol && tableCol.width) {\r\n tableColWidth = Number.parseInt(tableCol.width, 10)\r\n }\r\n sumWidth = sumWidth + tableColWidth\r\n return sumWidth\r\n }, 0)\r\n this.domNode.removeAttribute('style')\r\n this.domNode.style.width = `${tableWidth}px`\r\n // 当表格加载结束后修正width设定为auto的列宽度\r\n if (colGroup.next) {\r\n setTimeout(() => {\r\n let tdIndex = 0\r\n let maxTds\r\n const colNum = colGroup.children.length\r\n const tableRows = this.descendants(TableRow)\r\n // 查询单元格数等于列数的行作为宽度赋值依据\r\n for (let i = 0; i < tableRows.length; i++) {\r\n const tds = tableRows[i].domNode.querySelectorAll('td')\r\n if (tds.length === colNum) {\r\n maxTds = tds\r\n break\r\n }\r\n }\r\n colGroup.children.forEach((col) => {\r\n if (maxTds && col.domNode.width === 'auto') {\r\n const width = getComputedStyle(maxTds[tdIndex]).width\r\n const num = Number.parseInt(width, 10)\r\n col.domNode.width = (num < COL_DEFAULT.width && COL_DEFAULT.width) || num\r\n }\r\n tdIndex++\r\n })\r\n })\r\n }\r\n }\r\n\r\n cells(column) {\r\n return this.rows().map(row => row.children.at(column))\r\n }\r\n\r\n colGroup() {\r\n return this.children.head\r\n }\r\n\r\n deleteColumns(compareRect, delIndexes = [], editorWrapper) {\r\n const [body] = this.descendants(TableBody)\r\n if (isNullOrUndefined(body) || isNullOrUndefined(body.children.head)) {\r\n return\r\n }\r\n\r\n const tableCells = this.descendants(TableCell)\r\n const removedCells = []\r\n const modifiedCells = []\r\n\r\n tableCells.forEach((cell) => {\r\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper)\r\n\r\n if (cellRect.x + ERROR_LIMIT > compareRect.x && cellRect.x1 - ERROR_LIMIT < compareRect.x1) {\r\n removedCells.push(cell)\r\n }\r\n else if (cellRect.x < compareRect.x + ERROR_LIMIT && cellRect.x1 > compareRect.x1 - ERROR_LIMIT) {\r\n modifiedCells.push(cell)\r\n }\r\n })\r\n\r\n if (removedCells.length === tableCells.length) {\r\n this.tableDestroy()\r\n return true\r\n }\r\n\r\n // remove the matches column tool cell\r\n delIndexes.forEach(() => {\r\n const col = this.colGroup().children.at(delIndexes[0])\r\n if (!col || this.colGroup().children.at(delIndexes[0]).domNode !== this.colGroup().domNode.children[delIndexes[0]]) {\r\n this.colGroup().domNode.removeChild(this.colGroup().domNode.children[delIndexes[0]])\r\n }\r\n else {\r\n col.remove()\r\n }\r\n })\r\n\r\n removedCells.forEach((cell) => {\r\n cell.remove()\r\n })\r\n\r\n modifiedCells.forEach((cell) => {\r\n const cellColspan = Number.parseInt(cell.formats().colspan, 10)\r\n // const cellWidth = parseInt(cell.formats().width, 10);\r\n cell.format('colspan', cellColspan - delIndexes.length)\r\n })\r\n\r\n this.updateTableWidth()\r\n }\r\n\r\n deleteRow(compareRect, editorWrapper) {\r\n const [body] = this.descendants(TableBody)\r\n if (isNullOrUndefined(body) || isNullOrUndefined(body.children.head)) {\r\n return\r\n }\r\n\r\n const tableCells = this.descendants(TableCell)\r\n const tableRows = this.descendants(TableRow)\r\n const removedCells = [] // cells to be removed\r\n const modifiedCells = [] // cells to be modified\r\n const fallCells = [] // cells to fall into next row\r\n\r\n tableCells.forEach((cell) => {\r\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper)\r\n\r\n if (cellRect.y > compareRect.y - ERROR_LIMIT && cellRect.y1 < compareRect.y1 + ERROR_LIMIT) {\r\n removedCells.push(cell)\r\n }\r\n else if (cellRect.y < compareRect.y + ERROR_LIMIT && cellRect.y1 > compareRect.y1 - ERROR_LIMIT) {\r\n modifiedCells.push(cell)\r\n\r\n if (Math.abs(cellRect.y - compareRect.y) < ERROR_LIMIT) {\r\n fallCells.push(cell)\r\n }\r\n }\r\n })\r\n\r\n if (removedCells.length === tableCells.length) {\r\n this.tableDestroy()\r\n return\r\n }\r\n\r\n // compute length of removed rows\r\n const removedRowsLength = this.rows().reduce((sum, row) => {\r\n const rowRect = getRelativeRect(row.domNode.getBoundingClientRect(), editorWrapper)\r\n\r\n if (rowRect.y > compareRect.y - ERROR_LIMIT && rowRect.y1 < compareRect.y1 + ERROR_LIMIT) {\r\n sum += 1\r\n }\r\n return sum\r\n }, 0)\r\n\r\n // it must execute before the table layout changed with other operation\r\n fallCells.forEach((cell) => {\r\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper)\r\n const nextRow = cell.parent.next\r\n const cellsInNextRow = nextRow.children\r\n\r\n const refCell = cellsInNextRow.reduce((ref, compareCell) => {\r\n const compareCellRect = getRelativeRect(compareCell.domNode.getBoundingClientRect(), editorWrapper)\r\n if (cellRect.x1 - compareCellRect.x < ERROR_LIMIT) {\r\n ref = compareCell\r\n }\r\n return ref\r\n }, null)\r\n\r\n nextRow.insertBefore(cell, refCell)\r\n const curRowId = nextRow.formats().row\r\n cell.format('row', curRowId)\r\n cell.children.forEach((cellLine) => {\r\n cellLine.format('row', curRowId)\r\n })\r\n })\r\n\r\n modifiedCells.forEach((cell) => {\r\n const cellRowspan = Number.parseInt(cell.formats().rowspan, 10)\r\n const curRowspan = cellRowspan - removedRowsLength\r\n cell.domNode.removeAttribute('style')\r\n cell.format('rowspan', curRowspan)\r\n cell.children.forEach((cellLine) => {\r\n cellLine.format('rowspan', curRowspan)\r\n })\r\n })\r\n\r\n removedCells.forEach((cell) => {\r\n cell.remove()\r\n })\r\n\r\n // fix: There will be a empty tr left if i delete the last row of a table,\r\n // this will cause the bottom border of the table to disappear,\r\n // and the empty tr will execute the matchTableRow method.\r\n tableRows.forEach((row) => {\r\n if (row.children.length === 0) {\r\n row.remove()\r\n }\r\n })\r\n }\r\n\r\n tableDestroy() {\r\n const quill = Quill.find(this.scroll.domNode.parentNode)\r\n const tableModule = quill.getModule('better-table')\r\n this.remove()\r\n tableModule.hideTableTools()\r\n quill.update(Quill.sources.USER)\r\n }\r\n\r\n insertCell(tableRow, ref, bg = '') {\r\n const id = cellId()\r\n const rId = tableRow.formats().row\r\n const tableCell = this.scroll.create(\r\n TableCell.blotName,\r\n { ...CELL_DEFAULT, row: rId },\r\n )\r\n tableCell.domNode.style.backgroundColor = bg\r\n const cellLine = this.scroll.create(TableCellLine.blotName, {\r\n row: rId,\r\n cell: id,\r\n })\r\n tableCell.appendChild(cellLine)\r\n\r\n if (ref) {\r\n tableRow.insertBefore(tableCell, ref)\r\n }\r\n else {\r\n tableRow.appendChild(tableCell)\r\n }\r\n }\r\n\r\n insertColumn(compareRect, colIndex, isRight = true, editorWrapper) {\r\n const [body] = this.descendants(TableBody)\r\n const [tableColGroup] = this.descendants(TableColGroup)\r\n const tableCols = this.descendants(TableCol)\r\n const addAsideCells = []\r\n const modifiedCells = []\r\n const affectedCells = []\r\n\r\n if (isNullOrUndefined(body) || isNullOrUndefined(body.children.head)) {\r\n return\r\n }\r\n const tableCells = this.descendants(TableCell)\r\n tableCells.forEach((cell) => {\r\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper)\r\n\r\n if (isRight) {\r\n if (Math.abs(cellRect.x1 - compareRect.x1) < ERROR_LIMIT) {\r\n // the right of selected boundary equal to the right of table cell,\r\n // add a new table cell right aside this table cell\r\n addAsideCells.push(cell)\r\n }\r\n else if (compareRect.x1 - cellRect.x > ERROR_LIMIT && compareRect.x1 - cellRect.x1 < -ERROR_LIMIT) {\r\n // the right of selected boundary is inside this table cell\r\n // colspan of this table cell will increase 1\r\n modifiedCells.push(cell)\r\n }\r\n }\r\n else {\r\n if (Math.abs(cellRect.x - compareRect.x) < ERROR_LIMIT) {\r\n // left of selected boundary equal to left of table cell,\r\n // add a new table cell left aside this table cell\r\n addAsideCells.push(cell)\r\n }\r\n else if (compareRect.x - cellRect.x > ERROR_LIMIT && compareRect.x - cellRect.x1 < -ERROR_LIMIT) {\r\n // the left of selected boundary is inside this table cell\r\n // colspan of this table cell will increase 1\r\n modifiedCells.push(cell)\r\n }\r\n }\r\n })\r\n\r\n addAsideCells.forEach((cell) => {\r\n const ref = isRight ? cell.next : cell\r\n const id = cellId()\r\n const tableRow = cell.parent\r\n const rId = tableRow.formats().row\r\n const cellFormats = cell.formats()\r\n const tableCell = this.scroll.create(\r\n TableCell.blotName,\r\n { ...CELL_DEFAULT, row: rId, rowspan: cellFormats.rowspan },\r\n )\r\n const cellLine = this.scroll.create(TableCellLine.blotName, {\r\n row: rId,\r\n cell: id,\r\n rowspan: cellFormats.rowspan,\r\n })\r\n tableCell.appendChild(cellLine)\r\n\r\n if (ref) {\r\n tableRow.insertBefore(tableCell, ref)\r\n }\r\n else {\r\n tableRow.appendChild(tableCell)\r\n }\r\n affectedCells.push(tableCell)\r\n })\r\n\r\n // insert new tableCol\r\n const tableCol = this.scroll.create(TableCol.blotName, true)\r\n let colRef\r\n if (isRight) {\r\n colRef = tableCols[colIndex] && tableCols[colIndex].next\r\n }\r\n else {\r\n colRef = tableCols[colIndex]\r\n }\r\n\r\n if (colRef) {\r\n tableColGroup.insertBefore(tableCol, colRef)\r\n }\r\n else {\r\n tableColGroup.appendChild(tableCol)\r\n }\r\n\r\n modifiedCells.forEach((cell) => {\r\n const cellColspan = cell.formats().colspan\r\n cell.format('colspan', Number.parseInt(cellColspan, 10) + 1)\r\n affectedCells.push(cell)\r\n })\r\n\r\n affectedCells.sort((cellA, cellB) => {\r\n const y1 = cellA.domNode.getBoundingClientRect().y\r\n const y2 = cellB.domNode.getBoundingClientRect().y\r\n return y1 - y2\r\n })\r\n\r\n this.updateTableWidth()\r\n return affectedCells\r\n }\r\n\r\n insertRow(compareRect, isDown, editorWrapper) {\r\n const [body] = this.descendants(TableBody)\r\n if (isNullOrUndefined(body) || isNullOrUndefined(body.children.head)) {\r\n return\r\n }\r\n\r\n const tableCells = this.descendants(TableCell)\r\n const rId = rowId()\r\n const newRow = this.scroll.create(TableRow.blotName, {\r\n row: rId,\r\n })\r\n const addBelowCells = []\r\n const modifiedCells = []\r\n const affectedCells = []\r\n\r\n tableCells.forEach((cell) => {\r\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper)\r\n\r\n if (isDown) {\r\n if (Math.abs(cellRect.y1 - compareRect.y1) < ERROR_LIMIT) {\r\n addBelowCells.push(cell)\r\n }\r\n else if (compareRect.y1 - cellRect.y > ERROR_LIMIT && compareRect.y1 - cellRect.y1 < -ERROR_LIMIT) {\r\n modifiedCells.push(cell)\r\n }\r\n }\r\n else {\r\n if (Math.abs(cellRect.y - compareRect.y) < ERROR_LIMIT) {\r\n addBelowCells.push(cell)\r\n }\r\n else if (compareRect.y - cellRect.y > ERROR_LIMIT && compareRect.y - cellRect.y1 < -ERROR_LIMIT) {\r\n modifiedCells.push(cell)\r\n }\r\n }\r\n })\r\n\r\n // ordered table cells with rect.x, fix error for inserting\r\n // new table cell in complicated table with wrong order.\r\n const sortFunc = (cellA, cellB) => {\r\n const x1 = cellA.domNode.getBoundingClientRect().x\r\n const x2 = cellB.domNode.getBoundingClientRect().x\r\n return x1 - x2\r\n }\r\n addBelowCells.sort(sortFunc)\r\n\r\n addBelowCells.forEach((cell) => {\r\n const cId = cellId()\r\n const cellFormats = cell.formats()\r\n\r\n const tableCell = this.scroll.create(\r\n TableCell.blotName,\r\n { ...CELL_DEFAULT, row: rId, cell: cId, colspan: cellFormats.colspan },\r\n )\r\n const cellLine = this.scroll.create(TableCellLine.blotName, {\r\n row: rId,\r\n cell: cId,\r\n colspan: cellFormats.colspan,\r\n })\r\n const empty = this.scroll.create(Break.blotName)\r\n cellLine.appendChild(empty)\r\n tableCell.appendChild(cellLine)\r\n newRow.appendChild(tableCell)\r\n affectedCells.push(tableCell)\r\n })\r\n\r\n modifiedCells.forEach((cell) => {\r\n const cellRowspan = Number.parseInt(cell.formats().rowspan, 10)\r\n cell.format('rowspan', cellRowspan + 1)\r\n affectedCells.push(cell)\r\n })\r\n\r\n const refRow = this.rows().find((row) => {\r\n const rowRect = getRelativeRect(row.domNode.getBoundingClientRect(), editorWrapper)\r\n if (isDown) {\r\n return Math.abs(rowRect.y - compareRect.y - compareRect.height) < ERROR_LIMIT\r\n }\r\n else {\r\n return Math.abs(rowRect.y - compareRect.y) < ERROR_LIMIT\r\n }\r\n })\r\n body.insertBefore(newRow, refRow)\r\n\r\n // reordering affectedCells\r\n affectedCells.sort(sortFunc)\r\n return affectedCells\r\n }\r\n\r\n mergeCells(_compareRect, mergingCells, rowspan, colspan, _editorWrapper) {\r\n const mergedCell = mergingCells.reduce((result, tableCell, index) => {\r\n if (index !== 0) {\r\n if (result) {\r\n tableCell.moveChildren(result)\r\n }\r\n tableCell.remove()\r\n }\r\n else {\r\n tableCell.format('colspan', colspan)\r\n tableCell.format('rowspan', rowspan)\r\n result = tableCell\r\n if (rowspan > 1) {\r\n // fix: 比较当前单元格高度样式与rowspan最小高度,小于则设置高度,不判断实际高度,因为合并时这一刻实际高度可能高于最小高度\r\n const minHeight = CELL_MIN_HEIGHT * rowspan + rowspan - 1\r\n const cellHeight = Number.parseInt(tableCell.domNode.style.height, 10) || 0\r\n if (cellHeight < minHeight) {\r\n tableCell.domNode.style.height = `${minHeight}px`\r\n }\r\n }\r\n }\r\n\r\n return result\r\n }, null)\r\n\r\n const rId = mergedCell.domNode.getAttribute('data-row')\r\n const cId = mergedCell.children.head.domNode.getAttribute('data-cell')\r\n mergedCell.children.forEach((cellLine) => {\r\n cellLine.domNode.setAttribute('data-parent-bg', mergedCell.domNode.style.backgroundColor)\r\n if (cellLine.children.head.domNode.style) {\r\n cellLine.children.head.domNode.style.backgroundColor = mergedCell.domNode.style.backgroundColor\r\n }\r\n\r\n if (!cellLine.prev || cellLine.domNode.textContent.trim()) {\r\n cellLine.format('cell', cId)\r\n cellLine.format('row', rId)\r\n cellLine.format('colspan', colspan)\r\n cellLine.format('rowspan', rowspan)\r\n }\r\n else {\r\n cellLine.remove()\r\n }\r\n })\r\n\r\n return mergedCell\r\n }\r\n\r\n unmergeCells(unmergingCells, editorWrapper) {\r\n let cellFormats: any = {}\r\n let cellRowspan = 1\r\n let cellColspan = 1\r\n\r\n unmergingCells.forEach((tableCell) => {\r\n const tableCellBgColor = tableCell.domNode.style.backgroundColor\r\n cellFormats = tableCell.formats()\r\n cellRowspan = cellFormats.rowspan\r\n cellColspan = cellFormats.colspan\r\n\r\n if (cellColspan > 1) {\r\n const ref = tableCell.next\r\n const row = tableCell.row()\r\n tableCell.format('colspan', 1)\r\n if (tableCell.domNode.children && tableCell.domNode.children[0].tagName === 'DIV' && tableCell.domNode.children[0].getAttribute('data-colspan')) {\r\n tableCell.domNode.children[0].setAttribute('data-colspan', 1)\r\n }\r\n for (let colspanIndex = cellColspan; colspanIndex > 1; colspanIndex--) {\r\n this.insertCell(row, ref, tableCellBgColor)\r\n }\r\n }\r\n\r\n if (cellRowspan > 1) {\r\n let rowspanIndex = cellRowspan\r\n let nextRow = tableCell.row().next\r\n while (rowspanIndex > 1) {\r\n const refInNextRow = nextRow.children.reduce((result, cell) => {\r\n const compareRect = getRelativeRect(tableCell.domNode.getBoundingClientRect(), editorWrapper)\r\n const cellRect = getRelativeRect(cell.domNode.getBoundingClientRect(), editorWrapper)\r\n if (Math.abs(compareRect.x1 - cellRect.x) < ERROR_LIMIT) {\r\n result = cell\r\n }\r\n return result\r\n }, null)\r\n\r\n for (let colspanIndex = cellColspan; colspanIndex > 0; colspanIndex--) {\r\n this.insertCell(nextRow, refInNextRow, tableCellBgColor)\r\n }\r\n\r\n rowspanIndex -= 1\r\n nextRow = nextRow.next\r\n }\r\n\r\n tableCell.domNode.removeAttribute('style')\r\n if (tableCell.domNode.children && tableCell.domNode.children[0].tagName === 'DIV' && tableCell.domNode.children[0].getAttribute('data-rowspan')) {\r\n tableCell.domNode.children[0].setAttribute('data-rowspan', 1)\r\n }\r\n tableCell.format('rowspan', 1)\r\n }\r\n })\r\n }\r\n\r\n emptyCells(selectedTds) {\r\n selectedTds.forEach((selectedTd) => {\r\n // 构造空的table cell line, 优先使用单元格已有rowId和cellId,避免从table-cell-line向上层td提交id时不一致导致错位\r\n const cellFormats = selectedTd.formats()\r\n const cellLine = this.scroll.create(TableCellLine.blotName, {\r\n row: cellFormats.row || rowId(),\r\n cell: cellFormats.cell || cellId(),\r\n rowspan: cellFormats.rowspan,\r\n colspan: cellFormats.colspan,\r\n })\r\n const empty = this.scroll.create(Break.blotName)\r\n cellLine.appendChild(empty)\r\n\r\n selectedTd.domNode.innerHTML = ''\r\n selectedTd.appendChild(cellLine)\r\n })\r\n }\r\n\r\n rows() {\r\n const body = this.children.tail\r\n if (isNullOrUndefined(body)) {\r\n return []\r\n }\r\n return body.children.map(row => row)\r\n }\r\n}\r\nTableContainer.blotName = 'ql-table-container'\r\nTableContainer.className = 'quill-better-table'\r\nTableContainer.tagName = 'TABLE'\r\n\r\n// @dynamic\r\nclass TableViewWrapper extends Container {\r\n static blotName: string\r\n static tagName: string\r\n static className: string\r\n static allowedChildren: any\r\n constructor(scroll, domNode) {\r\n super(scroll, domNode)\r\n const quill = Quill.find(scroll.domNode.parentNode)\r\n // fix: 只读模式时超长表格默认包含滚动条\r\n if (quill.options.readOnly) {\r\n domNode.style.overflow = 'auto'\r\n }\r\n domNode.addEventListener(\r\n 'scroll',\r\n (e) => {\r\n const tableModule = quill.getModule('better-table')\r\n if (tableModule.columnTool) {\r\n tableModule.columnTool.domNode.scrollLeft = e.target.scrollLeft\r\n }\r\n\r\n if (tableModule.tableSelection && tableModule.tableSelection.selectedTds.length > 0) {\r\n tableModule.tableSelection.repositionHelpLines()\r\n }\r\n },\r\n false,\r\n )\r\n }\r\n}\r\nTableViewWrapper.blotName = 'table-view'\r\nTableViewWrapper.className = 'quill-better-table-wrapper'\r\nTableViewWrapper.tagName = 'DIV'\r\n\r\nTableViewWrapper.allowedChildren = [TableContainer]\r\nTableContainer.requiredContainer = TableViewWrapper\r\n\r\nTableContainer.allowedChildren = [TableBody, TableColGroup]\r\nTableBody.requiredContainer = TableContainer\r\n\r\nTableBody.allowedChildren = [TableRow]\r\nTableRow.requiredContainer = TableBody\r\n\r\nTableRow.allowedChildren = [TableCell]\r\nTableCell.requiredContainer = TableRow\r\n\r\nTableCell.allowedChildren = [TableCellLine, Header, ListItem, ListContainer]\r\nTableCellLine.requiredContainer = TableCell\r\n\r\nTableColGroup.allowedChildren = [TableCol]\r\nTableColGroup.requiredContainer = TableContainer\r\n\r\nTableCol.requiredContainer = TableColGroup\r\n\r\nfunction rowId() {\r\n const id = Math.random().toString(36).slice(2, 6)\r\n return `row-${id}`\r\n}\r\n\r\nfunction cellId() {\r\n const id = Math.random().toString(36).slice(2, 6)\r\n return `cell-${id}`\r\n}\r\n\r\nfunction reduceFormats(domNode: HTMLElement, formats: Record<string, any>) {\r\n return [...CELL_ATTRIBUTES, ...CELL_IDENTITY_KEYS].reduce((tableFormats, attribute) => {\r\n if (domNode.hasAttribute(`data-${attribute}`)) {\r\n tableFormats[attribute] = domNode.getAttribute(`data-${attribute}`) || undefined\r\n }\r\n return tableFormats\r\n }, formats)\r\n}\r\n\r\nexport {\r\n CELL_ATTRIBUTES,\r\n CELL_IDENTITY_KEYS,\r\n cellId,\r\n rowId,\r\n TableBody,\r\n TableCell,\r\n TableCellLine,\r\n TableCol,\r\n TableColGroup,\r\n TableContainer,\r\n TableRow,\r\n TableViewWrapper,\r\n}\r\n"],"names":["CELL_IDENTITY_KEYS","CELL_ATTRIBUTES","CELL_DEFAULT","compare","formats","isNullOrUndefined","COL_ATTRIBUTES","COL_DEFAULT","getRelativeRect","ERROR_LIMIT","index","CELL_MIN_HEIGHT","Header","ListItem","ListContainer"],"mappings":"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"}
|
|
@@ -85,7 +85,7 @@ class TableColumnTool {
|
|
|
85
85
|
col = tableContainer.colGroup().domNode.children[index$1];
|
|
86
86
|
colWidth = col ? col.width : tableContainer.colGroup().domNode.children[index$1 - 1].width;
|
|
87
87
|
} else {
|
|
88
|
-
colWidth = parseInt(col.formats()[col.statics.blotName].width, 10);
|
|
88
|
+
colWidth = Number.parseInt(col.formats()[col.statics.blotName].width, 10);
|
|
89
89
|
}
|
|
90
90
|
let colToolCell = null;
|
|
91
91
|
if (!existCells[index$1]) {
|
|
@@ -117,13 +117,13 @@ class TableColumnTool {
|
|
|
117
117
|
const rowNumber = Math.max(existCells.length, tableRows.length);
|
|
118
118
|
for (let index$1 = 0; index$1 < rowNumber; index$1++) {
|
|
119
119
|
const row = tableRows[index$1];
|
|
120
|
-
let computedHeight = row && getComputedStyle(row)
|
|
120
|
+
let computedHeight = row && getComputedStyle(row).height;
|
|
121
121
|
if (computedHeight === "auto") {
|
|
122
122
|
computedHeight = row.querySelector("td").style.height || "30px";
|
|
123
123
|
}
|
|
124
|
-
let rowHeight = row && parseFloat(computedHeight);
|
|
124
|
+
let rowHeight = row && Number.parseFloat(computedHeight);
|
|
125
125
|
if (rowHeight < tableConfig.CELL_MIN_HEIGHT) {
|
|
126
|
-
const rowChildHeight = row && row.childNodes[0] && parseFloat(getComputedStyle(row.childNodes[0])
|
|
126
|
+
const rowChildHeight = row && row.childNodes[0] && Number.parseFloat(getComputedStyle(row.childNodes[0]).height);
|
|
127
127
|
rowHeight = rowChildHeight;
|
|
128
128
|
}
|
|
129
129
|
let rowToolCell = null;
|
|
@@ -204,13 +204,13 @@ class TableColumnTool {
|
|
|
204
204
|
const rowIndex = existCells.indexOf(cell);
|
|
205
205
|
const rows = Array.from(this.table.querySelectorAll("tr"));
|
|
206
206
|
const tds = Array.from(rows[rowIndex].childNodes);
|
|
207
|
-
const hasContentTd = tds.find((td) => td.getAttribute("rowspan") === "1" && td.
|
|
207
|
+
const hasContentTd = tds.find((td) => td.getAttribute("rowspan") === "1" && td.textContent !== "\n");
|
|
208
208
|
if (dragging) {
|
|
209
209
|
let tdHeight = `${height0 + delta}px`;
|
|
210
210
|
if (hasContentTd) {
|
|
211
211
|
tds.forEach((td) => td.getAttribute("rowspan") === "1" && index.css(td, { height: tdHeight }));
|
|
212
|
-
const currentHeight = getComputedStyle(hasContentTd)
|
|
213
|
-
tdHeight = parseInt(currentHeight, 10) > height0 + delta && currentHeight || tdHeight;
|
|
212
|
+
const currentHeight = getComputedStyle(hasContentTd).height;
|
|
213
|
+
tdHeight = Number.parseInt(currentHeight, 10) > height0 + delta && currentHeight || tdHeight;
|
|
214
214
|
}
|
|
215
215
|
index.css(cell, { height: tdHeight });
|
|
216
216
|
tds.forEach((td) => td.getAttribute("rowspan") === "1" && index.css(td, { height: tdHeight }));
|
|
@@ -326,7 +326,7 @@ class TableColumnTool {
|
|
|
326
326
|
colBlot = tableContainer.colGroup().domNode.children[colIndex];
|
|
327
327
|
}
|
|
328
328
|
if (dragging) {
|
|
329
|
-
const colWidth = parseInt(width0 + delta, 10);
|
|
329
|
+
const colWidth = Number.parseInt(width0 + delta, 10);
|
|
330
330
|
if (colBlot.format) {
|
|
331
331
|
colBlot.format("width", colWidth);
|
|
332
332
|
} else {
|