UNPKG

@mieweb/wikigdrive

Version:

Google Drive to MarkDown synchronization

183 lines (182 loc) 7.88 kB
import { walkRecursiveSync } from '../markdownNodesUtils.js'; // Related tests: // test ./issue-431 // test ./issue-432 // test ./issue-434 // test ./issue-434-2 // test ./issue-435-436 // test ./issue-443 // test ./our-docs // test ./header-link // test ./nested-ordered-list.md // test ./bullets.md // test ./quotes.md // test ./confluence.md // test ./project-overview.md // test ./intro-to-the-system.md // test ./list-test.md // test ./lettered-list.md // test ./list-indent.md // test ./strong-headers.md // test ./embedded-diagram-example.md // test ./suggest.md // test ./raw-html.md // test ./pre-mie.md // test ./block-macro.md // test ./example-document.md // test ./td-bullets.md // test ./line-breaks.md // test ./code-links.md // test ./code-blocks.md // test ./rewrite-rules.md.markdown export function removeExcessiveLines(markdownChunks) { let inHtml = 0; walkRecursiveSync(markdownChunks.body, (chunk) => { if (chunk.parent && chunk.parent.tag !== 'BODY') { return; } if (chunk.isTag && chunk.tag === 'HTML_MODE/') { inHtml++; return; } if (inHtml) { return; } }, {}, (chunk, ctx) => { if (chunk.isTag && chunk.tag === 'HTML_MODE/') { inHtml--; return; } if (chunk.isTag && ['P', 'BODY'].includes(chunk.tag)) { for (let idx = 0; idx < chunk.children.length; idx++) { const child = chunk.children[idx]; if (child.isTag && child.tag === 'BR/') { const prevChild = chunk.children[idx - 1]; const nextChild = chunk.children[idx + 1]; if (nextChild && nextChild.isTag && ['EOL/', 'BR/', 'EMPTY_LINE/'].includes(nextChild.tag)) { child.comment = 'removeExcessiveLines.ts: converted BR/ to EOL/'; child.tag = 'EOL/'; } else if (prevChild && prevChild.isTag && ['EOL/', 'BR/', 'EMPTY_LINE/'].includes(prevChild.tag)) { child.comment = 'removeExcessiveLines.ts: converted BR/ to EOL/'; child.tag = 'EOL/'; } } } for (let idx = chunk.children.length - 1; idx > 0; idx--) { const child = chunk.children[idx]; const prevChild = chunk.children[idx - 1]; const nextChild = chunk.children[idx + 1]; if (prevChild && !(prevChild.isTag && prevChild.tag === 'BR/')) { continue; } if (child.isTag && child.tag === 'BR/') { if ((nextChild && nextChild.isTag && nextChild.tag === 'IMG/')) { const eol = markdownChunks.createNode('EOL/'); eol.comment = 'removeExcessiveLines.ts: Converted BR/ to EOL/'; chunk.children.splice(idx, 1, eol); continue; } const eol = markdownChunks.createNode('EOL/'); eol.comment = 'removeExcessiveLines.ts: Converted BR/ to EOL/ + EMPTY_LINE/'; const emptyLine = markdownChunks.createNode('EMPTY_LINE/'); emptyLine.comment = 'removeExcessiveLines.ts: Converted BR/ to EOL/ + EMPTY_LINE/'; chunk.children.splice(idx, 1, eol, emptyLine); } } for (let idx = chunk.children.length - 1; idx > 0; idx--) { const child = chunk.children[idx]; const prevChild = chunk.children[idx - 1]; /* if (child.isTag && child.tag === 'BR/') { if (prevChild.isTag && ['BR/', 'EOL/', 'EMPTY_LINE/'].includes(prevChild.tag)) { child.tag = 'EMPTY_LINE/'; child.comment = 'removeExcessiveLines.ts: converted BR/ to EMPTY_LINE/'; idx += 2; continue; } } */ if (child.isTag && child.tag === 'EOL/') { if (prevChild.isTag && ['EOL/', 'EMPTY_LINE/'].includes(prevChild.tag)) { child.tag = 'EMPTY_LINE/'; child.comment = 'removeExcessiveLines.ts: converted EOL/ to EMPTY_LINE/'; idx++; } } } } if (chunk.isTag && ['P', 'BODY', 'H1', 'H2', 'H3', 'H4'].includes(chunk.tag)) { if (chunk.children.length > 0) { const child = chunk.children[0]; if (child.isTag && child.tag === 'EOL/') { child.tag = 'EMPTY_LINE/'; child.comment = 'removeExcessiveLines.ts: converted first EOL/ to EMPTY_LINE/'; } } } if (chunk.isTag && ['P', 'LI', 'UL'].includes(chunk.tag)) { for (let idx = chunk.children.length - 1; idx > 0; idx--) { const child = chunk.children[idx]; const prevChild = chunk.children[idx - 1]; if (child.isTag && child.tag === 'EMPTY_LINE/') { if (prevChild.isTag && prevChild.tag === 'EMPTY_LINE/') { chunk.children.splice(idx, 1); } } } for (let idx = chunk.children.length - 1; idx >= 0; idx--) { const child = chunk.children[idx]; if (child.isTag && child.tag === 'EMPTY_LINE/') { chunk.children.splice(idx, 1); if (chunk.tag === 'P') { child.comment = 'removeExcessiveLines.ts: moved EMPTY_LINE/ to parent'; chunk.parent.children.splice(ctx.nodeIdx + 1, 0, child); } } else { break; } } if (chunk.children.length > 0) { const child = chunk.children[0]; if (child.isTag && child.tag === 'EMPTY_LINE/') { chunk.children.splice(0, 1); child.comment = 'removeExcessiveLines.ts: moved EMPTY_LINE/ to parent'; chunk.parent.children.splice(ctx.nodeIdx, 0, child); } } } if (chunk.isTag && ['P', 'BODY', 'H1', 'H2', 'H3', 'H4', 'UL'].includes(chunk.tag)) { if (chunk.children.length === 0) { chunk.parent.children.splice(ctx.nodeIdx, 1); return { nodeIdx: ctx.nodeIdx - 1 }; } } }); for (let idx = markdownChunks.body.children.length - 1; idx > 0; idx--) { const child = markdownChunks.body.children[idx]; const prevChild = markdownChunks.body.children[idx - 1]; if (child.isTag && child.tag === 'EMPTY_LINE/') { if (prevChild.isTag && prevChild.tag === 'EMPTY_LINE/') { markdownChunks.body.children.splice(idx, 1); } } } while (markdownChunks.body.children.length > 0) { const firstChild = markdownChunks.body.children[0]; if (firstChild.isTag && firstChild.tag === 'EMPTY_LINE/') { markdownChunks.body.children.splice(0, 1); continue; } break; } while (markdownChunks.body.children.length > 0) { const firstChild = markdownChunks.body.children[markdownChunks.body.children.length - 1]; if (firstChild.isTag && firstChild.tag === 'EMPTY_LINE/') { markdownChunks.body.children.splice(markdownChunks.body.children.length - 1, 1); continue; } break; } }