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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | 1x 1x 1x 28x 28x 26x 26x 26x 2x 24x 18x 18x 18x 18x 6x 2x 18x 18x 18x 30x 30x 18x 30x 18x 12x 12x 12x 12x 18x | import { findListItemsInSameThread } from './findListItemsInSameThread';
import {
getAutoListStyleType,
getClosestAncestorBlockGroupIndex,
getListMetadata,
getOrderedListNumberStr,
} from 'roosterjs-content-model-dom';
import type {
AnnounceData,
ContentModelListItem,
ReadonlyContentModelBlockGroup,
ReadonlyContentModelListItem,
} from 'roosterjs-content-model-types';
/**
* Get announce data for list item
* @param path Content model path that include the list item
* @returns Announce data of current list item if any, or null
*/
export function getListAnnounceData(path: ReadonlyContentModelBlockGroup[]): AnnounceData | null {
const index = getClosestAncestorBlockGroupIndex(path, ['ListItem'], ['TableCell']);
if (index >= 0) {
const listItem = path[index] as ContentModelListItem;
const level = listItem.levels[listItem.levels.length - 1];
if (!level || level.format.displayForDummyItem) {
return null;
} else if (level.listType == 'OL') {
const listNumber = getListNumber(path, listItem);
const metadata = getListMetadata(level);
const listStyle = getAutoListStyleType(
'OL',
metadata ?? {},
listItem.levels.length - 1,
level.format.listStyleType
);
return listStyle === undefined
? null
: {
defaultStrings: 'announceListItemNumbering',
formatStrings: [getOrderedListNumberStr(listStyle, listNumber)],
};
} else {
return {
defaultStrings: 'announceListItemBullet',
};
}
} else {
return null;
}
}
function getListNumber(
path: ReadonlyContentModelBlockGroup[],
listItem: ReadonlyContentModelListItem
) {
const items = findListItemsInSameThread(path[path.length - 1], listItem);
let listNumber = 0;
for (let i = 0; i < items.length; i++) {
const item = items[i];
if (listNumber == 0 && item.levels.length == listItem.levels.length) {
listNumber = item.levels[item.levels.length - 1]?.format.startNumberOverride ?? 1;
}
if (item == listItem) {
// Found current item, so break and return
break;
} else Iif (item.levels.length < listItem.levels.length) {
// Found upper level item, reset list number
listNumber = 0;
} else Iif (item.levels.length > listItem.levels.length) {
// Found deeper level item, skip
continue;
} else Eif (!item.levels[item.levels.length - 1].format.displayForDummyItem) {
// Save level, and is not dummy, number plus one
listNumber++;
}
}
return listNumber;
}
|