/** * @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' import {codes, types} from 'micromark-util-symbol' import {ok as assert} from 'devlop' /** @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) ), types.linePrefix ) ) ) return initial /** @type {State} */ function atBlankEnding(code) { assert( code === codes.eof || markdownLineEnding(code), 'expected eol or eof' ) if (code === codes.eof) { effects.consume(code) return } effects.enter(types.lineEndingBlank) effects.consume(code) effects.exit(types.lineEndingBlank) self.currentConstruct = undefined return initial } /** @type {State} */ function afterConstruct(code) { assert( code === codes.eof || markdownLineEnding(code), 'expected eol or eof' ) if (code === codes.eof) { effects.consume(code) return } effects.enter(types.lineEnding) effects.consume(code) effects.exit(types.lineEnding) self.currentConstruct = undefined return initial } }