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 109 | 1x 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`; } |