text: /**
   * @typedef {import('micromark-util-types').Construct} Construct
   * @typedef {import('micromark-util-types').Tokenizer} Tokenizer
   * @typedef {import('micromark-util-types').State} State
   */
  
  import assert from 'power-assert'
  import {asciiPunctuation} from 'micromark-util-character'
  import {codes} from 'micromark-util-symbol/codes.js'
  import {types} from 'micromark-util-symbol/types.js'
  
  /** @type {Construct} */
  export const characterEscape = {
    name: 'characterEscape',
    tokenize: tokenizeCharacterEscape
  }
  
  /** @type {Tokenizer} */
  function tokenizeCharacterEscape(effects, ok, nok) {
    return start
  
    /** @type {State} */
    function start(code) {
      assert(code === codes.backslash, 'expected `\\`')
      effects.enter(types.characterEscape)
      effects.enter(types.escapeMarker)
      effects.consume(code)
      effects.exit(types.escapeMarker)
      return open
    }
  
    /** @type {State} */
    function open(code) {
      if (asciiPunctuation(code)) {
        effects.enter(types.characterEscapeValue)
        effects.consume(code)
        effects.exit(types.characterEscapeValue)
        effects.exit(types.characterEscape)
        return ok
      }
  
      return nok(code)
    }
  }
  