/** * @typedef {import('micromark-util-types').InitialConstruct} InitialConstruct * @typedef {import('micromark-util-types').Initializer} Initializer * @typedef {import('micromark-util-types').State} State * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext */ 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} * @type {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 } }