UNPKG

very-small-parser

Version:

A very small Markdown, HTML, and CSS parser.

71 lines (70 loc) 2.15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MdBlockParser = void 0; const Parser_1 = require("../../Parser"); class MdBlockParser extends Parser_1.Parser { constructor(opts) { super(opts); this.inline = opts.inline; } parse(src) { const tokens = super.parse(src); return this.applyBlockAttrs(tokens); } applyBlockAttrs(tokens) { const result = []; let pendingArgs = []; for (const tok of tokens) { if (tok.type === 'blockAttr') { const ba = tok; if (ba._blankLine) { // Blank line after this attr line — discard accumulated attrs pendingArgs = []; } else { pendingArgs.push(...ba.args); } } else if (tok.type === '') { // blank line clears pending attrs — they must directly precede the block pendingArgs = []; result.push(tok); } else { if (pendingArgs.length > 0) { tok.args = pendingArgs; pendingArgs = []; } result.push(tok); } } return result; } parsef(src) { const tokens = this.parse(src); const token = { type: 'root', children: tokens, len: src.length, }; // Merge adjacent "list" tokens. const length = tokens.length; for (let i = 0; i < length - 1; i++) { const tok1 = tokens[i]; if (tok1?.type === 'list') { const tok2 = tokens[i + 1]; if (tok2?.type === 'list') { tok1.spread = true; tok1.children.push(...tok2.children); tokens.splice(i + 1, 1); i--; } } } return token; } parsei(src) { return this.inline.parse(src); } } exports.MdBlockParser = MdBlockParser;