@hailin-zheng/editor-core 1.0.15 → 1.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/README.md +1613 -0
  2. package/lib/framework/element-props.d.ts +2 -2
  3. package/lib/framework/impl/index.d.ts +36 -0
  4. package/lib/index.d.ts +34 -0
  5. package/lib/index.js +15672 -0
  6. package/lib/texteditor.d.ts +3 -3
  7. package/package.json +27 -26
  8. package/lib/doc-ruler.js +0 -313
  9. package/lib/doc-ruler.js.map +0 -1
  10. package/lib/framework/common-util.js +0 -178
  11. package/lib/framework/common-util.js.map +0 -1
  12. package/lib/framework/document-change.js +0 -1342
  13. package/lib/framework/document-change.js.map +0 -1
  14. package/lib/framework/document-combine.js +0 -40
  15. package/lib/framework/document-combine.js.map +0 -1
  16. package/lib/framework/document-comment.js +0 -148
  17. package/lib/framework/document-comment.js.map +0 -1
  18. package/lib/framework/document-context.js +0 -330
  19. package/lib/framework/document-context.js.map +0 -1
  20. package/lib/framework/document-eval-func.js +0 -48
  21. package/lib/framework/document-eval-func.js.map +0 -1
  22. package/lib/framework/document-event.js +0 -1054
  23. package/lib/framework/document-event.js.map +0 -1
  24. package/lib/framework/document-history.js +0 -65
  25. package/lib/framework/document-history.js.map +0 -1
  26. package/lib/framework/document-images-loader.js +0 -66
  27. package/lib/framework/document-images-loader.js.map +0 -1
  28. package/lib/framework/document-input-cursor.js +0 -239
  29. package/lib/framework/document-input-cursor.js.map +0 -1
  30. package/lib/framework/document-paint.js +0 -103
  31. package/lib/framework/document-paint.js.map +0 -1
  32. package/lib/framework/document-print-offscreen.js +0 -128
  33. package/lib/framework/document-print-offscreen.js.map +0 -1
  34. package/lib/framework/document-print.js +0 -203
  35. package/lib/framework/document-print.js.map +0 -1
  36. package/lib/framework/document-segmenter.js +0 -106
  37. package/lib/framework/document-segmenter.js.map +0 -1
  38. package/lib/framework/document-selection.js +0 -358
  39. package/lib/framework/document-selection.js.map +0 -1
  40. package/lib/framework/document-template.js +0 -20
  41. package/lib/framework/document-template.js.map +0 -1
  42. package/lib/framework/document-textline-mode.js +0 -30
  43. package/lib/framework/document-textline-mode.js.map +0 -1
  44. package/lib/framework/element-define.js +0 -579
  45. package/lib/framework/element-define.js.map +0 -1
  46. package/lib/framework/element-event-define.js +0 -108
  47. package/lib/framework/element-event-define.js.map +0 -1
  48. package/lib/framework/element-measure.js +0 -551
  49. package/lib/framework/element-measure.js.map +0 -1
  50. package/lib/framework/element-paint.js +0 -170
  51. package/lib/framework/element-paint.js.map +0 -1
  52. package/lib/framework/element-props.js +0 -809
  53. package/lib/framework/element-props.js.map +0 -1
  54. package/lib/framework/element-reader.js +0 -151
  55. package/lib/framework/element-reader.js.map +0 -1
  56. package/lib/framework/element-render-cut.js +0 -449
  57. package/lib/framework/element-render-cut.js.map +0 -1
  58. package/lib/framework/element-serialize.js +0 -113
  59. package/lib/framework/element-serialize.js.map +0 -1
  60. package/lib/framework/element-util.js +0 -1463
  61. package/lib/framework/element-util.js.map +0 -1
  62. package/lib/framework/impl/checkbox/checkbox-impl.js +0 -64
  63. package/lib/framework/impl/checkbox/checkbox-impl.js.map +0 -1
  64. package/lib/framework/impl/comments/comment-content-impl.js +0 -105
  65. package/lib/framework/impl/comments/comment-content-impl.js.map +0 -1
  66. package/lib/framework/impl/comments/comment-element-impl.js +0 -62
  67. package/lib/framework/impl/comments/comment-element-impl.js.map +0 -1
  68. package/lib/framework/impl/comments/comments-container-impl.js +0 -62
  69. package/lib/framework/impl/comments/comments-container-impl.js.map +0 -1
  70. package/lib/framework/impl/comments/comments-util.js +0 -67
  71. package/lib/framework/impl/comments/comments-util.js.map +0 -1
  72. package/lib/framework/impl/comments/validate-msg-impl.js +0 -83
  73. package/lib/framework/impl/comments/validate-msg-impl.js.map +0 -1
  74. package/lib/framework/impl/data-element/data-decorate-impl.js +0 -91
  75. package/lib/framework/impl/data-element/data-decorate-impl.js.map +0 -1
  76. package/lib/framework/impl/data-element/data-element-barcode.js +0 -115
  77. package/lib/framework/impl/data-element/data-element-barcode.js.map +0 -1
  78. package/lib/framework/impl/data-element/data-element-base-impl.js +0 -205
  79. package/lib/framework/impl/data-element/data-element-base-impl.js.map +0 -1
  80. package/lib/framework/impl/data-element/data-element-check-impl.js +0 -133
  81. package/lib/framework/impl/data-element/data-element-check-impl.js.map +0 -1
  82. package/lib/framework/impl/data-element/data-element-date-impl.js +0 -111
  83. package/lib/framework/impl/data-element/data-element-date-impl.js.map +0 -1
  84. package/lib/framework/impl/data-element/data-element-group-impl.js +0 -130
  85. package/lib/framework/impl/data-element/data-element-group-impl.js.map +0 -1
  86. package/lib/framework/impl/data-element/data-element-image-impl.js +0 -137
  87. package/lib/framework/impl/data-element/data-element-image-impl.js.map +0 -1
  88. package/lib/framework/impl/data-element/data-element-list-impl.js +0 -131
  89. package/lib/framework/impl/data-element/data-element-list-impl.js.map +0 -1
  90. package/lib/framework/impl/data-element/data-element-text-impl.js +0 -103
  91. package/lib/framework/impl/data-element/data-element-text-impl.js.map +0 -1
  92. package/lib/framework/impl/decorate/fill-null-space-imple.js +0 -43
  93. package/lib/framework/impl/decorate/fill-null-space-imple.js.map +0 -1
  94. package/lib/framework/impl/document/doc-body-impl.js +0 -79
  95. package/lib/framework/impl/document/doc-body-impl.js.map +0 -1
  96. package/lib/framework/impl/document/doc-body-part-impl.js +0 -94
  97. package/lib/framework/impl/document/doc-body-part-impl.js.map +0 -1
  98. package/lib/framework/impl/document/doc-container-impl.js +0 -21
  99. package/lib/framework/impl/document/doc-container-impl.js.map +0 -1
  100. package/lib/framework/impl/document/doc-footer-impl.js +0 -77
  101. package/lib/framework/impl/document/doc-footer-impl.js.map +0 -1
  102. package/lib/framework/impl/document/doc-header-impl.js +0 -83
  103. package/lib/framework/impl/document/doc-header-impl.js.map +0 -1
  104. package/lib/framework/impl/document/doc-impl.js +0 -209
  105. package/lib/framework/impl/document/doc-impl.js.map +0 -1
  106. package/lib/framework/impl/media-formula/menstrual-history.js +0 -153
  107. package/lib/framework/impl/media-formula/menstrual-history.js.map +0 -1
  108. package/lib/framework/impl/paragraph/p-impl.js +0 -156
  109. package/lib/framework/impl/paragraph/p-impl.js.map +0 -1
  110. package/lib/framework/impl/picture/image-impl.js +0 -124
  111. package/lib/framework/impl/picture/image-impl.js.map +0 -1
  112. package/lib/framework/impl/radio/radio-impl.js +0 -72
  113. package/lib/framework/impl/radio/radio-impl.js.map +0 -1
  114. package/lib/framework/impl/symbol/br-symbol-impl.js +0 -54
  115. package/lib/framework/impl/symbol/br-symbol-impl.js.map +0 -1
  116. package/lib/framework/impl/symbol/p-symbol-impl.js +0 -54
  117. package/lib/framework/impl/symbol/p-symbol-impl.js.map +0 -1
  118. package/lib/framework/impl/table/table-cell-impl.js +0 -145
  119. package/lib/framework/impl/table/table-cell-impl.js.map +0 -1
  120. package/lib/framework/impl/table/table-impl.js +0 -363
  121. package/lib/framework/impl/table/table-impl.js.map +0 -1
  122. package/lib/framework/impl/table/table-row-impl.js +0 -75
  123. package/lib/framework/impl/table/table-row-impl.js.map +0 -1
  124. package/lib/framework/impl/table/table-split-cell-patch.js +0 -89
  125. package/lib/framework/impl/table/table-split-cell-patch.js.map +0 -1
  126. package/lib/framework/impl/table/table-split-cell.js +0 -464
  127. package/lib/framework/impl/table/table-split-cell.js.map +0 -1
  128. package/lib/framework/impl/table/table-util.js +0 -678
  129. package/lib/framework/impl/table/table-util.js.map +0 -1
  130. package/lib/framework/impl/text/text-impl.js +0 -149
  131. package/lib/framework/impl/text/text-impl.js.map +0 -1
  132. package/lib/framework/impl/text/track-run-impl.js +0 -112
  133. package/lib/framework/impl/text/track-run-impl.js.map +0 -1
  134. package/lib/framework/notify.js +0 -116
  135. package/lib/framework/notify.js.map +0 -1
  136. package/lib/framework/range-util.js +0 -312
  137. package/lib/framework/range-util.js.map +0 -1
  138. package/lib/framework/render-context.js +0 -384
  139. package/lib/framework/render-context.js.map +0 -1
  140. package/lib/framework/render-define.js +0 -195
  141. package/lib/framework/render-define.js.map +0 -1
  142. package/lib/framework/selection-overlays.js +0 -124
  143. package/lib/framework/selection-overlays.js.map +0 -1
  144. package/lib/texteditor.js +0 -913
  145. package/lib/texteditor.js.map +0 -1
  146. package/lib/util/subject.js +0 -88
  147. package/lib/util/subject.js.map +0 -1
  148. package/lib/util/table-bind.js +0 -6
  149. package/lib/util/table-bind.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-change.js","sourceRoot":"lib/","sources":["framework/document-change.ts"],"names":[],"mappings":"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","sourcesContent":["import { ICompositionStartInfo, InputData } from \"./document-input-cursor\";\nimport { SelectionRange, SelectionState } from \"./document-selection\";\nimport { ElementUtil } from \"./element-util\";\nimport {\n BlockContainerElement,\n BlockContentElement,\n BranchElement,\n DocMode,\n Element,\n InlineGroupElement,\n LeafElement,\n SelectionContentRange,\n ViewOptions\n} from \"./element-define\";\nimport { TextGroupElement } from \"./impl/text/text-impl\";\nimport { PSymbolElement } from \"./impl/symbol/p-symbol-impl\";\nimport { ParagraphElement } from \"./impl/paragraph/p-impl\";\nimport { RangeUtil } from \"./range-util\";\nimport { TableElement } from \"./impl/table/table-impl\";\nimport { DocumentEvent } from \"./document-event\";\nimport { KeyboradElementEvent } from \"./element-event-define\";\nimport { DataEleBaseProps, ParagraphProps, TextProps } from \"./element-props\";\nimport { ElementSerialize } from \"./element-serialize\";\nimport { ElementReader } from \"./element-reader\";\nimport { BreakElement } from \"./impl/symbol/br-symbol-impl\";\nimport { DataDecorateElement } from \"./impl/data-element/data-decorate-impl\";\nimport { EditorContext } from \"./document-context\";\nimport {\n DataElementInlineGroup,\n InlineGroupInputElement,\n IsInSideDataElement,\n IsInSideInlineGroupInputElement\n} from \"./impl/data-element/data-element-base-impl\";\nimport { DocumentComment } from \"./document-comment\";\nimport { CommentElement } from \"./impl/comments/comment-element-impl\";\nimport { nanoid } from \"nanoid\";\nimport { CommContentElement } from \"./impl/comments/comment-content-impl\";\nimport { ValidateElement } from \"./impl/comments/validate-msg-impl\";\nimport { CommonUtil } from \"./common-util\";\nimport { TrackRunElement, TrackRunTypeEnum } from \"./impl/text/track-run-impl\";\nimport { DocumentBodyElement } from \"./impl/document/doc-body-impl\";\n\n/**\n * 文档内容改变\n */\nexport class DocumentChange {\n constructor(private selectionState: SelectionState, private viewOptions: ViewOptions, private eleReader: ElementReader, private docCtx: EditorContext, private docComment: DocumentComment) {\n }\n\n newInput(data: InputData): void {\n const { startControl, startOffset, collapsed, enableTrackChanges } = this.selectionState;\n if (!collapsed) {\n this.onInputBySelection(data);\n return;\n }\n //判断是否需要创建新的留痕区域\n if (enableTrackChanges && !this.isInCorrectTrackRegion(startControl as Element, TrackRunTypeEnum.Inserted)) {\n this.newInputTrackChanges(data, startControl as LeafElement, startOffset);\n return;\n }\n //当前输入节点是在留痕区域中,但是当前关闭了审阅模式,需要拆分留痕区域,创建新输入节点\n if (!enableTrackChanges && this.isInTrackBlock(startControl)) {\n const newInput = this.splitTrackElement(startControl, startOffset);\n const comp = data.compositionStartInfo as ICompositionStartInfo;\n comp.element = newInput;\n comp.offset = 0;\n this.inputTextGroup(newInput, data);\n return;\n }\n if (!(startControl instanceof TextGroupElement)) {\n if (!data.compositionStartInfo) {\n throw new Error('compositionStartInfo is null');\n }\n const siblingTextEle = startOffset === 1 ? ElementUtil.getNextSiblingElement(startControl) : ElementUtil.getPrevSiblingElement(startControl);\n if (siblingTextEle instanceof TextGroupElement) {\n data.compositionStartInfo.offset = startOffset === 0 ? siblingTextEle.text.length : 0;\n this.inputTextGroup(siblingTextEle, data);\n } else {\n const inputTextProps = this.getDefaultTextProps(startControl, startOffset);\n const newTextGroup = ElementUtil.getNewTextGroup(inputTextProps);\n startControl.parent.addChild(newTextGroup, startControl.getIndex() + startOffset);\n this.inputTextGroup(newTextGroup, data);\n }\n return;\n }\n this.inputTextGroup(startControl, data);\n }\n\n\n /**\n * 选中区域后进行输入\n * 需要处理将选中的区域删除后,进行输入的情况\n */\n onInputBySelection(data: InputData): void {\n this.onRangeDelete();\n this.selectionState.afterSelectionChanged = (newVal) => {\n const { startControl, startOffset, editable } = newVal;\n if (!editable) {\n return false;\n }\n const comp = data.compositionStartInfo as ICompositionStartInfo;\n comp.element = startControl;\n comp.offset = startOffset;\n this.newInput(data);\n return true;\n };\n\n }\n\n /**\n * 当前元素是否在正确的留痕区域(ins-run、del-run),情况分为以下情况\n * 1.留痕块类型为新增,但是留痕块的创建者为其他用户,此时需要拆分留痕区域\n * 2.留痕块为当前用户创建,但是创建时间大于有效的时间,此时需要拆分留痕区域\n * @param startControl\n * @param trackType\n * @returns\n */\n isInCorrectTrackRegion(startControl: Element, trackType: TrackRunTypeEnum): boolean {\n const parent = startControl.parent;\n return parent instanceof TrackRunElement\n && parent.props.userId === this.viewOptions.editUser.id\n && parent.type === trackType\n && CommonUtil.getNowDiffSeconds(parent.props.date) <= this.viewOptions.trackChangePeriod;\n }\n\n /**\n * 当前元素是否在留痕区域(ins-run、del-run)中\n * @param target\n * @param trackType\n * @returns\n */\n isInTrackBlock(target: Element, trackType: TrackRunTypeEnum | null = null): boolean {\n return target.parent instanceof TrackRunElement && (trackType === null || target.parent.type === trackType);\n }\n\n /**\n * 留痕输入\n * @param data\n * @param startControl\n * @param startOffset\n * @returns\n */\n newInputTrackChanges(data: InputData, startControl: LeafElement, startOffset: number): void {\n const userId = this.viewOptions.editUser.id;\n const compInfo = data.compositionStartInfo as ICompositionStartInfo;\n if (this.isInCorrectTrackRegion(startControl, TrackRunTypeEnum.Inserted)) {\n return;\n }\n if (this.isInTrackBlock(startControl)) {\n const newInput = this.createNewTrackInput(startControl, startOffset, TrackRunTypeEnum.Inserted);\n compInfo.offset = 0;\n compInfo.element = newInput;\n this.inputTextGroup(newInput, data);\n return;\n } else {\n const {\n trackElement,\n newTextGroup\n } = this.createTextTrackElement(startControl, null, TrackRunTypeEnum.Inserted);\n this.insertElement(startControl, startOffset, [trackElement])\n compInfo.offset = 0;\n compInfo.element = newTextGroup;\n this.inputTextGroup(newTextGroup, data);\n return;\n }\n }\n\n\n /**\n * 创建新的留痕块,并返回留痕块输入定位文本\n * @param startControl\n * @param startOffset\n * @param trackType\n * @returns\n */\n createNewTrackInput(startControl: LeafElement, startOffset: number, trackType: TrackRunTypeEnum): TextGroupElement {\n const textProps = this.getDefaultTextProps(startControl, startOffset);\n const currTrackEle = startControl.parent as TrackRunElement;\n if (startControl instanceof TextGroupElement && startOffset > 0 && startOffset < startControl.textMeasures.length) {\n const splitText = startControl.spliceText(startOffset, startControl.textMeasures.length, true) as TextGroupElement;\n startControl.parent.addChild(splitText, startControl.getIndex() + 1);\n startOffset = startControl.textMeasures.length;\n }\n startOffset = startOffset > 0 ? 1 : 0;\n const index = startControl.getIndex() + startOffset;\n //切割留痕块\n if (index > 0 && index < currTrackEle.length) {\n const splitTrack = currTrackEle.split(startControl.getIndex() + startOffset) as TrackRunElement;\n currTrackEle.parent.addChild(splitTrack, currTrackEle.getIndex() + 1);\n const { trackElement, newTextGroup } = this.createTextTrackElement(startControl, textProps, trackType);\n currTrackEle.parent.addChild(trackElement, currTrackEle.getIndex() + 1);\n return newTextGroup;\n } else {\n const { trackElement, newTextGroup } = this.createTextTrackElement(startControl, textProps, trackType);\n currTrackEle.parent.addChild(trackElement, currTrackEle.getIndex() + (index === 0 ? 0 : 1));\n return newTextGroup;\n }\n }\n\n /**\n * 获取当前输入节点的文本属性\n * @param startControl\n * @returns\n */\n getDefaultTextProps(startControl: LeafElement, offset: number): TextProps {\n const para = ElementUtil.getParentByType(startControl, ParagraphElement) as ParagraphElement;\n let textProps = para.props.textProps;\n if (startControl instanceof TextGroupElement) {\n textProps = startControl.props;\n }\n const dataEle = ElementUtil.getDataElement(startControl) as DataElementInlineGroup;\n if (dataEle && IsInSideDataElement(startControl, offset)) {\n return dataEle.props.valueTextProps;\n }\n return textProps;\n }\n\n /**\n * 当前元素位于留痕区域内,但是当前编辑模式为非留痕模式,需要将当前留痕元素分割开来,插入新普通文本元素对象,并返回\n * @param startControl\n * @param startOffset\n * @returns\n */\n splitTrackElement(startControl: LeafElement, startOffset: number): TextGroupElement {\n if (!(startControl.parent instanceof TrackRunElement) && startControl instanceof TextGroupElement) {\n return startControl;\n }\n const textProps = this.getDefaultTextProps(startControl, startOffset);\n const currTrackEle = startControl.parent as TrackRunElement;\n if (startControl instanceof TextGroupElement && startOffset > 0 && startOffset < startControl.textMeasures.length) {\n const splitText = startControl.spliceText(startOffset, startControl.textMeasures.length, true) as TextGroupElement;\n startControl.parent.addChild(splitText, startControl.getIndex() + 1);\n startOffset = startControl.textMeasures.length;\n }\n startOffset = startOffset > 0 ? 1 : 0;\n const index = startControl.getIndex() + startOffset;\n if (index > 0 && index < currTrackEle.length) {\n const splitTrack = currTrackEle.split(startControl.getIndex() + startOffset) as TrackRunElement;\n currTrackEle.parent.addChild(splitTrack, currTrackEle.getIndex() + 1);\n const newInput = ElementUtil.getNewTextGroup(textProps);\n currTrackEle.parent.addChild(newInput, currTrackEle.getIndex() + 1);\n return this.splitTrackElement(newInput, 0);\n } else {\n const newInput = ElementUtil.getNewTextGroup(textProps);\n currTrackEle.parent.addChild(newInput, currTrackEle.getIndex() + (index === 0 ? 0 : 1));\n return this.splitTrackElement(newInput, 0);\n }\n }\n\n /**\n * 创建插入(ins-run) 留痕,并且返回留痕的文本元素对象\n * @param startControl\n * @returns\n */\n private createTextTrackElement(startControl: Element, textProps: TextProps | null, trackType: TrackRunTypeEnum): { trackElement: TrackRunElement, newTextGroup: TextGroupElement } {\n const para = ElementUtil.getParentByType(startControl, ParagraphElement) as ParagraphElement;\n const trackElement = this.createTrackElement(trackType);\n textProps = textProps || para.props.textProps;\n const newTextGroup = ElementUtil.getNewTextGroup(textProps);\n newTextGroup.props.color = '#ff4d4f';\n trackElement.addChild(newTextGroup);\n return {\n trackElement,\n newTextGroup\n }\n\n }\n\n private createTrackElement(trackType: TrackRunTypeEnum): TrackRunElement {\n const trackElement = new TrackRunElement(trackType);\n trackElement.props.userId = this.viewOptions.editUser.id;\n trackElement.props.userName = this.viewOptions.editUser.name;\n trackElement.props.date = CommonUtil.formatNow('YYYY-MM-DD HH:mm:ss');\n trackElement.props.id = nanoid(5);\n return trackElement;\n }\n\n private inputTextGroup(text: TextGroupElement, data: InputData): void {\n const prevInputData = data.prevInputData || '';\n const prevInputDataLength = prevInputData.length;\n if (!data.compositionStartInfo) {\n throw new Error('compositionStartInfo is null')\n }\n\n const { element, offset } = data.compositionStartInfo;\n let startInputOffset = offset;\n //startInputOffset -= prevInputDataLength;\n if (!(element instanceof TextGroupElement)) {\n //当前选中元素位于输入元素是起始还是结束位置,如果位于起始位置,则输入偏移量为0,否则为未变更之前的内容length\n if (ElementUtil.getNextSiblingElement(element) === text) {\n startInputOffset = 0;\n } else {\n startInputOffset = text.textMeasures.length - prevInputDataLength;\n }\n }\n text.splice(startInputOffset, prevInputDataLength, data.data);\n //输入后撤销,导致文本组内为空\n if (!text.text.length) {\n this.removeEmptyText(text);\n } else {\n this.selectionState.resetRange(text, startInputOffset + data.data.length);\n }\n }\n\n\n /**\n * backspace,向前删除\n */\n onBackspace(evt: KeyboardEvent): void {\n const { startControl, startOffset, collapsed } = this.selectionState;\n if (!startControl) {\n throw new Error('startControl is null')\n }\n const eventElement = new KeyboradElementEvent(this.docCtx);\n eventElement.key = 'backspace';\n eventElement.source = startControl;\n eventElement.sourceEvent = evt;\n eventElement.sourceOffset = startOffset;\n const res = DocumentEvent.invokeEvent('BackspaceKey', startControl, eventElement, 'Capture', this.docCtx);\n if (res && res.isCancel) {\n return;\n }\n this.docComment.updateComments();\n if (collapsed) {\n this.onBackspaceElement(startControl, startOffset);\n } else {\n this.onRangeDelete();\n }\n }\n\n /**\n * delete,向后删除\n * @param evt\n */\n onDeleteKeyHandler(evt: KeyboardEvent): void {\n const { startControl, startOffset, collapsed } = this.selectionState;\n const eventElement = new KeyboradElementEvent(this.docCtx);\n eventElement.key = 'delete';\n eventElement.source = startControl;\n eventElement.sourceEvent = evt;\n eventElement.sourceOffset = startOffset;\n const res = DocumentEvent.invokeEvent('DeleteKey', startControl, eventElement, 'Capture', this.docCtx);\n if (res && res.isCancel) {\n return;\n }\n if (collapsed) {\n this.onKeyDeleteElement(startControl, startOffset);\n } else {\n this.onRangeDelete();\n }\n }\n\n /**\n * 根据选择范围删除\n */\n private onRangeDelete(): { cursorEle: Element, cursorOffset: number } {\n const { selectedRange } = this.selectionState;\n if (!selectedRange) {\n throw new Error('selectionRange is null')\n }\n //用于刷新后定位光标\n let startPointElement: Element;\n let startPointOffset = 0;\n if (selectedRange.isFullSelected) {\n //某个容器的内容被全部选中\n if (selectedRange.target instanceof BlockContainerElement) {\n startPointElement = selectedRange.target;\n startPointOffset = 0;\n }\n //内容块被选中,需要向上寻找内容块容器\n else if (selectedRange.target instanceof BlockContentElement) {\n const parentContainer = ElementUtil.getParent(selectedRange.target, (item) => item instanceof BlockContainerElement) as BlockContainerElement;\n if (parentContainer) {\n startPointElement = parentContainer;\n startPointOffset = 0;\n } else {\n throw new Error('未能向上寻找到定位的内容块容器')\n }\n } else {\n throw new Error('未知条件区间')\n }\n } else {\n const startRange = RangeUtil.getStartRangeTarget(selectedRange) as SelectionContentRange;\n const endRange = RangeUtil.getEndRangeTarget(selectedRange) as SelectionContentRange;\n if (startRange.isFullSelected) {\n startPointElement = ElementUtil.getRecursionPrevSiblingElement(startRange.target, false, true) as LeafElement;\n startPointOffset = -1;\n //判断结束选区和开始选区是否在一个段落中,尽量落在同一段落中\n if (!startPointElement || ElementUtil.isInSameParagraph(startRange.target, endRange.target)) {\n if (!endRange.isFullSelected) {\n startPointElement = endRange.target;\n startPointOffset = 0;\n }\n }\n } else {\n startPointElement = startRange.target as LeafElement;\n startPointOffset = startRange.startOffset;\n }\n }\n if (this.viewOptions.docMode === DocMode.FormEdit) {\n this.deleteRangeInFormEdit(selectedRange)\n } else {\n this.deleteRange(selectedRange);\n }\n this.selectionState.resetRange(startPointElement, startPointOffset);\n return { cursorEle: startPointElement, cursorOffset: startPointOffset };\n }\n\n /**\n * backspace删除\n * @param control\n * @param offset\n * @returns\n */\n private onBackspaceElement(control: LeafElement, offset: number): void {\n this.selectionState.clear();\n if (offset === 0) {\n const prevEle = ElementUtil.getRecursionPrevSiblingElement(control, false, true);\n if (!prevEle) {\n this.selectionState.resetRange(control, 0);\n return;\n }\n if (ElementUtil.isInSameParagraph(control, prevEle)) {\n if (ElementUtil.getPrevSiblingElement(control) === prevEle) {\n this.onBackspaceElement(prevEle, ElementUtil.getElementEndOffset(prevEle));\n } else {\n this.selectionState.resetRange(prevEle, -1);\n }\n } else {\n //需要判断是否是兄弟段落,兄弟段落,需要合并\n const prevPara = ElementUtil.getParentByType(prevEle, ParagraphElement) as ParagraphElement;\n const currPara = ElementUtil.getParentByType(control, ParagraphElement) as ParagraphElement;\n //表明是紧挨着的两个段落,要进行段落合并\n if (ElementUtil.getPrevSiblingElement(currPara) === prevPara) {\n if (this.selectionState.enableTrackChanges) {\n this.selectionState.resetRange(prevEle, -1);\n return;\n }\n this.combineParagraph(prevPara, currPara, control);\n } else {\n //不是紧挨着的段落,则前一个段落是位于另一个容器里,例如:处于单元格内的段落\n //则不向前定位\n this.selectionState.resetRange(control, offset)\n }\n }\n } else {\n if (control instanceof TextGroupElement) {\n this.onDeleteText(control, offset - 1, 1);\n if (!control.textMeasures.length) {\n this.removeEmptyText(control);\n } else {\n this.selectionState.resetRange(control, offset - 1);\n }\n } else {\n if (control.parent instanceof InlineGroupInputElement && control instanceof DataDecorateElement) {\n const dataEle = control.parent;\n //空数据元,并且当前光标处于数据元开始位置\n if (this.canDeleteInlineGroup(dataEle)) {\n this.setCurosrForDeleteAction(dataEle);\n dataEle.remove();\n return;\n }\n if (control.isPrefix && this.viewOptions.docMode === DocMode.FormEdit) {\n if (this.jumpToPrevDataElement(dataEle)) {\n return;\n }\n }\n }\n if (control.isDecorate) {\n this.onBackspaceElement(control, 0);\n return;\n }\n this.removeElement(control);\n }\n }\n }\n\n /**\n * 跳到上一个数据元中\n * @param currEle\n */\n private jumpToPrevDataElement(currEle: InlineGroupInputElement): boolean {\n if (this.viewOptions.docMode !== DocMode.FormEdit) {\n return false;\n }\n const prevEle = ElementUtil.getPrevDataElement(this.docCtx, currEle as DataElementInlineGroup);\n if (!prevEle) {\n return false;\n }\n if (prevEle) {\n this.selectionState.resetRange(prevEle.endDecorate, 0);\n return true;\n }\n return false;\n }\n\n /**\n * delete删除\n * @param control\n * @param offset\n * @returns\n */\n private onKeyDeleteElement(control: LeafElement, offset: number): void {\n this.selectionState.clear();\n if (offset === ElementUtil.getElementEndOffset(control)) {\n const nextEle = ElementUtil.getRecursionNextSiblingElement(control, false, true);\n if (!nextEle) {\n this.selectionState.resetRange(control, -1);\n return;\n }\n if (ElementUtil.isInSameParagraph(control, nextEle)) {\n if (ElementUtil.getNextSiblingElement(control) === nextEle) {\n this.onKeyDeleteElement(nextEle, 0);\n } else {\n this.selectionState.resetRange(nextEle, 0);\n }\n } else {\n //需要判断是否是兄弟段落,兄弟段落,需要合并\n const nextPara = ElementUtil.getParentByType(nextEle, ParagraphElement) as ParagraphElement;\n const currPara = ElementUtil.getParentByType(control, ParagraphElement) as ParagraphElement;\n //表明是紧挨着的两个段落,要进行段落合并\n if (ElementUtil.getNextSiblingElement(currPara) === nextPara) {\n if (this.selectionState.enableTrackChanges) {\n this.selectionState.resetRange(nextEle, 0);\n return;\n }\n this.combineParagraph(nextPara, currPara, control);\n } else {\n //不是紧挨着的段落,则前一个段落是位于另一个容器里,例如:处于单元格内的段落\n //则不向前定位\n this.selectionState.resetRange(control, offset)\n }\n }\n } else {\n if (control instanceof TextGroupElement) {\n this.onDeleteText(control, offset, 1);\n if (!control.textMeasures.length) {\n this.removeEmptyText(control);\n } else {\n this.selectionState.resetRange(control, offset);\n }\n } else {\n if (control.parent instanceof DataElementInlineGroup && control instanceof DataDecorateElement) {\n const dataEle = control.parent as DataElementInlineGroup;\n //空数据元,并且当前光标处于数据元开始位置\n if (control.isPrefix) {\n if (this.canDeleteInlineGroup(dataEle)) {\n this.setCurosrForDeleteAction(dataEle);\n dataEle.remove();\n } else {\n this.selectionState.resetRange(control, -1);\n }\n return;\n } else if (!control.isPrefix && dataEle.length === 2) {\n this.selectionState.resetRange(dataEle.endDecorate, -1);\n return;\n }\n }\n if (control.isDecorate) {\n //this.onKeyDeleteElement(control, -1);\n return;\n }\n this.removeElement(control);\n }\n }\n }\n\n /**\n * 判断是否可以删除数据组\n * @param dataEle\n * @private\n */\n private canDeleteInlineGroup(dataEle: InlineGroupInputElement): boolean {\n if (this.viewOptions.docMode === DocMode.FormEdit) {\n return false;\n }\n return dataEle.length === 2;\n }\n\n private onDeleteText(text: TextGroupElement, offset: number, len: number): void {\n if (this.selectionState.enableTrackChanges) {\n this.updateDeletedTrackText(text, offset, len)\n } else {\n text.splice(offset, len)\n }\n }\n\n private onDeleteItem(item: LeafElement): void {\n if (this.selectionState.enableTrackChanges) {\n //删除符号不进行留痕\n if (item.type === 'psym') {\n return\n }\n this.onTrackDeleteElement(item);\n } else {\n item.remove();\n item.destroy();\n }\n }\n\n\n /**\n * 当前元素是否在留痕元素内\n * @param target\n * @param trackType\n * @returns\n */\n private isInCurrentUserTrack(target: Element, trackType: TrackRunTypeEnum): boolean {\n if (target.parent instanceof TrackRunElement && target.parent.type === trackType && target.parent.props.userId === this.viewOptions.editUser.id) {\n return true;\n }\n return false;\n }\n\n private isInTrackElement(target: Element, trackType: TrackRunTypeEnum): boolean {\n if (target.parent instanceof TrackRunElement && target.parent.type === trackType) {\n return true;\n }\n return false;\n }\n\n\n /**\n * 留痕除文本以外的其他元素\n * @param control\n */\n private onTrackDeleteElement(target: LeafElement): void {\n const parent = target.parent;\n if (this.isInTrackElement(target, TrackRunTypeEnum.Deleted)) {\n return;\n }\n //当前用户增加的内容,内容直接删除不需要留痕\n if (this.isInCurrentUserTrack(target, TrackRunTypeEnum.Inserted)) {\n target.remove();\n this.removeEmtpyInlineBlock(parent);\n return;\n }\n //target.remove();\n const trackEle = this.getNextTrackElement(target, TrackRunTypeEnum.Deleted);\n trackEle.addChild(target.clone(true), 0);\n target.remove();\n this.removeEmtpyInlineBlock(parent);\n }\n\n /**\n * 更新文本删除留痕\n */\n private updateDeletedTrackText(target: TextGroupElement, offset: number, len: number): void {\n if (this.isInTrackElement(target, TrackRunTypeEnum.Deleted)) {\n return;\n }\n //当前用户增加的内容,当前用户删除时不需要留痕\n if (this.isInCurrentUserTrack(target, TrackRunTypeEnum.Inserted)) {\n target.splice(offset, len);\n return;\n }\n //全部被删除\n if (offset === 0 && len === target.textMeasures.length) {\n const trackInputText = this.getNextTrackInputElement(target, TrackRunTypeEnum.Deleted);\n trackInputText.text = target.text + trackInputText.text;\n target.splice(0, target.textMeasures.length);\n //target.remove();\n return;\n }\n const { leftElement } = this.splitText(target, offset + len);\n target = leftElement as never;\n let trackText: TextGroupElement = this.getNextTrackInputElement(target, TrackRunTypeEnum.Deleted);\n const spText = target.spliceText(target.textMeasures.length - len, target.textMeasures.length, true);\n trackText.splice(0, 0, spText?.text);\n }\n\n\n private getNextTrackInputElement(target: Element, trackType: TrackRunTypeEnum): TextGroupElement {\n const trackElement = ElementUtil.getNextSiblingTrackElement(target, trackType, this.viewOptions.editUser.id)\n if (trackElement) {\n const firstEle = trackElement.getChild(0);\n if (firstEle && firstEle instanceof TextGroupElement) {\n return firstEle;\n } else {\n const newInput = new TextGroupElement();\n trackElement.addChild(newInput, 0);\n target.props.clone(newInput.props);\n return newInput;\n }\n } else {\n const {\n trackElement,\n newTextGroup\n } = this.createTextTrackElement(target, target.props, TrackRunTypeEnum.Deleted);\n target.parent.addChild(trackElement, target.getIndex() + 1);\n return newTextGroup;\n }\n }\n\n\n private getNextTrackElement(target: Element, trackType: TrackRunTypeEnum): TrackRunElement {\n let trackElement = ElementUtil.getNextSiblingTrackElement(target, trackType, this.viewOptions.editUser.id)\n if (!trackElement) {\n trackElement = this.createTrackElement(trackType);\n target.parent.addChild(trackElement, target.getIndex() + 1);\n }\n return trackElement;\n }\n\n\n /**\n * 删除元素并定位光标\n * @param control\n * @returns\n */\n private removeElement(control: LeafElement): void {\n const prevEle = ElementUtil.getRecursionPrevSiblingElement(control, false, true);\n if (!prevEle) {\n const nextEle = ElementUtil.getRecursionNextSiblingElement(control, true, true);\n if (nextEle) {\n this.selectionState.resetRange(nextEle, 0);\n control.remove();\n return;\n }\n return;\n }\n if (ElementUtil.isInSameParagraph(control, prevEle)) {\n this.selectionState.resetRange(prevEle, -1);\n control.remove();\n return;\n } else {\n const nextEle = ElementUtil.getRecursionNextSiblingElement(control, true, true);\n if (nextEle && ElementUtil.getPrevSiblingElement(nextEle) === control) {\n this.selectionState.resetRange(nextEle, 0);\n control.remove();\n return;\n } else {\n this.selectionState.resetRange(prevEle, -1);\n control.remove();\n return;\n }\n }\n }\n\n\n /**\n * 回车事件\n */\n onEnter(): void {\n const { startControl } = this.selectionState;\n const paragraph = ElementUtil.getParentByType(startControl, ParagraphElement) as ParagraphElement;\n const breakPara = this.splitCurrentParagraph();\n //选中的是一个元素\n if (breakPara === paragraph) {\n const clonePara = paragraph.clone(false);\n breakPara.parent.addChild(clonePara, breakPara.getIndex());\n }\n this.selectionState.resetRange(breakPara, 0);\n\n }\n\n /**\n * 插入表格\n * @param tb\n * @returns\n */\n insertTable(tb: TableElement): void {\n const breakPara = this.splitCurrentParagraph();\n breakPara.parent.addChild(tb, breakPara.getIndex());\n this.selectionState.resetRange(tb, 0);\n }\n\n /**\n * 分割当前段落用于插入表格或者粘贴的内容\n * @param insertItems 分割后插入的内容,内容需要是block或者表格对象\n */\n private splitCurrentParagraph(): ParagraphElement {\n const { startControl, startOffset } = this.selectionState;\n const paragraph = ElementUtil.getParentByType(startControl, ParagraphElement) as ParagraphElement;\n const paraContainer = paragraph.parent;\n //如果选中的是段落第一个元素\n const firstLeaf = ElementUtil.getFirstLeafElement(paragraph);\n if ((startControl === firstLeaf && startOffset === 0) || (startControl === firstLeaf && startControl instanceof PSymbolElement)) {\n //this.selectionState.resetRange(paragraph, 0);\n return paragraph;\n }\n const last = ElementUtil.getLastLeafElement(paragraph) as LeafElement;\n const selectedParaRange = RangeUtil.getSelctionRange(startControl, startOffset, last, 1, paragraph);\n selectedParaRange.isFullSelected = false;\n const breakPara = ElementUtil.cloneRange(selectedParaRange, true) as ParagraphElement;\n ElementUtil.fixParagraphContent(paragraph);\n ElementUtil.fixParagraphContent(breakPara);\n paraContainer.addChild(breakPara, paragraph.getIndex() + 1);\n //paraContainer.addChild(tb, breakPara.getIndex());\n //this.selectionState.resetRange(breakPara, 0);\n return breakPara;\n }\n\n /**\n * 合并段落\n */\n combineParagraph(prevPara: ParagraphElement, currPara: ParagraphElement, currElement: Element): void {\n const prevParaLength = prevPara.length;\n for (let i = 0; i < currPara.length; i++) {\n const child = currPara.getChild(i).clone(true);\n prevPara.addChild(child);\n }\n //currPara.remove();\n const currParaContainer = currPara.parent;\n currPara.destroy();\n currParaContainer.removeChild(currPara);\n this.selectionState.resetRange(prevPara.getChild(prevParaLength), 0);\n }\n\n /**\n * 删除选中的区域内容\n * @param range\n */\n deleteRange(range: SelectionContentRange): void {\n const { selectedChildren } = range;\n for (let i = selectedChildren.length - 1; i >= 0; i--) {\n const childRange = selectedChildren[i];\n const { target: childTarget, isFullSelected: childFullSelected } = childRange;\n if (childTarget instanceof LeafElement && !childTarget.isDecorate) {\n if (childFullSelected) {\n this.onDeleteItem(childTarget);\n } else if (childTarget instanceof TextGroupElement) {\n const { startOffset, endOffset } = childRange;\n this.onDeleteText(childTarget, startOffset, endOffset - startOffset);\n }\n } else if (childTarget instanceof BranchElement) {\n //留痕模式\n if (this.selectionState.enableTrackChanges) {\n this.deleteRange(childRange);\n } else {\n //表格全选状态时,执行删除操作\n if (childTarget instanceof TableElement && childFullSelected) {\n childTarget.remove();\n childTarget.destroy();\n }\n //段落全选状态时,执行删除操作\n else if (childTarget instanceof BlockContentElement && childFullSelected) {\n childTarget.remove();\n childTarget.destroy();\n } else if (childTarget instanceof InlineGroupElement && childFullSelected) {\n childTarget.remove();\n childTarget.destroy();\n } else {\n this.deleteRange(childRange);\n }\n }\n }\n }\n }\n\n\n /**\n * 表单区域删除处理\n * @param range\n * @returns\n */\n private deleteRangeInFormEdit(range: SelectionContentRange): void {\n const dataElement = ElementUtil.getDataElement(range.target);\n //在数据元内删除,调用普通的删除处理\n if (dataElement) {\n this.deleteRange(range);\n return;\n }\n //在数据元外删除\n else {\n this.loopForDelDataEleRange(range);\n }\n }\n\n /**\n * 表单模式:删除选中的区域内容\n */\n private loopForDelDataEleRange(range: SelectionContentRange): void {\n const { selectedChildren } = range;\n for (let i = selectedChildren.length - 1; i >= 0; i--) {\n const childRange = selectedChildren[i];\n const { target: childTarget } = childRange;\n if (childTarget instanceof BranchElement) {\n if (childTarget instanceof DataElementInlineGroup) {\n const dataEleProps = childTarget.props as DataEleBaseProps;\n //数据元可编辑\n if (dataEleProps.editable) {\n this.deleteRange(childRange);\n }\n } else {\n this.loopForDelDataEleRange(childRange)\n }\n }\n }\n }\n\n\n /**\n * 向目标移动元素\n * @param sourceElement\n * @param moveElement\n */\n moveElement(targetElement: Element, targetOffset: number, moveElement: Element, moveOffset: number, ss: SelectionState): void {\n moveElement.remove();\n if (targetElement instanceof TextGroupElement) {\n const { leftElement, rightElement } = this.splitText(targetElement, targetOffset);\n if (leftElement) {\n leftElement.parent.addChild(moveElement, leftElement.getIndex() + 1)\n } else if (rightElement) {\n rightElement.parent.addChild(moveElement, rightElement.getIndex())\n }\n } else {\n targetElement.parent.addChild(moveElement, targetElement.getIndex() + targetOffset);\n }\n ss.resetRange(moveElement, moveOffset);\n }\n\n /**\n * 向指定的目标插入元素\n * @param targetElement\n * @param targetOffset\n * @param destEleArray\n */\n insertElement(targetElement: Element, targetOffset: number, destEleArray: Array<Element>): Element | null {\n let lastEle!: Element | null;\n if (targetElement instanceof TextGroupElement) {\n const { leftElement, rightElement } = this.splitText(targetElement, targetOffset);\n if (leftElement) {\n for (let i = 0; i < destEleArray.length; i++) {\n lastEle = destEleArray[i];\n leftElement.parent.addChild(lastEle, leftElement.getIndex() + 1 + i);\n }\n } else if (rightElement) {\n for (let i = 0; i < destEleArray.length; i++) {\n lastEle = destEleArray[i]\n rightElement.parent.addChild(lastEle, rightElement.getIndex());\n }\n }\n } else {\n for (let i = 0; i < destEleArray.length; i++) {\n lastEle = destEleArray[i]\n targetElement.parent.addChild(lastEle, targetElement.getIndex() + targetOffset);\n }\n }\n return lastEle;\n }\n\n\n /**\n * 根据开始位置和结束位置,将字符切割成指定的区间\n * @param splitTextUnit\n * @param start\n * @param end\n * @returns\n */\n static splitTextGroupByRange(text: TextGroupElement, start: number, end: number): TextGroupElement | null {\n end = end === -1 ? text.textMeasures.length : end;\n if (start === end) {\n return null;\n }\n if (start === 0 && end === text.textMeasures.length) {\n return text;\n }\n if (start === text.textMeasures.length) {\n return null;\n }\n let lastTextGroup = text.spliceText(end, -1, true);\n let middleTextGroup = text.spliceText(start, -1, true);\n if (lastTextGroup) {\n text.parent.addChild(lastTextGroup, text.getIndex() + 1);\n }\n if (!middleTextGroup) {\n throw new Error('middleText is null');\n }\n text.parent.addChild(middleTextGroup, text.getIndex() + 1);\n\n if (text.textMeasures.length === 0) {\n text.remove();\n text.destroy();\n }\n return middleTextGroup;\n }\n\n splitText(text: TextGroupElement, offset: number): { leftElement: TextGroupElement | null, rightElement: TextGroupElement | null } {\n offset = offset == -1 ? text.textMeasures.length : offset;\n if (offset === text.textMeasures.length) {\n return {\n leftElement: text,\n rightElement: null\n }\n }\n if (offset === 0) {\n return {\n leftElement: null,\n rightElement: text\n }\n }\n const rightText = text.spliceText(offset, -1, true);\n if (rightText) {\n text.parent.addChild(rightText, text.getIndex() + 1);\n }\n let leftText: TextGroupElement | null = text;\n if (text.textMeasures.length === 0) {\n text.remove();\n leftText = null;\n }\n return {\n leftElement: leftText,\n rightElement: rightText\n }\n }\n\n /**\n * 设置选中的文本样式\n * @param ss\n * @param setterFunc\n * @returns\n */\n static setTextStyle(ss: SelectionState, setterFunc: (tp: TextProps) => void): void {\n const range = ss.selectedRange;\n if (!range || ss.collapsed) {\n return;\n }\n const newSelectionRange = new SelectionRange();\n const startRange = ElementUtil.getFirstSelectedRange(range);\n const endRange = ElementUtil.getLastSelectedRange(range);\n this.recursionSetRangeTextStyle(range, setterFunc);\n if (startRange === endRange) {\n if (startRange.isFullSelected) {\n newSelectionRange.setStart(startRange.target, 0);\n newSelectionRange.setEnd(startRange.target, -1);\n }\n if (startRange.target instanceof TextGroupElement) {\n const startSelectedOffset = ss.startOffset;\n const endSelectedOffset = ss.endOffset;\n const middleElement = this.splitTextGroupByRange(startRange.target, startSelectedOffset, endSelectedOffset);\n if (middleElement) {\n setterFunc(middleElement.props);\n newSelectionRange.setStart(middleElement, 0);\n newSelectionRange.setEnd(middleElement, -1);\n }\n }\n } else {\n if (startRange.isFullSelected) {\n newSelectionRange.setStart(startRange.target, 0);\n } else {\n if (startRange.target instanceof TextGroupElement) {\n const middleElement = this.splitTextGroupByRange(startRange.target, startRange.startOffset, -1);\n if (middleElement) {\n setterFunc(middleElement.props);\n newSelectionRange.setStart(middleElement, 0);\n } else {\n newSelectionRange.setStart(startRange.target, 0);\n }\n } else {\n newSelectionRange.setStart(startRange.target, startRange.startOffset);\n }\n }\n if (endRange.isFullSelected) {\n newSelectionRange.setEnd(endRange.target, -1);\n } else {\n if (endRange.target instanceof TextGroupElement) {\n const middleElement = this.splitTextGroupByRange(endRange.target, 0, endRange.endOffset);\n if (middleElement) {\n setterFunc(middleElement.props);\n newSelectionRange.setEnd(middleElement, -1);\n } else {\n newSelectionRange.setStart(endRange.target, 0);\n }\n\n } else {\n newSelectionRange.setEnd(endRange.target, endRange.endOffset);\n }\n }\n }\n ss.addRange(newSelectionRange);\n }\n\n private static recursionSetRangeTextStyle(range: SelectionContentRange, setterFunc: (tp: TextProps) => void): void {\n RangeUtil.recursionTraversalRangeHandler(range, (itemRange) => {\n if (itemRange.target instanceof TextGroupElement && itemRange.isFullSelected) {\n setterFunc(itemRange.target.props)\n }\n })\n }\n\n\n static setParaAlign(ss: SelectionState, setterFunc: (tp: ParagraphProps) => void): void {\n if (ss.collapsed && ss.startControl) {\n const para = ElementUtil.getParentByType(ss.startControl, ParagraphElement);\n if (para) {\n setterFunc(para.props);\n }\n } else {\n const range = ss.selectedRange;\n if (!range) {\n return;\n }\n RangeUtil.recursionTraversalRangeHandler(range, (itemRange) => {\n if (itemRange.target instanceof ParagraphElement) {\n setterFunc(itemRange.target.props);\n }\n })\n }\n\n }\n\n\n /**\n * 复制\n * @param evt\n * @returns\n */\n onCopy(evt: ClipboardEvent): void {\n evt.preventDefault();\n const copySerializeStr = ElementSerialize.getSelectedJSON(this.selectionState, this.viewOptions);\n if (!copySerializeStr) {\n return;\n }\n evt.clipboardData?.setData('doc/plain', copySerializeStr);\n const copyStr = ElementSerialize.getSelectedText(this.selectionState, this.viewOptions);\n evt.clipboardData?.setData('text/plain', copyStr);\n }\n\n /**\n * 剪切\n * @param evt\n */\n onCut(evt: ClipboardEvent): void {\n this.onCopy(evt);\n this.onRangeDelete();\n }\n\n /**\n * 粘贴\n * @param evt\n * @returns\n */\n onPaste(evt: ClipboardEvent): void {\n evt.preventDefault();\n let pasteText = evt.clipboardData?.getData('text/plain');\n const pasteData = evt.clipboardData?.getData('doc/plain');\n if (!pasteData) {\n if (pasteText) {\n this.pastePlainText(pasteText);\n }\n return;\n }\n const pasteElement = this.eleReader.readElement(JSON.parse(pasteData));\n if (!pasteElement) {\n console.log('粘贴反序列化数据失败', pasteData);\n return;\n }\n const { collapsed } = this.selectionState;\n let { startControl, startOffset } = this.selectionState;\n if (!collapsed) {\n //TODO:如果一个容器内的元素被全部删除,则返回 null\n // const { cursorEle, cursorOffset } = this.onRangeDelete();\n // startControl = cursorEle;\n // startOffset = cursorOffset;\n }\n if (!startControl) {\n return;\n }\n //表单模式:如果复制的是单格式的文本,需要序列化为纯文本处理\n if (this.viewOptions.docMode === DocMode.FormEdit) {\n const pasteString = ElementSerialize.serializeString(pasteElement, { all: false });\n if (pasteString) {\n this.pastePlainText(pasteString);\n }\n return;\n }\n if (pasteElement instanceof ParagraphElement || pasteElement instanceof InlineGroupElement) {\n const children: Array<Element> = [];\n if (pasteElement instanceof ParagraphElement) {\n children.push(...ElementUtil.getChildrenElements(pasteElement));\n } else if (pasteElement instanceof InlineGroupElement) {\n children.push(pasteElement);\n }\n if (!children.length) {\n throw new Error('段落子元素为空');\n }\n const lastEle = this.insertElement(startControl, startOffset, children) as Element;\n this.selectionState.resetRange(lastEle, -1);\n return;\n }\n console.log('粘贴:' + pasteData);\n }\n\n insertSoftBr(): void {\n let { startControl, startOffset } = this.selectionState;\n const lastEle = this.insertElement(startControl, startOffset, [new BreakElement()]) as Element;\n const focusEle = ElementUtil.getNextSiblingElement(lastEle);\n if (focusEle) {\n this.selectionState.resetRange(focusEle, 0);\n }\n\n }\n\n /**\n * 处理黏贴的纯文本\n * @param text\n */\n private pastePlainText(text: string): void {\n const textItems = text.split(/\\r?\\n/);\n const { startControl, startOffset } = this.selectionState;\n if (this.viewOptions.docMode === DocMode.FormEdit || textItems.length === 1 || IsInSideInlineGroupInputElement(startControl, startOffset)) {\n text = text.replace(/[\\n\\r]/g, '');\n this.newInput({\n data: text,\n compositionStartInfo: {\n element: startControl,\n offset: startOffset\n }\n })\n } else {\n const breakPara = this.splitCurrentParagraph();\n for (let i = 0; i < textItems.length; i++) {\n const newPara = breakPara.clone(false) as ParagraphElement;\n const inputTextProps = newPara.props.textProps;\n const newTextEle = ElementUtil.getNewTextGroup(inputTextProps);\n newTextEle.text = textItems[i];\n newPara.addChild(newTextEle, 0);\n breakPara.parent.addChild(newPara, breakPara.getIndex());\n }\n this.selectionState.resetRange(breakPara, 0);\n }\n }\n\n /**\n * 设置当前段落项目符号类型\n */\n setParagraphNumberType(): void {\n const { startControl } = this.selectionState;\n if (!startControl) {\n return;\n }\n const para = ElementUtil.getParentByType(startControl, ParagraphElement) as ParagraphElement;\n if (para.props.numberType >= 0) {\n para.props.numberType = -1;\n para.props.indent = 0;\n } else {\n para.props.numberType = 0;\n para.props.indent = 15;\n }\n }\n\n /**\n * 插入批注\n */\n insertComment(): void {\n const { startControl, startOffset, endControl, endOffset, collapsed } = this.selectionState;\n if (collapsed || !startControl || !endControl) {\n return;\n }\n const id = nanoid(5);\n const startCommMark = new CommentElement();\n startCommMark.props.id = id;\n startCommMark.props.markType = 'start';\n\n const endCommMark = new CommentElement();\n endCommMark.props.id = id;\n endCommMark.props.markType = 'end';\n\n this.insertElement(endControl, endOffset, [endCommMark])\n this.insertElement(startControl, startOffset, [startCommMark])\n\n const commContent = new CommContentElement();\n commContent.props.id = id;\n commContent.props.createId = this.viewOptions.editUser.id;\n commContent.props.createName = this.viewOptions.editUser.name;\n commContent.props.createDate = new Date();\n const pos = this.docComment.getCommMarkIndex(startCommMark);\n if (pos < 0) {\n throw new Error('获取插入的批注位置不正确');\n }\n this.docCtx.document.commentsContainerElement.addChild(commContent, pos);\n this.selectionState.clear();\n\n this.docComment.afterCommentsChanged();\n }\n\n validate(): boolean {\n const dataEleList = this.docCtx.document.treeFilter(item => item instanceof DataElementInlineGroup) as Array<DataElementInlineGroup>;\n const errorEleList = dataEleList.map(item => ({ error: item.validate(), ele: item })).filter(item => item.error);\n if (!errorEleList.length) {\n return true;\n }\n errorEleList.forEach(item => {\n const id = nanoid(5);\n const startCommMark = new CommentElement();\n startCommMark.props.id = id;\n startCommMark.props.markType = 'start';\n\n const endCommMark = new CommentElement();\n endCommMark.props.id = id;\n endCommMark.props.markType = 'end';\n\n item.ele.addChild(startCommMark, 0);\n item.ele.addChild(endCommMark, item.ele.length)\n const caption = CommonUtil.nullToString(item.ele.props.caption);\n const validateElement = new ValidateElement();\n validateElement.props.title = caption + '验证';\n validateElement.props.id = id;\n validateElement.setContent(item.error);\n\n const pos = this.docComment.getCommMarkIndex(startCommMark);\n this.docCtx.document.commentsContainerElement.addChild(validateElement, pos);\n\n\n })\n this.docCtx.selectionState.clear();\n this.docComment.afterCommentsChanged();\n\n return false;\n }\n\n /**\n * 移除空字符串\n * @param text\n */\n removeEmptyText(text: TextGroupElement): void {\n //const nextLeafElementInPara = ElementUtil.getRecursionNextSiblingElement(text, true, true); getComputedStyle\n this.setCurosrForDeleteAction(text);\n const parent = text.parent;\n text.remove();\n this.removeEmtpyInlineBlock(parent);\n }\n\n setCurosrForDeleteAction(control: Element): void {\n const cursorInfo = this.getCursorElementByDeleteAction(control);\n if (cursorInfo) {\n this.selectionState.resetRange(cursorInfo.ele, cursorInfo.offset);\n } else {\n this.selectionState.clear();\n }\n }\n\n getCursorElementByDeleteAction(control: Element): { ele: LeafElement, offset: number } | null {\n const prevLeafElementInPara = ElementUtil.getRecursionPrevSiblingElement(control, false, true);\n //判断是否为同一段落\n if (prevLeafElementInPara && ElementUtil.isInSameParagraph(prevLeafElementInPara, control)) {\n return {\n ele: prevLeafElementInPara,\n offset: ElementUtil.getElementEndOffset(prevLeafElementInPara)\n }\n }\n //同一段落其他元素\n const nextLeafElementInPara = ElementUtil.getRecursionNextSiblingElement(control, true, true);\n if (nextLeafElementInPara) {\n return {\n ele: nextLeafElementInPara,\n offset: 0\n }\n }\n //上一段落\n if (prevLeafElementInPara) {\n return {\n ele: prevLeafElementInPara,\n offset: prevLeafElementInPara instanceof PSymbolElement ? 0 : ElementUtil.getElementEndOffset(prevLeafElementInPara)\n }\n }\n return null;\n }\n\n /**\n * 移除空行内标签\n * @param ele\n */\n removeEmtpyInlineBlock(ele: Element): void {\n if (ele instanceof InlineGroupElement && ele.length === 0) {\n const parent = ele.parent;\n ele.remove();\n this.removeEmtpyInlineBlock(parent);\n }\n }\n\n /**\n * 插入强制换页符号\n */\n insertPageBreakPara(): void {\n const { startControl } = this.selectionState;\n const currPara = ElementUtil.getParentByType(startControl, ParagraphElement)\n if (!currPara) {\n return;\n }\n if (currPara.parent instanceof DocumentBodyElement) {\n const pageBreak = new ParagraphElement();\n pageBreak.props.pageBreak = true;\n pageBreak.props.textAlign = 'center';\n pageBreak.parent.addChild(pageBreak);\n }\n }\n\n\n}\n"]}
