All files / roosterjs-content-model-markdown/lib/modelToMarkdown/creators createMarkdownBlockGroup.ts

81.25% Statements 39/48
64.71% Branches 11/17
100% Functions 3/3
84.62% Lines 33/39

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 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 1091x                                     1x         27x 27x   20x 20x   20x   7x 7x               27x               20x 20x 20x 20x                   20x 20x 20x 20x       20x 6x 6x 6x         14x 14x 11x   3x       20x               7x 7x 7x 7x 7x                 7x    
import { createMarkdownBlock } from './createMarkdownBlock';
import type { MarkdownLineBreaks } from '../../constants/markdownLineBreaks';
import type {
    ContentModelBlockGroup,
    ContentModelFormatContainer,
    ContentModelListItem,
} from 'roosterjs-content-model-types';
 
/**
 * @internal
 */
export interface ListCounter {
    listItemCount: number;
    subListItemCount: number;
}
 
/**
 * @internal
 */
export function createMarkdownBlockGroup(
    blockGroup: ContentModelBlockGroup,
    newLinePattern: MarkdownLineBreaks,
    listCounter: ListCounter
): string {
    let markdownString = '';
    switch (blockGroup.blockGroupType) {
        case 'ListItem':
            Eif (listCounter) {
                markdownString += createMarkdownListItem(blockGroup, newLinePattern, listCounter);
            }
            break;
        case 'FormatContainer':
            markdownString += createMarkdownBlockQuote(blockGroup, newLinePattern, listCounter);
            break;
        default:
            const { blocks } = blockGroup;
            for (const block of blocks) {
                markdownString += createMarkdownBlock(block, newLinePattern, listCounter);
            }
            break;
    }
    return markdownString;
}
 
function createMarkdownListItem(
    listItem: ContentModelListItem,
    newLinePattern: MarkdownLineBreaks,
    listCounter: ListCounter
): string {
    let markdownString = '';
    const { blocks } = listItem;
    for (const block of blocks) {
        markdownString += createMarkdownBlock(
            block,
            newLinePattern,
            listCounter,
            undefined /* newLines */,
            {
                ignoreLineBreaks: true,
            }
        );
    }
    const lastIndex = listItem.levels.length - 1;
    const isSubList = lastIndex + 1 > 1;
    const dummyFormat = listItem.levels[lastIndex].format.displayForDummyItem;
    Iif (dummyFormat && dummyFormat !== 'listItem') {
        return (markdownString = ` ${markdownString}`);
    }
 
    if (isSubList) {
        listCounter.subListItemCount++;
        Eif (listItem.levels[lastIndex].listType == 'OL') {
            markdownString = `   ${listCounter.subListItemCount}. ${markdownString}`;
        } else {
            markdownString = `  - ${markdownString}`;
        }
    } else {
        listCounter.listItemCount++;
        if (listItem.levels[lastIndex].listType == 'OL') {
            markdownString = `${listCounter.listItemCount}. ${markdownString}`;
        } else {
            markdownString = `- ${markdownString}`;
        }
    }
 
    return markdownString + newLinePattern.newLine;
}
 
function createMarkdownBlockQuote(
    blockquote: ContentModelFormatContainer,
    newLinePattern: MarkdownLineBreaks,
    listCounter: ListCounter
): string {
    let markdownString = '';
    Eif (blockquote.tagName == 'blockquote') {
        const { blocks } = blockquote;
        for (const block of blocks) {
            markdownString +=
                '> ' +
                createMarkdownBlock(block, newLinePattern, listCounter, undefined /* newLines */, {
                    ignoreLineBreaks: true,
                }) +
                newLinePattern.newLine;
        }
    }
 
    return `${markdownString}\n`;
}