@hailin-zheng/editor-core 2.2.17 → 2.2.19

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/index-cjs.js CHANGED
@@ -1749,18 +1749,26 @@ class ViewOptions {
1749
1749
  dataEleEmptyBgColor = '';
1750
1750
  //数据元鼠标悬浮颜色
1751
1751
  dataEleMouseEnterBgColor = '#d9d9d9';
1752
+ dataEleMouseEnterDecoratorMode = 'background';
1752
1753
  //数据元只读背景颜色
1753
1754
  dataEleReadOnlyBgColor = '#d9d9d9';
1754
1755
  //数据元焦点背景颜色
1755
1756
  dataEleFocusedBgColor = '#d9d9d9';
1757
+ dataEleFocusedDecoratorMode = 'background';
1756
1758
  //数据元正常背景颜色
1757
1759
  dataEleNormalBgColor = '#fafafa';
1760
+ //数据元外部框线颜色
1761
+ dataEleOutlineColor = '#0050b3';
1762
+ //数据组外部框线颜色
1763
+ dataGroupOutlineColor = '#0050b3';
1758
1764
  //数据元错误背景颜色
1759
1765
  dataEleErrorBgColor = '#ff4d4f';
1760
1766
  //数据组修饰符号颜色
1761
1767
  dataGroupDecoratorNormalColor = '#0050b3';
1762
1768
  dataGroupDecoratorMouseEnterColor = '#0050b3';
1769
+ dataGroupMouseEnterDecoratorMode = 'outline';
1763
1770
  dataGroupDecoratorFocusedColor = '#0050b3';
1771
+ dataGroupFocusedDecoratorMode = 'outline';
1764
1772
  //数据组正常背景颜色
1765
1773
  dataGroupNormalBgColor = '#fafafa';
1766
1774
  //数据元没有输入值时背景颜色
@@ -1781,8 +1789,6 @@ class ViewOptions {
1781
1789
  trackDelColor = '#000';
1782
1790
  showLineRect;
1783
1791
  showCharRect;
1784
- //数据元交互修饰模式
1785
- dataEleDecoratorMode = 'outline';
1786
1792
  showTabChar;
1787
1793
  showSpaceChar;
1788
1794
  showLineBreak;
@@ -3759,7 +3765,7 @@ class DocumentRenderObject extends BlockContainerRenderObject {
3759
3765
  },
3760
3766
  },
3761
3767
  children: [
3762
- pageCorner, highlight, ...CommonUtil.toArray(event.getChildNodes(this)), pageNum, selection, copyright
3768
+ pageCorner, highlight, selection, ...CommonUtil.toArray(event.getChildNodes(this)), pageNum, copyright
3763
3769
  ]
3764
3770
  };
3765
3771
  }
@@ -4086,7 +4092,11 @@ class DataElementInlineGroup extends InlineGroupInputElement {
4086
4092
  }
4087
4093
  });
4088
4094
  }
4089
- this.parserExpress = { compliedCode, func: new Function(`with(this){ ${compliedCode} }`), depItems: depEleMap };
4095
+ this.parserExpress = {
4096
+ compliedCode,
4097
+ func: new Function(`with(this){ ${compliedCode} }`),
4098
+ depItems: depEleMap
4099
+ };
4090
4100
  }
