{"version":3,"sources":["jsdelivr-header.js","/npm/markdown-it-multimd-table@4.2.3/index.js"],"names":[],"mappings":"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","file":"/npm/markdown-it-multimd-table@4.2.3/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.37.0.\n * Original file: /npm/markdown-it-multimd-table@4.2.3/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict';\nvar DFA = require('./lib/dfa.js');\n\nmodule.exports = function multimd_table_plugin(md, options) {\n  var defaults = {\n    multiline:  false,\n    rowspan:    false,\n    headerless: false,\n    multibody:  true,\n    autolabel:  true\n  };\n  options = md.utils.assign({}, defaults, options || {});\n\n  function scan_bound_indices(state, line) {\n    /**\n     * Naming convention of positional variables\n     * - list-item\n     * ·········longtext······\\n\n     *   ^head  ^start  ^end  ^max\n     */\n    var start = state.bMarks[line] + state.sCount[line],\n        head = state.bMarks[line] + state.blkIndent,\n        end = state.skipSpacesBack(state.eMarks[line], head),\n        bounds = [], pos, posjump,\n        escape = false, code = false, serial = 0;\n\n    /* Scan for valid pipe character position */\n    for (pos = start; pos < end; pos++) {\n      switch (state.src.charCodeAt(pos)) {\n        case 0x5c /* \\ */:\n          escape = true; break;\n        case 0x60 /* ` */:\n          posjump = state.skipChars(pos, 0x60) - 1;\n          /* make \\` closes the code sequence, but not open it;\n             the reason is that `\\` is correct code block */\n          /* eslint-disable-next-line brace-style */\n          if (posjump > pos) {\n            if (!code) {\n              if (serial === 0) { serial = posjump - pos; } else if (serial === posjump - pos) { serial = 0; }\n            }\n            pos = posjump;\n          } else if (code || (!escape && !serial)) { code = !code; }\n          escape = false; break;\n        case 0x7c /* | */:\n          if (!code && !escape) { bounds.push(pos); }\n          escape = false; break;\n        default:\n          escape = false; break;\n      }\n    }\n    if (bounds.length === 0) return bounds;\n\n    /* Pad in newline characters on last and this line */\n    if (bounds[0] > head) { bounds.unshift(head - 1); }\n    if (bounds[bounds.length - 1] < end - 1) { bounds.push(end); }\n\n    return bounds;\n  }\n\n  function table_caption(state, silent, line) {\n    var meta = { text: null, label: null },\n        start = state.bMarks[line] + state.sCount[line],\n        max = state.eMarks[line],\n        /* A non-greedy qualifier allows the label to be matched */\n        capRE = /^\\[(.+?)\\](\\[([^\\[\\]]+)\\])?\\s*$/,\n        matches = state.src.slice(start, max).match(capRE);\n\n    if (!matches) { return false; }\n    if (silent)  { return true; }\n\n    meta.text  = matches[1];\n\n    if (!options.autolabel && !matches[2]) { return meta; }\n\n    meta.label = matches[2] || matches[1];\n    meta.label = meta.label.toLowerCase().replace(/\\W+/g, '');\n\n    return meta;\n  }\n\n  function table_row(state, silent, line) {\n    var meta = { bounds: null, multiline: null },\n        bounds = scan_bound_indices(state, line),\n        start, pos, oldMax;\n\n    if (bounds.length < 2) { return false; }\n    if (silent) { return true; }\n\n    meta.bounds = bounds;\n\n    /* Multiline. Scan boundaries again since it's very complicated */\n    if (options.multiline) {\n      start = state.bMarks[line] + state.sCount[line];\n      pos = state.eMarks[line] - 1; /* where backslash should be */\n      meta.multiline = (state.src.charCodeAt(pos) === 0x5C/* \\ */);\n      if (meta.multiline) {\n        oldMax = state.eMarks[line];\n        state.eMarks[line] = state.skipSpacesBack(pos, start);\n        meta.bounds = scan_bound_indices(state, line);\n        state.eMarks[line] = oldMax;\n      }\n    }\n\n    return meta;\n  }\n\n  function table_separator(state, silent, line) {\n    var meta = { aligns: [], wraps: [] },\n        bounds = scan_bound_indices(state, line),\n        sepRE = /^:?(-+|=+):?\\+?$/,\n        c, text, align;\n\n    /* Only separator needs to check indents */\n    if (state.sCount[line] - state.blkIndent >= 4) { return false; }\n    if (bounds.length === 0) { return false; }\n\n    for (c = 0; c < bounds.length - 1; c++) {\n      text = state.src.slice(bounds[c] + 1, bounds[c + 1]).trim();\n      if (!sepRE.test(text)) { return false; }\n\n      meta.wraps.push(text.charCodeAt(text.length - 1) === 0x2B/* + */);\n      align = ((text.charCodeAt(0) === 0x3A/* : */) << 4) |\n               (text.charCodeAt(text.length - 1 - meta.wraps[c]) === 0x3A);\n      switch (align) {\n        case 0x00: meta.aligns.push('');       break;\n        case 0x01: meta.aligns.push('right');  break;\n        case 0x10: meta.aligns.push('left');   break;\n        case 0x11: meta.aligns.push('center'); break;\n      }\n    }\n    if (silent) { return true; }\n    return meta;\n  }\n\n  function table_empty(state, silent, line) {\n    return state.isEmpty(line);\n  }\n\n  function table(state, startLine, endLine, silent) {\n    /**\n     * Regex pseudo code for table:\n     *     caption? header+ separator (data+ empty)* data+ caption?\n     *\n     * We use DFA to emulate this plugin. Types with lower precedence are\n     * set-minus from all the formers.  Noted that separator should have higher\n     * precedence than header or data.\n     *   |  state  | caption separator header data empty | --> lower precedence\n     *   | 0x10100 |    1        0       1     0     0   |\n     */\n    var tableDFA = new DFA(),\n        grp = 0x10, mtr = -1,\n        token, tableToken, trToken,\n        colspan, leftToken,\n        rowspan, upTokens = [],\n        tableLines, tgroupLines,\n        tag, text, range, r, c, b, t,\n        blockState;\n\n    if (startLine + 2 > endLine) { return false; }\n\n    /**\n     * First pass: validate and collect info into table token. IR is stored in\n     * markdown-it `token.meta` to be pushed later. table/tr open tokens are\n     * generated here.\n     */\n    tableToken       = new state.Token('table_open', 'table', 1);\n    tableToken.meta  = { sep: null, cap: null, tr: [] };\n\n    tableDFA.set_highest_alphabet(0x10000);\n    tableDFA.set_initial_state(0x10100);\n    tableDFA.set_accept_states([ 0x10010, 0x10011, 0x00000 ]);\n    tableDFA.set_match_alphabets({\n      0x10000: table_caption.bind(this, state, true),\n      0x01000: table_separator.bind(this, state, true),\n      0x00100: table_row.bind(this, state, true),\n      0x00010: table_row.bind(this, state, true),\n      0x00001: table_empty.bind(this, state, true)\n    });\n    tableDFA.set_transitions({\n      0x10100: { 0x10000: 0x00100, 0x00100: 0x01100 },\n      0x00100: { 0x00100: 0x01100 },\n      0x01100: { 0x01000: 0x10010, 0x00100: 0x01100 },\n      0x10010: { 0x10000: 0x00000, 0x00010: 0x10011 },\n      0x10011: { 0x10000: 0x00000, 0x00010: 0x10011, 0x00001: 0x10010 }\n    });\n    if (options.headerless) {\n      tableDFA.set_initial_state(0x11100);\n      tableDFA.update_transition(0x11100,\n        { 0x10000: 0x01100, 0x01000: 0x10010, 0x00100: 0x01100 }\n      );\n      trToken      = new state.Token('tr_placeholder', 'tr', 0);\n      trToken.meta = Object();  // avoid trToken.meta.grp throws exception\n    }\n    if (!options.multibody) {\n      tableDFA.update_transition(0x10010,\n        { 0x10000: 0x00000, 0x00010: 0x10010 }  // 0x10011 is never reached\n      );\n    }\n    /* Don't mix up DFA `_state` and markdown-it `state` */\n    tableDFA.set_actions(function (_line, _state, _type) {\n      // console.log(_line, _state.toString(16), _type.toString(16))  // for test\n      switch (_type) {\n        case 0x10000:\n          if (tableToken.meta.cap) { break; }\n          tableToken.meta.cap       = table_caption(state, false, _line);\n          tableToken.meta.cap.map   = [ _line, _line + 1 ];\n          tableToken.meta.cap.first = (_line === startLine);\n          break;\n        case 0x01000:\n          tableToken.meta.sep     = table_separator(state, false, _line);\n          tableToken.meta.sep.map = [ _line, _line + 1 ];\n          trToken.meta.grp |= 0x01;  // previously assigned at case 0x00110\n          grp               = 0x10;\n          break;\n        case 0x00100:\n        case 0x00010:\n          trToken           = new state.Token('tr_open', 'tr', 1);\n          trToken.map       = [ _line, _line + 1 ];\n          trToken.meta      = table_row(state, false, _line);\n          trToken.meta.type = _type;\n          trToken.meta.grp  = grp;\n          grp               = 0x00;\n          tableToken.meta.tr.push(trToken);\n          /* Multiline. Merge trTokens as an entire multiline trToken */\n          if (options.multiline) {\n            if (trToken.meta.multiline && mtr < 0) {\n              /* Start line of multiline row. mark this trToken */\n              mtr = tableToken.meta.tr.length - 1;\n            } else if (!trToken.meta.multiline && mtr >= 0) {\n              /* End line of multiline row. merge forward until the marked trToken */\n              token               = tableToken.meta.tr[mtr];\n              token.meta.mbounds  = tableToken.meta.tr\n                .slice(mtr).map(function (tk) { return tk.meta.bounds; });\n              token.map[1]        = trToken.map[1];\n              tableToken.meta.tr  = tableToken.meta.tr.slice(0, mtr + 1);\n              mtr = -1;\n            }\n          }\n          break;\n        case 0x00001:\n          trToken.meta.grp |= 0x01;\n          grp               = 0x10;\n          break;\n      }\n    });\n\n    if (tableDFA.execute(startLine, endLine) === false) { return false; }\n    // if (!tableToken.meta.sep) { return false; } // always evaluated true\n    if (!tableToken.meta.tr.length) { return false; } // false under headerless corner case\n    if (silent) { return true; }\n\n    /* Last data row cannot be detected. not stored to trToken outside? */\n    tableToken.meta.tr[tableToken.meta.tr.length - 1].meta.grp |= 0x01;\n\n\n    /**\n     * Second pass: actually push the tokens into `state.tokens`.\n     * thead/tbody/th/td open tokens and all closed tokens are generated here;\n     * thead/tbody are generally called tgroup; td/th are generally called tcol.\n     */\n    tableToken.map   = tableLines = [ startLine, 0 ];\n    tableToken.block = true;\n    tableToken.level = state.level++;\n    state.tokens.push(tableToken);\n\n    if (tableToken.meta.cap) {\n      token          = state.push('caption_open', 'caption', 1);\n      token.map      = tableToken.meta.cap.map;\n\n      var attrs      = [];\n      var capSide    = tableToken.meta.cap.first ? 'top' : 'bottom';\n\n      /* Null is possible when disabled the option autolabel */\n      if (tableToken.meta.cap.label !== null) {\n        attrs.push([ 'id', tableToken.meta.cap.label ]);\n      }\n\n      /* Add caption-side inline-CSS to <caption> tag, if caption is below the markdown table. */\n      if (capSide !== 'top') {\n        attrs.push([ 'style', 'caption-side: ' + capSide ]);\n      }\n\n      token.attrs    = attrs;\n\n      token          = state.push('inline', '', 0);\n      token.content  = tableToken.meta.cap.text;\n      token.map      = tableToken.meta.cap.map;\n      token.children = [];\n\n      token          = state.push('caption_close', 'caption', -1);\n    }\n\n    for (r = 0; r < tableToken.meta.tr.length; r++) {\n      leftToken = new state.Token('td_th_placeholder', '', 0);\n\n      /* Push in thead/tbody and tr open tokens */\n      trToken = tableToken.meta.tr[r];\n      // console.log(trToken.meta); // for test\n      if (trToken.meta.grp & 0x10) {\n        tag = (trToken.meta.type === 0x00100) ? 'thead' : 'tbody';\n        token     = state.push(tag + '_open', tag, 1);\n        token.map = tgroupLines = [ trToken.map[0], 0 ];  // array ref\n        upTokens  = [];\n      }\n      trToken.block = true;\n      trToken.level = state.level++;\n      state.tokens.push(trToken);\n\n      /* Push in th/td tokens */\n      for (c = 0; c < trToken.meta.bounds.length - 1; c++) {\n        range = [ trToken.meta.bounds[c] + 1, trToken.meta.bounds[c + 1] ];\n        text = state.src.slice.apply(state.src, range);\n\n        if (text === '') {\n          colspan = leftToken.attrGet('colspan');\n          leftToken.attrSet('colspan', colspan === null ? 2 : colspan + 1);\n          continue;\n        }\n        if (options.rowspan && upTokens[c] && text.trim() === '^^') {\n          rowspan = upTokens[c].attrGet('rowspan');\n          upTokens[c].attrSet('rowspan', rowspan === null ? 2 : rowspan + 1);\n          leftToken = new state.Token('td_th_placeholder', '', 0);\n          continue;\n        }\n\n        tag = (trToken.meta.type === 0x00100) ? 'th' : 'td';\n        token       = state.push(tag + '_open', tag, 1);\n        token.map   = trToken.map;\n        token.attrs = [];\n        if (tableToken.meta.sep.aligns[c]) {\n          token.attrs.push([ 'style', 'text-align:' + tableToken.meta.sep.aligns[c] ]);\n        }\n        if (tableToken.meta.sep.wraps[c]) {\n          token.attrs.push([ 'class', 'extend' ]);\n        }\n\n        leftToken = upTokens[c] = token;\n\n        /* Multiline. Join the text and feed into markdown-it blockParser. */\n        if (options.multiline && trToken.meta.multiline && trToken.meta.mbounds) {\n          // Pad the text with empty lines to ensure the line number mapping is correct\n          text = new Array(trToken.map[0]).fill('').concat([ text.trimRight() ]);\n          for (b = 1; b < trToken.meta.mbounds.length; b++) {\n            /* Line with N bounds has cells indexed from 0 to N-2 */\n            if (c > trToken.meta.mbounds[b].length - 2) { continue; }\n            range = [ trToken.meta.mbounds[b][c] + 1, trToken.meta.mbounds[b][c + 1] ];\n            text.push(state.src.slice.apply(state.src, range).trimRight());\n          }\n          blockState = new state.md.block.State(text.join('\\n'), state.md, state.env, []);\n          blockState.level = trToken.level + 1;\n          // Start tokenizing from the actual content (trToken.map[0])\n          state.md.block.tokenize(blockState, trToken.map[0], blockState.lineMax);\n          for (t = 0; t < blockState.tokens.length; t++) {\n            state.tokens.push(blockState.tokens[t]);\n          }\n        } else {\n          token          = state.push('inline', '', 0);\n          token.content  = text.trim();\n          token.map      = trToken.map;\n          token.level    = trToken.level + 1;\n          token.children = [];\n        }\n\n        token = state.push(tag + '_close', tag, -1);\n      }\n\n      /* Push in tr and thead/tbody closed tokens */\n      state.push('tr_close', 'tr', -1);\n      if (trToken.meta.grp & 0x01) {\n        tag = (trToken.meta.type === 0x00100) ? 'thead' : 'tbody';\n        token = state.push(tag + '_close', tag, -1);\n        tgroupLines[1] = trToken.map[1];\n      }\n    }\n\n    tableLines[1] = Math.max(\n      tgroupLines[1],\n      tableToken.meta.sep.map[1],\n      tableToken.meta.cap ? tableToken.meta.cap.map[1] : -1\n    );\n    token = state.push('table_close', 'table', -1);\n\n    state.line = tableLines[1];\n    return true;\n  }\n\n  md.block.ruler.at('table', table, { alt: [ 'paragraph', 'reference' ] });\n};\n\n/* vim: set ts=2 sw=2 et: */\n"]}