/** * @typedef {import('micromark-util-types').Effects} Effects * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext * @typedef {import('micromark-util-types').State} State */ import {markdownLineEnding, markdownSpace} from 'micromark-util-character' /** * @this {TokenizeContext} * @param {Effects} effects * @param {State} ok * @param {State} nok * @param {string} type * @param {string} markerType * @param {string} stringType * @returns {State} */ // eslint-disable-next-line max-params export function factoryLabel(effects, ok, nok, type, markerType, stringType) { const self = this let size = 0 /** @type {boolean} */ let data return start /** @type {State} */ function start(code) { effects.enter(type) effects.enter(markerType) effects.consume(code) effects.exit(markerType) effects.enter(stringType) return atBreak } /** @type {State} */ function atBreak(code) { if ( code === null || code === 91 || (code === 93 && !data) || /* To do: remove in the future once we’ve switched from * `micromark-extension-footnote` to `micromark-extension-gfm-footnote`, * which doesn’t need this */ /* Hidden footnotes hook */ /* c8 ignore next 3 */ (code === 94 && !size && '_hiddenFootnoteSupport' in self.parser.constructs) || size > 999 ) { return nok(code) } if (code === 93) { effects.exit(stringType) effects.enter(markerType) effects.consume(code) effects.exit(markerType) effects.exit(type) return ok } if (markdownLineEnding(code)) { effects.enter('lineEnding') effects.consume(code) effects.exit('lineEnding') return atBreak } effects.enter('chunkString', { contentType: 'string' }) return label(code) } /** @type {State} */ function label(code) { if ( code === null || code === 91 || code === 93 || markdownLineEnding(code) || size++ > 999 ) { effects.exit('chunkString') return atBreak(code) } effects.consume(code) data = data || !markdownSpace(code) return code === 92 ? labelEscape : label } /** @type {State} */ function labelEscape(code) { if (code === 91 || code === 92 || code === 93) { effects.consume(code) size++ return label } return label(code) } }