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 | 1x 1x 1x 332x 332x 332x 332x 4x 328x 161x 161x 161x 325x 252x 2x 250x 123x 123x 123x 123x 122x 122x 578x | import { isElementOfType } from '../../domUtils/isElementOfType';
import { isNodeOfType } from '../../domUtils/isNodeOfType';
import type { FormatHandler } from '../FormatHandler';
import type { ListThreadFormat } from 'roosterjs-content-model-types';
/**
* @internal
*/
export const listItemThreadFormatHandler: FormatHandler<ListThreadFormat> = {
parse: (format, element, context, defaultStyles) => {
const { listFormat } = context;
const depth = listFormat.levels.length;
const display = element.style.display || defaultStyles.display;
if (display && display != 'list-item') {
format.displayForDummyItem = display;
} else if (isLiUnderOl(element) && depth > 0) {
listFormat.threadItemCounts[depth - 1]++;
listFormat.threadItemCounts.splice(depth);
listFormat.levels.forEach(level => {
// Delete restart number so next list item doesn't need to have this value.
// Then it will be treated as a continuous list item to the previous one
delete level.format.startNumberOverride;
});
}
},
apply: (format, element, context) => {
if (format.displayForDummyItem) {
element.style.display = format.displayForDummyItem;
} else if (isLiUnderOl(element)) {
const { listFormat } = context;
const { threadItemCounts } = listFormat;
const index = listFormat.nodeStack.length - 2; // The first one is always the parent of list, then minus another 1 to convert length to index
if (index >= 0) {
threadItemCounts.splice(index + 1);
threadItemCounts[index] = (threadItemCounts[index] ?? 0) + 1;
}
}
},
};
function isLiUnderOl(element: HTMLElement) {
return (
isElementOfType(element, 'li') &&
isNodeOfType(element.parentNode, 'ELEMENT_NODE') &&
isElementOfType(element.parentNode, 'ol')
);
}
|