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 | 1x 886x 869x 896x 896x 237x 659x 38x 594x | import type {
ContentModelBlockGroup,
ContentModelBlockGroupType,
ReadonlyContentModelBlockGroup,
TypeOfBlockGroup,
} from 'roosterjs-content-model-types';
/**
* Get index of closest ancestor block group of the expected block group type. If not found, return -1
* @param path The block group path, from the closest one to root
* @param blockGroupTypes The expected block group types
* @param stopTypes @optional Block group types that will cause stop searching
* @param isValidTarget @optional An additional callback to validate whether a matching block group is a valid target
*/
export function getClosestAncestorBlockGroupIndex<T extends ContentModelBlockGroup>(
path: ReadonlyContentModelBlockGroup[],
blockGroupTypes: TypeOfBlockGroup<T>[],
stopTypes: ContentModelBlockGroupType[] = [],
isValidTarget?: (block: ReadonlyContentModelBlockGroup) => boolean
): number {
for (let i = 0; i < path.length; i++) {
const group = path[i];
if (
(blockGroupTypes as string[]).indexOf(group.blockGroupType) >= 0 &&
(!isValidTarget || isValidTarget(group))
) {
return i;
} else if (stopTypes.indexOf(group.blockGroupType) >= 0) {
// Do not go across boundary specified by stopTypes.
// For example, in most case we will set table as the boundary,
// in order to allow modify list item under a table when the table itself is in another list item
// Although this is not very likely to happen in most case, but we still need to handle it
return -1;
}
}
return -1;
}
|