/** | |
* @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} from 'micromark-util-symbol/codes.js' | |
import {types} from 'micromark-util-symbol/types.js' | |
import {ok as assert} from 'uvu/assert' | |
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) | |
} | |
} | |