/** | |
* @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 {asciiPunctuation} from 'micromark-util-character' | |
/** @type {Construct} */ | |
export const characterEscape = { | |
name: 'characterEscape', | |
tokenize: tokenizeCharacterEscape | |
} | |
/** | |
* @this {TokenizeContext} | |
* @type {Tokenizer} | |
*/ | |
function tokenizeCharacterEscape(effects, ok, nok) { | |
return start | |
/** | |
* Start of character escape. | |
* | |
* ```markdown | |
* > | a\*b | |
* ^ | |
* ``` | |
* | |
* @type {State} | |
*/ | |
function start(code) { | |
effects.enter('characterEscape') | |
effects.enter('escapeMarker') | |
effects.consume(code) | |
effects.exit('escapeMarker') | |
return inside | |
} | |
/** | |
* After `\`, at punctuation. | |
* | |
* ```markdown | |
* > | a\*b | |
* ^ | |
* ``` | |
* | |
* @type {State} | |
*/ | |
function inside(code) { | |
// ASCII punctuation. | |
if (asciiPunctuation(code)) { | |
effects.enter('characterEscapeValue') | |
effects.consume(code) | |
effects.exit('characterEscapeValue') | |
effects.exit('characterEscape') | |
return ok | |
} | |
return nok(code) | |
} | |
} | |