{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["import MarkdownIt, { Token } from 'markdown-it'\nimport StateBlock from 'markdown-it/lib/rules_block/state_block'\nimport { RuleBlock } from 'markdown-it/lib/parser_block'\n\nconst tableClassStartRE = new RegExp(\n  '^\\\\s*{[|]\\\\s*class\\\\s*=\\\\s*\"\\\\s*(.*)\"\\\\s*',\n)\nconst tableClassEndRE = new RegExp('^\\\\s*[|]}\\\\s*')\nconst centerStartRE = new RegExp('^s*->.*')\nconst centerEndRE = new RegExp('.*<-s*$')\nconst outerPipesRE = new RegExp('^s*[|].+[|]s*$')\n\nfunction getLine(state: StateBlock, line: number): string {\n  const pos = state.bMarks[line] + state.blkIndent\n  const max = state.eMarks[line]\n\n  return state.src.substring(pos, max)\n}\n\nfunction escapedSplit(str: string): string[] {\n  if (outerPipesRE.test(str)) {\n    str = str.replace(/^\\||\\|$/g, '')\n  }\n\n  const result: string[] = []\n  let pos = 0\n  const max = str.length\n  let ch: number\n  let escapes = 0\n  let lastPos = 0\n  let backTicked = false\n  let lastBackTick = (ch = str.charCodeAt(pos))\n\n  while (pos < max) {\n    if (ch === 0x60 && escapes % 2 === 0) {\n      // `\n      backTicked = !backTicked\n      lastBackTick = pos\n    } else if (ch === 0x7c && escapes % 2 === 0 && !backTicked) {\n      // |\n      result.push(str.substring(lastPos, pos))\n      lastPos = pos + 1\n    } else if (ch === 0x5c) {\n      // \\\n      escapes++\n    } else {\n      escapes = 0\n    }\n\n    pos++\n\n    // If there was an un-closed backtick, go back to just after\n    // the last backtick, but as if it was a normal character\n    if (pos === max && backTicked) {\n      backTicked = false\n      pos = lastBackTick + 1\n    }\n\n    ch = str.charCodeAt(pos)\n  }\n\n  result.push(str.substring(lastPos))\n\n  return result\n}\n\nconst ALLOWED_CLASS_NAMES = [\n  'text-align-center',\n  'text-align-right',\n  'border',\n  'center',\n  'short',\n]\n\nfunction filterClassNames(classNames: string): string {\n  return classNames\n    .split(' ')\n    .filter(className => ALLOWED_CLASS_NAMES.includes(className))\n    .join(' ')\n}\n\nfunction parseDividerForAlignment(\n  dividerLine: string,\n): null | ('left' | 'center' | 'right' | null)[] {\n  if (!dividerLine.startsWith('|') || !dividerLine.endsWith('|')) {\n    // Must start and end with pipes for us to parse out alignment\n    return null\n  }\n  const cols = dividerLine.split('|').map(cell => cell.trim())\n  cols.splice(0, 1) // Remove the first element, which will always be empty\n  const alignments: ('left' | 'center' | 'right' | null)[] = []\n  cols.forEach(col => {\n    if (col.startsWith(':') && col.endsWith(':')) {\n      alignments.push('center')\n    } else if (col.startsWith(':')) {\n      alignments.push('left')\n    } else if (col.endsWith(':')) {\n      alignments.push('right')\n    } else {\n      alignments.push(null)\n    }\n  })\n\n  return alignments\n}\n\nexport default function synapse_table_plugin(md: MarkdownIt) {\n  const table: RuleBlock = (state, startLine, endLine, silent) => {\n    let lineText: string\n    let pos: number\n    let i: number\n    let nextLine: number\n    let columns: string[]\n    let token: Token\n    let tableLines: [number, number]\n    let tbodyLines: [number, number]\n    let classNames: string\n    let tableBodyStartLine: number\n    let headerLine: number\n    let isSpecialSyntaxTable = false\n    let wrapWithDiv = false\n    // should have at least two lines\n    // (!!! Synapse change, used to be 3 due to required ---|---|--- line).  Header and single row.\n    if (startLine + 1 > endLine) {\n      return false\n    }\n\n    pos = state.bMarks[startLine] + state.tShift[startLine]\n    if (pos >= state.eMarks[startLine]) {\n      return false\n    }\n    lineText = getLine(state, startLine)\n\n    // look for optional class definition start, like '{| class=\"border\"'\n    if (tableClassStartRE.test(lineText)) {\n      // this table definition includes class names, so the start marker is {| and end marker will be |}\n      classNames = lineText.match(tableClassStartRE)[1]\n      wrapWithDiv = classNames.indexOf('short') !== -1\n      headerLine = startLine + 1\n      // If tableClassStartRE passes, then it's definitely a table.\n      isSpecialSyntaxTable = true\n    } else {\n      headerLine = startLine\n    }\n\n    if (state.sCount[headerLine] < state.blkIndent) {\n      return false\n    }\n\n    pos = state.bMarks[headerLine] + state.tShift[headerLine]\n    if (pos >= state.eMarks[headerLine]) {\n      return false\n    }\n\n    // read column headers\n    lineText = getLine(state, headerLine).trim()\n    if (lineText.indexOf('|') === -1 && !isSpecialSyntaxTable) {\n      return false\n    }\n\n    // has a '|'.  If it looks like there is math on this line, skip it.\n    if (lineText.indexOf('$$') !== -1) {\n      return false\n    }\n    columns = escapedSplit(lineText)\n    // header row will define an amount of columns in the entire table,\n    // and align row shouldn't be smaller than that (the rest of the rows can)\n    const columnCount = columns.length\n\n    if (silent) {\n      return true\n    }\n\n    if (wrapWithDiv) {\n      token = state.push('div_wrapper', 'div', 1)\n      token.attrJoin('class', 'markdowntableWrap')\n    }\n    token = state.push('table_open', 'table', 1)\n    token.map = tableLines = [startLine, 0]\n    if (classNames) {\n      token.attrJoin('class', filterClassNames(classNames))\n      // start line of the table (header) is really the second line.\n      startLine++\n    }\n\n    lineText = getLine(state, headerLine + 1).trim()\n\n    let alignments: (string | null)[] | null = null\n    // If this line is of the form ---|---|---, then we have column headers, and we should skip this line.\n    // Else, no column headers and we should skip to the body.\n    if (/^[-:| ]+$/.test(lineText) && lineText.indexOf('|') !== -1) {\n      alignments = parseDividerForAlignment(lineText)\n      // we have column headers\n      tableBodyStartLine = headerLine + 2\n      token = state.push('thead_open', 'thead', 1)\n      token.map = [startLine, startLine + 1]\n\n      token = state.push('tr_open', 'tr', 1)\n      token.map = [startLine, startLine + 1]\n\n      for (i = 0; i < columns.length; i++) {\n        token = state.push('th_open', 'th', 1)\n        token.map = [startLine, startLine + 1]\n        if (alignments && alignments[i]) {\n          token.attrSet('style', `text-align: ${alignments[i]}`)\n        }\n\n        token = state.push('inline', '', 0)\n        token.content = columns[i].trim()\n        token.map = [startLine, startLine + 1]\n        token.children = []\n\n        token = state.push('th_close', 'th', -1)\n      }\n\n      token = state.push('tr_close', 'tr', -1)\n      token = state.push('thead_close', 'thead', -1)\n    } else {\n      // no column headers\n      tableBodyStartLine = headerLine\n    }\n\n    token = state.push('tbody_open', 'tbody', 1)\n    token.map = tbodyLines = [tableBodyStartLine, 0]\n\n    for (nextLine = tableBodyStartLine; nextLine < endLine; nextLine++) {\n      if (state.sCount[nextLine] < state.blkIndent) {\n        break\n      }\n\n      lineText = getLine(state, nextLine).trim()\n      if (tableClassEndRE.test(lineText)) {\n        // end of table with class definitions. Include this line in the table definition\n        nextLine++\n        break\n      }\n      if (lineText.indexOf('|') === -1 && !isSpecialSyntaxTable) {\n        break\n      }\n      columns = escapedSplit(lineText)\n\n      token = state.push('tr_open', 'tr', 1)\n      // if line starts with -> and ends with <-, then eat these characters (SWC-3000)\n      if (\n        centerStartRE.test(columns[0]) &&\n        centerEndRE.test(columns[columnCount - 1])\n      ) {\n        columns[0] = columns[0].substring(columns[0].indexOf('->') + 2)\n        columns[columnCount - 1] = columns[columnCount - 1].substring(\n          0,\n          columns[columnCount - 1].indexOf('<-'),\n        )\n      }\n      for (i = 0; i < columnCount; i++) {\n        token = state.push('td_open', 'td', 1)\n        if (alignments && alignments[i]) {\n          token.attrSet('style', `text-align: ${alignments[i]}`)\n        }\n        token = state.push('inline', '', 0)\n        token.content = columns[i] ? columns[i].trim() : ''\n        token.children = []\n\n        token = state.push('td_close', 'td', -1)\n      }\n      token = state.push('tr_close', 'tr', -1)\n    }\n    state.push('tbody_close', 'tbody', -1)\n    state.push('table_close', 'table', -1)\n\n    if (wrapWithDiv) {\n      state.push('div_wrapper', 'div', -1)\n    }\n\n    tableLines[1] = tbodyLines[1] = nextLine\n    state.line = nextLine\n    return true\n  }\n  const rulesCanBeTerminated = ['paragraph', 'reference']\n  md.block.ruler.at('table', table, { alt: rulesCanBeTerminated.slice() })\n}\n"],"names":["tableClassStartRE","tableClassEndRE","centerStartRE","centerEndRE","outerPipesRE","getLine","state","line","pos","max","escapedSplit","str","result","ch","escapes","lastPos","backTicked","lastBackTick","ALLOWED_CLASS_NAMES","filterClassNames","classNames","className","parseDividerForAlignment","dividerLine","cols","cell","alignments","col","synapse_table_plugin","md","table","startLine","endLine","silent","lineText","i","nextLine","columns","token","tableLines","tbodyLines","tableBodyStartLine","headerLine","isSpecialSyntaxTable","wrapWithDiv","columnCount","rulesCanBeTerminated"],"mappings":"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"}