UNPKG

75.7 kBSource Map (JSON)View Raw
1{"version":3,"file":"index.module.js","sources":["../node_modules/unquote/index.js","../index.tsx"],"sourcesContent":["var reg = /[\\'\\\"]/\n\nmodule.exports = function unquote(str) {\n if (!str) {\n return ''\n }\n if (reg.test(str.charAt(0))) {\n str = str.substr(1)\n }\n if (reg.test(str.charAt(str.length - 1))) {\n str = str.substr(0, str.length - 1)\n }\n return str\n}\n","/* @jsx h */\n/**\n * markdown-to-jsx@6 is a fork of [simple-markdown v0.2.2](https://github.com/Khan/simple-markdown)\n * from Khan Academy. Thank you Khan devs for making such an awesome and extensible\n * parsing infra... without it, half of the optimizations here wouldn't be feasible. 🙏🏼\n */\nimport React from 'react'\n/// <reference path=\"unquote.d.ts\" />\nimport unquote from 'unquote'\n\nexport namespace MarkdownToJSX {\n /**\n * RequireAtLeastOne<{ ... }> <- only requires at least one key\n */\n type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<\n T,\n Exclude<keyof T, Keys>\n > &\n {\n [K in Keys]-?: Required<Pick<T, K>> & Partial<Pick<T, Exclude<Keys, K>>>\n }[Keys]\n\n export type CreateElement = typeof React.createElement\n\n export type HTMLTags = keyof JSX.IntrinsicElements\n\n export type State = {\n _list?: boolean\n inline?: boolean\n inTable?: boolean\n inAnchor?: boolean\n key?: React.Key\n simple?: boolean\n }\n\n export type ParserResult = {\n [key: string]: any\n type?: string\n }\n\n export type NestedParser = (\n input: string,\n state?: MarkdownToJSX.State\n ) => MarkdownToJSX.ParserResult\n\n export type Parser<ParserOutput> = (\n capture: RegExpMatchArray,\n nestedParse: NestedParser,\n state?: MarkdownToJSX.State\n ) => ParserOutput\n\n export type RuleOutput = (\n ast: MarkdownToJSX.ParserResult,\n state: MarkdownToJSX.State\n ) => JSX.Element\n\n export type Rule<ParserOutput = MarkdownToJSX.ParserResult> = {\n match: (\n source: string,\n state: MarkdownToJSX.State,\n prevCapturedString?: string\n ) => RegExpMatchArray\n order: Priority\n parse: MarkdownToJSX.Parser<ParserOutput>\n react?: (\n node: ParserOutput,\n output: RuleOutput,\n state?: MarkdownToJSX.State\n ) => React.ReactChild\n }\n\n export type Rules = {\n [key: string]: Rule\n }\n\n export type Override =\n | RequireAtLeastOne<{\n component: React.ElementType\n props: Object\n }>\n | React.ElementType\n\n export type Overrides = {\n [tag in HTMLTags]?: Override\n } & {\n [customComponent: string]: Override\n }\n\n export type Options = Partial<{\n /**\n * Ultimate control over the output of all rendered JSX.\n */\n createElement: (\n tag: Parameters<CreateElement>[0],\n props: React.Props<any>,\n ...children: React.ReactChild[]\n ) => JSX.Element\n\n /**\n * Disable the compiler's best-effort transcription of provided raw HTML\n * into JSX-equivalent. This is the functionality that prevents the need to\n * use `dangerouslySetInnerHTML` in React.\n */\n disableParsingRawHTML: boolean\n\n /**\n * Forces the compiler to always output content with a block-level wrapper\n * (`<p>` or any block-level syntax your markdown already contains.)\n */\n forceBlock: boolean\n\n /**\n * Forces the compiler to always output content with an inline wrapper (`<span>`)\n */\n forceInline: boolean\n\n /**\n * Supply additional HTML entity: unicode replacement mappings.\n *\n * Pass only the inner part of the entity as the key,\n * e.g. `&le;` -> `{ \"le\": \"\\u2264\" }`\n *\n * By default\n * the following entites are replaced with their unicode equivalents:\n *\n * ```\n * &amp;\n * &apos;\n * &gt;\n * &lt;\n * &nbsp;\n * &quot;\n * ```\n */\n namedCodesToUnicode: {\n [key: string]: string\n }\n\n /**\n * Selectively control the output of particular HTML tags as they would be\n * emitted by the compiler.\n */\n overrides: Overrides\n\n /**\n * Declare the type of the wrapper to be used when there are multiple\n * children to render. Set to `null` to get an array of children back\n * without any wrapper, or use `React.Fragment` to get a React element\n * that won't show up in the DOM.\n */\n wrapper: React.ElementType | null\n\n /**\n * Forces the compiler to wrap results, even if there is only a single\n * child or no children.\n */\n forceWrapper: boolean\n\n /**\n * Override normalization of non-URI-safe characters for use in generating\n * HTML IDs for anchor linking purposes.\n */\n slugify: (source: string) => string\n }>\n}\n\n/** TODO: Drop for React 16? */\nconst ATTRIBUTE_TO_JSX_PROP_MAP = {\n accesskey: 'accessKey',\n allowfullscreen: 'allowFullScreen',\n allowtransparency: 'allowTransparency',\n autocomplete: 'autoComplete',\n autofocus: 'autoFocus',\n autoplay: 'autoPlay',\n cellpadding: 'cellPadding',\n cellspacing: 'cellSpacing',\n charset: 'charSet',\n class: 'className',\n classid: 'classId',\n colspan: 'colSpan',\n contenteditable: 'contentEditable',\n contextmenu: 'contextMenu',\n crossorigin: 'crossOrigin',\n enctype: 'encType',\n for: 'htmlFor',\n formaction: 'formAction',\n formenctype: 'formEncType',\n formmethod: 'formMethod',\n formnovalidate: 'formNoValidate',\n formtarget: 'formTarget',\n frameborder: 'frameBorder',\n hreflang: 'hrefLang',\n inputmode: 'inputMode',\n keyparams: 'keyParams',\n keytype: 'keyType',\n marginheight: 'marginHeight',\n marginwidth: 'marginWidth',\n maxlength: 'maxLength',\n mediagroup: 'mediaGroup',\n minlength: 'minLength',\n novalidate: 'noValidate',\n radiogroup: 'radioGroup',\n readonly: 'readOnly',\n rowspan: 'rowSpan',\n spellcheck: 'spellCheck',\n srcdoc: 'srcDoc',\n srclang: 'srcLang',\n srcset: 'srcSet',\n tabindex: 'tabIndex',\n usemap: 'useMap',\n} as const\n\nconst namedCodesToUnicode = {\n amp: '\\u0026',\n apos: '\\u0027',\n gt: '\\u003e',\n lt: '\\u003c',\n nbsp: '\\u00a0',\n quot: '\\u201c',\n} as const\n\nconst DO_NOT_PROCESS_HTML_ELEMENTS = ['style', 'script']\n\n/**\n * the attribute extractor regex looks for a valid attribute name,\n * followed by an equal sign (whitespace around the equal sign is allowed), followed\n * by one of the following:\n *\n * 1. a single quote-bounded string, e.g. 'foo'\n * 2. a double quote-bounded string, e.g. \"bar\"\n * 3. an interpolation, e.g. {something}\n *\n * JSX can be be interpolated into itself and is passed through the compiler using\n * the same options and setup as the current run.\n *\n * <Something children={<SomeOtherThing />} />\n * ==================\n * ↳ children: [<SomeOtherThing />]\n *\n * Otherwise, interpolations are handled as strings or simple booleans\n * unless HTML syntax is detected.\n *\n * <Something color={green} disabled={true} />\n * ===== ====\n * ↓ ↳ disabled: true\n * ↳ color: \"green\"\n *\n * Numbers are not parsed at this time due to complexities around int, float,\n * and the upcoming bigint functionality that would make handling it unwieldy.\n * Parse the string in your component as desired.\n *\n * <Something someBigNumber={123456789123456789} />\n * ==================\n * ↳ someBigNumber: \"123456789123456789\"\n */\nconst ATTR_EXTRACTOR_R = /([-A-Z0-9_:]+)(?:\\s*=\\s*(?:(?:\"((?:\\\\.|[^\"])*)\")|(?:'((?:\\\\.|[^'])*)')|(?:\\{((?:\\\\.|{[^}]*?}|[^}])*)\\})))?/gi\n\n/** TODO: Write explainers for each of these */\n\nconst AUTOLINK_MAILTO_CHECK_R = /mailto:/i\nconst BLOCK_END_R = /\\n{2,}$/\nconst BLOCKQUOTE_R = /^( *>[^\\n]+(\\n[^\\n]+)*\\n*)+\\n{2,}/\nconst BLOCKQUOTE_TRIM_LEFT_MULTILINE_R = /^ *> ?/gm\nconst BREAK_LINE_R = /^ {2,}\\n/\nconst BREAK_THEMATIC_R = /^(?:( *[-*_]) *){3,}(?:\\n *)+\\n/\nconst CODE_BLOCK_FENCED_R = /^\\s*(`{3,}|~{3,}) *(\\S+)? *\\n([\\s\\S]+?)\\s*\\1 *(?:\\n *)+\\n?/\nconst CODE_BLOCK_R = /^(?: {4}[^\\n]+\\n*)+(?:\\n *)+\\n?/\nconst CODE_INLINE_R = /^(`+)\\s*([\\s\\S]*?[^`])\\s*\\1(?!`)/\nconst CONSECUTIVE_NEWLINE_R = /^(?:\\n *)*\\n/\nconst CR_NEWLINE_R = /\\r\\n?/g\nconst FOOTNOTE_R = /^\\[\\^([^\\]]+)](:.*)\\n/\nconst FOOTNOTE_REFERENCE_R = /^\\[\\^([^\\]]+)]/\nconst FORMFEED_R = /\\f/g\nconst GFM_TASK_R = /^\\s*?\\[(x|\\s)\\]/\nconst HEADING_R = /^ *(#{1,6}) *([^\\n]+?)(?: +#*)?(?:\\n *)*(?:\\n|$)/\nconst HEADING_SETEXT_R = /^([^\\n]+)\\n *(=|-){3,} *(?:\\n *)+\\n/\n\n/**\n * Explanation:\n *\n * 1. Look for a starting tag, preceeded by any amount of spaces\n * ^ *<\n *\n * 2. Capture the tag name (capture 1)\n * ([^ >/]+)\n *\n * 3. Ignore a space after the starting tag and capture the attribute portion of the tag (capture 2)\n * ?([^>]*)\\/{0}>\n *\n * 4. Ensure a matching closing tag is present in the rest of the input string\n * (?=[\\s\\S]*<\\/\\1>)\n *\n * 5. Capture everything until the matching closing tag -- this might include additional pairs\n * of the same tag type found in step 2 (capture 3)\n * ((?:[\\s\\S]*?(?:<\\1[^>]*>[\\s\\S]*?<\\/\\1>)*[\\s\\S]*?)*?)<\\/\\1>\n *\n * 6. Capture excess newlines afterward\n * \\n*\n */\nconst HTML_BLOCK_ELEMENT_R = /^ *(?!<[a-z][^ >/]* ?\\/>)<([a-z][^ >/]*) ?([^>]*)\\/{0}>\\n?(\\s*(?:<\\1[^>]*?>[\\s\\S]*?<\\/\\1>|(?!<\\1)[\\s\\S])*?)<\\/\\1>\\n*/i\n\nconst HTML_CHAR_CODE_R = /&([a-z]+);/g\n\nconst HTML_COMMENT_R = /^<!--[\\s\\S]*?(?:-->)/\n\n/**\n * borrowed from React 15(https://github.com/facebook/react/blob/894d20744cba99383ffd847dbd5b6e0800355a5c/src/renderers/dom/shared/HTMLDOMPropertyConfig.js)\n */\nconst HTML_CUSTOM_ATTR_R = /^(data|aria|x)-[a-z_][a-z\\d_.-]*$/\n\nconst HTML_SELF_CLOSING_ELEMENT_R = /^ *<([a-z][a-z0-9:]*)(?:\\s+((?:<.*?>|[^>])*))?\\/?>(?!<\\/\\1>)(\\s*\\n)?/i\nconst INTERPOLATION_R = /^\\{.*\\}$/\nconst LINK_AUTOLINK_BARE_URL_R = /^(https?:\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])/\nconst LINK_AUTOLINK_MAILTO_R = /^<([^ >]+@[^ >]+)>/\nconst LINK_AUTOLINK_R = /^<([^ >]+:\\/[^ >]+)>/\nconst LIST_ITEM_END_R = / *\\n+$/\nconst LIST_LOOKBEHIND_R = /(?:^|\\n)( *)$/\nconst CAPTURE_LETTER_AFTER_HYPHEN = /-([a-z])?/gi\nconst NP_TABLE_R = /^(.*\\|?.*)\\n *(\\|? *[-:]+ *\\|[-| :]*)\\n((?:.*\\|.*\\n)*)\\n?/\nconst PARAGRAPH_R = /^((?:[^\\n]|\\n(?! *\\n))+)(?:\\n *)+\\n/\nconst REFERENCE_IMAGE_OR_LINK = /^\\[([^\\]]*)\\]:\\s*(\\S+)\\s*(\"([^\"]*)\")?/\nconst REFERENCE_IMAGE_R = /^!\\[([^\\]]*)\\] ?\\[([^\\]]*)\\]/\nconst REFERENCE_LINK_R = /^\\[([^\\]]*)\\] ?\\[([^\\]]*)\\]/\nconst SQUARE_BRACKETS_R = /(\\[|\\])/g\nconst SHOULD_RENDER_AS_BLOCK_R = /(\\n|^[-*]\\s|^#|^ {2,}|^-{2,}|^>\\s)/\nconst TAB_R = /\\t/g\nconst TABLE_SEPARATOR_R = /^ *\\| */\nconst TABLE_TRIM_PIPES = /(^ *\\||\\| *$)/g\nconst TABLE_CELL_END_TRIM = / *$/\nconst TABLE_CENTER_ALIGN = /^ *:-+: *$/\nconst TABLE_LEFT_ALIGN = /^ *:-+ *$/\nconst TABLE_RIGHT_ALIGN = /^ *-+: *$/\n\nconst TEXT_BOLD_R = /^([*_])\\1((?:\\[.*?\\][([].*?[)\\]]|<.*?>(?:.*?<.*?>)?|`.*?`|~+.*?~+|.)*?)\\1\\1(?!\\1)/\nconst TEXT_EMPHASIZED_R = /^([*_])((?:\\[.*?\\][([].*?[)\\]]|<.*?>(?:.*?<.*?>)?|`.*?`|~+.*?~+|.)*?)\\1(?!\\1|\\w)/\nconst TEXT_STRIKETHROUGHED_R = /^~~((?:\\[.*?\\]|<.*?>(?:.*?<.*?>)?|`.*?`|.)*?)~~/\n\nconst TEXT_ESCAPED_R = /^\\\\([^0-9A-Za-z\\s])/\nconst TEXT_PLAIN_R = /^[\\s\\S]+?(?=[^0-9A-Z\\s\\u00c0-\\uffff&;.()'\"]|\\d+\\.|\\n\\n| {2,}\\n|\\w+:\\S|$)/i\nconst TRIM_NEWLINES_AND_TRAILING_WHITESPACE_R = /(^\\n+|\\n+$|\\s+$)/g\n\nconst HTML_LEFT_TRIM_AMOUNT_R = /^([ \\t]*)/\n\nconst UNESCAPE_URL_R = /\\\\([^0-9A-Z\\s])/gi\n\n// recognize a `*` `-`, `+`, `1.`, `2.`... list bullet\nconst LIST_BULLET = '(?:[*+-]|\\\\d+\\\\.)'\n\n// recognize the start of a list item:\n// leading space plus a bullet plus a space (` * `)\nconst LIST_ITEM_PREFIX = '( *)(' + LIST_BULLET + ') +'\nconst LIST_ITEM_PREFIX_R = new RegExp('^' + LIST_ITEM_PREFIX)\n\n// recognize an individual list item:\n// * hi\n// this is part of the same item\n//\n// as is this, which is a new paragraph in the same item\n//\n// * but this is not part of the same item\nconst LIST_ITEM_R = new RegExp(\n LIST_ITEM_PREFIX +\n '[^\\\\n]*(?:\\\\n' +\n '(?!\\\\1' +\n LIST_BULLET +\n ' )[^\\\\n]*)*(\\\\n|$)',\n 'gm'\n)\n\n// check whether a list item has paragraphs: if it does,\n// we leave the newlines at the end\nconst LIST_R = new RegExp(\n '^( *)(' +\n LIST_BULLET +\n ') ' +\n '[\\\\s\\\\S]+?(?:\\\\n{2,}(?! )' +\n '(?!\\\\1' +\n LIST_BULLET +\n ' (?!' +\n LIST_BULLET +\n ' ))\\\\n*' +\n // the \\\\s*$ here is so that we can parse the inside of nested\n // lists, where our content might end before we receive two `\\n`s\n '|\\\\s*\\\\n*$)'\n)\n\nconst LINK_INSIDE = '(?:\\\\[[^\\\\]]*\\\\]|[^\\\\[\\\\]]|\\\\](?=[^\\\\[]*\\\\]))*'\nconst LINK_HREF_AND_TITLE =\n '\\\\s*<?((?:[^\\\\s\\\\\\\\]|\\\\\\\\.)*?)>?(?:\\\\s+[\\'\"]([\\\\s\\\\S]*?)[\\'\"])?\\\\s*'\n\nconst LINK_R = new RegExp(\n '^\\\\[(' + LINK_INSIDE + ')\\\\]\\\\(' + LINK_HREF_AND_TITLE + '\\\\)'\n)\n\nconst IMAGE_R = new RegExp(\n '^!\\\\[(' + LINK_INSIDE + ')\\\\]\\\\(' + LINK_HREF_AND_TITLE + '\\\\)'\n)\n\nconst BLOCK_SYNTAXES = [\n BLOCKQUOTE_R,\n CODE_BLOCK_R,\n CODE_BLOCK_FENCED_R,\n HEADING_R,\n HEADING_SETEXT_R,\n HTML_BLOCK_ELEMENT_R,\n HTML_COMMENT_R,\n HTML_SELF_CLOSING_ELEMENT_R,\n LIST_ITEM_R,\n LIST_R,\n NP_TABLE_R,\n PARAGRAPH_R,\n]\n\nfunction containsBlockSyntax(input: string) {\n return BLOCK_SYNTAXES.some(r => r.test(input))\n}\n\n// based on https://stackoverflow.com/a/18123682/1141611\n// not complete, but probably good enough\nfunction slugify(str: string) {\n return str\n .replace(/[ÀÁÂÃÄÅàáâãäåæÆ]/g, 'a')\n .replace(/[çÇ]/g, 'c')\n .replace(/[ðÐ]/g, 'd')\n .replace(/[ÈÉÊËéèêë]/g, 'e')\n .replace(/[ÏïÎîÍíÌì]/g, 'i')\n .replace(/[Ññ]/g, 'n')\n .replace(/[øØœŒÕõÔôÓóÒò]/g, 'o')\n .replace(/[ÜüÛûÚúÙù]/g, 'u')\n .replace(/[ŸÿÝý]/g, 'y')\n .replace(/[^a-z0-9- ]/gi, '')\n .replace(/ /gi, '-')\n .toLowerCase()\n}\n\nfunction parseTableAlignCapture(alignCapture: string) {\n if (TABLE_RIGHT_ALIGN.test(alignCapture)) {\n return 'right'\n } else if (TABLE_CENTER_ALIGN.test(alignCapture)) {\n return 'center'\n } else if (TABLE_LEFT_ALIGN.test(alignCapture)) {\n return 'left'\n }\n\n return null\n}\n\nfunction parseTableRow(\n source: string,\n parse: MarkdownToJSX.NestedParser,\n state: MarkdownToJSX.State\n) {\n const prevInTable = state.inTable\n state.inTable = true\n const tableRow = parse(source.trim(), state)\n state.inTable = prevInTable\n\n let cells = [[]]\n tableRow.forEach(function (node, i) {\n if (node.type === 'tableSeparator') {\n // Filter out empty table separators at the start/end:\n if (i !== 0 && i !== tableRow.length - 1) {\n // Split the current row:\n cells.push([])\n }\n } else {\n if (\n node.type === 'text' &&\n (tableRow[i + 1] == null || tableRow[i + 1].type === 'tableSeparator')\n ) {\n node.content = node.content.replace(TABLE_CELL_END_TRIM, '')\n }\n cells[cells.length - 1].push(node)\n }\n })\n return cells\n}\n\nfunction parseTableAlign(source: string /*, parse, state*/) {\n const alignText = source.replace(TABLE_TRIM_PIPES, '').split('|')\n\n return alignText.map(parseTableAlignCapture)\n}\n\nfunction parseTableCells(\n source: string,\n parse: MarkdownToJSX.NestedParser,\n state: Object\n) {\n const rowsText = source.trim().split('\\n')\n\n return rowsText.map(function (rowText) {\n return parseTableRow(rowText, parse, state)\n })\n}\n\nfunction parseTable(\n capture: RegExpMatchArray,\n parse: MarkdownToJSX.NestedParser,\n state: MarkdownToJSX.State\n) {\n state.inline = true\n const header = parseTableRow(capture[1], parse, state)\n const align = parseTableAlign(capture[2])\n const cells = parseTableCells(capture[3], parse, state)\n state.inline = false\n\n return {\n align: align,\n cells: cells,\n header: header,\n type: 'table',\n }\n}\n\nfunction getTableStyle(node, colIndex) {\n return node.align[colIndex] == null\n ? {}\n : {\n textAlign: node.align[colIndex],\n }\n}\n\n/** TODO: remove for react 16 */\nfunction normalizeAttributeKey(key) {\n const hyphenIndex = key.indexOf('-')\n\n if (hyphenIndex !== -1 && key.match(HTML_CUSTOM_ATTR_R) === null) {\n key = key.replace(CAPTURE_LETTER_AFTER_HYPHEN, function (_, letter) {\n return letter.toUpperCase()\n })\n }\n\n return key\n}\n\nfunction attributeValueToJSXPropValue(\n key: JSX.IntrinsicAttributes,\n value: string\n): any {\n if (key === 'style') {\n return value.split(/;\\s?/).reduce(function (styles, kvPair) {\n const key = kvPair.slice(0, kvPair.indexOf(':'))\n\n // snake-case to camelCase\n // also handles PascalCasing vendor prefixes\n const camelCasedKey = key.replace(/(-[a-z])/g, substr =>\n substr[1].toUpperCase()\n )\n\n // key.length + 1 to skip over the colon\n styles[camelCasedKey] = kvPair.slice(key.length + 1).trim()\n\n return styles\n }, {})\n } else if (key === 'href') {\n return sanitizeUrl(value)\n } else if (value.match(INTERPOLATION_R)) {\n // return as a string and let the consumer decide what to do with it\n value = value.slice(1, value.length - 1)\n }\n\n if (value === 'true') {\n return true\n } else if (value === 'false') {\n return false\n }\n\n return value\n}\n\nfunction normalizeWhitespace(source: string): string {\n return source\n .replace(CR_NEWLINE_R, '\\n')\n .replace(FORMFEED_R, '')\n .replace(TAB_R, ' ')\n}\n\n/**\n * Creates a parser for a given set of rules, with the precedence\n * specified as a list of rules.\n *\n * @rules: an object containing\n * rule type -> {match, order, parse} objects\n * (lower order is higher precedence)\n * (Note: `order` is added to defaultRules after creation so that\n * the `order` of defaultRules in the source matches the `order`\n * of defaultRules in terms of `order` fields.)\n *\n * @returns The resulting parse function, with the following parameters:\n * @source: the input source string to be parsed\n * @state: an optional object to be threaded through parse\n * calls. Allows clients to add stateful operations to\n * parsing, such as keeping track of how many levels deep\n * some nesting is. For an example use-case, see passage-ref\n * parsing in src/widgets/passage/passage-markdown.jsx\n */\nfunction parserFor(\n rules: MarkdownToJSX.Rules\n): (\n source: string,\n state: MarkdownToJSX.State\n) => ReturnType<MarkdownToJSX.NestedParser> {\n // Sorts rules in order of increasing order, then\n // ascending rule name in case of ties.\n let ruleList = Object.keys(rules)\n\n /* istanbul ignore next */\n if (process.env.NODE_ENV !== 'production') {\n ruleList.forEach(function (type) {\n let order = rules[type].order\n if (\n process.env.NODE_ENV !== 'production' &&\n (typeof order !== 'number' || !isFinite(order))\n ) {\n console.warn(\n 'markdown-to-jsx: Invalid order for rule `' + type + '`: ' + order\n )\n }\n })\n }\n\n ruleList.sort(function (typeA, typeB) {\n let orderA = rules[typeA].order\n let orderB = rules[typeB].order\n\n // First sort based on increasing order\n if (orderA !== orderB) {\n return orderA - orderB\n\n // Then based on increasing unicode lexicographic ordering\n } else if (typeA < typeB) {\n return -1\n }\n\n return 1\n })\n\n function nestedParse(\n source: string,\n state: MarkdownToJSX.State\n ): MarkdownToJSX.ParserResult[] {\n let result = []\n\n // We store the previous capture so that match functions can\n // use some limited amount of lookbehind. Lists use this to\n // ensure they don't match arbitrary '- ' or '* ' in inline\n // text (see the list rule for more information).\n let prevCapture = ''\n while (source) {\n let i = 0\n while (i < ruleList.length) {\n const ruleType = ruleList[i]\n const rule = rules[ruleType]\n const capture = rule.match(source, state, prevCapture)\n\n if (capture) {\n const currCaptureString = capture[0]\n source = source.substring(currCaptureString.length)\n const parsed = rule.parse(capture, nestedParse, state)\n\n // We also let rules override the default type of\n // their parsed node if they would like to, so that\n // there can be a single output function for all links,\n // even if there are several rules to parse them.\n if (parsed.type == null) {\n parsed.type = ruleType\n }\n\n result.push(parsed)\n\n prevCapture = currCaptureString\n break\n }\n\n i++\n }\n }\n\n return result\n }\n\n return function outerParse(source, state) {\n return nestedParse(normalizeWhitespace(source), state)\n }\n}\n\n// Creates a match function for an inline scoped or simple element from a regex\nfunction inlineRegex(regex: RegExp) {\n return function match(source, state) {\n if (state.inline) {\n return regex.exec(source)\n } else {\n return null\n }\n }\n}\n\n// basically any inline element except links\nfunction simpleInlineRegex(regex: RegExp) {\n return function match(source: string, state: MarkdownToJSX.State) {\n if (state.inline || state.simple) {\n return regex.exec(source)\n } else {\n return null\n }\n }\n}\n\n// Creates a match function for a block scoped element from a regex\nfunction blockRegex(regex: RegExp) {\n return function match(source: string, state: MarkdownToJSX.State) {\n if (state.inline || state.simple) {\n return null\n } else {\n return regex.exec(source)\n }\n }\n}\n\n// Creates a match function from a regex, ignoring block/inline scope\nfunction anyScopeRegex(regex: RegExp) {\n return function match(source: string /*, state*/) {\n return regex.exec(source)\n }\n}\n\nfunction reactFor(outputFunc) {\n return function nestedReactOutput(\n ast: MarkdownToJSX.ParserResult | MarkdownToJSX.ParserResult[],\n state: MarkdownToJSX.State = {}\n ): React.ReactChild[] {\n if (Array.isArray(ast)) {\n const oldKey = state.key\n const result = []\n\n // map nestedOutput over the ast, except group any text\n // nodes together into a single string output.\n let lastWasString = false\n\n for (let i = 0; i < ast.length; i++) {\n state.key = i\n\n const nodeOut = nestedReactOutput(ast[i], state)\n const isString = typeof nodeOut === 'string'\n\n if (isString && lastWasString) {\n result[result.length - 1] += nodeOut\n } else {\n result.push(nodeOut)\n }\n\n lastWasString = isString\n }\n\n state.key = oldKey\n\n return result\n }\n\n return outputFunc(ast, nestedReactOutput, state)\n }\n}\n\nfunction sanitizeUrl(url: string): string | null {\n try {\n const decoded = decodeURIComponent(url).replace(/[^A-Za-z0-9/:]/g, '')\n\n if (decoded.match(/^\\s*(javascript|vbscript|data):/i)) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n 'Anchor URL contains an unsafe JavaScript/VBScript/data expression, it will not be rendered.',\n decoded\n )\n }\n\n return null\n }\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(\n 'Anchor URL could not be decoded due to malformed syntax or characters, it will not be rendered.',\n url\n )\n }\n\n // decodeURIComponent sometimes throws a URIError\n // See `decodeURIComponent('a%AFc');`\n // http://stackoverflow.com/questions/9064536/javascript-decodeuricomponent-malformed-uri-exception\n return null\n }\n\n return url\n}\n\nfunction unescapeUrl(rawUrlString: string): string {\n return rawUrlString.replace(UNESCAPE_URL_R, '$1')\n}\n\n/**\n * Everything inline, including links.\n */\nfunction parseInline(\n parse: MarkdownToJSX.NestedParser,\n content: string,\n state: MarkdownToJSX.State\n): MarkdownToJSX.ParserResult {\n const isCurrentlyInline = state.inline || false\n const isCurrentlySimple = state.simple || false\n state.inline = true\n state.simple = true\n const result = parse(content, state)\n state.inline = isCurrentlyInline\n state.simple = isCurrentlySimple\n return result\n}\n\n/**\n * Anything inline that isn't a link.\n */\nfunction parseSimpleInline(\n parse: MarkdownToJSX.NestedParser,\n content: string,\n state: MarkdownToJSX.State\n): MarkdownToJSX.ParserResult {\n const isCurrentlyInline = state.inline || false\n const isCurrentlySimple = state.simple || false\n state.inline = false\n state.simple = true\n const result = parse(content, state)\n state.inline = isCurrentlyInline\n state.simple = isCurrentlySimple\n return result\n}\n\nfunction parseBlock(parse, content, state): MarkdownToJSX.ParserResult {\n state.inline = false\n return parse(content + '\\n\\n', state)\n}\n\nconst parseCaptureInline: MarkdownToJSX.Parser<\n ReturnType<typeof parseInline>\n> = (capture, parse, state) => {\n return {\n content: parseInline(parse, capture[1], state),\n }\n}\n\nfunction captureNothing() {\n return {}\n}\n\nfunction renderNothing() {\n return null\n}\n\nfunction ruleOutput(rules: MarkdownToJSX.Rules) {\n return function nestedRuleOutput(\n ast: MarkdownToJSX.ParserResult,\n outputFunc: MarkdownToJSX.RuleOutput,\n state: MarkdownToJSX.State\n ): React.ReactChild {\n return rules[ast.type].react(ast, outputFunc, state)\n }\n}\n\nfunction cx(...args) {\n return args.filter(Boolean).join(' ')\n}\n\nfunction get(src: Object, path: string, fb?: any) {\n let ptr = src\n const frags = path.split('.')\n\n while (frags.length) {\n ptr = ptr[frags[0]]\n\n if (ptr === undefined) break\n else frags.shift()\n }\n\n return ptr || fb\n}\n\nfunction getTag(tag: string, overrides: MarkdownToJSX.Overrides) {\n const override = get(overrides, tag)\n\n if (!override) return tag\n\n return typeof override === 'function' ||\n (typeof override === 'object' && 'render' in override)\n ? override\n : get(overrides, `${tag}.component`, tag)\n}\n\nenum Priority {\n /**\n * anything that must scan the tree before everything else\n */\n MAX,\n /**\n * scans for block-level constructs\n */\n HIGH,\n /**\n * inline w/ more priority than other inline\n */\n MED,\n /**\n * inline elements\n */\n LOW,\n /**\n * bare text and stuff that is considered leftovers\n */\n MIN,\n}\n\nexport function compiler(\n markdown: string,\n options: MarkdownToJSX.Options = {}\n) {\n options.overrides = options.overrides || {}\n options.slugify = options.slugify || slugify\n options.namedCodesToUnicode = options.namedCodesToUnicode\n ? { ...namedCodesToUnicode, ...options.namedCodesToUnicode }\n : namedCodesToUnicode\n\n const createElementFn = options.createElement || React.createElement\n\n // eslint-disable-next-line no-unused-vars\n function h(\n // locally we always will render a known string tag\n tag: MarkdownToJSX.HTMLTags,\n props: Parameters<MarkdownToJSX.CreateElement>[1] & {\n className?: string\n },\n ...children\n ) {\n const overrideProps = get(options.overrides, `${tag}.props`, {})\n\n return createElementFn(\n getTag(tag, options.overrides),\n {\n ...props,\n ...overrideProps,\n className: cx(props?.className, overrideProps.className) || undefined,\n },\n ...children\n )\n }\n\n function compile(input: string): JSX.Element {\n let inline = false\n\n if (options.forceInline) {\n inline = true\n } else if (!options.forceBlock) {\n /**\n * should not contain any block-level markdown like newlines, lists, headings,\n * thematic breaks, blockquotes, tables, etc\n */\n inline = SHOULD_RENDER_AS_BLOCK_R.test(input) === false\n }\n\n const arr = emitter(\n parser(\n inline\n ? input\n : `${input.replace(TRIM_NEWLINES_AND_TRAILING_WHITESPACE_R, '')}\\n\\n`,\n { inline }\n )\n )\n\n if (options.wrapper === null) {\n return arr\n }\n\n const wrapper = options.wrapper || (inline ? 'span' : 'div')\n let jsx\n\n if (arr.length > 1 || options.forceWrapper) {\n jsx = arr\n } else if (arr.length === 1) {\n jsx = arr[0]\n\n // TODO: remove this for React 16\n if (typeof jsx === 'string') {\n return <span key=\"outer\">{jsx}</span>\n } else {\n return jsx\n }\n } else {\n // TODO: return null for React 16\n jsx = null\n }\n\n return React.createElement(wrapper, { key: 'outer' }, jsx)\n }\n\n function attrStringToMap(str: string): React.Props<any> {\n const attributes = str.match(ATTR_EXTRACTOR_R)\n\n return attributes\n ? attributes.reduce(function (map, raw, index) {\n const delimiterIdx = raw.indexOf('=')\n\n if (delimiterIdx !== -1) {\n const key = normalizeAttributeKey(raw.slice(0, delimiterIdx)).trim()\n const value = unquote(raw.slice(delimiterIdx + 1).trim())\n\n const mappedKey = ATTRIBUTE_TO_JSX_PROP_MAP[key] || key\n const normalizedValue = (map[\n mappedKey\n ] = attributeValueToJSXPropValue(key, value))\n\n if (\n typeof normalizedValue === 'string' &&\n (HTML_BLOCK_ELEMENT_R.test(normalizedValue) ||\n HTML_SELF_CLOSING_ELEMENT_R.test(normalizedValue))\n ) {\n map[mappedKey] = React.cloneElement(\n compile(normalizedValue.trim()),\n { key: index }\n )\n }\n } else if (raw !== 'style') {\n map[ATTRIBUTE_TO_JSX_PROP_MAP[raw] || raw] = true\n }\n\n return map\n }, {})\n : undefined\n }\n\n /* istanbul ignore next */\n if (process.env.NODE_ENV !== 'production') {\n if (typeof markdown !== 'string') {\n throw new Error(`markdown-to-jsx: the first argument must be\n a string`)\n }\n\n if (\n Object.prototype.toString.call(options.overrides) !== '[object Object]'\n ) {\n throw new Error(`markdown-to-jsx: options.overrides (second argument property) must be\n undefined or an object literal with shape:\n {\n htmltagname: {\n component: string|ReactComponent(optional),\n props: object(optional)\n }\n }`)\n }\n }\n\n const footnotes: { footnote: string; identifier: string }[] = []\n const refs: { [key: string]: { target: string; title: string } } = {}\n\n /**\n * each rule's react() output function goes through our custom h() JSX pragma;\n * this allows the override functionality to be automatically applied\n */\n const rules: MarkdownToJSX.Rules = {\n blockQuote: {\n match: blockRegex(BLOCKQUOTE_R),\n order: Priority.HIGH,\n parse(capture, parse, state) {\n return {\n content: parse(\n capture[0].replace(BLOCKQUOTE_TRIM_LEFT_MULTILINE_R, ''),\n state\n ),\n }\n },\n react(node, output, state) {\n return (\n <blockquote key={state.key}>{output(node.content, state)}</blockquote>\n )\n },\n } as MarkdownToJSX.Rule<{ content: MarkdownToJSX.ParserResult }>,\n\n breakLine: {\n match: anyScopeRegex(BREAK_LINE_R),\n order: Priority.HIGH,\n parse: captureNothing,\n react(_, __, state) {\n return <br key={state.key} />\n },\n },\n\n breakThematic: {\n match: blockRegex(BREAK_THEMATIC_R),\n order: Priority.HIGH,\n parse: captureNothing,\n react(_, __, state) {\n return <hr key={state.key} />\n },\n },\n\n codeBlock: {\n match: blockRegex(CODE_BLOCK_R),\n order: Priority.MAX,\n parse(capture /*, parse, state*/) {\n return {\n content: capture[0].replace(/^ {4}/gm, '').replace(/\\n+$/, ''),\n lang: undefined,\n }\n },\n\n react(node, output, state) {\n return (\n <pre key={state.key}>\n <code className={node.lang ? `lang-${node.lang}` : ''}>\n {node.content}\n </code>\n </pre>\n )\n },\n } as MarkdownToJSX.Rule<{ content: string; lang?: string }>,\n\n codeFenced: {\n match: blockRegex(CODE_BLOCK_FENCED_R),\n order: Priority.MAX,\n parse(capture /*, parse, state*/) {\n return {\n content: capture[3],\n lang: capture[2] || undefined,\n type: 'codeBlock',\n }\n },\n },\n\n codeInline: {\n match: simpleInlineRegex(CODE_INLINE_R),\n order: Priority.LOW,\n parse(capture /*, parse, state*/) {\n return {\n content: capture[2],\n }\n },\n react(node, output, state) {\n return <code key={state.key}>{node.content}</code>\n },\n } as MarkdownToJSX.Rule<{ content: string }>,\n\n /**\n * footnotes are emitted at the end of compilation in a special <footer> block\n */\n footnote: {\n match: blockRegex(FOOTNOTE_R),\n order: Priority.MAX,\n parse(capture /*, parse, state*/) {\n footnotes.push({\n footnote: capture[2],\n identifier: capture[1],\n })\n\n return {}\n },\n react: renderNothing,\n },\n\n footnoteReference: {\n match: inlineRegex(FOOTNOTE_REFERENCE_R),\n order: Priority.HIGH,\n parse(capture /*, parse*/) {\n return {\n content: capture[1],\n target: `#${options.slugify(capture[1])}`,\n }\n },\n react(node, output, state) {\n return (\n <a key={state.key} href={sanitizeUrl(node.target)}>\n <sup key={state.key}>{node.content}</sup>\n </a>\n )\n },\n } as MarkdownToJSX.Rule<{ content: string; target: string }>,\n\n gfmTask: {\n match: inlineRegex(GFM_TASK_R),\n order: Priority.HIGH,\n parse(capture /*, parse, state*/) {\n return {\n completed: capture[1].toLowerCase() === 'x',\n }\n },\n react(node, output, state) {\n return (\n <input\n checked={node.completed}\n key={state.key}\n readOnly\n type=\"checkbox\"\n />\n )\n },\n } as MarkdownToJSX.Rule<{ completed: boolean }>,\n\n heading: {\n match: blockRegex(HEADING_R),\n order: Priority.HIGH,\n parse(capture, parse, state) {\n return {\n content: parseInline(parse, capture[2], state),\n id: options.slugify(capture[2]),\n level: capture[1].length,\n }\n },\n react(node, output, state) {\n node.tag = `h${node.level}` as MarkdownToJSX.HTMLTags\n return (\n <node.tag id={node.id} key={state.key}>\n {output(node.content, state)}\n </node.tag>\n )\n },\n } as MarkdownToJSX.Rule<{\n content: MarkdownToJSX.ParserResult\n id: string\n level: number\n tag: MarkdownToJSX.HTMLTags\n }>,\n\n headingSetext: {\n match: blockRegex(HEADING_SETEXT_R),\n order: Priority.MAX,\n parse(capture, parse, state) {\n return {\n content: parseInline(parse, capture[1], state),\n level: capture[2] === '=' ? 1 : 2,\n type: 'heading',\n }\n },\n },\n\n htmlComment: {\n match: anyScopeRegex(HTML_COMMENT_R),\n order: Priority.HIGH,\n parse() {\n return {}\n },\n react: renderNothing,\n },\n\n image: {\n match: simpleInlineRegex(IMAGE_R),\n order: Priority.HIGH,\n parse(capture /*, parse, state*/) {\n return {\n alt: capture[1],\n target: unescapeUrl(capture[2]),\n title: capture[3],\n }\n },\n react(node, output, state) {\n return (\n <img\n key={state.key}\n alt={node.alt || undefined}\n title={node.title || undefined}\n src={sanitizeUrl(node.target)}\n />\n )\n },\n } as MarkdownToJSX.Rule<{ alt?: string; target: string; title?: string }>,\n\n link: {\n match: inlineRegex(LINK_R),\n order: Priority.LOW,\n parse(capture, parse, state) {\n return {\n content: parseSimpleInline(parse, capture[1], state),\n target: unescapeUrl(capture[2]),\n title: capture[3],\n }\n },\n react(node, output, state) {\n return (\n <a key={state.key} href={sanitizeUrl(node.target)} title={node.title}>\n {output(node.content, state)}\n </a>\n )\n },\n } as MarkdownToJSX.Rule<{\n content: MarkdownToJSX.ParserResult\n target: string\n title?: string\n }>,\n\n // https://daringfireball.net/projects/markdown/syntax#autolink\n linkAngleBraceStyleDetector: {\n match: inlineRegex(LINK_AUTOLINK_R),\n order: Priority.MAX,\n parse(capture /*, parse, state*/) {\n return {\n content: [\n {\n content: capture[1],\n type: 'text',\n },\n ],\n target: capture[1],\n type: 'link',\n }\n },\n },\n\n linkBareUrlDetector: {\n match: (source, state) => {\n if (state.inAnchor) {\n return null\n }\n return inlineRegex(LINK_AUTOLINK_BARE_URL_R)(source, state)\n },\n order: Priority.MAX,\n parse(capture /*, parse, state*/) {\n return {\n content: [\n {\n content: capture[1],\n type: 'text',\n },\n ],\n target: capture[1],\n title: undefined,\n type: 'link',\n }\n },\n },\n\n linkMailtoDetector: {\n match: inlineRegex(LINK_AUTOLINK_MAILTO_R),\n order: Priority.MAX,\n parse(capture /*, parse, state*/) {\n let address = capture[1]\n let target = capture[1]\n\n // Check for a `mailto:` already existing in the link:\n if (!AUTOLINK_MAILTO_CHECK_R.test(target)) {\n target = 'mailto:' + target\n }\n\n return {\n content: [\n {\n content: address.replace('mailto:', ''),\n type: 'text',\n },\n ],\n target: target,\n type: 'link',\n }\n },\n },\n\n list: {\n match(source, state, prevCapture) {\n // We only want to break into a list if we are at the start of a\n // line. This is to avoid parsing \"hi * there\" with \"* there\"\n // becoming a part of a list.\n // You might wonder, \"but that's inline, so of course it wouldn't\n // start a list?\". You would be correct! Except that some of our\n // lists can be inline, because they might be inside another list,\n // in which case we can parse with inline scope, but need to allow\n // nested lists inside this inline scope.\n const isStartOfLine = LIST_LOOKBEHIND_R.exec(prevCapture)\n const isListBlock = state._list || !state.inline\n\n if (isStartOfLine && isListBlock) {\n source = isStartOfLine[1] + source\n\n return LIST_R.exec(source)\n } else {\n return null\n }\n },\n order: Priority.HIGH,\n parse(capture, parse, state) {\n const bullet = capture[2]\n const ordered = bullet.length > 1\n const start = ordered ? +bullet : undefined\n const items = capture[0]\n // recognize the end of a paragraph block inside a list item:\n // two or more newlines at end end of the item\n .replace(BLOCK_END_R, '\\n')\n .match(LIST_ITEM_R)\n\n let lastItemWasAParagraph = false\n const itemContent = items.map(function (item, i) {\n // We need to see how far indented the item is:\n const space = LIST_ITEM_PREFIX_R.exec(item)[0].length\n\n // And then we construct a regex to \"unindent\" the subsequent\n // lines of the items by that amount:\n const spaceRegex = new RegExp('^ {1,' + space + '}', 'gm')\n\n // Before processing the item, we need a couple things\n const content = item\n // remove indents on trailing lines:\n .replace(spaceRegex, '')\n // remove the bullet:\n .replace(LIST_ITEM_PREFIX_R, '')\n\n // Handling \"loose\" lists, like:\n //\n // * this is wrapped in a paragraph\n //\n // * as is this\n //\n // * as is this\n const isLastItem = i === items.length - 1\n const containsBlocks = content.indexOf('\\n\\n') !== -1\n\n // Any element in a list is a block if it contains multiple\n // newlines. The last element in the list can also be a block\n // if the previous item in the list was a block (this is\n // because non-last items in the list can end with \\n\\n, but\n // the last item can't, so we just \"inherit\" this property\n // from our previous element).\n const thisItemIsAParagraph =\n containsBlocks || (isLastItem && lastItemWasAParagraph)\n lastItemWasAParagraph = thisItemIsAParagraph\n\n // backup our state for restoration afterwards. We're going to\n // want to set state._list to true, and state.inline depending\n // on our list's looseness.\n const oldStateInline = state.inline\n const oldStateList = state._list\n state._list = true\n\n // Parse inline if we're in a tight list, or block if we're in\n // a loose list.\n let adjustedContent\n if (thisItemIsAParagraph) {\n state.inline = false\n adjustedContent = content.replace(LIST_ITEM_END_R, '\\n\\n')\n } else {\n state.inline = true\n adjustedContent = content.replace(LIST_ITEM_END_R, '')\n }\n\n const result = parse(adjustedContent, state)\n\n // Restore our state before returning\n state.inline = oldStateInline\n state._list = oldStateList\n\n return result\n })\n\n return {\n items: itemContent,\n ordered: ordered,\n start: start,\n }\n },\n react(node, output, state) {\n const Tag = node.ordered ? 'ol' : 'ul'\n\n return (\n <Tag key={state.key} start={node.start}>\n {node.items.map(function generateListItem(item, i) {\n return <li key={i}>{output(item, state)}</li>\n })}\n </Tag>\n )\n },\n } as MarkdownToJSX.Rule<{\n items: MarkdownToJSX.ParserResult[]\n ordered: boolean\n start?: number\n }>,\n\n newlineCoalescer: {\n match: blockRegex(CONSECUTIVE_NEWLINE_R),\n order: Priority.LOW,\n parse: captureNothing,\n react(/*node, output, state*/) {\n return '\\n'\n },\n },\n\n paragraph: {\n match: blockRegex(PARAGRAPH_R),\n order: Priority.LOW,\n parse: parseCaptureInline,\n react(node, output, state) {\n return <p key={state.key}>{output(node.content, state)}</p>\n },\n } as MarkdownToJSX.Rule<ReturnType<typeof parseCaptureInline>>,\n\n ref: {\n match: inlineRegex(REFERENCE_IMAGE_OR_LINK),\n order: Priority.MAX,\n parse(capture /*, parse*/) {\n refs[capture[1]] = {\n target: capture[2],\n title: capture[4],\n }\n\n return {}\n },\n react: renderNothing,\n },\n\n refImage: {\n match: simpleInlineRegex(REFERENCE_IMAGE_R),\n order: Priority.MAX,\n parse(capture) {\n return {\n alt: capture[1] || undefined,\n ref: capture[2],\n }\n },\n react(node, output, state) {\n return (\n <img\n key={state.key}\n alt={node.alt}\n src={sanitizeUrl(refs[node.ref].target)}\n title={refs[node.ref].title}\n />\n )\n },\n } as MarkdownToJSX.Rule<{ alt?: string; ref: string }>,\n\n refLink: {\n match: inlineRegex(REFERENCE_LINK_R),\n order: Priority.MAX,\n parse(capture, parse, state) {\n return {\n content: parse(capture[1], state),\n fallbackContent: parse(\n capture[0].replace(SQUARE_BRACKETS_R, '\\\\$1'),\n state\n ),\n ref: capture[2],\n }\n },\n react(node, output, state) {\n return refs[node.ref] ? (\n <a\n key={state.key}\n href={sanitizeUrl(refs[node.ref].target)}\n title={refs[node.ref].title}\n >\n {output(node.content, state)}\n </a>\n ) : (\n <span key={state.key}>{output(node.fallbackContent, state)}</span>\n )\n },\n } as MarkdownToJSX.Rule<{\n content: MarkdownToJSX.ParserResult\n fallbackContent: MarkdownToJSX.ParserResult\n ref: string\n }>,\n\n table: {\n match: blockRegex(NP_TABLE_R),\n order: Priority.HIGH,\n parse: parseTable,\n react(node, output, state) {\n return (\n <table key={state.key}>\n <thead>\n <tr>\n {node.header.map(function generateHeaderCell(content, i) {\n return (\n <th key={i} style={getTableStyle(node, i)}>\n {output(content, state)}\n </th>\n )\n })}\n </tr>\n </thead>\n\n <tbody>\n {node.cells.map(function generateTableRow(row, i) {\n return (\n <tr key={i}>\n {row.map(function generateTableCell(content, c) {\n return (\n <td key={c} style={getTableStyle(node, c)}>\n {output(content, state)}\n </td>\n )\n })}\n </tr>\n )\n })}\n </tbody>\n </table>\n )\n },\n } as MarkdownToJSX.Rule<ReturnType<typeof parseTable>>,\n\n tableSeparator: {\n match: function (source, state) {\n if (!state.inTable) {\n return null\n }\n return TABLE_SEPARATOR_R.exec(source)\n },\n order: Priority.HIGH,\n parse: function () {\n return { type: 'tableSeparator' }\n },\n // These shouldn't be reached, but in case they are, be reasonable:\n react() {\n return ' | '\n },\n },\n\n text: {\n // Here we look for anything followed by non-symbols,\n // double newlines, or double-space-newlines\n // We break on any symbol characters so that this grammar\n // is easy to extend without needing to modify this regex\n match: anyScopeRegex(TEXT_PLAIN_R),\n order: Priority.MIN,\n parse(capture /*, parse, state*/) {\n return {\n content: capture[0]\n // nbsp -> unicode equivalent for named chars\n .replace(HTML_CHAR_CODE_R, (full, inner) => {\n return options.namedCodesToUnicode[inner]\n ? options.namedCodesToUnicode[inner]\n : full\n }),\n }\n },\n react(node /*, output, state*/) {\n return node.content\n },\n } as MarkdownToJSX.Rule<{ content: string }>,\n\n textBolded: {\n match: simpleInlineRegex(TEXT_BOLD_R),\n order: Priority.MED,\n parse(capture, parse, state) {\n return {\n // capture[1] -> the syntax control character\n // capture[2] -> inner content\n content: parse(capture[2], state),\n }\n },\n react(node, output, state) {\n return <strong key={state.key}>{output(node.content, state)}</strong>\n },\n } as MarkdownToJSX.Rule<ReturnType<MarkdownToJSX.NestedParser>>,\n\n textEmphasized: {\n match: simpleInlineRegex(TEXT_EMPHASIZED_R),\n order: Priority.LOW,\n parse(capture, parse, state) {\n return {\n // capture[1] -> opening * or _\n // capture[2] -> inner content\n content: parse(capture[2], state),\n }\n },\n react(node, output, state) {\n return <em key={state.key}>{output(node.content, state)}</em>\n },\n } as MarkdownToJSX.Rule<ReturnType<MarkdownToJSX.NestedParser>>,\n\n textEscaped: {\n // We don't allow escaping numbers, letters, or spaces here so that\n // backslashes used in plain text still get rendered. But allowing\n // escaping anything else provides a very flexible escape mechanism,\n // regardless of how this grammar is extended.\n match: simpleInlineRegex(TEXT_ESCAPED_R),\n order: Priority.HIGH,\n parse(capture /*, parse, state*/) {\n return {\n content: capture[1],\n type: 'text',\n }\n },\n },\n\n textStrikethroughed: {\n match: simpleInlineRegex(TEXT_STRIKETHROUGHED_R),\n order: Priority.LOW,\n parse: parseCaptureInline,\n react(node, output, state) {\n return <del key={state.key}>{output(node.content, state)}</del>\n },\n } as MarkdownToJSX.Rule<ReturnType<typeof parseCaptureInline>>,\n }\n\n // Object.keys(rules).forEach(key => {\n // let { match, parse } = rules[key];\n\n // rules[key].match = (...args) => {\n // const start = performance.now();\n // const result = match(...args);\n // const delta = performance.now() - start;\n\n // if (delta > 5)\n // console.warn(\n // `Slow match for ${key}: ${delta.toFixed(3)}ms, input: ${\n // args[0]\n // }`\n // );\n\n // return result;\n // };\n\n // rules[key].parse = (...args) => {\n // const start = performance.now();\n // const result = parse(...args);\n // const delta = performance.now() - start;\n\n // if (delta > 5)\n // console.warn(`Slow parse for ${key}: ${delta.toFixed(3)}ms`);\n\n // console.log(`${key}:parse`, `${delta.toFixed(3)}ms`, args[0]);\n\n // return result;\n // };\n // });\n\n if (options.disableParsingRawHTML !== true) {\n rules.htmlBlock = {\n /**\n * find the first matching end tag and process the interior\n */\n match: anyScopeRegex(HTML_BLOCK_ELEMENT_R),\n order: Priority.HIGH,\n parse(capture, parse, state) {\n const [, whitespace] = capture[3].match(HTML_LEFT_TRIM_AMOUNT_R)\n const trimmer = new RegExp(`^${whitespace}`, 'gm')\n const trimmed = capture[3].replace(trimmer, '')\n\n const parseFunc = containsBlockSyntax(trimmed)\n ? parseBlock\n : parseInline\n\n const tagName = capture[1].toLowerCase() as MarkdownToJSX.HTMLTags\n const noInnerParse =\n DO_NOT_PROCESS_HTML_ELEMENTS.indexOf(tagName) !== -1\n\n state.inAnchor = state.inAnchor || tagName === 'a'\n\n /**\n * if another html block is detected within, parse as block,\n * otherwise parse as inline to pick up any further markdown\n */\n const content = noInnerParse ? capture[3] : parseFunc(parse, trimmed, state)\n\n state.inAnchor = false\n\n return {\n attrs: attrStringToMap(capture[2]),\n content,\n\n noInnerParse,\n\n tag: noInnerParse ? tagName : capture[1],\n }\n },\n react(node, output, state) {\n return (\n // @ts-ignore\n <node.tag key={state.key} {...node.attrs}>\n {node.noInnerParse\n ? (node.content as string)\n : output(node.content as MarkdownToJSX.ParserResult, state)}\n </node.tag>\n )\n },\n } as MarkdownToJSX.Rule<{\n attrs: ReturnType<typeof attrStringToMap>\n content: string | ReturnType<MarkdownToJSX.NestedParser>\n noInnerParse: Boolean\n tag: string\n }>\n\n rules.htmlSelfClosing = {\n /**\n * find the first matching end tag and process the interior\n */\n match: anyScopeRegex(HTML_SELF_CLOSING_ELEMENT_R),\n order: Priority.HIGH,\n parse(capture /*, parse, state*/) {\n return {\n attrs: attrStringToMap(capture[2] || ''),\n tag: capture[1],\n }\n },\n react(node, output, state) {\n return <node.tag {...node.attrs} key={state.key} />\n },\n } as MarkdownToJSX.Rule<{\n attrs: ReturnType<typeof attrStringToMap>\n tag: string\n }>\n }\n\n const parser = parserFor(rules)\n const emitter: Function = reactFor(ruleOutput(rules))\n\n const jsx = compile(markdown)\n\n if (footnotes.length) {\n jsx.props.children.push(\n <footer key=\"footer\">\n {footnotes.map(function createFootnote(def) {\n return (\n <div id={options.slugify(def.identifier)} key={def.identifier}>\n {def.identifier}\n {emitter(parser(def.footnote, { inline: true }))}\n </div>\n )\n })}\n </footer>\n )\n }\n\n return jsx\n}\n\n/**\n * A simple HOC for easy React use. Feed the markdown content as a direct child\n * and the rest is taken care of automatically.\n */\nconst Markdown: React.FC<{\n [key: string]: any\n children: string\n options?: MarkdownToJSX.Options\n}> = ({ children, options, ...props }) => {\n return React.cloneElement(\n compiler(children, options),\n props as React.Props<any>\n )\n}\n\nexport default Markdown\n"],"names":["reg","ATTRIBUTE_TO_JSX_PROP_MAP","accesskey","allowfullscreen","allowtransparency","autocomplete","autofocus","autoplay","cellpadding","cellspacing","charset","class","classid","colspan","contenteditable","contextmenu","crossorigin","enctype","for","formaction","formenctype","formmethod","formnovalidate","formtarget","frameborder","hreflang","inputmode","keyparams","keytype","marginheight","marginwidth","maxlength","mediagroup","minlength","novalidate","radiogroup","readonly","rowspan","spellcheck","srcdoc","srclang","srcset","tabindex","usemap","namedCodesToUnicode","amp","apos","gt","lt","nbsp","quot","DO_NOT_PROCESS_HTML_ELEMENTS","ATTR_EXTRACTOR_R","AUTOLINK_MAILTO_CHECK_R","BLOCK_END_R","BLOCKQUOTE_R","BLOCKQUOTE_TRIM_LEFT_MULTILINE_R","BREAK_LINE_R","BREAK_THEMATIC_R","CODE_BLOCK_FENCED_R","CODE_BLOCK_R","CODE_INLINE_R","CONSECUTIVE_NEWLINE_R","CR_NEWLINE_R","FOOTNOTE_R","FOOTNOTE_REFERENCE_R","FORMFEED_R","GFM_TASK_R","HEADING_R","HEADING_SETEXT_R","HTML_BLOCK_ELEMENT_R","HTML_CHAR_CODE_R","HTML_COMMENT_R","HTML_CUSTOM_ATTR_R","HTML_SELF_CLOSING_ELEMENT_R","INTERPOLATION_R","LINK_AUTOLINK_BARE_URL_R","LINK_AUTOLINK_MAILTO_R","LINK_AUTOLINK_R","LIST_ITEM_END_R","LIST_LOOKBEHIND_R","CAPTURE_LETTER_AFTER_HYPHEN","NP_TABLE_R","PARAGRAPH_R","REFERENCE_IMAGE_OR_LINK","REFERENCE_IMAGE_R","REFERENCE_LINK_R","SQUARE_BRACKETS_R","SHOULD_RENDER_AS_BLOCK_R","TAB_R","TABLE_SEPARATOR_R","TABLE_TRIM_PIPES","TABLE_CELL_END_TRIM","TABLE_CENTER_ALIGN","TABLE_LEFT_ALIGN","TABLE_RIGHT_ALIGN","TEXT_BOLD_R","TEXT_EMPHASIZED_R","TEXT_STRIKETHROUGHED_R","TEXT_ESCAPED_R","TEXT_PLAIN_R","TRIM_NEWLINES_AND_TRAILING_WHITESPACE_R","HTML_LEFT_TRIM_AMOUNT_R","UNESCAPE_URL_R","LIST_ITEM_PREFIX_R","RegExp","LIST_ITEM_R","LIST_ITEM_PREFIX","LIST_R","LINK_INSIDE","LINK_R","IMAGE_R","BLOCK_SYNTAXES","slugify","str","replace","toLowerCase","parseTableAlignCapture","alignCapture","test","parseTableRow","source","parse","state","prevInTable","inTable","tableRow","trim","cells","forEach","node","i","type","length","push","content","parseTable","capture","inline","header","align","split","map","rowText","parseTableCells","getTableStyle","colIndex","textAlign","inlineRegex","regex","exec","simpleInlineRegex","simple","blockRegex","anyScopeRegex","sanitizeUrl","url","decodeURIComponent","match","e","unescapeUrl","rawUrlString","parseInline","isCurrentlyInline","isCurrentlySimple","result","parseSimpleInline","parseBlock","Priority","parseCaptureInline","captureNothing","renderNothing","cx","filter","Boolean","join","get","src","path","fb","ptr","frags","undefined","shift","getTag","tag","overrides","override","compiler","markdown","options","createElementFn","createElement","React","h","props","overrideProps","className","compile","input","forceInline","forceBlock","arr","emitter","parser","wrapper","jsx","forceWrapper","key","attrStringToMap","attributes","reduce","raw","index","delimiterIdx","indexOf","_","letter","toUpperCase","normalizeAttributeKey","slice","value","charAt","substr","unquote","mappedKey","normalizedValue","styles","kvPair","attributeValueToJSXPropValue","cloneElement","footnotes","refs","rules","blockQuote","order","HIGH","react","output","breakLine","__","breakThematic","codeBlock","MAX","lang","codeFenced","codeInline","LOW","footnote","identifier","footnoteReference","target","href","gfmTask","completed","checked","readOnly","heading","id","level","headingSetext","htmlComment","image","alt","title","link","linkAngleBraceStyleDetector","linkBareUrlDetector","inAnchor","linkMailtoDetector","address","list","prevCapture","isStartOfLine","_list","bullet","ordered","start","items","lastItemWasAParagraph","item","space","spaceRegex","isLastItem","thisItemIsAParagraph","adjustedContent","oldStateInline","oldStateList","newlineCoalescer","paragraph","ref","refImage","refLink","fallbackContent","table","style","row","c","tableSeparator","text","MIN","full","inner","textBolded","MED","textEmphasized","textEscaped","textStrikethroughed","disableParsingRawHTML","htmlBlock","trimmer","trimmed","parseFunc","some","r","tagName","noInnerParse","attrs","htmlSelfClosing","outputFunc","ruleList","Object","keys","nestedParse","ruleType","rule","currCaptureString","substring","parsed","sort","typeA","typeB","orderA","orderB","normalizeWhitespace","parserFor","ast","ruleOutput","nestedReactOutput","Array","isArray","oldKey","lastWasString","nodeOut","isString","children","def"],"mappings":"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"}
\No newline at end of file