@opentiny/fluent-editor 3.22.0 → 3.23.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +2 -0
  2. package/es/config/editor.config.es.js +9 -3
  3. package/es/config/editor.config.es.js.map +1 -1
  4. package/es/config/i18n/en-us.es.js +47 -26
  5. package/es/config/i18n/en-us.es.js.map +1 -1
  6. package/es/config/i18n/zh-cn.es.js +47 -26
  7. package/es/config/i18n/zh-cn.es.js.map +1 -1
  8. package/es/config/index.es.js +3 -44
  9. package/es/config/index.es.js.map +1 -1
  10. package/es/counter/index.es.js +16 -11
  11. package/es/counter/index.es.js.map +1 -1
  12. package/es/custom-clipboard.es.js +4 -4
  13. package/es/custom-clipboard.es.js.map +1 -1
  14. package/es/fluent-editor.es.js +28 -3
  15. package/es/fluent-editor.es.js.map +1 -1
  16. package/es/fullscreen/handler.es.js +10 -0
  17. package/es/fullscreen/handler.es.js.map +1 -1
  18. package/es/index.es.js +4 -3
  19. package/es/link/modules/tooltip.es.js +22 -5
  20. package/es/link/modules/tooltip.es.js.map +1 -1
  21. package/es/table/modules/table-operation-menu.es.js +213 -203
  22. package/es/table/modules/table-operation-menu.es.js.map +1 -1
  23. package/es/table/modules/table-selection.es.js.map +1 -1
  24. package/es/table/utils/node-matchers.es.js +1 -1
  25. package/es/table/utils/node-matchers.es.js.map +1 -1
  26. package/es/toolbar/index.es.js +2 -0
  27. package/es/toolbar/index.es.js.map +1 -1
  28. package/es/toolbar/toolbar-tip.es.js +106 -0
  29. package/es/toolbar/toolbar-tip.es.js.map +1 -0
  30. package/es/utils/debounce.es.js +2 -1
  31. package/es/utils/debounce.es.js.map +1 -1
  32. package/es/utils/is.es.js +10 -0
  33. package/es/utils/is.es.js.map +1 -0
  34. package/es/utils/method.es.js +0 -5
  35. package/es/utils/method.es.js.map +1 -1
  36. package/lib/config/editor.config.cjs.js +8 -2
  37. package/lib/config/editor.config.cjs.js.map +1 -1
  38. package/lib/config/i18n/en-us.cjs.js +47 -26
  39. package/lib/config/i18n/en-us.cjs.js.map +1 -1
  40. package/lib/config/i18n/zh-cn.cjs.js +47 -26
  41. package/lib/config/i18n/zh-cn.cjs.js.map +1 -1
  42. package/lib/config/index.cjs.js +3 -43
  43. package/lib/config/index.cjs.js.map +1 -1
  44. package/lib/counter/index.cjs.js +15 -10
  45. package/lib/counter/index.cjs.js.map +1 -1
  46. package/lib/custom-clipboard.cjs.js +3 -3
  47. package/lib/custom-clipboard.cjs.js.map +1 -1
  48. package/lib/fluent-editor.cjs.js +27 -2
  49. package/lib/fluent-editor.cjs.js.map +1 -1
  50. package/lib/fullscreen/handler.cjs.js +10 -0
  51. package/lib/fullscreen/handler.cjs.js.map +1 -1
  52. package/lib/index.cjs.js +2 -1
  53. package/lib/index.cjs.js.map +1 -1
  54. package/lib/link/modules/tooltip.cjs.js +22 -5
  55. package/lib/link/modules/tooltip.cjs.js.map +1 -1
  56. package/lib/table/modules/table-operation-menu.cjs.js +213 -203
  57. package/lib/table/modules/table-operation-menu.cjs.js.map +1 -1
  58. package/lib/table/modules/table-selection.cjs.js.map +1 -1
  59. package/lib/table/utils/node-matchers.cjs.js +1 -1
  60. package/lib/table/utils/node-matchers.cjs.js.map +1 -1
  61. package/lib/toolbar/index.cjs.js +2 -0
  62. package/lib/toolbar/index.cjs.js.map +1 -1
  63. package/lib/toolbar/toolbar-tip.cjs.js +106 -0
  64. package/lib/toolbar/toolbar-tip.cjs.js.map +1 -0
  65. package/lib/utils/debounce.cjs.js +2 -1
  66. package/lib/utils/debounce.cjs.js.map +1 -1
  67. package/lib/utils/is.cjs.js +10 -0
  68. package/lib/utils/is.cjs.js.map +1 -0
  69. package/lib/utils/method.cjs.js +0 -5
  70. package/lib/utils/method.cjs.js.map +1 -1
  71. package/package.json +4 -3
  72. package/style.css +15 -1
  73. package/types/config/editor.config.d.ts +214 -84
  74. package/types/config/i18n/en-us.d.ts +46 -26
  75. package/types/config/i18n/zh-cn.d.ts +46 -26
  76. package/types/config/index.d.ts +0 -41
  77. package/types/config/types/editor-config.interface.d.ts +2 -0
  78. package/types/counter/index.d.ts +9 -4
  79. package/types/custom-clipboard.d.ts +6 -3
  80. package/types/fluent-editor.d.ts +7 -1
  81. package/types/link/modules/tooltip.d.ts +1 -0
  82. package/types/table/modules/table-operation-menu.d.ts +6 -0
  83. package/types/toolbar/index.d.ts +1 -0
  84. package/types/toolbar/toolbar-tip.d.ts +9 -0
  85. package/types/utils/is.d.ts +2 -0
  86. package/types/utils/method.d.ts +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"table-selection.es.js","sources":["../../../../src/table/modules/table-selection.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { TableCell } from '../formats/table'\r\nimport { ERROR_LIMIT, LINE_POSITIONS, PRIMARY_COLOR } from '../table-config'\r\nimport { css, getRelativeRect } from '../utils'\r\n\r\nexport default class TableSelection {\r\n table: any\r\n quill: any\r\n modulesContainer: any\r\n parent: any\r\n boundary: any\r\n // @ts-ignore\r\n selectedTds: any[]\r\n // @ts-ignore\r\n dragging: boolean\r\n preSelectedTable: any\r\n oldRootScrollTop: any\r\n selectingHandler: any\r\n tdEditHandler: any\r\n tdResizeHandler: any\r\n endTd: any\r\n startTd: any\r\n editTd: any\r\n left: any\r\n bottom: any\r\n top: any\r\n right: any\r\n\r\n constructor(table, quill, dom) {\r\n if (!table) {\r\n return null\r\n }\r\n this.table = table\r\n this.quill = quill\r\n this.modulesContainer = dom\r\n this.parent = this.quill.root.parentNode\r\n this.boundary = {} // params for selected square\r\n this.selectedTds = [] // array for selected table-cells\r\n this.dragging = false\r\n this.preSelectedTable = null\r\n this.oldRootScrollTop = this.quill.root.scrollTop\r\n\r\n this.selectingHandler = this.mouseDownHandler.bind(this)\r\n\r\n this.tdEditHandler = this.setTdEditable.bind(this)\r\n this.tdResizeHandler = this.resizeTd.bind(this)\r\n\r\n this.helpLinesInitial()\r\n this.isEditorHasScrollBar()\r\n\r\n this.quill.root.parentNode.addEventListener('mousedown', this.selectingHandler, false)\r\n this.quill.on('text-change', this.tdResizeHandler)\r\n if (this.quill.root === this.quill.scrollingContainer) {\r\n this.quill.root.addEventListener('scroll', this.handleQuillRootScroll.bind(this))\r\n }\r\n }\r\n\r\n handleQuillRootScroll() {\r\n LINE_POSITIONS.forEach((direction) => {\r\n const selectionLine = this[direction]\r\n if (selectionLine) {\r\n selectionLine.style.marginTop = `${this.oldRootScrollTop - this.quill.root.scrollTop}px`\r\n }\r\n })\r\n }\r\n\r\n isEditorHasScrollBar() {\r\n if (this.quill.root.scrollHeight > this.quill.root.clientHeight) {\r\n css(this.modulesContainer, { width: 'calc(100% - 23px)' })\r\n }\r\n else {\r\n this.modulesContainer.removeAttribute('style')\r\n }\r\n }\r\n\r\n helpLinesInitial() {\r\n LINE_POSITIONS.forEach((direction) => {\r\n this[direction] = document.createElement('div')\r\n this[direction].classList.add('qlbt-selection-line')\r\n if (direction === 'left') {\r\n this[direction].classList.add('qlbt-selection-line-first')\r\n const ctrlPointLeft = document.createElement('div')\r\n this[direction].appendChild(ctrlPointLeft)\r\n }\r\n if (direction === 'bottom') {\r\n this[direction].classList.add('qlbt-selection-line-last')\r\n const ctrlPointRight = document.createElement('div')\r\n this[direction].appendChild(ctrlPointRight)\r\n }\r\n css(this[direction], {\r\n 'position': 'absolute',\r\n 'display': 'none',\r\n 'background-color': PRIMARY_COLOR,\r\n })\r\n this.modulesContainer.appendChild(this[direction])\r\n })\r\n }\r\n\r\n mouseDownHandler(e) {\r\n if (e.button !== 0) {\r\n return\r\n }\r\n const self: any = this\r\n const betterTableModule = this.quill.getModule('better-table')\r\n const tableColumnTool = betterTableModule.columnTool\r\n if (tableColumnTool.activeToolCell) {\r\n tableColumnTool.activeToolCell.classList.remove('qlbt-tool-cell-on')\r\n tableColumnTool.activeToolCell = null\r\n }\r\n if (e.target.closest('.quill-better-table')) {\r\n if (e.shiftKey) {\r\n this.endTd = e.target.closest('td[data-row]')\r\n this.drawSelection(this, true)\r\n // avoid select text in multiple table-cell\r\n if (this.startTd !== this.endTd) {\r\n this.quill.blur()\r\n }\r\n }\r\n else {\r\n this.startTd = e.target.closest('td[data-row]')\r\n this.drawSelection(this, false)\r\n this.dragging = true\r\n\r\n this.parent.addEventListener('mousemove', mouseMoveHandler, false)\r\n document.addEventListener('mouseup', mouseUpHandler, false)\r\n }\r\n }\r\n else if (e.target.closest('.qlbt-selection-line')) {\r\n this.parent.addEventListener('mousemove', mouseMoveHandler, false)\r\n document.addEventListener('mouseup', mouseUpHandler, false)\r\n }\r\n\r\n function mouseMoveHandler(event) {\r\n event.stopPropagation()\r\n\r\n if (event.button !== 0 || !event.target.closest('.quill-better-table')) {\r\n return\r\n }\r\n self.endTd = event.target.closest('td[data-row]')\r\n if (!self.endTd) {\r\n return\r\n }\r\n self.drawSelection(self, true)\r\n // avoid select text in multiple table-cell\r\n if (self.startTd !== self.endTd) {\r\n self.quill.blur()\r\n }\r\n }\r\n\r\n function mouseUpHandler() {\r\n self.parent.removeEventListener('mousemove', mouseMoveHandler, false)\r\n document.removeEventListener('mouseup', mouseUpHandler, false)\r\n self.dragging = false\r\n }\r\n }\r\n\r\n drawSelection(self, end) {\r\n // fix: 如果滚动条拖动,startTd的位置已经改变了,需要重置startTdRect\r\n self.startTdRect = getRelativeRect(self.startTd.getBoundingClientRect(), self.quill.root.parentNode)\r\n let endTdRect = self.startTdRect\r\n if (end) {\r\n self.endTdRect = getRelativeRect(self.endTd.getBoundingClientRect(), self.quill.root.parentNode)\r\n endTdRect = self.endTdRect\r\n }\r\n self.boundary = computeBoundaryFromRects(self.startTdRect, endTdRect)\r\n self.selectedTds = self.computeSelectedTds()\r\n self.repositionHelpLines()\r\n }\r\n\r\n setTdEditable(e) {\r\n if (!this.editTd) {\r\n return\r\n }\r\n this.parent.removeEventListener('keypress', this.tdEditHandler, false)\r\n const dom = this.editTd.domNode\r\n dom.removeEventListener('click', this.tdEditHandler, false)\r\n dom.classList.add('editing-select-able')\r\n dom.setAttribute('contenteditable', true)\r\n if (e.type === 'keypress') {\r\n if (dom.childNodes.length > 1 || dom.firstChild.innerHTML !== '<br>') {\r\n const blank = dom.firstChild.cloneNode()\r\n blank.innerHTML = '<br>'\r\n dom.innerHTML = ''\r\n dom.appendChild(blank)\r\n }\r\n dom.focus()\r\n }\r\n }\r\n\r\n resizeTd() {\r\n if (!this.editTd || (this.left && !this.left.offsetParent)) {\r\n return\r\n }\r\n if (this.selectedTds.length > 1) {\r\n this.refreshHelpLinesPosition()\r\n }\r\n else {\r\n const dom = this.editTd.domNode\r\n const domRect = getRelativeRect(dom.getBoundingClientRect(), this.quill.root.parentNode)\r\n this.boundary = computeBoundaryFromRects(domRect, domRect)\r\n this.repositionHelpLines()\r\n }\r\n\r\n // 判断编辑器是否有滚动条,调整遮罩宽度\r\n this.isEditorHasScrollBar()\r\n\r\n // 更新行高 更新滑块位置\r\n const betterTableModule = this.quill.getModule('better-table')\r\n const tableColumnTool = betterTableModule.columnTool\r\n if (tableColumnTool) {\r\n tableColumnTool.updateRowToolCells()\r\n const tableViewRect = this.table.parentNode.getBoundingClientRect()\r\n if (tableColumnTool.leftMask) {\r\n css(tableColumnTool.leftMask, { height: `${tableViewRect.height + 50}px` })\r\n }\r\n }\r\n\r\n const tableScrollBar = betterTableModule.tableScrollBar\r\n tableScrollBar.resetTableHeight(this.table)\r\n }\r\n\r\n resetTd(e) {\r\n const dom = e.target\r\n dom.classList.remove('editing-select-able')\r\n dom.setAttribute('contenteditable', false)\r\n dom.removeAttribute('contenteditable')\r\n }\r\n\r\n correctBoundary() {\r\n const tableContainer = Quill.find(this.table)\r\n const tableCells = tableContainer.descendants(TableCell)\r\n\r\n tableCells.forEach((tableCell) => {\r\n const { x, y, width, height } = getRelativeRect(tableCell.domNode.getBoundingClientRect(), this.quill.root.parentNode)\r\n const isCellIntersected\r\n = ((x + ERROR_LIMIT >= this.boundary.x && x + ERROR_LIMIT <= this.boundary.x1)\r\n || (x - ERROR_LIMIT + width >= this.boundary.x && x - ERROR_LIMIT + width <= this.boundary.x1))\r\n && ((y + ERROR_LIMIT >= this.boundary.y && y + ERROR_LIMIT <= this.boundary.y1)\r\n || (y - ERROR_LIMIT + height >= this.boundary.y && y - ERROR_LIMIT + height <= this.boundary.y1))\r\n if (isCellIntersected) {\r\n this.boundary = computeBoundaryFromRects(this.boundary, { x, y, width, height })\r\n }\r\n })\r\n }\r\n\r\n computeSelectedTds() {\r\n const tableContainer = Quill.find(this.table)\r\n const tableCells = tableContainer.descendants(TableCell)\r\n\r\n const result = tableCells.reduce((selectedCells, tableCell) => {\r\n const { x, y, width, height } = getRelativeRect(tableCell.domNode.getBoundingClientRect(), this.quill.root.parentNode)\r\n const isCellIncluded\r\n = x + ERROR_LIMIT >= this.boundary.x\r\n && x - ERROR_LIMIT + width <= this.boundary.x1\r\n && y + ERROR_LIMIT >= this.boundary.y\r\n && y - ERROR_LIMIT + height <= this.boundary.y1\r\n\r\n if (isCellIncluded) {\r\n selectedCells.push(tableCell)\r\n }\r\n\r\n return selectedCells\r\n }, [])\r\n\r\n if (result.length === 1 && this.editTd !== result[0]) {\r\n const resetTds = this.table.querySelectorAll('td[contenteditable=true]')\r\n resetTds.forEach(td => this.resetTd({ target: td }))\r\n this.editTd = result[0]\r\n this.editTd.domNode.addEventListener('mousedown', this.tdEditHandler, false)\r\n this.parent.addEventListener('keypress', this.tdEditHandler, false)\r\n }\r\n\r\n return result\r\n }\r\n\r\n repositionHelpLines() {\r\n this.oldRootScrollTop = this.quill.root.scrollTop\r\n if (!this.left) {\r\n return\r\n }\r\n\r\n css(this.left, {\r\n 'display': 'block',\r\n 'left': `${this.boundary.x - 1}px`,\r\n 'top': `${this.boundary.y}px`,\r\n 'height': `${this.boundary.height + 1}px`,\r\n 'width': '1px',\r\n 'margin-top': '0px',\r\n })\r\n\r\n css(this.right, {\r\n 'display': 'block',\r\n 'left': `${this.boundary.x1}px`,\r\n 'top': `${this.boundary.y - 1}px`,\r\n 'height': `${this.boundary.height + 1}px`,\r\n 'width': '1px',\r\n 'margin-top': '0px',\r\n })\r\n\r\n css(this.top, {\r\n 'display': 'block',\r\n 'left': `${this.boundary.x - 1}px`,\r\n 'top': `${this.boundary.y - 1}px`,\r\n 'width': `${this.boundary.width + 1}px`,\r\n 'height': '1px',\r\n 'margin-top': '0px',\r\n })\r\n\r\n css(this.bottom, {\r\n 'display': 'block',\r\n 'left': `${this.boundary.x - 1}px`,\r\n 'top': `${this.boundary.y1}px`,\r\n 'width': `${this.boundary.width + 1}px`,\r\n 'height': '1px',\r\n 'margin-top': '0px',\r\n })\r\n }\r\n\r\n // based on selectedTds compute positions of help lines\r\n // It is useful when selectedTds are not changed\r\n refreshHelpLinesPosition() {\r\n const startRect = getRelativeRect(this.selectedTds[0].domNode.getBoundingClientRect(), this.quill.root.parentNode)\r\n const endRect = getRelativeRect(\r\n this.selectedTds[this.selectedTds.length - 1].domNode.getBoundingClientRect(),\r\n this.quill.root.parentNode,\r\n )\r\n this.boundary = computeBoundaryFromRects(startRect, endRect)\r\n this.repositionHelpLines()\r\n }\r\n\r\n destroy() {\r\n const resetTds = this.table.querySelectorAll('td[contenteditable=true]')\r\n resetTds.forEach(td => this.resetTd({ target: td }))\r\n\r\n LINE_POSITIONS.forEach((direction) => {\r\n if (this[direction]) {\r\n this[direction].remove()\r\n this[direction] = null\r\n }\r\n })\r\n\r\n this.quill.root.parentNode.removeEventListener('mousedown', this.selectingHandler, false)\r\n\r\n delete this.editTd\r\n\r\n return null\r\n }\r\n\r\n setSelection(startRect, endRect) {\r\n this.boundary = computeBoundaryFromRects(\r\n getRelativeRect(startRect, this.quill.root.parentNode),\r\n getRelativeRect(endRect, this.quill.root.parentNode),\r\n )\r\n this.correctBoundary()\r\n this.selectedTds = this.computeSelectedTds()\r\n this.repositionHelpLines()\r\n }\r\n\r\n clearSelection() {\r\n const resetTds = this.table.querySelectorAll('td[contenteditable=true]')\r\n resetTds.forEach(td => this.resetTd({ target: td }))\r\n this.boundary = {}\r\n this.selectedTds = []\r\n LINE_POSITIONS.forEach((direction) => {\r\n if (this[direction]) {\r\n css(this[direction], {\r\n display: 'none',\r\n })\r\n }\r\n })\r\n }\r\n}\r\n\r\nfunction computeBoundaryFromRects(startRect, endRect) {\r\n const x = Math.min(startRect.x, endRect.x, startRect.x + startRect.width - 1, endRect.x + endRect.width - 1)\r\n\r\n const x1 = Math.max(startRect.x, endRect.x, startRect.x + startRect.width - 1, endRect.x + endRect.width - 1)\r\n\r\n const y = Math.min(startRect.y, endRect.y, startRect.y + startRect.height - 1, endRect.y + endRect.height - 1)\r\n\r\n const y1 = Math.max(startRect.y, endRect.y, startRect.y + startRect.height - 1, endRect.y + endRect.height - 1)\r\n\r\n const width = x1 - x\r\n const height = y1 - y\r\n\r\n return { x, x1, y, y1, width, height }\r\n}\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"table-selection.es.js","sources":["../../../../src/table/modules/table-selection.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { TableCell } from '../formats/table'\r\nimport { ERROR_LIMIT, LINE_POSITIONS, PRIMARY_COLOR } from '../table-config'\r\nimport { css, getRelativeRect } from '../utils'\r\n\r\nexport default class TableSelection {\r\n table: any\r\n quill: any\r\n modulesContainer: any\r\n parent: any\r\n boundary: any\r\n // @ts-ignore\r\n selectedTds: any[]\r\n // @ts-ignore\r\n dragging: boolean\r\n preSelectedTable: any\r\n oldRootScrollTop: any\r\n selectingHandler: any\r\n tdEditHandler: any\r\n tdResizeHandler: any\r\n endTd: any\r\n startTd: any\r\n editTd: any\r\n left: any\r\n bottom: any\r\n top: any\r\n right: any\r\n\r\n constructor(table, quill, dom) {\r\n if (!table) {\r\n return null\r\n }\r\n this.table = table\r\n this.quill = quill\r\n this.modulesContainer = dom\r\n this.parent = this.quill.root.parentNode\r\n this.boundary = {} // params for selected square\r\n this.selectedTds = [] // array for selected table-cells\r\n this.dragging = false\r\n this.preSelectedTable = null\r\n this.oldRootScrollTop = this.quill.root.scrollTop\r\n\r\n this.selectingHandler = this.mouseDownHandler.bind(this)\r\n\r\n this.tdEditHandler = this.setTdEditable.bind(this)\r\n this.tdResizeHandler = this.resizeTd.bind(this)\r\n\r\n this.helpLinesInitial()\r\n this.isEditorHasScrollBar()\r\n\r\n this.quill.root.parentNode.addEventListener('mousedown', this.selectingHandler, false)\r\n this.quill.on('text-change', this.tdResizeHandler)\r\n if (this.quill.root === this.quill.scrollingContainer) {\r\n this.quill.root.addEventListener('scroll', this.handleQuillRootScroll.bind(this))\r\n }\r\n }\r\n\r\n handleQuillRootScroll() {\r\n LINE_POSITIONS.forEach((direction) => {\r\n const selectionLine = this[direction]\r\n if (selectionLine) {\r\n selectionLine.style.marginTop = `${this.oldRootScrollTop - this.quill.root.scrollTop}px`\r\n }\r\n })\r\n }\r\n\r\n isEditorHasScrollBar() {\r\n if (this.quill.root.scrollHeight > this.quill.root.clientHeight) {\r\n css(this.modulesContainer, { width: 'calc(100% - 23px)' })\r\n }\r\n else {\r\n this.modulesContainer.removeAttribute('style')\r\n }\r\n }\r\n\r\n helpLinesInitial() {\r\n LINE_POSITIONS.forEach((direction) => {\r\n this[direction] = document.createElement('div')\r\n this[direction].classList.add('qlbt-selection-line')\r\n if (direction === 'left') {\r\n this[direction].classList.add('qlbt-selection-line-first')\r\n const ctrlPointLeft = document.createElement('div')\r\n this[direction].appendChild(ctrlPointLeft)\r\n }\r\n if (direction === 'bottom') {\r\n this[direction].classList.add('qlbt-selection-line-last')\r\n const ctrlPointRight = document.createElement('div')\r\n this[direction].appendChild(ctrlPointRight)\r\n }\r\n css(this[direction], {\r\n 'position': 'absolute',\r\n 'display': 'none',\r\n 'background-color': PRIMARY_COLOR,\r\n })\r\n this.modulesContainer.appendChild(this[direction])\r\n })\r\n }\r\n\r\n mouseDownHandler(e) {\r\n if (e.button !== 0) {\r\n return\r\n }\r\n const self: any = this\r\n const betterTableModule = this.quill.getModule('better-table')\r\n const tableColumnTool = betterTableModule.columnTool\r\n if (tableColumnTool.activeToolCell) {\r\n tableColumnTool.activeToolCell.classList.remove('qlbt-tool-cell-on')\r\n tableColumnTool.activeToolCell = null\r\n }\r\n if (e.target.closest('.quill-better-table')) {\r\n if (e.shiftKey) {\r\n this.endTd = e.target.closest('td[data-row]')\r\n this.drawSelection(this, true)\r\n // avoid select text in multiple table-cell\r\n if (this.startTd !== this.endTd) {\r\n this.quill.blur()\r\n }\r\n }\r\n else {\r\n this.startTd = e.target.closest('td[data-row]')\r\n this.drawSelection(this, false)\r\n this.dragging = true\r\n\r\n this.parent.addEventListener('mousemove', mouseMoveHandler, false)\r\n document.addEventListener('mouseup', mouseUpHandler, false)\r\n }\r\n }\r\n else if (e.target.closest('.qlbt-selection-line')) {\r\n this.parent.addEventListener('mousemove', mouseMoveHandler, false)\r\n document.addEventListener('mouseup', mouseUpHandler, false)\r\n }\r\n\r\n function mouseMoveHandler(event) {\r\n event.stopPropagation()\r\n\r\n if (event.button !== 0 || !event.target.closest('.quill-better-table')) {\r\n return\r\n }\r\n self.endTd = event.target.closest('td[data-row]')\r\n if (!self.endTd) {\r\n return\r\n }\r\n self.drawSelection(self, true)\r\n // avoid select text in multiple table-cell\r\n if (self.startTd !== self.endTd) {\r\n self.quill.blur()\r\n }\r\n }\r\n\r\n function mouseUpHandler() {\r\n self.parent.removeEventListener('mousemove', mouseMoveHandler, false)\r\n document.removeEventListener('mouseup', mouseUpHandler, false)\r\n self.dragging = false\r\n }\r\n }\r\n\r\n drawSelection(self, end) {\r\n // fix: 如果滚动条拖动,startTd的位置已经改变了,需要重置startTdRect\r\n self.startTdRect = getRelativeRect(self.startTd.getBoundingClientRect(), self.quill.root.parentNode)\r\n let endTdRect = self.startTdRect\r\n if (end) {\r\n self.endTdRect = getRelativeRect(self.endTd.getBoundingClientRect(), self.quill.root.parentNode)\r\n endTdRect = self.endTdRect\r\n }\r\n self.boundary = computeBoundaryFromRects(self.startTdRect, endTdRect)\r\n self.selectedTds = self.computeSelectedTds()\r\n self.repositionHelpLines()\r\n }\r\n\r\n setTdEditable(e) {\r\n if (!this.editTd) {\r\n return\r\n }\r\n this.parent.removeEventListener('keypress', this.tdEditHandler, false)\r\n const dom = this.editTd.domNode\r\n dom.removeEventListener('click', this.tdEditHandler, false)\r\n dom.classList.add('editing-select-able')\r\n dom.setAttribute('contenteditable', true)\r\n if (e.type === 'keypress') {\r\n if (dom.childNodes.length > 1 || dom.firstChild.innerHTML !== '<br>') {\r\n const blank = dom.firstChild.cloneNode()\r\n blank.innerHTML = '<br>'\r\n dom.innerHTML = ''\r\n dom.appendChild(blank)\r\n }\r\n dom.focus()\r\n }\r\n }\r\n\r\n resizeTd() {\r\n if (!this.editTd || (this.left && !this.left.offsetParent)) {\r\n return\r\n }\r\n if (this.selectedTds.length > 1) {\r\n this.refreshHelpLinesPosition()\r\n }\r\n else {\r\n const dom = this.editTd.domNode\r\n const domRect = getRelativeRect(dom.getBoundingClientRect(), this.quill.root.parentNode)\r\n this.boundary = computeBoundaryFromRects(domRect, domRect)\r\n this.repositionHelpLines()\r\n }\r\n\r\n // 判断编辑器是否有滚动条,调整遮罩宽度\r\n this.isEditorHasScrollBar()\r\n\r\n // 更新行高 更新滑块位置\r\n const betterTableModule = this.quill.getModule('better-table')\r\n const tableColumnTool = betterTableModule.columnTool\r\n if (tableColumnTool) {\r\n tableColumnTool.updateRowToolCells()\r\n const tableViewRect = this.table.parentNode.getBoundingClientRect()\r\n if (tableColumnTool.leftMask) {\r\n css(tableColumnTool.leftMask, { height: `${tableViewRect.height + 50}px` })\r\n }\r\n }\r\n\r\n const tableScrollBar = betterTableModule.tableScrollBar\r\n tableScrollBar.resetTableHeight(this.table)\r\n }\r\n\r\n resetTd(e) {\r\n const dom = e.target\r\n dom.classList.remove('editing-select-able')\r\n dom.setAttribute('contenteditable', false)\r\n dom.removeAttribute('contenteditable')\r\n }\r\n\r\n correctBoundary() {\r\n const tableContainer = Quill.find(this.table)\r\n const tableCells = tableContainer.descendants(TableCell)\r\n\r\n tableCells.forEach((tableCell) => {\r\n const { x, y, width, height } = getRelativeRect(tableCell.domNode.getBoundingClientRect(), this.quill.root.parentNode)\r\n const isCellIntersected\r\n = ((x + ERROR_LIMIT >= this.boundary.x && x + ERROR_LIMIT <= this.boundary.x1)\r\n || (x - ERROR_LIMIT + width >= this.boundary.x && x - ERROR_LIMIT + width <= this.boundary.x1))\r\n && ((y + ERROR_LIMIT >= this.boundary.y && y + ERROR_LIMIT <= this.boundary.y1)\r\n || (y - ERROR_LIMIT + height >= this.boundary.y && y - ERROR_LIMIT + height <= this.boundary.y1))\r\n if (isCellIntersected) {\r\n this.boundary = computeBoundaryFromRects(this.boundary, { x, y, width, height })\r\n }\r\n })\r\n }\r\n\r\n computeSelectedTds() {\r\n const tableContainer = Quill.find(this.table)\r\n const tableCells = tableContainer.descendants(TableCell)\r\n\r\n const result = tableCells.reduce((selectedCells, tableCell) => {\r\n const { x, y, width, height } = getRelativeRect(tableCell.domNode.getBoundingClientRect(), this.quill.root.parentNode)\r\n const isCellIncluded\r\n = x + ERROR_LIMIT >= this.boundary.x\r\n && x - ERROR_LIMIT + width <= this.boundary.x1\r\n && y + ERROR_LIMIT >= this.boundary.y\r\n && y - ERROR_LIMIT + height <= this.boundary.y1\r\n\r\n if (isCellIncluded) {\r\n selectedCells.push(tableCell)\r\n }\r\n\r\n return selectedCells\r\n }, [])\r\n\r\n if (result.length === 1 && this.editTd !== result[0]) {\r\n const resetTds = this.table.querySelectorAll('td[contenteditable=true]')\r\n resetTds.forEach(td => this.resetTd({ target: td }))\r\n this.editTd = result[0]\r\n this.editTd.domNode.addEventListener('mousedown', this.tdEditHandler, false)\r\n this.parent.addEventListener('keypress', this.tdEditHandler, false)\r\n }\r\n\r\n return result\r\n }\r\n\r\n repositionHelpLines() {\r\n this.oldRootScrollTop = this.quill.root.scrollTop\r\n if (!this.left) {\r\n return\r\n }\r\n\r\n css(this.left, {\r\n 'display': 'block',\r\n 'left': `${this.boundary.x - 1}px`,\r\n 'top': `${this.boundary.y}px`,\r\n 'height': `${this.boundary.height + 1}px`,\r\n 'width': '1px',\r\n 'margin-top': '0px',\r\n })\r\n\r\n css(this.right, {\r\n 'display': 'block',\r\n 'left': `${this.boundary.x1}px`,\r\n 'top': `${this.boundary.y - 1}px`,\r\n 'height': `${this.boundary.height + 1}px`,\r\n 'width': '1px',\r\n 'margin-top': '0px',\r\n })\r\n\r\n css(this.top, {\r\n 'display': 'block',\r\n 'left': `${this.boundary.x - 1}px`,\r\n 'top': `${this.boundary.y - 1}px`,\r\n 'width': `${this.boundary.width + 1}px`,\r\n 'height': '1px',\r\n 'margin-top': '0px',\r\n })\r\n\r\n css(this.bottom, {\r\n 'display': 'block',\r\n 'left': `${this.boundary.x - 1}px`,\r\n 'top': `${this.boundary.y1}px`,\r\n 'width': `${this.boundary.width + 1}px`,\r\n 'height': '1px',\r\n 'margin-top': '0px',\r\n })\r\n }\r\n\r\n // based on selectedTds compute positions of help lines\r\n // It is useful when selectedTds are not changed\r\n refreshHelpLinesPosition() {\r\n const startRect = getRelativeRect(this.selectedTds[0].domNode.getBoundingClientRect(), this.quill.root.parentNode)\r\n const endRect = getRelativeRect(\r\n this.selectedTds[this.selectedTds.length - 1].domNode.getBoundingClientRect(),\r\n this.quill.root.parentNode,\r\n )\r\n this.boundary = computeBoundaryFromRects(startRect, endRect)\r\n this.repositionHelpLines()\r\n }\r\n\r\n destroy() {\r\n const resetTds = this.table.querySelectorAll('td[contenteditable=true]')\r\n resetTds.forEach(td => this.resetTd({ target: td }))\r\n\r\n LINE_POSITIONS.forEach((direction) => {\r\n if (this[direction]) {\r\n this[direction].remove()\r\n this[direction] = null\r\n }\r\n })\r\n\r\n this.quill.root.parentNode.removeEventListener('mousedown', this.selectingHandler, false)\r\n\r\n delete this.editTd\r\n\r\n return null\r\n }\r\n\r\n setSelection(startRect, endRect) {\r\n this.boundary = computeBoundaryFromRects(\r\n getRelativeRect(startRect, this.quill.root.parentNode),\r\n getRelativeRect(endRect, this.quill.root.parentNode),\r\n )\r\n this.correctBoundary()\r\n this.selectedTds = this.computeSelectedTds()\r\n this.repositionHelpLines()\r\n }\r\n\r\n clearSelection() {\r\n const resetTds = this.table.querySelectorAll('td[contenteditable=true]')\r\n resetTds.forEach(td => this.resetTd({ target: td }))\r\n this.boundary = {}\r\n this.selectedTds = []\r\n LINE_POSITIONS.forEach((direction) => {\r\n if (this[direction]) {\r\n css(this[direction], {\r\n display: 'none',\r\n })\r\n }\r\n })\r\n }\r\n}\r\n\r\nfunction computeBoundaryFromRects(startRect, endRect) {\r\n const x = Math.min(startRect.x, endRect.x, startRect.x + startRect.width - 1, endRect.x + endRect.width - 1)\r\n\r\n const x1 = Math.max(startRect.x, endRect.x, startRect.x + startRect.width - 1, endRect.x + endRect.width - 1)\r\n\r\n const y = Math.min(startRect.y, endRect.y, startRect.y + startRect.height - 1, endRect.y + endRect.height - 1)\r\n\r\n const y1 = Math.max(startRect.y, endRect.y, startRect.y + startRect.height - 1, endRect.y + endRect.height - 1)\r\n\r\n const width = x1 - x\r\n const height = y1 - y\r\n\r\n return { x, x1, y, y1, width, height }\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -220,7 +220,7 @@ function matchHeader(node, delta) {
220
220
  delta.forEach((op) => {
221
221
  newDelta.insert(
222
222
  op.insert,
223
- Object.assign(op.attributes, {
223
+ Object.assign({}, op.attributes, {
224
224
  size: fontSize
225
225
  })
226
226
  );
@@ -1 +1 @@
1
- {"version":3,"file":"node-matchers.es.js","sources":["../../../../src/table/utils/node-matchers.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { omit, splitWithBreak } from '../../config/editor.utils'\r\nimport { cellId as tableCellId, rowId as tableRowId, TableViewWrapper } from '../formats/table'\r\nimport { CELL_MIN_WIDTH } from '../table-config'\r\n\r\nconst Delta = Quill.imports.delta\r\nconst InlineBlot = Quill.imports.parchment.InlineBlot\r\n\r\n// rebuild delta\r\nexport function matchTableCell(node, delta) {\r\n // fix: 移除旧数据中的pt高度,避免由于高度平均分导致无法插入行\r\n if (node.style.height.indexOf('pt')) {\r\n node.removeAttribute('style')\r\n }\r\n\r\n const row = node.parentNode\r\n let rowId = row.dataset.row\r\n if (!rowId) {\r\n rowId = row.dataset.row = tableRowId()\r\n }\r\n let cellId = node.dataset.cell\r\n // fix: dataset.cell in td will be 'undefined' when insert row/column\r\n if (!cellId || cellId === 'undefined') {\r\n cellId = tableCellId()\r\n }\r\n const colspan = node.getAttribute('colspan') || 1\r\n const rowspan = node.getAttribute('rowspan') || 1\r\n\r\n // fix: empty table cells copied from other place will be removed unexpectedly\r\n if (delta.length() === 0) {\r\n delta = new Delta().insert('\\n', {\r\n 'table-cell-line': { row: rowId, cell: cellId, rowspan, colspan },\r\n })\r\n return delta\r\n }\r\n\r\n delta = delta.reduce((newDelta, op) => {\r\n if (op.insert && typeof op.insert === 'string') {\r\n const lines = splitWithBreak(op.insert)\r\n\r\n lines.forEach((text) => {\r\n if (text === '\\n') {\r\n let attributes = {}\r\n const cellAttributes = {\r\n row: rowId,\r\n cell: cellId,\r\n rowspan,\r\n colspan,\r\n }\r\n if (op.attributes.table) {\r\n delete op.attributes.table\r\n }\r\n switch (true) {\r\n case !!op.attributes.header:\r\n attributes = Object.assign(op.attributes.header, cellAttributes)\r\n break\r\n case !!op.attributes.list:\r\n attributes = { list: Object.assign(op.attributes.list, cellAttributes) }\r\n break\r\n default:\r\n attributes = { 'table-cell-line': cellAttributes }\r\n }\r\n // fix: when td has background-color, quill can't set it to table-cell bolt\r\n if (op.attributes.background && attributes['table-cell-line']) {\r\n attributes['table-cell-line'].tdBgColor = op.attributes.background\r\n }\r\n newDelta.insert('\\n', Object.assign(op.attributes, attributes))\r\n }\r\n else {\r\n newDelta.insert(text, omit(op.attributes, ['table', 'table-cell-line', 'header', 'list']))\r\n }\r\n })\r\n }\r\n else {\r\n newDelta.insert(op.insert, op.attributes)\r\n }\r\n\r\n return newDelta\r\n }, new Delta())\r\n\r\n // fix: table cell height becomes larger(because insert unnecessary <div> on both sides of cell) when init table ngModel\r\n const regexp = /^[\\n]+$/\r\n const firstDelta = delta.ops[0]\r\n if (delta.ops.length >= 3) {\r\n const lastDelta = delta.ops[delta.ops.length - 1]\r\n if (regexp.test(firstDelta.insert) && firstDelta.attributes['table-cell-line']) {\r\n delta.ops.splice(0, 1)\r\n }\r\n if (regexp.test(lastDelta.insert) && lastDelta.attributes['table-cell-line']) {\r\n delta.ops[delta.ops.length - 1].insert = '\\n'\r\n }\r\n }\r\n else if (delta.ops.length === 1 && regexp.test(firstDelta.insert) && firstDelta.attributes['table-cell-line']) {\r\n delta.ops[0].insert = '\\n'\r\n }\r\n\r\n return delta\r\n}\r\n\r\n// replace th tag with td tag\r\nexport function matchTableHeader(node, delta, _scroll) {\r\n const row = node.parentNode\r\n const cells = Array.from(row.querySelectorAll('th'))\r\n let rowId = row.dataset.row\r\n if (!rowId) {\r\n rowId = row.dataset.row = tableRowId()\r\n }\r\n const cellId = cells.indexOf(node) + 1\r\n const colspan = node.getAttribute('colspan') || false\r\n const rowspan = node.getAttribute('rowspan') || false\r\n\r\n // fix: empty table cells copied from other place will be removed unexpectedly\r\n if (delta.length() === 0) {\r\n delta = new Delta().insert('\\n', {\r\n 'table-cell-line': { row: rowId, cell: cellId, rowspan, colspan },\r\n })\r\n return delta\r\n }\r\n\r\n delta = delta.reduce((newDelta, op) => {\r\n if (op.insert && typeof op.insert === 'string') {\r\n const lines = splitWithBreak(op.insert)\r\n\r\n // fix: no '\\n' in the end of op.insert, push a '\\n' to lines\r\n if (lines[lines.length - 1] !== '\\n') {\r\n lines.push('\\n')\r\n }\r\n\r\n lines.forEach((text) => {\r\n text === '\\n'\r\n ? newDelta.insert('\\n', { 'table-cell-line': { row: rowId, cell: cellId, rowspan, colspan } })\r\n : newDelta.insert(text, op.attributes)\r\n })\r\n }\r\n else {\r\n newDelta.insert(op.insert, op.attributes)\r\n }\r\n\r\n return newDelta\r\n }, new Delta())\r\n\r\n delta = delta.reduce((newDelta, op) => {\r\n if (op.insert && typeof op.insert === 'string' && op.insert.startsWith('\\n')) {\r\n newDelta.insert(op.insert, { 'table-cell-line': { row: rowId, cell: cellId, rowspan, colspan } })\r\n }\r\n else {\r\n newDelta.insert(op.insert, { ...omit(op.attributes, ['table', 'table-cell-line']) })\r\n }\r\n\r\n return newDelta\r\n }, new Delta())\r\n\r\n return delta\r\n}\r\n\r\n// supplement colgroup and col\r\nexport function matchTable(node, delta, scroll) {\r\n const isWordTable = node.children.length === 1\r\n if (!(node instanceof Element)) {\r\n return\r\n }\r\n const getMaxColNumber = (tds) => {\r\n if (isWordTable) {\r\n return tds.length\r\n }\r\n let colsNumber = 0\r\n tds.forEach((td) => {\r\n colsNumber += td.colSpan\r\n })\r\n return Math.max(tds.length, colsNumber)\r\n }\r\n\r\n const checkMinWidth = (width) => {\r\n if (Number.isNaN(width)) {\r\n // 无指定值时默认为auto,待渲染后修正\r\n return { 'table-col': { width: 'auto' } }\r\n }\r\n else if (width < CELL_MIN_WIDTH) {\r\n // 当列宽度小于默认宽度时取默认宽度\r\n return { 'table-col': true }\r\n }\r\n else {\r\n // 大于默认值取实际指定值\r\n return { 'table-col': { width } }\r\n }\r\n }\r\n\r\n // fix: a table with an empty tr is invalid, should not be displayed\r\n const rows = node.querySelectorAll('tr')\r\n const topRow = rows[0]\r\n const onlyEmptyTr = rows.length === 1 && !topRow.querySelector('td')\r\n\r\n // fix: empty table will return empty delta\r\n if (!topRow || onlyEmptyTr) {\r\n return new Delta().insert('\\n')\r\n }\r\n\r\n const colsNumber = node.querySelectorAll('col').length\r\n let maxCellsNumber = 0\r\n let maxCells\r\n // 遍历行获取最大列数和该行的所有单元格\r\n Array.prototype.slice.call(rows).forEach((row) => {\r\n const tds = row.querySelectorAll('td')\r\n maxCellsNumber = Math.max(getMaxColNumber(tds), maxCellsNumber)\r\n maxCells = tds\r\n })\r\n\r\n // 列的累计器\r\n let colCount = 0\r\n delta = delta.reduce((newDelta, op) => {\r\n // 当colCount与colsNumber相等时,则补充相差列\r\n if (colCount === colsNumber) {\r\n const fillNumber = maxCellsNumber - colCount\r\n const outset = colCount\r\n // index为差值列索引,通过遍历差值得到mexCells行中对应索引的单元格宽度\r\n for (let i = 0; i < fillNumber; i++) {\r\n const index = outset + i\r\n const colWidth = Number.parseInt(\r\n index < maxCells.length\r\n ? maxCells[index].width\r\n // maxCells[index].style && maxCells[index].style.width ? maxCells[index].style.width :\r\n : maxCells[maxCells.length - 1].width,\r\n 10,\r\n )\r\n newDelta.insert('\\n', checkMinWidth(colWidth))\r\n colCount++\r\n }\r\n }\r\n const attr = op.attributes || {}\r\n switch (true) {\r\n case !!attr['table-col']:\r\n // 只有当前列数小于实际总列数才操作,所以不存在大于的情况\r\n if (colCount < maxCellsNumber) {\r\n // 当table-col宽度一致时会合并为单一insert,insert长度大于1,截取符合实际总列数的长度来插入\r\n const insert = op.insert.slice(0, maxCellsNumber)\r\n const colWidth = Number.parseInt(attr['table-col'].width, 10)\r\n newDelta.insert(insert, checkMinWidth(colWidth))\r\n colCount += insert.length\r\n }\r\n break\r\n case !!attr.notFilled:\r\n { // 将标记的空tr填充对应列数的单元格\r\n const rowId = tableRowId()\r\n for (let x = 0; x < maxCellsNumber; x++) {\r\n newDelta.insert('\\n', { 'table-cell-line': { row: rowId, cell: tableCellId(), rowspan: 1, colspan: 1 } })\r\n }\r\n break }\r\n default:\r\n newDelta.insert(op.insert, op.attributes)\r\n }\r\n return newDelta\r\n }, new Delta())\r\n\r\n const tableItem = node.closest('.quill-better-table-wrapper') || node\r\n const prevBlot = tableItem.previousElementSibling && scroll.query(tableItem.previousElementSibling)\r\n const nextBlot = tableItem.nextElementSibling && scroll.query(tableItem.nextElementSibling)\r\n // fix: prevent two adjacent tables from sticking together\r\n if (!nextBlot || nextBlot.prototype instanceof InlineBlot) {\r\n delta = delta.insert('\\n')\r\n }\r\n // fix: When there is no line break in front of the table, pressing the Enter key will cause a problem with the table.\r\n if (!prevBlot || prevBlot.prototype instanceof InlineBlot) {\r\n const newLine = new Delta().insert('\\n')\r\n delta = newLine.concat(delta)\r\n }\r\n if (nextBlot === TableViewWrapper) {\r\n delta = delta.insert('\\n')\r\n }\r\n\r\n return delta\r\n}\r\n\r\nexport function matchTableRow(_node, delta) {\r\n // fix: 处理空<tr>标签被忽略的情况\r\n if (delta.ops.length === 1 && !delta.ops[0].attributes) {\r\n delta = new Delta().insert('\\n', { notFilled: true })\r\n }\r\n return delta\r\n}\r\n\r\n// match h tags, distinguish between headers in the table and headers outside the table\r\nexport function matchHeader(node, delta) {\r\n const newDelta = new Delta()\r\n const fontSize = node.style.fontSize\r\n delta.forEach((op) => {\r\n newDelta.insert(\r\n op.insert,\r\n Object.assign(op.attributes, {\r\n size: fontSize,\r\n }),\r\n )\r\n })\r\n return newDelta\r\n}\r\n\r\nexport function matchList(node, delta) {\r\n const value = node.tagName === 'UL' ? 'bullet' : 'ordered'\r\n delta.forEach((op) => {\r\n if (typeof op.attributes.list === 'string') {\r\n delete op.attributes.list\r\n }\r\n else if (typeof op.attributes.list === 'object' && !op.attributes.list.value) {\r\n op.attributes.list.value = value\r\n }\r\n })\r\n return delta\r\n}\r\n\r\nexport function matchInline(node, delta, scroll) {\r\n const quill = Quill.find(scroll.domNode.parentNode)\r\n const currentRange = quill.getSelection()\r\n const formats = currentRange && quill.getFormat(currentRange)\r\n if (\r\n formats\r\n && formats['table-cell-line'] // 当前光标节点在表格内,否则不操作delta\r\n && node.nextElementSibling\r\n ) {\r\n // 插入节点是否存在下一个兄弟元素\r\n const match = scroll.query(node)\r\n const nodeHtml = node.nextElementSibling.innerHTML\r\n const nodeText = node.nextElementSibling.textContent\r\n if (\r\n (match && match.prototype instanceof InlineBlot) // 判断当前节点是否为内联\r\n || (node.tagName === 'P' && nodeHtml !== nodeText)\r\n ) {\r\n // 非内联时如果为P且下一个不为text节点\r\n delta.forEach((op) => {\r\n op.insert += '\\n'\r\n })\r\n }\r\n }\r\n return delta\r\n}\r\n\r\n// 匹配 word 自带的 v:shape 标签中的图片 v:imageData\r\nexport function matchWordShapeImage(node, delta) {\r\n if (node) {\r\n const imageUrl = node.attributes.src?.nodeValue\r\n delta = new Delta().insert({ image: imageUrl })\r\n }\r\n return delta\r\n}\r\n\r\nexport function matchMentionLink(node, delta, scroll) {\r\n const name = node.dataset.mentionId\r\n if (name) {\r\n const quill = Quill.find(scroll.domNode.parentNode)\r\n const mention = quill.getModule('mention')\r\n if (mention) {\r\n mention.options.search(name).then((res) => {\r\n const [item] = res\r\n if (item) {\r\n mention.options.select(item)\r\n }\r\n })\r\n }\r\n }\r\n return delta\r\n}\r\n"],"names":["rowId","tableRowId","cellId","tableCellId","colsNumber"],"mappings":"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"}
1
+ {"version":3,"file":"node-matchers.es.js","sources":["../../../../src/table/utils/node-matchers.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { omit, splitWithBreak } from '../../config/editor.utils'\r\nimport { cellId as tableCellId, rowId as tableRowId, TableViewWrapper } from '../formats/table'\r\nimport { CELL_MIN_WIDTH } from '../table-config'\r\n\r\nconst Delta = Quill.imports.delta\r\nconst InlineBlot = Quill.imports.parchment.InlineBlot\r\n\r\n// rebuild delta\r\nexport function matchTableCell(node, delta) {\r\n // fix: 移除旧数据中的pt高度,避免由于高度平均分导致无法插入行\r\n if (node.style.height.indexOf('pt')) {\r\n node.removeAttribute('style')\r\n }\r\n\r\n const row = node.parentNode\r\n let rowId = row.dataset.row\r\n if (!rowId) {\r\n rowId = row.dataset.row = tableRowId()\r\n }\r\n let cellId = node.dataset.cell\r\n // fix: dataset.cell in td will be 'undefined' when insert row/column\r\n if (!cellId || cellId === 'undefined') {\r\n cellId = tableCellId()\r\n }\r\n const colspan = node.getAttribute('colspan') || 1\r\n const rowspan = node.getAttribute('rowspan') || 1\r\n\r\n // fix: empty table cells copied from other place will be removed unexpectedly\r\n if (delta.length() === 0) {\r\n delta = new Delta().insert('\\n', {\r\n 'table-cell-line': { row: rowId, cell: cellId, rowspan, colspan },\r\n })\r\n return delta\r\n }\r\n\r\n delta = delta.reduce((newDelta, op) => {\r\n if (op.insert && typeof op.insert === 'string') {\r\n const lines = splitWithBreak(op.insert)\r\n\r\n lines.forEach((text) => {\r\n if (text === '\\n') {\r\n let attributes = {}\r\n const cellAttributes = {\r\n row: rowId,\r\n cell: cellId,\r\n rowspan,\r\n colspan,\r\n }\r\n if (op.attributes.table) {\r\n delete op.attributes.table\r\n }\r\n switch (true) {\r\n case !!op.attributes.header:\r\n attributes = Object.assign(op.attributes.header, cellAttributes)\r\n break\r\n case !!op.attributes.list:\r\n attributes = { list: Object.assign(op.attributes.list, cellAttributes) }\r\n break\r\n default:\r\n attributes = { 'table-cell-line': cellAttributes }\r\n }\r\n // fix: when td has background-color, quill can't set it to table-cell bolt\r\n if (op.attributes.background && attributes['table-cell-line']) {\r\n attributes['table-cell-line'].tdBgColor = op.attributes.background\r\n }\r\n newDelta.insert('\\n', Object.assign(op.attributes, attributes))\r\n }\r\n else {\r\n newDelta.insert(text, omit(op.attributes, ['table', 'table-cell-line', 'header', 'list']))\r\n }\r\n })\r\n }\r\n else {\r\n newDelta.insert(op.insert, op.attributes)\r\n }\r\n\r\n return newDelta\r\n }, new Delta())\r\n\r\n // fix: table cell height becomes larger(because insert unnecessary <div> on both sides of cell) when init table ngModel\r\n const regexp = /^[\\n]+$/\r\n const firstDelta = delta.ops[0]\r\n if (delta.ops.length >= 3) {\r\n const lastDelta = delta.ops[delta.ops.length - 1]\r\n if (regexp.test(firstDelta.insert) && firstDelta.attributes['table-cell-line']) {\r\n delta.ops.splice(0, 1)\r\n }\r\n if (regexp.test(lastDelta.insert) && lastDelta.attributes['table-cell-line']) {\r\n delta.ops[delta.ops.length - 1].insert = '\\n'\r\n }\r\n }\r\n else if (delta.ops.length === 1 && regexp.test(firstDelta.insert) && firstDelta.attributes['table-cell-line']) {\r\n delta.ops[0].insert = '\\n'\r\n }\r\n\r\n return delta\r\n}\r\n\r\n// replace th tag with td tag\r\nexport function matchTableHeader(node, delta, _scroll) {\r\n const row = node.parentNode\r\n const cells = Array.from(row.querySelectorAll('th'))\r\n let rowId = row.dataset.row\r\n if (!rowId) {\r\n rowId = row.dataset.row = tableRowId()\r\n }\r\n const cellId = cells.indexOf(node) + 1\r\n const colspan = node.getAttribute('colspan') || false\r\n const rowspan = node.getAttribute('rowspan') || false\r\n\r\n // fix: empty table cells copied from other place will be removed unexpectedly\r\n if (delta.length() === 0) {\r\n delta = new Delta().insert('\\n', {\r\n 'table-cell-line': { row: rowId, cell: cellId, rowspan, colspan },\r\n })\r\n return delta\r\n }\r\n\r\n delta = delta.reduce((newDelta, op) => {\r\n if (op.insert && typeof op.insert === 'string') {\r\n const lines = splitWithBreak(op.insert)\r\n\r\n // fix: no '\\n' in the end of op.insert, push a '\\n' to lines\r\n if (lines[lines.length - 1] !== '\\n') {\r\n lines.push('\\n')\r\n }\r\n\r\n lines.forEach((text) => {\r\n text === '\\n'\r\n ? newDelta.insert('\\n', { 'table-cell-line': { row: rowId, cell: cellId, rowspan, colspan } })\r\n : newDelta.insert(text, op.attributes)\r\n })\r\n }\r\n else {\r\n newDelta.insert(op.insert, op.attributes)\r\n }\r\n\r\n return newDelta\r\n }, new Delta())\r\n\r\n delta = delta.reduce((newDelta, op) => {\r\n if (op.insert && typeof op.insert === 'string' && op.insert.startsWith('\\n')) {\r\n newDelta.insert(op.insert, { 'table-cell-line': { row: rowId, cell: cellId, rowspan, colspan } })\r\n }\r\n else {\r\n newDelta.insert(op.insert, { ...omit(op.attributes, ['table', 'table-cell-line']) })\r\n }\r\n\r\n return newDelta\r\n }, new Delta())\r\n\r\n return delta\r\n}\r\n\r\n// supplement colgroup and col\r\nexport function matchTable(node, delta, scroll) {\r\n const isWordTable = node.children.length === 1\r\n if (!(node instanceof Element)) {\r\n return\r\n }\r\n const getMaxColNumber = (tds) => {\r\n if (isWordTable) {\r\n return tds.length\r\n }\r\n let colsNumber = 0\r\n tds.forEach((td) => {\r\n colsNumber += td.colSpan\r\n })\r\n return Math.max(tds.length, colsNumber)\r\n }\r\n\r\n const checkMinWidth = (width) => {\r\n if (Number.isNaN(width)) {\r\n // 无指定值时默认为auto,待渲染后修正\r\n return { 'table-col': { width: 'auto' } }\r\n }\r\n else if (width < CELL_MIN_WIDTH) {\r\n // 当列宽度小于默认宽度时取默认宽度\r\n return { 'table-col': true }\r\n }\r\n else {\r\n // 大于默认值取实际指定值\r\n return { 'table-col': { width } }\r\n }\r\n }\r\n\r\n // fix: a table with an empty tr is invalid, should not be displayed\r\n const rows = node.querySelectorAll('tr')\r\n const topRow = rows[0]\r\n const onlyEmptyTr = rows.length === 1 && !topRow.querySelector('td')\r\n\r\n // fix: empty table will return empty delta\r\n if (!topRow || onlyEmptyTr) {\r\n return new Delta().insert('\\n')\r\n }\r\n\r\n const colsNumber = node.querySelectorAll('col').length\r\n let maxCellsNumber = 0\r\n let maxCells\r\n // 遍历行获取最大列数和该行的所有单元格\r\n Array.prototype.slice.call(rows).forEach((row) => {\r\n const tds = row.querySelectorAll('td')\r\n maxCellsNumber = Math.max(getMaxColNumber(tds), maxCellsNumber)\r\n maxCells = tds\r\n })\r\n\r\n // 列的累计器\r\n let colCount = 0\r\n delta = delta.reduce((newDelta, op) => {\r\n // 当colCount与colsNumber相等时,则补充相差列\r\n if (colCount === colsNumber) {\r\n const fillNumber = maxCellsNumber - colCount\r\n const outset = colCount\r\n // index为差值列索引,通过遍历差值得到mexCells行中对应索引的单元格宽度\r\n for (let i = 0; i < fillNumber; i++) {\r\n const index = outset + i\r\n const colWidth = Number.parseInt(\r\n index < maxCells.length\r\n ? maxCells[index].width\r\n // maxCells[index].style && maxCells[index].style.width ? maxCells[index].style.width :\r\n : maxCells[maxCells.length - 1].width,\r\n 10,\r\n )\r\n newDelta.insert('\\n', checkMinWidth(colWidth))\r\n colCount++\r\n }\r\n }\r\n const attr = op.attributes || {}\r\n switch (true) {\r\n case !!attr['table-col']:\r\n // 只有当前列数小于实际总列数才操作,所以不存在大于的情况\r\n if (colCount < maxCellsNumber) {\r\n // 当table-col宽度一致时会合并为单一insert,insert长度大于1,截取符合实际总列数的长度来插入\r\n const insert = op.insert.slice(0, maxCellsNumber)\r\n const colWidth = Number.parseInt(attr['table-col'].width, 10)\r\n newDelta.insert(insert, checkMinWidth(colWidth))\r\n colCount += insert.length\r\n }\r\n break\r\n case !!attr.notFilled:\r\n { // 将标记的空tr填充对应列数的单元格\r\n const rowId = tableRowId()\r\n for (let x = 0; x < maxCellsNumber; x++) {\r\n newDelta.insert('\\n', { 'table-cell-line': { row: rowId, cell: tableCellId(), rowspan: 1, colspan: 1 } })\r\n }\r\n break }\r\n default:\r\n newDelta.insert(op.insert, op.attributes)\r\n }\r\n return newDelta\r\n }, new Delta())\r\n\r\n const tableItem = node.closest('.quill-better-table-wrapper') || node\r\n const prevBlot = tableItem.previousElementSibling && scroll.query(tableItem.previousElementSibling)\r\n const nextBlot = tableItem.nextElementSibling && scroll.query(tableItem.nextElementSibling)\r\n // fix: prevent two adjacent tables from sticking together\r\n if (!nextBlot || nextBlot.prototype instanceof InlineBlot) {\r\n delta = delta.insert('\\n')\r\n }\r\n // fix: When there is no line break in front of the table, pressing the Enter key will cause a problem with the table.\r\n if (!prevBlot || prevBlot.prototype instanceof InlineBlot) {\r\n const newLine = new Delta().insert('\\n')\r\n delta = newLine.concat(delta)\r\n }\r\n if (nextBlot === TableViewWrapper) {\r\n delta = delta.insert('\\n')\r\n }\r\n\r\n return delta\r\n}\r\n\r\nexport function matchTableRow(_node, delta) {\r\n // fix: 处理空<tr>标签被忽略的情况\r\n if (delta.ops.length === 1 && !delta.ops[0].attributes) {\r\n delta = new Delta().insert('\\n', { notFilled: true })\r\n }\r\n return delta\r\n}\r\n\r\n// match h tags, distinguish between headers in the table and headers outside the table\r\nexport function matchHeader(node, delta) {\r\n const newDelta = new Delta()\r\n const fontSize = node.style.fontSize\r\n delta.forEach((op) => {\r\n newDelta.insert(\r\n op.insert,\r\n Object.assign({}, op.attributes, {\r\n size: fontSize,\r\n }),\r\n )\r\n })\r\n return newDelta\r\n}\r\n\r\nexport function matchList(node, delta) {\r\n const value = node.tagName === 'UL' ? 'bullet' : 'ordered'\r\n delta.forEach((op) => {\r\n if (typeof op.attributes.list === 'string') {\r\n delete op.attributes.list\r\n }\r\n else if (typeof op.attributes.list === 'object' && !op.attributes.list.value) {\r\n op.attributes.list.value = value\r\n }\r\n })\r\n return delta\r\n}\r\n\r\nexport function matchInline(node, delta, scroll) {\r\n const quill = Quill.find(scroll.domNode.parentNode)\r\n const currentRange = quill.getSelection()\r\n const formats = currentRange && quill.getFormat(currentRange)\r\n if (\r\n formats\r\n && formats['table-cell-line'] // 当前光标节点在表格内,否则不操作delta\r\n && node.nextElementSibling\r\n ) {\r\n // 插入节点是否存在下一个兄弟元素\r\n const match = scroll.query(node)\r\n const nodeHtml = node.nextElementSibling.innerHTML\r\n const nodeText = node.nextElementSibling.textContent\r\n if (\r\n (match && match.prototype instanceof InlineBlot) // 判断当前节点是否为内联\r\n || (node.tagName === 'P' && nodeHtml !== nodeText)\r\n ) {\r\n // 非内联时如果为P且下一个不为text节点\r\n delta.forEach((op) => {\r\n op.insert += '\\n'\r\n })\r\n }\r\n }\r\n return delta\r\n}\r\n\r\n// 匹配 word 自带的 v:shape 标签中的图片 v:imageData\r\nexport function matchWordShapeImage(node, delta) {\r\n if (node) {\r\n const imageUrl = node.attributes.src?.nodeValue\r\n delta = new Delta().insert({ image: imageUrl })\r\n }\r\n return delta\r\n}\r\n\r\nexport function matchMentionLink(node, delta, scroll) {\r\n const name = node.dataset.mentionId\r\n if (name) {\r\n const quill = Quill.find(scroll.domNode.parentNode)\r\n const mention = quill.getModule('mention')\r\n if (mention) {\r\n mention.options.search(name).then((res) => {\r\n const [item] = res\r\n if (item) {\r\n mention.options.select(item)\r\n }\r\n })\r\n }\r\n }\r\n return delta\r\n}\r\n"],"names":["rowId","tableRowId","cellId","tableCellId","colsNumber"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import Quill from "quill";
2
2
  import { isNullOrUndefined } from "../config/editor.utils.es.js";
3
3
  import "./better-picker.es.js";
4
+ import { ToolbarTip } from "./toolbar-tip.es.js";
4
5
  const Delta = Quill.import("delta");
5
6
  const Parchment = Quill.import("parchment");
6
7
  const levels = ["error", "warn", "log", "info"];
@@ -134,6 +135,7 @@ class BetterToolbar extends Toolbar {
134
135
  }
135
136
  }
136
137
  export {
138
+ ToolbarTip,
137
139
  BetterToolbar as default
138
140
  };
139
141
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../../../src/toolbar/index.ts"],"sourcesContent":["import type TypeToolbar from 'quill/modules/toolbar'\r\nimport Quill from 'quill'\r\nimport { isNullOrUndefined } from '../config/editor.utils'\r\nimport './better-picker'\r\n\r\nconst Delta = Quill.import('delta')\r\nconst Parchment = Quill.import('parchment')\r\nconst levels = ['error', 'warn', 'log', 'info'] as const\r\nlet level = 'warn' as const\r\n\r\nfunction debuglogger(method: typeof levels[number], ...args) {\r\n if (levels.indexOf(method) <= levels.indexOf(level)) {\r\n console[method](...args) // eslint-disable-line no-console\r\n }\r\n}\r\n\r\nfunction namespace(ns) {\r\n return levels.reduce((logger, method) => {\r\n logger[method] = debuglogger.bind(console, method, ns)\r\n return logger\r\n }, {} as Record<typeof levels[number], (...args: any) => void>)\r\n}\r\n\r\nnamespace.level = (newLevel) => {\r\n level = newLevel\r\n}\r\ndebuglogger.level = namespace.level\r\nconst debug = namespace('quill:toolbar')\r\n\r\nconst Toolbar = Quill.import('modules/toolbar') as typeof TypeToolbar\r\n// let oldClean = Toolbar.DEFAULTS.handlers.clean\r\n\r\nclass BetterToolbar extends Toolbar {\r\n update(range) {\r\n const formats = isNullOrUndefined(range) ? {} : this.quill.getFormat(range) as Record<string, any>\r\n this.controls.forEach((pair) => {\r\n const [format, input] = pair\r\n if (input.tagName === 'SELECT') {\r\n const select = input as HTMLSelectElement\r\n let option\r\n if (isNullOrUndefined(range)) {\r\n option = null\r\n }\r\n else if (isNullOrUndefined(formats[format])) {\r\n option = select.querySelector('option[selected]')\r\n }\r\n else if (!Array.isArray(formats[format])) {\r\n let value = format === 'header' ? formats[format].value : formats[format]\r\n if (typeof value === 'string') {\r\n value = value.replace(/\"/g, '\\\\\"')\r\n }\r\n option = select.querySelector(`option[value=\"${value}\"]`)\r\n }\r\n if (isNullOrUndefined(option)) {\r\n select.value = '' // TODO make configurable?\r\n select.selectedIndex = -1\r\n }\r\n else {\r\n option.selected = true\r\n }\r\n }\r\n else if (isNullOrUndefined(range)) {\r\n input.classList.remove('ql-active')\r\n }\r\n else if (input.hasAttribute('value')) {\r\n // both being null should match (default values)\r\n // '1' should match with 1 (headers)\r\n let isActive\r\n = formats[format] === input.getAttribute('value')\r\n || (!isNullOrUndefined(formats[format])\r\n && (formats[format].value === input.getAttribute('value')\r\n || formats[format].toString() === input.getAttribute('value')))\r\n || (isNullOrUndefined(formats[format]) && !input.getAttribute('value'))\r\n\r\n if (!isActive) {\r\n const checkFormat = formats[format]\r\n if (checkFormat === 'checked' || checkFormat === 'unchecked') {\r\n isActive = input.getAttribute('value') === 'check'\r\n }\r\n }\r\n\r\n if (isActive) {\r\n input.classList.add('ql-active')\r\n }\r\n else {\r\n input.classList.remove('ql-active')\r\n }\r\n }\r\n else {\r\n if (!isNullOrUndefined(formats[format])) {\r\n input.classList.add('ql-active')\r\n }\r\n else {\r\n input.classList.remove('ql-active')\r\n }\r\n }\r\n })\r\n }\r\n\r\n attach(input: HTMLElement) {\r\n let format = Array.from(input.classList).find((className) => {\r\n return className.indexOf('ql-') === 0\r\n })\r\n if (!format) return\r\n format = format.slice('ql-'.length)\r\n\r\n if (input.tagName === 'BUTTON') {\r\n input.setAttribute('type', 'button')\r\n }\r\n\r\n if (this.handlers[format] == null && this.quill.scroll.query(format) == null) {\r\n debug.warn('ignoring attaching to nonexistent format', format, input)\r\n return\r\n }\r\n\r\n const eventName = input.tagName === 'SELECT' ? 'change' : 'click'\r\n input.addEventListener(eventName, (e) => {\r\n let value: boolean | string\r\n\r\n if (input.tagName === 'SELECT') {\r\n const select = input as HTMLSelectElement\r\n if (select.selectedIndex < 0) return\r\n const selected = select.options[select.selectedIndex]\r\n\r\n if (selected.hasAttribute('selected')) {\r\n value = false\r\n }\r\n else {\r\n value = selected.value || false\r\n }\r\n }\r\n else {\r\n const button = input as HTMLButtonElement\r\n if (button.classList.contains('ql-active')) {\r\n value = false\r\n }\r\n else {\r\n value = button.value || !button.hasAttribute('value')\r\n }\r\n e.preventDefault()\r\n }\r\n\r\n this.quill.focus({ preventScroll: format === 'screenshot' })\r\n const [range] = this.quill.selection.getRange()\r\n if (this.handlers[format] != null) {\r\n // @ts-ignore\r\n if (!isNullOrUndefined(window.quillIsIntable) && window.quillIsIntable === true && (format === 'blockquote' || format === 'code-block' || format === 'list' || format === 'indent' || format === 'clean')) {\r\n return\r\n }\r\n this.handlers[format].call(this, value)\r\n }\r\n else if (\r\n // @ts-ignore\r\n this.quill.scroll.query(format).prototype instanceof Parchment.EmbedBlot\r\n ) {\r\n value = prompt(`Enter ${format}`)\r\n if (!value) return\r\n this.quill.updateContents(\r\n new Delta()\r\n .retain(range.index)\r\n .delete(range.length)\r\n .insert({ [format]: value }),\r\n Quill.sources.USER,\r\n )\r\n }\r\n else {\r\n // @ts-ignore\r\n if (!isNullOrUndefined(window.quillIsIntable) && window.quillIsIntable === true && (format === 'blockquote' || format === 'code-block' || format === 'list' || format === 'indent' || format === 'clean')) {\r\n return\r\n }\r\n this.quill.format(format, value, Quill.sources.USER)\r\n }\r\n\r\n this.update(range)\r\n })\r\n this.controls.push([format, input])\r\n }\r\n}\r\n\r\nexport default BetterToolbar\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../../../src/toolbar/index.ts"],"sourcesContent":["import type TypeToolbar from 'quill/modules/toolbar'\r\nimport Quill from 'quill'\r\nimport { isNullOrUndefined } from '../config/editor.utils'\r\nimport './better-picker'\r\n\r\nconst Delta = Quill.import('delta')\r\nconst Parchment = Quill.import('parchment')\r\nconst levels = ['error', 'warn', 'log', 'info'] as const\r\nlet level = 'warn' as const\r\n\r\nfunction debuglogger(method: typeof levels[number], ...args) {\r\n if (levels.indexOf(method) <= levels.indexOf(level)) {\r\n console[method](...args) // eslint-disable-line no-console\r\n }\r\n}\r\n\r\nfunction namespace(ns) {\r\n return levels.reduce((logger, method) => {\r\n logger[method] = debuglogger.bind(console, method, ns)\r\n return logger\r\n }, {} as Record<typeof levels[number], (...args: any) => void>)\r\n}\r\n\r\nnamespace.level = (newLevel) => {\r\n level = newLevel\r\n}\r\ndebuglogger.level = namespace.level\r\nconst debug = namespace('quill:toolbar')\r\n\r\nconst Toolbar = Quill.import('modules/toolbar') as typeof TypeToolbar\r\n// let oldClean = Toolbar.DEFAULTS.handlers.clean\r\n\r\nclass BetterToolbar extends Toolbar {\r\n update(range) {\r\n const formats = isNullOrUndefined(range) ? {} : this.quill.getFormat(range) as Record<string, any>\r\n this.controls.forEach((pair) => {\r\n const [format, input] = pair\r\n if (input.tagName === 'SELECT') {\r\n const select = input as HTMLSelectElement\r\n let option\r\n if (isNullOrUndefined(range)) {\r\n option = null\r\n }\r\n else if (isNullOrUndefined(formats[format])) {\r\n option = select.querySelector('option[selected]')\r\n }\r\n else if (!Array.isArray(formats[format])) {\r\n let value = format === 'header' ? formats[format].value : formats[format]\r\n if (typeof value === 'string') {\r\n value = value.replace(/\"/g, '\\\\\"')\r\n }\r\n option = select.querySelector(`option[value=\"${value}\"]`)\r\n }\r\n if (isNullOrUndefined(option)) {\r\n select.value = '' // TODO make configurable?\r\n select.selectedIndex = -1\r\n }\r\n else {\r\n option.selected = true\r\n }\r\n }\r\n else if (isNullOrUndefined(range)) {\r\n input.classList.remove('ql-active')\r\n }\r\n else if (input.hasAttribute('value')) {\r\n // both being null should match (default values)\r\n // '1' should match with 1 (headers)\r\n let isActive\r\n = formats[format] === input.getAttribute('value')\r\n || (!isNullOrUndefined(formats[format])\r\n && (formats[format].value === input.getAttribute('value')\r\n || formats[format].toString() === input.getAttribute('value')))\r\n || (isNullOrUndefined(formats[format]) && !input.getAttribute('value'))\r\n\r\n if (!isActive) {\r\n const checkFormat = formats[format]\r\n if (checkFormat === 'checked' || checkFormat === 'unchecked') {\r\n isActive = input.getAttribute('value') === 'check'\r\n }\r\n }\r\n\r\n if (isActive) {\r\n input.classList.add('ql-active')\r\n }\r\n else {\r\n input.classList.remove('ql-active')\r\n }\r\n }\r\n else {\r\n if (!isNullOrUndefined(formats[format])) {\r\n input.classList.add('ql-active')\r\n }\r\n else {\r\n input.classList.remove('ql-active')\r\n }\r\n }\r\n })\r\n }\r\n\r\n attach(input: HTMLElement) {\r\n let format = Array.from(input.classList).find((className) => {\r\n return className.indexOf('ql-') === 0\r\n })\r\n if (!format) return\r\n format = format.slice('ql-'.length)\r\n\r\n if (input.tagName === 'BUTTON') {\r\n input.setAttribute('type', 'button')\r\n }\r\n\r\n if (this.handlers[format] == null && this.quill.scroll.query(format) == null) {\r\n debug.warn('ignoring attaching to nonexistent format', format, input)\r\n return\r\n }\r\n\r\n const eventName = input.tagName === 'SELECT' ? 'change' : 'click'\r\n input.addEventListener(eventName, (e) => {\r\n let value: boolean | string\r\n\r\n if (input.tagName === 'SELECT') {\r\n const select = input as HTMLSelectElement\r\n if (select.selectedIndex < 0) return\r\n const selected = select.options[select.selectedIndex]\r\n\r\n if (selected.hasAttribute('selected')) {\r\n value = false\r\n }\r\n else {\r\n value = selected.value || false\r\n }\r\n }\r\n else {\r\n const button = input as HTMLButtonElement\r\n if (button.classList.contains('ql-active')) {\r\n value = false\r\n }\r\n else {\r\n value = button.value || !button.hasAttribute('value')\r\n }\r\n e.preventDefault()\r\n }\r\n\r\n this.quill.focus({ preventScroll: format === 'screenshot' })\r\n const [range] = this.quill.selection.getRange()\r\n if (this.handlers[format] != null) {\r\n // @ts-ignore\r\n if (!isNullOrUndefined(window.quillIsIntable) && window.quillIsIntable === true && (format === 'blockquote' || format === 'code-block' || format === 'list' || format === 'indent' || format === 'clean')) {\r\n return\r\n }\r\n this.handlers[format].call(this, value)\r\n }\r\n else if (\r\n // @ts-ignore\r\n this.quill.scroll.query(format).prototype instanceof Parchment.EmbedBlot\r\n ) {\r\n value = prompt(`Enter ${format}`)\r\n if (!value) return\r\n this.quill.updateContents(\r\n new Delta()\r\n .retain(range.index)\r\n .delete(range.length)\r\n .insert({ [format]: value }),\r\n Quill.sources.USER,\r\n )\r\n }\r\n else {\r\n // @ts-ignore\r\n if (!isNullOrUndefined(window.quillIsIntable) && window.quillIsIntable === true && (format === 'blockquote' || format === 'code-block' || format === 'list' || format === 'indent' || format === 'clean')) {\r\n return\r\n }\r\n this.quill.format(format, value, Quill.sources.USER)\r\n }\r\n\r\n this.update(range)\r\n })\r\n this.controls.push([format, input])\r\n }\r\n}\r\n\r\nexport default BetterToolbar\r\nexport * from './toolbar-tip'\r\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import QuillToolbarTip from "quill-toolbar-tip";
2
+ import "../config/index.es.js";
3
+ import { CHANGE_LANGUAGE_EVENT } from "../config/editor.config.es.js";
4
+ const _ToolbarTip = class _ToolbarTip extends QuillToolbarTip {
5
+ constructor(quill, options) {
6
+ if (!(options == null ? void 0 : options.tipTextMap)) {
7
+ options.tipTextMap = {};
8
+ }
9
+ super(quill, options);
10
+ this.quill = quill;
11
+ this.quill.on(CHANGE_LANGUAGE_EVENT, () => {
12
+ this.destroyAllTips();
13
+ this.options = this.resolveOptions(options);
14
+ this.createToolbarTip();
15
+ });
16
+ }
17
+ resolveOptions(options) {
18
+ const result = super.resolveOptions(options);
19
+ const langText = this.quill.options.langText;
20
+ const btnTips = [
21
+ "bold",
22
+ "italic",
23
+ "strike",
24
+ "underline",
25
+ "undo",
26
+ "redo",
27
+ "clean",
28
+ "link",
29
+ "blockquote",
30
+ "code",
31
+ "image",
32
+ "file",
33
+ "emoji",
34
+ "video",
35
+ "screenshot",
36
+ "better-table",
37
+ "code-block",
38
+ "formula",
39
+ "format-painter"
40
+ ].reduce((map, name) => {
41
+ map[name] = langText[name];
42
+ return map;
43
+ }, {});
44
+ const selectTips = [
45
+ "color",
46
+ "background",
47
+ "font",
48
+ "size"
49
+ ].reduce((map, name) => {
50
+ map[name] = {
51
+ onShow() {
52
+ return langText[name];
53
+ }
54
+ };
55
+ return map;
56
+ }, {});
57
+ const valueControlTips = [
58
+ "list",
59
+ "align",
60
+ "script",
61
+ "indent",
62
+ "header",
63
+ "direction"
64
+ ].reduce((map, name) => {
65
+ map[name] = {
66
+ onShow(target, value) {
67
+ if (name === "direction") {
68
+ value = target.classList.contains("ql-active") ? "rtl" : "ltr";
69
+ }
70
+ if (!value) {
71
+ if (name === "align") {
72
+ value = "left";
73
+ } else if (name === "header") {
74
+ value = "normal";
75
+ }
76
+ }
77
+ return langText[`${name}-${value}`];
78
+ }
79
+ };
80
+ return map;
81
+ }, {});
82
+ const textMap = {
83
+ ...btnTips,
84
+ ...valueControlTips,
85
+ ...selectTips,
86
+ fullscreen: {
87
+ onShow: () => {
88
+ return langText[this.quill.isFullscreen ? "exit-fullscreen" : "fullscreen"];
89
+ }
90
+ }
91
+ };
92
+ return {
93
+ ...result,
94
+ tipTextMap: {
95
+ ...textMap,
96
+ ...options.tipTextMap
97
+ }
98
+ };
99
+ }
100
+ };
101
+ _ToolbarTip.moduleName = "toolbar-tip";
102
+ let ToolbarTip = _ToolbarTip;
103
+ export {
104
+ ToolbarTip
105
+ };
106
+ //# sourceMappingURL=toolbar-tip.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toolbar-tip.es.js","sources":["../../../src/toolbar/toolbar-tip.ts"],"sourcesContent":["import type { QuillToolbarTipOptions } from 'quill-toolbar-tip'\r\nimport type { FluentEditor } from '../fluent-editor'\r\nimport QuillToolbarTip from 'quill-toolbar-tip'\r\nimport { CHANGE_LANGUAGE_EVENT } from '../config'\r\n\r\nexport class ToolbarTip extends QuillToolbarTip {\r\n static moduleName: string = 'toolbar-tip'\r\n constructor(public quill: FluentEditor, options: Partial<QuillToolbarTipOptions>) {\r\n if (!options?.tipTextMap) {\r\n options.tipTextMap = {}\r\n }\r\n super(quill, options)\r\n\r\n this.quill.on(CHANGE_LANGUAGE_EVENT, () => {\r\n this.destroyAllTips()\r\n this.options = this.resolveOptions(options)\r\n this.createToolbarTip()\r\n })\r\n }\r\n\r\n resolveOptions(options: Partial<QuillToolbarTipOptions>): QuillToolbarTipOptions {\r\n const result = super.resolveOptions(options)\r\n const langText = this.quill.options.langText\r\n const btnTips = [\r\n 'bold',\r\n 'italic',\r\n 'strike',\r\n 'underline',\r\n 'undo',\r\n 'redo',\r\n 'clean',\r\n 'link',\r\n 'blockquote',\r\n 'code',\r\n 'image',\r\n 'file',\r\n 'emoji',\r\n 'video',\r\n 'screenshot',\r\n 'better-table',\r\n 'code-block',\r\n 'formula',\r\n 'format-painter',\r\n ].reduce((map, name) => {\r\n map[name] = langText[name]\r\n return map\r\n }, {} as Record<string, string>)\r\n const selectTips = [\r\n 'color',\r\n 'background',\r\n 'font',\r\n 'size',\r\n ].reduce((map, name) => {\r\n map[name] = {\r\n onShow() {\r\n return langText[name]\r\n },\r\n }\r\n return map\r\n }, {})\r\n const valueControlTips = [\r\n 'list',\r\n 'align',\r\n 'script',\r\n 'indent',\r\n 'header',\r\n 'direction',\r\n ].reduce((map, name) => {\r\n map[name] = {\r\n onShow(target: HTMLElement, value: string) {\r\n if (name === 'direction') {\r\n value = target.classList.contains('ql-active') ? 'rtl' : 'ltr'\r\n }\r\n if (!value) {\r\n if (name === 'align') {\r\n value = 'left'\r\n }\r\n else if (name === 'header') {\r\n value = 'normal'\r\n }\r\n }\r\n return langText[`${name}-${value}`]\r\n },\r\n }\r\n return map\r\n }, {})\r\n const textMap: QuillToolbarTipOptions['tipTextMap'] = {\r\n ...btnTips,\r\n ...valueControlTips,\r\n ...selectTips,\r\n fullscreen: {\r\n onShow: () => {\r\n return langText[this.quill.isFullscreen ? 'exit-fullscreen' : 'fullscreen']\r\n },\r\n },\r\n }\r\n return {\r\n ...result,\r\n tipTextMap: {\r\n ...textMap,\r\n ...options.tipTextMap,\r\n },\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":";;;AAKO,MAAM,cAAN,MAAM,oBAAmB,gBAAgB;AAAA,EAE9C,YAAmB,OAAqB,SAA0C;AAC5E,QAAA,EAAC,mCAAS,aAAY;AACxB,cAAQ,aAAa;IACvB;AACA,UAAM,OAAO,OAAO;AAJH,SAAA,QAAA;AAMZ,SAAA,MAAM,GAAG,uBAAuB,MAAM;AACzC,WAAK,eAAe;AACf,WAAA,UAAU,KAAK,eAAe,OAAO;AAC1C,WAAK,iBAAiB;AAAA,IAAA,CACvB;AAAA,EACH;AAAA,EAEA,eAAe,SAAkE;AACzE,UAAA,SAAS,MAAM,eAAe,OAAO;AACrC,UAAA,WAAW,KAAK,MAAM,QAAQ;AACpC,UAAM,UAAU;AAAA,MACd;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,EACA,OAAO,CAAC,KAAK,SAAS;AAClB,UAAA,IAAI,IAAI,SAAS,IAAI;AAClB,aAAA;AAAA,IACT,GAAG,CAA4B,CAAA;AAC/B,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,EACA,OAAO,CAAC,KAAK,SAAS;AACtB,UAAI,IAAI,IAAI;AAAA,QACV,SAAS;AACP,iBAAO,SAAS,IAAI;AAAA,QACtB;AAAA,MAAA;AAEK,aAAA;AAAA,IACT,GAAG,CAAE,CAAA;AACL,UAAM,mBAAmB;AAAA,MACvB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,EACA,OAAO,CAAC,KAAK,SAAS;AACtB,UAAI,IAAI,IAAI;AAAA,QACV,OAAO,QAAqB,OAAe;AACzC,cAAI,SAAS,aAAa;AACxB,oBAAQ,OAAO,UAAU,SAAS,WAAW,IAAI,QAAQ;AAAA,UAC3D;AACA,cAAI,CAAC,OAAO;AACV,gBAAI,SAAS,SAAS;AACZ,sBAAA;AAAA,YAAA,WAED,SAAS,UAAU;AAClB,sBAAA;AAAA,YACV;AAAA,UACF;AACA,iBAAO,SAAS,GAAG,IAAI,IAAI,KAAK,EAAE;AAAA,QACpC;AAAA,MAAA;AAEK,aAAA;AAAA,IACT,GAAG,CAAE,CAAA;AACL,UAAM,UAAgD;AAAA,MACpD,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,YAAY;AAAA,QACV,QAAQ,MAAM;AACZ,iBAAO,SAAS,KAAK,MAAM,eAAe,oBAAoB,YAAY;AAAA,QAC5E;AAAA,MACF;AAAA,IAAA;AAEK,WAAA;AAAA,MACL,GAAG;AAAA,MACH,YAAY;AAAA,QACV,GAAG;AAAA,QACH,GAAG,QAAQ;AAAA,MACb;AAAA,IAAA;AAAA,EAEJ;AACF;AAlGE,YAAO,aAAqB;AADvB,IAAM,aAAN;"}
@@ -1,4 +1,5 @@
1
- import { root, isObject } from "./method.es.js";
1
+ import { isObject } from "./is.es.js";
2
+ import { root } from "./method.es.js";
2
3
  function debounce(func, wait, options = void 0) {
3
4
  let lastArgs, lastThis, maxWait, result, timerId, lastCallTime;
4
5
  let lastInvokeTime = 0;
@@ -1 +1 @@
1
- {"version":3,"file":"debounce.es.js","sources":["../../../src/utils/debounce.ts"],"sourcesContent":["import { isObject, root } from './method'\r\n\r\nexport function debounce(func, wait, options = undefined) {\r\n let lastArgs,\r\n lastThis,\r\n maxWait,\r\n result,\r\n timerId,\r\n lastCallTime\r\n\r\n let lastInvokeTime = 0\r\n let leading = false\r\n let maxing = false\r\n let trailing = true\r\n\r\n // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.\r\n const useRAF = (!wait && wait !== 0 && typeof root.requestAnimationFrame === 'function')\r\n\r\n if (typeof func !== 'function') {\r\n throw new TypeError('Expected a function')\r\n }\r\n wait = +wait || 0\r\n if (isObject(options)) {\r\n leading = !!options.leading\r\n maxing = 'maxWait' in options\r\n maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait\r\n trailing = 'trailing' in options ? !!options.trailing : trailing\r\n }\r\n\r\n function invokeFunc(time) {\r\n const args = lastArgs\r\n const thisArg = lastThis\r\n\r\n lastArgs = lastThis = undefined\r\n lastInvokeTime = time\r\n result = func.apply(thisArg, args)\r\n return result\r\n }\r\n\r\n function startTimer(pendingFunc, wait) {\r\n if (useRAF) {\r\n root.cancelAnimationFrame(timerId)\r\n return root.requestAnimationFrame(pendingFunc)\r\n }\r\n return setTimeout(pendingFunc, wait)\r\n }\r\n\r\n function cancelTimer(id) {\r\n if (useRAF) {\r\n return root.cancelAnimationFrame(id)\r\n }\r\n clearTimeout(id)\r\n }\r\n\r\n function leadingEdge(time) {\r\n // Reset any `maxWait` timer.\r\n lastInvokeTime = time\r\n // Start the timer for the trailing edge.\r\n timerId = startTimer(timerExpired, wait)\r\n // Invoke the leading edge.\r\n return leading ? invokeFunc(time) : result\r\n }\r\n\r\n function remainingWait(time) {\r\n const timeSinceLastCall = time - lastCallTime\r\n const timeSinceLastInvoke = time - lastInvokeTime\r\n const timeWaiting = wait - timeSinceLastCall\r\n\r\n return maxing\r\n ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)\r\n : timeWaiting\r\n }\r\n\r\n function shouldInvoke(time) {\r\n const timeSinceLastCall = time - lastCallTime\r\n const timeSinceLastInvoke = time - lastInvokeTime\r\n\r\n // Either this is the first call, activity has stopped and we're at the\r\n // trailing edge, the system time has gone backwards and we're treating\r\n // it as the trailing edge, or we've hit the `maxWait` limit.\r\n return (lastCallTime === undefined || (timeSinceLastCall >= wait)\r\n || (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait))\r\n }\r\n\r\n function timerExpired() {\r\n const time = Date.now()\r\n if (shouldInvoke(time)) {\r\n return trailingEdge(time)\r\n }\r\n // Restart the timer.\r\n timerId = startTimer(timerExpired, remainingWait(time))\r\n }\r\n\r\n function trailingEdge(time) {\r\n timerId = undefined\r\n\r\n // Only invoke if we have `lastArgs` which means `func` has been\r\n // debounced at least once.\r\n if (trailing && lastArgs) {\r\n return invokeFunc(time)\r\n }\r\n lastArgs = lastThis = undefined\r\n return result\r\n }\r\n\r\n function cancel() {\r\n if (timerId !== undefined) {\r\n cancelTimer(timerId)\r\n }\r\n lastInvokeTime = 0\r\n lastArgs = lastCallTime = lastThis = timerId = undefined\r\n }\r\n\r\n function flush() {\r\n return timerId === undefined ? result : trailingEdge(Date.now())\r\n }\r\n\r\n function pending() {\r\n return timerId !== undefined\r\n }\r\n\r\n function debounced(...args) {\r\n const time = Date.now()\r\n const isInvoking = shouldInvoke(time)\r\n\r\n lastArgs = args\r\n lastThis = this\r\n lastCallTime = time\r\n\r\n if (isInvoking) {\r\n if (timerId === undefined) {\r\n return leadingEdge(lastCallTime)\r\n }\r\n if (maxing) {\r\n // Handle invocations in a tight loop.\r\n timerId = startTimer(timerExpired, wait)\r\n return invokeFunc(lastCallTime)\r\n }\r\n }\r\n if (timerId === undefined) {\r\n timerId = startTimer(timerExpired, wait)\r\n }\r\n return result\r\n }\r\n debounced.cancel = cancel\r\n debounced.flush = flush\r\n debounced.pending = pending\r\n return debounced\r\n}\r\n"],"names":["wait"],"mappings":"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"}
1
+ {"version":3,"file":"debounce.es.js","sources":["../../../src/utils/debounce.ts"],"sourcesContent":["import { isObject } from './is'\r\nimport { root } from './method'\r\n\r\nexport function debounce(func, wait, options = undefined) {\r\n let lastArgs,\r\n lastThis,\r\n maxWait,\r\n result,\r\n timerId,\r\n lastCallTime\r\n\r\n let lastInvokeTime = 0\r\n let leading = false\r\n let maxing = false\r\n let trailing = true\r\n\r\n // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.\r\n const useRAF = (!wait && wait !== 0 && typeof root.requestAnimationFrame === 'function')\r\n\r\n if (typeof func !== 'function') {\r\n throw new TypeError('Expected a function')\r\n }\r\n wait = +wait || 0\r\n if (isObject(options)) {\r\n leading = !!options.leading\r\n maxing = 'maxWait' in options\r\n maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait\r\n trailing = 'trailing' in options ? !!options.trailing : trailing\r\n }\r\n\r\n function invokeFunc(time) {\r\n const args = lastArgs\r\n const thisArg = lastThis\r\n\r\n lastArgs = lastThis = undefined\r\n lastInvokeTime = time\r\n result = func.apply(thisArg, args)\r\n return result\r\n }\r\n\r\n function startTimer(pendingFunc, wait) {\r\n if (useRAF) {\r\n root.cancelAnimationFrame(timerId)\r\n return root.requestAnimationFrame(pendingFunc)\r\n }\r\n return setTimeout(pendingFunc, wait)\r\n }\r\n\r\n function cancelTimer(id) {\r\n if (useRAF) {\r\n return root.cancelAnimationFrame(id)\r\n }\r\n clearTimeout(id)\r\n }\r\n\r\n function leadingEdge(time) {\r\n // Reset any `maxWait` timer.\r\n lastInvokeTime = time\r\n // Start the timer for the trailing edge.\r\n timerId = startTimer(timerExpired, wait)\r\n // Invoke the leading edge.\r\n return leading ? invokeFunc(time) : result\r\n }\r\n\r\n function remainingWait(time) {\r\n const timeSinceLastCall = time - lastCallTime\r\n const timeSinceLastInvoke = time - lastInvokeTime\r\n const timeWaiting = wait - timeSinceLastCall\r\n\r\n return maxing\r\n ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)\r\n : timeWaiting\r\n }\r\n\r\n function shouldInvoke(time) {\r\n const timeSinceLastCall = time - lastCallTime\r\n const timeSinceLastInvoke = time - lastInvokeTime\r\n\r\n // Either this is the first call, activity has stopped and we're at the\r\n // trailing edge, the system time has gone backwards and we're treating\r\n // it as the trailing edge, or we've hit the `maxWait` limit.\r\n return (lastCallTime === undefined || (timeSinceLastCall >= wait)\r\n || (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait))\r\n }\r\n\r\n function timerExpired() {\r\n const time = Date.now()\r\n if (shouldInvoke(time)) {\r\n return trailingEdge(time)\r\n }\r\n // Restart the timer.\r\n timerId = startTimer(timerExpired, remainingWait(time))\r\n }\r\n\r\n function trailingEdge(time) {\r\n timerId = undefined\r\n\r\n // Only invoke if we have `lastArgs` which means `func` has been\r\n // debounced at least once.\r\n if (trailing && lastArgs) {\r\n return invokeFunc(time)\r\n }\r\n lastArgs = lastThis = undefined\r\n return result\r\n }\r\n\r\n function cancel() {\r\n if (timerId !== undefined) {\r\n cancelTimer(timerId)\r\n }\r\n lastInvokeTime = 0\r\n lastArgs = lastCallTime = lastThis = timerId = undefined\r\n }\r\n\r\n function flush() {\r\n return timerId === undefined ? result : trailingEdge(Date.now())\r\n }\r\n\r\n function pending() {\r\n return timerId !== undefined\r\n }\r\n\r\n function debounced(...args) {\r\n const time = Date.now()\r\n const isInvoking = shouldInvoke(time)\r\n\r\n lastArgs = args\r\n lastThis = this\r\n lastCallTime = time\r\n\r\n if (isInvoking) {\r\n if (timerId === undefined) {\r\n return leadingEdge(lastCallTime)\r\n }\r\n if (maxing) {\r\n // Handle invocations in a tight loop.\r\n timerId = startTimer(timerExpired, wait)\r\n return invokeFunc(lastCallTime)\r\n }\r\n }\r\n if (timerId === undefined) {\r\n timerId = startTimer(timerExpired, wait)\r\n }\r\n return result\r\n }\r\n debounced.cancel = cancel\r\n debounced.flush = flush\r\n debounced.pending = pending\r\n return debounced\r\n}\r\n"],"names":["wait"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ function isObject(value) {
2
+ const type = typeof value;
3
+ return value != null && (type === "object" || type === "function");
4
+ }
5
+ const isUndefined = (val) => val === void 0;
6
+ export {
7
+ isObject,
8
+ isUndefined
9
+ };
10
+ //# sourceMappingURL=is.es.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is.es.js","sources":["../../../src/utils/is.ts"],"sourcesContent":["export function isObject(value): value is object {\r\n const type = typeof value\r\n return value != null && (type === 'object' || type === 'function')\r\n}\r\nexport const isUndefined = (val: unknown): val is undefined => val === undefined\r\n"],"names":[],"mappings":"AAAO,SAAS,SAAS,OAAwB;AAC/C,QAAM,OAAO,OAAO;AACpB,SAAO,SAAS,SAAS,SAAS,YAAY,SAAS;AACzD;AACa,MAAA,cAAc,CAAC,QAAmC,QAAQ;"}
@@ -2,10 +2,6 @@ const freeGlobal = typeof global === "object" && global !== null && global.Objec
2
2
  const freeGlobalThis = typeof globalThis === "object" && globalThis !== null && globalThis.Object == Object && globalThis;
3
3
  const freeSelf = typeof self === "object" && self !== null && self.Object === Object && self;
4
4
  const root = freeGlobalThis || freeGlobal || freeSelf || new Function("return this")();
5
- function isObject(value) {
6
- const type = typeof value;
7
- return value != null && (type === "object" || type === "function");
8
- }
9
5
  function compareArray(arr1, arr2) {
10
6
  if (arr1.length !== arr2.length) {
11
7
  return false;
@@ -61,7 +57,6 @@ export {
61
57
  compare,
62
58
  compareArray,
63
59
  compareObject,
64
- isObject,
65
60
  root,
66
61
  unshiftString
67
62
  };
@@ -1 +1 @@
1
- {"version":3,"file":"method.es.js","sources":["../../../src/utils/method.ts"],"sourcesContent":["/** Detect free variable `global` from Node.js. */\r\nconst freeGlobal\r\n = typeof global === 'object'\r\n && global !== null\r\n && global.Object === Object\r\n && global\r\n\r\n/** Detect free variable `globalThis` */\r\nconst freeGlobalThis\r\n = typeof globalThis === 'object'\r\n && globalThis !== null\r\n && globalThis.Object == Object\r\n && globalThis\r\n\r\n/** Detect free variable `self`. */\r\nconst freeSelf\r\n = typeof self === 'object' && self !== null && self.Object === Object && self\r\n\r\n/** Used as a reference to the global object. */\r\nexport const root\r\n = freeGlobalThis || freeGlobal || freeSelf || new Function('return this')()\r\n\r\nexport function isObject(value) {\r\n const type = typeof value\r\n return value != null && (type === 'object' || type === 'function')\r\n}\r\n\r\nexport function compareArray(arr1, arr2) {\r\n if (arr1.length !== arr2.length) {\r\n return false\r\n }\r\n for (let i = 0; i < arr1.length; i++) {\r\n if (arr1[i] !== arr2[i]) {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\nexport function compareObject(object1, object2) {\r\n const o1keys = Object.keys(object1)\r\n const o2keys = Object.keys(object2)\r\n if (o2keys.length !== o1keys.length) return false\r\n for (let i = 0; i <= o1keys.length - 1; i++) {\r\n const key = o1keys[i]\r\n if (!o2keys.includes(key)) return false\r\n if (!compare(object2[key], object1[key])) return false\r\n }\r\n return true\r\n}\r\n\r\nexport function compare(value, other) {\r\n if (value === other) {\r\n return true\r\n }\r\n if (Array.isArray(value) && Array.isArray(other)) {\r\n return compareArray(value, other)\r\n }\r\n if (value instanceof Function || other instanceof Function) {\r\n return false\r\n }\r\n if (value instanceof Object && other instanceof Object) {\r\n return compareObject(value, other)\r\n }\r\n return false\r\n}\r\n\r\nexport function unshiftString(str: string, targetLength: number, addString: string): string {\r\n targetLength = targetLength > 0 ? targetLength : 0\r\n addString = String((typeof addString !== 'undefined' && typeof addString !== 'object') ? addString : ' ')\r\n str = (str === undefined || str === null) ? '' : String(str)\r\n if (str.length >= targetLength) {\r\n return String(str)\r\n }\r\n else {\r\n targetLength = targetLength - str.length\r\n if (targetLength > addString.length) {\r\n addString += addString.repeat(targetLength / addString.length)\r\n }\r\n return addString.slice(0, targetLength) + String(str)\r\n }\r\n}\r\n"],"names":[],"mappings":"AACA,MAAM,aACF,OAAO,WAAW,YACjB,WAAW,QACX,OAAO,WAAW,UAClB;AAGL,MAAM,iBACF,OAAO,eAAe,YACrB,eAAe,QACf,WAAW,UAAU,UACrB;AAGL,MAAM,WACF,OAAO,SAAS,YAAY,SAAS,QAAQ,KAAK,WAAW,UAAU;AAGpE,MAAM,OACT,kBAAkB,cAAc,YAAY,IAAI,SAAS,aAAa,EAAE;AAErE,SAAS,SAAS,OAAO;AAC9B,QAAM,OAAO,OAAO;AACpB,SAAO,SAAS,SAAS,SAAS,YAAY,SAAS;AACzD;AAEgB,SAAA,aAAa,MAAM,MAAM;AACnC,MAAA,KAAK,WAAW,KAAK,QAAQ;AACxB,WAAA;AAAA,EACT;AACA,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAI,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG;AAChB,aAAA;AAAA,IACT;AAAA,EACF;AACO,SAAA;AACT;AAEgB,SAAA,cAAc,SAAS,SAAS;AACxC,QAAA,SAAS,OAAO,KAAK,OAAO;AAC5B,QAAA,SAAS,OAAO,KAAK,OAAO;AAClC,MAAI,OAAO,WAAW,OAAO,OAAe,QAAA;AAC5C,WAAS,IAAI,GAAG,KAAK,OAAO,SAAS,GAAG,KAAK;AACrC,UAAA,MAAM,OAAO,CAAC;AACpB,QAAI,CAAC,OAAO,SAAS,GAAG,EAAU,QAAA;AAC9B,QAAA,CAAC,QAAQ,QAAQ,GAAG,GAAG,QAAQ,GAAG,CAAC,EAAU,QAAA;AAAA,EACnD;AACO,SAAA;AACT;AAEgB,SAAA,QAAQ,OAAO,OAAO;AACpC,MAAI,UAAU,OAAO;AACZ,WAAA;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,QAAQ,KAAK,GAAG;AACzC,WAAA,aAAa,OAAO,KAAK;AAAA,EAClC;AACI,MAAA,iBAAiB,YAAY,iBAAiB,UAAU;AACnD,WAAA;AAAA,EACT;AACI,MAAA,iBAAiB,UAAU,iBAAiB,QAAQ;AAC/C,WAAA,cAAc,OAAO,KAAK;AAAA,EACnC;AACO,SAAA;AACT;AAEgB,SAAA,cAAc,KAAa,cAAsB,WAA2B;AAC3E,iBAAA,eAAe,IAAI,eAAe;AACrC,cAAA,OAAQ,OAAO,cAAc,eAAe,OAAO,cAAc,WAAY,YAAY,GAAG;AACxG,QAAO,QAAQ,UAAa,QAAQ,OAAQ,KAAK,OAAO,GAAG;AACvD,MAAA,IAAI,UAAU,cAAc;AAC9B,WAAO,OAAO,GAAG;AAAA,EAAA,OAEd;AACH,mBAAe,eAAe,IAAI;AAC9B,QAAA,eAAe,UAAU,QAAQ;AACnC,mBAAa,UAAU,OAAO,eAAe,UAAU,MAAM;AAAA,IAC/D;AACA,WAAO,UAAU,MAAM,GAAG,YAAY,IAAI,OAAO,GAAG;AAAA,EACtD;AACF;"}
1
+ {"version":3,"file":"method.es.js","sources":["../../../src/utils/method.ts"],"sourcesContent":["/** Detect free variable `global` from Node.js. */\r\nconst freeGlobal\r\n = typeof global === 'object'\r\n && global !== null\r\n && global.Object === Object\r\n && global\r\n\r\n/** Detect free variable `globalThis` */\r\nconst freeGlobalThis\r\n = typeof globalThis === 'object'\r\n && globalThis !== null\r\n && globalThis.Object == Object\r\n && globalThis\r\n\r\n/** Detect free variable `self`. */\r\nconst freeSelf\r\n = typeof self === 'object' && self !== null && self.Object === Object && self\r\n\r\n/** Used as a reference to the global object. */\r\nexport const root\r\n = freeGlobalThis || freeGlobal || freeSelf || new Function('return this')()\r\n\r\nexport function compareArray(arr1, arr2) {\r\n if (arr1.length !== arr2.length) {\r\n return false\r\n }\r\n for (let i = 0; i < arr1.length; i++) {\r\n if (arr1[i] !== arr2[i]) {\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\nexport function compareObject(object1, object2) {\r\n const o1keys = Object.keys(object1)\r\n const o2keys = Object.keys(object2)\r\n if (o2keys.length !== o1keys.length) return false\r\n for (let i = 0; i <= o1keys.length - 1; i++) {\r\n const key = o1keys[i]\r\n if (!o2keys.includes(key)) return false\r\n if (!compare(object2[key], object1[key])) return false\r\n }\r\n return true\r\n}\r\n\r\nexport function compare(value, other) {\r\n if (value === other) {\r\n return true\r\n }\r\n if (Array.isArray(value) && Array.isArray(other)) {\r\n return compareArray(value, other)\r\n }\r\n if (value instanceof Function || other instanceof Function) {\r\n return false\r\n }\r\n if (value instanceof Object && other instanceof Object) {\r\n return compareObject(value, other)\r\n }\r\n return false\r\n}\r\n\r\nexport function unshiftString(str: string, targetLength: number, addString: string): string {\r\n targetLength = targetLength > 0 ? targetLength : 0\r\n addString = String((typeof addString !== 'undefined' && typeof addString !== 'object') ? addString : ' ')\r\n str = (str === undefined || str === null) ? '' : String(str)\r\n if (str.length >= targetLength) {\r\n return String(str)\r\n }\r\n else {\r\n targetLength = targetLength - str.length\r\n if (targetLength > addString.length) {\r\n addString += addString.repeat(targetLength / addString.length)\r\n }\r\n return addString.slice(0, targetLength) + String(str)\r\n }\r\n}\r\n"],"names":[],"mappings":"AACA,MAAM,aACF,OAAO,WAAW,YACjB,WAAW,QACX,OAAO,WAAW,UAClB;AAGL,MAAM,iBACF,OAAO,eAAe,YACrB,eAAe,QACf,WAAW,UAAU,UACrB;AAGL,MAAM,WACF,OAAO,SAAS,YAAY,SAAS,QAAQ,KAAK,WAAW,UAAU;AAGpE,MAAM,OACT,kBAAkB,cAAc,YAAY,IAAI,SAAS,aAAa,EAAE;AAE5D,SAAA,aAAa,MAAM,MAAM;AACnC,MAAA,KAAK,WAAW,KAAK,QAAQ;AACxB,WAAA;AAAA,EACT;AACA,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,QAAI,KAAK,CAAC,MAAM,KAAK,CAAC,GAAG;AAChB,aAAA;AAAA,IACT;AAAA,EACF;AACO,SAAA;AACT;AAEgB,SAAA,cAAc,SAAS,SAAS;AACxC,QAAA,SAAS,OAAO,KAAK,OAAO;AAC5B,QAAA,SAAS,OAAO,KAAK,OAAO;AAClC,MAAI,OAAO,WAAW,OAAO,OAAe,QAAA;AAC5C,WAAS,IAAI,GAAG,KAAK,OAAO,SAAS,GAAG,KAAK;AACrC,UAAA,MAAM,OAAO,CAAC;AACpB,QAAI,CAAC,OAAO,SAAS,GAAG,EAAU,QAAA;AAC9B,QAAA,CAAC,QAAQ,QAAQ,GAAG,GAAG,QAAQ,GAAG,CAAC,EAAU,QAAA;AAAA,EACnD;AACO,SAAA;AACT;AAEgB,SAAA,QAAQ,OAAO,OAAO;AACpC,MAAI,UAAU,OAAO;AACZ,WAAA;AAAA,EACT;AACA,MAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,QAAQ,KAAK,GAAG;AACzC,WAAA,aAAa,OAAO,KAAK;AAAA,EAClC;AACI,MAAA,iBAAiB,YAAY,iBAAiB,UAAU;AACnD,WAAA;AAAA,EACT;AACI,MAAA,iBAAiB,UAAU,iBAAiB,QAAQ;AAC/C,WAAA,cAAc,OAAO,KAAK;AAAA,EACnC;AACO,SAAA;AACT;AAEgB,SAAA,cAAc,KAAa,cAAsB,WAA2B;AAC3E,iBAAA,eAAe,IAAI,eAAe;AACrC,cAAA,OAAQ,OAAO,cAAc,eAAe,OAAO,cAAc,WAAY,YAAY,GAAG;AACxG,QAAO,QAAQ,UAAa,QAAQ,OAAQ,KAAK,OAAO,GAAG;AACvD,MAAA,IAAI,UAAU,cAAc;AAC9B,WAAO,OAAO,GAAG;AAAA,EAAA,OAEd;AACH,mBAAe,eAAe,IAAI;AAC9B,QAAA,eAAe,UAAU,QAAQ;AACnC,mBAAa,UAAU,OAAO,eAAe,UAAU,MAAM;AAAA,IAC/D;AACA,WAAO,UAAU,MAAM,GAAG,YAAY,IAAI,OAAO,GAAG;AAAA,EACtD;AACF;"}
@@ -3,8 +3,12 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const enUs = require("./i18n/en-us.cjs.js");
4
4
  const zhCn = require("./i18n/zh-cn.cjs.js");
5
5
  const BIG_DELTA_LIMIT = 2e3;
6
- const localLang = localStorage.getItem("lang") || "zh-cn";
7
- const LANG_CONF = localLang === "en-us" ? enUs.EN_US : zhCn.ZH_CN;
6
+ const LANG_CONF = {
7
+ "en-US": enUs.EN_US,
8
+ "zh-CN": zhCn.ZH_CN
9
+ };
10
+ const CHANGE_LANGUAGE_EVENT = "change-language";
11
+ const defaultLanguage = "en-US";
8
12
  const IMAGE_UPLOADER_MIME_TYPES = [
9
13
  "image/png",
10
14
  "image/jpeg",
@@ -75,6 +79,7 @@ const FILE_UPLOADER_MIME_TYPES = [
75
79
  ];
76
80
  exports.AUDIO_VIDEO_UPLOADER_MIME_TYPES = AUDIO_VIDEO_UPLOADER_MIME_TYPES;
77
81
  exports.BIG_DELTA_LIMIT = BIG_DELTA_LIMIT;
82
+ exports.CHANGE_LANGUAGE_EVENT = CHANGE_LANGUAGE_EVENT;
78
83
  exports.COMPRESSED_UPLOADER_MIME_TYPES = COMPRESSED_UPLOADER_MIME_TYPES;
79
84
  exports.DOC_UPLOADER_MIME_TYPES = DOC_UPLOADER_MIME_TYPES;
80
85
  exports.FILE_UPLOADER_MIME_TYPES = FILE_UPLOADER_MIME_TYPES;
@@ -83,4 +88,5 @@ exports.LANG_CONF = LANG_CONF;
83
88
  exports.OTHER_FILE_UPLOADER_MIME_TYPES = OTHER_FILE_UPLOADER_MIME_TYPES;
84
89
  exports.PPT_UPLOADER_MIME_TYPES = PPT_UPLOADER_MIME_TYPES;
85
90
  exports.XSL_UPLOADER_MIME_TYPES = XSL_UPLOADER_MIME_TYPES;
91
+ exports.defaultLanguage = defaultLanguage;
86
92
  //# sourceMappingURL=editor.config.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"editor.config.cjs.js","sources":["../../../src/config/editor.config.ts"],"sourcesContent":["import { EN_US } from './i18n/en-us'\r\nimport { ZH_CN } from './i18n/zh-cn'\r\n\r\n// Delta数据行太多超出该限制时,加载会比较慢,需要提示用户\r\nexport const BIG_DELTA_LIMIT = 2000\r\nconst localLang = localStorage.getItem('lang') || 'zh-cn'\r\nexport const LANG_CONF = localLang === 'en-us' ? EN_US : ZH_CN\r\n\r\n// Image\r\nexport const IMAGE_UPLOADER_MIME_TYPES = [\r\n 'image/png',\r\n 'image/jpeg',\r\n 'image/gif',\r\n 'image/svg+xml',\r\n]\r\n\r\n// 常用文件格式\r\nexport const OTHER_FILE_UPLOADER_MIME_TYPES = [\r\n 'text/plain',\r\n 'application/json',\r\n 'application/pdf',\r\n]\r\n\r\nexport const AUDIO_VIDEO_UPLOADER_MIME_TYPES = [\r\n 'audio/wave',\r\n 'audio/wav',\r\n 'audio/x-wav',\r\n 'audio/x-pn-wav',\r\n 'audio/mpeg',\r\n 'video/mpeg',\r\n 'video/x-msvideo',\r\n]\r\n\r\n// MS office\r\nexport const DOC_UPLOADER_MIME_TYPES = [\r\n 'application/msword',\r\n 'application/msword',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\r\n 'application/vnd.ms-word.document.macroEnabled.12',\r\n 'application/vnd.ms-word.template.macroEnabled.12',\r\n]\r\n\r\nexport const XSL_UPLOADER_MIME_TYPES = [\r\n 'application/vnd.ms-excel',\r\n 'application/vnd.ms-excel',\r\n 'application/vnd.ms-excel',\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\r\n 'application/vnd.ms-excel.sheet.macroEnabled.12',\r\n 'application/vnd.ms-excel.template.macroEnabled.12',\r\n 'application/vnd.ms-excel.addin.macroEnabled.12',\r\n 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\r\n]\r\n\r\nexport const PPT_UPLOADER_MIME_TYPES = [\r\n 'application/vnd.ms-powerpoint',\r\n 'application/vnd.ms-powerpoint',\r\n 'application/vnd.ms-powerpoint',\r\n 'application/vnd.ms-powerpoint',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.template',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\r\n 'application/vnd.ms-powerpoint.addin.macroEnabled.12',\r\n 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\r\n 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\r\n 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',\r\n]\r\n\r\n// Compressed files\r\nexport const COMPRESSED_UPLOADER_MIME_TYPES = [\r\n 'application/x-tar',\r\n 'application/x-zip-compressed',\r\n 'application/zip-compressed',\r\n 'application/gzip',\r\n '.rar',\r\n '.7z',\r\n]\r\n\r\n// default\r\nexport const FILE_UPLOADER_MIME_TYPES = [\r\n ...OTHER_FILE_UPLOADER_MIME_TYPES,\r\n ...AUDIO_VIDEO_UPLOADER_MIME_TYPES,\r\n ...DOC_UPLOADER_MIME_TYPES,\r\n ...XSL_UPLOADER_MIME_TYPES,\r\n ...PPT_UPLOADER_MIME_TYPES,\r\n ...COMPRESSED_UPLOADER_MIME_TYPES,\r\n]\r\n"],"names":["EN_US","ZH_CN"],"mappings":";;;;AAIO,MAAM,kBAAkB;AAC/B,MAAM,YAAY,aAAa,QAAQ,MAAM,KAAK;AACrC,MAAA,YAAY,cAAc,UAAUA,KAAAA,QAAQC,KAAA;AAGlD,MAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,iCAAiC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,kCAAkC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,iCAAiC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,2BAA2B;AAAA,EACtC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;;;;;;;;;;;"}
1
+ {"version":3,"file":"editor.config.cjs.js","sources":["../../../src/config/editor.config.ts"],"sourcesContent":["import { EN_US } from './i18n/en-us'\r\nimport { ZH_CN } from './i18n/zh-cn'\r\n\r\n// Delta数据行太多超出该限制时,加载会比较慢,需要提示用户\r\nexport const BIG_DELTA_LIMIT = 2000\r\nexport const LANG_CONF = {\r\n 'en-US': EN_US,\r\n 'zh-CN': ZH_CN,\r\n}\r\nexport const CHANGE_LANGUAGE_EVENT = 'change-language'\r\nexport const defaultLanguage = 'en-US'\r\n\r\n// Image\r\nexport const IMAGE_UPLOADER_MIME_TYPES = [\r\n 'image/png',\r\n 'image/jpeg',\r\n 'image/gif',\r\n 'image/svg+xml',\r\n]\r\n\r\n// 常用文件格式\r\nexport const OTHER_FILE_UPLOADER_MIME_TYPES = [\r\n 'text/plain',\r\n 'application/json',\r\n 'application/pdf',\r\n]\r\n\r\nexport const AUDIO_VIDEO_UPLOADER_MIME_TYPES = [\r\n 'audio/wave',\r\n 'audio/wav',\r\n 'audio/x-wav',\r\n 'audio/x-pn-wav',\r\n 'audio/mpeg',\r\n 'video/mpeg',\r\n 'video/x-msvideo',\r\n]\r\n\r\n// MS office\r\nexport const DOC_UPLOADER_MIME_TYPES = [\r\n 'application/msword',\r\n 'application/msword',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\r\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',\r\n 'application/vnd.ms-word.document.macroEnabled.12',\r\n 'application/vnd.ms-word.template.macroEnabled.12',\r\n]\r\n\r\nexport const XSL_UPLOADER_MIME_TYPES = [\r\n 'application/vnd.ms-excel',\r\n 'application/vnd.ms-excel',\r\n 'application/vnd.ms-excel',\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\r\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',\r\n 'application/vnd.ms-excel.sheet.macroEnabled.12',\r\n 'application/vnd.ms-excel.template.macroEnabled.12',\r\n 'application/vnd.ms-excel.addin.macroEnabled.12',\r\n 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',\r\n]\r\n\r\nexport const PPT_UPLOADER_MIME_TYPES = [\r\n 'application/vnd.ms-powerpoint',\r\n 'application/vnd.ms-powerpoint',\r\n 'application/vnd.ms-powerpoint',\r\n 'application/vnd.ms-powerpoint',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.presentation',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.template',\r\n 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',\r\n 'application/vnd.ms-powerpoint.addin.macroEnabled.12',\r\n 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\r\n 'application/vnd.ms-powerpoint.presentation.macroEnabled.12',\r\n 'application/vnd.ms-powerpoint.slideshow.macroEnabled.12',\r\n]\r\n\r\n// Compressed files\r\nexport const COMPRESSED_UPLOADER_MIME_TYPES = [\r\n 'application/x-tar',\r\n 'application/x-zip-compressed',\r\n 'application/zip-compressed',\r\n 'application/gzip',\r\n '.rar',\r\n '.7z',\r\n]\r\n\r\n// default\r\nexport const FILE_UPLOADER_MIME_TYPES = [\r\n ...OTHER_FILE_UPLOADER_MIME_TYPES,\r\n ...AUDIO_VIDEO_UPLOADER_MIME_TYPES,\r\n ...DOC_UPLOADER_MIME_TYPES,\r\n ...XSL_UPLOADER_MIME_TYPES,\r\n ...PPT_UPLOADER_MIME_TYPES,\r\n ...COMPRESSED_UPLOADER_MIME_TYPES,\r\n]\r\n"],"names":["EN_US","ZH_CN"],"mappings":";;;;AAIO,MAAM,kBAAkB;AACxB,MAAM,YAAY;AAAA,EACvB,SAASA,KAAA;AAAA,EACT,SAASC,KAAA;AACX;AACO,MAAM,wBAAwB;AAC9B,MAAM,kBAAkB;AAGxB,MAAM,4BAA4B;AAAA,EACvC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,iCAAiC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,kCAAkC;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,MAAM,0BAA0B;AAAA,EACrC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,iCAAiC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGO,MAAM,2BAA2B;AAAA,EACtC,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;;;;;;;;;;;;;"}