@khanacademy/simple-markdown 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/README.md +453 -0
- package/dist/es/index.js +2 -0
- package/dist/es/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.flow +2 -0
- package/dist/index.js.map +1 -0
- package/package.json +39 -0
- package/src/__tests__/simple-markdown_test.js +4946 -0
- package/src/index.js +2043 -0
- package/tsconfig.json +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/index.js"],"sourcesContent":["/* eslint-disable prefer-spread, no-regex-spaces, no-unused-vars, guard-for-in, no-console, no-var */\n// @flow\n\n/**\n * Simple-Markdown\n * ===============\n *\n * Simple-Markdown's primary goal is to be easy to adapt. It aims\n * to be compliant with John Gruber's [Markdown Syntax page][1],\n * but compatiblity with other markdown implementations' edge-cases\n * will be sacrificed where it conflicts with simplicity or\n * extensibility.\n *\n * If your goal is to simply embed a standard markdown implementation\n * in your website, simple-markdown is probably not the best library\n * for you (although it should work). But if you have struggled to\n * customize an existing library to meet your needs, simple-markdown\n * might be able to help.\n *\n * Many of the regexes and original logic has been adapted from\n * the wonderful [marked.js](https://github.com/chjj/marked)\n */\n\n// Flow Type Definitions:\n\ntype Capture =\n | (Array<string> & {index: number})\n | (Array<string> & {index?: number});\n\ntype Attr = string | number | boolean | null | void;\n\ntype SingleASTNode = {\n type: string,\n [string]: any,\n};\n\ntype UnTypedASTNode = {\n [string]: any,\n};\n\ntype ASTNode = SingleASTNode | Array<SingleASTNode>;\n\ntype State = {\n key?: string | number | void,\n inline?: ?boolean,\n [string]: any,\n};\n\ntype ReactElement = React$Element<any>;\ntype ReactElements = React$Node;\n\ntype MatchFunction = {regex?: RegExp} & ((\n source: string,\n state: State,\n prevCapture: string,\n) => ?Capture);\n\ntype Parser = (source: string, state?: ?State) => Array<SingleASTNode>;\n\ntype ParseFunction = (\n capture: Capture,\n nestedParse: Parser,\n state: State,\n) => UnTypedASTNode | ASTNode;\n\ntype SingleNodeParseFunction = (\n capture: Capture,\n nestedParse: Parser,\n state: State,\n) => UnTypedASTNode;\n\ntype Output<Result> = (node: ASTNode, state?: ?State) => Result;\n\ntype NodeOutput<Result> = (\n node: SingleASTNode,\n nestedOutput: Output<Result>,\n state: State,\n) => Result;\n\ntype ArrayNodeOutput<Result> = (\n node: Array<SingleASTNode>,\n nestedOutput: Output<Result>,\n state: State,\n) => Result;\n\ntype ReactOutput = Output<ReactElements>;\ntype ReactNodeOutput = NodeOutput<ReactElements>;\ntype HtmlOutput = Output<string>;\ntype HtmlNodeOutput = NodeOutput<string>;\n\ntype ParserRule = {\n +order: number,\n +match: MatchFunction,\n +quality?: (capture: Capture, state: State, prevCapture: string) => number,\n +parse: ParseFunction,\n};\n\ntype SingleNodeParserRule = {\n +order: number,\n +match: MatchFunction,\n +quality?: (capture: Capture, state: State, prevCapture: string) => number,\n +parse: SingleNodeParseFunction,\n};\n\ntype ReactOutputRule = {\n // we allow null because some rules are never output results, and that's\n // legal as long as no parsers return an AST node matching that rule.\n // We don't use ? because this makes it be explicitly defined as either\n // a valid function or null, so it can't be forgotten.\n +react: ReactNodeOutput | null,\n};\n\ntype HtmlOutputRule = {\n +html: HtmlNodeOutput | null,\n};\n\ntype ArrayRule = {\n +react?: ArrayNodeOutput<ReactElements>,\n +html?: ArrayNodeOutput<string>,\n +[string]: ArrayNodeOutput<any>,\n};\n\ntype ParserRules = {\n +Array?: ArrayRule,\n +[type: string]: ParserRule,\n};\n\ntype OutputRules<Rule> = {\n +Array?: ArrayRule,\n +[type: string]: Rule,\n};\ntype Rules<OutputRule> = {\n +Array?: ArrayRule,\n +[type: string]: ParserRule & OutputRule,\n};\ntype ReactRules = {\n +Array?: {\n +react: ArrayNodeOutput<ReactElements>,\n },\n +[type: string]: ParserRule & ReactOutputRule,\n};\ntype HtmlRules = {\n +Array?: {\n +html: ArrayNodeOutput<string>,\n },\n +[type: string]: ParserRule & HtmlOutputRule,\n};\n\n// We want to clarify our defaultRules types a little bit more so clients can\n// reuse defaultRules built-ins. So we make some stronger guarantess when\n// we can:\ntype NonNullReactOutputRule = {\n +react: ReactNodeOutput,\n};\ntype ElementReactOutputRule = {\n +react: NodeOutput<ReactElement>,\n};\ntype TextReactOutputRule = {\n +react: NodeOutput<string>,\n};\ntype NonNullHtmlOutputRule = {\n +html: HtmlNodeOutput,\n};\n\ntype DefaultInRule = SingleNodeParserRule & ReactOutputRule & HtmlOutputRule;\ntype TextInOutRule = SingleNodeParserRule &\n TextReactOutputRule &\n NonNullHtmlOutputRule;\ntype LenientInOutRule = SingleNodeParserRule &\n NonNullReactOutputRule &\n NonNullHtmlOutputRule;\ntype DefaultInOutRule = SingleNodeParserRule &\n ElementReactOutputRule &\n NonNullHtmlOutputRule;\n\ntype DefaultRules = {\n +Array: {\n +react: ArrayNodeOutput<ReactElements>,\n +html: ArrayNodeOutput<string>,\n },\n +heading: DefaultInOutRule,\n +nptable: DefaultInRule,\n +lheading: DefaultInRule,\n +hr: DefaultInOutRule,\n +codeBlock: DefaultInOutRule,\n +fence: DefaultInRule,\n +blockQuote: DefaultInOutRule,\n +list: DefaultInOutRule,\n +def: LenientInOutRule,\n +table: DefaultInOutRule,\n +tableSeparator: DefaultInRule,\n +newline: TextInOutRule,\n +paragraph: DefaultInOutRule,\n +escape: DefaultInRule,\n +autolink: DefaultInRule,\n +mailto: DefaultInRule,\n +url: DefaultInRule,\n +link: DefaultInOutRule,\n +image: DefaultInOutRule,\n +reflink: DefaultInRule,\n +refimage: DefaultInRule,\n +em: DefaultInOutRule,\n +strong: DefaultInOutRule,\n +u: DefaultInOutRule,\n +del: DefaultInOutRule,\n +inlineCode: DefaultInOutRule,\n +br: DefaultInOutRule,\n +text: TextInOutRule,\n};\n\ntype RefNode = {\n type: string,\n content?: ASTNode,\n target?: string,\n title?: string,\n alt?: string,\n};\n\n// End Flow Definitions\n\nvar CR_NEWLINE_R = /\\r\\n?/g;\nvar TAB_R = /\\t/g;\nvar FORMFEED_R = /\\f/g;\n\n/**\n * Turn various whitespace into easy-to-process whitespace\n */\nvar preprocess = function (source: string): string {\n return source\n .replace(CR_NEWLINE_R, \"\\n\")\n .replace(FORMFEED_R, \"\")\n .replace(TAB_R, \" \");\n};\n\nvar populateInitialState = function (\n givenState: ?State,\n defaultState: ?State,\n): State {\n var state: State = givenState || {};\n if (defaultState != null) {\n for (var prop in defaultState) {\n // $FlowFixMe\n if (Object.prototype.hasOwnProperty.call(defaultState, prop)) {\n state[prop] = defaultState[prop];\n }\n }\n }\n return state;\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 * @param {SimpleMarkdown.ParserRules} rules\n * an object containing\n * rule type -> {match, order, parse} objects\n * (lower order is higher precedence)\n * @param {SimpleMarkdown.OptionalState} [defaultState]\n *\n * @returns {SimpleMarkdown.Parser}\n * 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 */\nvar parserFor = function (rules: ParserRules, defaultState: ?State): Parser {\n // Sorts rules in order of increasing order, then\n // ascending rule name in case of ties.\n var ruleList = Object.keys(rules).filter(function (type) {\n var rule = rules[type];\n if (rule == null || rule.match == null) {\n return false;\n }\n var order = rule.order;\n if (\n (typeof order !== \"number\" || !isFinite(order)) &&\n typeof console !== \"undefined\"\n ) {\n console.warn(\n \"simple-markdown: Invalid order for rule `\" +\n type +\n \"`: \" +\n String(order),\n );\n }\n return true;\n });\n\n ruleList.sort(function (typeA, typeB) {\n var ruleA: ParserRule = (rules[typeA]: any);\n var ruleB: ParserRule = (rules[typeB]: any);\n var orderA = ruleA.order;\n var orderB = ruleB.order;\n\n // First sort based on increasing order\n if (orderA !== orderB) {\n return orderA - orderB;\n }\n\n var secondaryOrderA = ruleA.quality ? 0 : 1;\n var secondaryOrderB = ruleB.quality ? 0 : 1;\n\n if (secondaryOrderA !== secondaryOrderB) {\n return secondaryOrderA - secondaryOrderB;\n\n // Then based on increasing unicode lexicographic ordering\n } else if (typeA < typeB) {\n return -1;\n } else if (typeA > typeB) {\n return 1;\n } else {\n // Rules should never have the same name,\n // but this is provided for completeness.\n return 0;\n }\n });\n\n var latestState: State;\n var nestedParse = function (source: string, state: ?State): Parser {\n var result: Array<SingleASTNode> = [];\n state = state || latestState;\n latestState = state;\n while (source) {\n // store the best match, it's rule, and quality:\n var ruleType = null;\n var rule = null;\n var capture = null;\n var quality = NaN;\n\n // loop control variables:\n var i = 0;\n var currRuleType = ruleList[0];\n\n // $FlowFixMe\n var currRule: ParserRule = rules[currRuleType];\n\n do {\n var currOrder = currRule.order;\n var prevCaptureStr =\n state.prevCapture == null ? \"\" : state.prevCapture[0];\n var currCapture = currRule.match(source, state, prevCaptureStr);\n\n if (currCapture) {\n var currQuality = currRule.quality\n ? currRule.quality(currCapture, state, prevCaptureStr)\n : 0;\n // This should always be true the first time because\n // the initial quality is NaN (that's why there's the\n // condition negation).\n if (!(currQuality <= quality)) {\n ruleType = currRuleType;\n rule = currRule;\n capture = currCapture;\n quality = currQuality;\n }\n }\n\n // Move on to the next item.\n // Note that this makes `currRule` be the next item\n i++;\n currRuleType = ruleList[i];\n // $FlowFixMe\n currRule = rules[currRuleType];\n } while (\n // keep looping while we're still within the ruleList\n currRule &&\n // if we don't have a match yet, continue\n (!capture ||\n // or if we have a match, but the next rule is\n // at the same order, and has a quality measurement\n // functions, then this rule must have a quality\n // measurement function (since they are sorted before\n // those without), and we need to check if there is\n // a better quality match\n (currRule.order === currOrder && currRule.quality))\n );\n\n // TODO(aria): Write tests for these\n if (rule == null || capture == null) {\n throw new Error(\n \"Could not find a matching rule for the below \" +\n \"content. The rule with highest `order` should \" +\n \"always match content provided to it. Check \" +\n \"the definition of `match` for '\" +\n ruleList[ruleList.length - 1] +\n \"'. It seems to not match the following source:\\n\" +\n source,\n );\n }\n if (capture.index) {\n // If present and non-zero, i.e. a non-^ regexp result:\n throw new Error(\n \"`match` must return a capture starting at index 0 \" +\n \"(the current parse index). Did you forget a ^ at the \" +\n \"start of the RegExp?\",\n );\n }\n\n // $FlowFixMe\n var parsed = rule.parse(capture, nestedParse, state);\n // We maintain the same object here so that rules can\n // store references to the objects they return and\n // modify them later. (oops sorry! but this adds a lot\n // of power--see reflinks.)\n if (Array.isArray(parsed)) {\n // $FlowFixMe\n Array.prototype.push.apply(result, parsed);\n } else {\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 // $FlowFixMe\n parsed.type = ruleType;\n }\n result.push(parsed);\n }\n\n state.prevCapture = capture;\n source = source.substring(state.prevCapture[0].length);\n }\n\n // $FlowFixMe\n return result;\n };\n\n var outerParse = function (source: string, state: ?State): Parser {\n latestState = populateInitialState(state, defaultState);\n if (!latestState.inline && !latestState.disableAutoBlockNewlines) {\n source = source + \"\\n\\n\";\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). This stores\n // the full regex capture object, if there is one.\n latestState.prevCapture = null;\n return nestedParse(preprocess(source), latestState);\n };\n\n // $FlowFixMe\n return outerParse;\n};\n\n// Creates a match function for an inline scoped element from a regex\nvar inlineRegex = function (regex: RegExp): MatchFunction {\n var match = function (\n source: string,\n state: State,\n prevCapture: string,\n ): ?Capture {\n if (state.inline) {\n // $FlowFixMe\n return regex.exec(source);\n } else {\n return null;\n }\n };\n match.regex = regex;\n\n return match;\n};\n\n// Creates a match function for a block scoped element from a regex\nvar blockRegex = function (regex: RegExp): MatchFunction {\n // $FlowFixMe\n var match: MatchFunction = function (source, state) {\n if (state.inline) {\n return null;\n } else {\n return regex.exec(source);\n }\n };\n match.regex = regex;\n return match;\n};\n\n// Creates a match function from a regex, ignoring block/inline scope\nvar anyScopeRegex = function (regex: RegExp): MatchFunction {\n // $FlowFixMe\n var match: MatchFunction = function (source, state) {\n return regex.exec(source);\n };\n match.regex = regex;\n return match;\n};\n\nvar TYPE_SYMBOL =\n (typeof Symbol === \"function\" &&\n Symbol.for &&\n Symbol.for(\"react.element\")) ||\n 0xeac7;\n\nvar reactElement = function (\n type: string,\n key: string | number | null | void,\n props: {[string]: any},\n): ReactElement {\n var element: ReactElement = ({\n $$typeof: TYPE_SYMBOL,\n type: type,\n key: key == null ? undefined : key,\n ref: null,\n props: props,\n _owner: null,\n }: any);\n return element;\n};\n\n/** Returns a closed HTML tag.\n * @param {string} tagName - Name of HTML tag (eg. \"em\" or \"a\")\n * @param {string} content - Inner content of tag\n * @param {{ [attr: string]: SimpleMarkdown.Attr }} [attributes] - Optional extra attributes of tag as an object of key-value pairs\n * eg. { \"href\": \"http://google.com\" }. Falsey attributes are filtered out.\n * @param {boolean} [isClosed] - boolean that controls whether tag is closed or not (eg. img tags).\n * defaults to true\n */\nvar htmlTag = function (\n tagName: string,\n content: string,\n attributes: ?{[any]: ?Attr},\n isClosed: ?boolean,\n) {\n attributes = attributes || {};\n isClosed = typeof isClosed !== \"undefined\" ? isClosed : true;\n\n var attributeString = \"\";\n for (var attr in attributes) {\n var attribute = attributes[attr];\n // Removes falsey attributes\n if (\n // $FlowFixMe\n Object.prototype.hasOwnProperty.call(attributes, attr) &&\n attribute\n ) {\n attributeString +=\n \" \" + sanitizeText(attr) + '=\"' + sanitizeText(attribute) + '\"';\n }\n }\n\n var unclosedTag = \"<\" + tagName + attributeString + \">\";\n\n if (isClosed) {\n return unclosedTag + content + \"</\" + tagName + \">\";\n } else {\n return unclosedTag;\n }\n};\n\nvar EMPTY_PROPS = {};\n\n/**\n * @param {string | null | undefined} url - url to sanitize\n * @returns {string | null} - url if safe, or null if a safe url could not be made\n */\nvar sanitizeUrl = function (url: ?string) {\n if (url == null) {\n return null;\n }\n try {\n var prot = new URL(url, \"https://localhost\").protocol;\n if (\n prot.indexOf(\"javascript:\") === 0 ||\n prot.indexOf(\"vbscript:\") === 0 ||\n prot.indexOf(\"data:\") === 0\n ) {\n return null;\n }\n } catch (e) {\n // invalid URLs should throw a TypeError\n // see for instance: `new URL(\"\");`\n return null;\n }\n return url;\n};\n\nvar SANITIZE_TEXT_R = /[<>&\"']/g;\nvar SANITIZE_TEXT_CODES = {\n \"<\": \"<\",\n \">\": \">\",\n \"&\": \"&\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\",\n \"`\": \"`\",\n};\n\nvar sanitizeText = function (text: Attr): string {\n return String(text).replace(SANITIZE_TEXT_R, function (chr) {\n return SANITIZE_TEXT_CODES[chr];\n });\n};\n\nvar UNESCAPE_URL_R = /\\\\([^0-9A-Za-z\\s])/g;\n\nvar unescapeUrl = function (rawUrlString: string): string {\n return rawUrlString.replace(UNESCAPE_URL_R, \"$1\");\n};\n\n/**\n * Parse some content with the parser `parse`, with state.inline\n * set to true. Useful for block elements; not generally necessary\n * to be used by inline elements (where state.inline is already true.\n */\nvar parseInline = function (\n parse: Parser,\n content: string,\n state: State,\n): ASTNode {\n var isCurrentlyInline = state.inline || false;\n state.inline = true;\n var result = parse(content, state);\n state.inline = isCurrentlyInline;\n return result;\n};\n\nvar parseBlock = function (\n parse: Parser,\n content: string,\n state: State,\n): ASTNode {\n var isCurrentlyInline = state.inline || false;\n state.inline = false;\n var result = parse(content + \"\\n\\n\", state);\n state.inline = isCurrentlyInline;\n return result;\n};\n\nvar parseCaptureInline = function (\n capture: Capture,\n parse: Parser,\n state: State,\n): UnTypedASTNode {\n return {\n content: parseInline(parse, capture[1], state),\n };\n};\n\nvar ignoreCapture = function (): UnTypedASTNode {\n return {};\n};\n\n// recognize a `*` `-`, `+`, `1.`, `2.`... list bullet\nvar LIST_BULLET = \"(?:[*+-]|\\\\d+\\\\.)\";\n// recognize the start of a list item:\n// leading space plus a bullet plus a space (` * `)\nvar LIST_ITEM_PREFIX = \"( *)(\" + LIST_BULLET + \") +\";\nvar LIST_ITEM_PREFIX_R = new RegExp(\"^\" + LIST_ITEM_PREFIX);\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\nvar LIST_ITEM_R = new RegExp(\n LIST_ITEM_PREFIX +\n \"[^\\\\n]*(?:\\\\n\" +\n \"(?!\\\\1\" +\n LIST_BULLET +\n \" )[^\\\\n]*)*(\\n|$)\",\n \"gm\",\n);\nvar BLOCK_END_R = /\\n{2,}$/;\nvar INLINE_CODE_ESCAPE_BACKTICKS_R = /^ (?= *`)|(` *) $/g;\n// recognize the end of a paragraph block inside a list item:\n// two or more newlines at end end of the item\nvar LIST_BLOCK_END_R = BLOCK_END_R;\nvar LIST_ITEM_END_R = / *\\n+$/;\n// check whether a list item has paragraphs: if it does,\n// we leave the newlines at the end\nvar LIST_R = new RegExp(\n \"^( *)(\" +\n LIST_BULLET +\n \") \" +\n \"[\\\\s\\\\S]+?(?:\\n{2,}(?! )\" +\n \"(?!\\\\1\" +\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);\nvar LIST_LOOKBEHIND_R = /(?:^|\\n)( *)$/;\n\nvar TABLES = (function () {\n // predefine regexes so we don't have to create them inside functions\n // sure, regex literals should be fast, even inside functions, but they\n // aren't in all browsers.\n var TABLE_BLOCK_TRIM = /\\n+/g;\n var TABLE_ROW_SEPARATOR_TRIM = /^ *\\| *| *\\| *$/g;\n var TABLE_CELL_END_TRIM = / *$/;\n var TABLE_RIGHT_ALIGN = /^ *-+: *$/;\n var TABLE_CENTER_ALIGN = /^ *:-+: *$/;\n var TABLE_LEFT_ALIGN = /^ *:-+ *$/;\n\n // TODO: This needs a real type\n type TableAlignment = any;\n\n var parseTableAlignCapture = function (\n alignCapture: string,\n ): TableAlignment {\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 } else {\n return null;\n }\n };\n\n var parseTableAlign = function (\n source: string,\n parse: Parser,\n state: State,\n trimEndSeparators: boolean,\n ): Array<TableAlignment> {\n if (trimEndSeparators) {\n source = source.replace(TABLE_ROW_SEPARATOR_TRIM, \"\");\n }\n var alignText = source.trim().split(\"|\");\n return alignText.map(parseTableAlignCapture);\n };\n\n var parseTableRow = function (\n source: string,\n parse: Parser,\n state: State,\n trimEndSeparators: boolean,\n ): Array<Array<SingleASTNode>> {\n var prevInTable = state.inTable;\n state.inTable = true;\n var tableRow = parse(source.trim(), state);\n state.inTable = prevInTable;\n\n var cells = [[]];\n tableRow.forEach(function (node, i) {\n if (node.type === \"tableSeparator\") {\n // Filter out empty table separators at the start/end:\n if (\n !trimEndSeparators ||\n (i !== 0 && i !== tableRow.length - 1)\n ) {\n // Split the current row:\n cells.push([]);\n }\n } else {\n if (\n node.type === \"text\" &&\n (tableRow[i + 1] == null ||\n tableRow[i + 1].type === \"tableSeparator\")\n ) {\n node.content = node.content.replace(\n TABLE_CELL_END_TRIM,\n \"\",\n );\n }\n cells[cells.length - 1].push(node);\n }\n });\n\n return cells;\n };\n\n /**\n * @param {string} source\n * @param {SimpleMarkdown.Parser} parse\n * @param {SimpleMarkdown.State} state\n * @param {boolean} trimEndSeparators\n * @returns {SimpleMarkdown.ASTNode[][]}\n */\n var parseTableCells = function (\n source: string,\n parse: Parser,\n state: State,\n trimEndSeparators: boolean,\n ): Array<Array<ASTNode>> {\n var rowsText = source.trim().split(\"\\n\");\n\n return rowsText.map(function (rowText) {\n // $FlowFixMe\n return parseTableRow(rowText, parse, state, trimEndSeparators);\n });\n };\n\n /**\n * @param {boolean} trimEndSeparators\n * @returns {SimpleMarkdown.SingleNodeParseFunction}\n */\n var parseTable = function (trimEndSeparators) {\n return function (capture, parse, state) {\n state.inline = true;\n var header = parseTableRow(\n capture[1],\n parse,\n state,\n trimEndSeparators,\n );\n var align = parseTableAlign(\n capture[2],\n parse,\n state,\n trimEndSeparators,\n );\n var cells = parseTableCells(\n capture[3],\n parse,\n state,\n trimEndSeparators,\n );\n state.inline = false;\n\n return {\n type: \"table\",\n header: header,\n align: align,\n cells: cells,\n };\n };\n };\n\n return {\n parseTable: parseTable(true),\n parseNpTable: parseTable(false),\n TABLE_REGEX:\n /^ *(\\|.+)\\n *\\|( *[-:]+[-| :]*)\\n((?: *\\|.*(?:\\n|$))*)\\n*/,\n NPTABLE_REGEX:\n /^ *(\\S.*\\|.*)\\n *([-:]+ *\\|[-| :]*)\\n((?:.*\\|.*(?:\\n|$))*)\\n*/,\n };\n})();\n\nvar LINK_INSIDE = \"(?:\\\\[[^\\\\]]*\\\\]|[^\\\\[\\\\]]|\\\\](?=[^\\\\[]*\\\\]))*\";\nvar LINK_HREF_AND_TITLE =\n \"\\\\s*<?((?:\\\\([^)]*\\\\)|[^\\\\s\\\\\\\\]|\\\\\\\\.)*?)>?(?:\\\\s+['\\\"]([\\\\s\\\\S]*?)['\\\"])?\\\\s*\";\nvar AUTOLINK_MAILTO_CHECK_R = /mailto:/i;\n\nvar parseRef = function (\n capture: Capture,\n state: State,\n refNode: RefNode,\n): RefNode {\n var ref = (capture[2] || capture[1]).replace(/\\s+/g, \" \").toLowerCase();\n\n // We store information about previously seen defs on\n // state._defs (_ to deconflict with client-defined\n // state). If the def for this reflink/refimage has\n // already been seen, we can use its target/source\n // and title here:\n if (state._defs && state._defs[ref]) {\n var def = state._defs[ref];\n // `refNode` can be a link or an image. Both use\n // target and title properties.\n refNode.target = def.target;\n refNode.title = def.title;\n }\n\n // In case we haven't seen our def yet (or if someone\n // overwrites that def later on), we add this node\n // to the list of ref nodes for that def. Then, when\n // we find the def, we can modify this link/image AST\n // node :).\n // I'm sorry.\n state._refs = state._refs || {};\n state._refs[ref] = state._refs[ref] || [];\n state._refs[ref].push(refNode);\n\n return refNode;\n};\n\nvar currOrder = 0;\n\nvar defaultRules: DefaultRules = {\n Array: {\n react: function (arr, output, state) {\n var oldKey = state.key;\n var result: Array<ReactElements> = [];\n\n // map output over the ast, except group any text\n // nodes together into a single string output.\n for (var i = 0, key = 0; i < arr.length; i++, key++) {\n // `key` is our numerical `state.key`, which we increment for\n // every output node, but don't change for joined text nodes.\n // (i, however, must change for joined text nodes)\n state.key = \"\" + i;\n\n var node = arr[i];\n if (node.type === \"text\") {\n node = {type: \"text\", content: node.content};\n for (\n ;\n i + 1 < arr.length && arr[i + 1].type === \"text\";\n i++\n ) {\n node.content += arr[i + 1].content;\n }\n }\n\n result.push(output(node, state));\n }\n\n state.key = oldKey;\n return result;\n },\n html: function (arr, output, state) {\n var result = \"\";\n\n // map output over the ast, except group any text\n // nodes together into a single string output.\n for (var i = 0, key = 0; i < arr.length; i++) {\n var node = arr[i];\n if (node.type === \"text\") {\n node = {type: \"text\", content: node.content};\n for (\n ;\n i + 1 < arr.length && arr[i + 1].type === \"text\";\n i++\n ) {\n node.content += arr[i + 1].content;\n }\n }\n\n result += output(node, state);\n }\n return result;\n },\n },\n heading: {\n order: currOrder++,\n match: blockRegex(/^ *(#{1,6})([^\\n]+?)#* *(?:\\n *)+\\n/),\n parse: function (capture, parse, state) {\n return {\n level: capture[1].length,\n content: parseInline(parse, capture[2].trim(), state),\n };\n },\n react: function (node, output, state) {\n return reactElement(\"h\" + node.level, state.key, {\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n return htmlTag(\"h\" + node.level, output(node.content, state));\n },\n },\n nptable: {\n order: currOrder++,\n match: blockRegex(TABLES.NPTABLE_REGEX),\n parse: TABLES.parseNpTable,\n react: null,\n html: null,\n },\n lheading: {\n order: currOrder++,\n match: blockRegex(/^([^\\n]+)\\n *(=|-){3,} *(?:\\n *)+\\n/),\n parse: function (capture, parse, state) {\n return {\n type: \"heading\",\n level: capture[2] === \"=\" ? 1 : 2,\n content: parseInline(parse, capture[1], state),\n };\n },\n react: null,\n html: null,\n },\n hr: {\n order: currOrder++,\n match: blockRegex(/^( *[-*_]){3,} *(?:\\n *)+\\n/),\n parse: ignoreCapture,\n react: function (node, output, state) {\n return reactElement(\"hr\", state.key, EMPTY_PROPS);\n },\n html: function (node, output, state) {\n return \"<hr>\";\n },\n },\n codeBlock: {\n order: currOrder++,\n match: blockRegex(/^(?: [^\\n]+\\n*)+(?:\\n *)+\\n/),\n parse: function (capture, parse, state) {\n var content = capture[0].replace(/^ /gm, \"\").replace(/\\n+$/, \"\");\n return {\n lang: undefined,\n content: content,\n };\n },\n react: function (node, output, state) {\n var className = node.lang\n ? \"markdown-code-\" + node.lang\n : undefined;\n\n return reactElement(\"pre\", state.key, {\n children: reactElement(\"code\", null, {\n className: className,\n children: node.content,\n }),\n });\n },\n html: function (node, output, state) {\n var className = node.lang\n ? \"markdown-code-\" + node.lang\n : undefined;\n\n var codeBlock = htmlTag(\"code\", sanitizeText(node.content), {\n class: className,\n });\n return htmlTag(\"pre\", codeBlock);\n },\n },\n fence: {\n order: currOrder++,\n match: blockRegex(\n /^ *(`{3,}|~{3,}) *(?:(\\S+) *)?\\n([\\s\\S]+?)\\n?\\1 *(?:\\n *)+\\n/,\n ),\n parse: function (capture, parse, state) {\n return {\n type: \"codeBlock\",\n lang: capture[2] || undefined,\n content: capture[3],\n };\n },\n react: null,\n html: null,\n },\n blockQuote: {\n order: currOrder++,\n match: blockRegex(/^( *>[^\\n]+(\\n[^\\n]+)*\\n*)+\\n{2,}/),\n parse: function (capture, parse, state) {\n var content = capture[0].replace(/^ *> ?/gm, \"\");\n return {\n content: parse(content, state),\n };\n },\n react: function (node, output, state) {\n return reactElement(\"blockquote\", state.key, {\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n return htmlTag(\"blockquote\", output(node.content, state));\n },\n },\n list: {\n order: currOrder++,\n // $FlowFixMe\n match: function (source, state) {\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 var prevCaptureStr =\n state.prevCapture == null ? \"\" : state.prevCapture[0];\n var isStartOfLineCapture = LIST_LOOKBEHIND_R.exec(prevCaptureStr);\n var isListBlock = state._list || !state.inline;\n\n if (isStartOfLineCapture && isListBlock) {\n source = isStartOfLineCapture[1] + source;\n return LIST_R.exec(source);\n } else {\n return null;\n }\n },\n parse: function (capture, parse, state) {\n var bullet = capture[2];\n var ordered = bullet.length > 1;\n var start = ordered ? +bullet : undefined;\n var items: Array<string> = capture[0]\n .replace(LIST_BLOCK_END_R, \"\\n\")\n .match(LIST_ITEM_R);\n\n // We know this will match here, because of how the regexes are\n // defined\n\n var lastItemWasAParagraph = false;\n var itemContent = items.map(function (item: string, i: number) {\n // We need to see how far indented this item is:\n var prefixCapture = LIST_ITEM_PREFIX_R.exec(item);\n var space = prefixCapture ? prefixCapture[0].length : 0;\n // And then we construct a regex to \"unindent\" the subsequent\n // lines of the items by that amount:\n var spaceRegex = new RegExp(\"^ {1,\" + space + \"}\", \"gm\");\n\n // Before processing the item, we need a couple things\n var content = item\n // remove indents on trailing lines:\n .replace(spaceRegex, \"\")\n // remove the bullet:\n .replace(LIST_ITEM_PREFIX_R, \"\");\n\n // I'm not sur4 why this is necessary again?\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 var isLastItem = i === items.length - 1;\n var 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 var 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 var oldStateInline = state.inline;\n var 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 var 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 var result = parse(adjustedContent, state);\n\n // Restore our state before returning\n state.inline = oldStateInline;\n state._list = oldStateList;\n return result;\n });\n\n return {\n ordered: ordered,\n start: start,\n items: itemContent,\n };\n },\n react: function (node, output, state) {\n var ListWrapper = node.ordered ? \"ol\" : \"ul\";\n\n return reactElement(ListWrapper, state.key, {\n start: node.start,\n children: node.items.map(function (item: ASTNode, i: number) {\n return reactElement(\"li\", \"\" + i, {\n children: output(item, state),\n });\n }),\n });\n },\n html: function (node, output, state) {\n var listItems = node.items\n .map(function (item: ASTNode) {\n return htmlTag(\"li\", output(item, state));\n })\n .join(\"\");\n\n var listTag = node.ordered ? \"ol\" : \"ul\";\n var attributes = {\n start: node.start,\n };\n return htmlTag(listTag, listItems, attributes);\n },\n },\n def: {\n order: currOrder++,\n // TODO(aria): This will match without a blank line before the next\n // block element, which is inconsistent with most of the rest of\n // simple-markdown.\n match: blockRegex(\n /^ *\\[([^\\]]+)\\]: *<?([^\\s>]*)>?(?: +[\"(]([^\\n]+)[\")])? *\\n(?: *\\n)*/,\n ),\n parse: function (capture, parse, state) {\n var def = capture[1].replace(/\\s+/g, \" \").toLowerCase();\n var target = capture[2];\n var title = capture[3];\n\n // Look for previous links/images using this def\n // If any links/images using this def have already been declared,\n // they will have added themselves to the state._refs[def] list\n // (_ to deconflict with client-defined state). We look through\n // that list of reflinks for this def, and modify those AST nodes\n // with our newly found information now.\n // Sorry :(.\n if (state._refs && state._refs[def]) {\n // `refNode` can be a link or an image\n state._refs[def].forEach(function (refNode: RefNode) {\n refNode.target = target;\n refNode.title = title;\n });\n }\n\n // Add this def to our map of defs for any future links/images\n // In case we haven't found any or all of the refs referring to\n // this def yet, we add our def to the table of known defs, so\n // that future reflinks can modify themselves appropriately with\n // this information.\n state._defs = state._defs || {};\n state._defs[def] = {\n target: target,\n title: title,\n };\n\n // return the relevant parsed information\n // for debugging only.\n return {\n def: def,\n target: target,\n title: title,\n };\n },\n react: function () {\n return null;\n },\n html: function () {\n return \"\";\n },\n },\n table: {\n order: currOrder++,\n match: blockRegex(TABLES.TABLE_REGEX),\n parse: TABLES.parseTable,\n react: function (node, output, state) {\n var getStyle = function (colIndex: number): {\n [attr: string]: Attr,\n } {\n return node.align[colIndex] == null\n ? {}\n : {\n textAlign: node.align[colIndex],\n };\n };\n\n var headers = node.header.map(function (\n content: ASTNode,\n i: number,\n ) {\n return reactElement(\"th\", \"\" + i, {\n style: getStyle(i),\n scope: \"col\",\n children: output(content, state),\n });\n });\n\n var rows = node.cells.map(function (\n row: Array<ASTNode>,\n r: number,\n ) {\n return reactElement(\"tr\", \"\" + r, {\n children: row.map(function (content: ASTNode, c: number) {\n return reactElement(\"td\", \"\" + c, {\n style: getStyle(c),\n children: output(content, state),\n });\n }),\n });\n });\n\n return reactElement(\"table\", state.key, {\n children: [\n reactElement(\"thead\", \"thead\", {\n children: reactElement(\"tr\", null, {\n children: headers,\n }),\n }),\n reactElement(\"tbody\", \"tbody\", {\n children: rows,\n }),\n ],\n });\n },\n html: function (node, output, state) {\n var getStyle = function (colIndex: number): string {\n return node.align[colIndex] == null\n ? \"\"\n : \"text-align:\" + node.align[colIndex] + \";\";\n };\n\n var headers = node.header\n .map(function (content: ASTNode, i: number) {\n return htmlTag(\"th\", output(content, state), {\n style: getStyle(i),\n scope: \"col\",\n });\n })\n .join(\"\");\n\n var rows = node.cells\n .map(function (row: Array<ASTNode>) {\n var cols = row\n .map(function (content: ASTNode, c: number) {\n return htmlTag(\"td\", output(content, state), {\n style: getStyle(c),\n });\n })\n .join(\"\");\n\n return htmlTag(\"tr\", cols);\n })\n .join(\"\");\n\n var thead = htmlTag(\"thead\", htmlTag(\"tr\", headers));\n var tbody = htmlTag(\"tbody\", rows);\n\n return htmlTag(\"table\", thead + tbody);\n },\n },\n newline: {\n order: currOrder++,\n match: blockRegex(/^(?:\\n *)*\\n/),\n parse: ignoreCapture,\n react: function (node, output, state) {\n return \"\\n\";\n },\n html: function (node, output, state) {\n return \"\\n\";\n },\n },\n paragraph: {\n order: currOrder++,\n match: blockRegex(/^((?:[^\\n]|\\n(?! *\\n))+)(?:\\n *)+\\n/),\n parse: parseCaptureInline,\n react: function (node, output, state) {\n return reactElement(\"div\", state.key, {\n className: \"paragraph\",\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n var attributes = {\n class: \"paragraph\",\n };\n return htmlTag(\"div\", output(node.content, state), attributes);\n },\n },\n escape: {\n order: currOrder++,\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: inlineRegex(/^\\\\([^0-9A-Za-z\\s])/),\n parse: function (capture, parse, state) {\n return {\n type: \"text\",\n content: capture[1],\n };\n },\n react: null,\n html: null,\n },\n tableSeparator: {\n order: currOrder++,\n // $FlowFixMe\n match: function (source, state) {\n if (!state.inTable) {\n return null;\n }\n return /^ *\\| */.exec(source);\n },\n parse: function () {\n return {type: \"tableSeparator\"};\n },\n // These shouldn't be reached, but in case they are, be reasonable:\n react: function () {\n return \" | \";\n },\n html: function () {\n return \" | \";\n },\n },\n autolink: {\n order: currOrder++,\n match: inlineRegex(/^<([^: >]+:\\/[^ >]+)>/),\n parse: function (capture, parse, state) {\n return {\n type: \"link\",\n content: [\n {\n type: \"text\",\n content: capture[1],\n },\n ],\n target: capture[1],\n };\n },\n react: null,\n html: null,\n },\n mailto: {\n order: currOrder++,\n match: inlineRegex(/^<([^ >]+@[^ >]+)>/),\n parse: function (capture, parse, state) {\n var address = capture[1];\n var 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 type: \"link\",\n content: [\n {\n type: \"text\",\n content: address,\n },\n ],\n target: target,\n };\n },\n react: null,\n html: null,\n },\n url: {\n order: currOrder++,\n match: inlineRegex(/^(https?:\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])/),\n parse: function (capture, parse, state) {\n return {\n type: \"link\",\n content: [\n {\n type: \"text\",\n content: capture[1],\n },\n ],\n target: capture[1],\n title: undefined,\n };\n },\n react: null,\n html: null,\n },\n link: {\n order: currOrder++,\n match: inlineRegex(\n new RegExp(\n \"^\\\\[(\" + LINK_INSIDE + \")\\\\]\\\\(\" + LINK_HREF_AND_TITLE + \"\\\\)\",\n ),\n ),\n parse: function (capture, parse, state) {\n var link = {\n content: parse(capture[1], state),\n target: unescapeUrl(capture[2]),\n title: capture[3],\n };\n return link;\n },\n react: function (node, output, state) {\n return reactElement(\"a\", state.key, {\n href: sanitizeUrl(node.target),\n title: node.title,\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n var attributes = {\n href: sanitizeUrl(node.target),\n title: node.title,\n };\n\n return htmlTag(\"a\", output(node.content, state), attributes);\n },\n },\n image: {\n order: currOrder++,\n match: inlineRegex(\n new RegExp(\n \"^!\\\\[(\" +\n LINK_INSIDE +\n \")\\\\]\\\\(\" +\n LINK_HREF_AND_TITLE +\n \"\\\\)\",\n ),\n ),\n parse: function (capture, parse, state) {\n var image = {\n alt: capture[1],\n target: unescapeUrl(capture[2]),\n title: capture[3],\n };\n return image;\n },\n react: function (node, output, state) {\n return reactElement(\"img\", state.key, {\n src: sanitizeUrl(node.target),\n alt: node.alt,\n title: node.title,\n });\n },\n html: function (node, output, state) {\n var attributes = {\n src: sanitizeUrl(node.target),\n alt: node.alt,\n title: node.title,\n };\n\n return htmlTag(\"img\", \"\", attributes, false);\n },\n },\n reflink: {\n order: currOrder++,\n match: inlineRegex(\n new RegExp(\n // The first [part] of the link\n \"^\\\\[(\" +\n LINK_INSIDE +\n \")\\\\]\" +\n // The [ref] target of the link\n \"\\\\s*\\\\[([^\\\\]]*)\\\\]\",\n ),\n ),\n parse: function (capture, parse, state) {\n return parseRef(capture, state, {\n type: \"link\",\n content: parse(capture[1], state),\n });\n },\n react: null,\n html: null,\n },\n refimage: {\n order: currOrder++,\n match: inlineRegex(\n new RegExp(\n // The first [part] of the link\n \"^!\\\\[(\" +\n LINK_INSIDE +\n \")\\\\]\" +\n // The [ref] target of the link\n \"\\\\s*\\\\[([^\\\\]]*)\\\\]\",\n ),\n ),\n parse: function (capture, parse, state) {\n return parseRef(capture, state, {\n type: \"image\",\n alt: capture[1],\n });\n },\n react: null,\n html: null,\n },\n em: {\n order: currOrder /* same as strong/u */,\n match: inlineRegex(\n new RegExp(\n // only match _s surrounding words.\n \"^\\\\b_\" +\n \"((?:__|\\\\\\\\[\\\\s\\\\S]|[^\\\\\\\\_])+?)_\" +\n \"\\\\b\" +\n // Or match *s:\n \"|\" +\n // Only match *s that are followed by a non-space:\n \"^\\\\*(?=\\\\S)(\" +\n // Match at least one of:\n \"(?:\" +\n // - `**`: so that bolds inside italics don't close the\n // italics\n \"\\\\*\\\\*|\" +\n // - escape sequence: so escaped *s don't close us\n \"\\\\\\\\[\\\\s\\\\S]|\" +\n // - whitespace: followed by a non-* (we don't\n // want ' *' to close an italics--it might\n // start a list)\n \"\\\\s+(?:\\\\\\\\[\\\\s\\\\S]|[^\\\\s\\\\*\\\\\\\\]|\\\\*\\\\*)|\" +\n // - non-whitespace, non-*, non-backslash characters\n \"[^\\\\s\\\\*\\\\\\\\]\" +\n \")+?\" +\n // followed by a non-space, non-* then *\n \")\\\\*(?!\\\\*)\",\n ),\n ),\n quality: function (capture) {\n // precedence by length, `em` wins ties:\n return capture[0].length + 0.2;\n },\n parse: function (capture, parse, state) {\n return {\n content: parse(capture[2] || capture[1], state),\n };\n },\n react: function (node, output, state) {\n return reactElement(\"em\", state.key, {\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n return htmlTag(\"em\", output(node.content, state));\n },\n },\n strong: {\n order: currOrder /* same as em */,\n match: inlineRegex(/^\\*\\*((?:\\\\[\\s\\S]|[^\\\\])+?)\\*\\*(?!\\*)/),\n quality: function (capture) {\n // precedence by length, wins ties vs `u`:\n return capture[0].length + 0.1;\n },\n parse: parseCaptureInline,\n react: function (node, output, state) {\n return reactElement(\"strong\", state.key, {\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n return htmlTag(\"strong\", output(node.content, state));\n },\n },\n u: {\n order: currOrder++ /* same as em&strong; increment for next rule */,\n match: inlineRegex(/^__((?:\\\\[\\s\\S]|[^\\\\])+?)__(?!_)/),\n quality: function (capture) {\n // precedence by length, loses all ties\n return capture[0].length;\n },\n parse: parseCaptureInline,\n react: function (node, output, state) {\n return reactElement(\"u\", state.key, {\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n return htmlTag(\"u\", output(node.content, state));\n },\n },\n del: {\n order: currOrder++,\n match: inlineRegex(\n /^~~(?=\\S)((?:\\\\[\\s\\S]|~(?!~)|[^\\s~\\\\]|\\s(?!~~))+?)~~/,\n ),\n parse: parseCaptureInline,\n react: function (node, output, state) {\n return reactElement(\"del\", state.key, {\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n return htmlTag(\"del\", output(node.content, state));\n },\n },\n inlineCode: {\n order: currOrder++,\n match: inlineRegex(/^(`+)([\\s\\S]*?[^`])\\1(?!`)/),\n parse: function (capture, parse, state) {\n return {\n content: capture[2].replace(\n INLINE_CODE_ESCAPE_BACKTICKS_R,\n \"$1\",\n ),\n };\n },\n react: function (node, output, state) {\n return reactElement(\"code\", state.key, {\n children: node.content,\n });\n },\n html: function (node, output, state) {\n return htmlTag(\"code\", sanitizeText(node.content));\n },\n },\n br: {\n order: currOrder++,\n match: anyScopeRegex(/^ {2,}\\n/),\n parse: ignoreCapture,\n react: function (node, output, state) {\n return reactElement(\"br\", state.key, EMPTY_PROPS);\n },\n html: function (node, output, state) {\n return \"<br>\";\n },\n },\n text: {\n order: currOrder++,\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(\n /^[\\s\\S]+?(?=[^0-9A-Za-z\\s\\u00c0-\\uffff]|\\n\\n| {2,}\\n|\\w+:\\S|$)/,\n ),\n parse: function (capture, parse, state) {\n return {\n content: capture[0],\n };\n },\n react: function (node, output, state) {\n return node.content;\n },\n html: function (node, output, state) {\n return sanitizeText(node.content);\n },\n },\n};\n\n/** (deprecated) */\nvar ruleOutput = function (\n // $FlowFixMe\n rules: OutputRules<Rule>,\n property: $Keys<Rule>,\n) {\n if (!property && typeof console !== \"undefined\") {\n console.warn(\n \"simple-markdown ruleOutput should take 'react' or \" +\n \"'html' as the second argument.\",\n );\n }\n\n var nestedRuleOutput = function (\n ast: SingleASTNode,\n outputFunc: Output<any>,\n state: State,\n ) {\n return rules[ast.type][property](ast, outputFunc, state);\n };\n return nestedRuleOutput;\n};\n\n/** (deprecated)\n */\nvar reactFor = function (outputFunc: ReactNodeOutput): ReactOutput {\n var nestedOutput: ReactOutput = function (ast, state) {\n state = state || {};\n if (Array.isArray(ast)) {\n var oldKey = state.key;\n var result: Array<ReactElements> = [];\n\n // map nestedOutput over the ast, except group any text\n // nodes together into a single string output.\n var lastResult = null;\n for (var i = 0; i < ast.length; i++) {\n state.key = \"\" + i;\n var nodeOut = nestedOutput(ast[i], state);\n if (\n typeof nodeOut === \"string\" &&\n typeof lastResult === \"string\"\n ) {\n lastResult = lastResult + nodeOut;\n result[result.length - 1] = lastResult;\n } else {\n result.push(nodeOut);\n lastResult = nodeOut;\n }\n }\n\n state.key = oldKey;\n return result;\n } else {\n return outputFunc(ast, nestedOutput, state);\n }\n };\n return nestedOutput;\n};\n\n/** (deprecated)\n */\nvar htmlFor = function (outputFunc: HtmlNodeOutput): HtmlOutput {\n var nestedOutput: HtmlOutput = function (ast, state) {\n state = state || {};\n if (Array.isArray(ast)) {\n return ast\n .map(function (node) {\n return nestedOutput(node, state);\n })\n .join(\"\");\n } else {\n return outputFunc(ast, nestedOutput, state);\n }\n };\n return nestedOutput;\n};\n\nvar outputFor = function (\n rules: OutputRules<Rule>,\n property: $Keys<Rule>,\n defaultState: ?State = {},\n) {\n if (!property) {\n throw new Error(\n \"simple-markdown: outputFor: `property` must be \" +\n \"defined. \" +\n \"if you just upgraded, you probably need to replace `outputFor` \" +\n \"with `reactFor`\",\n );\n }\n\n var latestState: State;\n // $FlowFixMe[incompatible-type]\n var arrayRule: ArrayRule = rules.Array || defaultRules.Array;\n\n // Tricks to convince tsc that this var is not null:\n var arrayRuleCheck = arrayRule[property];\n if (!arrayRuleCheck) {\n throw new Error(\n \"simple-markdown: outputFor: to join nodes of type `\" +\n property +\n \"` you must provide an `Array:` joiner rule with that type, \" +\n \"Please see the docs for details on specifying an Array rule.\",\n );\n }\n var arrayRuleOutput = arrayRuleCheck;\n\n var nestedOutput: Output<any> = function (ast, state) {\n state = state || latestState;\n latestState = state;\n if (Array.isArray(ast)) {\n return arrayRuleOutput(ast, nestedOutput, state);\n } else {\n return rules[ast.type][property](ast, nestedOutput, state);\n }\n };\n\n var outerOutput: Output<any> = function (ast, state) {\n latestState = populateInitialState(state, defaultState);\n return nestedOutput(ast, latestState);\n };\n return outerOutput;\n};\n\n// $FlowFixMe[incompatible-call]\nvar defaultRawParse = parserFor(defaultRules);\n\nvar defaultBlockParse = function (\n source: string,\n state: ?State,\n): Array<SingleASTNode> {\n state = state || {};\n state.inline = false;\n return defaultRawParse(source, state);\n};\n\nvar defaultInlineParse = function (\n source: string,\n state: ?State,\n): Array<SingleASTNode> {\n state = state || {};\n state.inline = true;\n return defaultRawParse(source, state);\n};\n\nvar defaultImplicitParse = function (\n source: string,\n state: ?State,\n): Array<SingleASTNode> {\n var isBlock = BLOCK_END_R.test(source);\n state = state || {};\n state.inline = !isBlock;\n return defaultRawParse(source, state);\n};\n\n// $FlowFixMe[incompatible-call]\nvar defaultReactOutput: ReactOutput = outputFor(defaultRules, \"react\");\n// $FlowFixMe[incompatible-call]\nvar defaultHtmlOutput: HtmlOutput = outputFor(defaultRules, \"html\");\n\nvar markdownToReact = function (source: string, state: ?State): ReactElements {\n return defaultReactOutput(defaultBlockParse(source, state), state);\n};\n\nvar markdownToHtml = function (source: string, state: ?State): string {\n return defaultHtmlOutput(defaultBlockParse(source, state), state);\n};\n\n// TODO: This needs definition\ntype ReactMarkdownProps = any;\nvar ReactMarkdown = function (props: ReactMarkdownProps): ReactElement {\n var divProps = {};\n\n for (var prop in props) {\n if (\n prop !== \"source\" &&\n // $FlowFixMe\n Object.prototype.hasOwnProperty.call(props, prop)\n ) {\n divProps[prop] = props[prop];\n }\n }\n divProps.children = markdownToReact(props.source);\n\n return reactElement(\"div\", null, divProps);\n};\n\ntype Exports = {\n +defaultRules: DefaultRules,\n +parserFor: (rules: ParserRules, defaultState?: ?State) => Parser,\n +outputFor: <Rule: Object>(\n rules: OutputRules<Rule>,\n param: $Keys<Rule>,\n defaultState?: ?State,\n ) => Output<any>,\n\n +ruleOutput: <Rule: Object>(\n rules: OutputRules<Rule>,\n param: $Keys<Rule>,\n ) => NodeOutput<any>,\n +reactFor: (ReactNodeOutput) => ReactOutput,\n +htmlFor: (HtmlNodeOutput) => HtmlOutput,\n\n +inlineRegex: (regex: RegExp) => MatchFunction,\n +blockRegex: (regex: RegExp) => MatchFunction,\n +anyScopeRegex: (regex: RegExp) => MatchFunction,\n +parseInline: (parse: Parser, content: string, state: State) => ASTNode,\n +parseBlock: (parse: Parser, content: string, state: State) => ASTNode,\n\n +markdownToReact: (source: string, state?: ?State) => ReactElements,\n +markdownToHtml: (source: string, state?: ?State) => string,\n +ReactMarkdown: (props: {source: string, [string]: any}) => ReactElement,\n\n +defaultRawParse: (source: string, state?: ?State) => Array<SingleASTNode>,\n +defaultBlockParse: (\n source: string,\n state?: ?State,\n ) => Array<SingleASTNode>,\n +defaultInlineParse: (\n source: string,\n state?: ?State,\n ) => Array<SingleASTNode>,\n +defaultImplicitParse: (\n source: string,\n state?: ?State,\n ) => Array<SingleASTNode>,\n\n +defaultReactOutput: ReactOutput,\n +defaultHtmlOutput: HtmlOutput,\n\n +preprocess: (source: string) => string,\n +sanitizeText: (text: Attr) => string,\n +sanitizeUrl: (url: ?string) => ?string,\n +unescapeUrl: (url: string) => string,\n +htmlTag: (\n tagName: string,\n content: string,\n attributes: ?{[any]: ?Attr},\n isClosed: ?boolean,\n ) => string,\n +reactElement: (\n type: string,\n key: string | null,\n props: {[string]: any},\n ) => ReactElement,\n};\n\nexport type {\n // Hopefully you shouldn't have to use these, but they're here if you need!\n // Top-level API:\n State,\n Parser,\n Output,\n ReactOutput,\n HtmlOutput,\n // Most of the following types should be considered experimental and\n // subject to change or change names. Again, they shouldn't be necessary,\n // but if they are I'd love to hear how so I can better support them!\n\n // Individual Rule fields:\n Capture,\n MatchFunction,\n ParseFunction,\n NodeOutput,\n ArrayNodeOutput,\n ReactNodeOutput,\n // Single rules:\n ParserRule,\n ReactOutputRule,\n HtmlOutputRule,\n // Sets of rules:\n ParserRules,\n OutputRules,\n Rules,\n ReactRules,\n HtmlRules,\n};\n\n// $FlowFixMe\nvar SimpleMarkdown: Exports = {\n defaultRules: defaultRules,\n parserFor: parserFor,\n outputFor: outputFor,\n\n inlineRegex: inlineRegex,\n blockRegex: blockRegex,\n anyScopeRegex: anyScopeRegex,\n parseInline: parseInline,\n parseBlock: parseBlock,\n\n // default wrappers:\n markdownToReact: markdownToReact,\n markdownToHtml: markdownToHtml,\n ReactMarkdown: ReactMarkdown,\n\n defaultBlockParse: defaultBlockParse,\n defaultInlineParse: defaultInlineParse,\n defaultImplicitParse: defaultImplicitParse,\n\n defaultReactOutput: defaultReactOutput,\n defaultHtmlOutput: defaultHtmlOutput,\n\n preprocess: preprocess,\n sanitizeText: sanitizeText,\n sanitizeUrl: sanitizeUrl,\n unescapeUrl: unescapeUrl,\n htmlTag: htmlTag,\n reactElement: reactElement,\n\n // deprecated:\n defaultRawParse: defaultRawParse,\n ruleOutput: ruleOutput,\n reactFor: reactFor,\n htmlFor: htmlFor,\n\n defaultParse: function () {\n if (typeof console !== \"undefined\") {\n console.warn(\n \"defaultParse is deprecated, please use `defaultImplicitParse`\",\n );\n }\n return defaultImplicitParse.apply(null, (arguments: any));\n },\n defaultOutput: function () {\n if (typeof console !== \"undefined\") {\n console.warn(\n \"defaultOutput is deprecated, please use `defaultReactOutput`\",\n );\n }\n return defaultReactOutput.apply(null, (arguments: any));\n },\n};\n\nexport default SimpleMarkdown;\n"],"names":["TABLE_ROW_SEPARATOR_TRIM","TABLE_CELL_END_TRIM","TABLE_RIGHT_ALIGN","TABLE_CENTER_ALIGN","TABLE_LEFT_ALIGN","parseTableAlignCapture","parseTableRow","parseTable","CR_NEWLINE_R","TAB_R","FORMFEED_R","preprocess","source","replace","populateInitialState","givenState","defaultState","state","prop","Object","prototype","hasOwnProperty","call","parserFor","rules","latestState","ruleList","keys","filter","type","rule","match","order","isFinite","console","warn","String","sort","typeA","typeB","ruleA","ruleB","orderA","orderB","secondaryOrderA","quality","secondaryOrderB","nestedParse","result","ruleType","capture","NaN","i","currRuleType","currRule","currOrder","prevCaptureStr","prevCapture","currCapture","currQuality","Error","length","index","parsed","parse","Array","isArray","push","apply","substring","inline","disableAutoBlockNewlines","inlineRegex","regex","exec","blockRegex","anyScopeRegex","TYPE_SYMBOL","Symbol","for","reactElement","key","props","$$typeof","undefined","ref","_owner","htmlTag","tagName","content","attributes","isClosed","attributeString","attr","attribute","sanitizeText","unclosedTag","EMPTY_PROPS","sanitizeUrl","url","prot","URL","protocol","indexOf","e","SANITIZE_TEXT_R","SANITIZE_TEXT_CODES","text","chr","UNESCAPE_URL_R","unescapeUrl","rawUrlString","parseInline","isCurrentlyInline","parseCaptureInline","ignoreCapture","LIST_ITEM_PREFIX_R","RegExp","LIST_ITEM_R","LIST_ITEM_PREFIX","BLOCK_END_R","INLINE_CODE_ESCAPE_BACKTICKS_R","LIST_BLOCK_END_R","LIST_ITEM_END_R","LIST_R","LIST_LOOKBEHIND_R","TABLES","alignCapture","test","trimEndSeparators","prevInTable","inTable","tableRow","trim","cells","forEach","node","header","align","split","map","parseTableAlign","rowText","parseTableCells","parseNpTable","TABLE_REGEX","NPTABLE_REGEX","LINK_INSIDE","LINK_HREF_AND_TITLE","AUTOLINK_MAILTO_CHECK_R","parseRef","refNode","toLowerCase","_defs","def","target","title","_refs","defaultRules","react","arr","output","oldKey","html","heading","_parse","_x","_x2","_x3","this","arguments","toString","level","children","nptable","lheading","_parse2","_x4","_x5","_x6","hr","codeBlock","_parse3","_x7","_x8","_x9","lang","className","class","fence","_parse4","_x10","_x11","_x12","blockQuote","_parse5","_x13","_x14","_x15","list","isStartOfLineCapture","isListBlock","_list","_parse6","_x16","_x17","_x18","bullet","ordered","start","items","lastItemWasAParagraph","item","prefixCapture","space","spaceRegex","isLastItem","thisItemIsAParagraph","adjustedContent","oldStateInline","oldStateList","ListWrapper","listItems","join","listTag","_parse7","_x19","_x20","_x21","table","getStyle","colIndex","textAlign","headers","style","scope","rows","row","r","c","cols","thead","tbody","newline","paragraph","escape","_parse8","_x22","_x23","_x24","tableSeparator","autolink","_parse9","_x25","_x26","_x27","mailto","_parse10","_x28","_x29","_x30","address","_parse11","_x31","_x32","_x33","link","_parse12","_x34","_x35","_x36","href","image","_parse13","_x37","_x38","_x39","alt","src","reflink","_parse14","_x40","_x41","_x42","refimage","_parse15","_x43","_x44","_x45","em","_parse16","_x46","_x47","_x48","strong","u","del","inlineCode","_parse17","_x49","_x50","_x51","br","_parse18","_x52","_x53","_x54","outputFor","property","arrayRule","arrayRuleCheck","arrayRuleOutput","nestedOutput","ast","outerOutput","defaultRawParse","defaultBlockParse","defaultImplicitParse","isBlock","defaultReactOutput","defaultHtmlOutput","markdownToReact","SimpleMarkdown","parseBlock","markdownToHtml","ReactMarkdown","divProps","defaultInlineParse","ruleOutput","outputFunc","reactFor","lastResult","nodeOut","htmlFor","defaultParse","defaultOutput"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";var t,e,n,r,a,u,l,o,c=/\r\n?/g,i=/\t/g,f=/\f/g,p=function(t){return t.replace(c,"\n").replace(f,"").replace(i," ")},s=function(t,e){var n=t||{};if(null!=e)for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n},d=function(t,e){var n,r=Object.keys(t).filter((function(e){var n=t[e];if(null==n||null==n.match)return!1;var r=n.order;return"number"==typeof r&&isFinite(r)||"undefined"==typeof console||console.warn("simple-markdown: Invalid order for rule `"+e+"`: "+String(r)),!0}));r.sort((function(e,n){var r=t[e],a=t[n],u=r.order,l=a.order;if(u!==l)return u-l;var o=r.quality?0:1,c=a.quality?0:1;return o!==c?o-c:e<n?-1:e>n?1:0}));var a=function(e,u){var l=[];for(n=u=u||n;e;){var o=null,c=null,i=null,f=NaN,p=0,s=r[0],d=t[s];do{var h=d.order,m=null==u.prevCapture?"":u.prevCapture[0],y=d.match(e,u,m);if(y){var g=d.quality?d.quality(y,u,m):0;g<=f||(o=s,c=d,i=y,f=g)}p++,s=r[p],d=t[s]}while(d&&(!i||d.order===h&&d.quality));if(null==c||null==i)throw new Error("Could not find a matching rule for the below content. The rule with highest `order` should always match content provided to it. Check the definition of `match` for '"+r[r.length-1]+"'. It seems to not match the following source:\n"+e);if(i.index)throw new Error("`match` must return a capture starting at index 0 (the current parse index). Did you forget a ^ at the start of the RegExp?");var v=c.parse(i,a,u);Array.isArray(v)?Array.prototype.push.apply(l,v):(null==v.type&&(v.type=o),l.push(v)),u.prevCapture=i,e=e.substring(u.prevCapture[0].length)}return l};return function(t,r){return(n=s(r,e)).inline||n.disableAutoBlockNewlines||(t+="\n\n"),n.prevCapture=null,a(p(t),n)}},h=function(t){var e=function(e,n,r){return n.inline?t.exec(e):null};return e.regex=t,e},m=function(t){var e=function(e,n){return n.inline?null:t.exec(e)};return e.regex=t,e},y=function(t){var e=function(e,n){return t.exec(e)};return e.regex=t,e},g="function"==typeof Symbol&&Symbol.for&&Symbol.for("react.element")||60103,v=function(t,e,n){return{$$typeof:g,type:t,key:null==e?void 0:e,ref:null,props:n,_owner:null}},k=function(t,e,n,r){n=n||{},r=void 0===r||r;var a="";for(var u in n){var l=n[u];Object.prototype.hasOwnProperty.call(n,u)&&l&&(a+=" "+E(u)+'="'+E(l)+'"')}var o="<"+t+a+">";return r?o+e+"</"+t+">":o},w={},x=function(t){if(null==t)return null;try{var e=new URL(t,"https://localhost").protocol;if(0===e.indexOf("javascript:")||0===e.indexOf("vbscript:")||0===e.indexOf("data:"))return null}catch(t){return null}return t},b=/[<>&"']/g,_={"<":"<",">":">","&":"&",'"':""","'":"'","/":"/","`":"`"},E=function(t){return String(t).replace(b,(function(t){return _[t]}))},S=/\\([^0-9A-Za-z\s])/g,R=function(t){return t.replace(S,"$1")},A=function(t,e,n){var r=n.inline||!1;n.inline=!0;var a=t(e,n);return n.inline=r,a},$=function(t,e,n){return{content:A(e,t[1],n)}},O=function(){return{}},T=new RegExp("^( *)((?:[*+-]|\\d+\\.)) +"),j=new RegExp("( *)((?:[*+-]|\\d+\\.)) +[^\\n]*(?:\\n(?!\\1(?:[*+-]|\\d+\\.) )[^\\n]*)*(\n|$)","gm"),P=/\n{2,}$/,C=/^ (?= *`)|(` *) $/g,q=P,F=/ *\n+$/,B=new RegExp("^( *)((?:[*+-]|\\d+\\.)) [\\s\\S]+?(?:\n{2,}(?! )(?!\\1(?:[*+-]|\\d+\\.) )\\n*|\\s*\n*$)"),N=/(?:^|\n)( *)$/,L=(t=/^ *\| *| *\| *$/g,e=/ *$/,n=/^ *-+: *$/,r=/^ *:-+: *$/,a=/^ *:-+ *$/,u=function(t){return n.test(t)?"right":r.test(t)?"center":a.test(t)?"left":null},l=function(t,n,r,a){var u=r.inTable;r.inTable=!0;var l=n(t.trim(),r);r.inTable=u;var o=[[]];return l.forEach((function(t,n){"tableSeparator"===t.type?(!a||0!==n&&n!==l.length-1)&&o.push([]):("text"!==t.type||null!=l[n+1]&&"tableSeparator"!==l[n+1].type||(t.content=t.content.replace(e,"")),o[o.length-1].push(t))})),o},{parseTable:(o=function(e){return function(n,r,a){a.inline=!0;var o=l(n[1],r,a,e),c=function(e,n,r,a){return a&&(e=e.replace(t,"")),e.trim().split("|").map(u)}(n[2],0,0,e),i=function(t,e,n,r){return t.trim().split("\n").map((function(t){return l(t,e,n,r)}))}(n[3],r,a,e);return a.inline=!1,{type:"table",header:o,align:c,cells:i}}})(!0),parseNpTable:o(!1),TABLE_REGEX:/^ *(\|.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/,NPTABLE_REGEX:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/}),I="(?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*",z="\\s*<?((?:\\([^)]*\\)|[^\\s\\\\]|\\\\.)*?)>?(?:\\s+['\"]([\\s\\S]*?)['\"])?\\s*",G=/mailto:/i,X=function(t,e,n){var r=(t[2]||t[1]).replace(/\s+/g," ").toLowerCase();if(e._defs&&e._defs[r]){var a=e._defs[r];n.target=a.target,n.title=a.title}return e._refs=e._refs||{},e._refs[r]=e._refs[r]||[],e._refs[r].push(n),n},U=0,Z={Array:{react:function(t,e,n){for(var r=n.key,a=[],u=0,l=0;u<t.length;u++,l++){n.key=""+u;var o=t[u];if("text"===o.type)for(o={type:"text",content:o.content};u+1<t.length&&"text"===t[u+1].type;u++)o.content+=t[u+1].content;a.push(e(o,n))}return n.key=r,a},html:function(t,e,n){for(var r="",a=0;a<t.length;a++){var u=t[a];if("text"===u.type)for(u={type:"text",content:u.content};a+1<t.length&&"text"===t[a+1].type;a++)u.content+=t[a+1].content;r+=e(u,n)}return r}},heading:{order:U++,match:m(/^ *(#{1,6})([^\n]+?)#* *(?:\n *)+\n/),parse:function(t,e,n){return{level:t[1].length,content:A(e,t[2].trim(),n)}},react:function(t,e,n){return v("h"+t.level,n.key,{children:e(t.content,n)})},html:function(t,e,n){return k("h"+t.level,e(t.content,n))}},nptable:{order:U++,match:m(L.NPTABLE_REGEX),parse:L.parseNpTable,react:null,html:null},lheading:{order:U++,match:m(/^([^\n]+)\n *(=|-){3,} *(?:\n *)+\n/),parse:function(t,e,n){return{type:"heading",level:"="===t[2]?1:2,content:A(e,t[1],n)}},react:null,html:null},hr:{order:U++,match:m(/^( *[-*_]){3,} *(?:\n *)+\n/),parse:O,react:function(t,e,n){return v("hr",n.key,w)},html:function(t,e,n){return"<hr>"}},codeBlock:{order:U++,match:m(/^(?: [^\n]+\n*)+(?:\n *)+\n/),parse:function(t,e,n){return{lang:void 0,content:t[0].replace(/^ /gm,"").replace(/\n+$/,"")}},react:function(t,e,n){var r=t.lang?"markdown-code-"+t.lang:void 0;return v("pre",n.key,{children:v("code",null,{className:r,children:t.content})})},html:function(t,e,n){var r=t.lang?"markdown-code-"+t.lang:void 0,a=k("code",E(t.content),{class:r});return k("pre",a)}},fence:{order:U++,match:m(/^ *(`{3,}|~{3,}) *(?:(\S+) *)?\n([\s\S]+?)\n?\1 *(?:\n *)+\n/),parse:function(t,e,n){return{type:"codeBlock",lang:t[2]||void 0,content:t[3]}},react:null,html:null},blockQuote:{order:U++,match:m(/^( *>[^\n]+(\n[^\n]+)*\n*)+\n{2,}/),parse:function(t,e,n){return{content:e(t[0].replace(/^ *> ?/gm,""),n)}},react:function(t,e,n){return v("blockquote",n.key,{children:e(t.content,n)})},html:function(t,e,n){return k("blockquote",e(t.content,n))}},list:{order:U++,match:function(t,e){var n=null==e.prevCapture?"":e.prevCapture[0],r=N.exec(n),a=e._list||!e.inline;return r&&a?(t=r[1]+t,B.exec(t)):null},parse:function(t,e,n){var r=t[2],a=r.length>1,u=a?+r:void 0,l=t[0].replace(q,"\n").match(j),o=!1;return{ordered:a,start:u,items:l.map((function(t,r){var a=T.exec(t),u=a?a[0].length:0,c=new RegExp("^ {1,"+u+"}","gm"),i=t.replace(c,"").replace(T,""),f=r===l.length-1,p=-1!==i.indexOf("\n\n")||f&&o;o=p;var s,d=n.inline,h=n._list;n._list=!0,p?(n.inline=!1,s=i.replace(F,"\n\n")):(n.inline=!0,s=i.replace(F,""));var m=e(s,n);return n.inline=d,n._list=h,m}))}},react:function(t,e,n){var r=t.ordered?"ol":"ul";return v(r,n.key,{start:t.start,children:t.items.map((function(t,r){return v("li",""+r,{children:e(t,n)})}))})},html:function(t,e,n){var r=t.items.map((function(t){return k("li",e(t,n))})).join(""),a=t.ordered?"ol":"ul",u={start:t.start};return k(a,r,u)}},def:{order:U++,match:m(/^ *\[([^\]]+)\]: *<?([^\s>]*)>?(?: +["(]([^\n]+)[")])? *\n(?: *\n)*/),parse:function(t,e,n){var r=t[1].replace(/\s+/g," ").toLowerCase(),a=t[2],u=t[3];return n._refs&&n._refs[r]&&n._refs[r].forEach((function(t){t.target=a,t.title=u})),n._defs=n._defs||{},n._defs[r]={target:a,title:u},{def:r,target:a,title:u}},react:function(){return null},html:function(){return""}},table:{order:U++,match:m(L.TABLE_REGEX),parse:L.parseTable,react:function(t,e,n){var r=function(e){return null==t.align[e]?{}:{textAlign:t.align[e]}},a=t.header.map((function(t,a){return v("th",""+a,{style:r(a),scope:"col",children:e(t,n)})})),u=t.cells.map((function(t,a){return v("tr",""+a,{children:t.map((function(t,a){return v("td",""+a,{style:r(a),children:e(t,n)})}))})}));return v("table",n.key,{children:[v("thead","thead",{children:v("tr",null,{children:a})}),v("tbody","tbody",{children:u})]})},html:function(t,e,n){var r=function(e){return null==t.align[e]?"":"text-align:"+t.align[e]+";"},a=t.header.map((function(t,a){return k("th",e(t,n),{style:r(a),scope:"col"})})).join(""),u=t.cells.map((function(t){var a=t.map((function(t,a){return k("td",e(t,n),{style:r(a)})})).join("");return k("tr",a)})).join(""),l=k("thead",k("tr",a)),o=k("tbody",u);return k("table",l+o)}},newline:{order:U++,match:m(/^(?:\n *)*\n/),parse:O,react:function(t,e,n){return"\n"},html:function(t,e,n){return"\n"}},paragraph:{order:U++,match:m(/^((?:[^\n]|\n(?! *\n))+)(?:\n *)+\n/),parse:$,react:function(t,e,n){return v("div",n.key,{className:"paragraph",children:e(t.content,n)})},html:function(t,e,n){return k("div",e(t.content,n),{class:"paragraph"})}},escape:{order:U++,match:h(/^\\([^0-9A-Za-z\s])/),parse:function(t,e,n){return{type:"text",content:t[1]}},react:null,html:null},tableSeparator:{order:U++,match:function(t,e){return e.inTable?/^ *\| */.exec(t):null},parse:function(){return{type:"tableSeparator"}},react:function(){return" | "},html:function(){return" | "}},autolink:{order:U++,match:h(/^<([^: >]+:\/[^ >]+)>/),parse:function(t,e,n){return{type:"link",content:[{type:"text",content:t[1]}],target:t[1]}},react:null,html:null},mailto:{order:U++,match:h(/^<([^ >]+@[^ >]+)>/),parse:function(t,e,n){var r=t[1],a=t[1];return G.test(a)||(a="mailto:"+a),{type:"link",content:[{type:"text",content:r}],target:a}},react:null,html:null},url:{order:U++,match:h(/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/),parse:function(t,e,n){return{type:"link",content:[{type:"text",content:t[1]}],target:t[1],title:void 0}},react:null,html:null},link:{order:U++,match:h(new RegExp("^\\[("+I+")\\]\\("+z+"\\)")),parse:function(t,e,n){return{content:e(t[1],n),target:R(t[2]),title:t[3]}},react:function(t,e,n){return v("a",n.key,{href:x(t.target),title:t.title,children:e(t.content,n)})},html:function(t,e,n){var r={href:x(t.target),title:t.title};return k("a",e(t.content,n),r)}},image:{order:U++,match:h(new RegExp("^!\\[("+I+")\\]\\("+z+"\\)")),parse:function(t,e,n){return{alt:t[1],target:R(t[2]),title:t[3]}},react:function(t,e,n){return v("img",n.key,{src:x(t.target),alt:t.alt,title:t.title})},html:function(t,e,n){var r={src:x(t.target),alt:t.alt,title:t.title};return k("img","",r,!1)}},reflink:{order:U++,match:h(new RegExp("^\\[("+I+")\\]\\s*\\[([^\\]]*)\\]")),parse:function(t,e,n){return X(t,n,{type:"link",content:e(t[1],n)})},react:null,html:null},refimage:{order:U++,match:h(new RegExp("^!\\[("+I+")\\]\\s*\\[([^\\]]*)\\]")),parse:function(t,e,n){return X(t,n,{type:"image",alt:t[1]})},react:null,html:null},em:{order:U,match:h(new RegExp("^\\b_((?:__|\\\\[\\s\\S]|[^\\\\_])+?)_\\b|^\\*(?=\\S)((?:\\*\\*|\\\\[\\s\\S]|\\s+(?:\\\\[\\s\\S]|[^\\s\\*\\\\]|\\*\\*)|[^\\s\\*\\\\])+?)\\*(?!\\*)")),quality:function(t){return t[0].length+.2},parse:function(t,e,n){return{content:e(t[2]||t[1],n)}},react:function(t,e,n){return v("em",n.key,{children:e(t.content,n)})},html:function(t,e,n){return k("em",e(t.content,n))}},strong:{order:U,match:h(/^\*\*((?:\\[\s\S]|[^\\])+?)\*\*(?!\*)/),quality:function(t){return t[0].length+.1},parse:$,react:function(t,e,n){return v("strong",n.key,{children:e(t.content,n)})},html:function(t,e,n){return k("strong",e(t.content,n))}},u:{order:U++,match:h(/^__((?:\\[\s\S]|[^\\])+?)__(?!_)/),quality:function(t){return t[0].length},parse:$,react:function(t,e,n){return v("u",n.key,{children:e(t.content,n)})},html:function(t,e,n){return k("u",e(t.content,n))}},del:{order:U++,match:h(/^~~(?=\S)((?:\\[\s\S]|~(?!~)|[^\s~\\]|\s(?!~~))+?)~~/),parse:$,react:function(t,e,n){return v("del",n.key,{children:e(t.content,n)})},html:function(t,e,n){return k("del",e(t.content,n))}},inlineCode:{order:U++,match:h(/^(`+)([\s\S]*?[^`])\1(?!`)/),parse:function(t,e,n){return{content:t[2].replace(C,"$1")}},react:function(t,e,n){return v("code",n.key,{children:t.content})},html:function(t,e,n){return k("code",E(t.content))}},br:{order:U++,match:y(/^ {2,}\n/),parse:O,react:function(t,e,n){return v("br",n.key,w)},html:function(t,e,n){return"<br>"}},text:{order:U++,match:y(/^[\s\S]+?(?=[^0-9A-Za-z\s\u00c0-\uffff]|\n\n| {2,}\n|\w+:\S|$)/),parse:function(t,e,n){return{content:t[0]}},react:function(t,e,n){return t.content},html:function(t,e,n){return E(t.content)}}},H=function(t,e){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!e)throw new Error("simple-markdown: outputFor: `property` must be defined. if you just upgraded, you probably need to replace `outputFor` with `reactFor`");var r,a=t.Array||Z.Array,u=a[e];if(!u)throw new Error("simple-markdown: outputFor: to join nodes of type `"+e+"` you must provide an `Array:` joiner rule with that type, Please see the docs for details on specifying an Array rule.");var l=u,o=function(n,a){return r=a=a||r,Array.isArray(n)?l(n,o,a):t[n.type][e](n,o,a)},c=function(t,e){return r=s(e,n),o(t,r)};return c},D=d(Z),M=function(t,e){return(e=e||{}).inline=!1,D(t,e)},Q=function(t,e){var n=P.test(t);return(e=e||{}).inline=!n,D(t,e)},J=H(Z,"react"),K=H(Z,"html"),V=function(t,e){return J(M(t,e),e)},W={defaultRules:Z,parserFor:d,outputFor:H,inlineRegex:h,blockRegex:m,anyScopeRegex:y,parseInline:A,parseBlock:function(t,e,n){var r=n.inline||!1;n.inline=!1;var a=t(e+"\n\n",n);return n.inline=r,a},markdownToReact:V,markdownToHtml:function(t,e){return K(M(t,e),e)},ReactMarkdown:function(t){var e={};for(var n in t)"source"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.children=V(t.source),v("div",null,e)},defaultBlockParse:M,defaultInlineParse:function(t,e){return(e=e||{}).inline=!0,D(t,e)},defaultImplicitParse:Q,defaultReactOutput:J,defaultHtmlOutput:K,preprocess:p,sanitizeText:E,sanitizeUrl:x,unescapeUrl:R,htmlTag:k,reactElement:v,defaultRawParse:D,ruleOutput:function(t,e){e||"undefined"==typeof console||console.warn("simple-markdown ruleOutput should take 'react' or 'html' as the second argument.");return function(n,r,a){return t[n.type][e](n,r,a)}},reactFor:function(t){var e=function(n,r){if(r=r||{},Array.isArray(n)){for(var a=r.key,u=[],l=null,o=0;o<n.length;o++){r.key=""+o;var c=e(n[o],r);"string"==typeof c&&"string"==typeof l?(l+=c,u[u.length-1]=l):(u.push(c),l=c)}return r.key=a,u}return t(n,e,r)};return e},htmlFor:function(t){var e=function(n,r){return r=r||{},Array.isArray(n)?n.map((function(t){return e(t,r)})).join(""):t(n,e,r)};return e},defaultParse:function(){return"undefined"!=typeof console&&console.warn("defaultParse is deprecated, please use `defaultImplicitParse`"),Q.apply(null,arguments)},defaultOutput:function(){return"undefined"!=typeof console&&console.warn("defaultOutput is deprecated, please use `defaultReactOutput`"),J.apply(null,arguments)}};module.exports=W;
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.js"],"sourcesContent":["/* eslint-disable prefer-spread, no-regex-spaces, no-unused-vars, guard-for-in, no-console, no-var */\n// @flow\n\n/**\n * Simple-Markdown\n * ===============\n *\n * Simple-Markdown's primary goal is to be easy to adapt. It aims\n * to be compliant with John Gruber's [Markdown Syntax page][1],\n * but compatiblity with other markdown implementations' edge-cases\n * will be sacrificed where it conflicts with simplicity or\n * extensibility.\n *\n * If your goal is to simply embed a standard markdown implementation\n * in your website, simple-markdown is probably not the best library\n * for you (although it should work). But if you have struggled to\n * customize an existing library to meet your needs, simple-markdown\n * might be able to help.\n *\n * Many of the regexes and original logic has been adapted from\n * the wonderful [marked.js](https://github.com/chjj/marked)\n */\n\n// Flow Type Definitions:\n\ntype Capture =\n | (Array<string> & {index: number})\n | (Array<string> & {index?: number});\n\ntype Attr = string | number | boolean | null | void;\n\ntype SingleASTNode = {\n type: string,\n [string]: any,\n};\n\ntype UnTypedASTNode = {\n [string]: any,\n};\n\ntype ASTNode = SingleASTNode | Array<SingleASTNode>;\n\ntype State = {\n key?: string | number | void,\n inline?: ?boolean,\n [string]: any,\n};\n\ntype ReactElement = React$Element<any>;\ntype ReactElements = React$Node;\n\ntype MatchFunction = {regex?: RegExp} & ((\n source: string,\n state: State,\n prevCapture: string,\n) => ?Capture);\n\ntype Parser = (source: string, state?: ?State) => Array<SingleASTNode>;\n\ntype ParseFunction = (\n capture: Capture,\n nestedParse: Parser,\n state: State,\n) => UnTypedASTNode | ASTNode;\n\ntype SingleNodeParseFunction = (\n capture: Capture,\n nestedParse: Parser,\n state: State,\n) => UnTypedASTNode;\n\ntype Output<Result> = (node: ASTNode, state?: ?State) => Result;\n\ntype NodeOutput<Result> = (\n node: SingleASTNode,\n nestedOutput: Output<Result>,\n state: State,\n) => Result;\n\ntype ArrayNodeOutput<Result> = (\n node: Array<SingleASTNode>,\n nestedOutput: Output<Result>,\n state: State,\n) => Result;\n\ntype ReactOutput = Output<ReactElements>;\ntype ReactNodeOutput = NodeOutput<ReactElements>;\ntype HtmlOutput = Output<string>;\ntype HtmlNodeOutput = NodeOutput<string>;\n\ntype ParserRule = {\n +order: number,\n +match: MatchFunction,\n +quality?: (capture: Capture, state: State, prevCapture: string) => number,\n +parse: ParseFunction,\n};\n\ntype SingleNodeParserRule = {\n +order: number,\n +match: MatchFunction,\n +quality?: (capture: Capture, state: State, prevCapture: string) => number,\n +parse: SingleNodeParseFunction,\n};\n\ntype ReactOutputRule = {\n // we allow null because some rules are never output results, and that's\n // legal as long as no parsers return an AST node matching that rule.\n // We don't use ? because this makes it be explicitly defined as either\n // a valid function or null, so it can't be forgotten.\n +react: ReactNodeOutput | null,\n};\n\ntype HtmlOutputRule = {\n +html: HtmlNodeOutput | null,\n};\n\ntype ArrayRule = {\n +react?: ArrayNodeOutput<ReactElements>,\n +html?: ArrayNodeOutput<string>,\n +[string]: ArrayNodeOutput<any>,\n};\n\ntype ParserRules = {\n +Array?: ArrayRule,\n +[type: string]: ParserRule,\n};\n\ntype OutputRules<Rule> = {\n +Array?: ArrayRule,\n +[type: string]: Rule,\n};\ntype Rules<OutputRule> = {\n +Array?: ArrayRule,\n +[type: string]: ParserRule & OutputRule,\n};\ntype ReactRules = {\n +Array?: {\n +react: ArrayNodeOutput<ReactElements>,\n },\n +[type: string]: ParserRule & ReactOutputRule,\n};\ntype HtmlRules = {\n +Array?: {\n +html: ArrayNodeOutput<string>,\n },\n +[type: string]: ParserRule & HtmlOutputRule,\n};\n\n// We want to clarify our defaultRules types a little bit more so clients can\n// reuse defaultRules built-ins. So we make some stronger guarantess when\n// we can:\ntype NonNullReactOutputRule = {\n +react: ReactNodeOutput,\n};\ntype ElementReactOutputRule = {\n +react: NodeOutput<ReactElement>,\n};\ntype TextReactOutputRule = {\n +react: NodeOutput<string>,\n};\ntype NonNullHtmlOutputRule = {\n +html: HtmlNodeOutput,\n};\n\ntype DefaultInRule = SingleNodeParserRule & ReactOutputRule & HtmlOutputRule;\ntype TextInOutRule = SingleNodeParserRule &\n TextReactOutputRule &\n NonNullHtmlOutputRule;\ntype LenientInOutRule = SingleNodeParserRule &\n NonNullReactOutputRule &\n NonNullHtmlOutputRule;\ntype DefaultInOutRule = SingleNodeParserRule &\n ElementReactOutputRule &\n NonNullHtmlOutputRule;\n\ntype DefaultRules = {\n +Array: {\n +react: ArrayNodeOutput<ReactElements>,\n +html: ArrayNodeOutput<string>,\n },\n +heading: DefaultInOutRule,\n +nptable: DefaultInRule,\n +lheading: DefaultInRule,\n +hr: DefaultInOutRule,\n +codeBlock: DefaultInOutRule,\n +fence: DefaultInRule,\n +blockQuote: DefaultInOutRule,\n +list: DefaultInOutRule,\n +def: LenientInOutRule,\n +table: DefaultInOutRule,\n +tableSeparator: DefaultInRule,\n +newline: TextInOutRule,\n +paragraph: DefaultInOutRule,\n +escape: DefaultInRule,\n +autolink: DefaultInRule,\n +mailto: DefaultInRule,\n +url: DefaultInRule,\n +link: DefaultInOutRule,\n +image: DefaultInOutRule,\n +reflink: DefaultInRule,\n +refimage: DefaultInRule,\n +em: DefaultInOutRule,\n +strong: DefaultInOutRule,\n +u: DefaultInOutRule,\n +del: DefaultInOutRule,\n +inlineCode: DefaultInOutRule,\n +br: DefaultInOutRule,\n +text: TextInOutRule,\n};\n\ntype RefNode = {\n type: string,\n content?: ASTNode,\n target?: string,\n title?: string,\n alt?: string,\n};\n\n// End Flow Definitions\n\nvar CR_NEWLINE_R = /\\r\\n?/g;\nvar TAB_R = /\\t/g;\nvar FORMFEED_R = /\\f/g;\n\n/**\n * Turn various whitespace into easy-to-process whitespace\n */\nvar preprocess = function (source: string): string {\n return source\n .replace(CR_NEWLINE_R, \"\\n\")\n .replace(FORMFEED_R, \"\")\n .replace(TAB_R, \" \");\n};\n\nvar populateInitialState = function (\n givenState: ?State,\n defaultState: ?State,\n): State {\n var state: State = givenState || {};\n if (defaultState != null) {\n for (var prop in defaultState) {\n // $FlowFixMe\n if (Object.prototype.hasOwnProperty.call(defaultState, prop)) {\n state[prop] = defaultState[prop];\n }\n }\n }\n return state;\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 * @param {SimpleMarkdown.ParserRules} rules\n * an object containing\n * rule type -> {match, order, parse} objects\n * (lower order is higher precedence)\n * @param {SimpleMarkdown.OptionalState} [defaultState]\n *\n * @returns {SimpleMarkdown.Parser}\n * 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 */\nvar parserFor = function (rules: ParserRules, defaultState: ?State): Parser {\n // Sorts rules in order of increasing order, then\n // ascending rule name in case of ties.\n var ruleList = Object.keys(rules).filter(function (type) {\n var rule = rules[type];\n if (rule == null || rule.match == null) {\n return false;\n }\n var order = rule.order;\n if (\n (typeof order !== \"number\" || !isFinite(order)) &&\n typeof console !== \"undefined\"\n ) {\n console.warn(\n \"simple-markdown: Invalid order for rule `\" +\n type +\n \"`: \" +\n String(order),\n );\n }\n return true;\n });\n\n ruleList.sort(function (typeA, typeB) {\n var ruleA: ParserRule = (rules[typeA]: any);\n var ruleB: ParserRule = (rules[typeB]: any);\n var orderA = ruleA.order;\n var orderB = ruleB.order;\n\n // First sort based on increasing order\n if (orderA !== orderB) {\n return orderA - orderB;\n }\n\n var secondaryOrderA = ruleA.quality ? 0 : 1;\n var secondaryOrderB = ruleB.quality ? 0 : 1;\n\n if (secondaryOrderA !== secondaryOrderB) {\n return secondaryOrderA - secondaryOrderB;\n\n // Then based on increasing unicode lexicographic ordering\n } else if (typeA < typeB) {\n return -1;\n } else if (typeA > typeB) {\n return 1;\n } else {\n // Rules should never have the same name,\n // but this is provided for completeness.\n return 0;\n }\n });\n\n var latestState: State;\n var nestedParse = function (source: string, state: ?State): Parser {\n var result: Array<SingleASTNode> = [];\n state = state || latestState;\n latestState = state;\n while (source) {\n // store the best match, it's rule, and quality:\n var ruleType = null;\n var rule = null;\n var capture = null;\n var quality = NaN;\n\n // loop control variables:\n var i = 0;\n var currRuleType = ruleList[0];\n\n // $FlowFixMe\n var currRule: ParserRule = rules[currRuleType];\n\n do {\n var currOrder = currRule.order;\n var prevCaptureStr =\n state.prevCapture == null ? \"\" : state.prevCapture[0];\n var currCapture = currRule.match(source, state, prevCaptureStr);\n\n if (currCapture) {\n var currQuality = currRule.quality\n ? currRule.quality(currCapture, state, prevCaptureStr)\n : 0;\n // This should always be true the first time because\n // the initial quality is NaN (that's why there's the\n // condition negation).\n if (!(currQuality <= quality)) {\n ruleType = currRuleType;\n rule = currRule;\n capture = currCapture;\n quality = currQuality;\n }\n }\n\n // Move on to the next item.\n // Note that this makes `currRule` be the next item\n i++;\n currRuleType = ruleList[i];\n // $FlowFixMe\n currRule = rules[currRuleType];\n } while (\n // keep looping while we're still within the ruleList\n currRule &&\n // if we don't have a match yet, continue\n (!capture ||\n // or if we have a match, but the next rule is\n // at the same order, and has a quality measurement\n // functions, then this rule must have a quality\n // measurement function (since they are sorted before\n // those without), and we need to check if there is\n // a better quality match\n (currRule.order === currOrder && currRule.quality))\n );\n\n // TODO(aria): Write tests for these\n if (rule == null || capture == null) {\n throw new Error(\n \"Could not find a matching rule for the below \" +\n \"content. The rule with highest `order` should \" +\n \"always match content provided to it. Check \" +\n \"the definition of `match` for '\" +\n ruleList[ruleList.length - 1] +\n \"'. It seems to not match the following source:\\n\" +\n source,\n );\n }\n if (capture.index) {\n // If present and non-zero, i.e. a non-^ regexp result:\n throw new Error(\n \"`match` must return a capture starting at index 0 \" +\n \"(the current parse index). Did you forget a ^ at the \" +\n \"start of the RegExp?\",\n );\n }\n\n // $FlowFixMe\n var parsed = rule.parse(capture, nestedParse, state);\n // We maintain the same object here so that rules can\n // store references to the objects they return and\n // modify them later. (oops sorry! but this adds a lot\n // of power--see reflinks.)\n if (Array.isArray(parsed)) {\n // $FlowFixMe\n Array.prototype.push.apply(result, parsed);\n } else {\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 // $FlowFixMe\n parsed.type = ruleType;\n }\n result.push(parsed);\n }\n\n state.prevCapture = capture;\n source = source.substring(state.prevCapture[0].length);\n }\n\n // $FlowFixMe\n return result;\n };\n\n var outerParse = function (source: string, state: ?State): Parser {\n latestState = populateInitialState(state, defaultState);\n if (!latestState.inline && !latestState.disableAutoBlockNewlines) {\n source = source + \"\\n\\n\";\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). This stores\n // the full regex capture object, if there is one.\n latestState.prevCapture = null;\n return nestedParse(preprocess(source), latestState);\n };\n\n // $FlowFixMe\n return outerParse;\n};\n\n// Creates a match function for an inline scoped element from a regex\nvar inlineRegex = function (regex: RegExp): MatchFunction {\n var match = function (\n source: string,\n state: State,\n prevCapture: string,\n ): ?Capture {\n if (state.inline) {\n // $FlowFixMe\n return regex.exec(source);\n } else {\n return null;\n }\n };\n match.regex = regex;\n\n return match;\n};\n\n// Creates a match function for a block scoped element from a regex\nvar blockRegex = function (regex: RegExp): MatchFunction {\n // $FlowFixMe\n var match: MatchFunction = function (source, state) {\n if (state.inline) {\n return null;\n } else {\n return regex.exec(source);\n }\n };\n match.regex = regex;\n return match;\n};\n\n// Creates a match function from a regex, ignoring block/inline scope\nvar anyScopeRegex = function (regex: RegExp): MatchFunction {\n // $FlowFixMe\n var match: MatchFunction = function (source, state) {\n return regex.exec(source);\n };\n match.regex = regex;\n return match;\n};\n\nvar TYPE_SYMBOL =\n (typeof Symbol === \"function\" &&\n Symbol.for &&\n Symbol.for(\"react.element\")) ||\n 0xeac7;\n\nvar reactElement = function (\n type: string,\n key: string | number | null | void,\n props: {[string]: any},\n): ReactElement {\n var element: ReactElement = ({\n $$typeof: TYPE_SYMBOL,\n type: type,\n key: key == null ? undefined : key,\n ref: null,\n props: props,\n _owner: null,\n }: any);\n return element;\n};\n\n/** Returns a closed HTML tag.\n * @param {string} tagName - Name of HTML tag (eg. \"em\" or \"a\")\n * @param {string} content - Inner content of tag\n * @param {{ [attr: string]: SimpleMarkdown.Attr }} [attributes] - Optional extra attributes of tag as an object of key-value pairs\n * eg. { \"href\": \"http://google.com\" }. Falsey attributes are filtered out.\n * @param {boolean} [isClosed] - boolean that controls whether tag is closed or not (eg. img tags).\n * defaults to true\n */\nvar htmlTag = function (\n tagName: string,\n content: string,\n attributes: ?{[any]: ?Attr},\n isClosed: ?boolean,\n) {\n attributes = attributes || {};\n isClosed = typeof isClosed !== \"undefined\" ? isClosed : true;\n\n var attributeString = \"\";\n for (var attr in attributes) {\n var attribute = attributes[attr];\n // Removes falsey attributes\n if (\n // $FlowFixMe\n Object.prototype.hasOwnProperty.call(attributes, attr) &&\n attribute\n ) {\n attributeString +=\n \" \" + sanitizeText(attr) + '=\"' + sanitizeText(attribute) + '\"';\n }\n }\n\n var unclosedTag = \"<\" + tagName + attributeString + \">\";\n\n if (isClosed) {\n return unclosedTag + content + \"</\" + tagName + \">\";\n } else {\n return unclosedTag;\n }\n};\n\nvar EMPTY_PROPS = {};\n\n/**\n * @param {string | null | undefined} url - url to sanitize\n * @returns {string | null} - url if safe, or null if a safe url could not be made\n */\nvar sanitizeUrl = function (url: ?string) {\n if (url == null) {\n return null;\n }\n try {\n var prot = new URL(url, \"https://localhost\").protocol;\n if (\n prot.indexOf(\"javascript:\") === 0 ||\n prot.indexOf(\"vbscript:\") === 0 ||\n prot.indexOf(\"data:\") === 0\n ) {\n return null;\n }\n } catch (e) {\n // invalid URLs should throw a TypeError\n // see for instance: `new URL(\"\");`\n return null;\n }\n return url;\n};\n\nvar SANITIZE_TEXT_R = /[<>&\"']/g;\nvar SANITIZE_TEXT_CODES = {\n \"<\": \"<\",\n \">\": \">\",\n \"&\": \"&\",\n '\"': \""\",\n \"'\": \"'\",\n \"/\": \"/\",\n \"`\": \"`\",\n};\n\nvar sanitizeText = function (text: Attr): string {\n return String(text).replace(SANITIZE_TEXT_R, function (chr) {\n return SANITIZE_TEXT_CODES[chr];\n });\n};\n\nvar UNESCAPE_URL_R = /\\\\([^0-9A-Za-z\\s])/g;\n\nvar unescapeUrl = function (rawUrlString: string): string {\n return rawUrlString.replace(UNESCAPE_URL_R, \"$1\");\n};\n\n/**\n * Parse some content with the parser `parse`, with state.inline\n * set to true. Useful for block elements; not generally necessary\n * to be used by inline elements (where state.inline is already true.\n */\nvar parseInline = function (\n parse: Parser,\n content: string,\n state: State,\n): ASTNode {\n var isCurrentlyInline = state.inline || false;\n state.inline = true;\n var result = parse(content, state);\n state.inline = isCurrentlyInline;\n return result;\n};\n\nvar parseBlock = function (\n parse: Parser,\n content: string,\n state: State,\n): ASTNode {\n var isCurrentlyInline = state.inline || false;\n state.inline = false;\n var result = parse(content + \"\\n\\n\", state);\n state.inline = isCurrentlyInline;\n return result;\n};\n\nvar parseCaptureInline = function (\n capture: Capture,\n parse: Parser,\n state: State,\n): UnTypedASTNode {\n return {\n content: parseInline(parse, capture[1], state),\n };\n};\n\nvar ignoreCapture = function (): UnTypedASTNode {\n return {};\n};\n\n// recognize a `*` `-`, `+`, `1.`, `2.`... list bullet\nvar LIST_BULLET = \"(?:[*+-]|\\\\d+\\\\.)\";\n// recognize the start of a list item:\n// leading space plus a bullet plus a space (` * `)\nvar LIST_ITEM_PREFIX = \"( *)(\" + LIST_BULLET + \") +\";\nvar LIST_ITEM_PREFIX_R = new RegExp(\"^\" + LIST_ITEM_PREFIX);\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\nvar LIST_ITEM_R = new RegExp(\n LIST_ITEM_PREFIX +\n \"[^\\\\n]*(?:\\\\n\" +\n \"(?!\\\\1\" +\n LIST_BULLET +\n \" )[^\\\\n]*)*(\\n|$)\",\n \"gm\",\n);\nvar BLOCK_END_R = /\\n{2,}$/;\nvar INLINE_CODE_ESCAPE_BACKTICKS_R = /^ (?= *`)|(` *) $/g;\n// recognize the end of a paragraph block inside a list item:\n// two or more newlines at end end of the item\nvar LIST_BLOCK_END_R = BLOCK_END_R;\nvar LIST_ITEM_END_R = / *\\n+$/;\n// check whether a list item has paragraphs: if it does,\n// we leave the newlines at the end\nvar LIST_R = new RegExp(\n \"^( *)(\" +\n LIST_BULLET +\n \") \" +\n \"[\\\\s\\\\S]+?(?:\\n{2,}(?! )\" +\n \"(?!\\\\1\" +\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);\nvar LIST_LOOKBEHIND_R = /(?:^|\\n)( *)$/;\n\nvar TABLES = (function () {\n // predefine regexes so we don't have to create them inside functions\n // sure, regex literals should be fast, even inside functions, but they\n // aren't in all browsers.\n var TABLE_BLOCK_TRIM = /\\n+/g;\n var TABLE_ROW_SEPARATOR_TRIM = /^ *\\| *| *\\| *$/g;\n var TABLE_CELL_END_TRIM = / *$/;\n var TABLE_RIGHT_ALIGN = /^ *-+: *$/;\n var TABLE_CENTER_ALIGN = /^ *:-+: *$/;\n var TABLE_LEFT_ALIGN = /^ *:-+ *$/;\n\n // TODO: This needs a real type\n type TableAlignment = any;\n\n var parseTableAlignCapture = function (\n alignCapture: string,\n ): TableAlignment {\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 } else {\n return null;\n }\n };\n\n var parseTableAlign = function (\n source: string,\n parse: Parser,\n state: State,\n trimEndSeparators: boolean,\n ): Array<TableAlignment> {\n if (trimEndSeparators) {\n source = source.replace(TABLE_ROW_SEPARATOR_TRIM, \"\");\n }\n var alignText = source.trim().split(\"|\");\n return alignText.map(parseTableAlignCapture);\n };\n\n var parseTableRow = function (\n source: string,\n parse: Parser,\n state: State,\n trimEndSeparators: boolean,\n ): Array<Array<SingleASTNode>> {\n var prevInTable = state.inTable;\n state.inTable = true;\n var tableRow = parse(source.trim(), state);\n state.inTable = prevInTable;\n\n var cells = [[]];\n tableRow.forEach(function (node, i) {\n if (node.type === \"tableSeparator\") {\n // Filter out empty table separators at the start/end:\n if (\n !trimEndSeparators ||\n (i !== 0 && i !== tableRow.length - 1)\n ) {\n // Split the current row:\n cells.push([]);\n }\n } else {\n if (\n node.type === \"text\" &&\n (tableRow[i + 1] == null ||\n tableRow[i + 1].type === \"tableSeparator\")\n ) {\n node.content = node.content.replace(\n TABLE_CELL_END_TRIM,\n \"\",\n );\n }\n cells[cells.length - 1].push(node);\n }\n });\n\n return cells;\n };\n\n /**\n * @param {string} source\n * @param {SimpleMarkdown.Parser} parse\n * @param {SimpleMarkdown.State} state\n * @param {boolean} trimEndSeparators\n * @returns {SimpleMarkdown.ASTNode[][]}\n */\n var parseTableCells = function (\n source: string,\n parse: Parser,\n state: State,\n trimEndSeparators: boolean,\n ): Array<Array<ASTNode>> {\n var rowsText = source.trim().split(\"\\n\");\n\n return rowsText.map(function (rowText) {\n // $FlowFixMe\n return parseTableRow(rowText, parse, state, trimEndSeparators);\n });\n };\n\n /**\n * @param {boolean} trimEndSeparators\n * @returns {SimpleMarkdown.SingleNodeParseFunction}\n */\n var parseTable = function (trimEndSeparators) {\n return function (capture, parse, state) {\n state.inline = true;\n var header = parseTableRow(\n capture[1],\n parse,\n state,\n trimEndSeparators,\n );\n var align = parseTableAlign(\n capture[2],\n parse,\n state,\n trimEndSeparators,\n );\n var cells = parseTableCells(\n capture[3],\n parse,\n state,\n trimEndSeparators,\n );\n state.inline = false;\n\n return {\n type: \"table\",\n header: header,\n align: align,\n cells: cells,\n };\n };\n };\n\n return {\n parseTable: parseTable(true),\n parseNpTable: parseTable(false),\n TABLE_REGEX:\n /^ *(\\|.+)\\n *\\|( *[-:]+[-| :]*)\\n((?: *\\|.*(?:\\n|$))*)\\n*/,\n NPTABLE_REGEX:\n /^ *(\\S.*\\|.*)\\n *([-:]+ *\\|[-| :]*)\\n((?:.*\\|.*(?:\\n|$))*)\\n*/,\n };\n})();\n\nvar LINK_INSIDE = \"(?:\\\\[[^\\\\]]*\\\\]|[^\\\\[\\\\]]|\\\\](?=[^\\\\[]*\\\\]))*\";\nvar LINK_HREF_AND_TITLE =\n \"\\\\s*<?((?:\\\\([^)]*\\\\)|[^\\\\s\\\\\\\\]|\\\\\\\\.)*?)>?(?:\\\\s+['\\\"]([\\\\s\\\\S]*?)['\\\"])?\\\\s*\";\nvar AUTOLINK_MAILTO_CHECK_R = /mailto:/i;\n\nvar parseRef = function (\n capture: Capture,\n state: State,\n refNode: RefNode,\n): RefNode {\n var ref = (capture[2] || capture[1]).replace(/\\s+/g, \" \").toLowerCase();\n\n // We store information about previously seen defs on\n // state._defs (_ to deconflict with client-defined\n // state). If the def for this reflink/refimage has\n // already been seen, we can use its target/source\n // and title here:\n if (state._defs && state._defs[ref]) {\n var def = state._defs[ref];\n // `refNode` can be a link or an image. Both use\n // target and title properties.\n refNode.target = def.target;\n refNode.title = def.title;\n }\n\n // In case we haven't seen our def yet (or if someone\n // overwrites that def later on), we add this node\n // to the list of ref nodes for that def. Then, when\n // we find the def, we can modify this link/image AST\n // node :).\n // I'm sorry.\n state._refs = state._refs || {};\n state._refs[ref] = state._refs[ref] || [];\n state._refs[ref].push(refNode);\n\n return refNode;\n};\n\nvar currOrder = 0;\n\nvar defaultRules: DefaultRules = {\n Array: {\n react: function (arr, output, state) {\n var oldKey = state.key;\n var result: Array<ReactElements> = [];\n\n // map output over the ast, except group any text\n // nodes together into a single string output.\n for (var i = 0, key = 0; i < arr.length; i++, key++) {\n // `key` is our numerical `state.key`, which we increment for\n // every output node, but don't change for joined text nodes.\n // (i, however, must change for joined text nodes)\n state.key = \"\" + i;\n\n var node = arr[i];\n if (node.type === \"text\") {\n node = {type: \"text\", content: node.content};\n for (\n ;\n i + 1 < arr.length && arr[i + 1].type === \"text\";\n i++\n ) {\n node.content += arr[i + 1].content;\n }\n }\n\n result.push(output(node, state));\n }\n\n state.key = oldKey;\n return result;\n },\n html: function (arr, output, state) {\n var result = \"\";\n\n // map output over the ast, except group any text\n // nodes together into a single string output.\n for (var i = 0, key = 0; i < arr.length; i++) {\n var node = arr[i];\n if (node.type === \"text\") {\n node = {type: \"text\", content: node.content};\n for (\n ;\n i + 1 < arr.length && arr[i + 1].type === \"text\";\n i++\n ) {\n node.content += arr[i + 1].content;\n }\n }\n\n result += output(node, state);\n }\n return result;\n },\n },\n heading: {\n order: currOrder++,\n match: blockRegex(/^ *(#{1,6})([^\\n]+?)#* *(?:\\n *)+\\n/),\n parse: function (capture, parse, state) {\n return {\n level: capture[1].length,\n content: parseInline(parse, capture[2].trim(), state),\n };\n },\n react: function (node, output, state) {\n return reactElement(\"h\" + node.level, state.key, {\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n return htmlTag(\"h\" + node.level, output(node.content, state));\n },\n },\n nptable: {\n order: currOrder++,\n match: blockRegex(TABLES.NPTABLE_REGEX),\n parse: TABLES.parseNpTable,\n react: null,\n html: null,\n },\n lheading: {\n order: currOrder++,\n match: blockRegex(/^([^\\n]+)\\n *(=|-){3,} *(?:\\n *)+\\n/),\n parse: function (capture, parse, state) {\n return {\n type: \"heading\",\n level: capture[2] === \"=\" ? 1 : 2,\n content: parseInline(parse, capture[1], state),\n };\n },\n react: null,\n html: null,\n },\n hr: {\n order: currOrder++,\n match: blockRegex(/^( *[-*_]){3,} *(?:\\n *)+\\n/),\n parse: ignoreCapture,\n react: function (node, output, state) {\n return reactElement(\"hr\", state.key, EMPTY_PROPS);\n },\n html: function (node, output, state) {\n return \"<hr>\";\n },\n },\n codeBlock: {\n order: currOrder++,\n match: blockRegex(/^(?: [^\\n]+\\n*)+(?:\\n *)+\\n/),\n parse: function (capture, parse, state) {\n var content = capture[0].replace(/^ /gm, \"\").replace(/\\n+$/, \"\");\n return {\n lang: undefined,\n content: content,\n };\n },\n react: function (node, output, state) {\n var className = node.lang\n ? \"markdown-code-\" + node.lang\n : undefined;\n\n return reactElement(\"pre\", state.key, {\n children: reactElement(\"code\", null, {\n className: className,\n children: node.content,\n }),\n });\n },\n html: function (node, output, state) {\n var className = node.lang\n ? \"markdown-code-\" + node.lang\n : undefined;\n\n var codeBlock = htmlTag(\"code\", sanitizeText(node.content), {\n class: className,\n });\n return htmlTag(\"pre\", codeBlock);\n },\n },\n fence: {\n order: currOrder++,\n match: blockRegex(\n /^ *(`{3,}|~{3,}) *(?:(\\S+) *)?\\n([\\s\\S]+?)\\n?\\1 *(?:\\n *)+\\n/,\n ),\n parse: function (capture, parse, state) {\n return {\n type: \"codeBlock\",\n lang: capture[2] || undefined,\n content: capture[3],\n };\n },\n react: null,\n html: null,\n },\n blockQuote: {\n order: currOrder++,\n match: blockRegex(/^( *>[^\\n]+(\\n[^\\n]+)*\\n*)+\\n{2,}/),\n parse: function (capture, parse, state) {\n var content = capture[0].replace(/^ *> ?/gm, \"\");\n return {\n content: parse(content, state),\n };\n },\n react: function (node, output, state) {\n return reactElement(\"blockquote\", state.key, {\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n return htmlTag(\"blockquote\", output(node.content, state));\n },\n },\n list: {\n order: currOrder++,\n // $FlowFixMe\n match: function (source, state) {\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 var prevCaptureStr =\n state.prevCapture == null ? \"\" : state.prevCapture[0];\n var isStartOfLineCapture = LIST_LOOKBEHIND_R.exec(prevCaptureStr);\n var isListBlock = state._list || !state.inline;\n\n if (isStartOfLineCapture && isListBlock) {\n source = isStartOfLineCapture[1] + source;\n return LIST_R.exec(source);\n } else {\n return null;\n }\n },\n parse: function (capture, parse, state) {\n var bullet = capture[2];\n var ordered = bullet.length > 1;\n var start = ordered ? +bullet : undefined;\n var items: Array<string> = capture[0]\n .replace(LIST_BLOCK_END_R, \"\\n\")\n .match(LIST_ITEM_R);\n\n // We know this will match here, because of how the regexes are\n // defined\n\n var lastItemWasAParagraph = false;\n var itemContent = items.map(function (item: string, i: number) {\n // We need to see how far indented this item is:\n var prefixCapture = LIST_ITEM_PREFIX_R.exec(item);\n var space = prefixCapture ? prefixCapture[0].length : 0;\n // And then we construct a regex to \"unindent\" the subsequent\n // lines of the items by that amount:\n var spaceRegex = new RegExp(\"^ {1,\" + space + \"}\", \"gm\");\n\n // Before processing the item, we need a couple things\n var content = item\n // remove indents on trailing lines:\n .replace(spaceRegex, \"\")\n // remove the bullet:\n .replace(LIST_ITEM_PREFIX_R, \"\");\n\n // I'm not sur4 why this is necessary again?\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 var isLastItem = i === items.length - 1;\n var 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 var 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 var oldStateInline = state.inline;\n var 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 var 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 var result = parse(adjustedContent, state);\n\n // Restore our state before returning\n state.inline = oldStateInline;\n state._list = oldStateList;\n return result;\n });\n\n return {\n ordered: ordered,\n start: start,\n items: itemContent,\n };\n },\n react: function (node, output, state) {\n var ListWrapper = node.ordered ? \"ol\" : \"ul\";\n\n return reactElement(ListWrapper, state.key, {\n start: node.start,\n children: node.items.map(function (item: ASTNode, i: number) {\n return reactElement(\"li\", \"\" + i, {\n children: output(item, state),\n });\n }),\n });\n },\n html: function (node, output, state) {\n var listItems = node.items\n .map(function (item: ASTNode) {\n return htmlTag(\"li\", output(item, state));\n })\n .join(\"\");\n\n var listTag = node.ordered ? \"ol\" : \"ul\";\n var attributes = {\n start: node.start,\n };\n return htmlTag(listTag, listItems, attributes);\n },\n },\n def: {\n order: currOrder++,\n // TODO(aria): This will match without a blank line before the next\n // block element, which is inconsistent with most of the rest of\n // simple-markdown.\n match: blockRegex(\n /^ *\\[([^\\]]+)\\]: *<?([^\\s>]*)>?(?: +[\"(]([^\\n]+)[\")])? *\\n(?: *\\n)*/,\n ),\n parse: function (capture, parse, state) {\n var def = capture[1].replace(/\\s+/g, \" \").toLowerCase();\n var target = capture[2];\n var title = capture[3];\n\n // Look for previous links/images using this def\n // If any links/images using this def have already been declared,\n // they will have added themselves to the state._refs[def] list\n // (_ to deconflict with client-defined state). We look through\n // that list of reflinks for this def, and modify those AST nodes\n // with our newly found information now.\n // Sorry :(.\n if (state._refs && state._refs[def]) {\n // `refNode` can be a link or an image\n state._refs[def].forEach(function (refNode: RefNode) {\n refNode.target = target;\n refNode.title = title;\n });\n }\n\n // Add this def to our map of defs for any future links/images\n // In case we haven't found any or all of the refs referring to\n // this def yet, we add our def to the table of known defs, so\n // that future reflinks can modify themselves appropriately with\n // this information.\n state._defs = state._defs || {};\n state._defs[def] = {\n target: target,\n title: title,\n };\n\n // return the relevant parsed information\n // for debugging only.\n return {\n def: def,\n target: target,\n title: title,\n };\n },\n react: function () {\n return null;\n },\n html: function () {\n return \"\";\n },\n },\n table: {\n order: currOrder++,\n match: blockRegex(TABLES.TABLE_REGEX),\n parse: TABLES.parseTable,\n react: function (node, output, state) {\n var getStyle = function (colIndex: number): {\n [attr: string]: Attr,\n } {\n return node.align[colIndex] == null\n ? {}\n : {\n textAlign: node.align[colIndex],\n };\n };\n\n var headers = node.header.map(function (\n content: ASTNode,\n i: number,\n ) {\n return reactElement(\"th\", \"\" + i, {\n style: getStyle(i),\n scope: \"col\",\n children: output(content, state),\n });\n });\n\n var rows = node.cells.map(function (\n row: Array<ASTNode>,\n r: number,\n ) {\n return reactElement(\"tr\", \"\" + r, {\n children: row.map(function (content: ASTNode, c: number) {\n return reactElement(\"td\", \"\" + c, {\n style: getStyle(c),\n children: output(content, state),\n });\n }),\n });\n });\n\n return reactElement(\"table\", state.key, {\n children: [\n reactElement(\"thead\", \"thead\", {\n children: reactElement(\"tr\", null, {\n children: headers,\n }),\n }),\n reactElement(\"tbody\", \"tbody\", {\n children: rows,\n }),\n ],\n });\n },\n html: function (node, output, state) {\n var getStyle = function (colIndex: number): string {\n return node.align[colIndex] == null\n ? \"\"\n : \"text-align:\" + node.align[colIndex] + \";\";\n };\n\n var headers = node.header\n .map(function (content: ASTNode, i: number) {\n return htmlTag(\"th\", output(content, state), {\n style: getStyle(i),\n scope: \"col\",\n });\n })\n .join(\"\");\n\n var rows = node.cells\n .map(function (row: Array<ASTNode>) {\n var cols = row\n .map(function (content: ASTNode, c: number) {\n return htmlTag(\"td\", output(content, state), {\n style: getStyle(c),\n });\n })\n .join(\"\");\n\n return htmlTag(\"tr\", cols);\n })\n .join(\"\");\n\n var thead = htmlTag(\"thead\", htmlTag(\"tr\", headers));\n var tbody = htmlTag(\"tbody\", rows);\n\n return htmlTag(\"table\", thead + tbody);\n },\n },\n newline: {\n order: currOrder++,\n match: blockRegex(/^(?:\\n *)*\\n/),\n parse: ignoreCapture,\n react: function (node, output, state) {\n return \"\\n\";\n },\n html: function (node, output, state) {\n return \"\\n\";\n },\n },\n paragraph: {\n order: currOrder++,\n match: blockRegex(/^((?:[^\\n]|\\n(?! *\\n))+)(?:\\n *)+\\n/),\n parse: parseCaptureInline,\n react: function (node, output, state) {\n return reactElement(\"div\", state.key, {\n className: \"paragraph\",\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n var attributes = {\n class: \"paragraph\",\n };\n return htmlTag(\"div\", output(node.content, state), attributes);\n },\n },\n escape: {\n order: currOrder++,\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: inlineRegex(/^\\\\([^0-9A-Za-z\\s])/),\n parse: function (capture, parse, state) {\n return {\n type: \"text\",\n content: capture[1],\n };\n },\n react: null,\n html: null,\n },\n tableSeparator: {\n order: currOrder++,\n // $FlowFixMe\n match: function (source, state) {\n if (!state.inTable) {\n return null;\n }\n return /^ *\\| */.exec(source);\n },\n parse: function () {\n return {type: \"tableSeparator\"};\n },\n // These shouldn't be reached, but in case they are, be reasonable:\n react: function () {\n return \" | \";\n },\n html: function () {\n return \" | \";\n },\n },\n autolink: {\n order: currOrder++,\n match: inlineRegex(/^<([^: >]+:\\/[^ >]+)>/),\n parse: function (capture, parse, state) {\n return {\n type: \"link\",\n content: [\n {\n type: \"text\",\n content: capture[1],\n },\n ],\n target: capture[1],\n };\n },\n react: null,\n html: null,\n },\n mailto: {\n order: currOrder++,\n match: inlineRegex(/^<([^ >]+@[^ >]+)>/),\n parse: function (capture, parse, state) {\n var address = capture[1];\n var 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 type: \"link\",\n content: [\n {\n type: \"text\",\n content: address,\n },\n ],\n target: target,\n };\n },\n react: null,\n html: null,\n },\n url: {\n order: currOrder++,\n match: inlineRegex(/^(https?:\\/\\/[^\\s<]+[^<.,:;\"')\\]\\s])/),\n parse: function (capture, parse, state) {\n return {\n type: \"link\",\n content: [\n {\n type: \"text\",\n content: capture[1],\n },\n ],\n target: capture[1],\n title: undefined,\n };\n },\n react: null,\n html: null,\n },\n link: {\n order: currOrder++,\n match: inlineRegex(\n new RegExp(\n \"^\\\\[(\" + LINK_INSIDE + \")\\\\]\\\\(\" + LINK_HREF_AND_TITLE + \"\\\\)\",\n ),\n ),\n parse: function (capture, parse, state) {\n var link = {\n content: parse(capture[1], state),\n target: unescapeUrl(capture[2]),\n title: capture[3],\n };\n return link;\n },\n react: function (node, output, state) {\n return reactElement(\"a\", state.key, {\n href: sanitizeUrl(node.target),\n title: node.title,\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n var attributes = {\n href: sanitizeUrl(node.target),\n title: node.title,\n };\n\n return htmlTag(\"a\", output(node.content, state), attributes);\n },\n },\n image: {\n order: currOrder++,\n match: inlineRegex(\n new RegExp(\n \"^!\\\\[(\" +\n LINK_INSIDE +\n \")\\\\]\\\\(\" +\n LINK_HREF_AND_TITLE +\n \"\\\\)\",\n ),\n ),\n parse: function (capture, parse, state) {\n var image = {\n alt: capture[1],\n target: unescapeUrl(capture[2]),\n title: capture[3],\n };\n return image;\n },\n react: function (node, output, state) {\n return reactElement(\"img\", state.key, {\n src: sanitizeUrl(node.target),\n alt: node.alt,\n title: node.title,\n });\n },\n html: function (node, output, state) {\n var attributes = {\n src: sanitizeUrl(node.target),\n alt: node.alt,\n title: node.title,\n };\n\n return htmlTag(\"img\", \"\", attributes, false);\n },\n },\n reflink: {\n order: currOrder++,\n match: inlineRegex(\n new RegExp(\n // The first [part] of the link\n \"^\\\\[(\" +\n LINK_INSIDE +\n \")\\\\]\" +\n // The [ref] target of the link\n \"\\\\s*\\\\[([^\\\\]]*)\\\\]\",\n ),\n ),\n parse: function (capture, parse, state) {\n return parseRef(capture, state, {\n type: \"link\",\n content: parse(capture[1], state),\n });\n },\n react: null,\n html: null,\n },\n refimage: {\n order: currOrder++,\n match: inlineRegex(\n new RegExp(\n // The first [part] of the link\n \"^!\\\\[(\" +\n LINK_INSIDE +\n \")\\\\]\" +\n // The [ref] target of the link\n \"\\\\s*\\\\[([^\\\\]]*)\\\\]\",\n ),\n ),\n parse: function (capture, parse, state) {\n return parseRef(capture, state, {\n type: \"image\",\n alt: capture[1],\n });\n },\n react: null,\n html: null,\n },\n em: {\n order: currOrder /* same as strong/u */,\n match: inlineRegex(\n new RegExp(\n // only match _s surrounding words.\n \"^\\\\b_\" +\n \"((?:__|\\\\\\\\[\\\\s\\\\S]|[^\\\\\\\\_])+?)_\" +\n \"\\\\b\" +\n // Or match *s:\n \"|\" +\n // Only match *s that are followed by a non-space:\n \"^\\\\*(?=\\\\S)(\" +\n // Match at least one of:\n \"(?:\" +\n // - `**`: so that bolds inside italics don't close the\n // italics\n \"\\\\*\\\\*|\" +\n // - escape sequence: so escaped *s don't close us\n \"\\\\\\\\[\\\\s\\\\S]|\" +\n // - whitespace: followed by a non-* (we don't\n // want ' *' to close an italics--it might\n // start a list)\n \"\\\\s+(?:\\\\\\\\[\\\\s\\\\S]|[^\\\\s\\\\*\\\\\\\\]|\\\\*\\\\*)|\" +\n // - non-whitespace, non-*, non-backslash characters\n \"[^\\\\s\\\\*\\\\\\\\]\" +\n \")+?\" +\n // followed by a non-space, non-* then *\n \")\\\\*(?!\\\\*)\",\n ),\n ),\n quality: function (capture) {\n // precedence by length, `em` wins ties:\n return capture[0].length + 0.2;\n },\n parse: function (capture, parse, state) {\n return {\n content: parse(capture[2] || capture[1], state),\n };\n },\n react: function (node, output, state) {\n return reactElement(\"em\", state.key, {\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n return htmlTag(\"em\", output(node.content, state));\n },\n },\n strong: {\n order: currOrder /* same as em */,\n match: inlineRegex(/^\\*\\*((?:\\\\[\\s\\S]|[^\\\\])+?)\\*\\*(?!\\*)/),\n quality: function (capture) {\n // precedence by length, wins ties vs `u`:\n return capture[0].length + 0.1;\n },\n parse: parseCaptureInline,\n react: function (node, output, state) {\n return reactElement(\"strong\", state.key, {\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n return htmlTag(\"strong\", output(node.content, state));\n },\n },\n u: {\n order: currOrder++ /* same as em&strong; increment for next rule */,\n match: inlineRegex(/^__((?:\\\\[\\s\\S]|[^\\\\])+?)__(?!_)/),\n quality: function (capture) {\n // precedence by length, loses all ties\n return capture[0].length;\n },\n parse: parseCaptureInline,\n react: function (node, output, state) {\n return reactElement(\"u\", state.key, {\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n return htmlTag(\"u\", output(node.content, state));\n },\n },\n del: {\n order: currOrder++,\n match: inlineRegex(\n /^~~(?=\\S)((?:\\\\[\\s\\S]|~(?!~)|[^\\s~\\\\]|\\s(?!~~))+?)~~/,\n ),\n parse: parseCaptureInline,\n react: function (node, output, state) {\n return reactElement(\"del\", state.key, {\n children: output(node.content, state),\n });\n },\n html: function (node, output, state) {\n return htmlTag(\"del\", output(node.content, state));\n },\n },\n inlineCode: {\n order: currOrder++,\n match: inlineRegex(/^(`+)([\\s\\S]*?[^`])\\1(?!`)/),\n parse: function (capture, parse, state) {\n return {\n content: capture[2].replace(\n INLINE_CODE_ESCAPE_BACKTICKS_R,\n \"$1\",\n ),\n };\n },\n react: function (node, output, state) {\n return reactElement(\"code\", state.key, {\n children: node.content,\n });\n },\n html: function (node, output, state) {\n return htmlTag(\"code\", sanitizeText(node.content));\n },\n },\n br: {\n order: currOrder++,\n match: anyScopeRegex(/^ {2,}\\n/),\n parse: ignoreCapture,\n react: function (node, output, state) {\n return reactElement(\"br\", state.key, EMPTY_PROPS);\n },\n html: function (node, output, state) {\n return \"<br>\";\n },\n },\n text: {\n order: currOrder++,\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(\n /^[\\s\\S]+?(?=[^0-9A-Za-z\\s\\u00c0-\\uffff]|\\n\\n| {2,}\\n|\\w+:\\S|$)/,\n ),\n parse: function (capture, parse, state) {\n return {\n content: capture[0],\n };\n },\n react: function (node, output, state) {\n return node.content;\n },\n html: function (node, output, state) {\n return sanitizeText(node.content);\n },\n },\n};\n\n/** (deprecated) */\nvar ruleOutput = function (\n // $FlowFixMe\n rules: OutputRules<Rule>,\n property: $Keys<Rule>,\n) {\n if (!property && typeof console !== \"undefined\") {\n console.warn(\n \"simple-markdown ruleOutput should take 'react' or \" +\n \"'html' as the second argument.\",\n );\n }\n\n var nestedRuleOutput = function (\n ast: SingleASTNode,\n outputFunc: Output<any>,\n state: State,\n ) {\n return rules[ast.type][property](ast, outputFunc, state);\n };\n return nestedRuleOutput;\n};\n\n/** (deprecated)\n */\nvar reactFor = function (outputFunc: ReactNodeOutput): ReactOutput {\n var nestedOutput: ReactOutput = function (ast, state) {\n state = state || {};\n if (Array.isArray(ast)) {\n var oldKey = state.key;\n var result: Array<ReactElements> = [];\n\n // map nestedOutput over the ast, except group any text\n // nodes together into a single string output.\n var lastResult = null;\n for (var i = 0; i < ast.length; i++) {\n state.key = \"\" + i;\n var nodeOut = nestedOutput(ast[i], state);\n if (\n typeof nodeOut === \"string\" &&\n typeof lastResult === \"string\"\n ) {\n lastResult = lastResult + nodeOut;\n result[result.length - 1] = lastResult;\n } else {\n result.push(nodeOut);\n lastResult = nodeOut;\n }\n }\n\n state.key = oldKey;\n return result;\n } else {\n return outputFunc(ast, nestedOutput, state);\n }\n };\n return nestedOutput;\n};\n\n/** (deprecated)\n */\nvar htmlFor = function (outputFunc: HtmlNodeOutput): HtmlOutput {\n var nestedOutput: HtmlOutput = function (ast, state) {\n state = state || {};\n if (Array.isArray(ast)) {\n return ast\n .map(function (node) {\n return nestedOutput(node, state);\n })\n .join(\"\");\n } else {\n return outputFunc(ast, nestedOutput, state);\n }\n };\n return nestedOutput;\n};\n\nvar outputFor = function (\n rules: OutputRules<Rule>,\n property: $Keys<Rule>,\n defaultState: ?State = {},\n) {\n if (!property) {\n throw new Error(\n \"simple-markdown: outputFor: `property` must be \" +\n \"defined. \" +\n \"if you just upgraded, you probably need to replace `outputFor` \" +\n \"with `reactFor`\",\n );\n }\n\n var latestState: State;\n // $FlowFixMe[incompatible-type]\n var arrayRule: ArrayRule = rules.Array || defaultRules.Array;\n\n // Tricks to convince tsc that this var is not null:\n var arrayRuleCheck = arrayRule[property];\n if (!arrayRuleCheck) {\n throw new Error(\n \"simple-markdown: outputFor: to join nodes of type `\" +\n property +\n \"` you must provide an `Array:` joiner rule with that type, \" +\n \"Please see the docs for details on specifying an Array rule.\",\n );\n }\n var arrayRuleOutput = arrayRuleCheck;\n\n var nestedOutput: Output<any> = function (ast, state) {\n state = state || latestState;\n latestState = state;\n if (Array.isArray(ast)) {\n return arrayRuleOutput(ast, nestedOutput, state);\n } else {\n return rules[ast.type][property](ast, nestedOutput, state);\n }\n };\n\n var outerOutput: Output<any> = function (ast, state) {\n latestState = populateInitialState(state, defaultState);\n return nestedOutput(ast, latestState);\n };\n return outerOutput;\n};\n\n// $FlowFixMe[incompatible-call]\nvar defaultRawParse = parserFor(defaultRules);\n\nvar defaultBlockParse = function (\n source: string,\n state: ?State,\n): Array<SingleASTNode> {\n state = state || {};\n state.inline = false;\n return defaultRawParse(source, state);\n};\n\nvar defaultInlineParse = function (\n source: string,\n state: ?State,\n): Array<SingleASTNode> {\n state = state || {};\n state.inline = true;\n return defaultRawParse(source, state);\n};\n\nvar defaultImplicitParse = function (\n source: string,\n state: ?State,\n): Array<SingleASTNode> {\n var isBlock = BLOCK_END_R.test(source);\n state = state || {};\n state.inline = !isBlock;\n return defaultRawParse(source, state);\n};\n\n// $FlowFixMe[incompatible-call]\nvar defaultReactOutput: ReactOutput = outputFor(defaultRules, \"react\");\n// $FlowFixMe[incompatible-call]\nvar defaultHtmlOutput: HtmlOutput = outputFor(defaultRules, \"html\");\n\nvar markdownToReact = function (source: string, state: ?State): ReactElements {\n return defaultReactOutput(defaultBlockParse(source, state), state);\n};\n\nvar markdownToHtml = function (source: string, state: ?State): string {\n return defaultHtmlOutput(defaultBlockParse(source, state), state);\n};\n\n// TODO: This needs definition\ntype ReactMarkdownProps = any;\nvar ReactMarkdown = function (props: ReactMarkdownProps): ReactElement {\n var divProps = {};\n\n for (var prop in props) {\n if (\n prop !== \"source\" &&\n // $FlowFixMe\n Object.prototype.hasOwnProperty.call(props, prop)\n ) {\n divProps[prop] = props[prop];\n }\n }\n divProps.children = markdownToReact(props.source);\n\n return reactElement(\"div\", null, divProps);\n};\n\ntype Exports = {\n +defaultRules: DefaultRules,\n +parserFor: (rules: ParserRules, defaultState?: ?State) => Parser,\n +outputFor: <Rule: Object>(\n rules: OutputRules<Rule>,\n param: $Keys<Rule>,\n defaultState?: ?State,\n ) => Output<any>,\n\n +ruleOutput: <Rule: Object>(\n rules: OutputRules<Rule>,\n param: $Keys<Rule>,\n ) => NodeOutput<any>,\n +reactFor: (ReactNodeOutput) => ReactOutput,\n +htmlFor: (HtmlNodeOutput) => HtmlOutput,\n\n +inlineRegex: (regex: RegExp) => MatchFunction,\n +blockRegex: (regex: RegExp) => MatchFunction,\n +anyScopeRegex: (regex: RegExp) => MatchFunction,\n +parseInline: (parse: Parser, content: string, state: State) => ASTNode,\n +parseBlock: (parse: Parser, content: string, state: State) => ASTNode,\n\n +markdownToReact: (source: string, state?: ?State) => ReactElements,\n +markdownToHtml: (source: string, state?: ?State) => string,\n +ReactMarkdown: (props: {source: string, [string]: any}) => ReactElement,\n\n +defaultRawParse: (source: string, state?: ?State) => Array<SingleASTNode>,\n +defaultBlockParse: (\n source: string,\n state?: ?State,\n ) => Array<SingleASTNode>,\n +defaultInlineParse: (\n source: string,\n state?: ?State,\n ) => Array<SingleASTNode>,\n +defaultImplicitParse: (\n source: string,\n state?: ?State,\n ) => Array<SingleASTNode>,\n\n +defaultReactOutput: ReactOutput,\n +defaultHtmlOutput: HtmlOutput,\n\n +preprocess: (source: string) => string,\n +sanitizeText: (text: Attr) => string,\n +sanitizeUrl: (url: ?string) => ?string,\n +unescapeUrl: (url: string) => string,\n +htmlTag: (\n tagName: string,\n content: string,\n attributes: ?{[any]: ?Attr},\n isClosed: ?boolean,\n ) => string,\n +reactElement: (\n type: string,\n key: string | null,\n props: {[string]: any},\n ) => ReactElement,\n};\n\nexport type {\n // Hopefully you shouldn't have to use these, but they're here if you need!\n // Top-level API:\n State,\n Parser,\n Output,\n ReactOutput,\n HtmlOutput,\n // Most of the following types should be considered experimental and\n // subject to change or change names. Again, they shouldn't be necessary,\n // but if they are I'd love to hear how so I can better support them!\n\n // Individual Rule fields:\n Capture,\n MatchFunction,\n ParseFunction,\n NodeOutput,\n ArrayNodeOutput,\n ReactNodeOutput,\n // Single rules:\n ParserRule,\n ReactOutputRule,\n HtmlOutputRule,\n // Sets of rules:\n ParserRules,\n OutputRules,\n Rules,\n ReactRules,\n HtmlRules,\n};\n\n// $FlowFixMe\nvar SimpleMarkdown: Exports = {\n defaultRules: defaultRules,\n parserFor: parserFor,\n outputFor: outputFor,\n\n inlineRegex: inlineRegex,\n blockRegex: blockRegex,\n anyScopeRegex: anyScopeRegex,\n parseInline: parseInline,\n parseBlock: parseBlock,\n\n // default wrappers:\n markdownToReact: markdownToReact,\n markdownToHtml: markdownToHtml,\n ReactMarkdown: ReactMarkdown,\n\n defaultBlockParse: defaultBlockParse,\n defaultInlineParse: defaultInlineParse,\n defaultImplicitParse: defaultImplicitParse,\n\n defaultReactOutput: defaultReactOutput,\n defaultHtmlOutput: defaultHtmlOutput,\n\n preprocess: preprocess,\n sanitizeText: sanitizeText,\n sanitizeUrl: sanitizeUrl,\n unescapeUrl: unescapeUrl,\n htmlTag: htmlTag,\n reactElement: reactElement,\n\n // deprecated:\n defaultRawParse: defaultRawParse,\n ruleOutput: ruleOutput,\n reactFor: reactFor,\n htmlFor: htmlFor,\n\n defaultParse: function () {\n if (typeof console !== \"undefined\") {\n console.warn(\n \"defaultParse is deprecated, please use `defaultImplicitParse`\",\n );\n }\n return defaultImplicitParse.apply(null, (arguments: any));\n },\n defaultOutput: function () {\n if (typeof console !== \"undefined\") {\n console.warn(\n \"defaultOutput is deprecated, please use `defaultReactOutput`\",\n );\n }\n return defaultReactOutput.apply(null, (arguments: any));\n },\n};\n\nexport default SimpleMarkdown;\n"],"names":["TABLE_ROW_SEPARATOR_TRIM","TABLE_CELL_END_TRIM","TABLE_RIGHT_ALIGN","TABLE_CENTER_ALIGN","TABLE_LEFT_ALIGN","parseTableAlignCapture","parseTableRow","parseTable","CR_NEWLINE_R","TAB_R","FORMFEED_R","preprocess","source","replace","populateInitialState","givenState","defaultState","state","prop","Object","prototype","hasOwnProperty","call","parserFor","rules","latestState","ruleList","keys","filter","type","rule","match","order","isFinite","console","warn","String","sort","typeA","typeB","ruleA","ruleB","orderA","orderB","secondaryOrderA","quality","secondaryOrderB","nestedParse","result","ruleType","capture","NaN","i","currRuleType","currRule","currOrder","prevCaptureStr","prevCapture","currCapture","currQuality","Error","length","index","parsed","parse","Array","isArray","push","apply","substring","inline","disableAutoBlockNewlines","inlineRegex","regex","exec","blockRegex","anyScopeRegex","TYPE_SYMBOL","Symbol","for","reactElement","key","props","$$typeof","undefined","ref","_owner","htmlTag","tagName","content","attributes","isClosed","attributeString","attr","attribute","sanitizeText","unclosedTag","EMPTY_PROPS","sanitizeUrl","url","prot","URL","protocol","indexOf","e","SANITIZE_TEXT_R","SANITIZE_TEXT_CODES","text","chr","UNESCAPE_URL_R","unescapeUrl","rawUrlString","parseInline","isCurrentlyInline","parseCaptureInline","ignoreCapture","LIST_ITEM_PREFIX_R","RegExp","LIST_ITEM_R","LIST_ITEM_PREFIX","BLOCK_END_R","INLINE_CODE_ESCAPE_BACKTICKS_R","LIST_BLOCK_END_R","LIST_ITEM_END_R","LIST_R","LIST_LOOKBEHIND_R","TABLES","alignCapture","test","trimEndSeparators","prevInTable","inTable","tableRow","trim","cells","forEach","node","header","align","split","map","parseTableAlign","rowText","parseTableCells","parseNpTable","TABLE_REGEX","NPTABLE_REGEX","LINK_INSIDE","LINK_HREF_AND_TITLE","AUTOLINK_MAILTO_CHECK_R","parseRef","refNode","toLowerCase","_defs","def","target","title","_refs","defaultRules","react","arr","output","oldKey","html","heading","level","children","nptable","lheading","hr","codeBlock","lang","className","class","fence","blockQuote","list","isStartOfLineCapture","isListBlock","_list","bullet","ordered","start","items","lastItemWasAParagraph","item","prefixCapture","space","spaceRegex","isLastItem","thisItemIsAParagraph","adjustedContent","oldStateInline","oldStateList","ListWrapper","listItems","join","listTag","table","getStyle","colIndex","textAlign","headers","style","scope","rows","row","r","c","cols","thead","tbody","newline","paragraph","escape","tableSeparator","autolink","mailto","address","link","href","image","alt","src","reflink","refimage","em","strong","u","del","inlineCode","br","outputFor","property","arrayRule","arrayRuleCheck","arrayRuleOutput","nestedOutput","ast","outerOutput","defaultRawParse","defaultBlockParse","defaultImplicitParse","isBlock","defaultReactOutput","defaultHtmlOutput","markdownToReact","SimpleMarkdown","parseBlock","markdownToHtml","ReactMarkdown","divProps","defaultInlineParse","ruleOutput","outputFunc","reactFor","lastResult","nodeOut","htmlFor","defaultParse","arguments","defaultOutput"],"mappings":"aA4NA,IA2dQA,EACAC,EACAC,EACAC,EACAC,EAKAC,EA2BAC,EAiEAC,EAhkBJC,EAAe,SACfC,EAAQ,MACRC,EAAa,MAKbC,EAAa,SAAUC,GACvB,OAAOA,EACFC,QAAQL,EAAc,MACtBK,QAAQH,EAAY,IACpBG,QAAQJ,EAAO,SAGpBK,EAAuB,SACvBC,EACAC,GAEA,IAAIC,EAAeF,GAAc,GAC7BC,GAAgB,MAAhBA,EACA,IAAK,IAAIE,KAAQF,EAETG,OAAOC,UAAUC,eAAeC,KAAKN,EAAcE,KACnDD,EAAMC,GAAQF,EAAaE,IAIvC,OAAOD,GAsBPM,EAAY,SAAUC,EAAoBR,GAG1C,IAiDIS,EAjDAC,EAAWP,OAAOQ,KAAKH,GAAOI,QAAO,SAAUC,GAC/C,IAAIC,EAAON,EAAMK,GACbC,GAAQ,MAARA,GAA8B,MAAdA,EAAKC,MACrB,OAAO,EAEX,IAAIC,EAAQF,EAAKE,MAYjB,MAVsB,iBAAVA,GAAuBC,SAASD,IACrB,oBAAZE,SAEPA,QAAQC,KACJ,4CACIN,EACA,MACAO,OAAOJ,KAGZ,KAGXN,EAASW,MAAK,SAAUC,EAAOC,GAC3B,IAAIC,EAAqBhB,EAAMc,GAC3BG,EAAqBjB,EAAMe,GAC3BG,EAASF,EAAMR,MACfW,EAASF,EAAMT,MAGfU,GAAAA,IAAWC,EACJD,OAAAA,EAASC,EAGhBC,IAAAA,EAAkBJ,EAAMK,QAAU,EAAI,EACtCC,EAAkBL,EAAMI,QAAU,EAAI,EAEtCD,OAAAA,IAAoBE,EACbF,EAAkBE,EAGlBR,EAAQC,GACP,EACDD,EAAQC,EACR,EAIA,KAKf,IAAIQ,EAAc,SAAUnC,EAAgBK,GACpC+B,IAAAA,EAA+B,GAGnC,IADAvB,EADAR,EAAQA,GAASQ,EAEVb,GAAQ,CAEPqC,IAAAA,EAAW,KACXnB,EAAO,KACPoB,EAAU,KACVL,EAAUM,IAGVC,EAAI,EACJC,EAAe3B,EAAS,GAGxB4B,EAAuB9B,EAAM6B,GAE9B,EAAA,CACC,IAAIE,EAAYD,EAAStB,MACrBwB,EACqB,MAArBvC,EAAMwC,YAAsB,GAAKxC,EAAMwC,YAAY,GACnDC,EAAcJ,EAASvB,MAAMnB,EAAQK,EAAOuC,GAEhD,GAAIE,EAAa,CACb,IAAIC,EAAcL,EAAST,QACrBS,EAAST,QAAQa,EAAazC,EAAOuC,GACrC,EAIAG,GAAed,IACjBI,EAAWI,EACXvB,EAAOwB,EACPJ,EAAUQ,EACVb,EAAUc,GAMlBP,IACAC,EAAe3B,EAAS0B,GAExBE,EAAW9B,EAAM6B,SAGjBC,KAEEJ,GAOGI,EAAStB,QAAUuB,GAAaD,EAAST,UAIlD,GAAY,MAARf,GAA2B,MAAXoB,EACV,MAAA,IAAIU,MACN,wKAIIlC,EAASA,EAASmC,OAAS,GAC3B,mDACAjD,GAGRsC,GAAAA,EAAQY,MAER,MAAM,IAAIF,MACN,+HAOR,IAAIG,EAASjC,EAAKkC,MAAMd,EAASH,EAAa9B,GAK1CgD,MAAMC,QAAQH,GAEdE,MAAM7C,UAAU+C,KAAKC,MAAMpB,EAAQe,IAMhB,MAAfA,EAAOlC,OAEPkC,EAAOlC,KAAOoB,GAElBD,EAAOmB,KAAKJ,IAGhB9C,EAAMwC,YAAcP,EACpBtC,EAASA,EAAOyD,UAAUpD,EAAMwC,YAAY,GAAGI,QAInD,OAAOb,GAkBX,OAfiB,SAAUpC,EAAgBK,GAWhC8B,OAVPtB,EAAcX,EAAqBG,EAAOD,IACzBsD,QAAW7C,EAAY8C,2BACpC3D,GAAkB,QAOtBa,EAAYgC,YAAc,KACnBV,EAAYpC,EAAWC,GAASa,KAQ3C+C,EAAc,SAAUC,GACpB1C,IAAAA,EAAQ,SACRnB,EACAK,EACAwC,GAEIxC,OAAAA,EAAMqD,OAECG,EAAMC,KAAK9D,GAEX,MAKf,OAFAmB,EAAM0C,MAAQA,EAEP1C,GAIP4C,EAAa,SAAUF,GAEvB,IAAI1C,EAAuB,SAAUnB,EAAQK,GACrCA,OAAAA,EAAMqD,OACC,KAEAG,EAAMC,KAAK9D,IAI1B,OADAmB,EAAM0C,MAAQA,EACP1C,GAIP6C,EAAgB,SAAUH,GAE1B,IAAI1C,EAAuB,SAAUnB,EAAQK,GACzC,OAAOwD,EAAMC,KAAK9D,IAGtB,OADAmB,EAAM0C,MAAQA,EACP1C,GAGP8C,EACmB,mBAAXC,QACJA,OAAOC,KACPD,OAAOC,IAAI,kBACf,MAEAC,EAAe,SACfnD,EACAoD,EACAC,GAUA,MAR6B,CACzBC,SAAUN,EACVhD,KAAMA,EACNoD,IAAY,MAAPA,OAAcG,EAAYH,EAC/BI,IAAK,KACLH,MAAOA,EACPI,OAAQ,OAaZC,EAAU,SACVC,EACAC,EACAC,EACAC,GAEAD,EAAaA,GAAc,GAC3BC,OAA+B,IAAbA,GAA2BA,EAEzCC,IAAAA,EAAkB,GACtB,IAAK,IAAIC,KAAQH,EAAY,CACzB,IAAII,EAAYJ,EAAWG,GAIvB1E,OAAOC,UAAUC,eAAeC,KAAKoE,EAAYG,IACjDC,IAEAF,GACI,IAAMG,EAAaF,GAAQ,KAAOE,EAAaD,GAAa,KAIxE,IAAIE,EAAc,IAAMR,EAAUI,EAAkB,IAEpD,OAAID,EACOK,EAAcP,EAAU,KAAOD,EAAU,IAEzCQ,GAIXC,EAAc,GAMdC,EAAc,SAAUC,GACpBA,GAAO,MAAPA,EACA,OAAO,KAEP,IACIC,IAAAA,EAAO,IAAIC,IAAIF,EAAK,qBAAqBG,SAEzCF,GAAgC,IAAhCA,EAAKG,QAAQ,gBACiB,IAA9BH,EAAKG,QAAQ,cACa,IAA1BH,EAAKG,QAAQ,SAEb,OAAO,KAEb,MAAOC,GAGL,OAAO,KAEX,OAAOL,GAGPM,EAAkB,WAClBC,EAAsB,CACtB,IAAK,OACL,IAAK,OACL,IAAK,QACL,IAAK,SACL,IAAK,SACL,IAAK,SACA,IAAA,SAGLX,EAAe,SAAUY,GAClBvE,OAAAA,OAAOuE,GAAM9F,QAAQ4F,GAAiB,SAAUG,GAC5CF,OAAAA,EAAoBE,OAI/BC,EAAiB,sBAEjBC,EAAc,SAAUC,GACxB,OAAOA,EAAalG,QAAQgG,EAAgB,OAQ5CG,EAAc,SACdhD,EACAyB,EACAxE,GAEA,IAAIgG,EAAoBhG,EAAMqD,SAAU,EACxCrD,EAAMqD,QAAS,EACf,IAAItB,EAASgB,EAAMyB,EAASxE,GAE5B,OADAA,EAAMqD,OAAS2C,EACRjE,GAePkE,EAAqB,SACrBhE,EACAc,EACA/C,GAEO,MAAA,CACHwE,QAASuB,EAAYhD,EAAOd,EAAQ,GAAIjC,KAI5CkG,EAAgB,WAChB,MAAO,IAQPC,EAAqB,IAAIC,OAAO,8BAQhCC,EAAc,IAAID,OAClBE,iFAKA,MAEAC,EAAc,UACdC,EAAiC,qBAGjCC,EAAmBF,EACnBG,EAAkB,SAGlBC,EAAS,IAAIP,OACb,4FAWAQ,EAAoB,gBAEpBC,GAKI9H,EAA2B,mBAC3BC,EAAsB,MACtBC,EAAoB,YACpBC,EAAqB,aACrBC,EAAmB,YAKnBC,EAAyB,SACzB0H,GAEA,OAAI7H,EAAkB8H,KAAKD,GAChB,QACA5H,EAAmB6H,KAAKD,GACxB,SACA3H,EAAiB4H,KAAKD,GACtB,OAEA,MAiBXzH,EAAgB,SAChBM,EACAoD,EACA/C,EACAgH,GAEA,IAAIC,EAAcjH,EAAMkH,QACxBlH,EAAMkH,SAAU,EACZC,IAAAA,EAAWpE,EAAMpD,EAAOyH,OAAQpH,GACpCA,EAAMkH,QAAUD,EAEhB,IAAII,EAAQ,CAAC,IA0Bb,OAzBAF,EAASG,SAAQ,SAAUC,EAAMpF,GACX,mBAAdoF,EAAK3G,OAGAoG,GACM,IAAN7E,GAAWA,IAAMgF,EAASvE,OAAS,IAGpCyE,EAAMnE,KAAK,KAIG,SAAdqE,EAAK3G,MACe,MAAnBuG,EAAShF,EAAI,IACe,mBAAzBgF,EAAShF,EAAI,GAAGvB,OAEpB2G,EAAK/C,QAAU+C,EAAK/C,QAAQ5E,QACxBZ,EACA,KAGRqI,EAAMA,EAAMzE,OAAS,GAAGM,KAAKqE,OAI9BF,GA4DJ,CACH/H,YAjCAA,EAAa,SAAU0H,GACvB,OAAO,SAAU/E,EAASc,EAAO/C,GAC7BA,EAAMqD,QAAS,EACf,IAAImE,EAASnI,EACT4C,EAAQ,GACRc,EACA/C,EACAgH,GAEAS,EAvFU,SAClB9H,EACAoD,EACA/C,EACAgH,GAMA,OAJIA,IACArH,EAASA,EAAOC,QAAQb,EAA0B,KAEtCY,EAAOyH,OAAOM,MAAM,KACnBC,IAAIvI,GA6ELwI,CACR3F,EAAQ,GACRc,EACA/C,EACAgH,GAEAK,EAjCU,SAClB1H,EACAoD,EACA/C,EACAgH,GAIA,OAFerH,EAAOyH,OAAOM,MAAM,MAEnBC,KAAI,SAAUE,GAEnBxI,OAAAA,EAAcwI,EAAS9E,EAAO/C,EAAOgH,MAuBhCc,CACR7F,EAAQ,GACRc,EACA/C,EACAgH,GAIG,OAFPhH,EAAMqD,QAAS,EAER,CACHzC,KAAM,QACN4G,OAAQA,EACRC,MAAOA,EACPJ,MAAOA,OAMQ,GACvBU,aAAczI,GAAW,GACzB0I,YACI,4DACJC,cACI,kEAIRC,EAAc,iDACdC,EACA,kFACAC,EAA0B,WAE1BC,EAAW,SACXpG,EACAjC,EACAsI,GAEIlE,IAAAA,GAAOnC,EAAQ,IAAMA,EAAQ,IAAIrC,QAAQ,OAAQ,KAAK2I,cAOtDvI,GAAAA,EAAMwI,OAASxI,EAAMwI,MAAMpE,GAAM,CAC7BqE,IAAAA,EAAMzI,EAAMwI,MAAMpE,GAGtBkE,EAAQI,OAASD,EAAIC,OACrBJ,EAAQK,MAAQF,EAAIE,MAaxB,OAJA3I,EAAM4I,MAAQ5I,EAAM4I,OAAS,GAC7B5I,EAAM4I,MAAMxE,GAAOpE,EAAM4I,MAAMxE,IAAQ,GACvCpE,EAAM4I,MAAMxE,GAAKlB,KAAKoF,GAEfA,GAGPhG,EAAY,EAEZuG,EAA6B,CAC7B7F,MAAO,CACH8F,MAAO,SAAUC,EAAKC,EAAQhJ,GAM1B,IALA,IAAIiJ,EAASjJ,EAAMgE,IACfjC,EAA+B,GAI1BI,EAAI,EAAG6B,EAAM,EAAG7B,EAAI4G,EAAInG,OAAQT,IAAK6B,IAAO,CAIjDhE,EAAMgE,IAAM,GAAK7B,EAEjB,IAAIoF,EAAOwB,EAAI5G,GACf,GAAkB,SAAdoF,EAAK3G,KAIDuB,IAHJoF,EAAO,CAAC3G,KAAM,OAAQ4D,QAAS+C,EAAK/C,SAGhCrC,EAAI,EAAI4G,EAAInG,QAA8B,SAApBmG,EAAI5G,EAAI,GAAGvB,KACjCuB,IAEAoF,EAAK/C,SAAWuE,EAAI5G,EAAI,GAAGqC,QAInCzC,EAAOmB,KAAK8F,EAAOzB,EAAMvH,IAI7B,OADAA,EAAMgE,IAAMiF,EACLlH,GAEXmH,KAAM,SAAUH,EAAKC,EAAQhJ,GAKzB,IAJA,IAAI+B,EAAS,GAIJI,EAAI,EAAYA,EAAI4G,EAAInG,OAAQT,IAAK,CAC1C,IAAIoF,EAAOwB,EAAI5G,GACf,GAAkB,SAAdoF,EAAK3G,KAIDuB,IAHJoF,EAAO,CAAC3G,KAAM,OAAQ4D,QAAS+C,EAAK/C,SAGhCrC,EAAI,EAAI4G,EAAInG,QAA8B,SAApBmG,EAAI5G,EAAI,GAAGvB,KACjCuB,IAEAoF,EAAK/C,SAAWuE,EAAI5G,EAAI,GAAGqC,QAInCzC,GAAUiH,EAAOzB,EAAMvH,GAE3B,OAAO+B,IAGfoH,QAAS,CACLpI,MAAOuB,IACPxB,MAAO4C,EAAW,uCAClBX,MAAO,SAAUd,EAASc,EAAO/C,GACtB,MAAA,CACHoJ,MAAOnH,EAAQ,GAAGW,OAClB4B,QAASuB,EAAYhD,EAAOd,EAAQ,GAAGmF,OAAQpH,KAGvD8I,MAAO,SAAUvB,EAAMyB,EAAQhJ,GACpB+D,OAAAA,EAAa,IAAMwD,EAAK6B,MAAOpJ,EAAMgE,IAAK,CAC7CqF,SAAUL,EAAOzB,EAAK/C,QAASxE,MAGvCkJ,KAAM,SAAU3B,EAAMyB,EAAQhJ,GAC1B,OAAOsE,EAAQ,IAAMiD,EAAK6B,MAAOJ,EAAOzB,EAAK/C,QAASxE,MAG9DsJ,QAAS,CACLvI,MAAOuB,IACPxB,MAAO4C,EAAWmD,EAAOoB,eACzBlF,MAAO8D,EAAOkB,aACde,MAAO,KACPI,KAAM,MAEVK,SAAU,CACNxI,MAAOuB,IACPxB,MAAO4C,EAAW,uCAClBX,MAAO,SAAUd,EAASc,EAAO/C,GACtB,MAAA,CACHY,KAAM,UACNwI,MAAsB,MAAfnH,EAAQ,GAAa,EAAI,EAChCuC,QAASuB,EAAYhD,EAAOd,EAAQ,GAAIjC,KAGhD8I,MAAO,KACPI,KAAM,MAEVM,GAAI,CACAzI,MAAOuB,IACPxB,MAAO4C,EAAW,+BAClBX,MAAOmD,EACP4C,MAAO,SAAUvB,EAAMyB,EAAQhJ,GACpB+D,OAAAA,EAAa,KAAM/D,EAAMgE,IAAKgB,IAEzCkE,KAAM,SAAU3B,EAAMyB,EAAQhJ,GAC1B,MAAO,SAGfyJ,UAAW,CACP1I,MAAOuB,IACPxB,MAAO4C,EAAW,kCAClBX,MAAO,SAAUd,EAASc,EAAO/C,GAEtB,MAAA,CACH0J,UAAMvF,EACNK,QAHUvC,EAAQ,GAAGrC,QAAQ,UAAW,IAAIA,QAAQ,OAAQ,MAMpEkJ,MAAO,SAAUvB,EAAMyB,EAAQhJ,GACvB2J,IAAAA,EAAYpC,EAAKmC,KACf,iBAAmBnC,EAAKmC,UACxBvF,EAEN,OAAOJ,EAAa,MAAO/D,EAAMgE,IAAK,CAClCqF,SAAUtF,EAAa,OAAQ,KAAM,CACjC4F,UAAWA,EACXN,SAAU9B,EAAK/C,aAI3B0E,KAAM,SAAU3B,EAAMyB,EAAQhJ,GACtB2J,IAAAA,EAAYpC,EAAKmC,KACf,iBAAmBnC,EAAKmC,UACxBvF,EAEFsF,EAAYnF,EAAQ,OAAQQ,EAAayC,EAAK/C,SAAU,CACxDoF,MAAOD,IAEX,OAAOrF,EAAQ,MAAOmF,KAG9BI,MAAO,CACH9I,MAAOuB,IACPxB,MAAO4C,EACH,gEAEJX,MAAO,SAAUd,EAASc,EAAO/C,GACtB,MAAA,CACHY,KAAM,YACN8I,KAAMzH,EAAQ,SAAMkC,EACpBK,QAASvC,EAAQ,KAGzB6G,MAAO,KACPI,KAAM,MAEVY,WAAY,CACR/I,MAAOuB,IACPxB,MAAO4C,EAAW,qCAClBX,MAAO,SAAUd,EAASc,EAAO/C,GAEtB,MAAA,CACHwE,QAASzB,EAFCd,EAAQ,GAAGrC,QAAQ,WAAY,IAEjBI,KAGhC8I,MAAO,SAAUvB,EAAMyB,EAAQhJ,GAC3B,OAAO+D,EAAa,aAAc/D,EAAMgE,IAAK,CACzCqF,SAAUL,EAAOzB,EAAK/C,QAASxE,MAGvCkJ,KAAM,SAAU3B,EAAMyB,EAAQhJ,GAC1B,OAAOsE,EAAQ,aAAc0E,EAAOzB,EAAK/C,QAASxE,MAG1D+J,KAAM,CACFhJ,MAAOuB,IAEPxB,MAAO,SAAUnB,EAAQK,GASrB,IAAIuC,EACqB,MAArBvC,EAAMwC,YAAsB,GAAKxC,EAAMwC,YAAY,GACnDwH,EAAuBpD,EAAkBnD,KAAKlB,GAC9C0H,EAAcjK,EAAMkK,QAAUlK,EAAMqD,OAEpC2G,OAAAA,GAAwBC,GACxBtK,EAASqK,EAAqB,GAAKrK,EAC5BgH,EAAOlD,KAAK9D,IAEZ,MAGfoD,MAAO,SAAUd,EAASc,EAAO/C,GAC7B,IAAImK,EAASlI,EAAQ,GACjBmI,EAAUD,EAAOvH,OAAS,EAC1ByH,EAAQD,GAAWD,OAAShG,EAC5BmG,EAAuBrI,EAAQ,GAC9BrC,QAAQ6G,EAAkB,MAC1B3F,MAAMuF,GAKPkE,GAAwB,EAgErB,MAAA,CACHH,QAASA,EACTC,MAAOA,EACPC,MAlEcA,EAAM3C,KAAI,SAAU6C,EAAcrI,GAEhD,IAAIsI,EAAgBtE,EAAmB1C,KAAK+G,GACxCE,EAAQD,EAAgBA,EAAc,GAAG7H,OAAS,EAGlD+H,EAAa,IAAIvE,OAAO,QAAUsE,EAAQ,IAAK,MAG/ClG,EAAUgG,EAET5K,QAAQ+K,EAAY,IAEpB/K,QAAQuG,EAAoB,IAW7ByE,EAAazI,IAAMmI,EAAM1H,OAAS,EASlCiI,GAR8C,IAA7BrG,EAAQc,QAAQ,SASdsF,GAAcL,EACrCA,EAAwBM,EAKxB,IAMIC,EANAC,EAAiB/K,EAAMqD,OACvB2H,EAAehL,EAAMkK,MACzBlK,EAAMkK,OAAQ,EAKVW,GACA7K,EAAMqD,QAAS,EACfyH,EAAkBtG,EAAQ5E,QAAQ8G,EAAiB,UAEnD1G,EAAMqD,QAAS,EACfyH,EAAkBtG,EAAQ5E,QAAQ8G,EAAiB,KAGnD3E,IAAAA,EAASgB,EAAM+H,EAAiB9K,GAKpC,OAFAA,EAAMqD,OAAS0H,EACf/K,EAAMkK,MAAQc,EACPjJ,OASf+G,MAAO,SAAUvB,EAAMyB,EAAQhJ,GACvBiL,IAAAA,EAAc1D,EAAK6C,QAAU,KAAO,KAExC,OAAOrG,EAAakH,EAAajL,EAAMgE,IAAK,CACxCqG,MAAO9C,EAAK8C,MACZhB,SAAU9B,EAAK+C,MAAM3C,KAAI,SAAU6C,EAAerI,GAC9C,OAAO4B,EAAa,KAAM,GAAK5B,EAAG,CAC9BkH,SAAUL,EAAOwB,EAAMxK,WAKvCkJ,KAAM,SAAU3B,EAAMyB,EAAQhJ,GACtBkL,IAAAA,EAAY3D,EAAK+C,MAChB3C,KAAI,SAAU6C,GACJlG,OAAAA,EAAQ,KAAM0E,EAAOwB,EAAMxK,OAErCmL,KAAK,IAENC,EAAU7D,EAAK6C,QAAU,KAAO,KAChC3F,EAAa,CACb4F,MAAO9C,EAAK8C,OAEhB,OAAO/F,EAAQ8G,EAASF,EAAWzG,KAG3CgE,IAAK,CACD1H,MAAOuB,IAIPxB,MAAO4C,EACH,uEAEJX,MAAO,SAAUd,EAASc,EAAO/C,GAC7B,IAAIyI,EAAMxG,EAAQ,GAAGrC,QAAQ,OAAQ,KAAK2I,cACtCG,EAASzG,EAAQ,GACjB0G,EAAQ1G,EAAQ,GA8Bb,OArBHjC,EAAM4I,OAAS5I,EAAM4I,MAAMH,IAE3BzI,EAAM4I,MAAMH,GAAKnB,SAAQ,SAAUgB,GAC/BA,EAAQI,OAASA,EACjBJ,EAAQK,MAAQA,KASxB3I,EAAMwI,MAAQxI,EAAMwI,OAAS,GAC7BxI,EAAMwI,MAAMC,GAAO,CACfC,OAAQA,EACRC,MAAOA,GAKJ,CACHF,IAAKA,EACLC,OAAQA,EACRC,MAAOA,IAGfG,MAAO,WACH,OAAO,MAEXI,KAAM,WACF,MAAO,KAGfmC,MAAO,CACHtK,MAAOuB,IACPxB,MAAO4C,EAAWmD,EAAOmB,aACzBjF,MAAO8D,EAAOvH,WACdwJ,MAAO,SAAUvB,EAAMyB,EAAQhJ,GAC3B,IAAIsL,EAAW,SAAUC,GAGdhE,OAAwB,MAAxBA,EAAKE,MAAM8D,GACZ,GACA,CACIC,UAAWjE,EAAKE,MAAM8D,KAIhCE,EAAUlE,EAAKC,OAAOG,KAAI,SAC1BnD,EACArC,GAEA,OAAO4B,EAAa,KAAM,GAAK5B,EAAG,CAC9BuJ,MAAOJ,EAASnJ,GAChBwJ,MAAO,MACPtC,SAAUL,EAAOxE,EAASxE,QAI9B4L,EAAOrE,EAAKF,MAAMM,KAAI,SACtBkE,EACAC,GAEA,OAAO/H,EAAa,KAAM,GAAK+H,EAAG,CAC9BzC,SAAUwC,EAAIlE,KAAI,SAAUnD,EAAkBuH,GAC1C,OAAOhI,EAAa,KAAM,GAAKgI,EAAG,CAC9BL,MAAOJ,EAASS,GAChB1C,SAAUL,EAAOxE,EAASxE,aAM1C,OAAO+D,EAAa,QAAS/D,EAAMgE,IAAK,CACpCqF,SAAU,CACNtF,EAAa,QAAS,QAAS,CAC3BsF,SAAUtF,EAAa,KAAM,KAAM,CAC/BsF,SAAUoC,MAGlB1H,EAAa,QAAS,QAAS,CAC3BsF,SAAUuC,QAK1B1C,KAAM,SAAU3B,EAAMyB,EAAQhJ,GAC1B,IAAIsL,EAAW,SAAUC,GACrB,OAA+B,MAAxBhE,EAAKE,MAAM8D,GACZ,GACA,cAAgBhE,EAAKE,MAAM8D,GAAY,KAG7CE,EAAUlE,EAAKC,OACdG,KAAI,SAAUnD,EAAkBrC,GACtBmC,OAAAA,EAAQ,KAAM0E,EAAOxE,EAASxE,GAAQ,CACzC0L,MAAOJ,EAASnJ,GAChBwJ,MAAO,WAGdR,KAAK,IAENS,EAAOrE,EAAKF,MACXM,KAAI,SAAUkE,GACPG,IAAAA,EAAOH,EACNlE,KAAI,SAAUnD,EAAkBuH,GACtBzH,OAAAA,EAAQ,KAAM0E,EAAOxE,EAASxE,GAAQ,CACzC0L,MAAOJ,EAASS,QAGvBZ,KAAK,IAEV,OAAO7G,EAAQ,KAAM0H,MAExBb,KAAK,IAENc,EAAQ3H,EAAQ,QAASA,EAAQ,KAAMmH,IACvCS,EAAQ5H,EAAQ,QAASsH,GAE7B,OAAOtH,EAAQ,QAAS2H,EAAQC,KAGxCC,QAAS,CACLpL,MAAOuB,IACPxB,MAAO4C,EAAW,gBAClBX,MAAOmD,EACP4C,MAAO,SAAUvB,EAAMyB,EAAQhJ,GAC3B,MAAO,MAEXkJ,KAAM,SAAU3B,EAAMyB,EAAQhJ,GAC1B,MAAO,OAGfoM,UAAW,CACPrL,MAAOuB,IACPxB,MAAO4C,EAAW,uCAClBX,MAAOkD,EACP6C,MAAO,SAAUvB,EAAMyB,EAAQhJ,GAC3B,OAAO+D,EAAa,MAAO/D,EAAMgE,IAAK,CAClC2F,UAAW,YACXN,SAAUL,EAAOzB,EAAK/C,QAASxE,MAGvCkJ,KAAM,SAAU3B,EAAMyB,EAAQhJ,GAI1B,OAAOsE,EAAQ,MAAO0E,EAAOzB,EAAK/C,QAASxE,GAH1B,CACb4J,MAAO,gBAKnByC,OAAQ,CACJtL,MAAOuB,IAKPxB,MAAOyC,EAAY,uBACnBR,MAAO,SAAUd,EAASc,EAAO/C,GACtB,MAAA,CACHY,KAAM,OACN4D,QAASvC,EAAQ,KAGzB6G,MAAO,KACPI,KAAM,MAEVoD,eAAgB,CACZvL,MAAOuB,IAEPxB,MAAO,SAAUnB,EAAQK,GACrB,OAAKA,EAAMkH,QAGJ,UAAUzD,KAAK9D,GAFX,MAIfoD,MAAO,WACI,MAAA,CAACnC,KAAM,mBAGlBkI,MAAO,WACH,MAAO,OAEXI,KAAM,WACF,MAAO,aAGfqD,SAAU,CACNxL,MAAOuB,IACPxB,MAAOyC,EAAY,yBACnBR,MAAO,SAAUd,EAASc,EAAO/C,GACtB,MAAA,CACHY,KAAM,OACN4D,QAAS,CACL,CACI5D,KAAM,OACN4D,QAASvC,EAAQ,KAGzByG,OAAQzG,EAAQ,KAGxB6G,MAAO,KACPI,KAAM,MAEVsD,OAAQ,CACJzL,MAAOuB,IACPxB,MAAOyC,EAAY,sBACnBR,MAAO,SAAUd,EAASc,EAAO/C,GAC7B,IAAIyM,EAAUxK,EAAQ,GAClByG,EAASzG,EAAQ,GAOd,OAJFmG,EAAwBrB,KAAK2B,KAC9BA,EAAS,UAAYA,GAGlB,CACH9H,KAAM,OACN4D,QAAS,CACL,CACI5D,KAAM,OACN4D,QAASiI,IAGjB/D,OAAQA,IAGhBI,MAAO,KACPI,KAAM,MAEVhE,IAAK,CACDnE,MAAOuB,IACPxB,MAAOyC,EAAY,wCACnBR,MAAO,SAAUd,EAASc,EAAO/C,GACtB,MAAA,CACHY,KAAM,OACN4D,QAAS,CACL,CACI5D,KAAM,OACN4D,QAASvC,EAAQ,KAGzByG,OAAQzG,EAAQ,GAChB0G,WAAOxE,IAGf2E,MAAO,KACPI,KAAM,MAEVwD,KAAM,CACF3L,MAAOuB,IACPxB,MAAOyC,EACH,IAAI6C,OACA,QAAU8B,EAAc,UAAYC,EAAsB,QAGlEpF,MAAO,SAAUd,EAASc,EAAO/C,GAM7B,MALW,CACPwE,QAASzB,EAAMd,EAAQ,GAAIjC,GAC3B0I,OAAQ7C,EAAY5D,EAAQ,IAC5B0G,MAAO1G,EAAQ,KAIvB6G,MAAO,SAAUvB,EAAMyB,EAAQhJ,GAC3B,OAAO+D,EAAa,IAAK/D,EAAMgE,IAAK,CAChC2I,KAAM1H,EAAYsC,EAAKmB,QACvBC,MAAOpB,EAAKoB,MACZU,SAAUL,EAAOzB,EAAK/C,QAASxE,MAGvCkJ,KAAM,SAAU3B,EAAMyB,EAAQhJ,GAC1B,IAAIyE,EAAa,CACbkI,KAAM1H,EAAYsC,EAAKmB,QACvBC,MAAOpB,EAAKoB,OAGhB,OAAOrE,EAAQ,IAAK0E,EAAOzB,EAAK/C,QAASxE,GAAQyE,KAGzDmI,MAAO,CACH7L,MAAOuB,IACPxB,MAAOyC,EACH,IAAI6C,OACA,SACI8B,EACA,UACAC,EACA,QAGZpF,MAAO,SAAUd,EAASc,EAAO/C,GAM7B,MALY,CACR6M,IAAK5K,EAAQ,GACbyG,OAAQ7C,EAAY5D,EAAQ,IAC5B0G,MAAO1G,EAAQ,KAIvB6G,MAAO,SAAUvB,EAAMyB,EAAQhJ,GAC3B,OAAO+D,EAAa,MAAO/D,EAAMgE,IAAK,CAClC8I,IAAK7H,EAAYsC,EAAKmB,QACtBmE,IAAKtF,EAAKsF,IACVlE,MAAOpB,EAAKoB,SAGpBO,KAAM,SAAU3B,EAAMyB,EAAQhJ,GAC1B,IAAIyE,EAAa,CACbqI,IAAK7H,EAAYsC,EAAKmB,QACtBmE,IAAKtF,EAAKsF,IACVlE,MAAOpB,EAAKoB,OAGTrE,OAAAA,EAAQ,MAAO,GAAIG,GAAY,KAG9CsI,QAAS,CACLhM,MAAOuB,IACPxB,MAAOyC,EACH,IAAI6C,OAGI8B,QAAAA,EAAAA,4BAMZnF,MAAO,SAAUd,EAASc,EAAO/C,GAC7B,OAAOqI,EAASpG,EAASjC,EAAO,CAC5BY,KAAM,OACN4D,QAASzB,EAAMd,EAAQ,GAAIjC,MAGnC8I,MAAO,KACPI,KAAM,MAEV8D,SAAU,CACNjM,MAAOuB,IACPxB,MAAOyC,EACH,IAAI6C,OAGI8B,SAAAA,EAAAA,4BAMZnF,MAAO,SAAUd,EAASc,EAAO/C,GAC7B,OAAOqI,EAASpG,EAASjC,EAAO,CAC5BY,KAAM,QACNiM,IAAK5K,EAAQ,MAGrB6G,MAAO,KACPI,KAAM,MAEV+D,GAAI,CACAlM,MAAOuB,EACPxB,MAAOyC,EACH,IAAI6C,OAGI,uJAwBZxE,QAAS,SAAUK,GAEf,OAAOA,EAAQ,GAAGW,OAAS,IAE/BG,MAAO,SAAUd,EAASc,EAAO/C,GACtB,MAAA,CACHwE,QAASzB,EAAMd,EAAQ,IAAMA,EAAQ,GAAIjC,KAGjD8I,MAAO,SAAUvB,EAAMyB,EAAQhJ,GAC3B,OAAO+D,EAAa,KAAM/D,EAAMgE,IAAK,CACjCqF,SAAUL,EAAOzB,EAAK/C,QAASxE,MAGvCkJ,KAAM,SAAU3B,EAAMyB,EAAQhJ,GAC1B,OAAOsE,EAAQ,KAAM0E,EAAOzB,EAAK/C,QAASxE,MAGlDkN,OAAQ,CACJnM,MAAOuB,EACPxB,MAAOyC,EAAY,yCACnB3B,QAAS,SAAUK,GAEf,OAAOA,EAAQ,GAAGW,OAAS,IAE/BG,MAAOkD,EACP6C,MAAO,SAAUvB,EAAMyB,EAAQhJ,GAC3B,OAAO+D,EAAa,SAAU/D,EAAMgE,IAAK,CACrCqF,SAAUL,EAAOzB,EAAK/C,QAASxE,MAGvCkJ,KAAM,SAAU3B,EAAMyB,EAAQhJ,GAC1B,OAAOsE,EAAQ,SAAU0E,EAAOzB,EAAK/C,QAASxE,MAGtDmN,EAAG,CACCpM,MAAOuB,IACPxB,MAAOyC,EAAY,oCACnB3B,QAAS,SAAUK,GAEf,OAAOA,EAAQ,GAAGW,QAEtBG,MAAOkD,EACP6C,MAAO,SAAUvB,EAAMyB,EAAQhJ,GAC3B,OAAO+D,EAAa,IAAK/D,EAAMgE,IAAK,CAChCqF,SAAUL,EAAOzB,EAAK/C,QAASxE,MAGvCkJ,KAAM,SAAU3B,EAAMyB,EAAQhJ,GAC1B,OAAOsE,EAAQ,IAAK0E,EAAOzB,EAAK/C,QAASxE,MAGjDoN,IAAK,CACDrM,MAAOuB,IACPxB,MAAOyC,EACH,wDAEJR,MAAOkD,EACP6C,MAAO,SAAUvB,EAAMyB,EAAQhJ,GAC3B,OAAO+D,EAAa,MAAO/D,EAAMgE,IAAK,CAClCqF,SAAUL,EAAOzB,EAAK/C,QAASxE,MAGvCkJ,KAAM,SAAU3B,EAAMyB,EAAQhJ,GAC1B,OAAOsE,EAAQ,MAAO0E,EAAOzB,EAAK/C,QAASxE,MAGnDqN,WAAY,CACRtM,MAAOuB,IACPxB,MAAOyC,EAAY,8BACnBR,MAAO,SAAUd,EAASc,EAAO/C,GACtB,MAAA,CACHwE,QAASvC,EAAQ,GAAGrC,QAChB4G,EACA,QAIZsC,MAAO,SAAUvB,EAAMyB,EAAQhJ,GAC3B,OAAO+D,EAAa,OAAQ/D,EAAMgE,IAAK,CACnCqF,SAAU9B,EAAK/C,WAGvB0E,KAAM,SAAU3B,EAAMyB,EAAQhJ,GACnBsE,OAAAA,EAAQ,OAAQQ,EAAayC,EAAK/C,YAGjD8I,GAAI,CACAvM,MAAOuB,IACPxB,MAAO6C,EAAc,YACrBZ,MAAOmD,EACP4C,MAAO,SAAUvB,EAAMyB,EAAQhJ,GACpB+D,OAAAA,EAAa,KAAM/D,EAAMgE,IAAKgB,IAEzCkE,KAAM,SAAU3B,EAAMyB,EAAQhJ,GAC1B,MAAO,SAGf0F,KAAM,CACF3E,MAAOuB,IAKPxB,MAAO6C,EACH,kEAEJZ,MAAO,SAAUd,EAASc,EAAO/C,GACtB,MAAA,CACHwE,QAASvC,EAAQ,KAGzB6G,MAAO,SAAUvB,EAAMyB,EAAQhJ,GACpBuH,OAAAA,EAAK/C,SAEhB0E,KAAM,SAAU3B,EAAMyB,EAAQhJ,GAC1B,OAAO8E,EAAayC,EAAK/C,YAkFjC+I,EAAY,SACZhN,EACAiN,GACAzN,IAAAA,yDAAuB,GAEnB,IAACyN,EACK,MAAA,IAAI7K,MACN,0IAOJnC,IAAAA,EAEAiN,EAAuBlN,EAAMyC,OAAS6F,EAAa7F,MAGnD0K,EAAiBD,EAAUD,GAC3B,IAACE,EACK,MAAA,IAAI/K,MACN,sDACI6K,EADJ,2HAMJG,IAAAA,EAAkBD,EAElBE,EAA4B,SAAUC,EAAK7N,GAG3C,OADAQ,EADAR,EAAQA,GAASQ,EAEbwC,MAAMC,QAAQ4K,GACPF,EAAgBE,EAAKD,EAAc5N,GAEnCO,EAAMsN,EAAIjN,MAAM4M,GAAUK,EAAKD,EAAc5N,IAIxD8N,EAA2B,SAAUD,EAAK7N,GAE1C,OADAQ,EAAcX,EAAqBG,EAAOD,GACnC6N,EAAaC,EAAKrN,IAE7B,OAAOsN,GAIPC,EAAkBzN,EAAUuI,GAE5BmF,EAAoB,SACpBrO,EACAK,GAIA,OAFAA,EAAQA,GAAS,IACXqD,QAAS,EACR0K,EAAgBpO,EAAQK,IAY/BiO,EAAuB,SACvBtO,EACAK,GAEA,IAAIkO,EAAU3H,EAAYQ,KAAKpH,GAG/B,OAFAK,EAAQA,GAAS,IACXqD,QAAU6K,EACTH,EAAgBpO,EAAQK,IAI/BmO,EAAkCZ,EAAU1E,EAAc,SAE1DuF,EAAgCb,EAAU1E,EAAc,QAExDwF,EAAkB,SAAU1O,EAAgBK,GACrCmO,OAAAA,EAAmBH,EAAkBrO,EAAQK,GAAQA,IAsH5DsO,EAA0B,CAC1BzF,aAAcA,EACdvI,UAAWA,EACXiN,UAAWA,EAEXhK,YAAaA,EACbG,WAAYA,EACZC,cAAeA,EACfoC,YAAaA,EACbwI,WAh2Ca,SACbxL,EACAyB,EACAxE,GAEA,IAAIgG,EAAoBhG,EAAMqD,SAAU,EACxCrD,EAAMqD,QAAS,EACXtB,IAAAA,EAASgB,EAAMyB,EAAU,OAAQxE,GAErC,OADAA,EAAMqD,OAAS2C,EACRjE,GA01CPsM,gBAAiBA,EACjBG,eAhIiB,SAAU7O,EAAgBK,GACpCoO,OAAAA,EAAkBJ,EAAkBrO,EAAQK,GAAQA,IAgI3DyO,cA3HgB,SAAUxK,GACtByK,IAAAA,EAAW,GAEf,IAAK,IAAIzO,KAAQgE,EAEA,WAAThE,GAEAC,OAAOC,UAAUC,eAAeC,KAAK4D,EAAOhE,KAE5CyO,EAASzO,GAAQgE,EAAMhE,IAK/B,OAFAyO,EAASrF,SAAWgF,EAAgBpK,EAAMtE,QAEnCoE,EAAa,MAAO,KAAM2K,IA+GjCV,kBAAmBA,EACnBW,mBAhKqB,SACrBhP,EACAK,GAIA,OAFAA,EAAQA,GAAS,IACXqD,QAAS,EACR0K,EAAgBpO,EAAQK,IA2J/BiO,qBAAsBA,EAEtBE,mBAAoBA,EACpBC,kBAAmBA,EAEnB1O,WAAYA,EACZoF,aAAcA,EACdG,YAAaA,EACbY,YAAaA,EACbvB,QAASA,EACTP,aAAcA,EAGdgK,gBAAiBA,EACjBa,WAtTa,SAEbrO,EACAiN,GAEKA,GAA+B,oBAAZvM,SACpBA,QAAQC,KACJ,oFAYR,OAPuB,SACnB2M,EACAgB,EACA7O,GAEA,OAAOO,EAAMsN,EAAIjN,MAAM4M,GAAUK,EAAKgB,EAAY7O,KAsStD8O,SA/RW,SAAUD,GACrB,IAAIjB,EAA4B,SAAUC,EAAK7N,GAE3C,GADAA,EAAQA,GAAS,GACbgD,MAAMC,QAAQ4K,GAAM,CAOpB,IANA,IAAI5E,EAASjJ,EAAMgE,IACfjC,EAA+B,GAI/BgN,EAAa,KACR5M,EAAI,EAAGA,EAAI0L,EAAIjL,OAAQT,IAAK,CACjCnC,EAAMgE,IAAM,GAAK7B,EACb6M,IAAAA,EAAUpB,EAAaC,EAAI1L,GAAInC,GAEZ,iBAAZgP,GACe,iBAAfD,GAEPA,GAA0BC,EAC1BjN,EAAOA,EAAOa,OAAS,GAAKmM,IAE5BhN,EAAOmB,KAAK8L,GACZD,EAAaC,GAKrB,OADAhP,EAAMgE,IAAMiF,EACLlH,EAEP,OAAO8M,EAAWhB,EAAKD,EAAc5N,IAG7C,OAAO4N,GAiQPqB,QA5PU,SAAUJ,GACpB,IAAIjB,EAA2B,SAAUC,EAAK7N,GAE1C,OADAA,EAAQA,GAAS,GACbgD,MAAMC,QAAQ4K,GACPA,EACFlG,KAAI,SAAUJ,GACX,OAAOqG,EAAarG,EAAMvH,MAE7BmL,KAAK,IAEH0D,EAAWhB,EAAKD,EAAc5N,IAG7C,OAAO4N,GAiPPsB,aAAc,WAMV,MALuB,oBAAZjO,SACPA,QAAQC,KACJ,iEAGD+M,EAAqB9K,MAAM,KAAOgM,YAE7CC,cAAe,WAMX,MALuB,oBAAZnO,SACPA,QAAQC,KACJ,gEAGDiN,EAAmBhL,MAAM,KAAOgM"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"publishConfig": {
|
|
3
|
+
"access": "public"
|
|
4
|
+
},
|
|
5
|
+
"name": "@khanacademy/simple-markdown",
|
|
6
|
+
"version": "0.8.1",
|
|
7
|
+
"description": "Javascript markdown parsing, made simple",
|
|
8
|
+
"module": "dist/es/index.js",
|
|
9
|
+
"main": "dist/index.js",
|
|
10
|
+
"source": "src/index.js",
|
|
11
|
+
"types": "simple-markdown.d.ts",
|
|
12
|
+
"scripts": {
|
|
13
|
+
"test": "bash -c 'yarn --silent --cwd \"../..\" test ${@:0} $($([[ ${@: -1} = -* ]] || [[ ${@: -1} = bash ]]) && echo $PWD)'"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"markdown"
|
|
17
|
+
],
|
|
18
|
+
"author": "Khan Academy",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@types/react": ">=16.0.0"
|
|
22
|
+
},
|
|
23
|
+
"peerDependencies": {
|
|
24
|
+
"react": "16.14.0",
|
|
25
|
+
"react-dom": "16.14.0"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@types/react-dom": ">=16.0.0",
|
|
29
|
+
"size-limit": "^0.21.1",
|
|
30
|
+
"typescript": "^3.6.4",
|
|
31
|
+
"uglify-js": "^3.6.7"
|
|
32
|
+
},
|
|
33
|
+
"size-limit": [
|
|
34
|
+
{
|
|
35
|
+
"path": "simple-markdown.js",
|
|
36
|
+
"limit": "5 KB"
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
}
|