{"version":3,"file":"index.mjs","sources":["../src/locale/index.ts","../src/locale/en.ts","../src/locale/zh-CN.ts","../src/module/elem-to-html.ts","../src/constants/svg.ts","../src/utils/options.ts","../src/utils/is-of-type.ts","../src/utils/has-common.ts","../src/utils/matrices.ts","../src/utils/point.ts","../src/utils/dom.ts","../src/module/weak-maps.ts","../src/module/menu/TableProperty.ts","../src/module/menu/CellProperty.ts","../src/module/menu/DeleteCol.ts","../src/module/menu/DeleteRow.ts","../src/module/menu/DeleteTable.ts","../src/module/menu/FullWidth.ts","../src/module/helpers.ts","../src/module/menu/InsertCol.ts","../src/module/menu/InsertRow.ts","../src/module/menu/InsertTable.ts","../src/module/table-cursor.ts","../src/module/menu/MergeCell.ts","../src/module/menu/SplitCell.ts","../src/module/menu/TableHeader.ts","../src/module/menu/index.ts","../src/module/parse-elem-html.ts","../src/module/parse-style-html.ts","../src/module/plugin.ts","../src/module/pre-parse-html.ts","../src/module/column-resize.ts","../src/module/row-resize.ts","../src/module/render-elem/index.ts","../src/module/render-elem/render-table.tsx","../src/module/render-elem/render-row.tsx","../src/module/render-elem/render-cell.tsx","../src/utils/vdom.ts","../src/module/style-to-html.ts","../src/module/index.ts","../src/module/render-style.ts","../src/module/with-selection.ts"],"sourcesContent":["/**\n * @description i18n entry\n * @author wangfupeng\n */\n\nimport { i18nAddResources } from '@wangeditor-next/core'\n\nimport enResources from './en'\nimport zhResources from './zh-CN'\n\ni18nAddResources('en', enResources)\ni18nAddResources('zh-CN', zhResources)\n","/**\n * @description i18n en\n * @author wangfupeng\n */\n\nexport default {\n  tableModule: {\n    modal: {\n      border: 'Border',\n      borderColor: 'Border color',\n      borderWidth: 'Width',\n      bgColor: 'Back color',\n      align: 'Text Align',\n      ok: 'OK',\n    },\n    color: {\n      default: 'Default color',\n      clear: 'Clear back color',\n    },\n    borderStyle: {\n      none: 'None',\n      solid: 'Solid',\n      dotted: 'Dotted',\n      dashed: 'Dashed',\n      double: 'Double',\n      groove: 'Groove',\n      ridge: 'Ridge',\n      inset: 'Inset',\n      outset: 'Outset',\n    },\n    deleteCol: 'Delete column',\n    deleteRow: 'Delete row',\n    deleteTable: 'Delete table',\n    widthAuto: 'Fit width',\n    insertCol: 'Insert column',\n    insertRow: 'Insert row',\n    insertTable: 'Insert table',\n    header: 'Header',\n    mergeCell: 'merge cell',\n    splitCell: 'split cell',\n    tableProperty: 'Table property',\n    cellProperty: 'Cell property',\n  },\n}\n","/**\n * @description i18n zh-CN\n * @author wangfupeng\n */\n\nexport default {\n  tableModule: {\n    modal: {\n      border: '边框',\n      borderColor: '边框颜色',\n      borderWidth: '宽度',\n      bgColor: '背景色',\n      align: '对齐方式',\n      ok: '确定',\n    },\n    color: {\n      default: '默认颜色',\n      clear: '清除背景色',\n    },\n    borderStyle: {\n      none: '无样式',\n      solid: '实线',\n      dotted: '点状虚线',\n      dashed: '虚线',\n      double: '双线',\n      groove: '凹槽边框',\n      ridge: '菱形边框',\n      inset: '凹边框',\n      outset: '凸边框',\n    },\n    deleteCol: '删除列',\n    deleteRow: '删除行',\n    deleteTable: '删除表格',\n    widthAuto: '适应宽度',\n    insertCol: '插入列',\n    insertRow: '插入行',\n    insertTable: '插入表格',\n    header: '表头',\n    mergeCell: '合并单元格',\n    splitCell: '拆分单元格',\n    tableProperty: '表格属性',\n    cellProperty: '单元格属性',\n  },\n}\n","/**\n * @description to html\n * @author wangfupeng\n */\n\nimport { getTextStyleMode, IDomEditor } from '@wangeditor-next/core'\nimport { Element } from 'slate'\n\nimport { TableCellElement, TableElement, TableRowElement } from './custom-types'\n\ntype TableWidthExportMode = 'adaptive' | 'explicit'\n\nfunction escapeHtml(raw: string): string {\n  return raw\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#39;')\n}\n\nfunction getTableWidthExportMode(editor?: IDomEditor): TableWidthExportMode {\n  if (!editor || typeof editor.getMenuConfig !== 'function') {\n    return 'explicit'\n  }\n\n  const menuConf = editor.getMenuConfig('insertTable') as { widthExportMode?: TableWidthExportMode }\n\n  return menuConf?.widthExportMode === 'explicit' ? 'explicit' : 'adaptive'\n}\n\nfunction getExportTableWidth(tableNode: TableElement, editor?: IDomEditor): string {\n  const { width = 'auto', columnWidths = [] } = tableNode\n\n  if (width && width !== 'auto') {\n    return width\n  }\n\n  const widthExportMode = getTableWidthExportMode(editor)\n\n  // In adaptive mode, keep imported or generated auto-width tables as auto\n  // and only persist explicit fixed widths when width is not auto.\n  if (widthExportMode === 'adaptive') {\n    return 'auto'\n  }\n\n  const totalWidth = columnWidths.reduce((sum, columnWidth) => {\n    if (!Number.isFinite(columnWidth)) { return sum }\n    if (columnWidth <= 0) { return sum }\n    return sum + columnWidth\n  }, 0)\n\n  if (totalWidth > 0) {\n    return `${totalWidth}px`\n  }\n\n  return 'auto'\n}\n\nfunction tableToHtml(elemNode: Element, childrenHtml: string, editor?: IDomEditor): string {\n  const tableNode = elemNode as TableElement\n  const { columnWidths, caption, height = 'auto' } = tableNode\n  const cols = columnWidths\n    ?.map(colWidth => {\n      return `<col width=${colWidth}></col>`\n    })\n    .join('')\n\n  const captionStr = caption ? `<caption>${escapeHtml(caption)}</caption>` : ''\n  const colgroupStr = cols ? `<colgroup contentEditable=\"false\">${cols}</colgroup>` : ''\n  const exportedWidth = getExportTableWidth(tableNode, editor)\n  const textStyleMode = getTextStyleMode(editor)\n\n  if (textStyleMode === 'class') {\n    const widthAttr = exportedWidth ? ` width=\"${exportedWidth}\"` : ''\n    const heightValue = String(height || '').trim()\n    const heightAttr = heightValue && heightValue !== 'auto' ? ` height=\"${heightValue}\"` : ''\n    const heightDataAttr = heightValue ? ` data-w-e-table-height=\"${heightValue}\"` : ''\n\n    return `<table class=\"w-e-table-layout-fixed\"${widthAttr}${heightAttr}${heightDataAttr}>${captionStr}${colgroupStr}<tbody>${childrenHtml}</tbody></table>`\n  }\n\n  return `<table style=\"width: ${exportedWidth};table-layout: fixed;height:${height}\">${captionStr}${colgroupStr}<tbody>${childrenHtml}</tbody></table>`\n}\n\nfunction tableRowToHtml(elem: Element, childrenHtml: string, editor?: IDomEditor): string {\n  const { height } = elem as TableRowElement\n  const textStyleMode = getTextStyleMode(editor)\n\n  if (textStyleMode === 'class') {\n    if (height) {\n      return `<tr height=\"${height}\" data-w-e-row-height=\"${height}px\">${childrenHtml}</tr>`\n    }\n    return `<tr>${childrenHtml}</tr>`\n  }\n\n  const heightStyle = height ? ` style=\"height: ${height}px\"` : ''\n\n  return `<tr${heightStyle}>${childrenHtml}</tr>`\n}\n\nfunction tableCellToHtml(cellNode: Element, childrenHtml: string): string {\n  const {\n    colSpan = 1,\n    rowSpan = 1,\n    isHeader = false,\n    width = 'auto',\n    hidden = false,\n  } = cellNode as TableCellElement\n\n  // 如果单元格被隐藏，直接返回空字符串，不生成 HTML 元素\n  if (hidden) {\n    return ''\n  }\n\n  const tag = isHeader ? 'th' : 'td'\n\n  return `<${tag} colSpan=\"${colSpan}\" rowSpan=\"${rowSpan}\" width=\"${width}\">${childrenHtml}</${tag}>`\n}\n\nexport const tableToHtmlConf = {\n  type: 'table',\n  elemToHtml: tableToHtml,\n}\n\nexport const tableRowToHtmlConf = {\n  type: 'table-row',\n  elemToHtml: tableRowToHtml,\n}\n\nexport const tableCellToHtmlConf = {\n  type: 'table-cell',\n  elemToHtml: tableCellToHtml,\n}\n","/**\n * @description icon svg\n * @author wangfupeng\n */\n\n/**\n * 【注意】svg 字符串的长度 ，否则会导致代码体积过大\n * 尽量选择 https://www.iconfont.cn/collections/detail?spm=a313x.7781069.0.da5a778a4&cid=20293\n * 找不到再从 iconfont.com 搜索\n */\n\n// 表格\nexport const TABLE_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M0 64v896h1024V64H0z m384 576v-192h256v192h-256z m256 64v192h-256v-192h256z m0-512v192h-256V192h256zM320 192v192H64V192h256z m-256 256h256v192H64v-192z m640 0h256v192h-256v-192z m0-64V192h256v192h-256zM64 704h256v192H64v-192z m640 192v-192h256v192h-256z\"></path></svg>'\n\n// 垃圾桶（删除）\nexport const TRASH_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M826.8032 356.5312c-19.328 0-36.3776 15.6928-36.3776 35.0464v524.2624c0 19.328-16 34.56-35.328 34.56H264.9344c-19.328 0-35.5072-15.3088-35.5072-34.56V390.0416c0-19.328-14.1568-35.0464-33.5104-35.0464s-33.5104 15.6928-33.5104 35.0464V915.712c0 57.9328 44.6208 108.288 102.528 108.288H755.2c57.9328 0 108.0832-50.4576 108.0832-108.288V391.4752c-0.1024-19.2512-17.1264-34.944-36.48-34.944z\" p-id=\"9577\"></path><path d=\"M437.1712 775.7568V390.6048c0-19.328-14.1568-35.0464-33.5104-35.0464s-33.5104 15.616-33.5104 35.0464v385.152c0 19.328 14.1568 35.0464 33.5104 35.0464s33.5104-15.7184 33.5104-35.0464zM649.7024 775.7568V390.6048c0-19.328-17.0496-35.0464-36.3776-35.0464s-36.3776 15.616-36.3776 35.0464v385.152c0 19.328 17.0496 35.0464 36.3776 35.0464s36.3776-15.7184 36.3776-35.0464zM965.0432 217.0368h-174.6176V145.5104c0-57.9328-47.2064-101.76-104.6528-101.76h-350.976c-57.8304 0-105.3952 43.8528-105.3952 101.76v71.5264H54.784c-19.4304 0-35.0464 14.1568-35.0464 33.5104 0 19.328 15.616 33.5104 35.0464 33.5104h910.3616c19.328 0 35.0464-14.1568 35.0464-33.5104 0-19.3536-15.6928-33.5104-35.1488-33.5104z m-247.3728 0H297.3952V145.5104c0-19.328 18.2016-34.7648 37.4272-34.7648h350.976c19.1488 0 31.872 15.1296 31.872 34.7648v71.5264z\"></path></svg>'\n\n// 表格 添加行\nexport const ADD_ROW_SVG = '<svg viewBox=\"0 0 1048 1024\"><path d=\"M707.7888 521.0112h-147.456v-147.456H488.2432v147.456h-147.456v68.8128h147.456v147.456h72.0896v-147.456h147.456zM0 917.504V0h1048.576v917.504H0zM327.68 65.536H65.536v196.608H327.68V65.536z m327.68 0H393.216v196.608h262.144V65.536z m327.68 0h-262.144v196.608h262.144V65.536z m0 258.8672H65.536v462.0288H983.04V324.4032z\"></path></svg>'\n\n// 表格 删除行\nexport const DEL_ROW_SVG = '<svg viewBox=\"0 0 1048 1024\"><path d=\"M907.6736 586.5472L747.1104 425.984l163.84-163.84-78.6432-78.6432-163.84 163.84L507.904 186.7776 429.2608 262.144l163.84 163.84-167.1168 167.1168 78.6432 78.6432 167.1168-167.1168 160.5632 160.5632 75.3664-78.6432zM0 917.504V0h1048.576v917.504H0z m983.04-327.68h-22.9376l-65.536-65.536H983.04V327.68h-91.7504l65.536-65.536h26.2144V65.536H65.536v196.608h317.8496l65.536 65.536H65.536v196.608h380.1088l-65.536 65.536H65.536v196.608H983.04v-196.608z\"></path></svg>'\n\n// 表格 添加列\nexport const ADD_COL_SVG = '<svg viewBox=\"0 0 1048 1024\"><path d=\"M327.68 193.3312v186.7776H140.9024v91.7504H327.68v186.7776h88.4736V471.8592h190.0544V380.1088H416.1536V193.3312zM0 917.504V0h1048.576v917.504H0zM655.36 65.536H65.536v720.896H655.36V65.536z m327.68 0h-262.144v196.608h262.144V65.536z m0 262.144h-262.144v196.608h262.144V327.68z m0 262.144h-262.144v196.608h262.144v-196.608z\"></path></svg>'\n\n// 表格 删除列\nexport const DEL_COL_SVG = '<svg viewBox=\"0 0 1048 1024\"><path d=\"M327.68 510.976L393.216 445.44v-13.1072L327.68 366.7968V510.976z m327.68-78.4384l65.536-65.536V507.904L655.36 442.368v-9.8304z m393.216 484.9664V0H0v917.504h1048.576z m-65.536-131.072h-262.144v-52.4288l-13.1072 13.1072-52.4288-52.4288v91.7504H393.216v-91.7504l-52.4288 52.4288-13.1072-13.1072v52.4288H65.536V65.536H327.68v121.2416l36.0448-36.0448 29.4912 29.4912V62.2592h262.144V180.224l49.152-49.152 16.384 16.384V62.2592h262.144V786.432z m-294.912-108.1344l-160.5632-160.5632-167.1168 167.1168-78.6432-78.6432 167.1168-167.1168L288.3584 278.528l78.6432-78.6432 160.5632 160.5632 163.84-163.84 78.6432 78.6432-163.84 163.84 160.5632 160.5632-78.6432 78.6432z\"></path></svg>'\n\n// 表头\nexport const TABLE_HEADER_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M704 128l-64 0L384 128 320 128 0 128l0 256 0 64 0 192 0 64 0 256 320 0 64 0 256 0 64 0 320 0 0-256 0-64L1024 448 1024 384 1024 128 704 128zM640 640 384 640 384 448l256 0L640 640zM64 448l256 0 0 192L64 640 64 448zM320 896 64 896l0-192 256 0L320 896zM640 896 384 896l0-192 256 0L640 896zM960 896l-256 0 0-192 256 0L960 896zM960 640l-256 0L704 448l256 0L960 640z\"></path></svg>'\n\n// 宽度\nexport const FULL_WIDTH_SVG = '<svg viewBox=\"0 0 1228 1024\"><path d=\"M862.514337 563.200461H404.581995v121.753478a13.311987 13.311987 0 0 1-6.655993 11.468789 10.23999 10.23999 0 0 1-12.083188-1.433599l-204.799795-179.199821a13.721586 13.721586 0 0 1 0-20.479979l204.799795-179.302221a10.23999 10.23999 0 0 1 12.185588-1.535998 13.209587 13.209587 0 0 1 6.553593 11.673588v115.097485h457.932342V319.693504a11.571188 11.571188 0 0 1 18.841582-10.239989l204.799795 179.19982a13.721586 13.721586 0 0 1 0 20.47998l-204.799795 179.199821a10.23999 10.23999 0 0 1-12.185588 1.535998 13.311987 13.311987 0 0 1-6.655994-11.571188V563.200461zM136.499064 14.951409v993.893406a15.257585 15.257585 0 0 1-15.155185 15.052785H15.155185A15.155185 15.155185 0 0 1 0 1008.844815V14.951409a15.257585 15.257585 0 0 1 15.155185-15.052785h106.086294a15.155185 15.155185 0 0 1 15.257585 15.155185zM1228.798771 14.951409v993.893406a15.257585 15.257585 0 0 1-15.155185 15.052785h-106.188693a15.155185 15.155185 0 0 1-15.155185-15.052785V14.951409a15.257585 15.257585 0 0 1 15.155185-15.052785h106.086293A15.155185 15.155185 0 0 1 1228.798771 15.053809z\"></path></svg>'\n\n// 合并单元格\nexport const MERGE_CELL_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M482.2 508.4 331.3 389c-3-2.4-7.3-.2-7.3 3.6V478H184V184h204v128c0 2.2 1.8 4 4 4h60c2.2 0 4-1.8 4-4V144c0-15.5-12.5-28-28-28H144c-15.5 0-28 12.5-28 28v736c0 15.5 12.5 28 28 28h284c15.5 0 28-12.5 28-28V712c0-2.2-1.8-4-4-4h-60c-2.2 0-4 1.8-4 4v128H184V546h140v85.4c0 3.8 4.4 6 7.3 3.6l150.9-119.4c2.4-1.8 2.4-5.4 0-7.2zM880 116H596c-15.5 0-28 12.5-28 28v168c0 2.2 1.8 4 4 4h60c2.2 0 4-1.8 4-4V184h204v294H700v-85.4c0-3.8-4.3-6-7.3-3.6l-151 119.4c-2.3 1.8-2.3 5.3 0 7.1l151 119.5c2.9 2.3 7.3.2 7.3-3.6V546h140v294H636V712c0-2.2-1.8-4-4-4h-60c-2.2 0-4 1.8-4 4v168c0 15.5 12.5 28 28 28h284c15.5 0 28-12.5 28-28V144c0-15.5-12.5-28-28-28z\"/></svg>'\n\n// 拆分单元格\nexport const SPLIT_CELL_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M362.667 494.933v53.334l25.6-25.6zm0-241.066L460.8 352V78.933H57.6v98.134h305.067zm0 535.466v57.6H57.6v98.134h403.2V691.2zM661.333 494.933v53.334l-25.6-25.6zm0-241.066L563.2 352V78.933h403.2v98.134H661.333zm0 535.466v57.6H966.4v98.134H563.2V691.2z\"/><path d=\"M753.067 341.333 693.333 281.6 512 460.8 330.667 281.6l-59.734 59.733 181.334 181.334L270.933 704l59.734 59.733L512 582.4l181.333 181.333L753.067 704 571.733 522.667z\"/></svg>'\n\n// 表格属性\nexport const TABLE_PROPERTY_SVG = '<svg viewBox=\"0 0 20 20\"><path d=\"M8 2v5h4V2h1v5h5v1h-5v4h.021l-.172.351-1.916.28-.151.027c-.287.063-.54.182-.755.341L8 13v5H7v-5H2v-1h5V8H2V7h5V2h1zm4 6H8v4h4V8z\" opacity=\".6\"/><path d=\"m15.5 11.5 1.323 2.68 2.957.43-2.14 2.085.505 2.946L15.5 18.25l-2.645 1.39.505-2.945-2.14-2.086 2.957-.43L15.5 11.5zM17 1a2 2 0 0 1 2 2v9.475l-.85-.124-.857-1.736a2.048 2.048 0 0 0-.292-.44L17 3H3v14h7.808l.402.392L10.935 19H3a2 2 0 0 1-2-2V3a2 2 0 0 1 2-2h14z\"/></svg>'\n\n// 单元格属性\nexport const CELL_PROPERTY_SVG = '<svg viewBox=\"0 0 20 20\"><path d=\"m11.105 18-.17 1H2.5A1.5 1.5 0 0 1 1 17.5v-15A1.5 1.5 0 0 1 2.5 1h15A1.5 1.5 0 0 1 19 2.5v9.975l-.85-.124-.15-.302V8h-5v4h.021l-.172.351-1.916.28-.151.027c-.287.063-.54.182-.755.341L8 13v5h3.105zM2 12h5V8H2v4zm10-4H8v4h4V8zM2 2v5h5V2H2zm0 16h5v-5H2v5zM13 7h5V2h-5v5zM8 2v5h4V2H8z\" opacity=\".6\"/><path d=\"m15.5 11.5 1.323 2.68 2.957.43-2.14 2.085.505 2.946L15.5 18.25l-2.645 1.39.505-2.945-2.14-2.086 2.957-.43L15.5 11.5zM13 6a1 1 0 0 1 1 1v3.172a2.047 2.047 0 0 0-.293.443l-.858 1.736-1.916.28-.151.027A1.976 1.976 0 0 0 9.315 14H7a1 1 0 0 1-1-1V7a1 1 0 0 1 1-1h6zm-1 2H8v4h4V8z\"/></svg>'\n\n// 左对齐\nexport const JUSTIFY_LEFT_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M768 793.6v102.4H51.2v-102.4h716.8z m204.8-230.4v102.4H51.2v-102.4h921.6z m-204.8-230.4v102.4H51.2v-102.4h716.8zM972.8 102.4v102.4H51.2V102.4h921.6z\"></path></svg>'\n\n// 右对齐\nexport const JUSTIFY_RIGHT_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M972.8 793.6v102.4H256v-102.4h716.8z m0-230.4v102.4H51.2v-102.4h921.6z m0-230.4v102.4H256v-102.4h716.8zM972.8 102.4v102.4H51.2V102.4h921.6z\"></path></svg>'\n\n// 居中对齐\nexport const JUSTIFY_CENTER_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M870.4 793.6v102.4H153.6v-102.4h716.8z m102.4-230.4v102.4H51.2v-102.4h921.6z m-102.4-230.4v102.4H153.6v-102.4h716.8zM972.8 102.4v102.4H51.2V102.4h921.6z\"></path></svg>'\n\n// 两端对齐\nexport const JUSTIFY_JUSTIFY_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M0 64h1024v128H0z m0 192h1024v128H0z m0 192h1024v128H0z m0 192h1024v128H0z m0 192h1024v128H0z\"></path></svg>'\n\n// 清空（颜色）\nexport const CLEAN_SVG = '<svg viewBox=\"0 0 1024 1024\"><path d=\"M236.8 128L896 787.2V128H236.8z m614.4 704L192 172.8V832h659.2zM192 64h704c38.4 0 64 25.6 64 64v704c0 38.4-25.6 64-64 64H192c-38.4 0-64-25.6-64-64V128c0-38.4 25.6-64 64-64z\"></path></svg>'\n","import { CustomTypes, ExtendedType } from 'slate'\n\ntype ElementType = ExtendedType<'Element', CustomTypes>['type']\n\nexport interface WithTableOptions {\n  blocks: {\n    td: ElementType\n    th: ElementType\n    content: ElementType\n    tr: ElementType\n    table: ElementType\n    tbody: ElementType\n    tfoot: ElementType\n    thead: ElementType\n  }\n}\n\nexport const DEFAULT_WITH_TABLE_OPTIONS = {\n  blocks: {\n    td: 'table-cell',\n    th: 'table-cell',\n    content: 'paragraph',\n    tr: 'table-row',\n    table: 'table',\n    tbody: 'table-body',\n    // tfoot: \"table-footer\",\n    // thead: \"table-head\",\n  },\n}\n","import {\n  Editor, Element, Node, NodeMatch,\n} from 'slate'\n\nimport { DEFAULT_WITH_TABLE_OPTIONS, WithTableOptions } from './options'\nimport { WithType } from './types'\n\nexport function isElement<T extends Element>(node: Node): node is WithType<T> {\n  return !Editor.isEditor(node) && Element.isElement(node) && 'type' in node\n}\n\n/** @returns a `NodeMatch` function which is used to match the elements of a specific `type`. */\nexport function isOfType<T extends WithType<Element>>(\n  editor: Editor,\n  ...types: Array<keyof WithTableOptions['blocks']>\n): NodeMatch<T> {\n  const options = DEFAULT_WITH_TABLE_OPTIONS\n  const elementTypes = types.map(type => options?.blocks?.[type])\n\n  return (node: Node): boolean => isElement(node) && elementTypes.includes(node.type)\n}\n","import { Editor, Node, Span } from 'slate'\n\nimport { isOfType } from './is-of-type'\nimport { WithTableOptions } from './options'\n\n/**\n * Determines whether two paths belong to the same types by checking\n * if they share a common ancestor node of type table\n */\nexport function hasCommon(\n  editor: Editor,\n  [path, another]: Span,\n  ...types: Array<keyof WithTableOptions['blocks']>\n) {\n  const [node, commonPath] = Node.common(editor, path, another)\n\n  if (isOfType(editor, ...types)(node, commonPath)) {\n    return true\n  }\n\n  // Warning: returns the common ancestor but will return `undefined` if the\n  // `commonPath` is equal to the specified types path\n  return !!Editor.above(editor, {\n    match: isOfType(editor, ...types),\n    at: commonPath,\n  })\n}\n","import { Editor, Location, NodeEntry } from 'slate'\n\nimport { isOfType } from './is-of-type'\nimport { CellElement, NodeEntryWithContext } from './types'\n\n/** Generates a matrix for each table section (`thead`, `tbody`, `tfoot`) */\nexport function* matrices(\n  editor: Editor,\n  options: { at?: Location } = {},\n): Generator<NodeEntry<CellElement>[][]> {\n  const [table] = Editor.nodes(editor, {\n    match: isOfType(editor, 'table'),\n    at: options.at,\n  })\n\n  if (!table) {\n    return []\n  }\n\n  const [, tablePath] = table\n\n  for (const [, path] of Editor.nodes(editor, {\n    // match: isOfType(editor, \"thead\", \"tbody\", \"tfoot\"),\n    match: isOfType(editor, 'table'),\n    at: tablePath,\n  })) {\n    const matrix: NodeEntry<CellElement>[][] = []\n\n    for (const [, trPath] of Editor.nodes(editor, {\n      match: isOfType(editor, 'tr'),\n      at: path,\n    })) {\n      matrix.push([\n        ...Editor.nodes<CellElement>(editor, {\n          match: isOfType(editor, 'th', 'td'),\n          at: trPath,\n        }),\n      ])\n    }\n\n    yield matrix\n  }\n}\n\nexport function filledMatrix(\n  editor: Editor,\n  options: { at?: Location } = {},\n): NodeEntryWithContext[][] {\n  const filled: NodeEntryWithContext[][] = []\n\n  // Expand each section separately to avoid sections collapsing into each other.\n  for (const matrix of matrices(editor, { at: options.at })) {\n    const filledSection: NodeEntryWithContext[][] = []\n\n    // 首先，找出最大的列数来确定矩阵的宽度\n    let maxCols = 0\n\n    for (let x = 0; x < matrix.length; x += 1) {\n      if (matrix[x]) {\n        maxCols = Math.max(maxCols, matrix[x].length)\n      }\n    }\n\n    for (let x = 0; x < matrix.length; x += 1) {\n      if (!filledSection[x]) {\n        filledSection[x] = []\n      }\n\n      if (!matrix[x]) {\n        continue\n      }\n\n      for (let y = 0; y < matrix[x].length; y += 1) {\n        if (!matrix[x][y] || !matrix[x][y][0]) {\n          continue\n        }\n\n        const [{ rowSpan = 1, colSpan = 1 }] = matrix[x][y]\n\n        // 找到下一个可用的位置\n        let startCol = y\n\n        while (filledSection[x] && filledSection[x][startCol]) {\n          startCol += 1\n        }\n\n        for (let c = 0; c < colSpan; c += 1) {\n          for (let r = 0; r < rowSpan; r += 1) {\n            const targetX = x + r\n            const targetY = startCol + c\n\n            if (!filledSection[targetX]) {\n              filledSection[targetX] = []\n            }\n\n            if (filledSection[targetX][targetY]) {\n              continue\n            }\n\n            filledSection[targetX][targetY] = [\n              matrix[x][y],\n              {\n                rtl: c + 1,\n                ltr: colSpan - c,\n                ttb: r + 1,\n                btt: rowSpan - r,\n              },\n            ]\n          }\n        }\n      }\n    }\n\n    filled.push(...filledSection)\n  }\n\n  return filled\n}\n","export class Point {\n  public x: number\n\n  public y: number\n\n  constructor(x: number, y: number) {\n    this.x = x\n    this.y = y\n  }\n\n  public static valueOf(x: number, y: number): Point {\n    return new this(x, y)\n  }\n\n  public static equals(point: Point, another: Point): boolean {\n    return point.x === another.x && point.y === another.y\n  }\n}\n","/**\n * @description DOM 操作\n * @author wangfupeng\n */\n\nimport $, {\n  addClass,\n  append,\n  attr,\n  children,\n  data,\n  dataset,\n  Dom7Array,\n  each,\n  find,\n  focus,\n  hide,\n  html,\n  on,\n  removeClass,\n  show,\n  val,\n} from 'dom7'\n\n// COMPAT: This is required to prevent TypeScript aliases from doing some very\n// weird things for Slate's types with the same name as globals. (2019/11/27)\n// https://github.com/microsoft/TypeScript/issues/35002\nimport DOMNode = globalThis.Node\nimport DOMComment = globalThis.Comment\nimport DOMElement = globalThis.Element\nimport DOMText = globalThis.Text\nimport DOMRange = globalThis.Range\nimport DOMSelection = globalThis.Selection\nimport DOMStaticRange = globalThis.StaticRange\n\nexport { Dom7Array } from 'dom7'\n\nif (append && $.fn) {\n  $.fn.append = append\n}\nif (on && $.fn) {\n  $.fn.on = on\n}\nif (focus && $.fn) {\n  $.fn.focus = focus\n}\nif (attr && $.fn) {\n  $.fn.attr = attr\n}\nif (val && $.fn) {\n  $.fn.val = val\n}\nif (html && $.fn) {\n  $.fn.html = html\n}\nif (dataset && $.fn) {\n  $.fn.dataset = dataset\n}\nif (addClass && $.fn) {\n  $.fn.addClass = addClass\n}\nif (removeClass && $.fn) {\n  $.fn.removeClass = removeClass\n}\nif (children && $.fn) {\n  $.fn.children = children\n}\nif (each && $.fn) {\n  $.fn.each = each\n}\nif (find && $.fn) {\n  $.fn.find = find\n}\nif (data && $.fn) {\n  $.fn.data = data\n}\nif (hide && $.fn) {\n  $.fn.hide = hide\n}\nif (show && $.fn) {\n  $.fn.show = show\n}\n\nexport default $\n\n/**\n * 获取 tagName lower-case\n * @param $elem $elem\n */\nexport function getTagName($elem: Dom7Array): string {\n  if ($elem.length) { return $elem[0].tagName.toLowerCase() }\n  return ''\n}\n\n/**\n * 获取 $elem 某一个 style 值\n * @param $elem $elem\n * @param styleKey style key\n */\nexport function getStyleValue($elem: Dom7Array, styleKey: string): string {\n  let res = ''\n\n  const styleStr = $elem.attr('style') || '' // 如 'line-height: 2.5; color: red;'\n  const styleArr = styleStr.split(';') // 如 ['line-height: 2.5', ' color: red', '']\n  const length = styleArr.length\n\n  for (let i = 0; i < length; i += 1) {\n    const styleItemStr = styleArr[i] // 如 'line-height: 2.5'\n\n    if (styleItemStr) {\n      const arr = styleItemStr.split(':') // ['line-height', ' 2.5']\n\n      if (arr[0].trim() === styleKey) {\n        res = arr[1].trim()\n      }\n    }\n  }\n\n  return res\n}\n\n/**\n * 获取 outerHTML\n * @param $elem dom7 elem\n */\nexport function getOuterHTML($elem: Dom7Array) {\n  if ($elem.length === 0) { return '' }\n  return $elem[0].outerHTML\n}\nexport {\n  DOMComment, DOMElement, DOMNode, DOMRange, DOMSelection, DOMStaticRange, DOMText,\n}\n","import { Editor, Element } from 'slate'\n\nimport { NodeEntryWithContext } from '../utils'\n\n/** Weak reference between the `Editor` and the selected elements */\nexport const EDITOR_TO_SELECTION = new WeakMap<Editor, NodeEntryWithContext[][]>()\n\n/** Weak reference between the `Editor` and a set of the selected elements */\nexport const EDITOR_TO_SELECTION_SET = new WeakMap<Editor, WeakSet<Element>>()\n","/**\n * @description set cell property menu\n * @author hsuna\n */\n\nimport { DomEditor, IButtonMenu, IDomEditor, t } from '@wangeditor-next/core'\nimport { Editor, Transforms } from 'slate'\n\nimport {\n  CLEAN_SVG,\n  JUSTIFY_CENTER_SVG,\n  JUSTIFY_JUSTIFY_SVG,\n  JUSTIFY_LEFT_SVG,\n  JUSTIFY_RIGHT_SVG,\n  TABLE_PROPERTY_SVG,\n} from '../../constants/svg'\nimport { isOfType } from '../../utils'\nimport $ from '../../utils/dom'\nimport { EDITOR_TO_SELECTION } from '../weak-maps'\n\nclass TableProperty implements IButtonMenu {\n  readonly title = t('tableModule.tableProperty')\n\n  iconSvg = TABLE_PROPERTY_SVG\n\n  readonly tag = 'button'\n\n  readonly showModal = true\n\n  readonly modalWidth = 360\n\n  readonly menu: string = 'table'\n\n  readonly borderStyle = [\n    { value: 'none', label: t('tableModule.borderStyle.none') },\n    { value: 'solid', label: t('tableModule.borderStyle.solid') },\n    { value: 'dotted', label: t('tableModule.borderStyle.dotted') },\n    { value: 'dashed', label: t('tableModule.borderStyle.dashed') },\n    { value: 'double', label: t('tableModule.borderStyle.double') },\n    { value: 'groove', label: t('tableModule.borderStyle.groove') },\n    { value: 'ridge', label: t('tableModule.borderStyle.ridge') },\n    { value: 'inset', label: t('tableModule.borderStyle.inset') },\n    { value: 'outset', label: t('tableModule.borderStyle.outset') },\n  ]\n\n  readonly textAlignOptions = [\n    { value: 'left', label: t('justify.left'), svg: JUSTIFY_LEFT_SVG },\n    { value: 'center', label: t('justify.center'), svg: JUSTIFY_CENTER_SVG },\n    { value: 'right', label: t('justify.right'), svg: JUSTIFY_RIGHT_SVG },\n    { value: 'justify', label: t('justify.justify'), svg: JUSTIFY_JUSTIFY_SVG },\n  ]\n\n  getValue(_editor: IDomEditor): string | boolean {\n    return ''\n  }\n\n  isActive(_editor: IDomEditor): boolean {\n    return false\n  }\n\n  isDisabled(editor: IDomEditor): boolean {\n    const tableNode = DomEditor.getSelectedNodeByType(editor, 'table')\n\n    if (tableNode == null) {\n      return true\n    }\n    return false\n  }\n\n  exec(_editor: IDomEditor, _value: string | boolean) {\n    // 此处空着即可\n  }\n\n  getModalContentNode(editor: IDomEditor) {\n    const [node] = Editor.nodes(editor, {\n      match: isOfType(editor, 'table'),\n    })\n\n    return node\n  }\n\n  getModalPositionNode(_editor: IDomEditor) {\n    return null\n  }\n\n  getModalContentElem(editor: IDomEditor) {\n    const node = this.getModalContentNode(editor)\n\n    if (!node) {\n      return null\n    }\n\n    const [data, path] = node\n    const $content = $(`<div class=\"w-e-table-property-modal\">\n      <label class=\"babel-container w-e-table-property-row\">\n        <span class=\"w-e-table-property-label\">${t('tableModule.modal.border')}</span>\n        <span class=\"babel-container-border w-e-table-property-controls\">\n          <select name=\"borderStyle\" aria-label=\"${t('tableModule.modal.border')}\">\n            ${this.borderStyle\n              .map(item => `<option value=\"${item.value}\">${item.label}</option>`)\n              .join('')}\n          </select>\n          <span class=\"color-group\" data-mark=\"color\" title=\"${t('tableModule.modal.borderColor')}\">\n            <span class=\"color-group-block\"></span>\n            <input name=\"borderColor\" type=\"hidden\">\n          </span>\n          <span class=\"w-e-table-property-number\">\n            <input name=\"borderWidth\" type=\"number\" min=\"0\" placeholder=\"${t(\n              'tableModule.modal.borderWidth'\n            )}\" aria-label=\"${t('tableModule.modal.borderWidth')}\">\n            <span class=\"w-e-table-property-unit\">px</span>\n          </span>\n        </span>\n      </label>\n      <div class=\"babel-container w-e-table-property-row\">\n        <span class=\"w-e-table-property-label\">${t('tableModule.modal.bgColor')}</span>\n        <span class=\"babel-container-background w-e-table-property-controls\">\n          <span class=\"color-group\" data-mark=\"bgColor\" title=\"${t('tableModule.modal.bgColor')}\">\n            <span class=\"color-group-block\"></span>\n            <input name=\"backgroundColor\" type=\"hidden\">\n          </span>\n        </span>\n      </div>\n      <div class=\"babel-container w-e-table-property-row\">\n        <span class=\"w-e-table-property-label\">${t('tableModule.modal.align')}</span>\n        <span class=\"babel-container-align w-e-table-property-controls\">\n          <input name=\"textAlign\" type=\"hidden\">\n          <span class=\"w-e-table-property-align\">\n            ${this.textAlignOptions\n              .map(\n                item => `\n              <button\n                type=\"button\"\n                class=\"w-e-table-property-align-button\"\n                data-value=\"${item.value}\"\n                title=\"${item.label}\"\n                aria-label=\"${item.label}\"\n              >${item.svg}</button>\n            `\n              )\n              .join('')}\n          </span>\n        </span>\n      </div>\n      <div class=\"button-container\">\n        <button type=\"button\">${t('tableModule.modal.ok')}</button>\n      </div>\n    </div>`)\n\n    // 初始化所有表单的值\n    $content.find('[name]').each(elem => {\n      $(elem).val(data[$(elem).attr('name')])\n    })\n\n    const updateTextAlignButton = value => {\n      $content.find('.w-e-table-property-align-button').each(button => {\n        const $buttonElem = $(button)\n        const isActive = $buttonElem.attr('data-value') === value\n\n        if (isActive) {\n          $buttonElem.addClass('active')\n          $buttonElem.attr('aria-pressed', 'true')\n        } else {\n          $buttonElem.removeClass('active')\n          $buttonElem.attr('aria-pressed', 'false')\n        }\n      })\n    }\n\n    updateTextAlignButton($content.find('[name=\"textAlign\"]').val() || '')\n\n    $content.find('.w-e-table-property-align-button').on('click', e => {\n      const button = e.currentTarget\n\n      if (button == null) {\n        return\n      }\n\n      const $buttonElem = $(button)\n      const value = $buttonElem.attr('data-value') || ''\n\n      $content.find('[name=\"textAlign\"]').val(value)\n      updateTextAlignButton(value)\n    })\n\n    const setSelectedColor = (elem, color) => {\n      if (color) {\n        $('.color-group-block', elem).css('background-color', color).empty()\n      } else {\n        $('.color-group-block', elem).css('background-color', '').html(CLEAN_SVG)\n      }\n    }\n\n    $content.find('.color-group').each(elem => {\n      const selectedColor = $('[type=\"hidden\"]', elem).val() || ''\n\n      setSelectedColor(elem, selectedColor)\n\n      const $elem = $(elem)\n\n      $elem.on('click', () => {\n        $content.find('.color-group .w-e-drop-panel').hide()\n        let $panel = $elem.data('panel')\n\n        if (!$panel) {\n          $panel = this.getPanelContentElem(editor, {\n            mark: $elem.data('mark'),\n            selectedColor,\n            callback: color => {\n              $('[type=\"hidden\"]', elem).val(color || '')\n              setSelectedColor(elem, color)\n              $panel.hide()\n            },\n          })\n          $elem.append($panel)\n          $elem.data('panel', $panel)\n        } else {\n          $panel.show()\n        }\n      })\n    })\n\n    const $button = $content.find('.button-container button')\n\n    $button.on('click', () => {\n      const props = Array.from($content.find('[name]')).reduce((obj, elem) => {\n        obj[$(elem).attr('name')] = $(elem).val()\n        return obj\n      }, {})\n\n      const selection = EDITOR_TO_SELECTION.get(editor)\n\n      if (this.menu === 'cell' && !!selection?.length) {\n        selection.forEach(row => {\n          row.forEach(cell => {\n            Transforms.setNodes(editor, props, { at: cell[0][1] })\n          })\n        })\n      } else {\n        Transforms.setNodes(editor, props, { at: path })\n      }\n\n      setTimeout(() => {\n        editor.focus()\n      })\n    })\n\n    return $content[0]\n  }\n\n  getPanelContentElem(editor, { mark, selectedColor, callback }) {\n    const $colorPanel = $('<ul class=\"w-e-panel-content-color\"></ul>')\n\n    $colorPanel.on('click', 'li', e => {\n      const { target } = e\n\n      if (!target) {\n        return\n      }\n      e.preventDefault()\n      e.stopPropagation()\n\n      const $li = $(target)\n      const val = $li.attr('data-value')\n\n      callback(val)\n    })\n\n    const colorConf = editor.getMenuConfig(mark)\n    const { colors = [] } = colorConf\n\n    colors.forEach(color => {\n      const $block = $(`<div class=\"color-block\" data-value=\"${color}\"></div>`)\n\n      $block.css('background-color', color)\n\n      const $li = $(`<li data-value=\"${color}\"></li>`)\n\n      if (selectedColor === color) {\n        $li.addClass('active')\n      }\n      $li.append($block)\n\n      $colorPanel.append($li)\n    })\n\n    let clearText = ''\n\n    if (mark === 'color') {\n      clearText = t('tableModule.color.default')\n    }\n    if (mark === 'bgColor') {\n      clearText = t('tableModule.color.clear')\n    }\n    const $clearLi = $(`\n      <li data-value=\"\" class=\"clear\">\n        ${CLEAN_SVG}\n        ${clearText}\n      </li>\n    `)\n\n    $colorPanel.prepend($clearLi)\n\n    const $panel = $('<div class=\"w-e-drop-panel\"></div>')\n\n    $panel.append($colorPanel)\n    return $panel\n  }\n}\n\nexport default TableProperty\n","import { IButtonMenu, IDomEditor, t } from '@wangeditor-next/core'\nimport { Editor } from 'slate'\n\nimport { CELL_PROPERTY_SVG } from '../../constants/svg'\nimport { isOfType } from '../../utils'\nimport TableProperty from './TableProperty'\n\nclass CellProperty extends TableProperty implements IButtonMenu {\n  readonly title = t('tableModule.cellProperty')\n\n  readonly iconSvg = CELL_PROPERTY_SVG\n\n  readonly tag = 'button'\n\n  readonly showModal = true\n\n  readonly modalWidth = 360\n\n  readonly menu = 'cell'\n\n  getModalContentNode(editor: IDomEditor) {\n    const [node] = Editor.nodes(editor, {\n      match: isOfType(editor, 'td'),\n    })\n\n    return node\n  }\n}\n\nexport default CellProperty\n","/**\n * @description del col menu\n * @author wangfupeng\n */\n\nimport {\n  DomEditor, IButtonMenu, IDomEditor, t,\n} from '@wangeditor-next/core'\nimport {\n  Editor, Path, Range, Transforms,\n} from 'slate'\n\nimport { DEL_COL_SVG } from '../../constants/svg'\nimport { filledMatrix } from '../../utils'\nimport { TableCellElement, TableElement } from '../custom-types'\n\nclass DeleteCol implements IButtonMenu {\n  readonly title = t('tableModule.deleteCol')\n\n  readonly iconSvg = DEL_COL_SVG\n\n  readonly tag = 'button'\n\n  getValue(_editor: IDomEditor): string | boolean {\n    // 无需获取 val\n    return ''\n  }\n\n  isActive(_editor: IDomEditor): boolean {\n    // 无需 active\n    return false\n  }\n\n  isDisabled(editor: IDomEditor): boolean {\n    const { selection } = editor\n\n    if (selection == null) { return true }\n    if (!Range.isCollapsed(selection)) { return true }\n\n    const cellNode = DomEditor.getSelectedNodeByType(editor, 'table-cell')\n\n    if (cellNode == null) {\n      // 选区未处于 table cell node ，则禁用\n      return true\n    }\n    return false\n  }\n\n  exec(editor: IDomEditor, _value: string | boolean) {\n    if (this.isDisabled(editor)) { return }\n\n    const [cellEntry] = Editor.nodes(editor, {\n      match: n => DomEditor.checkNodeType(n, 'table-cell'),\n      universal: true,\n    })\n    const [selectedCellNode, selectedCellPath] = cellEntry\n\n    // 如果只有一列，则删除整个表格\n    const rowNode = DomEditor.getParentNode(editor, selectedCellNode)\n    const colLength = rowNode?.children.length || 0\n\n    if (!rowNode || colLength <= 1) {\n      Transforms.removeNodes(editor, { mode: 'highest' }) // 删除整个表格\n      return\n    }\n\n    // ------------------------- 不只有 1 列，则继续 -------------------------\n\n    const tableNode = DomEditor.getParentNode(editor, rowNode)\n\n    if (tableNode == null) { return }\n\n    const matrix = filledMatrix(editor)\n    let tdIndex = 0\n\n    // eslint-disable-next-line no-labels\n    out: for (let x = 0; x < matrix.length; x += 1) {\n      for (let y = 0; y < matrix[x].length; y += 1) {\n        const [[, path]] = matrix[x][y]\n\n        if (Path.equals(selectedCellPath, path)) {\n          tdIndex = y\n          // eslint-disable-next-line no-labels\n          break out\n        }\n      }\n    }\n\n    Editor.withoutNormalizing(editor, () => {\n      // 记录需要删除的单元格路径和已处理的合并单元格\n      const cellsToDelete = new Set<string>()\n      const processedMergedCells = new Set<string>()\n\n      // 遍历每一行的第 tdIndex 列\n      for (let x = 0; x < matrix.length; x += 1) {\n        if (!matrix[x] || !matrix[x][tdIndex]) {\n          continue\n        }\n\n        const [[, cellPath], {\n          rtl, ltr, ttb, btt,\n        }] = matrix[x][tdIndex]\n        const cellPathKey = cellPath.join(',')\n\n        // 判断是否是合并单元格\n        if (rtl > 1 || ltr > 1 || ttb > 1 || btt > 1) {\n          // 这是合并单元格的一部分\n          // 找到真实单元格的位置（左上角的位置）\n          // rtl表示从右到左的距离，所以真实单元格列 = 当前列 - (rtl - 1)\n          // ttb表示从上到下的距离，所以真实单元格行 = 当前行 - (ttb - 1)\n          const realCellRow = x - (ttb - 1)\n          const realCellCol = tdIndex - (rtl - 1)\n\n          // 安全检查：确保真实单元格位置存在\n          if (realCellRow < 0 || realCellRow >= matrix.length\n              || !matrix[realCellRow] || !matrix[realCellRow][realCellCol]) {\n            continue\n          }\n\n          const [[realCellElement, realCellPath]] = matrix[realCellRow][realCellCol]\n          const realCellPathKey = realCellPath.join(',')\n\n          // 避免重复处理同一个合并单元格\n          if (!processedMergedCells.has(realCellPathKey)) {\n            processedMergedCells.add(realCellPathKey)\n\n            const { rowSpan = 1, colSpan = 1 } = realCellElement\n            const newColSpan = Math.max(colSpan - 1, 1)\n\n            // 更新真实单元格的 colSpan\n            Transforms.setNodes<TableCellElement>(\n              editor,\n              {\n                rowSpan,\n                colSpan: newColSpan,\n              },\n              { at: realCellPath },\n            )\n          }\n        } else {\n          // rtl = 1 且 ltr = 1 且 ttb = 1 且 btt = 1，说明这是独立的单元格，直接删除\n          cellsToDelete.add(cellPathKey)\n        }\n      }\n\n      // 删除独立的单元格\n      const cellsToDeleteArray = Array.from(cellsToDelete)\n\n      // 按路径深度降序排序，确保从深层到浅层删除，避免路径失效\n      cellsToDeleteArray.sort((a, b) => {\n        const pathA = a.split(',').map(Number)\n        const pathB = b.split(',').map(Number)\n\n        // 按行降序排序\n        if (pathA[pathA.length - 2] !== pathB[pathB.length - 2]) {\n          return pathB[pathB.length - 2] - pathA[pathA.length - 2]\n        }\n\n        // 同行内按列降序排序\n        return pathB[pathB.length - 1] - pathA[pathA.length - 1]\n      })\n\n      for (const pathKey of cellsToDeleteArray) {\n        const path = pathKey.split(',').map(Number)\n\n        try {\n          if (Editor.hasPath(editor, path)) {\n            Transforms.removeNodes(editor, { at: path })\n          }\n        } catch (error) {\n          console.warn('删除单元格失败:', path, error)\n        }\n      }\n\n      // 调整表格的 columnWidths\n      const [tableEntry] = Editor.nodes(editor, {\n        match: n => DomEditor.checkNodeType(n, 'table'),\n        universal: true,\n      })\n\n      if (tableEntry) {\n        const [elemNode, tablePath] = tableEntry\n        const { columnWidths = [] } = elemNode as TableElement\n        const adjustColumnWidths = [...columnWidths]\n\n        // 删除对应列的宽度\n        adjustColumnWidths.splice(tdIndex, 1)\n\n        Transforms.setNodes(editor, { columnWidths: adjustColumnWidths } as TableElement, {\n          at: tablePath,\n        })\n      }\n    })\n  }\n}\n\nexport default DeleteCol\n","/**\n * @description del row menu\n * @author wangfupeng\n */\n\nimport {\n  DomEditor, IButtonMenu, IDomEditor, t,\n} from '@wangeditor-next/core'\nimport {\n  Editor, Path, Range, Transforms,\n} from 'slate'\n\nimport { DEL_ROW_SVG } from '../../constants/svg'\nimport { filledMatrix } from '../../utils'\nimport { TableCellElement } from '../custom-types'\n\nclass DeleteRow implements IButtonMenu {\n  readonly title = t('tableModule.deleteRow')\n\n  readonly iconSvg = DEL_ROW_SVG\n\n  readonly tag = 'button'\n\n  getValue(_editor: IDomEditor): string | boolean {\n    // 无需获取 val\n    return ''\n  }\n\n  isActive(_editor: IDomEditor): boolean {\n    // 无需 active\n    return false\n  }\n\n  isDisabled(editor: IDomEditor): boolean {\n    const { selection } = editor\n\n    if (selection == null) { return true }\n    if (!Range.isCollapsed(selection)) { return true }\n\n    const rowNode = DomEditor.getSelectedNodeByType(editor, 'table-row')\n\n    if (rowNode == null) {\n      // 选区未处于 table row node ，则禁用\n      return true\n    }\n    return false\n  }\n\n  exec(editor: IDomEditor, _value: string | boolean) {\n    if (this.isDisabled(editor)) { return }\n\n    const [rowEntry] = Editor.nodes(editor, {\n      match: n => DomEditor.checkNodeType(n, 'table-row'),\n      universal: true,\n    })\n    const [rowNode, rowPath] = rowEntry\n\n    const tableNode = DomEditor.getParentNode(editor, rowNode)\n    const rowsLength = tableNode?.children.length || 0\n\n    if (rowsLength <= 1) {\n      // row 只有一行，则删掉整个表格\n      Transforms.removeNodes(editor, { mode: 'highest' })\n      return\n    }\n\n    // row > 1 行，则删掉这一行\n    const [cellEntry] = Editor.nodes(editor, {\n      match: n => DomEditor.checkNodeType(n, 'table-cell'),\n      universal: true,\n    })\n    const [, cellPath] = cellEntry\n    const matrix = filledMatrix(editor)\n    let trIndex = 0\n\n    // eslint-disable-next-line no-labels\n    outer: for (let x = 0; x < matrix.length; x += 1) {\n      for (let y = 0; y < matrix[x].length; y += 1) {\n        const [[, path]] = matrix[x][y]\n\n        if (!Path.equals(cellPath, path)) {\n          continue\n        }\n        trIndex = x\n        // eslint-disable-next-line no-labels\n        break outer\n      }\n    }\n\n    Editor.withoutNormalizing(editor, () => {\n      // 收集需要在下一行插入的新单元格信息\n      const cellsToInsert: Array<{\n        cell: TableCellElement\n        columnIndex: number\n      }> = []\n\n      for (let y = 0; y < matrix[trIndex].length; y += 1) {\n        const [[{ hidden }], { ttb, btt, rtl }] = matrix[trIndex][y]\n\n        // 寻找跨行行为\n        if (ttb > 1 || btt > 1) {\n          // 找到显示中 rowSpan 节点\n          const originalRowIndex = trIndex - (ttb - 1)\n\n          // 安全检查：确保目标行和列都存在\n          if (originalRowIndex < 0 || originalRowIndex >= matrix.length || !matrix[originalRowIndex] || !matrix[originalRowIndex][y]) {\n            continue\n          }\n\n          const [[originalCell, path]] = matrix[originalRowIndex][y]\n          const typedOriginalCell = originalCell as TableCellElement\n          const { rowSpan = 1, colSpan = 1 } = typedOriginalCell\n\n          if (hidden) {\n            // 如果当前选中节点为隐藏节点，则向上寻找处理 rowSpan 逻辑\n            Transforms.setNodes<TableCellElement>(\n              editor,\n              {\n                rowSpan: Math.max(rowSpan - 1, 1),\n                colSpan,\n              },\n              { at: path },\n            )\n          } else if (ttb === 1 && rtl === 1) {\n            // 只处理合并单元格的真正位置（左上角）：ttb=1且rtl=1\n            // 这样避免重复处理同一个合并单元格\n            const hasNextRow = trIndex + 1 < matrix.length\n\n            if (hasNextRow && rowSpan > 1) {\n              // 创建新的单元格，继承原单元格的内容和属性\n              const newCell: TableCellElement = {\n                type: 'table-cell',\n                rowSpan: rowSpan - 1, // 新单元格的rowSpan = 原rowSpan - 1\n                colSpan, // 保持原来的colSpan\n                hidden: false,\n                children: typedOriginalCell.children.map(child => ({ ...child })), // 深拷贝继承原单元格的内容\n              }\n\n              // 继承原单元格的其他属性\n              if (typedOriginalCell.isHeader) { newCell.isHeader = typedOriginalCell.isHeader }\n              if (typedOriginalCell.width) { newCell.width = typedOriginalCell.width }\n              if (typedOriginalCell.backgroundColor) { newCell.backgroundColor = typedOriginalCell.backgroundColor }\n              if (typedOriginalCell.borderWidth) { newCell.borderWidth = typedOriginalCell.borderWidth }\n              if (typedOriginalCell.borderStyle) { newCell.borderStyle = typedOriginalCell.borderStyle }\n              if (typedOriginalCell.borderColor) { newCell.borderColor = typedOriginalCell.borderColor }\n              if (typedOriginalCell.textAlign) { newCell.textAlign = typedOriginalCell.textAlign }\n\n              // 记录需要插入的单元格信息\n              cellsToInsert.push({\n                cell: newCell,\n                columnIndex: y,\n              })\n            } else {\n              // 如果没有下一行，直接减少原始单元格的 rowSpan\n              Transforms.setNodes<TableCellElement>(\n                editor,\n                {\n                  rowSpan: Math.max(rowSpan - 1, 1),\n                  colSpan,\n                },\n                { at: path },\n              )\n            }\n          } else {\n            // 处理其他跨行单元格的情况：非隐藏且非左上角原始位置\n            // 这种情况下也需要减少原始单元格的 rowSpan\n            Transforms.setNodes<TableCellElement>(\n              editor,\n              {\n                rowSpan: Math.max(rowSpan - 1, 1),\n                colSpan,\n              },\n              { at: path },\n            )\n          }\n        }\n      }\n\n      // 删除当前行\n      Transforms.removeNodes(editor, { at: rowPath })\n\n      // 行删除时，对应的行元素及其高度属性会自动被移除，无需额外操作\n\n      // 在下一行（现在变成了当前行）的对应位置插入新单元格\n      if (cellsToInsert.length > 0) {\n        // 删除行后，原来的下一行会移动到rowPath的位置\n        const targetRowPath = rowPath\n\n        try {\n          // 按列索引排序，从左到右插入\n          cellsToInsert.sort((a, b) => a.columnIndex - b.columnIndex)\n\n          for (const { cell, columnIndex } of cellsToInsert) {\n            try {\n              // 尝试在对应的列位置插入\n              const insertPath = [...targetRowPath, columnIndex]\n\n              Transforms.insertNodes(editor, cell, { at: insertPath })\n            } catch (error) {\n              // 如果插入失败，尝试在行末尾插入\n              try {\n                const [targetRow] = Editor.node(editor, targetRowPath)\n                const cellCount = (targetRow as any).children.length\n                const endPath = [...targetRowPath, cellCount]\n\n                Transforms.insertNodes(editor, cell, { at: endPath })\n              } catch (fallbackError) {\n                console.warn('插入新单元格失败:', fallbackError)\n              }\n            }\n          }\n        } catch (error) {\n          console.warn('插入新单元格失败:', error)\n        }\n      }\n    })\n  }\n}\n\nexport default DeleteRow\n","/**\n * @description del table menu\n * @author wangfupeng\n */\n\nimport {\n  DomEditor, IButtonMenu, IDomEditor, t,\n} from '@wangeditor-next/core'\nimport { Transforms } from 'slate'\n\nimport { TRASH_SVG } from '../../constants/svg'\n\nclass DeleteTable implements IButtonMenu {\n  readonly title = t('tableModule.deleteTable')\n\n  readonly iconSvg = TRASH_SVG\n\n  readonly tag = 'button'\n\n  getValue(_editor: IDomEditor): string | boolean {\n    // 无需获取 val\n    return ''\n  }\n\n  isActive(_editor: IDomEditor): boolean {\n    // 无需 active\n    return false\n  }\n\n  isDisabled(editor: IDomEditor): boolean {\n    if (editor.selection == null) { return true }\n\n    const tableNode = DomEditor.getSelectedNodeByType(editor, 'table')\n\n    if (tableNode == null) {\n      // 选区未处于 table node ，则禁用\n      return true\n    }\n    return false\n  }\n\n  exec(editor: IDomEditor, _value: string | boolean) {\n    if (this.isDisabled(editor)) { return }\n\n    // 删除表格\n    Transforms.removeNodes(editor, { mode: 'highest' })\n  }\n}\n\nexport default DeleteTable\n","/**\n * @description table full width menu\n * @author wangfupeng\n */\n\nimport {\n  DomEditor, IButtonMenu, IDomEditor, t,\n} from '@wangeditor-next/core'\nimport { Range, Transforms } from 'slate'\n\nimport { FULL_WIDTH_SVG } from '../../constants/svg'\nimport { TableElement } from '../custom-types'\n\nclass TableFullWidth implements IButtonMenu {\n  readonly title = t('tableModule.widthAuto')\n\n  readonly iconSvg = FULL_WIDTH_SVG\n\n  readonly tag = 'button'\n\n  getValue(editor: IDomEditor): string | boolean {\n    const tableNode = DomEditor.getSelectedNodeByType(editor, 'table') as TableElement | null\n\n    if (tableNode == null) { return false }\n    return tableNode.width === '100%'\n  }\n\n  isActive(editor: IDomEditor): boolean {\n    return !!this.getValue(editor)\n  }\n\n  isDisabled(editor: IDomEditor): boolean {\n    const { selection } = editor\n\n    if (selection == null) { return true }\n    if (!Range.isCollapsed(selection)) { return true }\n\n    const tableNode = DomEditor.getSelectedNodeByType(editor, 'table')\n\n    if (tableNode == null) {\n      // 选区未处于 table node ，则禁用\n      return true\n    }\n    return false\n  }\n\n  exec(editor: IDomEditor, _value: string | boolean) {\n    if (this.isDisabled(editor)) { return }\n\n    const tableNode = DomEditor.getSelectedNodeByType(editor, 'table') as TableElement\n\n    if (!tableNode) { return }\n\n    const props: Partial<TableElement> = {\n      width: tableNode.width === '100%' ? 'auto' : '100%',\n    }\n\n    Transforms.setNodes(editor, props, { mode: 'highest' })\n  }\n}\n\nexport default TableFullWidth\n","/**\n * @description table menu helpers\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\n\nimport { TableCellElement, TableElement } from './custom-types'\n\n/**\n * 获取第一行所有 cells\n * @param tableNode table node\n */\nexport function getFirstRowCells(tableNode: TableElement): TableCellElement[] {\n  const rows = tableNode.children || [] // 所有行\n\n  if (rows.length === 0) { return [] }\n  const firstRow = rows[0] || {} // 第一行\n  const cells = firstRow.children || [] // 第一行所有 cell\n\n  return cells\n}\n\n/**\n * 表格是否带有表头？\n * @param tableNode table node\n */\nexport function isTableWithHeader(tableNode: TableElement): boolean {\n  const firstRowCells = getFirstRowCells(tableNode)\n\n  return firstRowCells.every(cell => !!cell.isHeader)\n}\n\n/**\n * 单元格是否在第一行\n * @param editor editor\n * @param cellNode cell node\n */\nexport function isCellInFirstRow(editor: IDomEditor, cellNode: TableCellElement): boolean {\n  const rowNode = DomEditor.getParentNode(editor, cellNode)\n\n  if (rowNode == null) { return false }\n  const tableNode = DomEditor.getParentNode(editor, rowNode)\n\n  if (tableNode == null) { return false }\n\n  const firstRowCells = getFirstRowCells(tableNode as TableElement)\n\n  return firstRowCells.some(c => c === cellNode)\n}\n","/**\n * @description insert col menu\n * @author wangfupeng\n */\n\nimport {\n  DomEditor, IButtonMenu, IDomEditor, t,\n} from '@wangeditor-next/core'\nimport {\n  Editor, Path, Range, Transforms,\n} from 'slate'\n\nimport { ADD_COL_SVG } from '../../constants/svg'\nimport { filledMatrix } from '../../utils'\nimport { TableCellElement, TableElement } from '../custom-types'\nimport { isTableWithHeader } from '../helpers'\n\nclass InsertCol implements IButtonMenu {\n  readonly title = t('tableModule.insertCol')\n\n  readonly iconSvg = ADD_COL_SVG\n\n  readonly tag = 'button'\n\n  getValue(_editor: IDomEditor): string | boolean {\n    // 无需获取 val\n    return ''\n  }\n\n  isActive(_editor: IDomEditor): boolean {\n    // 无需 active\n    return false\n  }\n\n  isDisabled(editor: IDomEditor): boolean {\n    const { selection } = editor\n\n    if (selection == null) { return true }\n    if (!Range.isCollapsed(selection)) { return true }\n\n    const tableNode = DomEditor.getSelectedNodeByType(editor, 'table')\n\n    if (tableNode == null) {\n      // 选区未处于 table cell node ，则禁用\n      return true\n    }\n\n    // 检查当前单元格的宽度是否小于20px\n    try {\n      const [cellEntry] = Editor.nodes(editor, {\n        match: n => DomEditor.checkNodeType(n, 'table-cell'),\n        universal: true,\n      })\n\n      if (!cellEntry) {\n        return true\n      }\n\n      const [, selectedCellPath] = cellEntry\n      const matrix = filledMatrix(editor)\n      let tdIndex = -1\n\n      // 找到当前单元格在矩阵中的列索引\n      for (let x = 0; x < matrix.length; x += 1) {\n        for (let y = 0; y < matrix[x].length; y += 1) {\n          const [[, path]] = matrix[x][y]\n\n          if (Path.equals(selectedCellPath, path)) {\n            tdIndex = y\n            break\n          }\n        }\n        if (tdIndex !== -1) { break }\n      }\n\n      if (tdIndex === -1) {\n        return true\n      }\n\n      // 获取表格的列宽信息\n      const tableElement = tableNode as TableElement\n      const { columnWidths = [] } = tableElement\n\n      // 检查当前列的宽度 - 如果小于20px则禁用插入列功能\n      const currentColWidth = columnWidths[tdIndex]\n\n      if (currentColWidth && currentColWidth < 20) {\n        return true // 宽度限制：当前列宽度小于20px时禁用插入列功能\n      }\n\n    } catch (error) {\n      // 如果检查过程中出现错误，为安全起见禁用功能\n      return true\n    }\n\n    return false\n  }\n\n  exec(editor: IDomEditor, _value: string | boolean) {\n    if (this.isDisabled(editor)) { return }\n\n    const [cellEntry] = Editor.nodes(editor, {\n      match: n => DomEditor.checkNodeType(n, 'table-cell'),\n      universal: true,\n    })\n    const [selectedCellNode, selectedCellPath] = cellEntry\n\n    const rowNode = DomEditor.getParentNode(editor, selectedCellNode)\n\n    if (rowNode == null) { return }\n    const tableNode = DomEditor.getParentNode(editor, rowNode) as TableElement\n\n    if (tableNode == null) { return }\n\n    const matrix = filledMatrix(editor)\n    let tdIndex = -1\n\n    for (let x = 0; x < matrix.length; x += 1) {\n      for (let y = 0; y < matrix[x].length; y += 1) {\n        const [[, path]] = matrix[x][y]\n\n        if (Path.equals(selectedCellPath, path)) {\n          tdIndex = y\n          break\n        }\n      }\n      if (tdIndex !== -1) { break }\n    }\n\n    if (tdIndex === -1) { return }\n\n    const selectedColSpan = (selectedCellNode as TableCellElement).colSpan || 1\n    const { insertPosition = 'before' } = editor.getMenuConfig('insertTableCol') || {}\n    const normalizedInsertPosition = insertPosition === 'after' ? 'after' : 'before'\n    const totalCols = matrix[0]?.length || 0\n    const insertColIndex = normalizedInsertPosition === 'after'\n      ? Math.min(tdIndex + selectedColSpan, totalCols)\n      : tdIndex\n    const mergeInspectColIndex = insertColIndex < totalCols ? insertColIndex : -1\n\n    Editor.withoutNormalizing(editor, () => {\n      // 记录已处理的合并单元格和需要跳过插入的行\n      const processedMergedCells = new Set<string>()\n      const skipInsertForRows = new Set<number>()\n\n      // 遍历每一行的第 tdIndex 列，处理合并单元格\n      for (let x = 0; x < matrix.length; x += 1) {\n        if (mergeInspectColIndex < 0) {\n          continue\n        }\n\n        // 安全检查：确保行和列都存在\n        if (!matrix[x] || !matrix[x][mergeInspectColIndex]) {\n          continue\n        }\n\n        const [[,], {\n          rtl, ltr, ttb, btt,\n        }] = matrix[x][mergeInspectColIndex]\n\n        // 判断是否是合并单元格\n        if (rtl > 1 || ltr > 1 || ttb > 1 || btt > 1) {\n          // 这是合并单元格的一部分\n          // 找到真实单元格的位置（左上角的位置）\n          // rtl表示从右到左的距离，所以真实单元格列 = 当前列 - (rtl - 1)\n          // ttb表示从上到下的距离，所以真实单元格行 = 当前行 - (ttb - 1)\n          const realCellRow = x - (ttb - 1)\n          const realCellCol = mergeInspectColIndex - (rtl - 1)\n\n          // 安全检查：确保真实单元格位置存在\n          if (realCellRow < 0 || realCellRow >= matrix.length\n              || !matrix[realCellRow] || !matrix[realCellRow][realCellCol]) {\n            continue\n          }\n\n          const [[realCellElement, realCellPath]] = matrix[realCellRow][realCellCol]\n          const realCellPathKey = realCellPath.join(',')\n\n          // 避免重复处理同一个合并单元格\n          if (!processedMergedCells.has(realCellPathKey)) {\n            processedMergedCells.add(realCellPathKey)\n\n            const { rowSpan = 1, colSpan = 1 } = realCellElement\n            const newColSpan = colSpan + 1\n\n            // 更新真实单元格的 colSpan\n            if (!realCellElement.hidden) {\n              Transforms.setNodes<TableCellElement>(\n                editor,\n                {\n                  colSpan: newColSpan,\n                },\n                { at: realCellPath },\n              )\n            }\n\n            // 标记所有被这个合并单元格影响的行，这些行不需要插入新的单元格\n            // 从真实单元格的行开始，标记rowSpan行\n            for (let r = 0; r < rowSpan; r += 1) {\n              skipInsertForRows.add(realCellRow + r)\n            }\n          } else {\n            // 如果已经处理过这个合并单元格，当前行也不需要插入新单元格\n            skipInsertForRows.add(x)\n          }\n        }\n      }\n\n      // 遍历所有行，为需要插入的行添加新单元格\n      for (let x = 0; x < matrix.length; x += 1) {\n        // 如果这一行被合并单元格覆盖，则不插入新单元格\n        if (skipInsertForRows.has(x)) {\n          continue\n        }\n\n        const currentRow = matrix[x]\n\n        // 安全检查：确保矩阵位置存在\n        if (!currentRow || currentRow.length === 0) {\n          continue\n        }\n\n        const newCell: TableCellElement = {\n          type: 'table-cell',\n          children: [{ text: '' }],\n        }\n\n        // 如果是第一行且表格有标题，设置为标题单元格\n        if (x === 0 && isTableWithHeader(tableNode)) {\n          newCell.isHeader = true\n        }\n\n        let insertPath: Path\n\n        if (insertColIndex < currentRow.length) {\n          const [[, pathAtInsertCol]] = currentRow[insertColIndex]\n\n          insertPath = pathAtInsertCol as Path\n        } else {\n          const [[, lastCellPath]] = currentRow[currentRow.length - 1]\n\n          insertPath = Path.next(lastCellPath as Path)\n        }\n\n        Transforms.insertNodes(editor, newCell, { at: insertPath })\n      }\n\n      // 调整 columnWidths\n      const [tableEntry] = Editor.nodes(editor, {\n        match: n => DomEditor.checkNodeType(n, 'table'),\n        universal: true,\n      })\n\n      if (tableEntry) {\n        const [elemNode, tablePath] = tableEntry\n        const { columnWidths = [] } = elemNode as TableElement\n        const adjustColumnWidths = [...columnWidths]\n\n        // 获取当前列的宽度，如果没有设置则使用默认宽度\n        const { minWidth = 60 } = editor.getMenuConfig('insertTable')\n        const currentColWidth = columnWidths[tdIndex] || parseInt(minWidth.toString(), 10) || 60\n\n        // 将当前列宽度一分为二\n        const halfWidth = Math.floor(currentColWidth / 2)\n        const remainingWidth = currentColWidth - halfWidth\n\n        if (normalizedInsertPosition === 'after') {\n          // 在当前位置后插入新列（右侧）\n          adjustColumnWidths[tdIndex] = remainingWidth\n          adjustColumnWidths.splice(tdIndex + 1, 0, halfWidth)\n        } else {\n          // 在当前位置前插入新列（左侧）\n          adjustColumnWidths.splice(tdIndex, 0, halfWidth)\n          // 更新原列宽度为剩余的一半\n          adjustColumnWidths[tdIndex + 1] = remainingWidth\n        }\n\n        Transforms.setNodes(editor, { columnWidths: adjustColumnWidths } as TableElement, {\n          at: tablePath,\n        })\n      }\n    })\n  }\n}\n\nexport default InsertCol\n","/**\n * @description insert row menu\n * @author wangfupeng\n */\n\nimport {\n  DomEditor, IButtonMenu, IDomEditor, t,\n} from '@wangeditor-next/core'\nimport {\n  Editor, Path, Range, Transforms,\n} from 'slate'\n\nimport { ADD_ROW_SVG } from '../../constants/svg'\nimport { filledMatrix } from '../../utils'\nimport { TableCellElement, TableRowElement } from '../custom-types'\n\nclass InsertRow implements IButtonMenu {\n  readonly title = t('tableModule.insertRow')\n\n  readonly iconSvg = ADD_ROW_SVG\n\n  readonly tag = 'button'\n\n  getValue(_editor: IDomEditor): string | boolean {\n    // 无需获取 val\n    return ''\n  }\n\n  isActive(_editor: IDomEditor): boolean {\n    // 无需 active\n    return false\n  }\n\n  isDisabled(editor: IDomEditor): boolean {\n    const { selection } = editor\n\n    if (selection == null) { return true }\n    if (!Range.isCollapsed(selection)) { return true }\n\n    const tableNode = DomEditor.getSelectedNodeByType(editor, 'table')\n\n    if (tableNode == null) {\n      // 选区未处于 table cell node ，则禁用\n      return true\n    }\n    return false\n  }\n\n  exec(editor: IDomEditor, _value: string | boolean) {\n    if (this.isDisabled(editor)) { return }\n\n    const [cellEntry] = Editor.nodes(editor, {\n      match: n => DomEditor.checkNodeType(n, 'table-cell'),\n      universal: true,\n    })\n    const [, cellPath] = cellEntry\n\n    const matrix = filledMatrix(editor)\n    // 向下插入行为，先找到\n    // 当前选区所在的 tr 索引\n    let trIndex = 0\n    /* eslint-disable no-labels */\n\n    outer: for (let x = 0; x < matrix.length; x += 1) {\n      for (let y = 0; y < matrix[x].length; y += 1) {\n        const [[, path]] = matrix[x][y]\n\n        if (!Path.equals(cellPath, path)) {\n          continue\n        }\n        trIndex = x\n        // eslint-disable-next-line no-labels\n        break outer\n      }\n    }\n\n    // 获取表格的真实列数（使用matrix的列数，而不是当前行的physical cell数量）\n    const cellsLength = matrix[trIndex]?.length || 0\n\n    if (cellsLength === 0) { return }\n\n    Editor.withoutNormalizing(editor, () => {\n      // 向下添加 tr 索引\n      const destIndex = trIndex + 1\n      const isWithinBounds = destIndex >= 0 && destIndex < matrix.length\n      const exitMerge: number[] = []\n\n      for (let y = 0; isWithinBounds && y < matrix[trIndex].length; y += 1) {\n        const [, { ttb, btt }] = matrix[trIndex][y]\n\n        // 向上找到 1 元素为止\n        if (ttb > 1 || btt > 1) {\n          const originalRowIndex = trIndex - (ttb - 1)\n\n          // 安全检查：确保目标行和列都存在\n          if (originalRowIndex < 0 || originalRowIndex >= matrix.length || !matrix[originalRowIndex] || !matrix[originalRowIndex][y]) {\n            continue\n          }\n\n          const [[element, path]] = matrix[originalRowIndex][y]\n          const rowSpan = element.rowSpan || 1\n\n          exitMerge.push(y)\n          if (!element.hidden) {\n            Transforms.setNodes<TableCellElement>(\n              editor,\n              {\n                rowSpan: rowSpan + 1,\n              },\n              { at: path },\n            )\n          }\n        }\n      }\n\n      // 拼接新的 row\n      const { minRowHeight = 30 } = editor.getMenuConfig('insertTable') || {}\n      const defaultRowHeight = parseInt(minRowHeight.toString(), 10) || 30\n      const newRow: TableRowElement = { type: 'table-row', children: [], height: defaultRowHeight }\n\n      // 只为不被合并单元格覆盖的位置创建td元素\n      for (let i = 0; i < cellsLength; i += 1) {\n        // 如果当前位置被合并单元格覆盖，则跳过（不创建td）\n        if (exitMerge.includes(i)) {\n          continue\n        }\n\n        const cell: TableCellElement = {\n          type: 'table-cell',\n          children: [{ text: '' }],\n        }\n\n        newRow.children.push(cell)\n      }\n\n      // 插入 row\n      const rowPath = Path.parent(cellPath) // 获取 tr 的 path\n      const newRowPath = Path.next(rowPath)\n\n      Transforms.insertNodes(editor, newRow, { at: newRowPath })\n\n      // 新插入的行已经在创建时设置了高度属性，无需额外操作\n    })\n  }\n}\n\nexport default InsertRow\n","/**\n * @description insert table menu\n * @author wangfupeng\n */\n\nimport {\n  DomEditor, IDomEditor, IDropPanelMenu, t,\n} from '@wangeditor-next/core'\nimport {\n  Range, Transforms,\n} from 'slate'\n\nimport { TABLE_SVG } from '../../constants/svg'\nimport $, { Dom7Array, DOMElement } from '../../utils/dom'\nimport { TableCellElement, TableElement, TableRowElement } from '../custom-types'\n\nfunction genTableNode(editor: IDomEditor, rowNum: number, colNum: number): TableElement {\n  // 拼接 rows\n  const rows: TableRowElement[] = []\n  const {\n    minWidth = 60, minRowHeight = 30, tableFullWidth, tableHeader,\n  } = editor.getMenuConfig('insertTable')\n  const columnWidths: number[] = Array(colNum).fill(parseInt(minWidth, 10) || 60)\n\n  for (let i = 0; i < rowNum; i += 1) {\n    // 拼接 cells\n    const cells: TableCellElement[] = []\n\n    for (let j = 0; j < colNum; j += 1) {\n      const cellNode: TableCellElement = {\n        type: 'table-cell',\n        children: [{ text: '' }],\n      }\n\n      if (i === 0) {\n        cellNode.isHeader = tableHeader?.selected ?? true // 第一行默认是 th\n      }\n      cells.push(cellNode)\n    }\n\n    // 生成 row\n    rows.push({\n      type: 'table-row',\n      children: cells,\n      height: parseInt(minRowHeight, 10) || 30,\n    })\n  }\n\n  return {\n    type: 'table',\n    width: tableFullWidth?.selected ? '100%' : 'auto',\n    children: rows,\n    columnWidths,\n  }\n}\n\nclass InsertTable implements IDropPanelMenu {\n  title = t('tableModule.insertTable')\n\n  iconSvg = TABLE_SVG\n\n  tag = 'button'\n\n  showDropPanel = true // 点击 button 时显示 dropPanel\n\n  private $content: Dom7Array | null = null\n\n  getValue(_editor: IDomEditor): string | boolean {\n    // 插入菜单，不需要 value\n    return ''\n  }\n\n  isActive(_editor: IDomEditor): boolean {\n    // 任何时候，都不用激活 menu\n    return false\n  }\n\n  exec(_editor: IDomEditor, _value: string | boolean) {\n    // 点击菜单时，弹出 modal 之前，不需要执行其他代码\n    // 此处空着即可\n  }\n\n  isDisabled(editor: IDomEditor): boolean {\n    const { selection } = editor\n\n    if (selection == null) { return true }\n    if (!Range.isCollapsed(selection)) { return true } // 选区非折叠，禁用\n\n    const selectedElems = DomEditor.getSelectedElems(editor)\n    const hasVoidOrPreOrTable = selectedElems.some(elem => {\n      const type = DomEditor.getNodeType(elem)\n\n      if (type === 'pre') { return true }\n      if (type === 'table') { return true }\n      if (type === 'list-item') { return true }\n      if (editor.isVoid(elem)) { return true }\n      return false\n    })\n\n    if (hasVoidOrPreOrTable) { return true } // 匹配到，禁用\n\n    return false\n  }\n\n  /**\n   *  获取 panel 内容\n   * @param editor editor\n   */\n  getPanelContentElem(editor: IDomEditor): DOMElement {\n    // 已有，直接返回\n    if (this.$content) { return this.$content[0] }\n\n    // 初始化\n    const $content = $('<div class=\"w-e-panel-content-table\"></div>')\n    const $info = $('<span>0 &times; 0</span>') // 显示行列数量\n\n    // 渲染 10 * 10 table ，以快速创建表格\n    const $table = $('<table></table>')\n\n    for (let i = 0; i < 10; i += 1) {\n      const $tr = $('<tr></tr>')\n\n      for (let j = 0; j < 10; j += 1) {\n        const $td = $('<td></td>')\n\n        $td.attr('data-x', j.toString())\n        $td.attr('data-y', i.toString())\n        $tr.append($td)\n\n        // 绑定 mouseenter\n        $td.on('mouseenter', (e: Event) => {\n          const { target } = e\n\n          if (target == null) { return }\n          const $focusTd = $(target)\n          const { x: focusX, y: focusY } = $focusTd.dataset()\n\n          // 显示行列数量\n          $info[0].innerHTML = `${focusX + 1} &times; ${focusY + 1}`\n\n          // 修改 table td 样式\n          $table.children().each(tr => {\n            $(tr)\n              .children()\n              .each(td => {\n                const $newTd = $(td)\n                const { x, y } = $newTd.dataset()\n\n                if (x <= focusX && y <= focusY) {\n                  $newTd.addClass('active')\n                } else {\n                  $newTd.removeClass('active')\n                }\n              })\n          })\n        })\n\n        // 绑定 click\n        $td.on('click', (e: Event) => {\n          e.preventDefault()\n          const { target } = e\n\n          if (target == null) { return }\n          // eslint-disable-next-line @typescript-eslint/no-shadow\n          const $td = $(target)\n          const { x, y } = $td.dataset()\n\n          this.insertTable(editor, y + 1, x + 1)\n        })\n      }\n      $table.append($tr)\n    }\n    $content.append($table)\n    $content.append($info)\n\n    // 记录，并返回\n    this.$content = $content\n    return $content[0]\n  }\n\n  private insertTable(editor: IDomEditor, rowNumStr: string, colNumStr: string) {\n    const rowNum = parseInt(rowNumStr, 10)\n    const colNum = parseInt(colNumStr, 10)\n\n    if (!rowNum || !colNum) { return }\n    if (rowNum <= 0 || colNum <= 0) { return }\n\n    // 如果当前是空 p ，则删除该 p\n    if (DomEditor.isSelectedEmptyParagraph(editor)) {\n      Transforms.removeNodes(editor, { mode: 'highest' })\n    }\n\n    // 插入表格\n    const tableNode = genTableNode(editor, rowNum, colNum)\n\n    Transforms.insertNodes(editor, tableNode, { mode: 'highest' })\n  }\n}\n\nexport default InsertTable\n","import {\n  Editor,\n  Element,\n  Location,\n  NodeEntry,\n} from 'slate'\n\nimport { isOfType } from '../utils'\nimport { EDITOR_TO_SELECTION, EDITOR_TO_SELECTION_SET } from './weak-maps'\n\nexport const TableCursor = {\n  /** @returns {boolean} `true` if the selection is inside a table, otherwise `false`. */\n  isInTable(editor: Editor, options: { at?: Location } = {}): boolean {\n    const [table] = Editor.nodes(editor, {\n      match: isOfType(editor, 'table'),\n      at: options.at,\n    })\n\n    return !!table\n  },\n  /**\n   * Retrieves a matrix representing the selected cells within a table.\n   * @returns {NodeEntry<T>[][]} A matrix containing the selected cells.\n   */\n  * selection(editor: Editor): Generator<NodeEntry[]> {\n    const matrix = EDITOR_TO_SELECTION.get(editor)\n\n    for (let x = 0; matrix && x < matrix.length; x += 1) {\n      const cells: NodeEntry[] = []\n\n      for (let y = 0; y < matrix[x].length; y += 1) {\n        const [entry, { ltr: colSpan, ttb }] = matrix[x][y]\n\n        if (ttb === 1) { cells.push(entry) }\n\n        y += colSpan - 1\n      }\n\n      yield cells\n    }\n  },\n  /** Clears the selection from the table */\n  unselect(editor: Editor): void {\n    // const matrix = EDITOR_TO_SELECTION.get(editor);\n\n    // if (!matrix?.length) {\n    //   return;\n    // }\n\n    // for (let x = 0; x < matrix.length; x+=1) {\n    //   for (let y = 0; y < matrix[x].length; y+=1) {\n    //     const [[, path], { ltr: colSpan, ttb }] = matrix[x][y];\n    //     y += colSpan - 1;\n\n    //     if (ttb > 1) {\n    //       continue;\n    //     }\n\n    //     // no-op since the paths are the same\n    //     const noop: Operation = {\n    //       type: \"move_node\",\n    //       newPath: path,\n    //       path: path,\n    //     };\n    //     Transforms.transform(editor, noop);\n    //   }\n    // }\n\n    EDITOR_TO_SELECTION_SET.delete(editor)\n    EDITOR_TO_SELECTION.delete(editor)\n    // 清除选区\n    // document.getSelection()?.removeAllRanges()\n  },\n  /**\n   * Checks whether a given cell is part of the current table selection.\n   * @returns {boolean} - Returns true if the cell is selected, otherwise false.\n   */\n  isSelected<T extends Element>(editor: Editor, element: T): boolean {\n    const selectedElements = EDITOR_TO_SELECTION_SET.get(editor)\n\n    if (!selectedElements) {\n      return false\n    }\n\n    return selectedElements.has(element)\n  },\n\n  hasSelected(editor: Editor) {\n    return EDITOR_TO_SELECTION.has(editor)\n  },\n}\n","import { IButtonMenu, IDomEditor, t } from '@wangeditor-next/core'\nimport {\n  Editor, Node, Path, Transforms,\n} from 'slate'\n\nimport { MERGE_CELL_SVG } from '../../constants/svg'\nimport {\n  CellElement, hasCommon,\n} from '../../utils'\nimport { TableCursor } from '../table-cursor'\nimport { EDITOR_TO_SELECTION } from '../weak-maps'\n\nclass MergeCell implements IButtonMenu {\n  readonly title = t('tableModule.mergeCell')\n\n  readonly iconSvg = MERGE_CELL_SVG\n\n  readonly tag = 'button'\n\n  getValue(_editor: IDomEditor): string | boolean {\n    // 无需获取 val\n    return ''\n  }\n\n  isActive(_editor: IDomEditor): boolean {\n    // 无需 active\n    return false\n  }\n\n  isDisabled(editor: IDomEditor): boolean {\n    return !this.canMerge(editor)\n  }\n\n  exec(editor: IDomEditor, _value: string | boolean) {\n    if (this.isDisabled(editor)) { return }\n\n    this.merge(editor)\n    // 释放选区\n    TableCursor.unselect(editor)\n  }\n\n  /**\n   * Checks if the current selection can be merged. Merging is not possible when any of the following conditions are met:\n   * - The selection is empty.\n   * - The selection is not within the same \"thead\", \"tbody,\" or \"tfoot\" section.\n   * @returns {boolean} `true` if the selection can be merged, otherwise `false`.\n   */\n  canMerge(editor: Editor): boolean {\n    const matrix = EDITOR_TO_SELECTION.get(editor)\n\n    // cannot merge when selection is empty\n    if (!matrix || !matrix.length) {\n      return false\n    }\n\n    // prettier-ignore\n    const [[, lastPath]] = matrix[matrix.length - 1][matrix[matrix.length - 1].length - 1]\n    const [[, firstPath]] = matrix[0][0]\n\n    // cannot merge when selection is not in common section\n    if (!hasCommon(editor, [firstPath, lastPath], 'table')) {\n      return false\n    }\n\n    return true\n  }\n\n  /**\n   * Merges the selected cells in the table.\n   * @returns void\n   */\n  merge(editor: Editor): void {\n    if (!this.canMerge(editor)) {\n      return\n    }\n\n    const selection = EDITOR_TO_SELECTION.get(editor)\n\n    if (!selection || !selection.length) {\n      return\n    }\n\n    const [[, basePath]] = selection[0][0]\n    const [[, lastPath]] = Node.children(editor, basePath, { reverse: true })\n\n    Editor.withoutNormalizing(editor, () => {\n      // 收集所有真实的单元格（避免重复计算虚拟位置）\n      const realCells = new Map<string, { path: Path; x: number; y: number; element: CellElement }>()\n      const cellsToDelete: Path[] = []\n\n      // 计算实际的边界范围（考虑单元格的实际跨度）\n      let minRow = Infinity\n      let maxRow = -Infinity\n      let minCol = Infinity\n      let maxCol = -Infinity\n\n      // 第一阶段：收集所有真实单元格并计算其实际占用的范围\n      for (let x = 0; x < selection.length; x += 1) {\n        for (let y = 0; y < selection[x].length; y += 1) {\n          const [[element, path], { ttb }] = selection[x][y]\n          const pathKey = path.join(',')\n\n          // 只处理真实单元格（ttb === 1 表示单元格的实际位置，不是虚拟扩展）\n          if (ttb === 1 && !realCells.has(pathKey)) {\n            realCells.set(pathKey, {\n              path, x, y, element,\n            })\n\n            // 获取当前单元格的跨度\n            const { rowSpan = 1, colSpan = 1 } = element\n\n            // 计算该单元格实际占用的范围\n            const cellMinRow = x\n            const cellMaxRow = x + rowSpan - 1\n            const cellMinCol = y\n            const cellMaxCol = y + colSpan - 1\n\n            // 更新整体边界\n            minRow = Math.min(minRow, cellMinRow)\n            maxRow = Math.max(maxRow, cellMaxRow)\n            minCol = Math.min(minCol, cellMinCol)\n            maxCol = Math.max(maxCol, cellMaxCol)\n          }\n        }\n      }\n\n      // 计算正确的rowSpan和colSpan（基于实际占用的行列范围）\n      const finalRowSpan = maxRow - minRow + 1\n      const finalColSpan = maxCol - minCol + 1\n\n      // 第二阶段：确定要删除的单元格\n      for (const [, { path }] of realCells) {\n        // 跳过基础单元格（第一个单元格作为合并后的目标）\n        if (Path.equals(basePath, path)) {\n          continue\n        }\n\n        cellsToDelete.push(path)\n      }\n\n      // 第三阶段：按路径降序排序并删除单元格\n      cellsToDelete.sort((a, b) => {\n        for (let i = 0; i < Math.min(a.length, b.length); i += 1) {\n          if (a[i] !== b[i]) {\n            return b[i] - a[i] // 降序\n          }\n        }\n        return b.length - a.length\n      })\n\n      // 删除单元格并移动内容\n      for (const path of cellsToDelete) {\n        try {\n          // 检查节点是否仍然存在\n          if (!Editor.hasPath(editor, path)) {\n            continue\n          }\n\n          // 移动单元格内容到基础单元格\n          for (const [, childPath] of Node.children(editor, path, { reverse: true })) {\n            Transforms.moveNodes(editor, {\n              to: Path.next(lastPath),\n              at: childPath,\n            })\n          }\n\n          // 删除单元格\n          Transforms.removeNodes(editor, { at: path })\n        } catch (error) {\n          // 静默处理删除失败的情况\n        }\n      }\n\n      // 为基础单元格设置正确的rowSpan和colSpan属性\n      Transforms.setNodes<CellElement>(editor, { rowSpan: finalRowSpan, colSpan: finalColSpan }, { at: basePath })\n    })\n  }\n}\n\nexport default MergeCell\n","import {\n  DomEditor, IButtonMenu, IDomEditor, t,\n} from '@wangeditor-next/core'\nimport { Editor, Path, Transforms } from 'slate'\n\nimport { SPLIT_CELL_SVG } from '../../constants/svg'\nimport { CellElement, isOfType } from '../../utils'\nimport { TableCellElement, TableElement } from '../custom-types'\nimport { isTableWithHeader } from '../helpers'\n// import { DEFAULT_WITH_TABLE_OPTIONS } from \"../../utils/options\";\n\nclass SplitCell implements IButtonMenu {\n  readonly title = t('tableModule.splitCell')\n\n  readonly iconSvg = SPLIT_CELL_SVG\n\n  readonly tag = 'button'\n\n  getValue(_editor: IDomEditor): string | boolean {\n    // 无需获取 val\n    return ''\n  }\n\n  isActive(_editor: IDomEditor): boolean {\n    // 无需 active\n    return false\n  }\n\n  isDisabled(editor: IDomEditor): boolean {\n    // 查找当前选中的单元格，支持td和th两种类型\n    const [cell] = Editor.nodes(editor, {\n      match: n => {\n        return DomEditor.checkNodeType(n, 'table-cell')\n      },\n    })\n\n    if (!cell) {\n      return true // 如果没有找到单元格，则禁用拆分功能\n    }\n\n    const [{ rowSpan = 1, colSpan = 1 }] = cell as CellElement[]\n\n    // 只有当rowSpan或colSpan大于1时才能拆分\n    if (rowSpan > 1 || colSpan > 1) {\n      return false\n    }\n\n    return true\n  }\n\n  exec(editor: IDomEditor, _value: string | boolean) {\n    if (this.isDisabled(editor)) { return }\n\n    this.split(editor)\n  }\n\n  /**\n   * Splits either the cell at the current selection or a specified location. If a range\n   * selection is present, all cells within the range will be split.\n   * @param {Location} [options.at] - Splits the cell at the specified location. If no\n   * location is specified it will split the cell at the current selection\n   * @param {boolean} [options.all] - If true, splits all cells in the table\n   * @returns void\n   */\n  split(editor: Editor, options: { at?: Location; all?: boolean } = {}): void {\n    const [table, td] = Editor.nodes(editor, {\n      match: isOfType(editor, 'table', 'th', 'td'),\n      // @ts-ignore\n      at: options.at,\n    })\n\n    if (!table || !td) {\n      return\n    }\n\n    const [tableNode] = table as [TableElement, Path]\n    const hasHeader = isTableWithHeader(tableNode)\n\n    // 获取当前选中的单元格\n    const [selectedCell, selectedCellPath] = td as [CellElement, Path]\n    const { rowSpan = 1, colSpan = 1 } = selectedCell\n\n    // 如果单元格未合并，无需拆分\n    if (rowSpan === 1 && colSpan === 1) {\n      return\n    }\n\n    Editor.withoutNormalizing(editor, () => {\n      // 1. 重置当前单元格的rowSpan和colSpan\n      Transforms.setNodes<CellElement>(editor, { rowSpan: 1, colSpan: 1 }, { at: selectedCellPath })\n\n      // 2. 处理同行的其他列（colSpan > 1的情况）\n      // 在当前单元格后面插入 colSpan-1 个新单元格\n      for (let c = 1; c < colSpan; c += 1) {\n        const newCell: TableCellElement = {\n          type: 'table-cell',\n          children: [{ text: '' }],\n        }\n\n        // 如果在第一行且表格有表头，设置isHeader\n        const currentRowIndex = selectedCellPath[selectedCellPath.length - 2]\n\n        if (currentRowIndex === 0 && hasHeader) {\n          newCell.isHeader = true\n        }\n\n        // 在当前行的当前位置之后插入\n        const currentRowPath = selectedCellPath.slice(0, -1)\n        const insertIndex = selectedCellPath[selectedCellPath.length - 1] + c\n        const insertPath = [...currentRowPath, insertIndex]\n\n        try {\n          Transforms.insertNodes(editor, newCell, { at: insertPath })\n        } catch (error) {\n          // 如果指定位置插入失败，在行末尾插入\n          try {\n            const [currentRow] = Editor.node(editor, currentRowPath)\n            const cellsCount = (currentRow as any).children.length\n            const fallbackPath = [...currentRowPath, cellsCount]\n\n            Transforms.insertNodes(editor, newCell, { at: fallbackPath })\n          } catch (fallbackError) {\n            console.warn(`插入同行单元格失败: ${fallbackError instanceof Error ? fallbackError.message : String(fallbackError)}`)\n          }\n        }\n      }\n\n      // 3. 处理其他行（rowSpan > 1的情况）\n      // 在下面的每一行都插入相应数量的单元格\n      for (let r = 1; r < rowSpan; r += 1) {\n        // 计算目标行路径\n        const targetRowIndex = selectedCellPath[selectedCellPath.length - 2] + r\n        const targetRowPath = [...selectedCellPath.slice(0, -2), targetRowIndex]\n\n        try {\n          // 检查目标行是否存在\n          const [targetRow] = Editor.node(editor, targetRowPath)\n\n          if (!targetRow) {\n            console.warn(`目标行 ${targetRowIndex} 不存在`)\n            continue\n          }\n\n          // 在目标行中插入colSpan个新单元格\n          for (let c = 0; c < colSpan; c += 1) {\n            const newCell: TableCellElement = {\n              type: 'table-cell',\n              children: [{ text: '' }],\n            }\n\n            // 计算插入位置\n            const originalColumnIndex = selectedCellPath[selectedCellPath.length - 1]\n            const insertIndex = originalColumnIndex + c\n            const insertPath = [...targetRowPath, insertIndex]\n\n            try {\n              // 获取目标行当前的单元格数量\n              const currentCellsCount = (targetRow as any).children.length\n\n              // 如果插入位置超出当前行的范围，在行末尾插入\n              if (insertIndex >= currentCellsCount) {\n                const endPath = [...targetRowPath, currentCellsCount]\n\n                Transforms.insertNodes(editor, newCell, { at: endPath })\n              } else {\n                Transforms.insertNodes(editor, newCell, { at: insertPath })\n              }\n            } catch (insertError) {\n              // 最后的备用方案：在行末尾插入\n              try {\n                const updatedCellsCount = (targetRow as any).children.length\n                const fallbackPath = [...targetRowPath, updatedCellsCount]\n\n                Transforms.insertNodes(editor, newCell, { at: fallbackPath })\n              } catch (finalError) {\n                console.warn(`插入单元格到第${r}行失败: ${finalError instanceof Error ? finalError.message : String(finalError)}`)\n              }\n            }\n          }\n        } catch (rowError) {\n          console.warn(`处理第${r}行时出错: ${rowError instanceof Error ? rowError.message : String(rowError)}`)\n        }\n      }\n    })\n  }\n}\n\nexport default SplitCell\n","/**\n * @description table header menu\n * @author wangfupeng\n */\n\nimport {\n  DomEditor, IButtonMenu, IDomEditor, t,\n} from '@wangeditor-next/core'\nimport { Range, Transforms } from 'slate'\n\nimport { TABLE_HEADER_SVG } from '../../constants/svg'\nimport { TableElement } from '../custom-types'\nimport { getFirstRowCells, isTableWithHeader } from '../helpers'\n\nclass TableHeader implements IButtonMenu {\n  readonly title = t('tableModule.header')\n\n  readonly iconSvg = TABLE_HEADER_SVG\n\n  readonly tag = 'button'\n\n  // 是否已设置表头\n  getValue(editor: IDomEditor): string | boolean {\n    const tableNode = DomEditor.getSelectedNodeByType(editor, 'table') as TableElement\n\n    if (tableNode == null) { return false }\n\n    return isTableWithHeader(tableNode)\n  }\n\n  isActive(editor: IDomEditor): boolean {\n    return !!this.getValue(editor)\n  }\n\n  isDisabled(editor: IDomEditor): boolean {\n    const { selection } = editor\n\n    if (selection == null) { return true }\n    if (!Range.isCollapsed(selection)) { return true }\n\n    const tableNode = DomEditor.getSelectedNodeByType(editor, 'table')\n\n    if (tableNode == null) {\n      // 选区未处于 table node ，则禁用\n      return true\n    }\n    return false\n  }\n\n  exec(editor: IDomEditor, value: string | boolean) {\n    if (this.isDisabled(editor)) { return }\n\n    // 已经设置了表头，则取消。未设置表头，则设置\n    const newValue = !value\n\n    // 获取第一行所有 cell\n    const tableNode = DomEditor.getSelectedNodeByType(editor, 'table') as TableElement\n\n    if (tableNode == null) { return }\n    const firstRowCells = getFirstRowCells(tableNode)\n\n    // 设置 isHeader 属性\n    firstRowCells.forEach(cell => Transforms.setNodes(\n      editor,\n      { isHeader: newValue },\n      {\n        at: DomEditor.findPath(editor, cell),\n      },\n    ))\n  }\n}\n\nexport default TableHeader\n","/**\n * @description table menu\n * @author wangfupeng\n */\n\nimport CellProperty from './CellProperty'\nimport DeleteCol from './DeleteCol'\nimport DeleteRow from './DeleteRow'\nimport DeleteTable from './DeleteTable'\nimport FullWidth from './FullWidth'\nimport InsertCol from './InsertCol'\nimport InsertRow from './InsertRow'\nimport InsertTable from './InsertTable'\nimport MergeCell from './MergeCell'\nimport SplitCell from './SplitCell'\nimport TableHander from './TableHeader'\nimport TableProperty from './TableProperty'\n\nexport const insertTableMenuConf = {\n  key: 'insertTable',\n  config: {\n    minWidth: 60,\n    minRowHeight: 30,\n    tableHeader: {\n      selected: true,\n    },\n    tableFullWidth: {\n      selected: false,\n    },\n    widthExportMode: 'explicit',\n  },\n  factory() {\n    return new InsertTable()\n  },\n}\n\nexport const deleteTableMenuConf = {\n  key: 'deleteTable',\n  factory() {\n    return new DeleteTable()\n  },\n}\n\nexport const insertTableRowConf = {\n  key: 'insertTableRow',\n  factory() {\n    return new InsertRow()\n  },\n}\n\nexport const deleteTableRowConf = {\n  key: 'deleteTableRow',\n  factory() {\n    return new DeleteRow()\n  },\n}\n\nexport const insertTableColConf = {\n  key: 'insertTableCol',\n  factory() {\n    return new InsertCol()\n  },\n}\n\nexport const deleteTableColConf = {\n  key: 'deleteTableCol',\n  factory() {\n    return new DeleteCol()\n  },\n}\n\nexport const tableHeaderMenuConf = {\n  key: 'tableHeader',\n  factory() {\n    return new TableHander()\n  },\n}\n\nexport const tableFullWidthMenuConf = {\n  key: 'tableFullWidth',\n  factory() {\n    return new FullWidth()\n  },\n}\n\n/** Meger / Split conf */\nexport const mergeTableCellConf = {\n  key: 'mergeTableCell',\n  factory() {\n    return new MergeCell()\n  },\n}\n\nexport const splitTableCellConf = {\n  key: 'splitTableCell',\n  factory() {\n    return new SplitCell()\n  },\n}\n\n/** set property conf */\nexport const setTablePropertyConf = {\n  key: 'setTableProperty',\n  factory() {\n    return new TableProperty()\n  },\n}\n\nexport const setTableCellPropertyConf = {\n  key: 'setTableCellProperty',\n  factory() {\n    return new CellProperty()\n  },\n}\n","/**\n * @description parse html\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport { Descendant, Text } from 'slate'\n\nimport $, { DOMElement, getStyleValue, getTagName } from '../utils/dom'\nimport { TableCellElement, TableElement, TableRowElement } from './custom-types'\n\nconst DEFAULT_PERCENT_TABLE_WIDTH = 600\n\nfunction parsePixelSize(value: string | null | undefined, fallback = 0): number {\n  const parsedValue = parseInt(value || '', 10)\n\n  if (Number.isNaN(parsedValue)) {\n    return fallback\n  }\n\n  return parsedValue\n}\n\nfunction parseCssPixelSize(\n  value: string | null | undefined,\n  fallback = 0,\n  percentageBase = 0,\n): number {\n  const rawValue = (value || '').trim().toLowerCase()\n  const parsedValue = parseFloat(rawValue)\n\n  if (Number.isNaN(parsedValue)) {\n    return fallback\n  }\n\n  if (rawValue.endsWith('pt')) {\n    return Math.round((parsedValue * 4) / 3)\n  }\n  if (rawValue.endsWith('%')) {\n    const base = percentageBase > 0 ? percentageBase : DEFAULT_PERCENT_TABLE_WIDTH\n\n    return Math.round((parsedValue / 100) * base)\n  }\n\n  return Math.round(parsedValue)\n}\n\nfunction getColgroupWidths(\n  colgroupElements: HTMLCollection | null,\n  percentageBase: number,\n): number[] {\n  if (!colgroupElements || colgroupElements.length === 0) { return [] }\n\n  const columnWidths: number[] = []\n\n  Array.from(colgroupElements).forEach((col: any) => {\n    const span = parseInt(col.getAttribute('span') || '1', 10)\n    const width = parseCssPixelSize(\n      col.getAttribute('width') || getStyleValue($(col), 'width'),\n      90,\n      percentageBase,\n    )\n\n    if (Number.isNaN(width)) { return }\n\n    for (let i = 0; i < span; i += 1) {\n      columnWidths.push(width)\n    }\n  })\n\n  return columnWidths\n}\n\nfunction getTableWidthPixelBase($table: ReturnType<typeof $>): number {\n  const styleWidth = getStyleValue($table, 'width')\n  const widthAttr = $table.attr('width') || ''\n  const rawWidth = styleWidth || widthAttr\n\n  if (!rawWidth || rawWidth.trim() === '100%') {\n    return 0\n  }\n\n  return parseCssPixelSize(rawWidth, 0)\n}\n\nfunction parseCellHtml(\n  elem: DOMElement,\n  children: Descendant[],\n  editor: IDomEditor,\n): TableCellElement {\n  const $elem = $(elem)\n  const cellText = $elem.text().replace(/\\s+/gm, ' ').trim()\n\n  children = children.filter(child => {\n    if (DomEditor.getNodeType(child) === 'paragraph') { return true }\n    if (Text.isText(child)) { return true }\n    if (editor.isInline(child)) { return true }\n    return false\n  })\n\n  // 无 children ，则用纯文本\n  if (children.length === 0) {\n    children = [{ text: $elem.text().replace(/\\s+/gm, ' ') }]\n  }\n\n  const colSpan = parseInt($elem.attr('colSpan') || '1', 10)\n  const rowSpan = parseInt($elem.attr('rowSpan') || '1', 10)\n  const hidden = getStyleValue($elem, 'display') === 'none' && cellText.length === 0\n  const width = $elem.attr('width') || 'auto'\n\n  return {\n    type: 'table-cell',\n    isHeader: getTagName($elem) === 'th',\n    colSpan,\n    rowSpan,\n    width,\n    // @ts-ignore\n    children,\n    hidden,\n  }\n}\n\nexport const parseCellHtmlConf = {\n  selector: 'td:not([data-w-e-type]),th:not([data-w-e-type])', // data-w-e-type 属性，留给自定义元素，保证扩展性\n  parseElemHtml: parseCellHtml,\n}\n\nfunction parseRowHtml(\n  elem: DOMElement,\n  children: Descendant[],\n  _editor: IDomEditor,\n): TableRowElement {\n  const $elem = $(elem)\n  const tableCellChildren: TableCellElement[] = []\n\n  for (let i = 0; i < children.length; i += 1) {\n    const child = children[i]\n\n    // 确保是 table-cell 类型\n    if (DomEditor.getNodeType(child) === 'table-cell') {\n      const tableCell = child as TableCellElement\n\n      // 如果是隐藏的单元格，则跳过（删除）\n      if (tableCell.hidden) {\n        continue\n      }\n\n      tableCellChildren.push(tableCell) // 只添加非隐藏的单元格\n    }\n  }\n\n  // 解析行高度（style / class-mode data attr / legacy attr）\n  const rowHeightRaw = getStyleValue($elem, 'height')\n    || $elem.attr('data-w-e-row-height')\n    || $elem.attr('height')\n  const height = parsePixelSize(rowHeightRaw) || undefined\n\n  return {\n    type: 'table-row',\n    height,\n    children: tableCellChildren,\n  }\n}\n\nexport const parseRowHtmlConf = {\n  selector: 'tr:not([data-w-e-type])', // data-w-e-type 属性，留给自定义元素，保证扩展性\n  parseElemHtml: parseRowHtml,\n}\n\nfunction parseTableHtml(\n  elem: DOMElement,\n  children: Descendant[],\n  _editor: IDomEditor,\n): TableElement {\n  const $elem = $(elem)\n  const caption = ($elem.find('caption').text() || '').replace(/\\s+/gm, ' ').trim() || undefined\n\n  // 计算宽度\n  let tableWidth = 'auto'\n\n  const styleWidth = getStyleValue($elem, 'width')\n  const widthAttr = $elem.attr('width') || ''\n  const isClassModeTable = $elem.hasClass('w-e-table-layout-fixed') || !!$elem.attr('data-w-e-table-height')\n\n  if (styleWidth === '100%') { tableWidth = '100%' }\n  if ($elem.attr('width') === '100%') { tableWidth = '100%' } // 兼容 v4 格式\n  if (isClassModeTable && widthAttr && widthAttr !== 'auto' && widthAttr !== '100%') {\n    tableWidth = widthAttr\n  }\n\n  // 计算高度\n  const tableHeightRaw = getStyleValue($elem, 'height')\n    || $elem.attr('data-w-e-table-height')\n    || $elem.attr('height')\n  const height = parsePixelSize(tableHeightRaw)\n\n  const tableELement: TableElement = {\n    type: 'table',\n    width: tableWidth,\n    caption,\n    height,\n    // @ts-ignore\n    children: children.filter(child => DomEditor.getNodeType(child) === 'table-row'),\n  }\n  const tdList = $elem.find('tr')[0]?.children || []\n  const colgroupElments: HTMLCollection = $elem.find('colgroup')[0]?.children || null\n  const percentageBase = getTableWidthPixelBase($elem)\n  const colgroupWidths = getColgroupWidths(colgroupElments, percentageBase)\n\n  if (colgroupWidths.length > 0) {\n    tableELement.columnWidths = colgroupWidths\n  } else if (tdList.length > 0) {\n    const columnWidths: number[] = []\n\n    Array.from(tdList).forEach(td => {\n      const colSpan = parseInt($(td).attr('colSpan') || '1', 10) // 获取 colSpan，默认为 1\n      const width = parseCssPixelSize(getStyleValue($(td), 'width'), 90, percentageBase) // 获取 width，默认为 90\n\n      // 根据 colSpan 的值来填充 columnWidths 数组\n      columnWidths.push(width)\n      for (let i = 1; i < colSpan; i += 1) {\n        columnWidths.push(90)\n      }\n    })\n    tableELement.columnWidths = columnWidths\n  }\n  return tableELement\n}\n\nexport const parseTableHtmlConf = {\n  selector: 'table:not([data-w-e-type])', // data-w-e-type 属性，留给自定义元素，保证扩展性\n  parseElemHtml: parseTableHtml,\n}\n","/**\n * @description parse style html\n * @author hsuna\n */\nimport { IDomEditor } from '@wangeditor-next/core'\nimport { Descendant } from 'slate'\n\nimport $, { DOMElement, getStyleValue } from '../utils/dom'\nimport { TableCellElement } from './custom-types'\n\n// 获取 var(--w-e-textarea-border-color) 变量的实际样式值\nconst DEFAULT_BORDER_COLOR = window\n  ?.getComputedStyle(document.documentElement)\n  ?.getPropertyValue('--w-e-textarea-border-color')\n\n/**\n * 将 CSS 尺寸字符串中的 'pt' 转换为 'px'\n * 转换比例: 1pt = 1.333333px (基于 W3C 推荐的 96 DPI 标准)\n * @param cssValue 包含 pt 单位的 CSS 字符串 (如 \"medium 1pt 1pt 0.5pt\")\n * @returns 转换后的 CSS 字符串 (如 \"medium 1.333333px 1.333333px 0.6666665px\")\n */\nfunction convertPtToPx(cssValue: string): string {\n  if (!cssValue || typeof cssValue !== 'string' || !cssValue.includes('pt')) {\n    return cssValue\n  }\n\n  // 使用正则匹配所有带 'pt' 单位的值，例如 '1pt', '0.5pt', '100pt'，并进行替换\n  return cssValue.replace(/(\\d+(\\.\\d+)?)\\s*pt/g, (_, p1) => {\n    // p1 是捕获到的数字部分 (如 '1' 或 '0.5')\n    const ptValue = parseFloat(p1)\n    // 1pt ≈ 1.333333px。为了简化和保证精度，使用 4/3\n    const pxValue = ((ptValue * 4) / 3).toFixed(2)\n\n    return `${pxValue}px`\n  })\n}\n\nexport function parseStyleHtml(elem: DOMElement, node: Descendant, _editor: IDomEditor): Descendant {\n  if (!['TABLE', 'TD', 'TH'].includes(elem.tagName)) { return node }\n\n  const $elem = $(elem)\n\n  const tableNode = node as TableCellElement\n  let backgroundColor = getStyleValue($elem, 'background-color')\n\n  if (!backgroundColor) { backgroundColor = getStyleValue($elem, 'background') } // word 背景色\n  if (!backgroundColor) { backgroundColor = $elem.attr('bgcolor') || '' }\n  if (!backgroundColor) { backgroundColor = $elem.attr('data-w-e-background-color') || '' }\n  if (backgroundColor) {\n    tableNode.backgroundColor = backgroundColor\n  }\n\n  let border = getStyleValue($elem, 'border')\n\n  const dataBorderWidth = $elem.attr('data-w-e-border-width') || ''\n  const dataBorderLine = $elem.attr('data-w-e-border-line') || ''\n  const dataBorderColor = $elem.attr('data-w-e-border-color') || ''\n  const borderAttr = $elem.attr('border') || ''\n  const borderColorAttr = $elem.attr('bordercolor') || ''\n  const classAttr = $elem.attr('class') || ''\n  const classList = classAttr.trim().split(/\\s+/).filter(Boolean)\n  let borderStyleFromClass = ''\n\n  for (let i = 0; i < classList.length; i += 1) {\n    const className = classList[i]\n\n    if (!className.startsWith('w-e-table-border-style-')) { continue }\n    borderStyleFromClass = className.replace('w-e-table-border-style-', '')\n    break\n  }\n\n  const hasDataBorder = !!(dataBorderWidth || dataBorderLine || dataBorderColor || borderAttr || borderColorAttr || borderStyleFromClass)\n\n  if (!border && elem.tagName === 'TD' && !hasDataBorder) {\n    // https://github.com/wangeditor-next/wangEditor-next/blob/master/packages/table-module/src/assets/index.less#L20\n    // TD存在默认的css样式，尝试用getComputedStyle获取不到，只能写死\n    border = `1px solid ${DEFAULT_BORDER_COLOR}`\n  }\n\n  let [borderWidth, borderStyle, borderColor] = border?.split(' ') || []\n\n  borderWidth = getStyleValue($elem, 'border-width') || borderWidth // border 宽度\n  if (!borderWidth) { borderWidth = dataBorderWidth }\n  if (!borderWidth) { borderWidth = borderAttr }\n  if (borderWidth) {\n    tableNode.borderWidth = convertPtToPx(borderWidth.trim())\n  }\n  borderStyle = getStyleValue($elem, 'border-style') || borderStyle // border 样式\n  if (!borderStyle) { borderStyle = dataBorderLine }\n  if (!borderStyle) { borderStyle = borderStyleFromClass }\n  if (borderStyle) {\n    tableNode.borderStyle = borderStyle === 'none' ? '' : borderStyle\n  }\n  borderColor = getStyleValue($elem, 'border-color') || borderColor // border 颜色\n  if (!borderColor) { borderColor = borderColorAttr }\n  if (!borderColor) { borderColor = dataBorderColor }\n  if (borderColor) {\n    tableNode.borderColor = borderColor\n  }\n\n  let textAlign = getStyleValue($elem, 'text-align')\n\n  textAlign = getStyleValue($elem, 'text-align') || textAlign // 文本 对齐\n  if (!textAlign) { textAlign = $elem.attr('align') || '' }\n  if (!textAlign) { textAlign = $elem.attr('data-w-e-text-align') || '' }\n  if (textAlign) {\n    tableNode.textAlign = textAlign\n  }\n  return node\n}\n","/**\n * @description editor 插件，重写 editor API\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport {\n  BaseText,\n  Descendant,\n  Editor,\n  Element as SlateElement,\n  Location,\n  Node,\n  NodeEntry,\n  Path,\n  Point,\n  Text,\n  Transforms,\n} from 'slate'\n\nimport { TableCursor } from './table-cursor'\nimport { EDITOR_TO_SELECTION } from './weak-maps'\nimport { withSelection } from './with-selection'\n\nconst CELL_BREAK = '\\n'\n\n// table cell 内部的删除处理\nfunction deleteHandler(newEditor: IDomEditor): boolean {\n  const { selection } = newEditor\n\n  if (selection == null) { return false }\n\n  const [cellNodeEntry] = Editor.nodes(newEditor, {\n    match: n => DomEditor.checkNodeType(n, 'table-cell'),\n  })\n\n  if (cellNodeEntry) {\n    const [, cellPath] = cellNodeEntry\n    const start = Editor.start(newEditor, cellPath)\n\n    if (Point.equals(selection.anchor, start)) {\n      return true // 阻止删除 cell\n    }\n  }\n\n  return false\n}\n\n/**\n * 删除 cell 内的换行，光标首尾在同一个位置的情况\n * @param newEditor\n * @returns 是否在内部处理了删除\n */\nfunction deleteCellBreak(newEditor: IDomEditor, unit: Parameters<IDomEditor['deleteBackward']>[0], direction: 'forward' | 'backward'): boolean {\n  const { selection } = newEditor\n\n  if (selection == null || unit === 'line') { return false }\n\n  // 判断目标位置是否在同一个 cell 内，不在同一个 cell 内不处理\n  const [cellNodeEntry] = Editor.nodes(newEditor, {\n    match: n => DomEditor.checkNodeType(n, 'table-cell'),\n  })\n\n  // 根据删除的方向及当前的光标位置，获取到真实的删除位置\n  let targetPoint: Point | undefined = selection.anchor\n\n  if (direction === 'backward' && selection.anchor.offset === 0) {\n    targetPoint = Editor.before(newEditor, selection)\n  }\n\n  if (direction === 'forward' && Editor.isEnd(newEditor, selection.anchor, selection.anchor.path)) {\n    targetPoint = Editor.after(newEditor, selection)\n  }\n\n  if (targetPoint == null) { return false }\n  const aboveCell = Editor.above(newEditor, {\n    at: targetPoint,\n    match: n => DomEditor.checkNodeType(n, 'table-cell'),\n  })\n\n  if (aboveCell == null || cellNodeEntry == null || !Path.equals(aboveCell[1], cellNodeEntry[1])) { return false }\n  const targetNode = Editor.node(newEditor, targetPoint)\n\n  if (!Text.isText(targetNode[0]) || targetNode[0].text.length < CELL_BREAK.length) { return false }\n\n  // 处理光标在换行符首/尾的情况,|表示光标  |\\n   \\n|\n  const startOffset = direction === 'backward'\n    ? targetPoint.offset - CELL_BREAK.length\n    : targetPoint.offset\n  const endOffset = direction === 'backward'\n    ? targetPoint.offset\n    : targetPoint.offset + CELL_BREAK.length\n\n  if (startOffset < 0) { return false }\n\n  const nodeText = Node.string(targetNode[0])\n  const isBreak = nodeText.slice(startOffset, endOffset) === CELL_BREAK\n\n  if (isBreak) {\n    Transforms.insertText(newEditor, nodeText.slice(0, startOffset) + nodeText.slice(endOffset), {\n      at: {\n        anchor: Editor.start(newEditor, targetPoint.path),\n        focus: Editor.end(newEditor, targetPoint.path),\n      },\n    })\n    Transforms.select(newEditor, {\n      anchor: { path: targetPoint.path, offset: startOffset },\n      focus: { path: targetPoint.path, offset: startOffset },\n    })\n    return true\n  }\n\n  return false\n}\n\n/**\n * 判断该 location 有没有命中 table\n * @param editor editor\n * @param location location\n */\nfunction isTableLocation(editor: IDomEditor, location: Location): boolean {\n  const tables = Editor.nodes(editor, {\n    at: location,\n    match: n => {\n      const type = DomEditor.getNodeType(n)\n\n      return type === 'table'\n    },\n  })\n\n  const hasTable = !![...tables].find(() => true)\n\n  return hasTable\n}\n\n/**\n * 检查当前选中的节点是否是受保护的节点类型（不应该被删除的节点）\n * @param editor editor\n * @returns 是否是受保护的节点\n */\nfunction isProtectedNode(editor: IDomEditor): boolean {\n  // 检查是否是受保护的节点类型\n  const protectedTypes = [\n    'paragraph',\n    'header1', 'header2', 'header3', 'header4', 'header5', 'header6',\n    'blockquote',\n    'list-item',\n    'todo',\n    'divider',\n  ]\n\n  for (const type of protectedTypes) {\n    if (DomEditor.getSelectedNodeByType(editor, type)) {\n      return true\n    }\n  }\n\n  return false\n}\n\nfunction withTable<T extends IDomEditor>(editor: T): T {\n  const {\n    insertBreak,\n    deleteBackward,\n    deleteForward,\n    normalizeNode,\n    insertData,\n    handleTab,\n    selectAll,\n    deleteFragment,\n  } = editor\n  const newEditor = editor\n\n  // 重写 insertBreak - cell 内换行，只换行文本，不拆分 node\n  newEditor.insertBreak = () => {\n    const selectedNode = DomEditor.getSelectedNodeByType(newEditor, 'table')\n\n    if (selectedNode != null) {\n      // 选中了 table ，则在 cell 内插入标准换行\n      newEditor.insertText(CELL_BREAK)\n      return\n    }\n\n    // 未选中 table ，默认的换行\n    insertBreak()\n  }\n\n  // 重写 delete - cell 内删除，只删除文字，不删除 node\n  newEditor.deleteBackward = unit => {\n    const res = deleteHandler(newEditor)\n\n    if (res) { return } // 命中 table cell ，自己处理删除\n\n    if (deleteCellBreak(newEditor, unit, 'backward')) { return } // 命中了 cell 内删除换行符，自行处理删除\n\n    // 防止从 table 后面的 p 删除时，删除最后一个 cell - issues/4221\n    const { selection } = newEditor\n\n    if (selection) {\n      const before = Editor.before(newEditor, selection) // 前一个 location\n      const tableCell = Editor.above(newEditor, {\n        at: selection,\n        match: n => DomEditor.checkNodeType(n, 'table-cell'),\n      })\n\n      if (before) {\n        const isTableOnBeforeLocation = isTableLocation(newEditor, before) // before 是否是 table\n        // 如果前面是 table, 当前是 paragraph ，则不执行删除。否则会删除 table 最后一个 cell\n        // 兼容了 table 嵌套 p标签元素 selection数组五层的情况 - issues/342\n\n        // 如果前面是 table, 当前是受保护的节点类型，则不执行删除\n        if (!tableCell && isTableOnBeforeLocation && isProtectedNode(newEditor)) {\n          return\n        }\n      }\n    }\n\n    // 执行默认的删除\n    deleteBackward(unit)\n  }\n\n  // 重写 handleTab 在table内按tab时跳到下一个单元格\n  newEditor.handleTab = () => {\n    const selectedNode = DomEditor.getSelectedNodeByType(newEditor, 'table')\n\n    if (selectedNode) {\n      const above = Editor.above(editor) as NodeEntry<SlateElement>\n\n      // 常规情况下选中文字外层 table-cell 进行跳转\n      if (DomEditor.checkNodeType(above[0], 'table-cell')) {\n        Transforms.select(editor, above[1])\n      }\n\n      let next = Editor.next(editor)\n\n      if (next) {\n        if (next[0] && (next[0] as BaseText).text) {\n          // 多个单元格同时选中按 tab 导致错位修复\n          next = (Editor.above(editor, { at: next[1] }) as NodeEntry<Descendant>) ?? next\n        }\n        Transforms.select(editor, next[1])\n      } else {\n        const topLevelNodes = newEditor.children || []\n        const topLevelNodesLength = topLevelNodes.length\n        // 在最后一个单元格按tab时table末尾如果没有p则插入p后光标切到p上\n\n        if (DomEditor.checkNodeType(topLevelNodes[topLevelNodesLength - 1], 'table')) {\n          const p = DomEditor.genEmptyParagraph()\n\n          Transforms.insertNodes(newEditor, p, { at: [topLevelNodesLength] })\n          // 在表格末尾插入p后再次执行使光标切到p上\n          newEditor.handleTab()\n        }\n      }\n      return\n    }\n\n    handleTab()\n  }\n\n  newEditor.deleteForward = unit => {\n    const res = deleteHandler(newEditor)\n\n    if (res) { return }\n\n    if (deleteCellBreak(newEditor, unit, 'forward')) { return }\n\n    // 防止从 table 前面的 p 删除时，删除第一个 cell\n    const { selection } = newEditor\n\n    if (selection) {\n      const after = Editor.after(newEditor, selection) // 后一个 location\n      const tableCell = Editor.above(newEditor, {\n        at: selection,\n        match: n => DomEditor.checkNodeType(n, 'table-cell'),\n      })\n\n      if (after) {\n        const isTableOnAfterLocation = isTableLocation(newEditor, after) // after 是否是 table\n        // 如果后面是 table, 当前是 paragraph，则不执行删除\n\n        // 如果后面是 table, 当前是受保护的节点类型，则不执行删除\n        if (!tableCell && isTableOnAfterLocation && isProtectedNode(newEditor)) {\n          return\n        }\n      }\n    }\n\n    // 执行默认的删除\n    deleteForward(unit)\n  }\n\n  // 重新 normalize\n  newEditor.normalizeNode = ([node, path]) => {\n    const type = DomEditor.getNodeType(node)\n\n    if (type !== 'table') {\n      // 未命中 table ，执行默认的 normalizeNode\n      return normalizeNode([node, path])\n    }\n\n    // -------------- table 是 editor 最后一个节点，需要后面插入 p --------------\n    const isLast = DomEditor.isLastNode(newEditor, node)\n\n    if (isLast) {\n      const p = DomEditor.genEmptyParagraph()\n\n      Transforms.insertNodes(newEditor, p, { at: [path[0] + 1] })\n    }\n  }\n\n  // 重写 insertData - 粘贴文本\n  newEditor.insertData = (data: DataTransfer) => {\n    const tableNode = DomEditor.getSelectedNodeByType(newEditor, 'table')\n\n    if (tableNode == null) {\n      insertData(data) // 执行默认的 insertData\n      return\n    }\n\n    // 获取文本，并插入到 cell\n    const text = data.getData('text/plain')\n\n    // 单图或图文 插入\n    if (text === '\\n' || /<img[^>]+>/.test(data.getData('text/html'))) {\n      insertData(data)\n      return\n    }\n\n    Editor.insertText(newEditor, text)\n  }\n\n  // 重写 table-cell 中的全选\n  newEditor.selectAll = () => {\n    const selection = newEditor.selection\n\n    if (selection == null) {\n      selectAll()\n      return\n    }\n\n    const cell = DomEditor.getSelectedNodeByType(newEditor, 'table-cell')\n\n    if (cell == null) {\n      selectAll()\n      return\n    }\n\n    const { anchor, focus } = selection\n\n    if (!Path.equals(anchor.path.slice(0, 3), focus.path.slice(0, 3))) {\n      // 选中了多个 cell ，忽略\n      selectAll()\n      return\n    }\n\n    const text = Node.string(cell)\n    const textLength = text.length\n\n    if (textLength === 0) {\n      selectAll()\n      return\n    }\n\n    const path = DomEditor.findPath(newEditor, cell)\n    const start = Editor.start(newEditor, path)\n    const end = Editor.end(newEditor, path)\n    const newSelection = {\n      anchor: start,\n      focus: end,\n    }\n\n    newEditor.select(newSelection) // 选中 table-cell 内部的全部文字\n  }\n\n  // 重写 deleteFragment - 批量选中 table-cell 时只清空单元格内容，不破坏表格结构\n  newEditor.deleteFragment = options => {\n    const tableSelection = EDITOR_TO_SELECTION.get(newEditor)\n\n    if (tableSelection && tableSelection.length > 0) {\n      const selectedCellPaths: Path[] = []\n\n      tableSelection.forEach(row => {\n        row.forEach(cell => {\n          const [, cellPath] = cell[0]\n\n          if (!selectedCellPaths.some(path => Path.equals(path, cellPath))) {\n            selectedCellPaths.push(cellPath)\n          }\n        })\n      })\n\n      const firstCellPath = selectedCellPaths[0]\n\n      selectedCellPaths.forEach(cellPath => {\n        // 在复杂操作后 path 可能失效，跳过即可\n        if (!Node.has(newEditor, cellPath)) { return }\n\n        const start = Editor.start(newEditor, cellPath)\n        const end = Editor.end(newEditor, cellPath)\n\n        // 每次只选中单个 cell 的内容，再走原生 deleteFragment\n        // 避免跨 cell 删除触发 merge_node，导致表格结构错乱\n        Transforms.select(newEditor, {\n          anchor: start,\n          focus: end,\n        })\n        deleteFragment(options)\n      })\n\n      TableCursor.unselect(newEditor)\n\n      if (firstCellPath && Node.has(newEditor, firstCellPath)) {\n        const start = Editor.start(newEditor, firstCellPath)\n\n        Transforms.select(newEditor, start)\n      }\n\n      return\n    }\n\n    deleteFragment(options)\n  }\n\n  /**\n   * 光标选区行为新增\n   */\n  withSelection(newEditor)\n\n  /**\n   * 添加获取表格批量选择的方法\n   */\n  newEditor.getTableSelection = () => {\n    return EDITOR_TO_SELECTION.get(newEditor) || null\n  }\n\n  /**\n   * 重写mark和node操作方法以支持表格批量选择\n   */\n  const { addMark: originalAddMark, removeMark: originalRemoveMark } = newEditor\n  const originalTransforms = { ...Transforms }\n\n  newEditor.addMark = (key: string, value: any) => {\n    const tableSelection = EDITOR_TO_SELECTION.get(newEditor)\n\n    if (tableSelection && tableSelection.length > 0) {\n      // 表格批量选择：对每个选中的单元格应用mark\n      // 保存当前选择状态\n      const originalSelection = newEditor.selection\n\n      tableSelection.forEach(row => {\n        row.forEach(cell => {\n          const [, cellPath] = cell[0]\n\n          // 为每个单元格设置选择范围（选中整个单元格的内容）\n          const start = Editor.start(newEditor, cellPath)\n          const end = Editor.end(newEditor, cellPath)\n\n          // 设置选择范围到当前单元格\n          Transforms.select(newEditor, { anchor: start, focus: end })\n\n          // 在当前单元格范围内应用原始的 addMark 方法\n          originalAddMark(key, value)\n        })\n      })\n\n      // 恢复原始选择状态\n      if (originalSelection) {\n        Transforms.select(newEditor, originalSelection)\n      }\n    } else {\n      // 常规选择：使用原有逻辑\n      originalAddMark(key, value)\n    }\n  }\n\n  newEditor.removeMark = (key: string) => {\n    const tableSelection = EDITOR_TO_SELECTION.get(newEditor)\n\n    if (tableSelection && tableSelection.length > 0) {\n      // 表格批量选择：对每个选中的单元格移除mark\n      // 保存当前选择状态\n      const originalSelection = newEditor.selection\n\n      tableSelection.forEach(row => {\n        row.forEach(cell => {\n          const [, cellPath] = cell[0]\n\n          // 为每个单元格设置选择范围（选中整个单元格的内容）\n          const start = Editor.start(newEditor, cellPath)\n          const end = Editor.end(newEditor, cellPath)\n\n          // 设置选择范围到当前单元格\n          Transforms.select(newEditor, { anchor: start, focus: end })\n\n          // 在当前单元格范围内应用原始的 removeMark 方法\n          originalRemoveMark(key)\n        })\n      })\n\n      // 恢复原始选择状态\n      if (originalSelection) {\n        Transforms.select(newEditor, originalSelection)\n      }\n    } else {\n      // 常规选择：使用原有逻辑\n      originalRemoveMark(key)\n    }\n  }\n\n  /**\n   * 重写Transforms.setNodes以支持表格批量选择（如对齐功能）\n   */\n  Transforms.setNodes = (targetEditor, props, options = {}) => {\n    // 只有当传入的editor是当前newEditor且有表格选择时才特殊处理\n    if (targetEditor === newEditor) {\n      const tableSelection = EDITOR_TO_SELECTION.get(newEditor)\n\n      if (tableSelection && tableSelection.length > 0) {\n        // 排除合并单元格操作\n        if ('hidden' in props || 'rowSpan' in props || 'colSpan' in props) {\n          originalTransforms.setNodes(targetEditor, props, options)\n          return\n        }\n        // 表格批量选择：对所有选中的单元格应用属性\n        tableSelection.forEach(row => {\n          row.forEach(cell => {\n            const [, cellPath] = cell[0]\n\n            originalTransforms.setNodes(targetEditor, props, {\n              ...options,\n              at: cellPath,\n            })\n          })\n        })\n        return\n      }\n    }\n\n    // 常规情况：使用原有逻辑\n    originalTransforms.setNodes(targetEditor, props, options)\n  }\n\n  // 可继续修改其他 newEditor API ...\n\n  // 返回 editor ，重要！\n  return newEditor\n}\n\nexport default withTable\n","/**\n * @description pre parse html\n * @author wangfupeng\n */\n\nimport $, { DOMElement, getTagName } from '../utils/dom'\n\nfunction hasExplicitColgroupWidths($table: ReturnType<typeof $>): boolean {\n  const colgroupElements = $table.find('colgroup')\n\n  for (let i = 0; i < colgroupElements.length; i += 1) {\n    const colgroup = colgroupElements[i] as HTMLTableColElement\n\n    for (let j = 0; j < colgroup.children.length; j += 1) {\n      const col = colgroup.children[j] as HTMLTableColElement\n      const widthAttr = (col.getAttribute('width') || '').trim().toLowerCase()\n      const styleWidth = (col.style.width || '').trim().toLowerCase()\n\n      if (widthAttr && widthAttr !== 'auto') {\n        return true\n      }\n      if (styleWidth && styleWidth !== 'auto') {\n        return true\n      }\n    }\n  }\n\n  return false\n}\n\nfunction hasExplicitCellWidths($table: ReturnType<typeof $>): boolean {\n  const $cells = $table.find('td, th')\n\n  for (let i = 0; i < $cells.length; i += 1) {\n    const cell = $cells[i] as HTMLTableCellElement\n    const widthAttr = (cell.getAttribute('width') || '').trim().toLowerCase()\n    const styleWidth = (cell.style.width || '').trim().toLowerCase()\n\n    if (widthAttr && widthAttr !== 'auto') {\n      return true\n    }\n    if (styleWidth && styleWidth !== 'auto') {\n      return true\n    }\n  }\n\n  return false\n}\n\nfunction isAutoWidthFixedLayoutTable($table: ReturnType<typeof $>): boolean {\n  const widthAttr = ($table.attr('width') || '').trim().toLowerCase()\n  const styleWidth = ($table[0] as HTMLTableElement).style.width.trim().toLowerCase()\n  const tableLayout = ($table[0] as HTMLTableElement).style.tableLayout.trim().toLowerCase()\n\n  const isClassModeTable =\n    $table.hasClass('w-e-table-layout-fixed') || !!$table.attr('data-w-e-table-height')\n  const isAutoWidth = widthAttr === 'auto' || styleWidth === 'auto'\n\n  if (isClassModeTable) {\n    return false\n  }\n  if (!isAutoWidth) {\n    return false\n  }\n  if (tableLayout !== 'fixed') {\n    return false\n  }\n\n  return true\n}\n\nfunction measureColumnWidthsFromLayout(tableElem: HTMLTableElement): number[] {\n  if (typeof document === 'undefined' || !document.body) {\n    return []\n  }\n\n  const sandbox = document.createElement('div')\n\n  sandbox.style.position = 'fixed'\n  sandbox.style.top = '-10000px'\n  sandbox.style.left = '0'\n  sandbox.style.visibility = 'hidden'\n  sandbox.style.pointerEvents = 'none'\n\n  const tableClone = tableElem.cloneNode(true) as HTMLTableElement\n\n  sandbox.appendChild(tableClone)\n  document.body.appendChild(sandbox)\n\n  try {\n    const firstRow = tableClone.querySelector('tr')\n\n    if (!firstRow) {\n      return []\n    }\n\n    const cells = Array.from(firstRow.children).filter(cell => {\n      const tag = cell.tagName.toLowerCase()\n\n      return tag === 'td' || tag === 'th'\n    }) as HTMLTableCellElement[]\n\n    if (cells.length === 0) {\n      return []\n    }\n\n    const measuredWidths: number[] = []\n\n    for (let i = 0; i < cells.length; i += 1) {\n      const cell = cells[i]\n      const span = parseInt(cell.getAttribute('colspan') || '1', 10)\n      const safeSpan = Number.isFinite(span) && span > 0 ? span : 1\n      const cellWidth = cell.getBoundingClientRect().width\n\n      if (!Number.isFinite(cellWidth) || cellWidth <= 0) {\n        return []\n      }\n\n      const widthPerColumn = Math.max(1, Math.round(cellWidth / safeSpan))\n\n      for (let j = 0; j < safeSpan; j += 1) {\n        measuredWidths.push(widthPerColumn)\n      }\n    }\n\n    return measuredWidths\n  } finally {\n    sandbox.remove()\n  }\n}\n\nfunction applyMeasuredColumnWidths(tableElem: HTMLTableElement, columnWidths: number[]) {\n  if (columnWidths.length === 0) {\n    return\n  }\n\n  const existingColgroup = tableElem.querySelector('colgroup')\n\n  if (existingColgroup) {\n    existingColgroup.remove()\n  }\n\n  const colgroupElem = document.createElement('colgroup')\n\n  colgroupElem.setAttribute('contentEditable', 'false')\n  columnWidths.forEach(width => {\n    const colElem = document.createElement('col')\n\n    colElem.setAttribute('width', `${width}`)\n    colgroupElem.appendChild(colElem)\n  })\n\n  const firstRow = tableElem.querySelector('tr')\n\n  if (firstRow) {\n    tableElem.insertBefore(colgroupElem, firstRow)\n  } else {\n    tableElem.appendChild(colgroupElem)\n  }\n}\n\nfunction tryApplyAutoFittedColumnWidths($table: ReturnType<typeof $>) {\n  if (!isAutoWidthFixedLayoutTable($table)) {\n    return\n  }\n  if (hasExplicitColgroupWidths($table)) {\n    return\n  }\n  if (hasExplicitCellWidths($table)) {\n    return\n  }\n\n  const columnWidths = measureColumnWidthsFromLayout($table[0] as HTMLTableElement)\n\n  if (columnWidths.length === 0) {\n    return\n  }\n\n  applyMeasuredColumnWidths($table[0] as HTMLTableElement, columnWidths)\n}\n\nfunction normalizeCellParagraphs(cellHtml: string): string {\n  const container = document.createElement('div')\n\n  container.innerHTML = cellHtml\n\n  const normalizedNodes: Node[] = []\n  let hasMeaningfulContent = false\n\n  Array.from(container.childNodes).forEach(node => {\n    if (node.nodeType === Node.TEXT_NODE) {\n      if ((node.textContent || '').trim()) {\n        normalizedNodes.push(node.cloneNode(true))\n        hasMeaningfulContent = true\n      }\n      return\n    }\n\n    if (!(node instanceof HTMLElement) || node.tagName.toLowerCase() !== 'p') {\n      normalizedNodes.push(node.cloneNode(true))\n      hasMeaningfulContent = true\n      return\n    }\n\n    const paragraphHtml = node.innerHTML\n    const trimmedHtml = paragraphHtml.trim()\n\n    if (!trimmedHtml || trimmedHtml === '&nbsp;') {\n      return\n    }\n\n    if (hasMeaningfulContent) {\n      normalizedNodes.push(document.createElement('br'))\n    }\n\n    const paragraphContainer = document.createElement('div')\n\n    paragraphContainer.innerHTML = paragraphHtml\n\n    Array.from(paragraphContainer.childNodes).forEach(childNode => {\n      normalizedNodes.push(childNode.cloneNode(true))\n    })\n    hasMeaningfulContent = true\n  })\n\n  container.replaceChildren(...normalizedNodes)\n\n  return container.innerHTML\n}\n\n/**\n * pre-prase table ，去掉 <tbody> 和处理单元格中的 <p> 标签\n * @param table table elem\n */\nfunction preParse(tableElem: DOMElement): DOMElement {\n  const $table = $(tableElem)\n  const tagName = getTagName($table)\n\n  if (tagName !== 'table') {\n    return tableElem\n  }\n\n  // 没有 <tbody> 则直接返回\n  const $tbody = $table.find('tbody')\n\n  if ($tbody.length === 0) {\n    return tableElem\n  }\n\n  // 去掉 <tbody> ，把 <tr> 移动到 <table> 下面\n  const $tr = $table.find('tr')\n\n  $table.append($tr)\n  $tbody.remove()\n\n  const $cells = $table.find('td, th')\n\n  for (let i = 0; i < $cells.length; i += 1) {\n    const cell = $cells[i]\n    const $cell = $(cell)\n\n    // 设置 width 属性为 auto\n    $cell.attr('width', 'auto')\n\n    // 直接处理单元格中的所有 <p> 标签\n    let cellHtml = $cell.html() || ''\n\n    // 先清理Word特殊标签\n    cellHtml = cellHtml.replace(/<o:p[^>]*>[\\s\\S]*?<\\/o:p>/gi, '') // 删除 <o:p> 标签\n    cellHtml = cellHtml.replace(/<\\/o:p>/gi, '') // 删除可能的自闭合标签\n\n    cellHtml = normalizeCellParagraphs(cellHtml)\n\n    $cell.html(cellHtml)\n  }\n\n  tryApplyAutoFittedColumnWidths($table)\n\n  return $table[0]\n}\n\nexport const preParseTableHtmlConf = {\n  selector: 'table',\n  preParseHtml: preParse,\n}\n","import { DomEditor, IDomEditor, isHTMLElememt } from '@wangeditor-next/core'\nimport throttle from 'lodash.throttle'\nimport {\n  Editor,\n  Element as SlateElement,\n  Path,\n  Transforms,\n} from 'slate'\n\nimport $ from '../utils/dom'\nimport { TableElement } from './custom-types'\n\n/** *\n * 计算 cell border 距离 table 左侧距离\n */\nfunction getCumulativeWidths(columnWidths: number[]) {\n  const cumulativeWidths: number[] = []\n  let totalWidth = 0\n\n  for (const width of columnWidths) {\n    totalWidth += width\n    cumulativeWidths.push(totalWidth)\n  }\n\n  return cumulativeWidths\n}\n\n/** *\n * 用于计算拖动 cell 时，cell 宽度变化的比例\n */\nexport function getColumnWidthRatios(columnWidths: number[]) {\n  const columnWidthsRatio: number[] = []\n  const totalWidth = columnWidths.reduce((a, b) => a + b, 0)\n\n  for (const width of columnWidths) {\n    columnWidthsRatio.push(width / totalWidth)\n  }\n\n  return columnWidthsRatio\n}\n\n/**\n * 监听 table 内部变化，如新增行、列，删除行列等操作，引起的高度变化。\n * ResizeObserver 需要即时释放，以免引起内存泄露\n */\nlet resizeObserver: ResizeObserver | null = null\n\nfunction getTableRowHeights(table: Element): number[] {\n  const tableRows = Array.from(table.querySelectorAll('tr'))\n\n  return tableRows.map(row => {\n    const rowRect = row.getBoundingClientRect()\n\n    return Math.max(1, Math.round(rowRect.height * 100) / 100)\n  })\n}\n\nexport function observerTableResize(editor: IDomEditor, elm: Node | undefined) {\n  if (isHTMLElememt(elm)) {\n    const table = elm.querySelector('table')\n\n    if (table) {\n      resizeObserver = new ResizeObserver(([{ contentRect }]) => {\n        const rowHeights = getTableRowHeights(table)\n\n        // 当非拖动引起的宽度变化，需要调整 columnWidths\n        Transforms.setNodes(\n          editor,\n          {\n            scrollWidth: contentRect.width,\n            height: contentRect.height,\n            rowHeights,\n          } as TableElement,\n          { mode: 'highest' },\n        )\n      })\n      resizeObserver.observe(table)\n    }\n  }\n}\n\nexport function unObserveTableResize() {\n  if (resizeObserver) {\n    resizeObserver?.disconnect()\n    resizeObserver = null\n  }\n}\n\n// 是否为光标选区行为\nlet isSelectionOperation = false\n// 拖拽列宽相关信息\nlet isMouseDownForResize = false\nlet clientXWhenMouseDown = 0\nlet editorWhenMouseDown: IDomEditor | null = null\nlet tablePathWhenMouseDown: Path | null = null\nconst $window = $(window)\n\nfunction onMouseDown(event: Event) {\n  const elem = event.target as HTMLElement\n  // 判断是否为光标选区行为，对列宽变更行为进行过滤\n  // console.log('onMouseDown', elem)\n\n  if (elem.closest('[data-block-type=\"table-cell\"]')) {\n    isSelectionOperation = true\n  } else if (elem.tagName === 'DIV' && elem.closest('.column-resizer-item')) {\n    if (editorWhenMouseDown === null || tablePathWhenMouseDown === null) { return }\n\n    // 记录必要信息\n    isMouseDownForResize = true\n    const { clientX } = event as MouseEvent\n\n    clientXWhenMouseDown = clientX\n    document.body.style.cursor = 'col-resize'\n    event.preventDefault()\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-use-before-define\n  $window.on('mousemove', onMouseMove)\n  // eslint-disable-next-line @typescript-eslint/no-use-before-define\n  $window.on('mouseup', onMouseUp)\n}\n\n$window.on('mousedown', onMouseDown)\n\n/**\n * 计算相邻列宽度调整（用于中间列拖动）\n * 修改为：拖拽时当前列宽度增加，其他列宽度不变，整体表格宽度增加\n */\nfunction calculateAdjacentWidths(columnWidths: number[], resizingIndex: number, widthChange: number, editor: IDomEditor): number[] {\n  const newWidths = [...columnWidths]\n\n  // 获取最小宽度配置\n  const { minWidth = 60 } = editor.getMenuConfig('insertTable')\n  const minColumnWidth = parseInt(minWidth.toString(), 10) || 60\n\n  // 直接增加当前列的宽度，其他列保持不变\n  const currentWidth = newWidths[resizingIndex]\n  const newWidth = Math.max(minColumnWidth, currentWidth + widthChange) // 确保不小于最小宽度\n\n  newWidths[resizingIndex] = Math.floor(newWidth * 100) / 100\n\n  return newWidths\n}\n\n/**\n * 根据鼠标位置计算列宽度\n * 修改为：拖拽时当前列宽度增加，其他列宽度不变，整体表格宽度增加\n * @param columnWidths 当前列宽度数组\n * @param resizingIndex 正在调整的边界索引\n * @param mousePositionInTable 鼠标相对于表格左边的位置\n * @param cumulativeWidths 列宽度的累积和数组\n * @param editor 编辑器实例\n * @returns 调整后的列宽度数组\n */\nfunction calculateAdjacentWidthsByBorderPosition(\n  columnWidths: number[],\n  resizingIndex: number,\n  mousePositionInTable: number,\n  cumulativeWidths: number[],\n  editor: IDomEditor,\n): number[] {\n  const newWidths = [...columnWidths]\n\n  // 检查边界范围\n  if (resizingIndex < 0 || resizingIndex >= columnWidths.length) {\n    return newWidths\n  }\n\n  // 获取最小宽度配置\n  const { minWidth = 60 } = editor.getMenuConfig('insertTable')\n  const minColumnWidth = parseInt(minWidth.toString(), 10) || 60\n\n  // 计算当前边界的左边界位置（前面所有列的宽度总和）\n  const leftBoundary = resizingIndex === 0 ? 0 : cumulativeWidths[resizingIndex - 1]\n\n  // 计算鼠标位置相对于当前列左边界的偏移\n  const mouseOffset = mousePositionInTable - leftBoundary\n\n  // 确保不小于最小宽度\n  const newWidth = Math.max(minColumnWidth, mouseOffset)\n\n  // 直接设置当前列的宽度，其他列保持不变\n  newWidths[resizingIndex] = Math.floor(newWidth * 100) / 100\n\n  return newWidths\n}\n\nconst onMouseMove = throttle((event: Event) => {\n  if (!isMouseDownForResize) { return }\n  if (editorWhenMouseDown === null) { return }\n  if (tablePathWhenMouseDown === null) { return }\n  event.preventDefault()\n\n  const { clientX } = event as MouseEvent\n  const widthChange = clientX - clientXWhenMouseDown // 计算宽度变化\n\n  let tableNode: TableElement | null = null\n  let tablePath: Path | null = null\n\n  try {\n    const [node, path] = Editor.node(editorWhenMouseDown, tablePathWhenMouseDown)\n\n    if (Editor.isEditor(node) || !SlateElement.isElement(node) || node.type !== 'table') {\n      return\n    }\n\n    tableNode = node as TableElement\n    tablePath = path\n  } catch {\n    return\n  }\n\n  if (tableNode === null || tablePath === null) { return }\n\n  const {\n    width: tableWidth = 'auto',\n    columnWidths = [],\n    resizingIndex = -1,\n    scrollWidth = 0,\n  } = tableNode\n\n  if (columnWidths.length === 0 || resizingIndex < 0 || resizingIndex >= columnWidths.length) {\n    return\n  }\n\n  let adjustColumnWidths: number[]\n  let baseColumnWidths = columnWidths\n  let tableDom: HTMLElement | null = null\n\n  try {\n    tableDom = DomEditor.toDOMNode(editorWhenMouseDown, tableNode)\n  } catch {\n    tableDom = null\n  }\n\n  if (tableWidth === '100%' && scrollWidth > 0) {\n    const totalColumnWidth = columnWidths.reduce((sum, width) => sum + width, 0)\n\n    if (totalColumnWidth > 0) {\n      baseColumnWidths = getColumnWidthRatios(columnWidths).map(ratio => ratio * scrollWidth)\n    }\n  }\n\n  // 所有列都采用相同的拖拽逻辑：当前列宽度增加，其他列不变\n  const tableElement = tableDom?.querySelector('.table')\n\n  if (tableElement) {\n    const tableRect = tableElement.getBoundingClientRect()\n    const mousePositionInTable = clientX - tableRect.left // 鼠标相对于表格左边的位置\n\n    // 计算边界的新位置\n    const cumulativeWidths = getCumulativeWidths(baseColumnWidths)\n    const newBorderPosition = mousePositionInTable\n\n    // 根据新的边界位置计算列宽度\n    adjustColumnWidths = calculateAdjacentWidthsByBorderPosition(\n      baseColumnWidths,\n      resizingIndex,\n      newBorderPosition,\n      cumulativeWidths,\n      editorWhenMouseDown,\n    )\n  } else {\n    // 如果找不到表格元素，则使用简单的宽度变化逻辑\n    adjustColumnWidths = calculateAdjacentWidths(baseColumnWidths, resizingIndex, widthChange, editorWhenMouseDown)\n  }\n\n  const nextTableProps: Partial<TableElement> = {\n    columnWidths: adjustColumnWidths,\n  }\n\n  // 用户在自适应表格中手动拖拽列宽时，切回显式列宽模式，保证拖拽边界与鼠标位置一致。\n  if (tableWidth === '100%') {\n    nextTableProps.width = 'auto'\n  }\n\n  // 应用新的列宽度\n  Transforms.setNodes(editorWhenMouseDown, nextTableProps as TableElement, {\n    at: tablePath,\n  })\n}, 100)\n\nfunction onMouseUp(_event: Event) {\n  // Flush any throttled trailing mousemove before clearing drag state.\n  // Fast drags can queue the last movement; without flush the final width change is lost.\n  if (isMouseDownForResize) {\n    onMouseMove.flush()\n  }\n  onMouseMove.cancel()\n\n  isSelectionOperation = false\n  isMouseDownForResize = false\n  editorWhenMouseDown = null\n  tablePathWhenMouseDown = null\n  document.body.style.cursor = ''\n\n  // 解绑事件\n  $window.off('mousemove', onMouseMove)\n  $window.off('mouseup', onMouseUp)\n}\n/**\n * 鼠标移动时，判断在哪个 Cell border 上\n * Class 先 visible 后 highlight @跟随飞书\n * 避免光标选区功能收到干扰\n */\nexport function handleCellBorderVisible(\n  editor: IDomEditor,\n  elemNode: SlateElement,\n  e: MouseEvent,\n  scrollWidth: number,\n) {\n  if (editor.isDisabled()) { return }\n  if (isSelectionOperation || isMouseDownForResize) { return }\n\n  const {\n    width: tableWidth = 'auto',\n    columnWidths = [],\n    isHoverCellBorder,\n    resizingIndex,\n  } = elemNode as TableElement\n\n  // Cell Border 宽度为 10px\n  const { clientX, target } = e\n  // 当单元格合并的时候，鼠标在 cell 中间，则不显示 cell border\n\n  if (isHTMLElememt(target)) {\n    const rect = target.getBoundingClientRect()\n\n    if (clientX > rect.x + 5 && clientX < rect.x + rect.width - 5) {\n      if (isHoverCellBorder) {\n        Transforms.setNodes(\n          editor,\n          { isHoverCellBorder: false, resizingIndex: -1 } as TableElement,\n          { mode: 'highest' },\n        )\n      }\n      return\n    }\n  }\n  if (isHTMLElememt(target)) {\n    const parent = target.closest('.table')\n\n    if (parent) {\n      // eslint-disable-next-line @typescript-eslint/no-shadow\n      const { clientX } = e\n      const rect = parent.getBoundingClientRect()\n      const widths = tableWidth === '100%'\n        ? getColumnWidthRatios(columnWidths).map(v => v * scrollWidth)\n        : columnWidths\n\n      const cumulativeWidths = getCumulativeWidths(widths)\n\n      // 鼠标移动时，计算当前鼠标位置，判断在哪个 Cell border 上\n      for (let i = 0; i < cumulativeWidths.length; i += 1) {\n        if (\n          clientX - rect.x >= cumulativeWidths[i] - 5\n          && clientX - rect.x < cumulativeWidths[i] + 5\n        ) {\n          // 节流，防止多次引起Transforms.setNodes重绘\n          if (resizingIndex === i) { return }\n          Transforms.setNodes(\n            editor,\n            { isHoverCellBorder: true, resizingIndex: i } as TableElement,\n            { mode: 'highest' },\n          )\n          return\n        }\n      }\n    }\n  }\n\n  // 鼠标移出时，重置\n  if (isHoverCellBorder === true) {\n    Transforms.setNodes(editor, { isHoverCellBorder: false, resizingIndex: -1 } as TableElement, {\n      mode: 'highest',\n    })\n  }\n}\n\n/**\n * 设置 class highlight\n * 将 render-cell.tsx 拖动功能迁移至 div.column-resize\n */\nexport function handleCellBorderHighlight(editor: IDomEditor, e: MouseEvent) {\n  if (e.type === 'mouseenter') {\n    Transforms.setNodes(editor, { isResizing: true } as TableElement, { mode: 'highest' })\n  } else {\n    Transforms.setNodes(editor, { isResizing: false } as TableElement, { mode: 'highest' })\n  }\n}\n\nexport function handleCellBorderMouseDown(editor: IDomEditor, elemNode: SlateElement) {\n  if (isMouseDownForResize) { return } // 此时正在修改列宽\n  editorWhenMouseDown = editor\n\n  try {\n    tablePathWhenMouseDown = DomEditor.findPath(editor, elemNode)\n  } catch {\n    tablePathWhenMouseDown = null\n  }\n}\n","import { DomEditor, IDomEditor, isHTMLElememt } from '@wangeditor-next/core'\nimport throttle from 'lodash.throttle'\nimport { Editor, Element as SlateElement, Transforms } from 'slate'\n\nimport { isOfType } from '../utils'\nimport $ from '../utils/dom'\nimport { TableElement, TableRowElement } from './custom-types'\n\n/**\n * 计算行高度的比例\n */\nexport function getRowHeightRatios(rowHeights: number[]) {\n  const rowHeightRatios: number[] = []\n  const totalHeight = rowHeights.reduce((a, b) => a + b, 0)\n\n  for (const height of rowHeights) {\n    rowHeightRatios.push(height / totalHeight)\n  }\n\n  return rowHeightRatios\n}\n\n/**\n * 计算累积行高度\n */\nfunction getCumulativeHeights(rowHeights: number[]) {\n  const cumulativeHeights: number[] = []\n  let totalHeight = 0\n\n  for (const height of rowHeights) {\n    totalHeight += height\n    cumulativeHeights.push(totalHeight)\n  }\n\n  return cumulativeHeights\n}\n\nfunction getRowHeightsForResize(tableNode: TableElement): number[] {\n  const { children: tableRows, rowHeights = [] } = tableNode\n\n  const hasValidSnapshot = (\n    rowHeights.length === tableRows.length\n    && rowHeights.every(height => Number.isFinite(height) && height > 0)\n  )\n\n  if (hasValidSnapshot) {\n    return rowHeights\n  }\n\n  return tableRows.map(row => (row as TableRowElement).height || 30)\n}\n\n// 行拖拽相关状态\nlet isMouseDownForRowResize = false\nlet clientYWhenMouseDown = 0\nlet editorWhenMouseDownForRow: IDomEditor | null = null\nconst $window = $(window)\n\n/**\n * 计算行高度调整\n */\nfunction calculateRowHeights(rowHeights: number[], resizingRowIndex: number, heightChange: number, editor: IDomEditor): number[] {\n  const newHeights = [...rowHeights]\n\n  // 获取最小高度配置\n  const { minRowHeight = 30 } = editor.getMenuConfig('insertTable') || {}\n  const minHeight = parseInt(minRowHeight.toString(), 10) || 30\n\n  // 直接增加当前行的高度，其他行保持不变\n  const currentHeight = newHeights[resizingRowIndex]\n  const newHeight = Math.max(minHeight, currentHeight + heightChange)\n\n  newHeights[resizingRowIndex] = Math.floor(newHeight * 100) / 100\n\n  return newHeights\n}\n\n/**\n * 根据鼠标位置计算行高度\n */\nfunction calculateRowHeightsByBorderPosition(\n  rowHeights: number[],\n  resizingRowIndex: number,\n  mousePositionInTable: number,\n  cumulativeHeights: number[],\n  editor: IDomEditor,\n): number[] {\n  const newHeights = [...rowHeights]\n\n  // 检查边界范围\n  if (resizingRowIndex < 0 || resizingRowIndex >= rowHeights.length) {\n    return newHeights\n  }\n\n  // 获取最小高度配置\n  const { minRowHeight = 30 } = editor.getMenuConfig('insertTable') || {}\n  const minHeight = parseInt(minRowHeight.toString(), 10) || 30\n\n  // 计算当前边界的上边界位置\n  const topBoundary = resizingRowIndex === 0 ? 0 : cumulativeHeights[resizingRowIndex - 1]\n\n  // 计算鼠标位置相对于当前行上边界的偏移\n  const mouseOffset = mousePositionInTable - topBoundary\n\n  // 确保不小于最小高度\n  const newHeight = Math.max(minHeight, mouseOffset)\n\n  // 直接设置当前行的高度，其他行保持不变\n  newHeights[resizingRowIndex] = Math.floor(newHeight * 100) / 100\n\n  return newHeights\n}\n\nfunction onMouseMoveForRowHandler(event: Event) {\n  if (!isMouseDownForRowResize) { return }\n  if (editorWhenMouseDownForRow === null) { return }\n  event.preventDefault()\n\n  const { clientY } = event as MouseEvent\n  const heightChange = clientY - clientYWhenMouseDown\n\n  const [[elemNode]] = Editor.nodes(editorWhenMouseDownForRow, {\n    match: isOfType(editorWhenMouseDownForRow, 'table'),\n  })\n  const tableNode = elemNode as TableElement\n  const { resizingRowIndex = -1 } = tableNode\n\n  // 优先使用 ResizeObserver 采集到的真实 DOM 行高\n  const rowHeights = getRowHeightsForResize(tableNode)\n\n  let adjustRowHeights: number[]\n  const selectedTableNode = DomEditor.getSelectedNodeByType(editorWhenMouseDownForRow, 'table') as TableElement\n  const tableDom = DomEditor.toDOMNode(editorWhenMouseDownForRow, selectedTableNode)\n\n  const tableElement = tableDom.querySelector('.table')\n\n  if (tableElement) {\n    const tableRect = tableElement.getBoundingClientRect()\n    const mousePositionInTable = clientY - tableRect.top\n\n    // 计算边界的新位置\n    const cumulativeHeights = getCumulativeHeights(rowHeights)\n    const newBorderPosition = mousePositionInTable\n\n    // 根据新的边界位置计算行高度\n    adjustRowHeights = calculateRowHeightsByBorderPosition(rowHeights, resizingRowIndex, newBorderPosition, cumulativeHeights, editorWhenMouseDownForRow)\n  } else {\n    // 如果找不到表格元素，则使用简单的高度变化逻辑\n    adjustRowHeights = calculateRowHeights(rowHeights, resizingRowIndex, heightChange, editorWhenMouseDownForRow)\n  }\n\n  // 直接更新对应行元素的高度\n  const currentTableNode = DomEditor.getSelectedNodeByType(editorWhenMouseDownForRow, 'table') as TableElement\n\n  if (currentTableNode && resizingRowIndex >= 0 && resizingRowIndex < adjustRowHeights.length) {\n    const tablePath = DomEditor.findPath(editorWhenMouseDownForRow, currentTableNode)\n    const rowPath = [...tablePath, resizingRowIndex]\n\n    try {\n      Transforms.setNodes(\n        editorWhenMouseDownForRow,\n        { height: adjustRowHeights[resizingRowIndex] } as TableRowElement,\n        { at: rowPath },\n      )\n    } catch (error) {\n      // 如果路径不存在，忽略错误\n      console.warn('更新行高度失败:', error)\n    }\n  }\n}\n\nconst onMouseMoveForRowThrottled = throttle(onMouseMoveForRowHandler, 100)\n\nfunction onMouseUpForRow(_event: Event) {\n  isMouseDownForRowResize = false\n  editorWhenMouseDownForRow = null\n  document.body.style.cursor = ''\n\n  // 解绑事件\n  $window.off('mousemove', onMouseMoveForRowThrottled)\n  $window.off('mouseup', onMouseUpForRow)\n}\n\n/**\n * 鼠标移动时，判断在哪个行边界上\n */\nexport function handleRowBorderVisible(\n  editor: IDomEditor,\n  elemNode: SlateElement,\n  e: MouseEvent,\n) {\n  if (editor.isDisabled()) { return }\n  if (isMouseDownForRowResize) { return }\n\n  const tableNode = elemNode as TableElement\n  const { isHoverRowBorder, resizingRowIndex } = tableNode\n\n  const { target } = e\n\n  if (isHTMLElememt(target)) {\n    const parent = target.closest('.table')\n\n    if (parent) {\n      const { clientY: mouseY } = e\n      const rect = parent.getBoundingClientRect()\n\n      // 优先使用 ResizeObserver 采集到的真实 DOM 行高\n      const actualRowHeights = getRowHeightsForResize(tableNode)\n      const cumulativeHeights = getCumulativeHeights(actualRowHeights)\n\n      // 鼠标移动时，计算当前鼠标位置，判断在哪个行边界上\n      for (let i = 0; i < cumulativeHeights.length; i += 1) {\n        if (\n          mouseY - rect.y >= cumulativeHeights[i] - 5\n          && mouseY - rect.y < cumulativeHeights[i] + 5\n        ) {\n          // 节流，防止多次引起Transforms.setNodes重绘\n          if (resizingRowIndex === i) { return }\n          Transforms.setNodes(\n            editor,\n            { isHoverRowBorder: true, resizingRowIndex: i } as TableElement,\n            { mode: 'highest' },\n          )\n          return\n        }\n      }\n    }\n  }\n\n  // 鼠标移出时，重置\n  if (isHoverRowBorder === true) {\n    Transforms.setNodes(editor, { isHoverRowBorder: false, resizingRowIndex: -1 } as TableElement, {\n      mode: 'highest',\n    })\n  }\n}\n\n/**\n * 设置行拖拽高亮\n */\nexport function handleRowBorderHighlight(editor: IDomEditor, e: MouseEvent) {\n  if (e.type === 'mouseenter') {\n    Transforms.setNodes(editor, { isResizingRow: true } as TableElement, { mode: 'highest' })\n  } else {\n    Transforms.setNodes(editor, { isResizingRow: false } as TableElement, { mode: 'highest' })\n  }\n}\n\nexport function handleRowBorderMouseDown(editor: IDomEditor, _elemNode: SlateElement) {\n  if (isMouseDownForRowResize) { return }\n  editorWhenMouseDownForRow = editor\n}\n\nfunction onMouseDownForRow(event: Event) {\n  const elem = event.target as HTMLElement\n\n  if (elem.tagName === 'DIV' && elem.closest('.row-resizer-item')) {\n    if (editorWhenMouseDownForRow === null) { return }\n\n    // 记录必要信息\n    isMouseDownForRowResize = true\n    const { clientY } = event as MouseEvent\n\n    clientYWhenMouseDown = clientY\n    document.body.style.cursor = 'row-resize'\n    event.preventDefault()\n  }\n\n  $window.on('mousemove', onMouseMoveForRowThrottled)\n  $window.on('mouseup', onMouseUpForRow)\n}\n\n$window.on('mousedown', onMouseDownForRow)\n","/**\n * @description render elem\n * @author wangfupeng\n */\n\nimport renderTableCell from './render-cell'\nimport renderTableRow from './render-row'\nimport renderTable from './render-table'\n\nexport const renderTableConf = {\n  type: 'table',\n  renderElem: renderTable,\n}\n\nexport const renderTableRowConf = {\n  type: 'table-row',\n  renderElem: renderTableRow,\n}\n\nexport const renderTableCellConf = {\n  type: 'table-cell',\n  renderElem: renderTableCell,\n}\n","/**\n * @description render table\n * @author wangfupeng\n */\n\nimport { DomEditor, IDomEditor } from '@wangeditor-next/core'\nimport debounce from 'lodash.debounce'\nimport {\n  Editor,\n  Element as SlateElement,\n  Path, Point, Range,\n} from 'slate'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { h, jsx, VNode } from 'snabbdom'\n\nimport {\n  getColumnWidthRatios,\n  handleCellBorderHighlight,\n  handleCellBorderMouseDown,\n  handleCellBorderVisible,\n  observerTableResize,\n  unObserveTableResize,\n} from '../column-resize'\nimport { TableElement, TableRowElement } from '../custom-types'\nimport {\n  handleRowBorderHighlight,\n  handleRowBorderMouseDown,\n  handleRowBorderVisible,\n} from '../row-resize'\nimport { TableCursor } from '../table-cursor'\n\n/**\n * 计算 table 是否可编辑。如果选区跨域 table 和外部内容，删除，会导致 table 结构打乱。所以，有时要让 table 不可编辑\n * @param editor editor\n * @param tableElem table elem\n */\nfunction getContentEditable(editor: IDomEditor, tableElem: SlateElement): boolean {\n  if (editor.isDisabled()) { return false }\n\n  const { selection } = editor\n\n  if (selection == null) { return true }\n  if (Range.isCollapsed(selection)) { return true }\n\n  const { anchor, focus } = selection\n  const tablePath = DomEditor.findPath(editor, tableElem)\n\n  const tableStart = Editor.start(editor, tablePath)\n  const tableEnd = Editor.end(editor, tablePath)\n  const isAnchorInTable = Point.compare(anchor, tableEnd) <= 0 && Point.compare(anchor, tableStart) >= 0\n  const isFocusInTable = Point.compare(focus, tableEnd) <= 0 && Point.compare(focus, tableStart) >= 0\n\n  // 选区在 table 内部，且选中了同一个单元格。表格可以编辑\n  if (isAnchorInTable && isFocusInTable) {\n    if (Path.equals(anchor.path.slice(0, 3), focus.path.slice(0, 3))) {\n      return true\n    }\n  }\n\n  return false\n}\n\nfunction renderTable(elemNode: SlateElement, children: VNode[] | null, editor: IDomEditor): VNode {\n  // 是否可编辑\n  const editable = getContentEditable(editor, elemNode)\n\n  // 宽度和高度\n  const {\n    width: tableWidth = 'auto',\n    caption,\n    height,\n    columnWidths = [],\n    rowHeights = [],\n    scrollWidth = 0,\n    isHoverCellBorder,\n    resizingIndex,\n    isResizing,\n    isHoverRowBorder,\n    resizingRowIndex,\n    isResizingRow,\n  } = elemNode as TableElement\n\n  // 光标是否选中\n  const selected = DomEditor.isNodeSelected(editor, elemNode)\n  // 光标是否有选区\n  const [isSelecting] = TableCursor.selection(editor)\n  // 列宽之间比值\n  const columnWidthRatios = getColumnWidthRatios(columnWidths)\n\n  const vnode = (\n    <div\n      className=\"table-container\"\n      data-selected={selected}\n      on={{\n        mousedown: (e: MouseEvent) => {\n          // @ts-ignore 阻止光标定位到 table 后面\n          if (e.target.tagName === 'DIV') { e.preventDefault() }\n\n          if (editor.isDisabled()) { return }\n\n          // @ts-ignore 如果用户行为是获取焦点输入文本时，需释放选区\n          if (e.target.closest('[data-block-type=\"table-cell\"]')) {\n            TableCursor.unselect(editor)\n          }\n\n          // 是否需要定位到 table 内部\n          const tablePath = DomEditor.findPath(editor, elemNode)\n          const tableStart = Editor.start(editor, tablePath)\n          const { selection } = editor\n\n          if (selection == null) {\n            editor.select(tableStart) // 选中 table 内部\n            return\n          }\n          const { path } = selection.anchor\n\n          if (path[0] === tablePath[0]) { return } // 当前选区，就在 table 内部\n          // @ts-ignore\n          if (e.target.tagName === 'DIV') {\n            editor.select(tableStart)\n          } // 选中 table 内部\n        },\n      }}\n    >\n      <table\n        width={tableWidth}\n        contentEditable={editable}\n        /**\n         * 1. 当表格处于选区状态，屏蔽 Chrome 自带的样式\n         * 2. table 宽度为 auto 时，宽度为 列宽之和\n         * 3. 鼠标移动到 单元格 边缘，设置 visible className\n         */\n        className={`table ${isSelecting ? 'table-selection-none' : ''}`}\n        style={{\n          width: tableWidth === '100%' ? tableWidth : `${columnWidths.reduce((a, b) => a + b, 0)}px`,\n        }}\n        on={{\n          mousemove: debounce(\n            (e: MouseEvent) => {\n              if (!TableCursor.hasSelected(editor)) {\n                handleCellBorderVisible(editor, elemNode, e, scrollWidth)\n                handleRowBorderVisible(editor, elemNode, e)\n              }\n            },\n            25,\n          ),\n        }}\n      >\n        {\n          caption ? (\n            <caption contentEditable={false}>{caption}</caption>\n          ) : null\n        }\n        <colgroup contentEditable={false}>\n          {\n            /**\n             * 剔除 firstRowCells，因单元格合并 表头 th，会计算错误。\n             * 使用 columnWidth 数组长度代表列数\n             * 拖动行为及变量设置均参考 飞书\n             */\n            columnWidths.map(width => {\n              return <col width={width}></col>\n            })\n          }\n        </colgroup>\n        <tbody>{children}</tbody>\n      </table>\n\n      <div className=\"column-resizer\" contentEditable={false}>\n        {columnWidths.map((width, index) => {\n          let minWidth = width\n          /**\n           * table width 为 100% 模式时\n           * columnWidths 表示的是比例\n           * 1. 需要计算出真实的宽度\n           */\n\n          if (tableWidth === '100%') {\n            minWidth = columnWidthRatios[index] * scrollWidth\n          }\n\n          return (\n            <div className=\"column-resizer-item\" style={{ minWidth: `${minWidth}px` }}>\n              <div\n                className={\n                  `resizer-line-hotzone ${\n                    isHoverCellBorder && index === resizingIndex ? 'visible ' : ''\n                  }${isResizing && index === resizingIndex ? 'highlight' : ''}`\n                }\n                style={{ height: `${height}px` }}\n                on={{\n                  mouseenter: (e: MouseEvent) => handleCellBorderHighlight(editor, e),\n                  mouseleave: (e: MouseEvent) => handleCellBorderHighlight(editor, e),\n                  mousedown: (_e: MouseEvent) => handleCellBorderMouseDown(editor, elemNode),\n                }}\n              >\n                <div className=\"resizer-line\"></div>\n              </div>\n            </div>\n          )\n        })}\n      </div>\n\n      <div className=\"row-resizer\" contentEditable={false}>\n        {(elemNode as TableElement).children.map((rowNode, index) => {\n          const totalTableWidth = columnWidths.reduce((a, b) => a + b, 0)\n          const rowHeightFromObserver = rowHeights[index]\n          const rowHeight = Number.isFinite(rowHeightFromObserver) && rowHeightFromObserver > 0\n            ? rowHeightFromObserver\n            : (rowNode as TableRowElement).height || 30\n\n          return (\n            <div className=\"row-resizer-item\" style={{ minHeight: `${rowHeight}px` }}>\n              <div\n                className={\n                  `resizer-line-hotzone-horizontal ${\n                    isHoverRowBorder && index === resizingRowIndex ? 'visible ' : ''\n                  }${isResizingRow && index === resizingRowIndex ? 'highlight' : ''}`\n                }\n                style={{ width: `${totalTableWidth}px` }}\n                on={{\n                  mouseenter: (e: MouseEvent) => handleRowBorderHighlight(editor, e),\n                  mouseleave: (e: MouseEvent) => handleRowBorderHighlight(editor, e),\n                  mousedown: (_e: MouseEvent) => handleRowBorderMouseDown(editor, elemNode),\n                }}\n              >\n                <div className=\"resizer-line-horizontal\"></div>\n              </div>\n            </div>\n          )\n        })}\n      </div>\n    </div>\n  )\n\n  /**\n   * 移出直接返回 vnode\n   * 添加 ObserverResize 监听行为\n   * 监听 table 内部变化，更新 table resize-bar 高度\n   */\n  const containerVnode = h(\n    'div',\n    {\n      hook: {\n        insert: ({ elm }: VNode) => observerTableResize(editor, elm),\n        destroy: () => {\n          unObserveTableResize()\n        },\n      },\n    },\n    vnode,\n  )\n\n  return containerVnode\n}\n\nexport default renderTable\n","/**\n * @description render row\n * @author wangfupeng\n */\n\nimport { IDomEditor } from '@wangeditor-next/core'\nimport { Element as SlateElement } from 'slate'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { jsx, VNode } from 'snabbdom'\n\nimport { TableRowElement } from '../custom-types'\n\nfunction renderTableRow(\n  elemNode: SlateElement,\n  children: VNode[] | null,\n  _editor: IDomEditor,\n): VNode {\n  const { height } = elemNode as TableRowElement\n\n  const vnode = (\n    <tr style={height ? { height: `${height}px` } : {}}>\n      {children}\n    </tr>\n  )\n\n  return vnode\n}\n\nexport default renderTableRow\n","/**\n * @description render cell\n * @author wangfupeng\n */\n\nimport { IDomEditor } from '@wangeditor-next/core'\nimport { Element as SlateElement } from 'slate'\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { jsx, VNode } from 'snabbdom'\n\nimport { TableCellElement } from '../custom-types'\nimport { isCellInFirstRow } from '../helpers'\nimport { TableCursor } from '../table-cursor'\n\nfunction renderTableCell(\n  cellNode: SlateElement,\n  children: VNode[] | null,\n  editor: IDomEditor,\n): VNode {\n  const isFirstRow = isCellInFirstRow(editor, cellNode as TableCellElement)\n  const {\n    colSpan = 1,\n    rowSpan = 1,\n    isHeader = false,\n    hidden = false,\n  } = cellNode as TableCellElement\n  const selected = TableCursor.isSelected(editor, cellNode)\n\n  // ------------------ 不是第一行，直接渲染 <td> ------------------\n  if (!isFirstRow) {\n    return (\n      <td\n        colSpan={colSpan}\n        rowSpan={rowSpan}\n        /**\n         * 1. 添加一个方便寻址的 block-type\n         * 2. 选区颜色\n         * 3. 合并单元格时，判断隐藏\n         */\n        data-block-type=\"table-cell\"\n        className={selected ? 'w-e-selected' : ''}\n        style={{ display: hidden ? 'none' : '' }}\n      >\n        {children}\n      </td>\n    )\n  }\n\n  // ------------------ 是第一行：1. 判断 th ；2. 拖拽列宽 ------------------\n  const Tag = isHeader ? 'th' : 'td'\n\n  const vnode = (\n    <Tag\n      colSpan={colSpan}\n      rowSpan={rowSpan}\n      /**\n       * 1. 添加一个方便寻址的 block-type\n       * 2. 选区颜色\n       * 3. 合并单元格时，判断隐藏\n       */\n      data-block-type=\"table-cell\"\n      className={selected ? 'w-e-selected' : ''}\n      style={{ display: hidden ? 'none' : '' }}\n    >\n      {children}\n    </Tag>\n  )\n\n  return vnode\n}\n\nexport default renderTableCell\n","/**\n * @description vdom utils fn\n * @author wangfupeng\n */\n\nimport { VNode, VNodeStyle } from 'snabbdom'\n\n// /**\n//  * 给 vnode 添加 dataset\n//  * @param vnode vnode\n//  * @param newDataset { key: val }\n//  */\n// export function addVnodeDataset(vnode: VNode, newDataset: Dataset) {\n//   if (vnode.data == null) vnode.data = {}\n//   const data = vnode.data\n//   if (data.dataset == null) data.dataset = {}\n\n//   Object.assign(data.dataset, newDataset)\n// }\n\n/**\n * 给 vnode 添加样式\n * @param vnode vnode\n * @param newStyle { key: val }\n */\nexport function addVnodeStyle(vnode: VNode, newStyle: VNodeStyle) {\n  if (vnode.data == null) { vnode.data = {} }\n  const data = vnode.data\n\n  if (data.style == null) { data.style = {} }\n\n  Object.assign(data.style, newStyle)\n}\n","/**\n * @description style to html\n * @author hsuna\n */\n\nimport {\n  getClassStylePolicy,\n  getTextStyleMode,\n  IDomEditor,\n  reportUnsupportedClassStyle,\n} from '@wangeditor-next/core'\n\nimport $, { getOuterHTML } from '../utils/dom'\n\nconst SUPPORTED_TABLE_BORDER_STYLE = new Set([\n  'solid',\n  'dotted',\n  'dashed',\n  'double',\n  'groove',\n  'ridge',\n  'inset',\n  'outset',\n])\nconst REPORTED_UNSUPPORTED_BORDER_STYLE = new Set<string>()\n\nfunction getBorderStyleClass(borderStyle: string): string {\n  const val = (borderStyle || '').trim().toLowerCase()\n\n  if (!val || val === 'none') { return '' }\n  return `w-e-table-border-style-${val}`\n}\n\nfunction normalizeBorderStyle(borderStyle: string): string {\n  return `${borderStyle || ''}`.trim().toLowerCase().replace(/\\s+/g, ' ')\n}\n\nfunction resolveBorderStyleAction(\n  editor: IDomEditor | undefined,\n  borderStyle: string,\n): 'skip' | 'class' | 'inline' | 'preserve-data' {\n  const normalized = normalizeBorderStyle(borderStyle)\n\n  if (!normalized || normalized === 'none') { return 'skip' }\n  if (SUPPORTED_TABLE_BORDER_STYLE.has(normalized)) { return 'class' }\n\n  const policy = getClassStylePolicy(editor)\n  let fallback: 'preserve-data' | 'inline' | 'throw' = 'preserve-data'\n\n  if (policy === 'fallback-inline') {\n    fallback = 'inline'\n  }\n  if (policy === 'strict') {\n    fallback = 'throw'\n  }\n\n  const message = `[wangeditor] Unsupported table border-style token \"${normalized}\" in class mode. policy=${policy}`\n  const reportKey = `${normalized}|${fallback}`\n\n  if (!REPORTED_UNSUPPORTED_BORDER_STYLE.has(reportKey)) {\n    REPORTED_UNSUPPORTED_BORDER_STYLE.add(reportKey)\n    reportUnsupportedClassStyle(editor, {\n      type: 'table-border-style',\n      value: normalized,\n      scene: 'toHtml',\n      fallback,\n      message,\n    })\n  }\n\n  if (fallback === 'throw') {\n    throw new Error(message)\n  }\n\n  if (fallback === 'inline') {\n    return 'inline'\n  }\n\n  return 'preserve-data'\n}\n\nexport function styleToHtml(node, elemHtml, editor?: IDomEditor) {\n  if (node.type !== 'table' && node.type !== 'table-cell') { return elemHtml }\n\n  const {\n    backgroundColor, borderWidth, borderStyle, borderColor, textAlign,\n  } = node\n\n  if (!(backgroundColor || borderWidth || borderStyle || borderColor || textAlign)) { return elemHtml }\n\n  const $elem = $(elemHtml)\n  const textStyleMode = getTextStyleMode(editor)\n\n  if (textStyleMode === 'class') {\n    if (backgroundColor) {\n      $elem.attr('bgcolor', backgroundColor)\n      $elem.attr('data-w-e-background-color', backgroundColor)\n    }\n\n    if (borderWidth) {\n      const normalizedBorderWidth = `${borderWidth}`.trim()\n\n      if (normalizedBorderWidth) {\n        $elem.attr('data-w-e-border-width', normalizedBorderWidth)\n        $elem.attr('border', normalizedBorderWidth)\n      }\n    }\n\n    if (borderStyle) {\n      const normalizedBorderStyle = normalizeBorderStyle(borderStyle)\n      const borderStyleAction = resolveBorderStyleAction(editor, normalizedBorderStyle)\n\n      if (borderStyleAction !== 'skip') {\n        $elem.attr('data-w-e-border-line', normalizedBorderStyle)\n      }\n\n      if (borderStyleAction === 'class') {\n        $elem.addClass(getBorderStyleClass(normalizedBorderStyle))\n      } else if (borderStyleAction === 'inline') {\n        $elem.css('border-style', normalizedBorderStyle)\n      }\n    }\n\n    if (borderColor) {\n      $elem.attr('bordercolor', borderColor)\n      $elem.attr('data-w-e-border-color', borderColor)\n    }\n\n    if (textAlign) {\n      $elem.attr('align', textAlign)\n      $elem.attr('data-w-e-text-align', textAlign)\n    }\n\n    return getOuterHTML($elem)\n  }\n\n  // 设置样式\n  if (backgroundColor) { $elem.css('background-color', backgroundColor) }\n  if (borderWidth) { $elem.css('border-width', `${borderWidth}px`) }\n  if (borderStyle) { $elem.css('border-style', borderStyle === 'none' ? '' : borderStyle) }\n  if (borderColor) { $elem.css('border-color', borderColor) }\n  if (textAlign) { $elem.css('text-align', textAlign) }\n\n  // 输出 html\n  return getOuterHTML($elem)\n}\n","/**\n * @description table module\n * @author wangfupeng\n */\n\nimport { IModuleConf } from '@wangeditor-next/core'\n\nimport { tableCellToHtmlConf, tableRowToHtmlConf, tableToHtmlConf } from './elem-to-html'\nimport {\n  deleteTableColConf,\n  deleteTableMenuConf,\n  deleteTableRowConf,\n  insertTableColConf,\n  insertTableMenuConf,\n  insertTableRowConf,\n  mergeTableCellConf,\n  setTableCellPropertyConf,\n  setTablePropertyConf,\n  splitTableCellConf,\n  tableFullWidthMenuConf,\n  tableHeaderMenuConf,\n} from './menu/index'\nimport { parseCellHtmlConf, parseRowHtmlConf, parseTableHtmlConf } from './parse-elem-html'\nimport { parseStyleHtml } from './parse-style-html'\nimport withTable from './plugin'\nimport { preParseTableHtmlConf } from './pre-parse-html'\nimport { renderTableCellConf, renderTableConf, renderTableRowConf } from './render-elem/index'\nimport { renderStyle } from './render-style'\nimport { styleToHtml } from './style-to-html'\n\nconst table: Partial<IModuleConf> = {\n  renderStyle,\n  styleToHtml,\n  parseStyleHtml,\n  renderElems: [renderTableConf, renderTableRowConf, renderTableCellConf],\n  elemsToHtml: [tableToHtmlConf, tableRowToHtmlConf, tableCellToHtmlConf],\n  preParseHtml: [preParseTableHtmlConf],\n  parseElemsHtml: [parseCellHtmlConf, parseRowHtmlConf, parseTableHtmlConf],\n  menus: [\n    insertTableMenuConf,\n    deleteTableMenuConf,\n    insertTableRowConf,\n    deleteTableRowConf,\n    insertTableColConf,\n    deleteTableColConf,\n    tableHeaderMenuConf,\n    tableFullWidthMenuConf,\n    mergeTableCellConf,\n    splitTableCellConf,\n    setTablePropertyConf,\n    setTableCellPropertyConf,\n  ],\n  editorPlugin: withTable,\n}\n\nexport default table\n","import { Descendant, Element } from 'slate'\nimport { VNode } from 'snabbdom'\n\nimport { addVnodeStyle } from '../utils/vdom'\nimport { TableCellElement, TableCellProperty } from './custom-types'\n\n/**\n * 添加样式\n * @param node slate elem\n * @param vnode vnode\n * @returns vnode\n */\nexport function renderStyle(node: Descendant, vnode: VNode): VNode {\n  if (!Element.isElement(node)) { return vnode }\n\n  const {\n    backgroundColor, borderWidth, borderStyle, borderColor, textAlign,\n  } = node as TableCellElement\n\n  const props: TableCellProperty = {}\n\n  if (backgroundColor) { props.backgroundColor = backgroundColor }\n  if (borderWidth) {\n    const pureNumericRegex = /^\\d+(\\.\\d+)?$/\n\n    if (pureNumericRegex.test(borderWidth)) {\n      // 增加一层校验，如果是纯数字则增加px的后缀：\"123\"、\"123.333\"\n      props.borderWidth = `${borderWidth}px`\n    } else {\n      props.borderWidth = borderWidth\n    }\n  }\n  if (borderStyle) { props.borderStyle = borderStyle === 'none' ? '' : borderStyle }\n  if (borderColor) { props.borderColor = borderColor }\n  if (textAlign) { props.textAlign = textAlign }\n\n  const styleVnode: VNode = vnode\n\n  if (node.type === 'table') {\n    addVnodeStyle((styleVnode.children?.[0] as VNode).children?.[0] as VNode, props)\n  } else {\n    addVnodeStyle(styleVnode, props)\n  }\n  return styleVnode\n}\n","import {\n  Editor, Element, Operation, Path, Range,\n} from 'slate'\n\nimport {\n  filledMatrix, hasCommon, NodeEntryWithContext, Point,\n} from '../utils'\nimport { TableCursor } from './table-cursor'\nimport { EDITOR_TO_SELECTION, EDITOR_TO_SELECTION_SET } from './weak-maps'\n\nexport function withSelection<T extends Editor>(editor: T) {\n  const { apply } = editor\n\n  editor.apply = (op: Operation): void => {\n    if (!Operation.isSelectionOperation(op) || !op.newProperties) {\n      // TableCursor.unselect(editor);\n      // 仿飞书效果，拖动单元格宽度时，选区不消失\n      return apply(op)\n    }\n\n    const selection = {\n      ...editor.selection,\n      ...op.newProperties,\n    }\n\n    if (!Range.isRange(selection)) {\n      TableCursor.unselect(editor)\n      return apply(op)\n    }\n\n    const isTableCell = (n: unknown) => {\n      return Element.isElement(n)\n    && (n.type === 'table-cell'\n     || n.type === 'th'\n     || n.type === 'td')\n    }\n\n    const [fromEntry] = Editor.nodes(editor, {\n      match: isTableCell,\n      at: Range.start(selection),\n      mode: 'lowest', // 确保找到最低层的匹配节点\n    })\n\n    const [toEntry] = Editor.nodes(editor, {\n      match: isTableCell,\n      at: Range.end(selection),\n      mode: 'lowest', // 确保找到最低层的匹配节点\n    })\n\n    if (!fromEntry || !toEntry) {\n      TableCursor.unselect(editor)\n      return apply(op)\n    }\n\n    const [, fromPath] = fromEntry\n    const [, toPath] = toEntry\n\n    if (Path.equals(fromPath, toPath) || !hasCommon(editor, [fromPath, toPath], 'table')) {\n      TableCursor.unselect(editor)\n      return apply(op)\n    }\n\n    // TODO: perf: could be improved by passing a Span [fromPath, toPath]\n    try {\n      const filled = filledMatrix(editor, { at: fromPath })\n\n      // 基本的有效性检查\n      if (!filled || filled.length === 0) {\n        TableCursor.unselect(editor)\n        return apply(op)\n      }\n\n      // find initial bounds\n      const from = Point.valueOf(0, 0)\n      const to = Point.valueOf(0, 0)\n      let fromFound = false\n      let toFound = false\n\n      for (let x = 0; x < filled.length; x += 1) {\n        if (!filled[x]) { continue } // 跳过空行\n\n        for (let y = 0; y < filled[x].length; y += 1) {\n          if (!filled[x][y]) { continue } // 跳过空单元格\n\n          const [[, path]] = filled[x][y]\n\n          if (Path.equals(fromPath, path)) {\n            from.x = x\n            from.y = y\n            fromFound = true\n          }\n\n          if (Path.equals(toPath, path)) {\n            to.x = x\n            to.y = y\n            toFound = true\n          }\n        }\n      }\n\n      // 如果找不到位置，可能是选择了被删除的单元格区域\n      if (!fromFound || !toFound) {\n        TableCursor.unselect(editor)\n        return apply(op)\n      }\n\n      let start = Point.valueOf(Math.min(from.x, to.x), Math.min(from.y, to.y))\n      let end = Point.valueOf(Math.max(from.x, to.x), Math.max(from.y, to.y))\n\n      // expand the selection based on rowspan and colspan\n      for (;;) {\n        const nextStart = Point.valueOf(start.x, start.y)\n        const nextEnd = Point.valueOf(end.x, end.y)\n\n        for (let x = nextStart.x; x <= nextEnd.x && x < filled.length; x += 1) {\n          if (!filled[x]) { continue }\n\n          for (let y = nextStart.y; y <= nextEnd.y && y < filled[x].length; y += 1) {\n            if (!filled[x][y]) { continue }\n\n            const [, context] = filled[x][y]\n\n            if (!context) { continue }\n\n            const {\n              rtl, ltr, btt, ttb,\n            } = context\n\n            nextStart.x = Math.min(nextStart.x, x - (ttb - 1))\n            nextStart.y = Math.min(nextStart.y, y - (rtl - 1))\n\n            nextEnd.x = Math.max(nextEnd.x, x + (btt - 1))\n            nextEnd.y = Math.max(nextEnd.y, y + (ltr - 1))\n          }\n        }\n\n        if (Point.equals(start, nextStart) && Point.equals(end, nextEnd)) {\n          break\n        }\n\n        start = nextStart\n        end = nextEnd\n      }\n\n      const selected: NodeEntryWithContext[][] = []\n      const selectedSet = new WeakSet<Element>()\n\n      for (let x = start.x; x <= end.x && x < filled.length; x += 1) {\n        if (!filled[x]) { continue }\n\n        const cells: NodeEntryWithContext[] = []\n\n        for (let y = start.y; y <= end.y && y < filled[x].length; y += 1) {\n          if (!filled[x][y]) { continue }\n\n          const [[element]] = filled[x][y]\n\n          if (!element) { continue }\n\n          selectedSet.add(element)\n          cells.push(filled[x][y])\n        }\n\n        if (cells.length > 0) {\n          selected.push(cells)\n        }\n      }\n\n      EDITOR_TO_SELECTION.set(editor, selected)\n      EDITOR_TO_SELECTION_SET.set(editor, selectedSet)\n\n    } catch (error) {\n      TableCursor.unselect(editor)\n      return apply(op)\n    }\n\n    apply(op)\n  }\n\n  return editor\n}\n"],"names":["i18nAddResources","tableModule","modal","border","borderColor","borderWidth","bgColor","align","ok","color","default","clear","borderStyle","none","solid","dotted","dashed","double","groove","ridge","inset","outset","deleteCol","deleteRow","deleteTable","widthAuto","insertCol","insertRow","insertTable","header","mergeCell","splitCell","tableProperty","cellProperty","tableToHtmlConf","type","elemToHtml","elemNode","childrenHtml","editor","tableNode","columnWidths","caption","_a","height","cols","map","colWidth","concat","join","captionStr","replace","colgroupStr","exportedWidth","width","_b","widthExportMode","getMenuConfig","menuConf","getTableWidthExportMode","totalWidth","reduce","sum","columnWidth","Number","isFinite","getExportTableWidth","getTextStyleMode","widthAttr","heightValue","String","trim","heightAttr","heightDataAttr","tableRowToHtmlConf","elem","heightStyle","tableCellToHtmlConf","cellNode","colSpan","_c","rowSpan","_d","isHeader","_e","_f","hidden","tag","CLEAN_SVG","DEFAULT_WITH_TABLE_OPTIONS","blocks","td","th","content","tr","table","tbody","isOfType","types","_i","arguments","length","options","elementTypes","node","Editor","isEditor","Element","isElement","includes","hasCommon","__read","path","another","Node","common","commonPath","apply","__spreadArray","above","match","at","filledMatrix","filled","__values","nodes","tablePath","next","value","matrix","_g","done","_h","trPath","push","_l","sent","matrices","filledSection","maxCols","x","Math","max","y","startCol","c","r","targetX","targetY","rtl","ltr","ttb","btt","Point","this","valueOf","equals","point","getTagName","$elem","tagName","toLowerCase","getStyleValue","styleKey","res","styleArr","attr","split","i","styleItemStr","arr","getOuterHTML","outerHTML","append","$","fn","on","focus","val","html","dataset","addClass","removeClass","children","each","find","data","hide","show","EDITOR_TO_SELECTION","WeakMap","EDITOR_TO_SELECTION_SET","TableProperty","title","t","iconSvg","showModal","modalWidth","menu","label","textAlignOptions","svg","prototype","getValue","_editor","isActive","isDisabled","DomEditor","getSelectedNodeByType","exec","_value","getModalContentNode","getModalPositionNode","getModalContentElem","_this","$content","item","updateTextAlignButton","button","$buttonElem","e","currentTarget","setSelectedColor","css","empty","selectedColor","$panel","getPanelContentElem","mark","callback","props","Array","from","obj","selection","get","forEach","row","cell","Transforms","setNodes","setTimeout","$colorPanel","target","preventDefault","stopPropagation","colors","$block","$li","clearText","$clearLi","prepend","CellProperty","_super","__extends","DeleteCol","Range","isCollapsed","n","checkNodeType","universal","selectedCellNode","selectedCellPath","rowNode","getParentNode","colLength","removeNodes","mode","tdIndex","out","Path","withoutNormalizing","cellsToDelete","Set","processedMergedCells","cellPath","cellPathKey","realCellRow","realCellCol","realCellElement","realCellPath","realCellPathKey","has","add","newColSpan","cellsToDeleteArray","sort","a","b","pathA","pathB","cellsToDeleteArray_1","cellsToDeleteArray_1_1","hasPath","error","console","warn","tableEntry","_k","adjustColumnWidths","splice","DeleteRow","rowPath","trIndex","outer","cellsToInsert","originalRowIndex","originalCell","typedOriginalCell","newCell","child","backgroundColor","textAlign","columnIndex","targetRowPath","cellsToInsert_1","cellsToInsert_1_1","_j","insertPath","insertNodes","cellCount","endPath","fallbackError","DeleteTable","TableFullWidth","getFirstRowCells","rows","isTableWithHeader","every","InsertCol","cellEntry","currentColWidth","selectedColSpan","insertPosition","normalizedInsertPosition","totalCols","insertColIndex","min","mergeInspectColIndex","skipInsertForRows","currentRow","text","lastCellPath","_o","_p","_q","minWidth","parseInt","toString","halfWidth","floor","remainingWidth","InsertRow","cellsLength","destIndex","isWithinBounds","exitMerge","element","minRowHeight","newRow","parent","newRowPath","InsertTable","showDropPanel","getSelectedElems","some","getNodeType","isVoid","$info","$table","$tr","j","$td","focusX","focusY","innerHTML","$newTd","rowNumStr","colNumStr","rowNum","colNum","isSelectedEmptyParagraph","tableFullWidth","tableHeader","fill","cells","selected","genTableNode","TableCursor","isInTable","entry","unselect","delete","isSelected","selectedElements","hasSelected","MergeCell","canMerge","merge","lastPath","basePath","reverse","realCells","Map","minRow","Infinity","maxRow","minCol","maxCol","pathKey","set","cellMinRow","cellMaxRow","cellMinCol","cellMaxCol","finalRowSpan","finalColSpan","realCells_1","realCells_1_1","cellsToDelete_1","cellsToDelete_1_1","childPath","moveNodes","to","SplitCell","hasHeader","selectedCell","currentRowPath","slice","insertIndex","cellsCount","fallbackPath","Error","message","targetRowIndex","targetRow","currentCellsCount","insertError","updatedCellsCount","finalError","rowError","TableHeader","newValue","findPath","insertTableMenuConf","key","config","factory","deleteTableMenuConf","insertTableRowConf","deleteTableRowConf","insertTableColConf","deleteTableColConf","tableHeaderMenuConf","TableHander","tableFullWidthMenuConf","FullWidth","mergeTableCellConf","splitTableCellConf","setTablePropertyConf","setTableCellPropertyConf","parsePixelSize","fallback","parsedValue","isNaN","parseCssPixelSize","percentageBase","rawValue","parseFloat","endsWith","round","base","parseCellHtmlConf","selector","parseElemHtml","cellText","filter","Text","isText","isInline","parseRowHtmlConf","tableCellChildren","tableCell","undefined","parseTableHtmlConf","tableWidth","styleWidth","isClassModeTable","hasClass","tableELement","tdList","colgroupElments","rawWidth","getTableWidthPixelBase","colgroupWidths","colgroupElements","col","span","getAttribute","getColgroupWidths","columnWidths_1","DEFAULT_BORDER_COLOR","window","getComputedStyle","document","documentElement","getPropertyValue","CELL_BREAK","deleteHandler","newEditor","cellNodeEntry","start","anchor","deleteCellBreak","unit","direction","targetPoint","offset","before","isEnd","after","aboveCell","targetNode","startOffset","endOffset","nodeText","string","insertText","end","select","isTableLocation","location","isProtectedNode","protectedTypes_1","protectedTypes_1_1","tryApplyAutoFittedColumnWidths","style","tableLayout","isAutoWidthFixedLayoutTable","colgroup","hasExplicitColgroupWidths","$cells","hasExplicitCellWidths","tableElem","body","sandbox","createElement","position","top","left","visibility","pointerEvents","tableClone","cloneNode","appendChild","firstRow","querySelector","measuredWidths","safeSpan","cellWidth","getBoundingClientRect","widthPerColumn","remove","measureColumnWidthsFromLayout","existingColgroup","colgroupElem","setAttribute","colElem","insertBefore","applyMeasuredColumnWidths","normalizeCellParagraphs","cellHtml","container","normalizedNodes","hasMeaningfulContent","childNodes","nodeType","TEXT_NODE","HTMLElement","paragraphHtml","trimmedHtml","paragraphContainer","childNode","textContent","replaceChildren","preParseTableHtmlConf","preParseHtml","$tbody","$cell","getCumulativeWidths","cumulativeWidths","columnWidths_1_1","getColumnWidthRatios","columnWidthsRatio","columnWidths_2","columnWidths_2_1","resizeObserver","observerTableResize","elm","isHTMLElememt","table_1","ResizeObserver","contentRect","rowHeights","querySelectorAll","rowRect","getTableRowHeights","scrollWidth","observe","isSelectionOperation","isMouseDownForResize","clientXWhenMouseDown","editorWhenMouseDown","tablePathWhenMouseDown","$window","event","closest","clientX","cursor","onMouseMove","onMouseUp","throttle","widthChange","SlateElement","resizingIndex","baseColumnWidths","tableDom","toDOMNode","ratio","tableElement","mousePositionInTable","newWidths","minColumnWidth","mouseOffset","newWidth","calculateAdjacentWidthsByBorderPosition","currentWidth","calculateAdjacentWidths","nextTableProps","_event","flush","cancel","off","handleCellBorderHighlight","isResizing","getCumulativeHeights","cumulativeHeights","totalHeight","rowHeights_2","rowHeights_2_1","getRowHeightsForResize","tableRows","isMouseDownForRowResize","clientYWhenMouseDown","editorWhenMouseDownForRow","onMouseMoveForRowThrottled","adjustRowHeights","clientY","heightChange","resizingRowIndex","selectedTableNode","newHeights","minHeight","newHeight","calculateRowHeightsByBorderPosition","currentHeight","calculateRowHeights","currentTableNode","onMouseUpForRow","handleRowBorderHighlight","isResizingRow","renderTableConf","renderElem","editable","tableStart","tableEnd","isAnchorInTable","compare","isFocusInTable","getContentEditable","isHoverCellBorder","isHoverRowBorder","isNodeSelected","isSelecting","columnWidthRatios","vnode","jsx","className","mousedown","contentEditable","mousemove","debounce","rect","parent_1","clientX_1","v","handleCellBorderVisible","mouseY","handleRowBorderVisible","index","mouseenter","mouseleave","handleCellBorderMouseDown","totalTableWidth","rowHeightFromObserver","rowHeight","handleRowBorderMouseDown","containerVnode","h","hook","insert","destroy","disconnect","renderTableRowConf","renderTableCellConf","isFirstRow","isCellInFirstRow","display","addVnodeStyle","newStyle","Object","assign","SUPPORTED_TABLE_BORDER_STYLE","REPORTED_UNSUPPORTED_BORDER_STYLE","normalizeBorderStyle","renderStyle","test","styleVnode","styleToHtml","elemHtml","normalizedBorderWidth","normalizedBorderStyle","borderStyleAction","normalized","policy","getClassStylePolicy","reportKey","reportUnsupportedClassStyle","scene","resolveBorderStyleAction","getBorderStyleClass","parseStyleHtml","dataBorderWidth","dataBorderLine","dataBorderColor","borderAttr","borderColorAttr","classList","Boolean","borderStyleFromClass","startsWith","hasDataBorder","cssValue","_","p1","pxValue","toFixed","renderElems","elemsToHtml","parseElemsHtml","menus","editorPlugin","insertBreak","deleteBackward","deleteForward","normalizeNode","insertData","handleTab","selectAll","deleteFragment","isTableOnBeforeLocation","topLevelNodes","topLevelNodesLength","p","genEmptyParagraph","isTableOnAfterLocation","isLastNode","getData","newSelection","tableSelection","selectedCellPaths_1","firstCellPath","op","Operation","newProperties","__assign","isRange","isTableCell","fromEntry","toEntry","fromPath","toPath","fromFound","toFound","nextStart","nextEnd","context","selectedSet","WeakSet","withSelection","getTableSelection","originalAddMark","addMark","originalRemoveMark","removeMark","originalTransforms","originalSelection","targetEditor"],"mappings":"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"}