@@ -1,40 +0,0 @@
1
- import { DocumentBodyElement } from "./impl/document/doc-body-impl";
2
- import { DocumentBodyPartElement } from "./impl/document/doc-body-part-impl";
3
- /**
4
- * 文档合并
5
- */
6
- export class DocumentCombine {
7
- /**
8
- * 合并模板文档
9
- * 用于设置合并后,页眉页脚等统一部分
10
- */
11
- mainTemplate;
12
- docParts = [];
13
- /**
14
- * 添加需要合并的文档部分
15
- */
16
- add(docPart, id) {
17
- this.docParts.push({ doc: docPart, docId: id });
18
- }
19
- dispose() {
20
- this.docParts.length = 0;
21
- }
22
- /**
23
- * 用于合并文档计算
24
- */
25
- load() {
26
- const template = this.mainTemplate.clone();
27
- const body = template.find((item) => item instanceof DocumentBodyElement);
28
- body.clearItems();
29
- for (let i = 0; i < this.docParts.length; i++) {
30
- const part = this.docParts[i];
31
- const docPartContainer = new DocumentBodyPartElement();
32
- docPartContainer.props.partId = part.docId;
33
- const docPartBody = part.doc.find(item => item instanceof DocumentBodyElement);
34
- docPartContainer.addChild(docPartBody.clone(true));
35
- body.addChild(docPartContainer);
36
- }
37
- return template;
38
- }
39
- }
40
- //# sourceMappingURL=document-combine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-combine.js","sourceRoot":"lib/","sources":["framework/document-combine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAG7E;;GAEG;AACH,MAAM,OAAO,eAAe;IACxB;;;OAGG;IACH,YAAY,CAAkB;IAE9B,QAAQ,GAAmD,EAAE,CAAC;IAC9D;;OAEG;IACH,GAAG,CAAC,OAAwB,EAAE,EAAU;QACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAA;IACnD,CAAC;IAED,OAAO;QACH,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,IAAI;QACA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY,mBAAmB,CAAwB,CAAC;QACjG,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,gBAAgB,GAAG,IAAI,uBAAuB,EAAE,CAAC;YACvD,gBAAgB,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;YAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,YAAY,mBAAmB,CAAwB,CAAA;YACrG,gBAAgB,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAA;SAClC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ","sourcesContent":["import { DocumentBodyElement } from \"./impl/document/doc-body-impl\";\nimport { DocumentBodyPartElement } from \"./impl/document/doc-body-part-impl\";\nimport { DocumentElement } from \"./impl/document/doc-impl\";\n\n/**\n * 文档合并\n */\nexport class DocumentCombine {\n /**\n * 合并模板文档\n * 用于设置合并后,页眉页脚等统一部分\n */\n mainTemplate!: DocumentElement\n\n docParts: Array<{ doc: DocumentElement, docId: string }> = [];\n /**\n * 添加需要合并的文档部分\n */\n add(docPart: DocumentElement, id: string): void {\n this.docParts.push({ doc: docPart, docId: id })\n }\n\n dispose(): void {\n this.docParts.length = 0;\n }\n\n /**\n * 用于合并文档计算\n */\n load(): DocumentElement {\n const template = this.mainTemplate.clone();\n const body = template.find((item) => item instanceof DocumentBodyElement) as DocumentBodyElement;\n body.clearItems();\n for (let i = 0; i < this.docParts.length; i++) {\n const part = this.docParts[i];\n const docPartContainer = new DocumentBodyPartElement();\n docPartContainer.props.partId = part.docId;\n const docPartBody = part.doc.find(item => item instanceof DocumentBodyElement) as DocumentBodyElement\n docPartContainer.addChild(docPartBody.clone(true));\n body.addChild(docPartContainer)\n }\n return template;\n }\n}"]}
@@ -1,148 +0,0 @@
1
- import { ElementUtil } from "./element-util";
2
- import { CommentElement } from "./impl/comments/comment-element-impl";
3
- import { TextGroupElement } from "./impl/text/text-impl";
4
- import { RangeUtil } from "./range-util";
5
- /**
6
- * 处理文档批注
7
- */
8
- export class DocumentComment {
9
- docCtx;
10
- commMarkList = [];
11
- commContentList = [];
12
- isDirty = true;
13
- constructor(docCtx) {
14
- this.docCtx = docCtx;
15
- }
16
- /**
17
- * 读取审阅标记符号
18
- */
19
- readComments() {
20
- if (!this.isDirty) {
21
- return;
22
- }
23
- const commList = this.docCtx.document.treeFilter(item => item.type === 'comm');
24
- const startCommList = commList.filter(item => item.props.markType === "start");
25
- const endCommList = commList.filter(item => item.props.markType === "end");
26
- const commMaps = startCommList.map(startItem => {
27
- const end = endCommList.find(endItem => endItem.props.id === startItem.props.id);
28
- if (!end) {
29
- throw new Error('未找到匹配的结束审阅符号');
30
- }
31
- return { start: startItem, end };
32
- });
33
- const commContentList = [];
34
- for (let i = 0; i < this.docCtx.document.commentsContainerElement.length; i++) {
35
- const commContent = this.docCtx.document.commentsContainerElement.getChild(i);
36
- const commMap = commMaps.find(item => item.start.props.id === commContent.props.id);
37
- if (!commMap) {
38
- throw new Error('未找到审阅内容对应的审阅符号');
39
- }
40
- commContent.startMark = commMap.start;
41
- commContent.endMark = commMap.end;
42
- commContentList.push(commContent);
43
- }
44
- this.commMarkList = commList;
45
- this.commContentList = commContentList;
46
- this.docCtx.viewOptions.showReviewWindow = this.commContentList.length > 0;
47
- this.isDirty = false;
48
- }
49
- /**
50
- * 执行删除前,需要更新批注节点位置
51
- */
52
- updateComments() {
53
- const { selectionState } = this.docCtx;
54
- const { startControl, startOffset, collapsed, selectedRange } = selectionState;
55
- if (collapsed) {
56
- if (startOffset === 0) {
57
- return;
58
- }
59
- const nextSiblingEle = ElementUtil.getNextSiblingElement(startControl);
60
- //紧挨着的元素
61
- if (nextSiblingEle instanceof CommentElement && nextSiblingEle.props.markType === 'end') {
62
- if (startControl instanceof TextGroupElement) {
63
- if (startControl.textMeasures.length === startOffset) {
64
- this.removeComment(nextSiblingEle.props.id);
65
- }
66
- }
67
- else {
68
- this.removeComment(nextSiblingEle.props.id);
69
- }
70
- }
71
- }
72
- else {
73
- //如果开始批注被选中,则需要移动开始批注元素到选区末尾
74
- //如果结束批注被选中,则需要删除当前批注
75
- if (!selectedRange) {
76
- return;
77
- }
78
- const endRange = RangeUtil.getEndRangeTarget(selectedRange);
79
- if (!endRange) {
80
- return;
81
- }
82
- const commPairs = [];
83
- for (let i = 0; i < this.commContentList.length; i++) {
84
- const { startMark, endMark } = this.commContentList[i];
85
- const commPair = {
86
- startMark,
87
- endMark,
88
- startMarkStatus: RangeUtil.checkElementFullInRange(selectedRange, startMark),
89
- endMarkStatus: RangeUtil.checkElementFullInRange(selectedRange, endMark),
90
- };
91
- commPairs.push(commPair);
92
- }
93
- for (let i = 0; i < commPairs.length; i++) {
94
- const commPair = commPairs[i];
95
- if (commPair.endMarkStatus) {
96
- this.removeComment(commPair.endMark.props.id);
97
- }
98
- else if (commPair.startMarkStatus) {
99
- // const newStartMark = new CommentElement();
100
- // newStartMark.props.id = commPair.startMark.props.id;
101
- // commPair.startMark.isDecorate = false;
102
- // DocumentChange.insertElement(endRange.target, endRange.endOffset, [newStartMark]);
103
- }
104
- }
105
- }
106
- }
107
- /**
108
- * 删除批注
109
- * @param id
110
- */
111
- removeComment(id) {
112
- const commentMarks = this.commMarkList.filter(item => item.props.id === id);
113
- const commentContent = this.commContentList.find(item => item.props.id === id);
114
- commentMarks.forEach(item => item.remove());
115
- commentContent?.remove();
116
- this.afterCommentsChanged();
117
- }
118
- getCommMarkIndex(commMark) {
119
- const markType = commMark.props.markType;
120
- const commList = this.docCtx.document.treeFilter(item => item.type === 'comm');
121
- const startCommList = commList.filter(item => item.props.markType === markType);
122
- return startCommList.indexOf(commMark);
123
- }
124
- /**
125
- * 清除所有批注
126
- */
127
- clearAllComments() {
128
- this.readComments();
129
- for (let i = 0; i < this.commContentList.length; i++) {
130
- this.removeComment(this.commContentList[i].props.id);
131
- }
132
- this.docCtx.selectionState.clear();
133
- }
134
- /**
135
- * 清除所有的验证批注
136
- */
137
- clearAllValidates() {
138
- this.docCtx.document.treeFilter(item => item.type === 'validate').forEach(item => { this.removeComment(item.props.id); });
139
- }
140
- /**
141
- * 批注修改后事件
142
- * 用于标注当前文档的批注发生更改了,不再重复读取批注,提高性能
143
- */
144
- afterCommentsChanged() {
145
- this.isDirty = true;
146
- }
147
- }
148
- //# sourceMappingURL=document-comment.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"document-comment.js","sourceRoot":"lib/","sources":["framework/document-comment.ts"],"names":[],"mappings":"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","sourcesContent":["import { EditorContext } from \"./document-context\";\nimport { ElementUtil } from \"./element-util\";\nimport { CommContentBaseElement, CommContentElement } from \"./impl/comments/comment-content-impl\";\nimport { CommentElement } from \"./impl/comments/comment-element-impl\";\nimport { TextGroupElement } from \"./impl/text/text-impl\";\nimport { RangeUtil } from \"./range-util\";\n\n/**\n * 处理文档批注\n */\nexport class DocumentComment {\n commMarkList: Array<CommentElement> = [];\n commContentList: Array<CommContentBaseElement> = [];\n isDirty: boolean = true;\n constructor(public docCtx: EditorContext) { }\n\n /**\n * 读取审阅标记符号\n */\n readComments(): void {\n if (!this.isDirty) {\n return;\n }\n const commList = this.docCtx.document.treeFilter(item => item.type === 'comm') as Array<CommentElement>;\n const startCommList = commList.filter(item => item.props.markType === \"start\");\n const endCommList = commList.filter(item => item.props.markType === \"end\");\n const commMaps = startCommList.map(startItem => {\n const end = endCommList.find(endItem => endItem.props.id === startItem.props.id);\n if (!end) {\n throw new Error('未找到匹配的结束审阅符号')\n }\n return { start: startItem, end }\n })\n const commContentList: Array<CommContentBaseElement> = [];\n for (let i = 0; i < this.docCtx.document.commentsContainerElement.length; i++) {\n const commContent = this.docCtx.document.commentsContainerElement.getChild(i) as CommContentBaseElement;\n const commMap = commMaps.find(item => item.start.props.id === commContent.props.id);\n if (!commMap) {\n throw new Error('未找到审阅内容对应的审阅符号');\n }\n commContent.startMark = commMap.start;\n commContent.endMark = commMap.end;\n commContentList.push(commContent)\n }\n this.commMarkList = commList;\n this.commContentList = commContentList;\n this.docCtx.viewOptions.showReviewWindow = this.commContentList.length > 0;\n this.isDirty = false;\n }\n\n /**\n * 执行删除前,需要更新批注节点位置\n */\n updateComments(): void {\n const { selectionState } = this.docCtx;\n const { startControl, startOffset, collapsed, selectedRange } = selectionState;\n if (collapsed) {\n if (startOffset === 0) {\n return;\n }\n const nextSiblingEle = ElementUtil.getNextSiblingElement(startControl);\n //紧挨着的元素\n if (nextSiblingEle instanceof CommentElement && nextSiblingEle.props.markType === 'end') {\n if (startControl instanceof TextGroupElement) {\n if (startControl.textMeasures.length === startOffset) {\n this.removeComment(nextSiblingEle.props.id);\n }\n } else {\n this.removeComment(nextSiblingEle.props.id);\n }\n }\n } else {\n //如果开始批注被选中,则需要移动开始批注元素到选区末尾\n //如果结束批注被选中,则需要删除当前批注\n if (!selectedRange) {\n return\n }\n const endRange = RangeUtil.getEndRangeTarget(selectedRange);\n if (!endRange) {\n return\n }\n const commPairs: Array<CommMarkSelectedStatus> = [];\n for (let i = 0; i < this.commContentList.length; i++) {\n const { startMark, endMark } = this.commContentList[i];\n const commPair: CommMarkSelectedStatus = {\n startMark,\n endMark,\n startMarkStatus: RangeUtil.checkElementFullInRange(selectedRange, startMark),\n endMarkStatus: RangeUtil.checkElementFullInRange(selectedRange, endMark),\n };\n commPairs.push(commPair)\n }\n\n for (let i = 0; i < commPairs.length; i++) {\n const commPair = commPairs[i];\n if (commPair.endMarkStatus) {\n this.removeComment(commPair.endMark.props.id);\n } else if (commPair.startMarkStatus) {\n // const newStartMark = new CommentElement();\n // newStartMark.props.id = commPair.startMark.props.id;\n // commPair.startMark.isDecorate = false;\n // DocumentChange.insertElement(endRange.target, endRange.endOffset, [newStartMark]);\n }\n }\n }\n }\n\n\n /**\n * 删除批注\n * @param id \n */\n removeComment(id: string): void {\n const commentMarks = this.commMarkList.filter(item => item.props.id === id);\n const commentContent = this.commContentList.find(item => item.props.id === id);\n commentMarks.forEach(item => item.remove())\n commentContent?.remove();\n this.afterCommentsChanged();\n }\n\n getCommMarkIndex(commMark: CommentElement): number {\n const markType = commMark.props.markType;\n const commList = this.docCtx.document.treeFilter(item => item.type === 'comm') as Array<CommentElement>;\n const startCommList = commList.filter(item => item.props.markType === markType);\n return startCommList.indexOf(commMark);\n }\n\n /**\n * 清除所有批注\n */\n clearAllComments(): void {\n this.readComments();\n for (let i = 0; i < this.commContentList.length; i++) {\n this.removeComment(this.commContentList[i].props.id);\n }\n this.docCtx.selectionState.clear();\n }\n\n /**\n * 清除所有的验证批注\n */\n clearAllValidates(): void {\n this.docCtx.document.treeFilter(item => item.type === 'validate').forEach(item => { this.removeComment(item.props.id) })\n }\n\n /**\n * 批注修改后事件\n * 用于标注当前文档的批注发生更改了,不再重复读取批注,提高性能\n */\n afterCommentsChanged(): void {\n this.isDirty = true;\n }\n\n\n}\n\n\nexport interface CommMarkSelectedStatus {\n startMark: CommentElement,\n endMark: CommentElement,\n startMarkStatus: boolean,\n endMarkStatus: boolean\n}\n"]}