/** * @import { * InitialConstruct, * Initializer, * State, * TokenizeContext * } from 'micromark-util-types' */ import { blankLine, content } from 'micromark-core-commonmark'; import { factorySpace } from 'micromark-factory-space'; import { markdownLineEnding } from 'micromark-util-character'; /** @type {InitialConstruct} */ export const flow = { tokenize: initializeFlow }; /** * @this {TokenizeContext} * Self. * @type {Initializer} * Initializer. */ function initializeFlow(effects) { const self = this; const initial = effects.attempt( // Try to parse a blank line. blankLine, atBlankEnding, // Try to parse initial flow (essentially, only code). effects.attempt(this.parser.constructs.flowInitial, afterConstruct, factorySpace(effects, effects.attempt(this.parser.constructs.flow, afterConstruct, effects.attempt(content, afterConstruct)), "linePrefix"))); return initial; /** @type {State} */ function atBlankEnding(code) { if (code === null) { effects.consume(code); return; } effects.enter("lineEndingBlank"); effects.consume(code); effects.exit("lineEndingBlank"); self.currentConstruct = undefined; return initial; } /** @type {State} */ function afterConstruct(code) { if (code === null) { effects.consume(code); return; } effects.enter("lineEnding"); effects.consume(code); effects.exit("lineEnding"); self.currentConstruct = undefined; return initial; } }