import { l as log } from "./commonDb-89160e91.js"; import { p as decodeEntities } from "./mermaidAPI-c841a67f.js"; var CR_NEWLINE_R = /\r\n?/g; var TAB_R = /\t/g; var FORMFEED_R = /\f/g; var preprocess = function preprocess2(source) { return source.replace(CR_NEWLINE_R, "\n").replace(FORMFEED_R, "").replace(TAB_R, " "); }; var populateInitialState = function populateInitialState2(givenState, defaultState) { var state = givenState || {}; if (defaultState != null) { for (var prop in defaultState) { if (Object.prototype.hasOwnProperty.call(defaultState, prop)) { state[prop] = defaultState[prop]; } } } return state; }; var parserFor = function parserFor2(rules, defaultState) { var ruleList = Object.keys(rules).filter(function(type) { var rule = rules[type]; if (rule == null || rule.match == null) { return false; } var order = rule.order; if ((typeof order !== "number" || !isFinite(order)) && typeof console !== "undefined") { console.warn("simple-markdown: Invalid order for rule `" + type + "`: " + String(order)); } return true; }); ruleList.sort(function(typeA, typeB) { var ruleA = rules[typeA]; var ruleB = rules[typeB]; var orderA = ruleA.order; var orderB = ruleB.order; if (orderA !== orderB) { return orderA - orderB; } var secondaryOrderA = ruleA.quality ? 0 : 1; var secondaryOrderB = ruleB.quality ? 0 : 1; if (secondaryOrderA !== secondaryOrderB) { return secondaryOrderA - secondaryOrderB; } else if (typeA < typeB) { return -1; } else if (typeA > typeB) { return 1; } else { return 0; } }); var latestState; var nestedParse = function nestedParse2(source, state) { var result = []; state = state || latestState; latestState = state; while (source) { var ruleType = null; var rule = null; var capture = null; var quality4 = NaN; var i = 0; var currRuleType = ruleList[0]; var currRule = rules[currRuleType]; do { var currOrder2 = currRule.order; var prevCaptureStr = state.prevCapture == null ? "" : state.prevCapture[0]; var currCapture = currRule.match(source, state, prevCaptureStr); if (currCapture) { var currQuality = currRule.quality ? currRule.quality(currCapture, state, prevCaptureStr) : 0; if (!(currQuality <= quality4)) { ruleType = currRuleType; rule = currRule; capture = currCapture; quality4 = currQuality; } } i++; currRuleType = ruleList[i]; currRule = rules[currRuleType]; } while ( // keep looping while we're still within the ruleList currRule && // if we don't have a match yet, continue (!capture || // or if we have a match, but the next rule is // at the same order, and has a quality measurement // functions, then this rule must have a quality // measurement function (since they are sorted before // those without), and we need to check if there is // a better quality match currRule.order === currOrder2 && currRule.quality) ); if (rule == null || capture == null) { 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 '" + ruleList[ruleList.length - 1] + "'. It seems to not match the following source:\n" + source); } if (capture.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 parsed = rule.parse(capture, nestedParse2, state); if (Array.isArray(parsed)) { Array.prototype.push.apply(result, parsed); } else { if (parsed == null || typeof parsed !== "object") { throw new Error("parse() function returned invalid parse result: '".concat(parsed, "'")); } if (parsed.type == null) { parsed.type = ruleType; } result.push(parsed); } state.prevCapture = capture; source = source.substring(state.prevCapture[0].length); } return result; }; var outerParse = function outerParse2(source, state) { latestState = populateInitialState(state, defaultState); if (!latestState.inline && !latestState.disableAutoBlockNewlines) { source = source + "\n\n"; } latestState.prevCapture = null; return nestedParse(preprocess(source), latestState); }; return outerParse; }; var inlineRegex = function inlineRegex2(regex) { var match3 = function match4(source, state, prevCapture) { if (state.inline) { return regex.exec(source); } else { return null; } }; match3.regex = regex; return match3; }; var blockRegex = function blockRegex2(regex) { var match3 = function match4(source, state) { if (state.inline) { return null; } else { return regex.exec(source); } }; match3.regex = regex; return match3; }; var anyScopeRegex = function anyScopeRegex2(regex) { var match3 = function match4(source, state) { return regex.exec(source); }; match3.regex = regex; return match3; }; var TYPE_SYMBOL = typeof Symbol === "function" && Symbol.for && Symbol.for("react.element") || 60103; var reactElement = function reactElement2(type, key, props) { var element = { $$typeof: TYPE_SYMBOL, type, key: key == null ? void 0 : key, ref: null, props, _owner: null }; return element; }; var htmlTag = function htmlTag2(tagName, content, attributes, isClosed) { attributes = attributes || {}; isClosed = typeof isClosed !== "undefined" ? isClosed : true; var attributeString = ""; for (var attr in attributes) { var attribute = attributes[attr]; if ( // $FlowFixMe Object.prototype.hasOwnProperty.call(attributes, attr) && attribute ) { attributeString += " " + sanitizeText(attr) + '="' + sanitizeText(attribute) + '"'; } } var unclosedTag = "<" + tagName + attributeString + ">"; if (isClosed) { return unclosedTag + content + ""; } else { return unclosedTag; } }; var EMPTY_PROPS = {}; var sanitizeUrl = function sanitizeUrl2(url) { if (url == null) { return null; } try { var prot = new URL(url, "https://localhost").protocol; if (prot.indexOf("javascript:") === 0 || prot.indexOf("vbscript:") === 0 || prot.indexOf("data:") === 0) { return null; } } catch (e) { return null; } return url; }; var SANITIZE_TEXT_R = /[<>&"']/g; var SANITIZE_TEXT_CODES = { "<": "<", ">": ">", "&": "&", '"': """, "'": "'", "/": "/", "`": "`" }; var sanitizeText = function sanitizeText2(text) { return String(text).replace(SANITIZE_TEXT_R, function(chr) { return SANITIZE_TEXT_CODES[chr]; }); }; var UNESCAPE_URL_R = /\\([^0-9A-Za-z\s])/g; var unescapeUrl = function unescapeUrl2(rawUrlString) { return rawUrlString.replace(UNESCAPE_URL_R, "$1"); }; var parseInline = function parseInline2(parse2, content, state) { var isCurrentlyInline = state.inline || false; state.inline = true; var result = parse2(content, state); state.inline = isCurrentlyInline; return result; }; var parseBlock = function parseBlock2(parse2, content, state) { var isCurrentlyInline = state.inline || false; state.inline = false; var result = parse2(content + "\n\n", state); state.inline = isCurrentlyInline; return result; }; var parseCaptureInline = function parseCaptureInline2(capture, parse2, state) { return { content: parseInline(parse2, capture[1], state) }; }; var ignoreCapture = function ignoreCapture2() { return {}; }; var LIST_BULLET = "(?:[*+-]|\\d+\\.)"; var LIST_ITEM_PREFIX = "( *)(" + LIST_BULLET + ") +"; var LIST_ITEM_PREFIX_R = new RegExp("^" + LIST_ITEM_PREFIX); var LIST_ITEM_R = new RegExp(LIST_ITEM_PREFIX + "[^\\n]*(?:\\n(?!\\1" + LIST_BULLET + " )[^\\n]*)*(\n|$)", "gm"); var BLOCK_END_R = /\n{2,}$/; var INLINE_CODE_ESCAPE_BACKTICKS_R = /^ (?= *`)|(` *) $/g; var LIST_BLOCK_END_R = BLOCK_END_R; var LIST_ITEM_END_R = / *\n+$/; var LIST_R = new RegExp("^( *)(" + LIST_BULLET + ") [\\s\\S]+?(?:\n{2,}(?! )(?!\\1" + LIST_BULLET + " )\\n*|\\s*\n*$)"); var LIST_LOOKBEHIND_R = /(?:^|\n)( *)$/; var TABLES = function() { var TABLE_ROW_SEPARATOR_TRIM = /^ *\| *| *\| *$/g; var TABLE_CELL_END_TRIM = / *$/; var TABLE_RIGHT_ALIGN = /^ *-+: *$/; var TABLE_CENTER_ALIGN = /^ *:-+: *$/; var TABLE_LEFT_ALIGN = /^ *:-+ *$/; var parseTableAlignCapture = function parseTableAlignCapture2(alignCapture) { if (TABLE_RIGHT_ALIGN.test(alignCapture)) { return "right"; } else if (TABLE_CENTER_ALIGN.test(alignCapture)) { return "center"; } else if (TABLE_LEFT_ALIGN.test(alignCapture)) { return "left"; } else { return null; } }; var parseTableAlign = function parseTableAlign2(source, parse2, state, trimEndSeparators) { if (trimEndSeparators) { source = source.replace(TABLE_ROW_SEPARATOR_TRIM, ""); } var alignText = source.trim().split("|"); return alignText.map(parseTableAlignCapture); }; var parseTableRow = function parseTableRow2(source, parse2, state, trimEndSeparators) { var prevInTable = state.inTable; state.inTable = true; var tableRow = parse2(source.trim(), state); state.inTable = prevInTable; var cells = [[]]; tableRow.forEach(function(node, i) { if (node.type === "tableSeparator") { if (!trimEndSeparators || i !== 0 && i !== tableRow.length - 1) { cells.push([]); } } else { if (node.type === "text" && (tableRow[i + 1] == null || tableRow[i + 1].type === "tableSeparator")) { node.content = node.content.replace(TABLE_CELL_END_TRIM, ""); } cells[cells.length - 1].push(node); } }); return cells; }; var parseTableCells = function parseTableCells2(source, parse2, state, trimEndSeparators) { var rowsText = source.trim().split("\n"); return rowsText.map(function(rowText) { return parseTableRow(rowText, parse2, state, trimEndSeparators); }); }; var parseTable = function parseTable2(trimEndSeparators) { return function(capture, parse2, state) { state.inline = true; var header = parseTableRow(capture[1], parse2, state, trimEndSeparators); var align = parseTableAlign(capture[2], parse2, state, trimEndSeparators); var cells = parseTableCells(capture[3], parse2, state, trimEndSeparators); state.inline = false; return { type: "table", header, align, cells }; }; }; return { parseTable: parseTable(true), parseNpTable: parseTable(false), TABLE_REGEX: /^ *(\|.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/, NPTABLE_REGEX: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/ }; }(); var LINK_INSIDE = "(?:\\[[^\\]]*\\]|[^\\[\\]]|\\](?=[^\\[]*\\]))*"; var LINK_HREF_AND_TITLE = `\\s*?(?:\\s+['"]([\\s\\S]*?)['"])?\\s*`; var AUTOLINK_MAILTO_CHECK_R = /mailto:/i; var parseRef = function parseRef2(capture, state, refNode) { var ref = (capture[2] || capture[1]).replace(/\s+/g, " ").toLowerCase(); if (state._defs && state._defs[ref]) { var def = state._defs[ref]; refNode.target = def.target; refNode.title = def.title; } state._refs = state._refs || {}; state._refs[ref] = state._refs[ref] || []; state._refs[ref].push(refNode); return refNode; }; var currOrder = 0; var defaultRules = { Array: { react: function react(arr, output, state) { var oldKey = state.key; var result = []; for (var i = 0, key = 0; i < arr.length; i++, key++) { state.key = "" + i; var node = arr[i]; if (node.type === "text") { node = { type: "text", content: node.content }; for (; i + 1 < arr.length && arr[i + 1].type === "text"; i++) { node.content += arr[i + 1].content; } } result.push(output(node, state)); } state.key = oldKey; return result; }, html: function html(arr, output, state) { var result = ""; for (var i = 0; i < arr.length; i++) { var node = arr[i]; if (node.type === "text") { node = { type: "text", content: node.content }; for (; i + 1 < arr.length && arr[i + 1].type === "text"; i++) { node.content += arr[i + 1].content; } } result += output(node, state); } return result; } }, heading: { order: currOrder++, match: blockRegex(/^ *(#{1,6})([^\n]+?)#* *(?:\n *)+\n/), parse: function(_parse) { function parse2(_x, _x2, _x3) { return _parse.apply(this, arguments); } parse2.toString = function() { return _parse.toString(); }; return parse2; }(function(capture, parse2, state) { return { level: capture[1].length, content: parseInline(parse2, capture[2].trim(), state) }; }), react: function react2(node, output, state) { return reactElement("h" + node.level, state.key, { children: output(node.content, state) }); }, html: function html2(node, output, state) { return htmlTag("h" + node.level, output(node.content, state)); } }, nptable: { order: currOrder++, match: blockRegex(TABLES.NPTABLE_REGEX), parse: TABLES.parseNpTable, react: null, html: null }, lheading: { order: currOrder++, match: blockRegex(/^([^\n]+)\n *(=|-){3,} *(?:\n *)+\n/), parse: function(_parse2) { function parse2(_x4, _x5, _x6) { return _parse2.apply(this, arguments); } parse2.toString = function() { return _parse2.toString(); }; return parse2; }(function(capture, parse2, state) { return { type: "heading", level: capture[2] === "=" ? 1 : 2, content: parseInline(parse2, capture[1], state) }; }), react: null, html: null }, hr: { order: currOrder++, match: blockRegex(/^( *[-*_]){3,} *(?:\n *)+\n/), parse: ignoreCapture, react: function react3(node, output, state) { return reactElement("hr", state.key, EMPTY_PROPS); }, html: function html3(node, output, state) { return "
"; } }, codeBlock: { order: currOrder++, match: blockRegex(/^(?: [^\n]+\n*)+(?:\n *)+\n/), parse: function(_parse3) { function parse2(_x7, _x8, _x9) { return _parse3.apply(this, arguments); } parse2.toString = function() { return _parse3.toString(); }; return parse2; }(function(capture, parse2, state) { var content = capture[0].replace(/^ /gm, "").replace(/\n+$/, ""); return { lang: void 0, content }; }), react: function react4(node, output, state) { var className = node.lang ? "markdown-code-" + node.lang : void 0; return reactElement("pre", state.key, { children: reactElement("code", null, { className, children: node.content }) }); }, html: function html4(node, output, state) { var className = node.lang ? "markdown-code-" + node.lang : void 0; var codeBlock = htmlTag("code", sanitizeText(node.content), { class: className }); return htmlTag("pre", codeBlock); } }, fence: { order: currOrder++, match: blockRegex(/^ *(`{3,}|~{3,}) *(?:(\S+) *)?\n([\s\S]+?)\n?\1 *(?:\n *)+\n/), parse: function(_parse4) { function parse2(_x10, _x11, _x12) { return _parse4.apply(this, arguments); } parse2.toString = function() { return _parse4.toString(); }; return parse2; }(function(capture, parse2, state) { return { type: "codeBlock", lang: capture[2] || void 0, content: capture[3] }; }), react: null, html: null }, blockQuote: { order: currOrder++, match: blockRegex(/^( *>[^\n]+(\n[^\n]+)*\n*)+\n{2,}/), parse: function(_parse5) { function parse2(_x13, _x14, _x15) { return _parse5.apply(this, arguments); } parse2.toString = function() { return _parse5.toString(); }; return parse2; }(function(capture, parse2, state) { var content = capture[0].replace(/^ *> ?/gm, ""); return { content: parse2(content, state) }; }), react: function react5(node, output, state) { return reactElement("blockquote", state.key, { children: output(node.content, state) }); }, html: function html5(node, output, state) { return htmlTag("blockquote", output(node.content, state)); } }, list: { order: currOrder++, // $FlowFixMe match: function match(source, state) { var prevCaptureStr = state.prevCapture == null ? "" : state.prevCapture[0]; var isStartOfLineCapture = LIST_LOOKBEHIND_R.exec(prevCaptureStr); var isListBlock = state._list || !state.inline; if (isStartOfLineCapture && isListBlock) { source = isStartOfLineCapture[1] + source; return LIST_R.exec(source); } else { return null; } }, parse: function(_parse6) { function parse2(_x16, _x17, _x18) { return _parse6.apply(this, arguments); } parse2.toString = function() { return _parse6.toString(); }; return parse2; }(function(capture, parse2, state) { var bullet = capture[2]; var ordered = bullet.length > 1; var start = ordered ? +bullet : void 0; var items = capture[0].replace(LIST_BLOCK_END_R, "\n").match(LIST_ITEM_R); var lastItemWasAParagraph = false; var itemContent = items.map(function(item, i) { var prefixCapture = LIST_ITEM_PREFIX_R.exec(item); var space = prefixCapture ? prefixCapture[0].length : 0; var spaceRegex = new RegExp("^ {1," + space + "}", "gm"); var content = item.replace(spaceRegex, "").replace(LIST_ITEM_PREFIX_R, ""); var isLastItem = i === items.length - 1; var containsBlocks = content.indexOf("\n\n") !== -1; var thisItemIsAParagraph = containsBlocks || isLastItem && lastItemWasAParagraph; lastItemWasAParagraph = thisItemIsAParagraph; var oldStateInline = state.inline; var oldStateList = state._list; state._list = true; var adjustedContent; if (thisItemIsAParagraph) { state.inline = false; adjustedContent = content.replace(LIST_ITEM_END_R, "\n\n"); } else { state.inline = true; adjustedContent = content.replace(LIST_ITEM_END_R, ""); } var result = parse2(adjustedContent, state); state.inline = oldStateInline; state._list = oldStateList; return result; }); return { ordered, start, items: itemContent }; }), react: function react6(node, output, state) { var ListWrapper = node.ordered ? "ol" : "ul"; return reactElement(ListWrapper, state.key, { start: node.start, children: node.items.map(function(item, i) { return reactElement("li", "" + i, { children: output(item, state) }); }) }); }, html: function html6(node, output, state) { var listItems = node.items.map(function(item) { return htmlTag("li", output(item, state)); }).join(""); var listTag = node.ordered ? "ol" : "ul"; var attributes = { start: node.start }; return htmlTag(listTag, listItems, attributes); } }, def: { order: currOrder++, // TODO(aria): This will match without a blank line before the next // block element, which is inconsistent with most of the rest of // simple-markdown. match: blockRegex(/^ *\[([^\]]+)\]: *]*)>?(?: +["(]([^\n]+)[")])? *\n(?: *\n)*/), parse: function(_parse7) { function parse2(_x19, _x20, _x21) { return _parse7.apply(this, arguments); } parse2.toString = function() { return _parse7.toString(); }; return parse2; }(function(capture, parse2, state) { var def = capture[1].replace(/\s+/g, " ").toLowerCase(); var target = capture[2]; var title = capture[3]; if (state._refs && state._refs[def]) { state._refs[def].forEach(function(refNode) { refNode.target = target; refNode.title = title; }); } state._defs = state._defs || {}; state._defs[def] = { target, title }; return { def, target, title }; }), react: function react7() { return null; }, html: function html7() { return ""; } }, table: { order: currOrder++, match: blockRegex(TABLES.TABLE_REGEX), parse: TABLES.parseTable, react: function react8(node, output, state) { var getStyle = function getStyle2(colIndex) { return node.align[colIndex] == null ? {} : { textAlign: node.align[colIndex] }; }; var headers = node.header.map(function(content, i) { return reactElement("th", "" + i, { style: getStyle(i), scope: "col", children: output(content, state) }); }); var rows = node.cells.map(function(row, r) { return reactElement("tr", "" + r, { children: row.map(function(content, c) { return reactElement("td", "" + c, { style: getStyle(c), children: output(content, state) }); }) }); }); return reactElement("table", state.key, { children: [reactElement("thead", "thead", { children: reactElement("tr", null, { children: headers }) }), reactElement("tbody", "tbody", { children: rows })] }); }, html: function html8(node, output, state) { var getStyle = function getStyle2(colIndex) { return node.align[colIndex] == null ? "" : "text-align:" + node.align[colIndex] + ";"; }; var headers = node.header.map(function(content, i) { return htmlTag("th", output(content, state), { style: getStyle(i), scope: "col" }); }).join(""); var rows = node.cells.map(function(row) { var cols = row.map(function(content, c) { return htmlTag("td", output(content, state), { style: getStyle(c) }); }).join(""); return htmlTag("tr", cols); }).join(""); var thead = htmlTag("thead", htmlTag("tr", headers)); var tbody = htmlTag("tbody", rows); return htmlTag("table", thead + tbody); } }, newline: { order: currOrder++, match: blockRegex(/^(?:\n *)*\n/), parse: ignoreCapture, react: function react9(node, output, state) { return "\n"; }, html: function html9(node, output, state) { return "\n"; } }, paragraph: { order: currOrder++, match: blockRegex(/^((?:[^\n]|\n(?! *\n))+)(?:\n *)+\n/), parse: parseCaptureInline, react: function react10(node, output, state) { return reactElement("div", state.key, { className: "paragraph", children: output(node.content, state) }); }, html: function html10(node, output, state) { var attributes = { class: "paragraph" }; return htmlTag("div", output(node.content, state), attributes); } }, escape: { order: currOrder++, // We don't allow escaping numbers, letters, or spaces here so that // backslashes used in plain text still get rendered. But allowing // escaping anything else provides a very flexible escape mechanism, // regardless of how this grammar is extended. match: inlineRegex(/^\\([^0-9A-Za-z\s])/), parse: function(_parse8) { function parse2(_x22, _x23, _x24) { return _parse8.apply(this, arguments); } parse2.toString = function() { return _parse8.toString(); }; return parse2; }(function(capture, parse2, state) { return { type: "text", content: capture[1] }; }), react: null, html: null }, tableSeparator: { order: currOrder++, // $FlowFixMe match: function match2(source, state) { if (!state.inTable) { return null; } return /^ *\| */.exec(source); }, parse: function parse() { return { type: "tableSeparator" }; }, // These shouldn't be reached, but in case they are, be reasonable: react: function react11() { return " | "; }, html: function html11() { return " | "; } }, autolink: { order: currOrder++, match: inlineRegex(/^<([^: >]+:\/[^ >]+)>/), parse: function(_parse9) { function parse2(_x25, _x26, _x27) { return _parse9.apply(this, arguments); } parse2.toString = function() { return _parse9.toString(); }; return parse2; }(function(capture, parse2, state) { return { type: "link", content: [{ type: "text", content: capture[1] }], target: capture[1] }; }), react: null, html: null }, mailto: { order: currOrder++, match: inlineRegex(/^<([^ >]+@[^ >]+)>/), parse: function(_parse10) { function parse2(_x28, _x29, _x30) { return _parse10.apply(this, arguments); } parse2.toString = function() { return _parse10.toString(); }; return parse2; }(function(capture, parse2, state) { var address = capture[1]; var target = capture[1]; if (!AUTOLINK_MAILTO_CHECK_R.test(target)) { target = "mailto:" + target; } return { type: "link", content: [{ type: "text", content: address }], target }; }), react: null, html: null }, url: { order: currOrder++, match: inlineRegex(/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/), parse: function(_parse11) { function parse2(_x31, _x32, _x33) { return _parse11.apply(this, arguments); } parse2.toString = function() { return _parse11.toString(); }; return parse2; }(function(capture, parse2, state) { return { type: "link", content: [{ type: "text", content: capture[1] }], target: capture[1], title: void 0 }; }), react: null, html: null }, link: { order: currOrder++, match: inlineRegex(new RegExp("^\\[(" + LINK_INSIDE + ")\\]\\(" + LINK_HREF_AND_TITLE + "\\)")), parse: function(_parse12) { function parse2(_x34, _x35, _x36) { return _parse12.apply(this, arguments); } parse2.toString = function() { return _parse12.toString(); }; return parse2; }(function(capture, parse2, state) { var link = { content: parse2(capture[1], state), target: unescapeUrl(capture[2]), title: capture[3] }; return link; }), react: function react12(node, output, state) { return reactElement("a", state.key, { href: sanitizeUrl(node.target), title: node.title, children: output(node.content, state) }); }, html: function html12(node, output, state) { var attributes = { href: sanitizeUrl(node.target), title: node.title }; return htmlTag("a", output(node.content, state), attributes); } }, image: { order: currOrder++, match: inlineRegex(new RegExp("^!\\[(" + LINK_INSIDE + ")\\]\\(" + LINK_HREF_AND_TITLE + "\\)")), parse: function(_parse13) { function parse2(_x37, _x38, _x39) { return _parse13.apply(this, arguments); } parse2.toString = function() { return _parse13.toString(); }; return parse2; }(function(capture, parse2, state) { var image = { alt: capture[1], target: unescapeUrl(capture[2]), title: capture[3] }; return image; }), react: function react13(node, output, state) { return reactElement("img", state.key, { src: sanitizeUrl(node.target), alt: node.alt, title: node.title }); }, html: function html13(node, output, state) { var attributes = { src: sanitizeUrl(node.target), alt: node.alt, title: node.title }; return htmlTag("img", "", attributes, false); } }, reflink: { order: currOrder++, match: inlineRegex(new RegExp( // The first [part] of the link "^\\[(" + LINK_INSIDE + ")\\]\\s*\\[([^\\]]*)\\]" )), parse: function(_parse14) { function parse2(_x40, _x41, _x42) { return _parse14.apply(this, arguments); } parse2.toString = function() { return _parse14.toString(); }; return parse2; }(function(capture, parse2, state) { return parseRef(capture, state, { type: "link", content: parse2(capture[1], state) }); }), react: null, html: null }, refimage: { order: currOrder++, match: inlineRegex(new RegExp( // The first [part] of the link "^!\\[(" + LINK_INSIDE + ")\\]\\s*\\[([^\\]]*)\\]" )), parse: function(_parse15) { function parse2(_x43, _x44, _x45) { return _parse15.apply(this, arguments); } parse2.toString = function() { return _parse15.toString(); }; return parse2; }(function(capture, parse2, state) { return parseRef(capture, state, { type: "image", alt: capture[1] }); }), react: null, html: null }, em: { order: currOrder, match: inlineRegex(new RegExp( // only match _s surrounding words. "^\\b_((?:__|\\\\[\\s\\S]|[^\\\\_])+?)_\\b|^\\*(?=\\S)((?:\\*\\*|\\\\[\\s\\S]|\\s+(?:\\\\[\\s\\S]|[^\\s\\*\\\\]|\\*\\*)|[^\\s\\*\\\\])+?)\\*(?!\\*)" )), quality: function quality(capture) { return capture[0].length + 0.2; }, parse: function(_parse16) { function parse2(_x46, _x47, _x48) { return _parse16.apply(this, arguments); } parse2.toString = function() { return _parse16.toString(); }; return parse2; }(function(capture, parse2, state) { return { content: parse2(capture[2] || capture[1], state) }; }), react: function react14(node, output, state) { return reactElement("em", state.key, { children: output(node.content, state) }); }, html: function html14(node, output, state) { return htmlTag("em", output(node.content, state)); } }, strong: { order: currOrder, match: inlineRegex(/^\*\*((?:\\[\s\S]|[^\\])+?)\*\*(?!\*)/), quality: function quality2(capture) { return capture[0].length + 0.1; }, parse: parseCaptureInline, react: function react15(node, output, state) { return reactElement("strong", state.key, { children: output(node.content, state) }); }, html: function html15(node, output, state) { return htmlTag("strong", output(node.content, state)); } }, u: { order: currOrder++, match: inlineRegex(/^__((?:\\[\s\S]|[^\\])+?)__(?!_)/), quality: function quality3(capture) { return capture[0].length; }, parse: parseCaptureInline, react: function react16(node, output, state) { return reactElement("u", state.key, { children: output(node.content, state) }); }, html: function html16(node, output, state) { return htmlTag("u", output(node.content, state)); } }, del: { order: currOrder++, match: inlineRegex(/^~~(?=\S)((?:\\[\s\S]|~(?!~)|[^\s~\\]|\s(?!~~))+?)~~/), parse: parseCaptureInline, react: function react17(node, output, state) { return reactElement("del", state.key, { children: output(node.content, state) }); }, html: function html17(node, output, state) { return htmlTag("del", output(node.content, state)); } }, inlineCode: { order: currOrder++, match: inlineRegex(/^(`+)([\s\S]*?[^`])\1(?!`)/), parse: function(_parse17) { function parse2(_x49, _x50, _x51) { return _parse17.apply(this, arguments); } parse2.toString = function() { return _parse17.toString(); }; return parse2; }(function(capture, parse2, state) { return { content: capture[2].replace(INLINE_CODE_ESCAPE_BACKTICKS_R, "$1") }; }), react: function react18(node, output, state) { return reactElement("code", state.key, { children: node.content }); }, html: function html18(node, output, state) { return htmlTag("code", sanitizeText(node.content)); } }, br: { order: currOrder++, match: anyScopeRegex(/^ {2,}\n/), parse: ignoreCapture, react: function react19(node, output, state) { return reactElement("br", state.key, EMPTY_PROPS); }, html: function html19(node, output, state) { return "
"; } }, text: { order: currOrder++, // Here we look for anything followed by non-symbols, // double newlines, or double-space-newlines // We break on any symbol characters so that this grammar // is easy to extend without needing to modify this regex match: anyScopeRegex(/^[\s\S]+?(?=[^0-9A-Za-z\s\u00c0-\uffff]|\n\n| {2,}\n|\w+:\S|$)/), parse: function(_parse18) { function parse2(_x52, _x53, _x54) { return _parse18.apply(this, arguments); } parse2.toString = function() { return _parse18.toString(); }; return parse2; }(function(capture, parse2, state) { return { content: capture[0] }; }), react: function react20(node, output, state) { return node.content; }, html: function html20(node, output, state) { return sanitizeText(node.content); } } }; var ruleOutput = function ruleOutput2(rules, property) { if (!property && typeof console !== "undefined") { console.warn("simple-markdown ruleOutput should take 'react' or 'html' as the second argument."); } var nestedRuleOutput = function nestedRuleOutput2(ast, outputFunc, state) { return rules[ast.type][property](ast, outputFunc, state); }; return nestedRuleOutput; }; var reactFor = function reactFor2(outputFunc) { var nestedOutput = function nestedOutput2(ast, state) { state = state || {}; if (Array.isArray(ast)) { var oldKey = state.key; var result = []; var lastResult = null; for (var i = 0; i < ast.length; i++) { state.key = "" + i; var nodeOut = nestedOutput2(ast[i], state); if (typeof nodeOut === "string" && typeof lastResult === "string") { lastResult = lastResult + nodeOut; result[result.length - 1] = lastResult; } else { result.push(nodeOut); lastResult = nodeOut; } } state.key = oldKey; return result; } else { return outputFunc(ast, nestedOutput2, state); } }; return nestedOutput; }; var htmlFor = function htmlFor2(outputFunc) { var nestedOutput = function nestedOutput2(ast, state) { state = state || {}; if (Array.isArray(ast)) { return ast.map(function(node) { return nestedOutput2(node, state); }).join(""); } else { return outputFunc(ast, nestedOutput2, state); } }; return nestedOutput; }; var outputFor = function outputFor2(rules, property) { var defaultState = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}; if (!property) { throw new Error("simple-markdown: outputFor: `property` must be defined. if you just upgraded, you probably need to replace `outputFor` with `reactFor`"); } var latestState; var arrayRule = rules.Array || defaultRules.Array; var arrayRuleCheck = arrayRule[property]; if (!arrayRuleCheck) { throw new Error("simple-markdown: outputFor: to join nodes of type `" + property + "` you must provide an `Array:` joiner rule with that type, Please see the docs for details on specifying an Array rule."); } var arrayRuleOutput = arrayRuleCheck; var nestedOutput = function nestedOutput2(ast, state) { state = state || latestState; latestState = state; if (Array.isArray(ast)) { return arrayRuleOutput(ast, nestedOutput2, state); } else { return rules[ast.type][property](ast, nestedOutput2, state); } }; var outerOutput = function outerOutput2(ast, state) { latestState = populateInitialState(state, defaultState); return nestedOutput(ast, latestState); }; return outerOutput; }; var defaultRawParse = parserFor(defaultRules); var defaultBlockParse = function defaultBlockParse2(source, state) { state = state || {}; state.inline = false; return defaultRawParse(source, state); }; var defaultInlineParse = function defaultInlineParse2(source, state) { state = state || {}; state.inline = true; return defaultRawParse(source, state); }; var defaultImplicitParse = function defaultImplicitParse2(source, state) { var isBlock = BLOCK_END_R.test(source); state = state || {}; state.inline = !isBlock; return defaultRawParse(source, state); }; var defaultReactOutput = outputFor(defaultRules, "react"); var defaultHtmlOutput = outputFor(defaultRules, "html"); var markdownToReact = function markdownToReact2(source, state) { return defaultReactOutput(defaultBlockParse(source, state), state); }; var markdownToHtml = function markdownToHtml2(source, state) { return defaultHtmlOutput(defaultBlockParse(source, state), state); }; var ReactMarkdown = function ReactMarkdown2(props) { var divProps = {}; for (var prop in props) { if (prop !== "source" && // $FlowFixMe Object.prototype.hasOwnProperty.call(props, prop)) { divProps[prop] = props[prop]; } } divProps.children = markdownToReact(props.source); return reactElement("div", null, divProps); }; var SimpleMarkdown = { defaultRules, parserFor, outputFor, inlineRegex, blockRegex, anyScopeRegex, parseInline, parseBlock, // default wrappers: markdownToReact, markdownToHtml, ReactMarkdown, defaultBlockParse, defaultInlineParse, defaultImplicitParse, defaultReactOutput, defaultHtmlOutput, preprocess, sanitizeText, sanitizeUrl, unescapeUrl, htmlTag, reactElement, // deprecated: defaultRawParse, ruleOutput, reactFor, htmlFor, defaultParse: function defaultParse() { if (typeof console !== "undefined") { console.warn("defaultParse is deprecated, please use `defaultImplicitParse`"); } return defaultImplicitParse.apply(null, arguments); }, defaultOutput: function defaultOutput() { if (typeof console !== "undefined") { console.warn("defaultOutput is deprecated, please use `defaultReactOutput`"); } return defaultReactOutput.apply(null, arguments); } }; function preprocessMarkdown(markdown) { const withoutMultipleNewlines = markdown.replace(/\n{2,}/g, "\n"); const withoutExtraSpaces = withoutMultipleNewlines.replace(/^\s+/gm, ""); return withoutExtraSpaces; } function markdownToLines(markdown) { const preprocessedMarkdown = preprocessMarkdown(markdown); const mdParse = SimpleMarkdown.defaultBlockParse; const syntaxTree = mdParse(preprocessedMarkdown); let lines = [[]]; let currentLine = 0; function processNode(node, parentType) { if (node.type === "text") { const textLines = node.content.split("\n"); textLines.forEach((textLine, index) => { if (index !== 0) { currentLine++; lines.push([]); } textLine.split(" ").forEach((word) => { if (word) { lines[currentLine].push({ content: word, type: parentType || "normal" }); } }); }); } else if (node.type === "strong" || node.type === "em") { node.content.forEach((contentNode) => { processNode(contentNode, node.type); }); } } syntaxTree.forEach((treeNode) => { if (treeNode.type === "paragraph") { treeNode.content.forEach((contentNode) => { processNode(contentNode); }); } }); return lines; } function markdownToHTML(markdown) { const mdParse = SimpleMarkdown.defaultBlockParse; const syntaxTree = mdParse(markdown); function output(node) { if (node.type === "text") { return node.content.replace(/\n/g, "
"); } else if (node.type === "strong") { return `${node.content.map(output).join("")}`; } else if (node.type === "em") { return `${node.content.map(output).join("")}`; } else if (node.type === "paragraph") { return `

${node.content.map(output).join("")}

`; } else { return ""; } } return syntaxTree.map(output).join(""); } function applyStyle(dom, styleFn) { if (styleFn) { dom.attr("style", styleFn); } } function addHtmlSpan(element, node, width, classes) { const fo = element.append("foreignObject"); const div = fo.append("xhtml:div"); const label = node.label; const labelClass = node.isNode ? "nodeLabel" : "edgeLabel"; div.html( `" + label + "" ); applyStyle(div, node.labelStyle); div.style("display", "table-cell"); div.style("white-space", "nowrap"); div.style("max-width", width + "px"); div.attr("xmlns", "http://www.w3.org/1999/xhtml"); let bbox = div.node().getBoundingClientRect(); if (bbox.width === width) { div.style("display", "table"); div.style("white-space", "break-spaces"); div.style("width", width + "px"); bbox = div.node().getBoundingClientRect(); } fo.style("width", bbox.width); fo.style("height", bbox.height); return fo.node(); } function createTspan(textElement, lineIndex, lineHeight) { return textElement.append("tspan").attr("class", "text-outer-tspan").attr("x", 0).attr("y", lineIndex * lineHeight - 0.1 + "em").attr("dy", lineHeight + "em"); } function createFormattedText(width, g, structuredText, addBackground = false) { const lineHeight = 1.1; const labelGroup = g.append("g"); let bkg = labelGroup.insert("rect").attr("class", "background"); const textElement = labelGroup.append("text").attr("y", "-10.1"); let lineIndex = -1; structuredText.forEach((line) => { lineIndex++; let tspan = createTspan(textElement, lineIndex, lineHeight); let words = [...line].reverse(); let currentWord; let wrappedLine = []; while (words.length) { currentWord = words.pop(); wrappedLine.push(currentWord); updateTextContentAndStyles(tspan, wrappedLine); if (tspan.node().getComputedTextLength() > width) { wrappedLine.pop(); words.push(currentWord); updateTextContentAndStyles(tspan, wrappedLine); wrappedLine = []; lineIndex++; tspan = createTspan(textElement, lineIndex, lineHeight); } } }); if (addBackground) { const bbox = textElement.node().getBBox(); const padding = 2; bkg.attr("x", -padding).attr("y", -padding).attr("width", bbox.width + 2 * padding).attr("height", bbox.height + 2 * padding); return labelGroup.node(); } else { return textElement.node(); } } function updateTextContentAndStyles(tspan, wrappedLine) { tspan.text(""); wrappedLine.forEach((word, index) => { const innerTspan = tspan.append("tspan").attr("font-style", word.type === "em" ? "italic" : "normal").attr("class", "text-inner-tspan").attr("font-weight", word.type === "strong" ? "bold" : "normal"); if (index === 0) { innerTspan.text(word.content); } else { innerTspan.text(" " + word.content); } }); } const createText = (el, text = "", { style = "", isTitle = false, classes = "", useHtmlLabels = true, isNode = true, width, addSvgBackground = false } = {}) => { log.info("createText", text, style, isTitle, classes, useHtmlLabels, isNode, addSvgBackground); if (useHtmlLabels) { const htmlText = markdownToHTML(text); const node = { isNode, label: decodeEntities(htmlText).replace( /fa[blrs]?:fa-[\w-]+/g, (s) => `` ), labelStyle: style.replace("fill:", "color:") }; let vertexNode = addHtmlSpan(el, node, width, classes); return vertexNode; } else { const structuredText = markdownToLines(text); const special = ['"', "'", ".", ",", ":", ";", "!", "?", "(", ")", "[", "]", "{", "}"]; let lastWord; structuredText.forEach((line) => { line.forEach((word) => { if (special.includes(word.content) && lastWord) { lastWord.content += word.content; word.content = ""; } lastWord = word; }); }); const svgLabel = createFormattedText(width, el, structuredText, addSvgBackground); return svgLabel; } }; export { createText as c }; //# sourceMappingURL=createText-b0d5c0ec.js.map