{"version":3,"file":"balance_pairs.mjs","sources":["../../../../../../node_modules/markdown-it/lib/rules_inline/balance_pairs.mjs"],"sourcesContent":["// For each opening emphasis-like marker find a matching closing one\n//\n\nfunction processDelimiters (delimiters) {\n  const openersBottom = {}\n  const max = delimiters.length\n\n  if (!max) return\n\n  // headerIdx is the first delimiter of the current (where closer is) delimiter run\n  let headerIdx = 0\n  let lastTokenIdx = -2 // needs any value lower than -1\n  const jumps = []\n\n  for (let closerIdx = 0; closerIdx < max; closerIdx++) {\n    const closer = delimiters[closerIdx]\n\n    jumps.push(0)\n\n    // markers belong to same delimiter run if:\n    //  - they have adjacent tokens\n    //  - AND markers are the same\n    //\n    if (delimiters[headerIdx].marker !== closer.marker || lastTokenIdx !== closer.token - 1) {\n      headerIdx = closerIdx\n    }\n\n    lastTokenIdx = closer.token\n\n    // Length is only used for emphasis-specific \"rule of 3\",\n    // if it's not defined (in strikethrough or 3rd party plugins),\n    // we can default it to 0 to disable those checks.\n    //\n    closer.length = closer.length || 0\n\n    if (!closer.close) continue\n\n    // Previously calculated lower bounds (previous fails)\n    // for each marker, each delimiter length modulo 3,\n    // and for whether this closer can be an opener;\n    // https://github.com/commonmark/cmark/commit/34250e12ccebdc6372b8b49c44fab57c72443460\n    /* eslint-disable-next-line no-prototype-builtins */\n    if (!openersBottom.hasOwnProperty(closer.marker)) {\n      openersBottom[closer.marker] = [-1, -1, -1, -1, -1, -1]\n    }\n\n    const minOpenerIdx = openersBottom[closer.marker][(closer.open ? 3 : 0) + (closer.length % 3)]\n\n    let openerIdx = headerIdx - jumps[headerIdx] - 1\n\n    let newMinOpenerIdx = openerIdx\n\n    for (; openerIdx > minOpenerIdx; openerIdx -= jumps[openerIdx] + 1) {\n      const opener = delimiters[openerIdx]\n\n      if (opener.marker !== closer.marker) continue\n\n      if (opener.open && opener.end < 0) {\n        let isOddMatch = false\n\n        // from spec:\n        //\n        // If one of the delimiters can both open and close emphasis, then the\n        // sum of the lengths of the delimiter runs containing the opening and\n        // closing delimiters must not be a multiple of 3 unless both lengths\n        // are multiples of 3.\n        //\n        if (opener.close || closer.open) {\n          if ((opener.length + closer.length) % 3 === 0) {\n            if (opener.length % 3 !== 0 || closer.length % 3 !== 0) {\n              isOddMatch = true\n            }\n          }\n        }\n\n        if (!isOddMatch) {\n          // If previous delimiter cannot be an opener, we can safely skip\n          // the entire sequence in future checks. This is required to make\n          // sure algorithm has linear complexity (see *_*_*_*_*_... case).\n          //\n          const lastJump = openerIdx > 0 && !delimiters[openerIdx - 1].open\n            ? jumps[openerIdx - 1] + 1\n            : 0\n\n          jumps[closerIdx] = closerIdx - openerIdx + lastJump\n          jumps[openerIdx] = lastJump\n\n          closer.open  = false\n          opener.end   = closerIdx\n          opener.close = false\n          newMinOpenerIdx = -1\n          // treat next token as start of run,\n          // it optimizes skips in **<...>**a**<...>** pathological case\n          lastTokenIdx = -2\n          break\n        }\n      }\n    }\n\n    if (newMinOpenerIdx !== -1) {\n      // If match for this delimiter run failed, we want to set lower bound for\n      // future lookups. This is required to make sure algorithm has linear\n      // complexity.\n      //\n      // See details here:\n      // https://github.com/commonmark/cmark/issues/178#issuecomment-270417442\n      //\n      openersBottom[closer.marker][(closer.open ? 3 : 0) + ((closer.length || 0) % 3)] = newMinOpenerIdx\n    }\n  }\n}\n\nexport default function link_pairs (state) {\n  const tokens_meta = state.tokens_meta\n  const max = state.tokens_meta.length\n\n  processDelimiters(state.delimiters)\n\n  for (let curr = 0; curr < max; curr++) {\n    if (tokens_meta[curr] && tokens_meta[curr].delimiters) {\n      processDelimiters(tokens_meta[curr].delimiters)\n    }\n  }\n}\n"],"names":["processDelimiters","delimiters","openersBottom","max","headerIdx","lastTokenIdx","jumps","closerIdx","closer","minOpenerIdx","openerIdx","newMinOpenerIdx","opener","isOddMatch","lastJump","link_pairs","state","tokens_meta","curr"],"mappings":"AAGA,SAASA,EAAmBC,GAAY;AACtC,QAAMC,IAAgB,CAAA,GAChBC,IAAMF,EAAW;AAEvB,MAAI,CAACE,EAAK;AAGV,MAAIC,IAAY,GACZC,IAAe;AACnB,QAAMC,IAAQ,CAAA;AAEd,WAASC,IAAY,GAAGA,IAAYJ,GAAKI,KAAa;AACpD,UAAMC,IAASP,EAAWM,CAAS;AAoBnC,QAlBAD,EAAM,KAAK,CAAC,IAMRL,EAAWG,CAAS,EAAE,WAAWI,EAAO,UAAUH,MAAiBG,EAAO,QAAQ,OACpFJ,IAAYG,IAGdF,IAAeG,EAAO,OAMtBA,EAAO,SAASA,EAAO,UAAU,GAE7B,CAACA,EAAO,MAAO;AAOnB,IAAKN,EAAc,eAAeM,EAAO,MAAM,MAC7CN,EAAcM,EAAO,MAAM,IAAI,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAGxD,UAAMC,IAAeP,EAAcM,EAAO,MAAM,GAAGA,EAAO,OAAO,IAAI,KAAMA,EAAO,SAAS,CAAE;AAE7F,QAAIE,IAAYN,IAAYE,EAAMF,CAAS,IAAI,GAE3CO,IAAkBD;AAEtB,WAAOA,IAAYD,GAAcC,KAAaJ,EAAMI,CAAS,IAAI,GAAG;AAClE,YAAME,IAASX,EAAWS,CAAS;AAEnC,UAAIE,EAAO,WAAWJ,EAAO,UAEzBI,EAAO,QAAQA,EAAO,MAAM,GAAG;AACjC,YAAIC,IAAa;AAiBjB,aARID,EAAO,SAASJ,EAAO,UACpBI,EAAO,SAASJ,EAAO,UAAU,MAAM,MACtCI,EAAO,SAAS,MAAM,KAAKJ,EAAO,SAAS,MAAM,OACnDK,IAAa,KAKf,CAACA,GAAY;AAKf,gBAAMC,IAAWJ,IAAY,KAAK,CAACT,EAAWS,IAAY,CAAC,EAAE,OACzDJ,EAAMI,IAAY,CAAC,IAAI,IACvB;AAEJ,UAAAJ,EAAMC,CAAS,IAAIA,IAAYG,IAAYI,GAC3CR,EAAMI,CAAS,IAAII,GAEnBN,EAAO,OAAQ,IACfI,EAAO,MAAQL,GACfK,EAAO,QAAQ,IACfD,IAAkB,IAGlBN,IAAe;AACf;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAIM,MAAoB,OAQtBT,EAAcM,EAAO,MAAM,GAAGA,EAAO,OAAO,IAAI,MAAOA,EAAO,UAAU,KAAK,CAAE,IAAIG;AAAA,EAEvF;AACF;AAEe,SAASI,EAAYC,GAAO;AACzC,QAAMC,IAAcD,EAAM,aACpBb,IAAMa,EAAM,YAAY;AAE9B,EAAAhB,EAAkBgB,EAAM,UAAU;AAElC,WAASE,IAAO,GAAGA,IAAOf,GAAKe;AAC7B,IAAID,EAAYC,CAAI,KAAKD,EAAYC,CAAI,EAAE,cACzClB,EAAkBiB,EAAYC,CAAI,EAAE,UAAU;AAGpD;","x_google_ignoreList":[0]}