Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | 1x 1x 195x 195x 337x 337x 49x 288x 265x 23x 23x 23x 93x 26x 24x | import { areSameFormats } from '../../domToModel/utils/areSameFormats';
import type {
ContentModelText,
ReadonlyContentModelCode,
ReadonlyContentModelLink,
ReadonlyContentModelSegment,
ShallowMutableContentModelParagraph,
} from 'roosterjs-content-model-types';
/**
* Find continuous text segments that have the same format and decorators, merge them, So we can reduce total count of segments
* @param block The parent paragraph to check.
*/
export function mergeTextSegments(block: ShallowMutableContentModelParagraph) {
let lastText: ContentModelText | null = null;
for (let i = 0; i < block.segments.length; i++) {
const segment = block.segments[i];
if (segment.segmentType != 'Text') {
lastText = null;
} else if (!lastText || !segmentsWithSameFormat(lastText, segment)) {
lastText = segment;
} else {
lastText.text += segment.text;
block.segments.splice(i, 1);
i--;
}
}
}
function segmentsWithSameFormat(
seg1: ReadonlyContentModelSegment,
seg2: ReadonlyContentModelSegment
) {
return (
!!seg1.isSelected == !!seg2.isSelected &&
areSameFormats(seg1.format, seg2.format) &&
areSameLinks(seg1.link, seg2.link) &&
areSameCodes(seg1.code, seg2.code)
);
}
function areSameLinks(
link1: ReadonlyContentModelLink | undefined,
link2: ReadonlyContentModelLink | undefined
) {
return (
(!link1 && !link2) ||
(link1 &&
link2 &&
areSameFormats(link1.format, link2.format) &&
areSameFormats(link1.dataset, link2.dataset))
);
}
function areSameCodes(
code1: ReadonlyContentModelCode | undefined,
code2: ReadonlyContentModelCode | undefined
) {
return (!code1 && !code2) || (code1 && code2 && areSameFormats(code1.format, code2.format));
}
|