{"version":3,"file":"markdownItKbd.cjs","sources":["../src/index.ts"],"sourcesContent":["// [[kbd]]\n//\n\n// markdown-it has no types and it’s not worth the effort adding a *.d.ts file\n//import type { MarkdownIt } from '@types/markdown-it';\n\nconst defaultOptions = {\n  MARKER_OPEN: '[[',\n  MARKER_CLOSE: ']]',\n  ESCAPE_CHARACTER: '\\\\',\n  TAG: 'kbd',\n\n  // intern use; derived at time of initialization:\n  MARKER_OPEN_1ST_CHR: 0\n};\n\nexport default function kbdplugin(markdownit, opts): void {\n  const options = Object.assign({}, defaultOptions, opts);\n  options.MARKER_OPEN_1ST_CHR = options.MARKER_OPEN.charCodeAt(0);\n\n\n  function findNextNonEscapedMarker(src, start, marker) {\n    let end;\n    let searchOffset = start;\n    for (;;) {\n      end = src.indexOf(marker, searchOffset);\n      if (end < 0) {\n        return -1;\n      }\n\n      // count number of escape characters before marker:\n      // if ODD, then marker is escaped:\n      let escapeCount = 0;\n      for (let i = end - 1; i >= 0 && src.charAt(i) === options.ESCAPE_CHARACTER; i--) {\n        escapeCount++;\n      }\n      if (escapeCount % 2 === 0) {\n        // got a proper end marker now: exit loop\n        break;\n      }\n      // skip first character of escaped end marker and try again:\n      searchOffset = end + 1;\n    }\n    return end;\n  }\n\n  function findMatchingClose(src, start, level) {\n    let end = findNextNonEscapedMarker(src, start, options.MARKER_CLOSE);\n    if (end < 0) {\n      // no end marker found,\n      // input ended before closing sequence\n      return -1;\n    }\n\n    // first skip all inner KBD chunks:\n    let innerStart = findNextNonEscapedMarker(src, start, options.MARKER_OPEN);\n    let searchOffset = start;\n\n    while (innerStart >= 0) {\n      // when there's a START *before* our END, then that MUST be an *inner* START:\n      // we should find *it's* matching END. That doesn't necessarily have to be\n      // the one we found already, as this stuff may be nested several levels!\n      if (innerStart >= 0 && innerStart < end) {\n        searchOffset = innerStart + options.MARKER_OPEN.length;\n\n        // found one. There may be more. So we move our `end` forward now to ensure the next inner KBD chunk is found as well.\n        end = findMatchingClose(src, searchOffset, level + 1);\n        if (end < 0) {\n          return -1;\n        }\n        searchOffset = end + options.MARKER_CLOSE.length;\n        innerStart = findNextNonEscapedMarker(src, searchOffset, options.MARKER_OPEN);\n        end = findNextNonEscapedMarker(src, searchOffset, options.MARKER_CLOSE);\n        if (end < 0) {\n          // no end marker found,\n          // input ended before closing sequence\n          return -1;\n        }\n      } else {\n        // we only found a START that's beyond our END, so it doesn't matter. Stop looking for inner KBD chunks.\n        innerStart = -1;\n      }\n    }\n\n    // the last END marker found is our own:\n    return end;\n  }\n\n  /*\n   * Add delimiters for double occurrences of MARKER_SYMBOL.\n   */\n  function tokenize(state, silent: boolean) {\n    if (silent) {\n      return false;\n    }\n\n    let start = state.pos;\n    const max = state.posMax;\n    const momChar = state.src.charCodeAt(start);\n\n    // We are looking for two times the open symbol.\n    if (momChar !== options.MARKER_OPEN_1ST_CHR) {\n      return false;\n    }\n    let src = state.src.slice(start);\n    if (!src.startsWith(options.MARKER_OPEN)) {\n      return false;\n    }\n    const startLen = options.MARKER_OPEN.length;\n    start += startLen;\n    src = src.slice(startLen);\n\n    // find the end sequence\n    let end = findMatchingClose(src, 0, 1);\n    if (end < 0) {\n      // no end marker found,\n      // input ended before closing sequence\n      return false;\n    }\n\n    const lf = src.indexOf('\\n');\n    if (lf >= 0 && lf < end) {\n      // found end of line before the end sequence. Thus, ignore our start sequence!\n      return false;\n    }\n\n    // make end position into absolute index\n    end += start;\n\n    // start tag\n    state.push('kbd_open', options.TAG, 1);\n    // parse inner\n    state.pos = start;\n    state.posMax = end;\n    state.md.inline.tokenize(state);\n    state.pos = end + options.MARKER_CLOSE.length;\n    state.posMax = max;\n    // end tag\n    state.push('kbd_close', options.TAG, -1);\n\n    return true;\n  }\n\n\n  markdownit.inline.ruler.before('link', 'kbd', tokenize);\n}\n"],"names":["defaultOptions","MARKER_OPEN","MARKER_CLOSE","ESCAPE_CHARACTER","TAG","MARKER_OPEN_1ST_CHR","kbdplugin","markdownit","opts","options","Object","assign","charCodeAt","findNextNonEscapedMarker","src","start","marker","end","searchOffset","indexOf","escapeCount","i","charAt","findMatchingClose","level","innerStart","length","tokenize","state","silent","pos","max","posMax","momChar","slice","startsWith","startLen","lf","push","md","inline","ruler","before"],"mappings":"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"}