/** | |
* @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 {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) { | |
effects.enter('labelImage') | |
effects.enter('labelImageMarker') | |
effects.consume(code) | |
effects.exit('labelImageMarker') | |
return open | |
} | |
/** | |
* After `!`, at `[`. | |
* | |
* ```markdown | |
* > | a ![b] c | |
* ^ | |
* ``` | |
* | |
* @type {State} | |
*/ | |
function open(code) { | |
if (code === 91) { | |
effects.enter('labelMarker') | |
effects.consume(code) | |
effects.exit('labelMarker') | |
effects.exit('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 === 94 && '_hiddenFootnoteSupport' in self.parser.constructs | |
? nok(code) | |
: ok(code) | |
} | |
} | |