diff --git a/src/editor/core/command/CommandAdapt.ts b/src/editor/core/command/CommandAdapt.ts index a66d7de..e536b66 100644 --- a/src/editor/core/command/CommandAdapt.ts +++ b/src/editor/core/command/CommandAdapt.ts @@ -391,14 +391,14 @@ export class CommandAdapt { const elementList = this.draw.getElementList() if (startIndex === endIndex) { // 选区行信息 - const rangeRow = this.range.getRangeRow() + const rangeRow = this.range.getRangeParagraph() if (!rangeRow) return const positionList = this.position.getPositionList() for (let p = 0; p < positionList.length; p++) { const position = positionList[p] - const rowSet = rangeRow.get(position.pageNo) - if (!rowSet) continue - if (rowSet.has(position.rowNo)) { + const rowArray = rangeRow.get(position.pageNo) + if (!rowArray) continue + if (rowArray.includes(position.rowNo)) { changeElementList.push(elementList[p]) } } diff --git a/src/editor/core/range/RangeManager.ts b/src/editor/core/range/RangeManager.ts index dc3ac2e..6e3bcd0 100644 --- a/src/editor/core/range/RangeManager.ts +++ b/src/editor/core/range/RangeManager.ts @@ -4,7 +4,7 @@ import { TEXTLIKE_ELEMENT_TYPE } from '../../dataset/constant/Element' import { ControlComponent } from '../../dataset/enum/Control' import { IEditorOption } from '../../interface/Editor' import { IElement } from '../../interface/Element' -import { IRange, RangeRowMap } from '../../interface/Range' +import { IRange, RangeRowArray, RangeRowMap } from '../../interface/Range' import { Draw } from '../draw/Draw' import { HistoryManager } from '../history/HistoryManager' import { Listener } from '../listener/Listener' @@ -72,6 +72,52 @@ export class RangeManager { return rangeRow } + // 获取选取段落信息 + public getRangeParagraph(): RangeRowArray | null { + const { startIndex, endIndex } = this.range + if (!~startIndex && !~endIndex) return null + const positionList = this.position.getPositionList() + const elementList = this.draw.getElementList() + const rangeRow: RangeRowArray = new Map() + // 向上查找 + let start = startIndex + while (start > 0) { + if ( + positionList[start].value === ZERO || + (elementList[start].titleId !== elementList[start - 1]?.titleId) + ) break + const { pageNo, rowNo } = positionList[start] + let rowArray = rangeRow.get(pageNo) + if (!rowArray) { + rowArray = [] + rangeRow.set(pageNo, rowArray) + } + if (!rowArray.includes(rowNo)) { + rowArray.unshift(rowNo) + } + start-- + } + // 向下查找 + let end = endIndex + while (end < positionList.length) { + if ( + positionList[end].value === ZERO || + elementList[end].titleId !== elementList[end + 1]?.titleId + ) break + const { pageNo, rowNo } = positionList[end] + let rowArray = rangeRow.get(pageNo) + if (!rowArray) { + rowArray = [] + rangeRow.set(pageNo, rowArray) + } + if (!rowArray.includes(rowNo)) { + rowArray.push(rowNo) + } + end++ + } + return rangeRow + } + public getIsPointInRange(x: number, y: number): boolean { const { startIndex, endIndex } = this.range const positionList = this.position.getPositionList() diff --git a/src/editor/interface/Range.ts b/src/editor/interface/Range.ts index 3c57127..3426996 100644 --- a/src/editor/interface/Range.ts +++ b/src/editor/interface/Range.ts @@ -12,4 +12,6 @@ export interface IRange { zone?: EditorZone; } +export type RangeRowArray = Map + export type RangeRowMap = Map>