/** | |
* @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 | |
} | |
} | |