4091
4101
  catch (e) {
4092
4102
  console.error('解析表达式出错,parseEleExpression', this.props.expression);
@@ -4203,6 +4213,7 @@ function exportDataEleDecoratorSVG$1(event, r) {
4203
4213
  return;
4204
4214
  }
4205
4215
  const options = event.options;
4216
+ let mode = 'background';
4206
4217
  let color = options.dataEleNormalBgColor;
4207
4218
  //空数据元填充颜色
4208
4219
  if (r.element.length === 2 && options.dataEleEmptyBgColor) {
@@ -4210,17 +4221,70 @@ function exportDataEleDecoratorSVG$1(event, r) {
4210
4221
  }
4211
4222
  if (r.element.isMouseenter && options.dataEleMouseEnterBgColor) {
4212
4223
  color = options.dataEleMouseEnterBgColor;
4224
+ mode = options.dataEleMouseEnterDecoratorMode;
4213
4225
  }
4214
4226
  if (r.element.isFocused && options.dataEleFocusedBgColor) {
4215
4227
  color = options.dataEleFocusedBgColor;
4228
+ mode = options.dataEleFocusedDecoratorMode;
4216
4229
  }
4217
4230
  if (!color) {
4218
4231
  return;
4219
4232
  }
4220
4233
  //绘制背景
4221
- const bgX = event.relativePagePos.x;
4222
- const bgY = event.relativePagePos.y;
4223
- event.highlights.push(ElementUtil.getFillSvgRect(bgX, bgY, r.rect.width, r.rect.height, color));
4234
+ if (['all', 'background'].includes(mode)) {
4235
+ const bgX = event.relativePagePos.x;
4236
+ const bgY = event.relativePagePos.y + 1;
4237
+ //+1,-2,放置渲染元素边框被遮挡
4238
+ event.highlights.push(ElementUtil.getFillSvgRect(bgX, bgY, r.rect.width, r.rect.height - 2, color));
4239
+ }
4240
+ if (['all', 'outline'].includes(mode)) {
4241
+ color = event.options.dataEleOutlineColor;
4242
+ const verOffset = 0;
4243
+ const renderPosMap = getCurrentParaGroupRenders(r).map(item => ({ pos: getRenderPosToDoc(item), render: item }));
4244
+ if (renderPosMap.length > 1) {
4245
+ const secondGroupRenderPos = renderPosMap[1].pos;
4246
+ if (secondGroupRenderPos.x + renderPosMap[1].render.rect.width > event.relativePagePos.x) {
4247
+ const leftPoints = [];
4248
+ const rightPoints = [];
4249
+ for (let i = 0; i < renderPosMap.length; i++) {
4250
+ const groupRender = renderPosMap[i].render;
4251
+ const groupRenderPos = renderPosMap[i].pos;
4252
+ leftPoints.push({ x: groupRenderPos.x, y: groupRenderPos.y - verOffset });
4253
+ rightPoints.push({
4254
+ x: groupRenderPos.x + groupRender.rect.width,
4255
+ y: groupRenderPos.y - verOffset
4256
+ });
4257
+ leftPoints.push({
4258
+ x: groupRenderPos.x,
4259
+ y: groupRenderPos.y + groupRender.rect.height + verOffset * 2
4260
+ });
4261
+ rightPoints.push({
4262
+ x: groupRenderPos.x + groupRender.rect.width,
4263
+ y: groupRenderPos.y + groupRender.rect.height + verOffset * 2
4264
+ });
4265
+ }
4266
+ const sharpPoints1 = CommonUtil.resharpPoints(rightPoints);
4267
+ const sharpPoints = CommonUtil.resharpPoints([...leftPoints.reverse()]);
4268
+ const path = [...sharpPoints, ...sharpPoints1, sharpPoints[0]].map((item, index) => ((index === 0) ? 'M' : "L") + item.x + " " + item.y).join(" ");
4269
+ event.highlights.push(ElementUtil.createSvgPath({
4270
+ d: path,
4271
+ stroke: color,
4272
+ fill: 'none',
4273
+ 'stroke-width': 1
4274
+ }));
4275
+ return;
4276
+ }
4277
+ }
4278
+ for (let i = 0; i < renderPosMap.length; i++) {
4279
+ const currRen = renderPosMap[i];
4280
+ event.highlights.push(ElementUtil.createSvgPath({
4281
+ d: `M${currRen.pos.x} ${currRen.pos.y} L${currRen.pos.x + currRen.render.rect.width} ${currRen.pos.y} L${currRen.pos.x + currRen.render.rect.width} ${currRen.pos.y + currRen.render.rect.height} L${currRen.pos.x} ${currRen.pos.y + currRen.render.rect.height} Z`,
4282
+ stroke: color,
4283
+ fill: 'none',
4284
+ 'stroke-width': 1
4285
+ }));
4286
+ }
4287
+ }
4224
4288
  // const canPaint = r.element.isMouseenter || r.element.isFocused;
4225
4289
  // if (!canPaint) {
4226
4290
  // return;
@@ -4235,51 +4299,6 @@ function exportDataEleDecoratorSVG$1(event, r) {
4235
4299
  // event.highlights.push(ElementUtil.getFillSvgRect(bgX, bgY, r.rect.width, r.rect.height, color));
4236
4300
  // return;
4237
4301
  // } else if (mode === 'outline') {
4238
- // const verOffset = 0;
4239
- // const renderPosMap = getCurrentParaGroupRenders(r).map(item => ({ pos: getRenderPosToDoc(item), render: item }));
4240
- // if (renderPosMap.length > 1) {
4241
- // const secondGroupRenderPos = renderPosMap[1].pos;
4242
- // if (secondGroupRenderPos.x + renderPosMap[1].render.rect.width > event.relativePagePos.x) {
4243
- // const leftPoints: Array<Position> = [];
4244
- // const rightPoints: Array<Position> = [];
4245
- // for (let i = 0; i < renderPosMap.length; i++) {
4246
- // const groupRender = renderPosMap[i].render;
4247
- // const groupRenderPos = renderPosMap[i].pos;
4248
- // leftPoints.push({ x: groupRenderPos.x, y: groupRenderPos.y - verOffset });
4249
- // rightPoints.push({
4250
- // x: groupRenderPos.x + groupRender.rect.width,
4251
- // y: groupRenderPos.y - verOffset
4252
- // });
4253
- // leftPoints.push({
4254
- // x: groupRenderPos.x,
4255
- // y: groupRenderPos.y + groupRender.rect.height + verOffset * 2
4256
- // });
4257
- // rightPoints.push({
4258
- // x: groupRenderPos.x + groupRender.rect.width,
4259
- // y: groupRenderPos.y + groupRender.rect.height + verOffset * 2
4260
- // });
4261
- // }
4262
- // const sharpPoints1 = CommonUtil.resharpPoints(rightPoints);
4263
- // const sharpPoints = CommonUtil.resharpPoints([...leftPoints.reverse()]);
4264
- // const path = [...sharpPoints, ...sharpPoints1, sharpPoints[0]].map((item, index) => ((index === 0) ? 'M' : "L") + item.x + " " + item.y).join(" ")
4265
- // event.highlights.push(ElementUtil.createSvgPath({
4266
- // d: path,
4267
- // stroke: color,
4268
- // fill: 'none',
4269
- // 'stroke-width': 1
4270
- // }));
4271
- // return;
4272
- // }
4273
- // }
4274
- // for (let i = 0; i < renderPosMap.length; i++) {
4275
- // const currRen = renderPosMap[i];
4276
- // event.highlights.push(ElementUtil.createSvgPath({
4277
- // d: `M${currRen.pos.x} ${currRen.pos.y} L${currRen.pos.x + currRen.render.rect.width} ${currRen.pos.y} L${currRen.pos.x + currRen.render.rect.width} ${currRen.pos.y + currRen.render.rect.height} L${currRen.pos.x} ${currRen.pos.y + currRen.render.rect.height} Z`,
4278
- // stroke: '#0050b3',
4279
- // fill: 'none',
4280
- // 'stroke-width': 1
4281
- // }));
4282
- // }
4283
4302
  // }
4284
4303
  }
4285
4304
  /**
@@ -4386,6 +4405,30 @@ function renderUnderWavyLine(event, r, color) {
4386
4405
  const path = ElementUtil.createSvgPath({ d, fill: 'none', stroke: color });
4387
4406
  event.highlights.push(path);
4388
4407
  }
4408
+ /**
4409
+ * 获取渲染元素相对稳当的位置
4410
+ * @param render
4411
+ * @param refPos
4412
+ */
4413
+ function getRenderPosToDoc(render, refPos = null) {
4414
+ refPos = refPos ?? { x: 0, y: 0 };
4415
+ if (render instanceof DocumentRenderObject) {
4416
+ return refPos;
4417
+ }
4418
+ const currPos = { x: render.rect.x + refPos.x, y: render.rect.y + refPos.y };
4419
+ return getRenderPosToDoc(render.parent, currPos);
4420
+ }
4421
+ function getCurrentParaGroupRenders(r) {
4422
+ const renders = [];
4423
+ const currParaRender = ElementUtil.getParentRender(r, ParagraphRenderObject);
4424
+ for (let i = 0; i < r.element.paintRenders.length; i++) {
4425
+ const paraRender = ElementUtil.getParentRender(r.element.paintRenders[i], ParagraphRenderObject);
4426
+ if (paraRender === currParaRender) {
4427
+ renders.push(r.element.paintRenders[i]);
4428
+ }
4429
+ }
4430
+ return renders;
4431
+ }
4389
4432
  function renderUnderline(event, render) {
4390
4433
  const { x, y } = event.relativePagePos;
4391
4434
  event.highlights.push({
@@ -8928,23 +8971,76 @@ function exportDataEleDecoratorSVG(event, r) {
8928
8971
  }
8929
8972
  const options = event.options;
8930
8973
  let color = options.dataGroupNormalBgColor;
8974
+ let mode = 'background';
8931
8975
  //空数据元填充颜色
8932
8976
  if (r.element.length === 2 && options.dataGroupEmptyBgColor) {
8933
8977
  color = options.dataGroupEmptyBgColor;
8934
8978
  }
8935
8979
  if (r.element.isMouseenter && options.dataGroupMouseEnterBgColor) {
8936
8980
  color = options.dataGroupMouseEnterBgColor;
8981
+ mode = options.dataGroupMouseEnterDecoratorMode;
8937
8982
  }
8938
8983
  if (r.element.isFocused && options.dataGroupFocusedBgColor) {
8939
8984
  color = options.dataGroupFocusedBgColor;
8985
+ mode = options.dataGroupFocusedDecoratorMode;
8940
8986
  }
8941
8987
  if (!color) {
8942
8988
  return;
8943
8989
  }
8944
8990
  //绘制背景
8945
- const bgX = event.relativePagePos.x;
8946
- const bgY = event.relativePagePos.y;
8947
- event.highlights.push(ElementUtil.getFillSvgRect(bgX, bgY, r.rect.width, r.rect.height, color));
8991
+ if (['all', 'background'].includes(mode)) {
8992
+ const bgX = event.relativePagePos.x;
8993
+ const bgY = event.relativePagePos.y;
8994
+ event.highlights.push(ElementUtil.getFillSvgRect(bgX, bgY, r.rect.width, r.rect.height, color));
8995
+ }
8996
+ if (['all', 'outline'].includes(mode)) {
8997
+ color = event.options.dataGroupOutlineColor;
8998
+ const verOffset = 0;
8999
+ const renderPosMap = getCurrentParaGroupRenders(r).map(item => ({ pos: getRenderPosToDoc(item), render: item }));
9000
+ if (renderPosMap.length > 1) {
9001
+ const secondGroupRenderPos = renderPosMap[1].pos;
9002
+ if (secondGroupRenderPos.x + renderPosMap[1].render.rect.width > event.relativePagePos.x) {
9003
+ const leftPoints = [];
9004
+ const rightPoints = [];
9005
+ for (let i = 0; i < renderPosMap.length; i++) {
9006
+ const groupRender = renderPosMap[i].render;
9007
+ const groupRenderPos = renderPosMap[i].pos;
9008
+ leftPoints.push({ x: groupRenderPos.x, y: groupRenderPos.y - verOffset });
9009
+ rightPoints.push({
9010
+ x: groupRenderPos.x + groupRender.rect.width,
9011
+ y: groupRenderPos.y - verOffset
9012
+ });
9013
+ leftPoints.push({
9014
+ x: groupRenderPos.x,
9015
+ y: groupRenderPos.y + groupRender.rect.height + verOffset * 2
9016
+ });
9017
+ rightPoints.push({
9018
+ x: groupRenderPos.x + groupRender.rect.width,
9019
+ y: groupRenderPos.y + groupRender.rect.height + verOffset * 2
9020
+ });
9021
+ }
9022
+ const sharpPoints1 = CommonUtil.resharpPoints(rightPoints);
9023
+ const sharpPoints = CommonUtil.resharpPoints([...leftPoints.reverse()]);
9024
+ const path = [...sharpPoints, ...sharpPoints1, sharpPoints[0]].map((item, index) => ((index === 0) ? 'M' : "L") + item.x + " " + item.y).join(" ");
9025
+ event.highlights.push(ElementUtil.createSvgPath({
9026
+ d: path,
9027
+ stroke: color,
9028
+ fill: 'none',
9029
+ 'stroke-width': 1
9030
+ }));
9031
+ return;
9032
+ }
9033
+ }
9034
+ for (let i = 0; i < renderPosMap.length; i++) {
9035
+ const currRen = renderPosMap[i];
9036
+ event.highlights.push(ElementUtil.createSvgPath({
9037
+ d: `M${currRen.pos.x} ${currRen.pos.y} L${currRen.pos.x + currRen.render.rect.width} ${currRen.pos.y} L${currRen.pos.x + currRen.render.rect.width} ${currRen.pos.y + currRen.render.rect.height} L${currRen.pos.x} ${currRen.pos.y + currRen.render.rect.height} Z`,
9038
+ stroke: color,
9039
+ fill: 'none',
9040
+ 'stroke-width': 1
9041
+ }));
9042
+ }
9043
+ }
8948
9044
  }
8949
9045
 
8950
9046
  class DataElementImage extends DataElementLeaf {
@@ -14257,6 +14353,11 @@ class ParagraphMeasure {
14257
14353
  parent: parentLine,
14258
14354
  isCloseToBody: parentLine.isCloseToBody,
14259
14355
  applyNewLine() {
14356
+ //申请新行前,需要将当前内联元素的宽度扩充到可用最大宽度
14357
+ const space = parentLine.limitWidth - parentLine.lineWidth();
14358
+ if (space > 0) {
14359
+ render.rect.width += space;
14360
+ }
14260
14361
  parentLine.applyNewLine();
14261
14362
  render = ele.createRenderObject({ options, renderCtx, execute });
14262
14363
  parentLine.add(render);
@@ -18492,6 +18593,13 @@ class DocumentChange {
18492
18593
  }
18493
18594
  let pasteText = evt.clipboardData?.getData('text/plain') ?? '';
18494
18595
  const pasteData = evt.clipboardData?.getData('doc/plain') ?? '';
18596
+ this.onInsertContent({ text: pasteText, doc: pasteData });
18597
+ }
18598
+ /**
18599
+ * 在光标处插入内容
18600
+ * @param data
18601
+ */
18602
+ onInsertContent(data) {
18495
18603
  const { collapsed } = this.selectionState;
18496
18604
  if (!collapsed) {
18497
18605
  //TODO:如果一个容器内的元素被全部删除,则返回 null
@@ -18500,12 +18608,12 @@ class DocumentChange {
18500
18608
  // startOffset = cursorOffset;
18501
18609
  this.onRangeDelete();
18502
18610
  const cb = () => {
18503
- this.handlePasteContent({ text: pasteText, doc: pasteData }, this.selectionState);
18611
+ this.handlePasteContent({ text: data.text, doc: data.doc }, this.selectionState);
18504
18612
  };
18505
18613
  this.docCtx.onNextView(cb);
18506
18614
  return;
18507
18615
  }
18508
- this.handlePasteContent({ text: pasteText, doc: pasteData }, this.selectionState);
18616
+ this.handlePasteContent({ text: data.text, doc: data.doc }, this.selectionState);
18509
18617
  }
18510
18618
  /**
18511
18619
  * 处理粘贴的内容
@@ -19752,7 +19860,6 @@ class DocumentSvg {
19752
19860
  fill: item.color ?? this.viewOptions.selectionColor,
19753
19861
  'paint-order': 'stroke fill markers',
19754
19862
  d: `M${item.x} ${item.y} L${item.x + item.width} ${item.y} L${item.x + item.width} ${item.y + item.height} L${item.x} ${item.y + item.height} Z`,
19755
- 'fill-opacity': '0.5'
19756
19863
  }
19757
19864
  }
19758
19865
  }));
@@ -22374,7 +22481,7 @@ class DocEditor {
22374
22481
  rule.setRuleOptions({ width: this.viewOptions.docPageSettings.width, pagePL, pagePR, docLeft });
22375
22482
  }
22376
22483
  version() {
22377
- return "2.2.17";
22484
+ return "2.2.19";
22378
22485
  }
22379
22486
  switchPageHeaderEditor() {
22380
22487
  this.docCtx.document.switchPageHeaderEditor(this.selectionState, null);
@@ -22721,6 +22828,13 @@ class DocEditor {
22721
22828
  removeEleAttribute(ele, attr) {
22722
22829
  ElementUtil.removeEleAttribute(ele, attr);
22723
22830
  }
22831
+ /**
22832
+ * 在光标处插入内容
22833
+ * @param data
22834
+ */
22835
+ onInsertContent(data) {
22836
+ this.documentChange.onInsertContent(data);
22837
+ }
22724
22838
  }
22725
22839
 
22726
22840
  /**
@@ -28366,7 +28480,9 @@ exports.formatEle = formatEle;
28366
28480
  exports.fromEvent = fromEvent;
28367
28481
  exports.generatePatch = generatePatch;
28368
28482
  exports.getCalleeName = getCalleeName;
28483
+ exports.getCurrentParaGroupRenders = getCurrentParaGroupRenders;
28369
28484
  exports.getFocusTextSegment = getFocusTextSegment;
28485
+ exports.getRenderPosToDoc = getRenderPosToDoc;
28370
28486
  exports.inputText = inputText;
28371
28487
  exports.insertEle = insertEle;
28372
28488
  exports.invokeTypeHandler = invokeTypeHandler;