@wangeditor-next/editor 5.6.36 → 5.6.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -13866,7 +13866,7 @@
13866
13866
  // 传入 html ,转换为 JSON content
13867
13867
  editor.children = htmlToContent(editor, html);
13868
13868
  }
13869
- if (content && content.length) {
13869
+ else if (content && content.length) {
13870
13870
  editor.children = content; // 传入 JSON content
13871
13871
  }
13872
13872
  if (editor.children.length === 0) {
@@ -32473,7 +32473,9 @@
32473
32473
  CodeBlockMenu.prototype.getValue = function (editor) {
32474
32474
  var elem = this.getSelectCodeElem(editor);
32475
32475
  if (elem == null) {
32476
- return '';
32476
+ var _a = editor.getMenuConfig('codeSelectLang').codeLangs, codeLangs = _a === void 0 ? [] : _a;
32477
+ var selectItem = codeLangs.find(function (item) { return item.selected; });
32478
+ return (selectItem === null || selectItem === void 0 ? void 0 : selectItem.value) || '';
32477
32479
  }
32478
32480
  return elem.language || '';
32479
32481
  };
@@ -39038,9 +39040,12 @@
39038
39040
  }
39039
39041
  function tableCellToHtml(cellNode, childrenHtml) {
39040
39042
  var _a = cellNode, _b = _a.colSpan, colSpan = _b === void 0 ? 1 : _b, _c = _a.rowSpan, rowSpan = _c === void 0 ? 1 : _c, _d = _a.isHeader, isHeader = _d === void 0 ? false : _d, _e = _a.width, width = _e === void 0 ? 'auto' : _e, _f = _a.hidden, hidden = _f === void 0 ? false : _f;
39043
+ // 如果单元格被隐藏,直接返回空字符串,不生成 HTML 元素
39044
+ if (hidden) {
39045
+ return '';
39046
+ }
39041
39047
  var tag = isHeader ? 'th' : 'td';
39042
- var style = hidden ? 'display:none' : '';
39043
- return "<".concat(tag, " colSpan=\"").concat(colSpan, "\" rowSpan=\"").concat(rowSpan, "\" width=\"").concat(width, "\" style=\"").concat(style, "\">").concat(childrenHtml, "</").concat(tag, ">");
39048
+ return "<".concat(tag, " colSpan=\"").concat(colSpan, "\" rowSpan=\"").concat(rowSpan, "\" width=\"").concat(width, "\">").concat(childrenHtml, "</").concat(tag, ">");
39044
39049
  }
39045
39050
  var tableToHtmlConf = {
39046
39051
  type: 'table',
@@ -39227,25 +39232,45 @@
39227
39232
  for (var _b = __values(matrices(editor, { at: options.at })), _c = _b.next(); !_c.done; _c = _b.next()) {
39228
39233
  var matrix = _c.value;
39229
39234
  var filledSection = [];
39235
+ // 首先,找出最大的列数来确定矩阵的宽度
39236
+ var maxCols = 0;
39237
+ for (var x = 0; x < matrix.length; x += 1) {
39238
+ if (matrix[x]) {
39239
+ maxCols = Math.max(maxCols, matrix[x].length);
39240
+ }
39241
+ }
39230
39242
  for (var x = 0; x < matrix.length; x += 1) {
39231
39243
  if (!filledSection[x]) {
39232
39244
  filledSection[x] = [];
39233
39245
  }
39246
+ if (!matrix[x]) {
39247
+ continue;
39248
+ }
39234
39249
  for (var y = 0; y < matrix[x].length; y += 1) {
39250
+ if (!matrix[x][y] || !matrix[x][y][0]) {
39251
+ continue;
39252
+ }
39235
39253
  var _d = __read(matrix[x][y], 1), _e = _d[0], _f = _e.rowSpan, rowSpan = _f === void 0 ? 1 : _f, _g = _e.colSpan, colSpan = _g === void 0 ? 1 : _g;
39236
- for (var c = 0, occupied = 0; c < colSpan + occupied; c += 1) {
39254
+ // 找到下一个可用的位置
39255
+ var startCol = y;
39256
+ while (filledSection[x] && filledSection[x][startCol]) {
39257
+ startCol += 1;
39258
+ }
39259
+ for (var c = 0; c < colSpan; c += 1) {
39237
39260
  for (var r = 0; r < rowSpan; r += 1) {
39238
- if (!filledSection[x + r]) {
39239
- filledSection[x + r] = [];
39261
+ var targetX = x + r;
39262
+ var targetY = startCol + c;
39263
+ if (!filledSection[targetX]) {
39264
+ filledSection[targetX] = [];
39240
39265
  }
39241
- if (filledSection[x + r][y + c]) {
39266
+ if (filledSection[targetX][targetY]) {
39242
39267
  continue;
39243
39268
  }
39244
- filledSection[x + r][y + c] = [
39245
- matrix[x + r][y + c],
39269
+ filledSection[targetX][targetY] = [
39270
+ matrix[x][y],
39246
39271
  {
39247
- rtl: c - occupied + 1,
39248
- ltr: colSpan - c + occupied,
39272
+ rtl: c + 1,
39273
+ ltr: colSpan - c,
39249
39274
  ttb: r + 1,
39250
39275
  btt: rowSpan - r,
39251
39276
  },
@@ -39636,58 +39661,92 @@
39636
39661
  }
39637
39662
  distExports$1.Editor.withoutNormalizing(editor, function () {
39638
39663
  var e_1, _a;
39664
+ // 记录需要删除的单元格路径和已处理的合并单元格
39665
+ var cellsToDelete = new Set();
39666
+ var processedMergedCells = new Set();
39667
+ // 遍历每一行的第 tdIndex 列
39639
39668
  for (var x = 0; x < matrix.length; x += 1) {
39640
- var _b = __read(matrix[x][tdIndex], 2), _c = __read(_b[0], 1), hidden = _c[0].hidden, _d = _b[1], rtl = _d.rtl, ltr = _d.ltr;
39641
- if (rtl > 1 || ltr > 1) {
39642
- // 找到显示中 colSpan 节点
39643
- var _e = __read(matrix[x][tdIndex - (rtl - 1)], 1), _f = __read(_e[0], 2), _g = _f[0], _h = _g.rowSpan, rowSpan = _h === void 0 ? 1 : _h, _j = _g.colSpan, colSpan = _j === void 0 ? 1 : _j, path = _f[1];
39644
- if (hidden) {
39645
- distExports$1.Transforms.setNodes(editor, {
39646
- rowSpan: rowSpan,
39647
- colSpan: Math.max(colSpan - 1, 1),
39648
- }, { at: path });
39669
+ if (!matrix[x] || !matrix[x][tdIndex]) {
39670
+ continue;
39671
+ }
39672
+ var _b = __read(matrix[x][tdIndex], 2), _c = __read(_b[0], 2), cellPath = _c[1], _d = _b[1], rtl = _d.rtl, ltr = _d.ltr, ttb = _d.ttb, btt = _d.btt;
39673
+ var cellPathKey = cellPath.join(',');
39674
+ // 判断是否是合并单元格
39675
+ if (rtl > 1 || ltr > 1 || ttb > 1 || btt > 1) {
39676
+ // 这是合并单元格的一部分
39677
+ // 找到真实单元格的位置(左上角的位置)
39678
+ // rtl表示从右到左的距离,所以真实单元格列 = 当前列 - (rtl - 1)
39679
+ // ttb表示从上到下的距离,所以真实单元格行 = 当前行 - (ttb - 1)
39680
+ var realCellRow = x - (ttb - 1);
39681
+ var realCellCol = tdIndex - (rtl - 1);
39682
+ // 安全检查:确保真实单元格位置存在
39683
+ if (realCellRow < 0 || realCellRow >= matrix.length
39684
+ || !matrix[realCellRow] || !matrix[realCellRow][realCellCol]) {
39685
+ continue;
39649
39686
  }
39650
- else {
39651
- var _k = __read(matrix[x][tdIndex + 1], 1), _l = __read(_k[0], 2), rightPath = _l[1];
39687
+ var _e = __read(matrix[realCellRow][realCellCol], 1), _f = __read(_e[0], 2), realCellElement = _f[0], realCellPath = _f[1];
39688
+ var realCellPathKey = realCellPath.join(',');
39689
+ // 避免重复处理同一个合并单元格
39690
+ if (!processedMergedCells.has(realCellPathKey)) {
39691
+ processedMergedCells.add(realCellPathKey);
39692
+ var _g = realCellElement.rowSpan, rowSpan = _g === void 0 ? 1 : _g, _h = realCellElement.colSpan, colSpan = _h === void 0 ? 1 : _h;
39693
+ var newColSpan = Math.max(colSpan - 1, 1);
39694
+ // 更新真实单元格的 colSpan
39652
39695
  distExports$1.Transforms.setNodes(editor, {
39653
39696
  rowSpan: rowSpan,
39654
- colSpan: colSpan - 1,
39655
- hidden: false,
39656
- }, { at: rightPath });
39657
- try {
39658
- // 移动单元格 文本、图片等元素
39659
- for (var _m = (e_1 = void 0, __values(distExports$1.Node.children(editor, path, { reverse: true }))), _o = _m.next(); !_o.done; _o = _m.next()) {
39660
- var _p = __read(_o.value, 2), childPath = _p[1];
39661
- distExports$1.Transforms.moveNodes(editor, {
39662
- to: __spreadArray(__spreadArray([], __read(rightPath), false), [0], false),
39663
- at: childPath,
39664
- });
39665
- }
39666
- }
39667
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
39668
- finally {
39669
- try {
39670
- if (_o && !_o.done && (_a = _m.return)) _a.call(_m);
39671
- }
39672
- finally { if (e_1) throw e_1.error; }
39697
+ colSpan: newColSpan,
39698
+ }, { at: realCellPath });
39699
+ }
39700
+ }
39701
+ else {
39702
+ // rtl = 1 ltr = 1 ttb = 1 btt = 1,说明这是独立的单元格,直接删除
39703
+ cellsToDelete.add(cellPathKey);
39704
+ }
39705
+ }
39706
+ // 删除独立的单元格
39707
+ var cellsToDeleteArray = Array.from(cellsToDelete);
39708
+ // 按路径深度降序排序,确保从深层到浅层删除,避免路径失效
39709
+ cellsToDeleteArray.sort(function (a, b) {
39710
+ var pathA = a.split(',').map(Number);
39711
+ var pathB = b.split(',').map(Number);
39712
+ // 按行降序排序
39713
+ if (pathA[pathA.length - 2] !== pathB[pathB.length - 2]) {
39714
+ return pathB[pathB.length - 2] - pathA[pathA.length - 2];
39715
+ }
39716
+ // 同行内按列降序排序
39717
+ return pathB[pathB.length - 1] - pathA[pathA.length - 1];
39718
+ });
39719
+ try {
39720
+ for (var cellsToDeleteArray_1 = __values(cellsToDeleteArray), cellsToDeleteArray_1_1 = cellsToDeleteArray_1.next(); !cellsToDeleteArray_1_1.done; cellsToDeleteArray_1_1 = cellsToDeleteArray_1.next()) {
39721
+ var pathKey = cellsToDeleteArray_1_1.value;
39722
+ var path = pathKey.split(',').map(Number);
39723
+ try {
39724
+ if (distExports$1.Editor.hasPath(editor, path)) {
39725
+ distExports$1.Transforms.removeNodes(editor, { at: path });
39673
39726
  }
39674
39727
  }
39728
+ catch (error) {
39729
+ console.warn('删除单元格失败:', path, error);
39730
+ }
39675
39731
  }
39676
39732
  }
39677
- // 挨个删除 cell
39678
- for (var x = 0; x < matrix.length; x += 1) {
39679
- var _q = __read(matrix[x][tdIndex], 1), _r = __read(_q[0], 2), path = _r[1];
39680
- distExports$1.Transforms.removeNodes(editor, { at: path });
39733
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
39734
+ finally {
39735
+ try {
39736
+ if (cellsToDeleteArray_1_1 && !cellsToDeleteArray_1_1.done && (_a = cellsToDeleteArray_1.return)) _a.call(cellsToDeleteArray_1);
39737
+ }
39738
+ finally { if (e_1) throw e_1.error; }
39681
39739
  }
39682
- // 需要调整 columnWidths
39683
- var _s = __read(distExports$1.Editor.nodes(editor, {
39740
+ // 调整表格的 columnWidths
39741
+ var _j = __read(distExports$1.Editor.nodes(editor, {
39684
39742
  match: function (n) { return DomEditor.checkNodeType(n, 'table'); },
39685
39743
  universal: true,
39686
- }), 1), tableEntry = _s[0];
39744
+ }), 1), tableEntry = _j[0];
39687
39745
  if (tableEntry) {
39688
- var _t = __read(tableEntry, 2), elemNode = _t[0], tablePath = _t[1];
39689
- var _u = elemNode.columnWidths, columnWidths = _u === void 0 ? [] : _u;
39746
+ var _k = __read(tableEntry, 2), elemNode = _k[0], tablePath = _k[1];
39747
+ var _l = elemNode.columnWidths, columnWidths = _l === void 0 ? [] : _l;
39690
39748
  var adjustColumnWidths = __spreadArray([], __read(columnWidths), false);
39749
+ // 删除对应列的宽度
39691
39750
  adjustColumnWidths.splice(tdIndex, 1);
39692
39751
  distExports$1.Transforms.setNodes(editor, { columnWidths: adjustColumnWidths }, {
39693
39752
  at: tablePath,
@@ -39769,47 +39828,130 @@
39769
39828
  }
39770
39829
  distExports$1.Editor.withoutNormalizing(editor, function () {
39771
39830
  var e_1, _a;
39831
+ // 收集需要在下一行插入的新单元格信息
39832
+ var cellsToInsert = [];
39772
39833
  for (var y = 0; y < matrix[trIndex].length; y += 1) {
39773
- var _b = __read(matrix[trIndex][y], 2), _c = __read(_b[0], 1), hidden = _c[0].hidden, _d = _b[1], ttb = _d.ttb, btt = _d.btt;
39834
+ var _b = __read(matrix[trIndex][y], 2), _c = __read(_b[0], 1), hidden = _c[0].hidden, _d = _b[1], ttb = _d.ttb, btt = _d.btt, rtl = _d.rtl;
39774
39835
  // 寻找跨行行为
39775
39836
  if (ttb > 1 || btt > 1) {
39776
39837
  // 找到显示中 rowSpan 节点
39777
- var _e = __read(matrix[trIndex - (ttb - 1)][y], 1), _f = __read(_e[0], 2), _g = _f[0], _h = _g.rowSpan, rowSpan = _h === void 0 ? 1 : _h, _j = _g.colSpan, colSpan = _j === void 0 ? 1 : _j, path = _f[1];
39778
- // 如果当前选中节点为隐藏节点,则向上寻找处理 rowSpan 逻辑
39838
+ var originalRowIndex = trIndex - (ttb - 1);
39839
+ // 安全检查:确保目标行和列都存在
39840
+ if (originalRowIndex < 0 || originalRowIndex >= matrix.length || !matrix[originalRowIndex] || !matrix[originalRowIndex][y]) {
39841
+ continue;
39842
+ }
39843
+ var _e = __read(matrix[originalRowIndex][y], 1), _f = __read(_e[0], 2), originalCell = _f[0], path = _f[1];
39844
+ var typedOriginalCell = originalCell;
39845
+ var _g = typedOriginalCell.rowSpan, rowSpan = _g === void 0 ? 1 : _g, _h = typedOriginalCell.colSpan, colSpan = _h === void 0 ? 1 : _h;
39779
39846
  if (hidden) {
39847
+ // 如果当前选中节点为隐藏节点,则向上寻找处理 rowSpan 逻辑
39780
39848
  distExports$1.Transforms.setNodes(editor, {
39781
39849
  rowSpan: Math.max(rowSpan - 1, 1),
39782
39850
  colSpan: colSpan,
39783
39851
  }, { at: path });
39784
39852
  }
39853
+ else if (ttb === 1 && rtl === 1) {
39854
+ // 只处理合并单元格的真正位置(左上角):ttb=1且rtl=1
39855
+ // 这样避免重复处理同一个合并单元格
39856
+ var hasNextRow = trIndex + 1 < matrix.length;
39857
+ if (hasNextRow && rowSpan > 1) {
39858
+ // 创建新的单元格,继承原单元格的内容和属性
39859
+ var newCell = {
39860
+ type: 'table-cell',
39861
+ rowSpan: rowSpan - 1, // 新单元格的rowSpan = 原rowSpan - 1
39862
+ colSpan: colSpan, // 保持原来的colSpan
39863
+ hidden: false,
39864
+ children: typedOriginalCell.children.map(function (child) { return (__assign({}, child)); }), // 深拷贝继承原单元格的内容
39865
+ };
39866
+ // 继承原单元格的其他属性
39867
+ if (typedOriginalCell.isHeader) {
39868
+ newCell.isHeader = typedOriginalCell.isHeader;
39869
+ }
39870
+ if (typedOriginalCell.width) {
39871
+ newCell.width = typedOriginalCell.width;
39872
+ }
39873
+ if (typedOriginalCell.backgroundColor) {
39874
+ newCell.backgroundColor = typedOriginalCell.backgroundColor;
39875
+ }
39876
+ if (typedOriginalCell.borderWidth) {
39877
+ newCell.borderWidth = typedOriginalCell.borderWidth;
39878
+ }
39879
+ if (typedOriginalCell.borderStyle) {
39880
+ newCell.borderStyle = typedOriginalCell.borderStyle;
39881
+ }
39882
+ if (typedOriginalCell.borderColor) {
39883
+ newCell.borderColor = typedOriginalCell.borderColor;
39884
+ }
39885
+ if (typedOriginalCell.textAlign) {
39886
+ newCell.textAlign = typedOriginalCell.textAlign;
39887
+ }
39888
+ // 记录需要插入的单元格信息
39889
+ cellsToInsert.push({
39890
+ cell: newCell,
39891
+ columnIndex: y,
39892
+ });
39893
+ }
39894
+ else {
39895
+ // 如果没有下一行,直接减少原始单元格的 rowSpan
39896
+ distExports$1.Transforms.setNodes(editor, {
39897
+ rowSpan: Math.max(rowSpan - 1, 1),
39898
+ colSpan: colSpan,
39899
+ }, { at: path });
39900
+ }
39901
+ }
39785
39902
  else {
39786
- var _k = __read(matrix[trIndex + 1][y], 1), _l = __read(_k[0], 2), belowPath = _l[1];
39903
+ // 处理其他跨行单元格的情况:非隐藏且非左上角原始位置
39904
+ // 这种情况下也需要减少原始单元格的 rowSpan
39787
39905
  distExports$1.Transforms.setNodes(editor, {
39788
- rowSpan: rowSpan - 1,
39906
+ rowSpan: Math.max(rowSpan - 1, 1),
39789
39907
  colSpan: colSpan,
39790
- hidden: false,
39791
- }, { at: belowPath });
39792
- try {
39793
- // 移动单元格 文本、图片等元素
39794
- for (var _m = (e_1 = void 0, __values(distExports$1.Node.children(editor, path, { reverse: true }))), _o = _m.next(); !_o.done; _o = _m.next()) {
39795
- var _p = __read(_o.value, 2), childPath = _p[1];
39796
- distExports$1.Transforms.moveNodes(editor, {
39797
- to: __spreadArray(__spreadArray([], __read(belowPath), false), [0], false),
39798
- at: childPath,
39799
- });
39800
- }
39801
- }
39802
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
39803
- finally {
39908
+ }, { at: path });
39909
+ }
39910
+ }
39911
+ }
39912
+ // 删除当前行
39913
+ distExports$1.Transforms.removeNodes(editor, { at: rowPath });
39914
+ // 在下一行(现在变成了当前行)的对应位置插入新单元格
39915
+ if (cellsToInsert.length > 0) {
39916
+ // 删除行后,原来的下一行会移动到rowPath的位置
39917
+ var targetRowPath = rowPath;
39918
+ try {
39919
+ // 按列索引排序,从左到右插入
39920
+ cellsToInsert.sort(function (a, b) { return a.columnIndex - b.columnIndex; });
39921
+ try {
39922
+ for (var cellsToInsert_1 = __values(cellsToInsert), cellsToInsert_1_1 = cellsToInsert_1.next(); !cellsToInsert_1_1.done; cellsToInsert_1_1 = cellsToInsert_1.next()) {
39923
+ var _j = cellsToInsert_1_1.value, cell = _j.cell, columnIndex = _j.columnIndex;
39804
39924
  try {
39805
- if (_o && !_o.done && (_a = _m.return)) _a.call(_m);
39925
+ // 尝试在对应的列位置插入
39926
+ var insertPath = __spreadArray(__spreadArray([], __read(targetRowPath), false), [columnIndex], false);
39927
+ distExports$1.Transforms.insertNodes(editor, cell, { at: insertPath });
39806
39928
  }
39807
- finally { if (e_1) throw e_1.error; }
39929
+ catch (error) {
39930
+ // 如果插入失败,尝试在行末尾插入
39931
+ try {
39932
+ var _k = __read(distExports$1.Editor.node(editor, targetRowPath), 1), targetRow = _k[0];
39933
+ var cellCount = targetRow.children.length;
39934
+ var endPath = __spreadArray(__spreadArray([], __read(targetRowPath), false), [cellCount], false);
39935
+ distExports$1.Transforms.insertNodes(editor, cell, { at: endPath });
39936
+ }
39937
+ catch (fallbackError) {
39938
+ console.warn('插入新单元格失败:', fallbackError);
39939
+ }
39940
+ }
39941
+ }
39942
+ }
39943
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
39944
+ finally {
39945
+ try {
39946
+ if (cellsToInsert_1_1 && !cellsToInsert_1_1.done && (_a = cellsToInsert_1.return)) _a.call(cellsToInsert_1);
39808
39947
  }
39948
+ finally { if (e_1) throw e_1.error; }
39809
39949
  }
39810
39950
  }
39951
+ catch (error) {
39952
+ console.warn('插入新单元格失败:', error);
39953
+ }
39811
39954
  }
39812
- distExports$1.Transforms.removeNodes(editor, { at: rowPath });
39813
39955
  });
39814
39956
  };
39815
39957
  return DeleteRow;
@@ -39864,13 +40006,13 @@
39864
40006
  this.iconSvg = FULL_WIDTH_SVG;
39865
40007
  this.tag = 'button';
39866
40008
  }
39867
- // 是否已设置 宽度自适应
39868
40009
  TableFullWidth.prototype.getValue = function (editor) {
39869
40010
  var tableNode = DomEditor.getSelectedNodeByType(editor, 'table');
39870
- if (tableNode == null) {
40011
+ if (!tableNode) {
39871
40012
  return false;
39872
40013
  }
39873
- return tableNode.width === '100%';
40014
+ // 检查表格是否已经是全宽(width100%或auto)
40015
+ return tableNode.width === '100%' || tableNode.width === 'auto';
39874
40016
  };
39875
40017
  TableFullWidth.prototype.isActive = function (editor) {
39876
40018
  return !!this.getValue(editor);
@@ -39976,6 +40118,47 @@
39976
40118
  // 选区未处于 table cell node ,则禁用
39977
40119
  return true;
39978
40120
  }
40121
+ // 检查当前单元格的宽度是否小于20px
40122
+ try {
40123
+ var _a = __read(distExports$1.Editor.nodes(editor, {
40124
+ match: function (n) { return DomEditor.checkNodeType(n, 'table-cell'); },
40125
+ universal: true,
40126
+ }), 1), cellEntry = _a[0];
40127
+ if (!cellEntry) {
40128
+ return true;
40129
+ }
40130
+ var _b = __read(cellEntry, 2), selectedCellPath = _b[1];
40131
+ var matrix = filledMatrix(editor);
40132
+ var tdIndex = -1;
40133
+ // 找到当前单元格在矩阵中的列索引
40134
+ for (var x = 0; x < matrix.length; x += 1) {
40135
+ for (var y = 0; y < matrix[x].length; y += 1) {
40136
+ var _c = __read(matrix[x][y], 1), _d = __read(_c[0], 2), path = _d[1];
40137
+ if (distExports$1.Path.equals(selectedCellPath, path)) {
40138
+ tdIndex = y;
40139
+ break;
40140
+ }
40141
+ }
40142
+ if (tdIndex !== -1) {
40143
+ break;
40144
+ }
40145
+ }
40146
+ if (tdIndex === -1) {
40147
+ return true;
40148
+ }
40149
+ // 获取表格的列宽信息
40150
+ var tableElement = tableNode;
40151
+ var _e = tableElement.columnWidths, columnWidths = _e === void 0 ? [] : _e;
40152
+ // 检查当前列的宽度 - 如果小于20px则禁用插入列功能
40153
+ var currentColWidth = columnWidths[tdIndex];
40154
+ if (currentColWidth && currentColWidth < 20) {
40155
+ return true; // 宽度限制:当前列宽度小于20px时禁用插入列功能
40156
+ }
40157
+ }
40158
+ catch (error) {
40159
+ // 如果检查过程中出现错误,为安全起见禁用功能
40160
+ return true;
40161
+ }
39979
40162
  return false;
39980
40163
  };
39981
40164
  InsertCol.prototype.exec = function (editor, _value) {
@@ -40007,48 +40190,94 @@
40007
40190
  }
40008
40191
  }
40009
40192
  distExports$1.Editor.withoutNormalizing(editor, function () {
40010
- var exitMerge = [];
40193
+ // 记录已处理的合并单元格和需要跳过插入的行
40194
+ var processedMergedCells = new Set();
40195
+ var skipInsertForRows = new Set();
40196
+ // 遍历每一行的第 tdIndex 列,处理合并单元格
40011
40197
  for (var x = 0; x < matrix.length; x += 1) {
40012
- var _a = __read(matrix[x][tdIndex], 2), _b = _a[1], ltr = _b.ltr, rtl = _b.rtl;
40013
- // 向左找到 1 元素为止
40014
- if (ltr > 1 || rtl > 1) {
40015
- if (rtl === 1) {
40198
+ // 安全检查:确保行和列都存在
40199
+ if (!matrix[x] || !matrix[x][tdIndex]) {
40200
+ continue;
40201
+ }
40202
+ var _a = __read(matrix[x][tdIndex], 2); __read(_a[0], 1); var _c = _a[1], rtl = _c.rtl, ltr = _c.ltr, ttb = _c.ttb, btt = _c.btt;
40203
+ // 判断是否是合并单元格
40204
+ if (rtl > 1 || ltr > 1 || ttb > 1 || btt > 1) {
40205
+ // 这是合并单元格的一部分
40206
+ // 找到真实单元格的位置(左上角的位置)
40207
+ // rtl表示从右到左的距离,所以真实单元格列 = 当前列 - (rtl - 1)
40208
+ // ttb表示从上到下的距离,所以真实单元格行 = 当前行 - (ttb - 1)
40209
+ var realCellRow = x - (ttb - 1);
40210
+ var realCellCol = tdIndex - (rtl - 1);
40211
+ // 安全检查:确保真实单元格位置存在
40212
+ if (realCellRow < 0 || realCellRow >= matrix.length
40213
+ || !matrix[realCellRow] || !matrix[realCellRow][realCellCol]) {
40016
40214
  continue;
40017
40215
  }
40018
- var _c = __read(matrix[x][tdIndex - (rtl - 1)], 1), _d = __read(_c[0], 2), element = _d[0], path = _d[1];
40019
- var colSpan = element.colSpan || 1;
40020
- exitMerge.push(x);
40021
- if (!element.hidden) {
40022
- distExports$1.Transforms.setNodes(editor, {
40023
- colSpan: colSpan + 1,
40024
- }, { at: path });
40216
+ var _d = __read(matrix[realCellRow][realCellCol], 1), _e = __read(_d[0], 2), realCellElement = _e[0], realCellPath = _e[1];
40217
+ var realCellPathKey = realCellPath.join(',');
40218
+ // 避免重复处理同一个合并单元格
40219
+ if (!processedMergedCells.has(realCellPathKey)) {
40220
+ processedMergedCells.add(realCellPathKey);
40221
+ var _f = realCellElement.rowSpan, rowSpan = _f === void 0 ? 1 : _f, _g = realCellElement.colSpan, colSpan = _g === void 0 ? 1 : _g;
40222
+ var newColSpan = colSpan + 1;
40223
+ // 更新真实单元格的 colSpan
40224
+ if (!realCellElement.hidden) {
40225
+ distExports$1.Transforms.setNodes(editor, {
40226
+ colSpan: newColSpan,
40227
+ }, { at: realCellPath });
40228
+ }
40229
+ // 标记所有被这个合并单元格影响的行,这些行不需要插入新的单元格
40230
+ // 从真实单元格的行开始,标记rowSpan行
40231
+ for (var r = 0; r < rowSpan; r += 1) {
40232
+ skipInsertForRows.add(realCellRow + r);
40233
+ }
40234
+ }
40235
+ else {
40236
+ // 如果已经处理过这个合并单元格,当前行也不需要插入新单元格
40237
+ skipInsertForRows.add(x);
40025
40238
  }
40026
40239
  }
40027
40240
  }
40028
- // 遍历所有 rows ,挨个添加 cell
40241
+ // 遍历所有行,为需要插入的行添加新单元格
40029
40242
  for (var x = 0; x < matrix.length; x += 1) {
40243
+ // 如果这一行被合并单元格覆盖,则不插入新单元格
40244
+ if (skipInsertForRows.has(x)) {
40245
+ continue;
40246
+ }
40247
+ // 安全检查:确保矩阵位置存在
40248
+ if (!matrix[x] || !matrix[x][tdIndex]) {
40249
+ continue;
40250
+ }
40030
40251
  var newCell = {
40031
40252
  type: 'table-cell',
40032
- hidden: exitMerge.includes(x),
40033
40253
  children: [{ text: '' }],
40034
40254
  };
40255
+ // 如果是第一行且表格有标题,设置为标题单元格
40035
40256
  if (x === 0 && isTableWithHeader(tableNode)) {
40036
40257
  newCell.isHeader = true;
40037
40258
  }
40038
- var _e = __read(matrix[x][tdIndex], 1), _f = __read(_e[0], 2), insertPath = _f[1];
40259
+ var _h = __read(matrix[x][tdIndex], 1), _j = __read(_h[0], 2), insertPath = _j[1];
40039
40260
  distExports$1.Transforms.insertNodes(editor, newCell, { at: insertPath });
40040
40261
  }
40041
- // 需要调整 columnWidths
40042
- var _g = __read(distExports$1.Editor.nodes(editor, {
40262
+ // 调整 columnWidths
40263
+ var _k = __read(distExports$1.Editor.nodes(editor, {
40043
40264
  match: function (n) { return DomEditor.checkNodeType(n, 'table'); },
40044
40265
  universal: true,
40045
- }), 1), tableEntry = _g[0];
40266
+ }), 1), tableEntry = _k[0];
40046
40267
  if (tableEntry) {
40047
- var _h = __read(tableEntry, 2), elemNode = _h[0], tablePath = _h[1];
40048
- var _j = elemNode.columnWidths, columnWidths = _j === void 0 ? [] : _j;
40268
+ var _l = __read(tableEntry, 2), elemNode = _l[0], tablePath = _l[1];
40269
+ var _m = elemNode.columnWidths, columnWidths = _m === void 0 ? [] : _m;
40049
40270
  var adjustColumnWidths = __spreadArray([], __read(columnWidths), false);
40050
- var _k = editor.getMenuConfig('insertTable').minWidth, minWidth = _k === void 0 ? 60 : _k;
40051
- adjustColumnWidths.splice(tdIndex, 0, parseInt(minWidth, 10) || 60);
40271
+ // 获取当前列的宽度,如果没有设置则使用默认宽度
40272
+ var _o = editor.getMenuConfig('insertTable').minWidth, minWidth = _o === void 0 ? 60 : _o;
40273
+ var currentColWidth = columnWidths[tdIndex] || parseInt(minWidth, 10) || 60;
40274
+ // 将当前列宽度一分为二
40275
+ var halfWidth = Math.floor(currentColWidth / 2);
40276
+ var remainingWidth = currentColWidth - halfWidth;
40277
+ // 在当前位置插入新列(左侧),使用一半宽度
40278
+ adjustColumnWidths.splice(tdIndex, 0, halfWidth);
40279
+ // 更新原列宽度为剩余的一半
40280
+ adjustColumnWidths[tdIndex + 1] = remainingWidth;
40052
40281
  distExports$1.Transforms.setNodes(editor, { columnWidths: adjustColumnWidths }, {
40053
40282
  at: tablePath,
40054
40283
  });
@@ -40092,20 +40321,15 @@
40092
40321
  return false;
40093
40322
  };
40094
40323
  InsertRow.prototype.exec = function (editor, _value) {
40324
+ var _a;
40095
40325
  if (this.isDisabled(editor)) {
40096
40326
  return;
40097
40327
  }
40098
- var _a = __read(distExports$1.Editor.nodes(editor, {
40328
+ var _b = __read(distExports$1.Editor.nodes(editor, {
40099
40329
  match: function (n) { return DomEditor.checkNodeType(n, 'table-cell'); },
40100
40330
  universal: true,
40101
- }), 1), cellEntry = _a[0];
40102
- var _b = __read(cellEntry, 2), cellNode = _b[0], cellPath = _b[1];
40103
- // 获取 cell length ,即多少列
40104
- var rowNode = DomEditor.getParentNode(editor, cellNode);
40105
- var cellsLength = (rowNode === null || rowNode === void 0 ? void 0 : rowNode.children.length) || 0;
40106
- if (cellsLength === 0) {
40107
- return;
40108
- }
40331
+ }), 1), cellEntry = _b[0];
40332
+ var _c = __read(cellEntry, 2), cellPath = _c[1];
40109
40333
  var matrix = filledMatrix(editor);
40110
40334
  // 向下插入行为,先找到
40111
40335
  // 当前选区所在的 tr 索引
@@ -40113,7 +40337,7 @@
40113
40337
  /* eslint-disable no-labels */
40114
40338
  outer: for (var x = 0; x < matrix.length; x += 1) {
40115
40339
  for (var y = 0; y < matrix[x].length; y += 1) {
40116
- var _c = __read(matrix[x][y], 1), _d = __read(_c[0], 2), path = _d[1];
40340
+ var _d = __read(matrix[x][y], 1), _e = __read(_d[0], 2), path = _e[1];
40117
40341
  if (!distExports$1.Path.equals(cellPath, path)) {
40118
40342
  continue;
40119
40343
  }
@@ -40122,7 +40346,11 @@
40122
40346
  break outer;
40123
40347
  }
40124
40348
  }
40125
- /* eslint-disable no-labels */
40349
+ // 获取表格的真实列数(使用matrix的列数,而不是当前行的physical cell数量)
40350
+ var cellsLength = ((_a = matrix[trIndex]) === null || _a === void 0 ? void 0 : _a.length) || 0;
40351
+ if (cellsLength === 0) {
40352
+ return;
40353
+ }
40126
40354
  distExports$1.Editor.withoutNormalizing(editor, function () {
40127
40355
  // 向下添加 tr 索引
40128
40356
  var destIndex = trIndex + 1;
@@ -40132,10 +40360,12 @@
40132
40360
  var _a = __read(matrix[trIndex][y], 2), _b = _a[1], ttb = _b.ttb, btt = _b.btt;
40133
40361
  // 向上找到 1 元素为止
40134
40362
  if (ttb > 1 || btt > 1) {
40135
- if (btt === 1) {
40363
+ var originalRowIndex = trIndex - (ttb - 1);
40364
+ // 安全检查:确保目标行和列都存在
40365
+ if (originalRowIndex < 0 || originalRowIndex >= matrix.length || !matrix[originalRowIndex] || !matrix[originalRowIndex][y]) {
40136
40366
  continue;
40137
40367
  }
40138
- var _c = __read(matrix[trIndex - (ttb - 1)][y], 1), _d = __read(_c[0], 2), element = _d[0], path = _d[1];
40368
+ var _c = __read(matrix[originalRowIndex][y], 1), _d = __read(_c[0], 2), element = _d[0], path = _d[1];
40139
40369
  var rowSpan = element.rowSpan || 1;
40140
40370
  exitMerge.push(y);
40141
40371
  if (!element.hidden) {
@@ -40147,10 +40377,14 @@
40147
40377
  }
40148
40378
  // 拼接新的 row
40149
40379
  var newRow = { type: 'table-row', children: [] };
40380
+ // 只为不被合并单元格覆盖的位置创建td元素
40150
40381
  for (var i = 0; i < cellsLength; i += 1) {
40382
+ // 如果当前位置被合并单元格覆盖,则跳过(不创建td)
40383
+ if (exitMerge.includes(i)) {
40384
+ continue;
40385
+ }
40151
40386
  var cell = {
40152
40387
  type: 'table-cell',
40153
- hidden: exitMerge.includes(i),
40154
40388
  children: [{ text: '' }],
40155
40389
  };
40156
40390
  newRow.children.push(cell);
@@ -40434,14 +40668,6 @@
40434
40668
  this.iconSvg = MERGE_CELL_SVG;
40435
40669
  this.tag = 'button';
40436
40670
  }
40437
- MergeCell.prototype.needKeepCell = function (editor, trPath) {
40438
- // 检查同行是否有其他单元格
40439
- var _a = __read(distExports$1.Node.children(editor, trPath), 2), rowSibling = _a[1];
40440
- // 检查同列是否有其他单元格
40441
- var parentTable = distExports$1.Editor.parent(editor, trPath);
40442
- var hasOtherRows = parentTable[0].children.length > 1;
40443
- return !!rowSibling || hasOtherRows;
40444
- };
40445
40671
  MergeCell.prototype.getValue = function (_editor) {
40446
40672
  // 无需获取 val
40447
40673
  return '';
@@ -40487,7 +40713,6 @@
40487
40713
  * @returns void
40488
40714
  */
40489
40715
  MergeCell.prototype.merge = function (editor) {
40490
- var _this = this;
40491
40716
  if (!this.canMerge(editor)) {
40492
40717
  return;
40493
40718
  }
@@ -40498,45 +40723,116 @@
40498
40723
  var _a = __read(selection[0][0], 1), _b = __read(_a[0], 2), basePath = _b[1];
40499
40724
  var _c = __read(distExports$1.Node.children(editor, basePath, { reverse: true }), 1), _d = __read(_c[0], 2), lastPath = _d[1];
40500
40725
  distExports$1.Editor.withoutNormalizing(editor, function () {
40501
- var e_1, _a;
40502
- var rowSpan = 0;
40503
- var colSpan = 0;
40504
- for (var x = selection.length - 1; x >= 0; x -= 1, rowSpan += 1) {
40505
- colSpan = 0;
40506
- for (var y = selection[x].length - 1; y >= 0; y -= 1, colSpan += 1) {
40507
- var _b = __read(selection[x][y], 2), _c = __read(_b[0], 2), path = _c[1], ttb = _b[1].ttb;
40508
- // skip first cell and "fake" cells which belong to a cell with a `rowspan`
40509
- if (distExports$1.Path.equals(basePath, path) || ttb > 1) {
40726
+ var e_1, _a, e_2, _b, e_3, _c;
40727
+ // 收集所有真实的单元格(避免重复计算虚拟位置)
40728
+ var realCells = new Map();
40729
+ var cellsToDelete = [];
40730
+ // 计算实际的边界范围(考虑单元格的实际跨度)
40731
+ var minRow = Infinity;
40732
+ var maxRow = -Infinity;
40733
+ var minCol = Infinity;
40734
+ var maxCol = -Infinity;
40735
+ // 第一阶段:收集所有真实单元格并计算其实际占用的范围
40736
+ for (var x = 0; x < selection.length; x += 1) {
40737
+ for (var y = 0; y < selection[x].length; y += 1) {
40738
+ var _d = __read(selection[x][y], 2), _e = __read(_d[0], 2), element = _e[0], path = _e[1], ttb = _d[1].ttb;
40739
+ var pathKey = path.join(',');
40740
+ // 只处理真实单元格(ttb === 1 表示单元格的实际位置,不是虚拟扩展)
40741
+ if (ttb === 1 && !realCells.has(pathKey)) {
40742
+ realCells.set(pathKey, {
40743
+ path: path,
40744
+ x: x,
40745
+ y: y,
40746
+ element: element,
40747
+ });
40748
+ // 获取当前单元格的跨度
40749
+ var _f = element.rowSpan, rowSpan = _f === void 0 ? 1 : _f, _g = element.colSpan, colSpan = _g === void 0 ? 1 : _g;
40750
+ // 计算该单元格实际占用的范围
40751
+ var cellMinRow = x;
40752
+ var cellMaxRow = x + rowSpan - 1;
40753
+ var cellMinCol = y;
40754
+ var cellMaxCol = y + colSpan - 1;
40755
+ // 更新整体边界
40756
+ minRow = Math.min(minRow, cellMinRow);
40757
+ maxRow = Math.max(maxRow, cellMaxRow);
40758
+ minCol = Math.min(minCol, cellMinCol);
40759
+ maxCol = Math.max(maxCol, cellMaxCol);
40760
+ }
40761
+ }
40762
+ }
40763
+ // 计算正确的rowSpan和colSpan(基于实际占用的行列范围)
40764
+ var finalRowSpan = maxRow - minRow + 1;
40765
+ var finalColSpan = maxCol - minCol + 1;
40766
+ try {
40767
+ // 第二阶段:确定要删除的单元格
40768
+ for (var realCells_1 = __values(realCells), realCells_1_1 = realCells_1.next(); !realCells_1_1.done; realCells_1_1 = realCells_1.next()) {
40769
+ var _h = __read(realCells_1_1.value, 2), path = _h[1].path;
40770
+ // 跳过基础单元格(第一个单元格作为合并后的目标)
40771
+ if (distExports$1.Path.equals(basePath, path)) {
40510
40772
  continue;
40511
40773
  }
40774
+ cellsToDelete.push(path);
40775
+ }
40776
+ }
40777
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
40778
+ finally {
40779
+ try {
40780
+ if (realCells_1_1 && !realCells_1_1.done && (_a = realCells_1.return)) _a.call(realCells_1);
40781
+ }
40782
+ finally { if (e_1) throw e_1.error; }
40783
+ }
40784
+ // 第三阶段:按路径降序排序并删除单元格
40785
+ cellsToDelete.sort(function (a, b) {
40786
+ for (var i = 0; i < Math.min(a.length, b.length); i += 1) {
40787
+ if (a[i] !== b[i]) {
40788
+ return b[i] - a[i]; // 降序
40789
+ }
40790
+ }
40791
+ return b.length - a.length;
40792
+ });
40793
+ try {
40794
+ // 删除单元格并移动内容
40795
+ for (var cellsToDelete_1 = __values(cellsToDelete), cellsToDelete_1_1 = cellsToDelete_1.next(); !cellsToDelete_1_1.done; cellsToDelete_1_1 = cellsToDelete_1.next()) {
40796
+ var path = cellsToDelete_1_1.value;
40512
40797
  try {
40513
- // prettier-ignore
40514
- for (var _d = (e_1 = void 0, __values(distExports$1.Node.children(editor, path, { reverse: true }))), _e = _d.next(); !_e.done; _e = _d.next()) {
40515
- var _f = __read(_e.value, 2), childPath = _f[1];
40516
- distExports$1.Transforms.moveNodes(editor, {
40517
- to: distExports$1.Path.next(lastPath),
40518
- at: childPath,
40519
- });
40798
+ // 检查节点是否仍然存在
40799
+ if (!distExports$1.Editor.hasPath(editor, path)) {
40800
+ continue;
40520
40801
  }
40521
- }
40522
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
40523
- finally {
40524
40802
  try {
40525
- if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
40803
+ // 移动单元格内容到基础单元格
40804
+ for (var _j = (e_3 = void 0, __values(distExports$1.Node.children(editor, path, { reverse: true }))), _k = _j.next(); !_k.done; _k = _j.next()) {
40805
+ var _l = __read(_k.value, 2), childPath = _l[1];
40806
+ distExports$1.Transforms.moveNodes(editor, {
40807
+ to: distExports$1.Path.next(lastPath),
40808
+ at: childPath,
40809
+ });
40810
+ }
40526
40811
  }
40527
- finally { if (e_1) throw e_1.error; }
40812
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
40813
+ finally {
40814
+ try {
40815
+ if (_k && !_k.done && (_c = _j.return)) _c.call(_j);
40816
+ }
40817
+ finally { if (e_3) throw e_3.error; }
40818
+ }
40819
+ // 删除单元格
40820
+ distExports$1.Transforms.removeNodes(editor, { at: path });
40528
40821
  }
40529
- var _g = __read(distExports$1.Editor.nodes(editor, {
40530
- match: isOfType(editor, 'tr'),
40531
- at: path,
40532
- }), 1), _h = __read(_g[0], 2), trPath = _h[1];
40533
- if (_this.needKeepCell(editor, trPath)) {
40534
- distExports$1.Transforms.setNodes(editor, { hidden: true }, { at: path });
40535
- continue;
40822
+ catch (error) {
40823
+ // 静默处理删除失败的情况
40536
40824
  }
40537
40825
  }
40538
40826
  }
40539
- distExports$1.Transforms.setNodes(editor, { rowSpan: rowSpan, colSpan: colSpan }, { at: basePath });
40827
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
40828
+ finally {
40829
+ try {
40830
+ if (cellsToDelete_1_1 && !cellsToDelete_1_1.done && (_b = cellsToDelete_1.return)) _b.call(cellsToDelete_1);
40831
+ }
40832
+ finally { if (e_2) throw e_2.error; }
40833
+ }
40834
+ // 为基础单元格设置正确的rowSpan和colSpan属性
40835
+ distExports$1.Transforms.setNodes(editor, { rowSpan: finalRowSpan, colSpan: finalColSpan }, { at: basePath });
40540
40836
  });
40541
40837
  };
40542
40838
  return MergeCell;
@@ -40558,10 +40854,17 @@
40558
40854
  return false;
40559
40855
  };
40560
40856
  SplitCell.prototype.isDisabled = function (editor) {
40857
+ // 查找当前选中的单元格,支持td和th两种类型
40561
40858
  var _a = __read(distExports$1.Editor.nodes(editor, {
40562
- match: isOfType(editor, 'td'),
40563
- }), 1), td = _a[0];
40564
- var _b = __read(td, 1), _c = _b[0], _d = _c.rowSpan, rowSpan = _d === void 0 ? 1 : _d, _e = _c.colSpan, colSpan = _e === void 0 ? 1 : _e;
40859
+ match: function (n) {
40860
+ return DomEditor.checkNodeType(n, 'table-cell');
40861
+ },
40862
+ }), 1), cell = _a[0];
40863
+ if (!cell) {
40864
+ return true; // 如果没有找到单元格,则禁用拆分功能
40865
+ }
40866
+ var _b = __read(cell, 1), _c = _b[0], _d = _c.rowSpan, rowSpan = _d === void 0 ? 1 : _d, _e = _c.colSpan, colSpan = _e === void 0 ? 1 : _e;
40867
+ // 只有当rowSpan或colSpan大于1时才能拆分
40565
40868
  if (rowSpan > 1 || colSpan > 1) {
40566
40869
  return false;
40567
40870
  }
@@ -40591,70 +40894,100 @@
40591
40894
  if (!table || !td) {
40592
40895
  return;
40593
40896
  }
40594
- var selection = EDITOR_TO_SELECTION.get(editor) || [];
40595
- // @ts-ignore
40596
- var matrix = filledMatrix(editor, { at: options.at });
40597
- // const { blocks } = DEFAULT_WITH_TABLE_OPTIONS;
40897
+ var _b = __read(table, 1), tableNode = _b[0];
40898
+ var hasHeader = isTableWithHeader(tableNode);
40899
+ // 获取当前选中的单元格
40900
+ var _c = __read(td, 2), selectedCell = _c[0], selectedCellPath = _c[1];
40901
+ var _d = selectedCell.rowSpan, rowSpan = _d === void 0 ? 1 : _d, _e = selectedCell.colSpan, colSpan = _e === void 0 ? 1 : _e;
40902
+ // 如果单元格未合并,无需拆分
40903
+ if (rowSpan === 1 && colSpan === 1) {
40904
+ return;
40905
+ }
40598
40906
  distExports$1.Editor.withoutNormalizing(editor, function () {
40599
- for (var x = matrix.length - 1; x >= 0; x -= 1) {
40600
- for (var y = matrix[x].length - 1; y >= 0; y -= 1) {
40601
- var _a = __read(matrix[x][y], 2), _b = __read(_a[0], 2), path = _b[1], context = _a[1];
40602
- var colSpan = context.ltr, rtl = context.rtl, rowSpan = context.btt, ttb = context.ttb;
40603
- if (rtl > 1) {
40604
- // get to the start of the colspan
40605
- y -= rtl - 2;
40606
- continue;
40907
+ // 1. 重置当前单元格的rowSpan和colSpan
40908
+ distExports$1.Transforms.setNodes(editor, { rowSpan: 1, colSpan: 1 }, { at: selectedCellPath });
40909
+ // 2. 处理同行的其他列(colSpan > 1的情况)
40910
+ // 在当前单元格后面插入 colSpan-1 个新单元格
40911
+ for (var c = 1; c < colSpan; c += 1) {
40912
+ var newCell = {
40913
+ type: 'table-cell',
40914
+ children: [{ text: '' }],
40915
+ };
40916
+ // 如果在第一行且表格有表头,设置isHeader
40917
+ var currentRowIndex = selectedCellPath[selectedCellPath.length - 2];
40918
+ if (currentRowIndex === 0 && hasHeader) {
40919
+ newCell.isHeader = true;
40920
+ }
40921
+ // 在当前行的当前位置之后插入
40922
+ var currentRowPath = selectedCellPath.slice(0, -1);
40923
+ var insertIndex = selectedCellPath[selectedCellPath.length - 1] + c;
40924
+ var insertPath = __spreadArray(__spreadArray([], __read(currentRowPath), false), [insertIndex], false);
40925
+ try {
40926
+ distExports$1.Transforms.insertNodes(editor, newCell, { at: insertPath });
40927
+ }
40928
+ catch (error) {
40929
+ // 如果指定位置插入失败,在行末尾插入
40930
+ try {
40931
+ var _a = __read(distExports$1.Editor.node(editor, currentRowPath), 1), currentRow = _a[0];
40932
+ var cellsCount = currentRow.children.length;
40933
+ var fallbackPath = __spreadArray(__spreadArray([], __read(currentRowPath), false), [cellsCount], false);
40934
+ distExports$1.Transforms.insertNodes(editor, newCell, { at: fallbackPath });
40607
40935
  }
40608
- if (ttb > 1) {
40609
- continue;
40936
+ catch (fallbackError) {
40937
+ console.warn("\u63D2\u5165\u540C\u884C\u5355\u5143\u683C\u5931\u8D25: ".concat(fallbackError instanceof Error ? fallbackError.message : String(fallbackError)));
40610
40938
  }
40611
- if (rowSpan === 1 && colSpan === 1) {
40939
+ }
40940
+ }
40941
+ // 3. 处理其他行(rowSpan > 1的情况)
40942
+ // 在下面的每一行都插入相应数量的单元格
40943
+ for (var r = 1; r < rowSpan; r += 1) {
40944
+ // 计算目标行路径
40945
+ var targetRowIndex = selectedCellPath[selectedCellPath.length - 2] + r;
40946
+ var targetRowPath = __spreadArray(__spreadArray([], __read(selectedCellPath.slice(0, -2)), false), [targetRowIndex], false);
40947
+ try {
40948
+ // 检查目标行是否存在
40949
+ var _b = __read(distExports$1.Editor.node(editor, targetRowPath), 1), targetRow = _b[0];
40950
+ if (!targetRow) {
40951
+ console.warn("\u76EE\u6807\u884C ".concat(targetRowIndex, " \u4E0D\u5B58\u5728"));
40612
40952
  continue;
40613
40953
  }
40614
- var found = !!options.all;
40615
- if (selection.length) {
40616
- // eslint-disable-next-line no-labels
40617
- outer: for (var i = 0; !options.all && i < selection.length; i += 1) {
40618
- for (var j = 0; j < selection[i].length; j += 1) {
40619
- var _c = __read(selection[i][j], 1), _d = __read(_c[0], 2), tdPath = _d[1];
40620
- if (distExports$1.Path.equals(tdPath, path)) {
40621
- found = true;
40622
- // eslint-disable-next-line no-labels
40623
- break outer;
40624
- }
40954
+ // 在目标行中插入colSpan个新单元格
40955
+ for (var c = 0; c < colSpan; c += 1) {
40956
+ var newCell = {
40957
+ type: 'table-cell',
40958
+ children: [{ text: '' }],
40959
+ };
40960
+ // 计算插入位置
40961
+ var originalColumnIndex = selectedCellPath[selectedCellPath.length - 1];
40962
+ var insertIndex = originalColumnIndex + c;
40963
+ var insertPath = __spreadArray(__spreadArray([], __read(targetRowPath), false), [insertIndex], false);
40964
+ try {
40965
+ // 获取目标行当前的单元格数量
40966
+ var currentCellsCount = targetRow.children.length;
40967
+ // 如果插入位置超出当前行的范围,在行末尾插入
40968
+ if (insertIndex >= currentCellsCount) {
40969
+ var endPath = __spreadArray(__spreadArray([], __read(targetRowPath), false), [currentCellsCount], false);
40970
+ distExports$1.Transforms.insertNodes(editor, newCell, { at: endPath });
40971
+ }
40972
+ else {
40973
+ distExports$1.Transforms.insertNodes(editor, newCell, { at: insertPath });
40625
40974
  }
40626
40975
  }
40627
- }
40628
- else {
40629
- var _e = __read(td, 2), tdPath = _e[1];
40630
- if (distExports$1.Path.equals(tdPath, path)) {
40631
- found = true;
40632
- }
40633
- }
40634
- if (!found) {
40635
- continue;
40636
- }
40637
- // eslint-disable-next-line no-labels
40638
- out: for (var r = 1; r < rowSpan; r += 1) {
40639
- for (var i = y; i >= 0; i -= 1) {
40640
- // eslint-disable-next-line @typescript-eslint/no-shadow
40641
- var _f = __read(matrix[x + r][i], 2), ttb_1 = _f[1].ttb;
40642
- if (ttb_1 === 1) {
40643
- continue;
40976
+ catch (insertError) {
40977
+ // 最后的备用方案:在行末尾插入
40978
+ try {
40979
+ var updatedCellsCount = targetRow.children.length;
40980
+ var fallbackPath = __spreadArray(__spreadArray([], __read(targetRowPath), false), [updatedCellsCount], false);
40981
+ distExports$1.Transforms.insertNodes(editor, newCell, { at: fallbackPath });
40644
40982
  }
40645
- for (var c = 0; c < colSpan; c += 1) {
40646
- var _g = __read(matrix[x + r][i + c], 1), _h = __read(_g[0], 2), nextPath = _h[1];
40647
- distExports$1.Transforms.unsetNodes(editor, ['hidden', 'colSpan', 'rowSpan'], { at: nextPath });
40983
+ catch (finalError) {
40984
+ console.warn("\u63D2\u5165\u5355\u5143\u683C\u5230\u7B2C".concat(r, "\u884C\u5931\u8D25: ").concat(finalError instanceof Error ? finalError.message : String(finalError)));
40648
40985
  }
40649
- // eslint-disable-next-line no-labels
40650
- continue out;
40651
40986
  }
40652
40987
  }
40653
- for (var c = 1; c < colSpan; c += 1) {
40654
- var _j = __read(matrix[x][y + c], 1), _k = __read(_j[0], 2), nextPath = _k[1];
40655
- distExports$1.Transforms.unsetNodes(editor, ['hidden', 'colSpan', 'rowSpan'], { at: nextPath });
40656
- }
40657
- distExports$1.Transforms.setNodes(editor, { rowSpan: 1, colSpan: 1 }, { at: path });
40988
+ }
40989
+ catch (rowError) {
40990
+ console.warn("\u5904\u7406\u7B2C".concat(r, "\u884C\u65F6\u51FA\u9519: ").concat(rowError instanceof Error ? rowError.message : String(rowError)));
40658
40991
  }
40659
40992
  }
40660
40993
  });
@@ -40845,26 +41178,11 @@
40845
41178
  // 确保是 table-cell 类型
40846
41179
  if (DomEditor.getNodeType(child) === 'table-cell') {
40847
41180
  var tableCell = child;
40848
- var colSpan = tableCell.colSpan || 1;
40849
- tableCellChildren.push(tableCell); // 先添加当前单元格
40850
- // 如果 colSpan > 1,检查是否存在足够的隐藏 table-cell
40851
- for (var j = 1; j < colSpan; j += 1) {
40852
- var nextChild = children[i + j];
40853
- if (nextChild
40854
- && DomEditor.getNodeType(nextChild) === 'table-cell'
40855
- && nextChild.hidden) {
40856
- // 已有隐藏的 table-cell,无需补充
40857
- continue;
40858
- }
40859
- else {
40860
- // 补齐缺少的隐藏 table-cell
40861
- tableCellChildren.push({
40862
- type: 'table-cell',
40863
- children: [{ text: '' }],
40864
- hidden: true,
40865
- });
40866
- }
41181
+ // 如果是隐藏的单元格,则跳过(删除)
41182
+ if (tableCell.hidden) {
41183
+ continue;
40867
41184
  }
41185
+ tableCellChildren.push(tableCell); // 只添加非隐藏的单元格
40868
41186
  }
40869
41187
  }
40870
41188
  return {
@@ -40981,13 +41299,21 @@
40981
41299
  TableCursor.unselect(editor);
40982
41300
  return apply(op);
40983
41301
  }
41302
+ var isTableCell = function (n) {
41303
+ return distExports$1.Element.isElement(n)
41304
+ && (n.type === 'table-cell'
41305
+ || n.type === 'th'
41306
+ || n.type === 'td');
41307
+ };
40984
41308
  var _a = __read(distExports$1.Editor.nodes(editor, {
40985
- match: isOfType(editor, 'th', 'td'),
41309
+ match: isTableCell,
40986
41310
  at: distExports$1.Range.start(selection),
41311
+ mode: 'lowest', // 确保找到最低层的匹配节点
40987
41312
  }), 1), fromEntry = _a[0];
40988
41313
  var _b = __read(distExports$1.Editor.nodes(editor, {
40989
- match: isOfType(editor, 'th', 'td'),
41314
+ match: isTableCell,
40990
41315
  at: distExports$1.Range.end(selection),
41316
+ mode: 'lowest', // 确保找到最低层的匹配节点
40991
41317
  }), 1), toEntry = _b[0];
40992
41318
  if (!fromEntry || !toEntry) {
40993
41319
  TableCursor.unselect(editor);
@@ -41000,58 +41326,104 @@
41000
41326
  return apply(op);
41001
41327
  }
41002
41328
  // TODO: perf: could be improved by passing a Span [fromPath, toPath]
41003
- var filled = filledMatrix(editor, { at: fromPath });
41004
- // find initial bounds
41005
- var from = Point.valueOf(0, 0);
41006
- var to = Point.valueOf(0, 0);
41007
- for (var x = 0; x < filled.length; x += 1) {
41008
- for (var y = 0; y < filled[x].length; y += 1) {
41009
- var _e = __read(filled[x][y], 1), _f = __read(_e[0], 2), path = _f[1];
41010
- if (distExports$1.Path.equals(fromPath, path)) {
41011
- from.x = x;
41012
- from.y = y;
41329
+ try {
41330
+ var filled = filledMatrix(editor, { at: fromPath });
41331
+ // 基本的有效性检查
41332
+ if (!filled || filled.length === 0) {
41333
+ TableCursor.unselect(editor);
41334
+ return apply(op);
41335
+ }
41336
+ // find initial bounds
41337
+ var from = Point.valueOf(0, 0);
41338
+ var to = Point.valueOf(0, 0);
41339
+ var fromFound = false;
41340
+ var toFound = false;
41341
+ for (var x = 0; x < filled.length; x += 1) {
41342
+ if (!filled[x]) {
41343
+ continue;
41344
+ } // 跳过空行
41345
+ for (var y = 0; y < filled[x].length; y += 1) {
41346
+ if (!filled[x][y]) {
41347
+ continue;
41348
+ } // 跳过空单元格
41349
+ var _e = __read(filled[x][y], 1), _f = __read(_e[0], 2), path = _f[1];
41350
+ if (distExports$1.Path.equals(fromPath, path)) {
41351
+ from.x = x;
41352
+ from.y = y;
41353
+ fromFound = true;
41354
+ }
41355
+ if (distExports$1.Path.equals(toPath, path)) {
41356
+ to.x = x;
41357
+ to.y = y;
41358
+ toFound = true;
41359
+ }
41360
+ }
41361
+ }
41362
+ // 如果找不到位置,可能是选择了被删除的单元格区域
41363
+ if (!fromFound || !toFound) {
41364
+ TableCursor.unselect(editor);
41365
+ return apply(op);
41366
+ }
41367
+ var start = Point.valueOf(Math.min(from.x, to.x), Math.min(from.y, to.y));
41368
+ var end = Point.valueOf(Math.max(from.x, to.x), Math.max(from.y, to.y));
41369
+ // expand the selection based on rowspan and colspan
41370
+ for (;;) {
41371
+ var nextStart = Point.valueOf(start.x, start.y);
41372
+ var nextEnd = Point.valueOf(end.x, end.y);
41373
+ for (var x = nextStart.x; x <= nextEnd.x && x < filled.length; x += 1) {
41374
+ if (!filled[x]) {
41375
+ continue;
41376
+ }
41377
+ for (var y = nextStart.y; y <= nextEnd.y && y < filled[x].length; y += 1) {
41378
+ if (!filled[x][y]) {
41379
+ continue;
41380
+ }
41381
+ var _g = __read(filled[x][y], 2), context = _g[1];
41382
+ if (!context) {
41383
+ continue;
41384
+ }
41385
+ var rtl = context.rtl, ltr = context.ltr, btt = context.btt, ttb = context.ttb;
41386
+ nextStart.x = Math.min(nextStart.x, x - (ttb - 1));
41387
+ nextStart.y = Math.min(nextStart.y, y - (rtl - 1));
41388
+ nextEnd.x = Math.max(nextEnd.x, x + (btt - 1));
41389
+ nextEnd.y = Math.max(nextEnd.y, y + (ltr - 1));
41390
+ }
41013
41391
  }
41014
- if (distExports$1.Path.equals(toPath, path)) {
41015
- to.x = x;
41016
- to.y = y;
41392
+ if (Point.equals(start, nextStart) && Point.equals(end, nextEnd)) {
41017
41393
  break;
41018
41394
  }
41395
+ start = nextStart;
41396
+ end = nextEnd;
41019
41397
  }
41020
- }
41021
- var start = Point.valueOf(Math.min(from.x, to.x), Math.min(from.y, to.y));
41022
- var end = Point.valueOf(Math.max(from.x, to.x), Math.max(from.y, to.y));
41023
- // expand the selection based on rowspan and colspan
41024
- for (;;) {
41025
- var nextStart = Point.valueOf(start.x, start.y);
41026
- var nextEnd = Point.valueOf(end.x, end.y);
41027
- for (var x = nextStart.x; x <= nextEnd.x; x += 1) {
41028
- for (var y = nextStart.y; y <= nextEnd.y; y += 1) {
41029
- var _g = __read(filled[x][y], 2), _h = _g[1], rtl = _h.rtl, ltr = _h.ltr, btt = _h.btt, ttb = _h.ttb;
41030
- nextStart.x = Math.min(nextStart.x, x - (ttb - 1));
41031
- nextStart.y = Math.min(nextStart.y, y - (rtl - 1));
41032
- nextEnd.x = Math.max(nextEnd.x, x + (btt - 1));
41033
- nextEnd.y = Math.max(nextEnd.y, y + (ltr - 1));
41398
+ var selected = [];
41399
+ var selectedSet = new WeakSet();
41400
+ for (var x = start.x; x <= end.x && x < filled.length; x += 1) {
41401
+ if (!filled[x]) {
41402
+ continue;
41403
+ }
41404
+ var cells = [];
41405
+ for (var y = start.y; y <= end.y && y < filled[x].length; y += 1) {
41406
+ if (!filled[x][y]) {
41407
+ continue;
41408
+ }
41409
+ var _h = __read(filled[x][y], 1), _j = __read(_h[0], 1), element = _j[0];
41410
+ if (!element) {
41411
+ continue;
41412
+ }
41413
+ selectedSet.add(element);
41414
+ cells.push(filled[x][y]);
41415
+ }
41416
+ if (cells.length > 0) {
41417
+ selected.push(cells);
41034
41418
  }
41035
41419
  }
41036
- if (Point.equals(start, nextStart) && Point.equals(end, nextEnd)) {
41037
- break;
41038
- }
41039
- start = nextStart;
41040
- end = nextEnd;
41420
+ EDITOR_TO_SELECTION.set(editor, selected);
41421
+ EDITOR_TO_SELECTION_SET.set(editor, selectedSet);
41041
41422
  }
41042
- var selected = [];
41043
- var selectedSet = new WeakSet();
41044
- for (var x = start.x; x <= end.x; x += 1) {
41045
- var cells = [];
41046
- for (var y = start.y; y <= end.y; y += 1) {
41047
- var _j = __read(filled[x][y], 1), _k = __read(_j[0], 1), element = _k[0];
41048
- selectedSet.add(element);
41049
- cells.push(filled[x][y]);
41050
- }
41051
- selected.push(cells);
41423
+ catch (error) {
41424
+ TableCursor.unselect(editor);
41425
+ return apply(op);
41052
41426
  }
41053
- EDITOR_TO_SELECTION.set(editor, selected);
41054
- EDITOR_TO_SELECTION_SET.set(editor, selectedSet);
41055
41427
  apply(op);
41056
41428
  };
41057
41429
  return editor;
@@ -41487,7 +41859,7 @@
41487
41859
  * @author wangfupeng
41488
41860
  */
41489
41861
  /**
41490
- * pre-prase table ,去掉 <tbody>
41862
+ * pre-prase table ,去掉 <tbody> 和处理单元格中的 <p> 标签,以及删除隐藏的单元格
41491
41863
  * @param table table elem
41492
41864
  */
41493
41865
  function preParse$1(tableElem) {
@@ -41505,6 +41877,42 @@
41505
41877
  var $tr = $table.find('tr');
41506
41878
  $table.append($tr);
41507
41879
  $tbody.remove();
41880
+ // 删除带有 style="display:none" 的单元格(通常来自复制的隐藏内容)
41881
+ var $allCells = $table.find('td, th');
41882
+ for (var i = 0; i < $allCells.length; i += 1) {
41883
+ var cell = $allCells[i];
41884
+ var $cell = $$1(cell);
41885
+ var styleAttr = $cell.attr('style');
41886
+ // 检查style属性是否包含display:none或display: none
41887
+ if (styleAttr) {
41888
+ // 使用正则表达式匹配display:none,支持空格变化
41889
+ var displayNoneRegex = /display\s*:\s*none/i;
41890
+ if (displayNoneRegex.test(styleAttr)) {
41891
+ $cell.remove();
41892
+ }
41893
+ }
41894
+ }
41895
+ // 处理表格单元格中的 <p> 标签(通常来自Word复制)
41896
+ var $cells = $table.find('td, th');
41897
+ for (var i = 0; i < $cells.length; i += 1) {
41898
+ var cell = $cells[i];
41899
+ var $cell = $$1(cell);
41900
+ // 直接处理单元格中的所有 <p> 标签
41901
+ var cellHtml = $cell.html() || '';
41902
+ // 先清理Word特殊标签
41903
+ cellHtml = cellHtml.replace(/<o:p[^>]*>[\s\S]*?<\/o:p>/gi, ''); // 删除 <o:p> 标签
41904
+ cellHtml = cellHtml.replace(/<\/o:p>/gi, ''); // 删除可能的自闭合标签
41905
+ // 一次性处理所有p标签
41906
+ cellHtml = cellHtml.replace(/<p[^>]*>([\s\S]*?)<\/p>/gi, function (match, content) {
41907
+ // 处理空内容或只包含空白字符的情况
41908
+ var trimmedContent = content.trim();
41909
+ if (!trimmedContent || trimmedContent === '&nbsp;') {
41910
+ return ''; // 删除空的p标签
41911
+ }
41912
+ return content; // 返回p标签的内容
41913
+ });
41914
+ $cell.html(cellHtml);
41915
+ }
41508
41916
  return $table[0];
41509
41917
  }
41510
41918
  var preParseTableHtmlConf = {
@@ -41650,6 +42058,117 @@
41650
42058
  $window.on('mouseup', onMouseUp);
41651
42059
  }
41652
42060
  $window.on('mousedown', onMouseDown);
42061
+ /**
42062
+ * 计算等比例调整所有列宽度(用于最右侧列拖动)
42063
+ */
42064
+ function calculateProportionalWidths(columnWidths, resizingIndex, newRightmostWidth) {
42065
+ var currentTotalWidth = columnWidths.reduce(function (a, b) { return a + b; }, 0);
42066
+ var currentRightmostWidth = columnWidths[resizingIndex];
42067
+ // 确保最右侧列不小于最小宽度
42068
+ var actualNewRightmostWidth = Math.max(10, newRightmostWidth);
42069
+ // 计算新的总宽度
42070
+ var newTotalWidth = currentTotalWidth - currentRightmostWidth + actualNewRightmostWidth;
42071
+ // 如果新总宽度太小,则设置最小总宽度
42072
+ var minTotalWidth = columnWidths.length * 10; // 每列至少10px
42073
+ if (newTotalWidth < minTotalWidth) {
42074
+ // 如果新总宽度小于最小值,则所有列都设为最小宽度
42075
+ return columnWidths.map(function () { return 10; });
42076
+ }
42077
+ // 计算其他列的总宽度
42078
+ var otherColumnsCurrentWidth = currentTotalWidth - currentRightmostWidth;
42079
+ var otherColumnsNewWidth = newTotalWidth - actualNewRightmostWidth;
42080
+ // 如果其他列需要的总宽度为0或负数,则只保留最右侧列
42081
+ if (otherColumnsNewWidth <= 0) {
42082
+ var result = columnWidths.map(function () { return 10; });
42083
+ result[resizingIndex] = Math.max(10, newTotalWidth - (columnWidths.length - 1) * 10);
42084
+ return result;
42085
+ }
42086
+ // 计算其他列的缩放比例
42087
+ var otherColumnsScaleFactor = otherColumnsCurrentWidth > 0 ? otherColumnsNewWidth / otherColumnsCurrentWidth : 1;
42088
+ // 调整所有列宽度
42089
+ var newWidths = columnWidths.map(function (width, index) {
42090
+ if (index === resizingIndex) {
42091
+ // 最右侧列直接使用新宽度
42092
+ return Math.floor(actualNewRightmostWidth * 100) / 100;
42093
+ }
42094
+ // 其他列按比例调整
42095
+ var newWidth = width * otherColumnsScaleFactor;
42096
+ return Math.max(10, Math.floor(newWidth * 100) / 100);
42097
+ });
42098
+ // 由于最小宽度限制,可能导致总宽度偏差,需要微调最右侧列
42099
+ var actualTotalWidth = newWidths.reduce(function (a, b) { return a + b; }, 0);
42100
+ var widthDifference = newTotalWidth - actualTotalWidth;
42101
+ if (Math.abs(widthDifference) > 0.01) {
42102
+ newWidths[resizingIndex] = Math.max(10, newWidths[resizingIndex] + widthDifference);
42103
+ }
42104
+ return newWidths;
42105
+ }
42106
+ /**
42107
+ * 计算相邻列宽度调整(用于中间列拖动)
42108
+ */
42109
+ function calculateAdjacentWidths(columnWidths, resizingIndex, widthChange) {
42110
+ var newWidths = __spreadArray([], __read(columnWidths), false);
42111
+ // 找到右侧的相邻列进行调整
42112
+ var adjacentIndex = resizingIndex + 1;
42113
+ if (adjacentIndex >= newWidths.length) {
42114
+ // 如果没有右侧相邻列,则不进行调整
42115
+ return newWidths;
42116
+ }
42117
+ var leftColumnWidth = newWidths[resizingIndex];
42118
+ var rightColumnWidth = newWidths[adjacentIndex];
42119
+ // 计算边界可以移动的范围
42120
+ var minLeftWidth = 10;
42121
+ var minRightWidth = 10;
42122
+ var maxLeftWidth = leftColumnWidth + rightColumnWidth - minRightWidth;
42123
+ // 计算新的左列宽度(边界直接跟随鼠标)
42124
+ var newLeftWidth = leftColumnWidth + widthChange;
42125
+ // 限制左列宽度在允许范围内
42126
+ newLeftWidth = Math.max(minLeftWidth, Math.min(maxLeftWidth, newLeftWidth));
42127
+ // 计算新的右列宽度(确保总宽度不变)
42128
+ var newRightWidth = leftColumnWidth + rightColumnWidth - newLeftWidth;
42129
+ // 应用新宽度
42130
+ newWidths[resizingIndex] = Math.floor(newLeftWidth * 100) / 100;
42131
+ newWidths[adjacentIndex] = Math.floor(newRightWidth * 100) / 100;
42132
+ return newWidths;
42133
+ }
42134
+ /**
42135
+ * 根据鼠标位置计算列宽度
42136
+ * @param columnWidths 当前列宽度数组
42137
+ * @param resizingIndex 正在调整的边界索引
42138
+ * @param mousePositionInTable 鼠标相对于表格左边的位置
42139
+ * @param cumulativeWidths 列宽度的累积和数组
42140
+ * @returns 调整后的列宽度数组
42141
+ */
42142
+ function calculateAdjacentWidthsByBorderPosition(columnWidths, resizingIndex, mousePositionInTable, cumulativeWidths) {
42143
+ var newWidths = __spreadArray([], __read(columnWidths), false);
42144
+ // 检查边界范围
42145
+ if (resizingIndex < 0 || resizingIndex >= columnWidths.length) {
42146
+ return newWidths;
42147
+ }
42148
+ // 计算当前边界的左边界位置(前面所有列的宽度总和)
42149
+ var leftBoundary = resizingIndex === 0 ? 0 : cumulativeWidths[resizingIndex - 1];
42150
+ // 计算当前边界的右边界位置(包括当前列和下一列的宽度)
42151
+ var rightBoundary = resizingIndex + 1 < columnWidths.length
42152
+ ? cumulativeWidths[resizingIndex + 1]
42153
+ : cumulativeWidths[resizingIndex];
42154
+ // 计算允许的边界移动范围
42155
+ var minBorderPosition = leftBoundary + 10; // 左列最小宽度
42156
+ var maxBorderPosition = rightBoundary - 10; // 右列最小宽度
42157
+ // 限制鼠标位置在允许范围内
42158
+ var clampedMousePosition = Math.max(minBorderPosition, Math.min(maxBorderPosition, mousePositionInTable));
42159
+ // 计算新的左列宽度(第resizingIndex列)
42160
+ var newLeftWidth = clampedMousePosition - leftBoundary;
42161
+ // 计算新的右列宽度(第resizingIndex+1列)
42162
+ var adjacentIndex = resizingIndex + 1;
42163
+ if (adjacentIndex < columnWidths.length) {
42164
+ var currentTwoColumnsWidth = columnWidths[resizingIndex] + columnWidths[adjacentIndex];
42165
+ var newRightWidth = currentTwoColumnsWidth - newLeftWidth;
42166
+ // 应用新宽度
42167
+ newWidths[resizingIndex] = Math.floor(newLeftWidth * 100) / 100;
42168
+ newWidths[adjacentIndex] = Math.floor(newRightWidth * 100) / 100;
42169
+ }
42170
+ return newWidths;
42171
+ }
41653
42172
  var onMouseMove = throttle(function (event) {
41654
42173
  if (!isMouseDownForResize) {
41655
42174
  return;
@@ -41659,28 +42178,65 @@
41659
42178
  }
41660
42179
  event.preventDefault();
41661
42180
  var clientX = event.clientX;
41662
- var newWith = cellWidthWhenMouseDown + (clientX - clientXWhenMouseDown); // 计算新宽度
41663
- newWith = Math.floor(newWith * 100) / 100; // 保留小数点后两位
41664
- if (newWith < 30) {
41665
- newWith = 30;
41666
- } // 最小宽度
42181
+ var widthChange = clientX - clientXWhenMouseDown; // 计算宽度变化
41667
42182
  var _a = __read(distExports$1.Editor.nodes(editorWhenMouseDown, {
41668
42183
  match: isOfType(editorWhenMouseDown, 'table'),
41669
42184
  }), 1), _b = __read(_a[0], 1), elemNode = _b[0];
41670
42185
  var _c = elemNode, _d = _c.columnWidths, columnWidths = _d === void 0 ? [] : _d, _e = _c.resizingIndex, resizingIndex = _e === void 0 ? -1 : _e;
41671
- var cumulativeTotalWidth = columnWidths.reduce(function (a, b) { return a + b; }, 0);
41672
- var remainWidth = cumulativeTotalWidth - columnWidths[resizingIndex];
41673
- // 如果拖动引起的宽度超过容器宽度,则不调整
41674
- var containerElement = document.querySelector('.table-container');
41675
- if (containerElement && newWith > cellWidthWhenMouseDown) {
41676
- // 允许缩小,但不允许放大
41677
- if (remainWidth + newWith > containerElement.clientWidth) {
41678
- newWith = Math.max(30, cellWidthWhenMouseDown); // 确保不小于最小宽度
41679
- }
41680
- }
41681
- var adjustColumnWidths = __spreadArray([], __read(columnWidths), false).map(function (width) { return Math.floor(width); });
41682
- adjustColumnWidths[resizingIndex] = newWith;
41683
- // 这是宽度
42186
+ var adjustColumnWidths;
42187
+ // 判断是否为最右侧列
42188
+ var isRightmostColumn = resizingIndex === columnWidths.length - 1;
42189
+ if (isRightmostColumn) {
42190
+ // 最右侧列:等比例调整所有列宽度
42191
+ var newRightmostWidth = cellWidthWhenMouseDown + widthChange;
42192
+ adjustColumnWidths = calculateProportionalWidths(columnWidths, resizingIndex, newRightmostWidth);
42193
+ }
42194
+ else {
42195
+ // 中间列:计算边界的绝对位置
42196
+ var tableElement = document.querySelector('.table');
42197
+ if (tableElement) {
42198
+ var tableRect = tableElement.getBoundingClientRect();
42199
+ var mousePositionInTable = clientX - tableRect.left; // 鼠标相对于表格左边的位置
42200
+ // 计算边界的新位置
42201
+ var cumulativeWidths = getCumulativeWidths(columnWidths);
42202
+ var newBorderPosition = mousePositionInTable;
42203
+ // 根据新的边界位置计算列宽度
42204
+ adjustColumnWidths = calculateAdjacentWidthsByBorderPosition(columnWidths, resizingIndex, newBorderPosition, cumulativeWidths);
42205
+ }
42206
+ else {
42207
+ // 如果找不到表格元素,则使用原来的逻辑
42208
+ adjustColumnWidths = calculateAdjacentWidths(columnWidths, resizingIndex, widthChange);
42209
+ }
42210
+ }
42211
+ // 检查容器宽度限制(仅对最右侧列生效)
42212
+ if (isRightmostColumn) {
42213
+ var containerElement = document.querySelector('.table-container');
42214
+ if (containerElement) {
42215
+ var newTotalWidth = adjustColumnWidths.reduce(function (a, b) { return a + b; }, 0);
42216
+ var minTableWidth = columnWidths.length * 10; // 最小表格宽度
42217
+ var maxTableWidth = containerElement.clientWidth - 1; // 最大表格宽度
42218
+ // 如果新宽度小于最小宽度,则使用最小宽度
42219
+ if (newTotalWidth < minTableWidth) {
42220
+ adjustColumnWidths = columnWidths.map(function () { return 10; });
42221
+ }
42222
+ else if (newTotalWidth > maxTableWidth) {
42223
+ // 如果新宽度超过容器宽度,则限制在容器宽度内
42224
+ // 计算允许的最大最右侧列宽度
42225
+ var otherColumnsWidth = adjustColumnWidths.slice(0, -1).reduce(function (a, b) { return a + b; }, 0);
42226
+ var maxRightmostWidth = Math.max(10, maxTableWidth - otherColumnsWidth);
42227
+ // 重新计算等比例调整后的列宽度,限制在最大宽度内
42228
+ adjustColumnWidths = calculateProportionalWidths(columnWidths, resizingIndex, maxRightmostWidth);
42229
+ // 确保总宽度不超过容器宽度
42230
+ var finalTotalWidth = adjustColumnWidths.reduce(function (a, b) { return a + b; }, 0);
42231
+ if (finalTotalWidth > maxTableWidth) {
42232
+ // 如果仍然超过,则按比例缩小所有列
42233
+ var scaleFactor_1 = maxTableWidth / finalTotalWidth;
42234
+ adjustColumnWidths = adjustColumnWidths.map(function (width) { return Math.max(10, Math.floor(width * scaleFactor_1 * 100) / 100); });
42235
+ }
42236
+ }
42237
+ }
42238
+ }
42239
+ // 应用新的列宽度
41684
42240
  distExports$1.Transforms.setNodes(editorWhenMouseDown, { columnWidths: adjustColumnWidths }, {
41685
42241
  mode: 'highest',
41686
42242
  });