| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 | /** * @typedef {import('micromark-util-types').Construct} Construct * @typedef {import('micromark-util-types').State} State * @typedef {import('micromark-util-types').TokenizeContext} TokenizeContext * @typedef {import('micromark-util-types').Tokenizer} Tokenizer */import {codes, types} from 'micromark-util-symbol'import {ok as assert} from 'devlop'import {labelEnd} from './label-end.js'/** @type {Construct} */export const labelStartImage = {  name: 'labelStartImage',  tokenize: tokenizeLabelStartImage,  resolveAll: labelEnd.resolveAll}/** * @this {TokenizeContext} * @type {Tokenizer} */function tokenizeLabelStartImage(effects, ok, nok) {  const self = this  return start  /**   * Start of label (image) start.   *   * ```markdown   * > | a ![b] c   *       ^   * ```   *   * @type {State}   */  function start(code) {    assert(code === codes.exclamationMark, 'expected `!`')    effects.enter(types.labelImage)    effects.enter(types.labelImageMarker)    effects.consume(code)    effects.exit(types.labelImageMarker)    return open  }  /**   * After `!`, at `[`.   *   * ```markdown   * > | a ![b] c   *        ^   * ```   *   * @type {State}   */  function open(code) {    if (code === codes.leftSquareBracket) {      effects.enter(types.labelMarker)      effects.consume(code)      effects.exit(types.labelMarker)      effects.exit(types.labelImage)      return after    }    return nok(code)  }  /**   * After `![`.   *   * ```markdown   * > | a ![b] c   *         ^   * ```   *   * This is needed in because, when GFM footnotes are enabled, images never   * form when started with a `^`.   * Instead, links form:   *   * ```markdown   *    *   * ![^a][b]   *   * [b]: c   * ```   *   * ```html   * <p>!<a href=\"b\">^a</a></p>   * <p>!<a href=\"c\">^a</a></p>   * ```   *   * @type {State}   */  function after(code) {    // To do: use a new field to do this, this is still needed for    // `micromark-extension-gfm-footnote`, but the `label-start-link`    // behavior isn’t.    // Hidden footnotes hook.    /* c8 ignore next 3 */    return code === codes.caret &&      '_hiddenFootnoteSupport' in self.parser.constructs      ? nok(code)      : ok(code)  }}
 |