From 4790e52635b805e930d0f280ac47b856cc97a43d Mon Sep 17 00:00:00 2001 From: longze chen Date: Wed, 2 May 2018 23:55:35 -0400 Subject: [PATCH 1/5] Add static js and css for markdownit and plugins - MFR uses the same markdown-it.js and its plugins as OSF for rendering MD. However, due to lack of package managing and Babel, all full scripts are manually eslinted and babeled if necessary. .min scripts are kept intact. --- mfr/extensions/md/static/css/default.css | 9 + .../md/static/css/highlightjs-default.css | 99 +++++ .../md/static/js/markdown-it-highlightjs.js | 72 ++++ .../md/static/js/markdown-it-ins-del.js | 369 ++++++++++++++++++ .../md/static/js/markdown-it-mathjax.js | 147 +++++++ .../md/static/js/markdown-it-sanitizer.min.js | 2 + .../md/static/js/markdown-it-toc.js | 151 +++++++ .../md/static/js/markdown-it.min.js | 2 + 8 files changed, 851 insertions(+) create mode 100644 mfr/extensions/md/static/css/default.css create mode 100644 mfr/extensions/md/static/css/highlightjs-default.css create mode 100644 mfr/extensions/md/static/js/markdown-it-highlightjs.js create mode 100644 mfr/extensions/md/static/js/markdown-it-ins-del.js create mode 100644 mfr/extensions/md/static/js/markdown-it-mathjax.js create mode 100644 mfr/extensions/md/static/js/markdown-it-sanitizer.min.js create mode 100644 mfr/extensions/md/static/js/markdown-it-toc.js create mode 100644 mfr/extensions/md/static/js/markdown-it.min.js diff --git a/mfr/extensions/md/static/css/default.css b/mfr/extensions/md/static/css/default.css new file mode 100644 index 000000000..6fe0adf15 --- /dev/null +++ b/mfr/extensions/md/static/css/default.css @@ -0,0 +1,9 @@ +@charset "utf-8"; + +.mfrViewer { + font-family: 'Open Sans'; + padding: 1em; + background: #fefefe; + height: auto; + word-wrap: break-word; +} diff --git a/mfr/extensions/md/static/css/highlightjs-default.css b/mfr/extensions/md/static/css/highlightjs-default.css new file mode 100644 index 000000000..31d5c270d --- /dev/null +++ b/mfr/extensions/md/static/css/highlightjs-default.css @@ -0,0 +1,99 @@ +/** + * Original highlight.js style (c) Ivan Sagalaev + * + * https://github.com/isagalaev/highlight.js/blob/9.12.0/src/styles/default.css + */ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #F0F0F0; +} + + +/* Base color: saturation 0; */ + +.hljs, +.hljs-subst { + color: #444; +} + +.hljs-comment { + color: #888888; +} + +.hljs-keyword, +.hljs-attribute, +.hljs-selector-tag, +.hljs-meta-keyword, +.hljs-doctag, +.hljs-name { + font-weight: bold; +} + + +/* User color: hue: 0 */ + +.hljs-type, +.hljs-string, +.hljs-number, +.hljs-selector-id, +.hljs-selector-class, +.hljs-quote, +.hljs-template-tag, +.hljs-deletion { + color: #880000; +} + +.hljs-title, +.hljs-section { + color: #880000; + font-weight: bold; +} + +.hljs-regexp, +.hljs-symbol, +.hljs-variable, +.hljs-template-variable, +.hljs-link, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #BC6060; +} + + +/* Language color: hue: 90; */ + +.hljs-literal { + color: #78A960; +} + +.hljs-built_in, +.hljs-bullet, +.hljs-code, +.hljs-addition { + color: #397300; +} + + +/* Meta color: hue: 200 */ + +.hljs-meta { + color: #1f7199; +} + +.hljs-meta-string { + color: #4d99bf; +} + + +/* Misc effects */ + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/mfr/extensions/md/static/js/markdown-it-highlightjs.js b/mfr/extensions/md/static/js/markdown-it-highlightjs.js new file mode 100644 index 000000000..b8c182974 --- /dev/null +++ b/mfr/extensions/md/static/js/markdown-it-highlightjs.js @@ -0,0 +1,72 @@ +/** + * Preset to use highlight.js with markdown-it. + * + * Origin: https://github.com/valeriangalliat/markdown-it-highlightjs/tree/v3.0.0/index.js + * The above link gives a 404. Here is a forked copy and Babel-converted ES5 version: + * (ES6) https://github.com/cslzchen/markdown-it-highlightjs/blob/release/3.0.0/index.js + * (ES5) https://github.com/cslzchen/markdown-it-highlightjs/blob/release/3.0.0/index.es5.js + * + * Version: https://github.com/valeriangalliat/markdown-it-highlightjs/releases/tag/v3.0.0 + */ + +(function (root, factory) { + if (typeof exports === "object") { + module.exports = factory(); + } else { + root.markdownitHightlightjs = factory(); + } +})(this, function () { + + "use strict"; + + var maybe = function maybe(f) { + try { + return f(); + } catch (e) { + return false; + } + }; + + // Highlight with given language. + var highlight = function highlight(code, lang) { + return maybe(function () { + return hljs.highlight(lang, code, true).value; + }) || ""; + }; + + // Highlight with given language or automatically. + var highlightAuto = function highlightAuto(code, lang) { + return lang ? highlight(code, lang) : maybe(function () { + return hljs.highlightAuto(code).value; + }) || ""; + }; + + // Wrap a render function to add `hljs` class to code blocks. + var wrap = function wrap(render) { + return function () { + for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + + return render.apply(this, args).replace("", ""); + }; + }; + + var defaults = { + auto: true, + code: true + }; + + return function(md, opts) { + + opts = Object.assign({}, defaults, opts); + + md.options.highlight = opts.auto ? highlightAuto : highlight; + md.renderer.rules.fence = wrap(md.renderer.rules.fence); + + if (opts.code) { + md.renderer.rules.code_block = wrap(md.renderer.rules.code_block); + } + }; + +}); diff --git a/mfr/extensions/md/static/js/markdown-it-ins-del.js b/mfr/extensions/md/static/js/markdown-it-ins-del.js new file mode 100644 index 000000000..6c2d41e66 --- /dev/null +++ b/mfr/extensions/md/static/js/markdown-it-ins-del.js @@ -0,0 +1,369 @@ +/** + * and tag plugin for markdown-it markdown parser with editor attributions. + * + * Original: https://github.com/brianjgeiger/markdown-it-ins-del/blob/1.0.0/index.js + * Version: https://github.com/brianjgeiger/markdown-it-ins-del/releases/tag/1.0.0 + */ + +(function (root, factory) { + if (typeof exports === "object") { + module.exports = factory(); + } else { + root.markdownitIns = factory(); + } +})(this, function () { + + "use strict"; + + // parse sequence of markers, + // "start" should point at a valid marker + function scanDelims(state, start) { + var pos = start, lastChar, nextChar, count, + isLastWhiteSpace, isLastPunctChar, + isNextWhiteSpace, isNextPunctChar, + can_open = true, + can_close = true, + max = state.posMax, + marker = state.src.charCodeAt(start), + isWhiteSpace = state.md.utils.isWhiteSpace, + isPunctChar = state.md.utils.isPunctChar, + isMdAsciiPunct = state.md.utils.isMdAsciiPunct; + + // treat beginning of the line as a whitespace + lastChar = start > 0 ? state.src.charCodeAt(start - 1) : 0x20; + + while (pos < max && state.src.charCodeAt(pos) === marker) { pos++; } + + if (pos >= max) { + can_open = false; + } + + count = pos - start; + + // treat end of the line as a whitespace + nextChar = pos < max ? state.src.charCodeAt(pos) : 0x20; + + isLastPunctChar = isMdAsciiPunct(lastChar) || isPunctChar(String.fromCharCode(lastChar)); + isNextPunctChar = isMdAsciiPunct(nextChar) || isPunctChar(String.fromCharCode(nextChar)); + + isLastWhiteSpace = isWhiteSpace(lastChar); + isNextWhiteSpace = isWhiteSpace(nextChar); + + if (isNextWhiteSpace) { + can_open = false; + } else if (isNextPunctChar) { + if (!(isLastWhiteSpace || isLastPunctChar)) { + can_open = false; + } + } + + if (isLastWhiteSpace) { + can_close = false; + } else if (isLastPunctChar) { + if (!(isNextWhiteSpace || isNextPunctChar)) { + can_close = false; + } + } + + return { + can_open: can_open, + can_close: can_close, + delims: count + }; + } + + function insertweditor(state, silent) { + var startCount, + count, + tagCount, + found, + stack, + res, + token, + insertSuccess, + max = state.posMax, + start = state.pos, + marker = state.src.charCodeAt(start); + + if (marker !== 0x2B /* 0x2B = + */) { return false; } + if (silent) { return false; } // don't run any pairs in validation mode + + res = scanDelims(state, start); + startCount = res.delims; + + if (!res.can_open) { + state.pos += startCount; + // Earlier we checked !silent, but this implementation does not need it + state.pending += state.src.slice(start, state.pos); + return true; + } + + stack = Math.floor(startCount / 2); + if (stack <= 0) { return false; } + state.pos = start + startCount; + + while (state.pos < max) { + if (state.src.charCodeAt(state.pos) === marker) { + res = scanDelims(state, state.pos); + count = res.delims; + tagCount = Math.floor(count / 2); + if (res.can_close) { + if (tagCount >= stack) { + state.pos += count - 2; + found = true; + break; + } + stack -= tagCount; + state.pos += count; + continue; + } + + if (res.can_open) { stack += tagCount; } + state.pos += count; + continue; + } + + state.md.inline.skipToken(state); + } + + if (!found) { + // parser failed to find ending tag, so it's not valid emphasis + state.pos = start; + insertSuccess = false; + return false; + } + + // found! + state.posMax = state.pos; + state.pos = start + 2; + + // Earlier we checked !silent, but this implementation does not need it + // state.push('ins_open', 'del', 1); change here for html open tag, and close tag down + token = state.push("ins_open", "ins", 1); + token.markup = String.fromCharCode(marker) + String.fromCharCode(marker); + + state.md.inline.tokenize(state); + + token = state.push("ins_close", "ins", -1); + token.markup = String.fromCharCode(marker) + String.fromCharCode(marker); + + state.pos = state.posMax + 2; + state.posMax = max; + + insertSuccess = true; + + // Adding editor as superscript after insert tag + if (!insertSuccess) { + return true; + } + var UNESCAPE_RE = /\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g; + + var foundStart, + labelStart, + content, + token2, + max2 = state.posMax, + start2 = state.pos; + + if (state.src.charCodeAt(start2) !== 0x5B /* [ */) { return true; } // don't need to addeditor at all + if (silent) { return false; } // don't run any pairs in validation mode + if (start2 >= max2 || start2 + 2 >= max2) { return false; } + + state.pos = start2 + 1; + + while (state.pos < max2) { + if (state.src.charCodeAt(state.pos) === 0x5D /* [ */) { + foundStart = true; + break; + } + state.md.inline.skipToken(state); + } + + if (!foundStart || start2 + 1 === state.pos) { + state.pos = start2; + return false; + } + + content = state.src.slice(start2 + 1, state.pos); + + // don't allow unescaped spaces/newlines inside + if (content.match(/(^|[^\\])(\\\\)*\s/)) { + state.pos = start2; + return false; + } + + // found! + state.posMax = state.pos; + labelStart = start2 + 1; + state.pos = labelStart; + + // Earlier we checked !silent, but this implementation does not need it + token2 = state.push("sup_open", "sup", 1); + token2.markup = "["; + + //token2 = state.push('text', '', 0); + //token2.content = content.replace(UNESCAPE_RE, '$1'); + //token2.markup = String.fromCharCode(marker); + + state.md.inline.tokenize(state); + + token2 = state.push("sup_close", "sup", -1); + token2.markup = "]"; + + state.pos = state.posMax+ 1; + state.posMax = max2; + + return true; + } + + function deleteweditor(state, silent) { + var startCount, + count, + tagCount, + found, + stack, + res, + token, + deleteSuccess, + max = state.posMax, + start = state.pos, + marker = state.src.charCodeAt(start); + + if (marker !== 0x7E /* 0x7E = ~ */) { return false; } + if (silent) { return false; } // don't run any pairs in validation mode + + res = scanDelims(state, start); + startCount = res.delims; + + if (!res.can_open) { + state.pos += startCount; + // Earlier we checked !silent, but this implementation does not need it + state.pending += state.src.slice(start, state.pos); + return true; + } + + stack = Math.floor(startCount / 2); + if (stack <= 0) { return false; } + state.pos = start + startCount; + + while (state.pos < max) { + if (state.src.charCodeAt(state.pos) === marker) { + res = scanDelims(state, state.pos); + count = res.delims; + tagCount = Math.floor(count / 2); + if (res.can_close) { + if (tagCount >= stack) { + state.pos += count - 2; + found = true; + break; + } + stack -= tagCount; + state.pos += count; + continue; + } + + if (res.can_open) { stack += tagCount; } + state.pos += count; + continue; + } + + state.md.inline.skipToken(state); + } + + if (!found) { + // parser failed to find ending tag, so it's not valid emphasis + state.pos = start; + deleteSuccess = false; + return false; + } + + // found! + state.posMax = state.pos; + state.pos = start + 2; + + // Earlier we checked !silent, but this implementation does not need it + // state.push('ins_open', 's', 1); change here for html open tag, and close tag down + token = state.push("ins_open", "s", 1); + token.markup = String.fromCharCode(marker) + String.fromCharCode(marker); + + state.md.inline.tokenize(state); + + token = state.push("ins_close", "s", -1); + token.markup = String.fromCharCode(marker) + String.fromCharCode(marker); + + state.pos = state.posMax + 2; + state.posMax = max; + + deleteSuccess = true; + + // Adding editor as superscript after delete tag + if (!deleteSuccess) { + return true; + } + var UNESCAPE_RE = /\\([ \\!"#$%&'()*+,.\/:;<=>?@[\]^_`{|}~-])/g; + + var foundStart, + labelStart, + content, + token2, + max2 = state.posMax, + start2 = state.pos; + + if (state.src.charCodeAt(start2) !== 0x5B /* [ */) { return true; } // don't need to addeditor at all + if (silent) { return false; } // don't run any pairs in validation mode + if (start2 >= max2 || start2 + 2 >= max2) { return false; } + + state.pos = start2 + 1; + + while (state.pos < max2) { + if (state.src.charCodeAt(state.pos) === 0x5D /* [ */) { + foundStart = true; + break; + } + state.md.inline.skipToken(state); + } + + if (!foundStart || start2 + 1 === state.pos) { + state.pos = start2; + return false; + } + + content = state.src.slice(start2 + 1, state.pos); + + // don't allow unescaped spaces/newlines inside + if (content.match(/(^|[^\\])(\\\\)*\s/)) { + state.pos = start2; + return false; + } + + // found! + state.posMax = state.pos; + labelStart = start2 + 1; + state.pos = labelStart; + + // Earlier checked !silent, but this implementation does not need it + token2 = state.push("sup_open", "sup", 1); + token2.markup = "["; + + //token2 = state.push('text', '', 0); + //token2.content = content.replace(UNESCAPE_RE, '$1'); + //token2.markup = String.fromCharCode(marker); + + state.md.inline.tokenize(state); + + token2 = state.push("sup_close", "sup", -1); + token2.markup = "]"; + + state.pos = state.posMax+ 1; + state.posMax = max2; + + return true; + } + + return function(md) { + // new rule will be added before this one, name of added rule, rule function. + md.inline.ruler.before("emphasis", "ins", insertweditor); + md.inline.ruler.before("emphasis", "s", deleteweditor); + }; + +}); diff --git a/mfr/extensions/md/static/js/markdown-it-mathjax.js b/mfr/extensions/md/static/js/markdown-it-mathjax.js new file mode 100644 index 000000000..c04de1a48 --- /dev/null +++ b/mfr/extensions/md/static/js/markdown-it-mathjax.js @@ -0,0 +1,147 @@ +/** + * Markdown-it plugin to bypass LaTeX math for mathjax processing. + * + * Original: https://github.com/classeur/markdown-it-mathjax/blob/v2.0.0/markdown-it-mathjax.js + * Version: https://github.com/classeur/markdown-it-mathjax/releases/tag/v2.0.0 + */ + +(function (root, factory) { + if (typeof exports === "object") { + module.exports = factory(); + } else { + root.markdownitMathjax = factory(); + } +})(this, function () { + + function math (state, silent) { + var startMathPos = state.pos; + if (state.src.charCodeAt(startMathPos) !== 0x5C /* \ */) { + return false; + } + var match = state.src.slice(++startMathPos).match(/^(?:\\\[|\\\(|begin\{([^}]*)\})/); + if (!match) { + return false; + } + startMathPos += match[0].length; + var type, endMarker, includeMarkers; + if (match[0] === "\\[") { + type = "display_math"; + endMarker = "\\\\]"; + } else if (match[0] === "\\(") { + type = "inline_math"; + endMarker = "\\\\)"; + } else if (match[1]) { + type = "math"; + endMarker = "\\end{" + match[1] + "}"; + includeMarkers = true; + } + var endMarkerPos = state.src.indexOf(endMarker, startMathPos); + if (endMarkerPos === -1) { + return false; + } + var nextPos = endMarkerPos + endMarker.length; + if (!silent) { + var token = state.push(type, "", 0); + token.content = includeMarkers + ? state.src.slice(state.pos, nextPos) + : state.src.slice(startMathPos, endMarkerPos); + } + state.pos = nextPos; + return true; + } + + function texMath (state, silent) { + var startMathPos = state.pos; + if (state.src.charCodeAt(startMathPos) !== 0x24 /* $ */) { + return false; + } + + // Parse tex math according to http://pandoc.org/README.html#math + var endMarker = "$"; + var afterStartMarker = state.src.charCodeAt(++startMathPos); + if (afterStartMarker === 0x24 /* $ */) { + endMarker = "$$"; + if (state.src.charCodeAt(++startMathPos) === 0x24 /* $ */) { + // 3 markers are too much + return false; + } + } else { + // Skip if opening $ is succeeded by a space character + if (afterStartMarker === 0x20 /* space */ || afterStartMarker === 0x09 /* \t */ || afterStartMarker === 0x0a /* \n */) { + return false; + } + } + var endMarkerPos = state.src.indexOf(endMarker, startMathPos); + if (endMarkerPos === -1) { + return false; + } + if (state.src.charCodeAt(endMarkerPos - 1) === 0x5C /* \ */) { + return false; + } + var nextPos = endMarkerPos + endMarker.length; + if (endMarker.length === 1) { + // Skip if $ is preceded by a space character + var beforeEndMarker = state.src.charCodeAt(endMarkerPos - 1); + if (beforeEndMarker === 0x20 /* space */ || beforeEndMarker === 0x09 /* \t */ || beforeEndMarker === 0x0a /* \n */) { + return false; + } + // Skip if closing $ is succeeded by a digit (eg $5 $10 ...) + var suffix = state.src.charCodeAt(nextPos); + if (suffix >= 0x30 && suffix < 0x3A) { + return false; + } + } + + if (!silent) { + var token = state.push(endMarker.length === 1 ? "inline_math" : "display_math", "", 0); + token.content = state.src.slice(startMathPos, endMarkerPos); + } + state.pos = nextPos; + return true; + } + + function escapeHtml (html) { + return html.replace(/&/g, "&").replace(/]*>?/gi,function(e){var t,r,o,i,l,a;return/(^<->|^<-\s|^<3\s)/.test(e)?e:(t=e.match(u),t&&(r=t[1],o=n(r.match(/src="([^"<>]*)"/i)[1]),i=r.match(/alt="([^"<>]*)"/i),i=i&&"undefined"!=typeof i[1]?i[1]:"",l=r.match(/title="([^"<>]*)"/i),l=l&&"undefined"!=typeof l[1]?l[1]:"",o&&p.test(o))?""!==y?''+i+'':''+i+'':(a=v.indexOf("a"),t=e.match(s),t&&(r=t[1],o=n(r.match(/href="([^"<>]*)"/i)[1]),l=r.match(/title="([^"<>]*)"/i),l=l&&"undefined"!=typeof l[1]?l[1]:"",o&&h.test(o))?(k=!0,b[a]+=1,''):(t=/<\/a>/i.test(e))?(k=!0,b[a]-=1,b[a]<0&&(x[a]=!0),""):(t=e.match(/<(br|hr)\s?\/?>/i))?"<"+t[1].toLowerCase()+">":(t=e.match(/<(\/?)(b|blockquote|code|em|h[1-6]|li|ol(?: start="\d+")?|p|pre|s|sub|sup|strong|ul)>/i),t&&!/<\/ol start="\d+"/i.test(e)?(k=!0,a=v.indexOf(t[2].toLowerCase().split(" ")[0]),"/"===t[1]?b[a]-=1:b[a]+=1,b[a]<0&&(x[a]=!0),"<"+t[1]+t[2].toLowerCase()+">"):g===!0?"":f(e))))})}function o(e){var t,n,o;for(d=0;d]*" title="[^"<>]*" target="_blank">',"g"):"ol"===t?//g:RegExp("<"+t+">","g"),r=RegExp("","g"),m===!0?(e=e.replace(n,""),e=e.replace(r,"")):(e=e.replace(n,function(e){return f(e)}),e=e.replace(r,function(e){return f(e)})),e}function n(e){var n;for(n=0;n]*href="[^"<>]*"[^<>]*)\\s?>',s=RegExp(a,"i"),c=']*src="[^"<>]*"[^<>]*)\\s?\\/?>',u=RegExp(c,"i"),p=/^(?:https?:)?\/\//i,h=/^(?:https?:\/\/|ftp:\/\/|\/\/|mailto:|xmpp:)/i;t=t?t:{};var d,g="undefined"!=typeof t.removeUnknown&&t.removeUnknown,m="undefined"!=typeof t.removeUnbalanced&&t.removeUnbalanced,y="undefined"!=typeof t.imageClass?t.imageClass:"",k=!1,v=["a","b","blockquote","code","em","h1","h2","h3","h4","h5","h6","li","ol","p","pre","s","sub","sup","strong","ul"],b=new Array(v.length),x=new Array(v.length);for(d=0;d= 0 && state.src.indexOf("\n") < state.src.indexOf("@[toc]")) { + if (["softbreak", "hardbreak"].indexOf(state.tokens.slice(-1)[0].type) > -1) { + state.src = state.src.split("\n").slice(1).join("\n"); + state.pos = 0; + } + } + var token; + + // trivial rejections + if (state.src.charCodeAt(state.pos) !== 0x40 /* @ */ ) { + return false; + } + if (state.src.charCodeAt(state.pos + 1) !== 0x5B /* [ */ ) { + return false; + } + + var match = TOC_REGEXP.exec(state.src); + if (!match) { + return false; + } + match = match.filter(function(m) { + return m; + }); + if (match.length < 1) { + return false; + } + if (silent) { // don't run any pairs in validation mode + return false; + } + + token = state.push("toc_open", "toc", 1); + token.markup = "@[toc]"; + + token = state.push("toc_body", "", 0); + var label = state.env.tocHeader || TOC_DEFAULT; + if (match.length > 1) { + label = match.pop(); + } + token.content = label; + + token = state.push("toc_close", "toc", -1); + + var offset = 0; + var newline = state.src.indexOf("\n"); + if (newline !== -1) { + offset = state.pos + newline; + } else { + offset = state.pos + state.posMax + 1; + } + state.pos = offset; + + return true; + } + var makeSafe = function(label) { + return label.replace(/[^\w\s]/gi, "").split(" ").join("_"); + }; + + md.renderer.rules.heading_open = function(tokens, index) { + var level = tokens[index].tag; + var label = tokens[index + 1]; + if (label.type === "inline") { + var anchor = makeSafe(label.content) + "_" + label.map[0]; + return "<" + level + ">"; + } else { + return ""; + } + }; + + md.renderer.rules.toc_open = function(tokens, index) { + return ""; + }; + + md.renderer.rules.toc_close = function(tokens, index) { + return ""; + }; + + md.renderer.rules.toc_body = function(tokens, index) { + // Wanted to avoid linear search through tokens here, + // but this seems the only reliable way to identify headings + var headings = []; + var gtokens = gstate.tokens; + var size = gtokens.length; + for (var i = 0; i < size; i++) { + if (gtokens[i].type !== "heading_close") { + continue; + } + var token = gtokens[i]; + var heading = gtokens[i - 1]; + if (heading.type === "inline") { + headings.push({ + level: +token.tag.substr(1, 1), + anchor: makeSafe(heading.content) + "_" + heading.map[0], + content: heading.content + }); + } + } + + var indent = 0; + var list = headings.map(function(heading) { + var res = []; + if (heading.level > indent) { + var ldiff = (heading.level - indent); + for (var i = 0; i < ldiff; i++) { + res.push("
    "); + indent++; + } + } else if (heading.level < indent) { + var ldiff = (indent - heading.level); + for (var i = 0; i < ldiff; i++) { + res.push("
"); + indent--; + } + } + res = res.concat(["
  • ", heading.content, "
  • "]); + return res.join(""); + }); + + return "

    " + tokens[index].content + "

    " + list.join("") + new Array(indent + 1).join(""); + }; + + md.core.ruler.push("grab_state", function(state) { + gstate = state; + }); + md.inline.ruler.after("emphasis", "toc", toc); + }; + +}); diff --git a/mfr/extensions/md/static/js/markdown-it.min.js b/mfr/extensions/md/static/js/markdown-it.min.js new file mode 100644 index 000000000..a16c1e5dd --- /dev/null +++ b/mfr/extensions/md/static/js/markdown-it.min.js @@ -0,0 +1,2 @@ +/*! markdown-it 8.4.0 https://github.com/markdown-it/markdown-it/blob/8.4.0/bin/markdown-it.js https://cdnjs.cloudflare.com/ajax/libs/markdown-it/8.4.0/markdown-it.min.js */ +!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).markdownit=e()}}(function(){return function e(r,t,n){function s(i,a){if(!t[i]){if(!r[i]){var c="function"==typeof require&&require;if(!a&&c)return c(i,!0);if(o)return o(i,!0);var l=new Error("Cannot find module '"+i+"'");throw l.code="MODULE_NOT_FOUND",l}var u=t[i]={exports:{}};r[i][0].call(u.exports,function(e){var t=r[i][1][e];return s(t||e)},u,u.exports,e,r,t,n)}return t[i].exports}for(var o="function"==typeof require&&require,i=0;i`\\x00-\\x20]+|'[^']*'|\"[^\"]*\"))?)*\\s*\\/?>",s="<\\/[A-Za-z][A-Za-z0-9\\-]*\\s*>",o=new RegExp("^(?:"+n+"|"+s+"|\x3c!----\x3e|\x3c!--(?:-?[^>-])(?:-?[^-])*--\x3e|<[?].*?[?]>|]*>|)"),i=new RegExp("^(?:"+n+"|"+s+")");r.exports.HTML_TAG_RE=o,r.exports.HTML_OPEN_CLOSE_TAG_RE=i},{}],4:[function(e,r,t){"use strict";function n(e){return Object.prototype.toString.call(e)}function s(e,r){return l.call(e,r)}function o(e){return!(e>=55296&&e<=57343)&&(!(e>=64976&&e<=65007)&&(65535!=(65535&e)&&65534!=(65535&e)&&(!(e>=0&&e<=8)&&(11!==e&&(!(e>=14&&e<=31)&&(!(e>=127&&e<=159)&&!(e>1114111)))))))}function i(e){if(e>65535){var r=55296+((e-=65536)>>10),t=56320+(1023&e);return String.fromCharCode(r,t)}return String.fromCharCode(e)}function a(e,r){var t=0;return s(d,r)?d[r]:35===r.charCodeAt(0)&&f.test(r)&&(t="x"===r[1].toLowerCase()?parseInt(r.slice(2),16):parseInt(r.slice(1),10),o(t))?i(t):e}function c(e){return g[e]}var l=Object.prototype.hasOwnProperty,u=/\\([!"#$%&'()*+,\-.\/:;<=>?@[\\\]^_`{|}~])/g,p=/&([a-z#][a-z0-9]{1,31});/gi,h=new RegExp(u.source+"|"+p.source,"gi"),f=/^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))/i,d=e("./entities"),m=/[&<>"]/,_=/[&<>"]/g,g={"&":"&","<":"<",">":">",'"':"""},b=/[.?*+^$[\]\\(){}|-]/g,k=e("uc.micro/categories/P/regex");t.lib={},t.lib.mdurl=e("mdurl"),t.lib.ucmicro=e("uc.micro"),t.assign=function(e){return Array.prototype.slice.call(arguments,1).forEach(function(r){if(r){if("object"!=typeof r)throw new TypeError(r+"must be object");Object.keys(r).forEach(function(t){e[t]=r[t]})}}),e},t.isString=function(e){return"[object String]"===n(e)},t.has=s,t.unescapeMd=function(e){return e.indexOf("\\")<0?e:e.replace(u,"$1")},t.unescapeAll=function(e){return e.indexOf("\\")<0&&e.indexOf("&")<0?e:e.replace(h,function(e,r,t){return r||a(e,t)})},t.isValidEntityCode=o,t.fromCodePoint=i,t.escapeHtml=function(e){return m.test(e)?e.replace(_,c):e},t.arrayReplaceAt=function(e,r,t){return[].concat(e.slice(0,r),t,e.slice(r+1))},t.isSpace=function(e){switch(e){case 9:case 32:return!0}return!1},t.isWhiteSpace=function(e){if(e>=8192&&e<=8202)return!0;switch(e){case 9:case 10:case 11:case 12:case 13:case 32:case 160:case 5760:case 8239:case 8287:case 12288:return!0}return!1},t.isMdAsciiPunct=function(e){switch(e){case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 91:case 92:case 93:case 94:case 95:case 96:case 123:case 124:case 125:case 126:return!0;default:return!1}},t.isPunctChar=function(e){return k.test(e)},t.escapeRE=function(e){return e.replace(b,"\\$&")},t.normalizeReference=function(e){return e.trim().replace(/\s+/g," ").toUpperCase()}},{"./entities":1,mdurl:58,"uc.micro":65,"uc.micro/categories/P/regex":63}],5:[function(e,r,t){"use strict";t.parseLinkLabel=e("./parse_link_label"),t.parseLinkDestination=e("./parse_link_destination"),t.parseLinkTitle=e("./parse_link_title")},{"./parse_link_destination":6,"./parse_link_label":7,"./parse_link_title":8}],6:[function(e,r,t){"use strict";var n=e("../common/utils").isSpace,s=e("../common/utils").unescapeAll;r.exports=function(e,r,t){var o,i,a=r,c={ok:!1,pos:0,lines:0,str:""};if(60===e.charCodeAt(r)){for(r++;r=t)return c;if(34!==(o=e.charCodeAt(r))&&39!==o&&40!==o)return c;for(r++,40===o&&(o=41);r=0))try{r.hostname=m.toASCII(r.hostname)}catch(e){}return d.encode(d.format(r))}function o(e){var r=d.parse(e,!0);if(r.hostname&&(!r.protocol||k.indexOf(r.protocol)>=0))try{r.hostname=m.toUnicode(r.hostname)}catch(e){}return d.decode(d.format(r))}function i(e,r){if(!(this instanceof i))return new i(e,r);r||a.isString(e)||(r=e||{},e="default"),this.inline=new h,this.block=new p,this.core=new u,this.renderer=new l,this.linkify=new f,this.validateLink=n,this.normalizeLink=s,this.normalizeLinkText=o,this.utils=a,this.helpers=a.assign({},c),this.options={},this.configure(e),r&&this.set(r)}var a=e("./common/utils"),c=e("./helpers"),l=e("./renderer"),u=e("./parser_core"),p=e("./parser_block"),h=e("./parser_inline"),f=e("linkify-it"),d=e("mdurl"),m=e("punycode"),_={default:e("./presets/default"),zero:e("./presets/zero"),commonmark:e("./presets/commonmark")},g=/^(vbscript|javascript|file|data):/,b=/^data:image\/(gif|png|jpeg|webp);/,k=["http:","https:","mailto:"];i.prototype.set=function(e){return a.assign(this.options,e),this},i.prototype.configure=function(e){var r,t=this;if(a.isString(e)&&(r=e,!(e=_[r])))throw new Error('Wrong `markdown-it` preset "'+r+'", check name');if(!e)throw new Error("Wrong `markdown-it` preset, can't be empty");return e.options&&t.set(e.options),e.components&&Object.keys(e.components).forEach(function(r){e.components[r].rules&&t[r].ruler.enableOnly(e.components[r].rules),e.components[r].rules2&&t[r].ruler2.enableOnly(e.components[r].rules2)}),this},i.prototype.enable=function(e,r){var t=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(r){t=t.concat(this[r].ruler.enable(e,!0))},this),t=t.concat(this.inline.ruler2.enable(e,!0));var n=e.filter(function(e){return t.indexOf(e)<0});if(n.length&&!r)throw new Error("MarkdownIt. Failed to enable unknown rule(s): "+n);return this},i.prototype.disable=function(e,r){var t=[];Array.isArray(e)||(e=[e]),["core","block","inline"].forEach(function(r){t=t.concat(this[r].ruler.disable(e,!0))},this),t=t.concat(this.inline.ruler2.disable(e,!0));var n=e.filter(function(e){return t.indexOf(e)<0});if(n.length&&!r)throw new Error("MarkdownIt. Failed to disable unknown rule(s): "+n);return this},i.prototype.use=function(e){var r=[this].concat(Array.prototype.slice.call(arguments,1));return e.apply(e,r),this},i.prototype.parse=function(e,r){if("string"!=typeof e)throw new Error("Input data should be a String");var t=new this.core.State(e,this,r);return this.core.process(t),t.tokens},i.prototype.render=function(e,r){return r=r||{},this.renderer.render(this.parse(e,r),this.options,r)},i.prototype.parseInline=function(e,r){var t=new this.core.State(e,this,r);return t.inlineMode=!0,this.core.process(t),t.tokens},i.prototype.renderInline=function(e,r){return r=r||{},this.renderer.render(this.parseInline(e,r),this.options,r)},r.exports=i},{"./common/utils":4,"./helpers":5,"./parser_block":10,"./parser_core":11,"./parser_inline":12,"./presets/commonmark":13,"./presets/default":14,"./presets/zero":15,"./renderer":16,"linkify-it":53,mdurl:58,punycode:60}],10:[function(e,r,t){"use strict";function n(){this.ruler=new s;for(var e=0;e=t))&&!(e.sCount[i]=c){e.line=t;break}for(n=0;n=o)break}else e.pending+=e.src[e.pos++]}e.pending&&e.pushPending()},n.prototype.parse=function(e,r,t,n){var s,o,i,a=new this.State(e,r,t,n);for(this.tokenize(a),i=(o=this.ruler2.getRules("")).length,s=0;s"+i(e[r].content)+"
    "},a.code_block=function(e,r,t,n,s){var o=e[r];return""+i(e[r].content)+"\n"},a.fence=function(e,r,t,n,s){var a,c,l,u,p=e[r],h=p.info?o(p.info).trim():"",f="";return h&&(f=h.split(/\s+/g)[0]),0===(a=t.highlight?t.highlight(p.content,f)||i(p.content):i(p.content)).indexOf(""+a+"
    \n"):"
    "+a+"
    \n"},a.image=function(e,r,t,n,s){var o=e[r];return o.attrs[o.attrIndex("alt")][1]=s.renderInlineAsText(o.children,t,n),s.renderToken(e,r,t)},a.hardbreak=function(e,r,t){return t.xhtmlOut?"
    \n":"
    \n"},a.softbreak=function(e,r,t){return t.breaks?t.xhtmlOut?"
    \n":"
    \n":"\n"},a.text=function(e,r){return i(e[r].content)},a.html_block=function(e,r){return e[r].content},a.html_inline=function(e,r){return e[r].content},n.prototype.renderAttrs=function(e){var r,t,n;if(!e.attrs)return"";for(n="",r=0,t=e.attrs.length;r\n":">")},n.prototype.renderInline=function(e,r,t){for(var n,s="",o=this.rules,i=0,a=e.length;i=4)return!1;if(62!==e.src.charCodeAt(D++))return!1;if(s)return!0;for(c=f=e.sCount[r]+D-(e.bMarks[r]+e.tShift[r]),32===e.src.charCodeAt(D)?(D++,c++,f++,o=!1,v=!0):9===e.src.charCodeAt(D)?(v=!0,(e.bsCount[r]+f)%4==3?(D++,c++,f++,o=!1):o=!0):v=!1,d=[e.bMarks[r]],e.bMarks[r]=D;D=q,b=[e.sCount[r]],e.sCount[r]=f-c,k=[e.tShift[r]],e.tShift[r]=D-e.bMarks[r],y=e.md.block.ruler.getRules("blockquote"),g=e.parentType,e.parentType="blockquote",A=!1,h=r+1;h=q));h++)if(62!==e.src.charCodeAt(D++)||A){if(u)break;for(x=!1,a=0,l=y.length;a=q,m.push(e.bsCount[h]),e.bsCount[h]=e.sCount[h]+1+(v?1:0),b.push(e.sCount[h]),e.sCount[h]=f-c,k.push(e.tShift[h]),e.tShift[h]=D-e.bMarks[h]}for(_=e.blkIndent,e.blkIndent=0,(C=e.push("blockquote_open","blockquote",1)).markup=">",C.map=p=[r,0],e.md.block.tokenize(e,r,h),(C=e.push("blockquote_close","blockquote",-1)).markup=">",e.lineMax=w,e.parentType=g,p[1]=e.line,a=0;a=4))break;s=++n}return e.line=s,o=e.push("code_block","code",0),o.content=e.getLines(r,s,4+e.blkIndent,!0),o.map=[r,e.line],!0}},{}],20:[function(e,r,t){"use strict";r.exports=function(e,r,t,n){var s,o,i,a,c,l,u,p=!1,h=e.bMarks[r]+e.tShift[r],f=e.eMarks[r];if(e.sCount[r]-e.blkIndent>=4)return!1;if(h+3>f)return!1;if(126!==(s=e.src.charCodeAt(h))&&96!==s)return!1;if(c=h,h=e.skipChars(h,s),(o=h-c)<3)return!1;if(u=e.src.slice(c,h),(i=e.src.slice(h,f)).indexOf(String.fromCharCode(s))>=0)return!1;if(n)return!0;for(a=r;!(++a>=t)&&(h=c=e.bMarks[a]+e.tShift[a],f=e.eMarks[a],!(h=4||(h=e.skipChars(h,s))-c=4)return!1;if(35!==(o=e.src.charCodeAt(l))||l>=u)return!1;for(i=1,o=e.src.charCodeAt(++l);35===o&&l6||ll&&n(e.src.charCodeAt(a-1))&&(u=a),e.line=r+1,c=e.push("heading_open","h"+String(i),1),c.markup="########".slice(0,i),c.map=[r,e.line],c=e.push("inline","",0),c.content=e.src.slice(l,u).trim(),c.map=[r,e.line],c.children=[],c=e.push("heading_close","h"+String(i),-1),c.markup="########".slice(0,i),!0))}},{"../common/utils":4}],22:[function(e,r,t){"use strict";var n=e("../common/utils").isSpace;r.exports=function(e,r,t,s){var o,i,a,c,l=e.bMarks[r]+e.tShift[r],u=e.eMarks[r];if(e.sCount[r]-e.blkIndent>=4)return!1;if(42!==(o=e.src.charCodeAt(l++))&&45!==o&&95!==o)return!1;for(i=1;l|$))/i,/<\/(script|pre|style)>/i,!0],[/^/,!0],[/^<\?/,/\?>/,!0],[/^/,!0],[/^/,!0],[new RegExp("^|$))","i"),/^$/,!0],[new RegExp(s.source+"\\s*$"),/^$/,!1]];r.exports=function(e,r,t,n){var s,i,a,c,l=e.bMarks[r]+e.tShift[r],u=e.eMarks[r];if(e.sCount[r]-e.blkIndent>=4)return!1;if(!e.md.options.html)return!1;if(60!==e.src.charCodeAt(l))return!1;for(c=e.src.slice(l,u),s=0;s=4)return!1;for(h=e.parentType,e.parentType="paragraph";f3)){if(e.sCount[f]>=e.blkIndent&&(c=e.bMarks[f]+e.tShift[f],l=e.eMarks[f],c=l))){u=61===p?1:2;break}if(!(e.sCount[f]<0)){for(s=!1,o=0,i=d.length;o=o)return-1;if((t=e.src.charCodeAt(s++))<48||t>57)return-1;for(;;){if(s>=o)return-1;if(!((t=e.src.charCodeAt(s++))>=48&&t<=57)){if(41===t||46===t)break;return-1}if(s-n>=10)return-1}return s=4)return!1;if(i&&"paragraph"===e.parentType&&e.tShift[r]>=e.blkIndent&&(R=!0),(S=s(e,r))>=0){if(f=!0,L=e.bMarks[r]+e.tShift[r],k=Number(e.src.substr(L,S-L-1)),R&&1!==k)return!1}else{if(!((S=n(e,r))>=0))return!1;f=!1}if(R&&e.skipSpaces(S)>=e.eMarks[r])return!1;if(b=e.src.charCodeAt(S-1),i)return!0;for(g=e.tokens.length,f?(I=e.push("ordered_list_open","ol",1),1!==k&&(I.attrs=[["start",k]])):I=e.push("bullet_list_open","ul",1),I.map=_=[r,0],I.markup=String.fromCharCode(b),x=r,F=!1,T=e.md.block.ruler.getRules("list"),w=e.parentType,e.parentType="list";x=v?1:y-h)>4&&(p=1),u=h+p,I=e.push("list_item_open","li",1),I.markup=String.fromCharCode(b),I.map=d=[r,0],C=e.blkIndent,q=e.tight,D=e.tShift[r],A=e.sCount[r],e.blkIndent=u,e.tight=!0,e.tShift[r]=c-e.bMarks[r],e.sCount[r]=y,c>=v&&e.isEmpty(r+1)?e.line=Math.min(e.line+2,t):e.md.block.tokenize(e,r,t,!0),e.tight&&!F||(M=!1),F=e.line-r>1&&e.isEmpty(e.line-1),e.blkIndent=C,e.tShift[r]=D,e.sCount[r]=A,e.tight=q,I=e.push("list_item_close","li",-1),I.markup=String.fromCharCode(b),x=r=e.line,d[1]=x,c=e.bMarks[r],x>=t)break;if(e.sCount[x]3||e.sCount[c]<0)){for(n=!1,s=0,o=l.length;s=4)return!1;if(91!==e.src.charCodeAt(C))return!1;for(;++C3||e.sCount[w]<0)){for(k=!1,p=0,h=v.length;p0&&this.level++,this.tokens.push(n),n},n.prototype.isEmpty=function(e){return this.bMarks[e]+this.tShift[e]>=this.eMarks[e]},n.prototype.skipEmptyLines=function(e){for(var r=this.lineMax;er;)if(!o(this.src.charCodeAt(--e)))return e+1;return e},n.prototype.skipChars=function(e,r){for(var t=this.src.length;et;)if(r!==this.src.charCodeAt(--e))return e+1;return e},n.prototype.getLines=function(e,r,t,n){var s,i,a,c,l,u,p,h=e;if(e>=r)return"";for(u=new Array(r-e),s=0;ht?new Array(i-t+1).join(" ")+this.src.slice(c,l):this.src.slice(c,l)}return u.join("")},n.prototype.Token=s,r.exports=n},{"../common/utils":4,"../token":51}],29:[function(e,r,t){"use strict";function n(e,r){var t=e.bMarks[r]+e.blkIndent,n=e.eMarks[r];return e.src.substr(t,n-t)}function s(e){var r,t=[],n=0,s=e.length,o=0,i=0,a=!1,c=0;for(r=e.charCodeAt(n);nt)return!1;if(p=r+1,e.sCount[p]=4)return!1;if((l=e.bMarks[p]+e.tShift[p])>=e.eMarks[p])return!1;if(124!==(a=e.src.charCodeAt(l++))&&45!==a&&58!==a)return!1;for(;l=4)return!1;if(h=s(c.replace(/^\||\|$/g,"")),(f=h.length)>m.length)return!1;if(i)return!0;for((d=e.push("table_open","table",1)).map=g=[r,0],(d=e.push("thead_open","thead",1)).map=[r,r+1],(d=e.push("tr_open","tr",1)).map=[r,r+1],u=0;u=4);p++){for(h=s(c.replace(/^\||\|$/g,"")),d=e.push("tr_open","tr",1),u=0;u\s]/i.test(e)}function s(e){return/^<\/a\s*>/i.test(e)}var o=e("../common/utils").arrayReplaceAt;r.exports=function(e){var r,t,i,a,c,l,u,p,h,f,d,m,_,g,b,k,v,x=e.tokens;if(e.md.options.linkify)for(t=0,i=x.length;t=0;r--)if("link_close"!==(l=a[r]).type){if("html_inline"===l.type&&(n(l.content)&&_>0&&_--,s(l.content)&&_++),!(_>0)&&"text"===l.type&&e.md.linkify.test(l.content)){for(h=l.content,v=e.md.linkify.match(h),u=[],m=l.level,d=0,p=0;pd&&((c=new e.Token("text","",0)).content=h.slice(d,f),c.level=m,u.push(c)),(c=new e.Token("link_open","a",1)).attrs=[["href",b]],c.level=m++,c.markup="linkify",c.info="auto",u.push(c),(c=new e.Token("text","",0)).content=k,c.level=m,u.push(c),(c=new e.Token("link_close","a",-1)).level=--m,c.markup="linkify",c.info="auto",u.push(c),d=v[p].lastIndex);d=0;r--)"text"!==(t=e[r]).type||s||(t.content=t.content.replace(c,n)),"link_open"===t.type&&"auto"===t.info&&s--,"link_close"===t.type&&"auto"===t.info&&s++}function o(e){var r,t,n=0;for(r=e.length-1;r>=0;r--)"text"!==(t=e[r]).type||n||i.test(t.content)&&(t.content=t.content.replace(/\+-/g,"\xb1").replace(/\.{2,}/g,"\u2026").replace(/([?!])\u2026/g,"$1..").replace(/([?!]){4,}/g,"$1$1$1").replace(/,{2,}/g,",").replace(/(^|[^-])---([^-]|$)/gm,"$1\u2014$2").replace(/(^|\s)--(\s|$)/gm,"$1\u2013$2").replace(/(^|[^-\s])--([^-\s]|$)/gm,"$1\u2013$2")),"link_open"===t.type&&"auto"===t.info&&n--,"link_close"===t.type&&"auto"===t.info&&n++}var i=/\+-|\.\.|\?\?\?\?|!!!!|,,|--/,a=/\((c|tm|r|p)\)/i,c=/\((c|tm|r|p)\)/gi,l={c:"\xa9",r:"\xae",p:"\xa7",tm:"\u2122"};r.exports=function(e){var r;if(e.md.options.typographer)for(r=e.tokens.length-1;r>=0;r--)"inline"===e.tokens[r].type&&(a.test(e.tokens[r].content)&&s(e.tokens[r].children),i.test(e.tokens[r].content)&&o(e.tokens[r].children))}},{}],35:[function(e,r,t){"use strict";function n(e,r,t){return e.substr(0,r)+t+e.substr(r+1)}function s(e,r){var t,s,c,p,h,f,d,m,_,g,b,k,v,x,y,C,A,w,D,q,E;for(D=[],t=0;t=0&&!(D[A].level<=d);A--);if(D.length=A+1,"text"===s.type){h=0,f=(c=s.content).length;e:for(;h=0)_=c.charCodeAt(p.index-1);else for(A=t-1;A>=0;A--)if("text"===e[A].type){_=e[A].content.charCodeAt(e[A].content.length-1);break}if(g=32,h=48&&_<=57&&(C=y=!1),y&&C&&(y=!1,C=k),y||C){if(C)for(A=D.length-1;A>=0&&(m=D[A],!(D[A].level=0;r--)"inline"===e.tokens[r].type&&c.test(e.tokens[r].content)&&s(e.tokens[r].children,e)}},{"../common/utils":4}],36:[function(e,r,t){"use strict";function n(e,r,t){this.src=e,this.env=t,this.tokens=[],this.inlineMode=!1,this.md=r}var s=e("../token");n.prototype.Token=s,r.exports=n},{"../token":51}],37:[function(e,r,t){"use strict";var n=/^<([a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*)>/,s=/^<([a-zA-Z][a-zA-Z0-9+.\-]{1,31}):([^<>\x00-\x20]*)>/;r.exports=function(e,r){var t,o,i,a,c,l,u=e.pos;return 60===e.src.charCodeAt(u)&&!((t=e.src.slice(u)).indexOf(">")<0||(s.test(t)?(o=t.match(s),a=o[0].slice(1,-1),c=e.md.normalizeLink(a),!e.md.validateLink(c)||(r||((l=e.push("link_open","a",1)).attrs=[["href",c]],l.markup="autolink",l.info="auto",(l=e.push("text","",0)).content=e.md.normalizeLinkText(a),(l=e.push("link_close","a",-1)).markup="autolink",l.info="auto"),e.pos+=o[0].length,0)):!n.test(t)||(i=t.match(n),a=i[0].slice(1,-1),c=e.md.normalizeLink("mailto:"+a),!e.md.validateLink(c)||(r||((l=e.push("link_open","a",1)).attrs=[["href",c]],l.markup="autolink",l.info="auto",(l=e.push("text","",0)).content=e.md.normalizeLinkText(a),(l=e.push("link_close","a",-1)).markup="autolink",l.info="auto"),e.pos+=i[0].length,0))))}},{}],38:[function(e,r,t){"use strict";r.exports=function(e,r){var t,n,s,o,i,a,c=e.pos;if(96!==e.src.charCodeAt(c))return!1;for(t=c,c++,n=e.posMax;c=0;){if((s=o[t]).open&&s.marker===n.marker&&s.end<0&&s.level===n.level&&!((s.close||n.open)&&void 0!==s.length&&void 0!==n.length&&(s.length+n.length)%3==0)){n.jump=r-t,n.open=!1,s.end=r,s.jump=0;break}t-=s.jump+1}}},{}],40:[function(e,r,t){"use strict";r.exports.tokenize=function(e,r){var t,n,s=e.pos,o=e.src.charCodeAt(s);if(r)return!1;if(95!==o&&42!==o)return!1;for(n=e.scanDelims(e.pos,42===o),t=0;t=0;r--)95!==(t=a[r]).marker&&42!==t.marker||-1!==t.end&&(n=a[t.end],i=r>0&&a[r-1].end===t.end+1&&a[r-1].token===t.token-1&&a[t.end+1].token===n.token+1&&a[r-1].marker===t.marker,o=String.fromCharCode(t.marker),(s=e.tokens[t.token]).type=i?"strong_open":"em_open",s.tag=i?"strong":"em",s.nesting=1,s.markup=i?o+o:o,s.content="",(s=e.tokens[n.token]).type=i?"strong_close":"em_close",s.tag=i?"strong":"em",s.nesting=-1,s.markup=i?o+o:o,s.content="",i&&(e.tokens[a[r-1].token].content="",e.tokens[a[t.end+1].token].content="",r--))}},{}],41:[function(e,r,t){"use strict";var n=e("../common/entities"),s=e("../common/utils").has,o=e("../common/utils").isValidEntityCode,i=e("../common/utils").fromCodePoint,a=/^&#((?:x[a-f0-9]{1,8}|[0-9]{1,8}));/i,c=/^&([a-z][a-z0-9]{1,31});/i;r.exports=function(e,r){var t,l,u=e.pos,p=e.posMax;if(38!==e.src.charCodeAt(u))return!1;if(u+1?@[]^_`{|}~-".split("").forEach(function(e){s[e.charCodeAt(0)]=1}),r.exports=function(e,r){var t,o=e.pos,i=e.posMax;if(92!==e.src.charCodeAt(o))return!1;if(++o=97&&r<=122}var s=e("../common/html_re").HTML_TAG_RE;r.exports=function(e,r){var t,o,i,a=e.pos;return!!e.md.options.html&&(i=e.posMax,!(60!==e.src.charCodeAt(a)||a+2>=i)&&(!(33!==(t=e.src.charCodeAt(a+1))&&63!==t&&47!==t&&!n(t))&&(!!(o=e.src.slice(a).match(s))&&(r||(e.push("html_inline","",0).content=e.src.slice(a,a+o[0].length)),e.pos+=o[0].length,!0))))}},{"../common/html_re":3}],44:[function(e,r,t){"use strict";var n=e("../common/utils").normalizeReference,s=e("../common/utils").isSpace;r.exports=function(e,r){var t,o,i,a,c,l,u,p,h,f,d,m,_,g="",b=e.pos,k=e.posMax;if(33!==e.src.charCodeAt(e.pos))return!1;if(91!==e.src.charCodeAt(e.pos+1))return!1;if(l=e.pos+2,(c=e.md.helpers.parseLinkLabel(e,e.pos+1,!1))<0)return!1;if((u=c+1)=k)return!1;for(_=u,(h=e.md.helpers.parseLinkDestination(e.src,u,e.posMax)).ok&&(g=e.md.normalizeLink(h.str),e.md.validateLink(g)?u=h.pos:g=""),_=u;u=k||41!==e.src.charCodeAt(u))return e.pos=b,!1;u++}else{if(void 0===e.env.references)return!1;if(u=0?a=e.src.slice(_,u++):u=c+1):u=c+1,a||(a=e.src.slice(l,c)),!(p=e.env.references[n(a)]))return e.pos=b,!1;g=p.href,f=p.title}return r||(i=e.src.slice(l,c),e.md.inline.parse(i,e.md,e.env,m=[]),(d=e.push("image","img",0)).attrs=t=[["src",g],["alt",""]],d.children=m,d.content=i,f&&t.push(["title",f])),e.pos=u,e.posMax=k,!0}},{"../common/utils":4}],45:[function(e,r,t){"use strict";var n=e("../common/utils").normalizeReference,s=e("../common/utils").isSpace;r.exports=function(e,r){var t,o,i,a,c,l,u,p,h,f="",d=e.pos,m=e.posMax,_=e.pos,g=!0;if(91!==e.src.charCodeAt(e.pos))return!1;if(c=e.pos+1,(a=e.md.helpers.parseLinkLabel(e,e.pos,!0))<0)return!1;if((l=a+1)=m)return!1;for(_=l,(u=e.md.helpers.parseLinkDestination(e.src,l,e.posMax)).ok&&(f=e.md.normalizeLink(u.str),e.md.validateLink(f)?l=u.pos:f=""),_=l;l=m||41!==e.src.charCodeAt(l))&&(g=!0),l++}if(g){if(void 0===e.env.references)return!1;if(l=0?i=e.src.slice(_,l++):l=a+1):l=a+1,i||(i=e.src.slice(c,a)),!(p=e.env.references[n(i)]))return e.pos=d,!1;f=p.href,h=p.title}return r||(e.pos=c,e.posMax=a,e.push("link_open","a",1).attrs=t=[["href",f]],h&&t.push(["title",h]),e.md.inline.tokenize(e),e.push("link_close","a",-1)),e.pos=l,e.posMax=m,!0}},{"../common/utils":4}],46:[function(e,r,t){"use strict";var n=e("../common/utils").isSpace;r.exports=function(e,r){var t,s,o=e.pos;if(10!==e.src.charCodeAt(o))return!1;for(t=e.pending.length-1,s=e.posMax,r||(t>=0&&32===e.pending.charCodeAt(t)?t>=1&&32===e.pending.charCodeAt(t-1)?(e.pending=e.pending.replace(/ +$/,""),e.push("hardbreak","br",0)):(e.pending=e.pending.slice(0,-1),e.push("softbreak","br",0)):e.push("softbreak","br",0)),o++;o0&&this.level++,this.pendingLevel=this.level,this.tokens.push(n),n},n.prototype.scanDelims=function(e,r){var t,n,s,c,l,u,p,h,f,d=e,m=!0,_=!0,g=this.posMax,b=this.src.charCodeAt(e);for(t=e>0?this.src.charCodeAt(e-1):32;d=0&&(t=this.attrs[r][1]),t},n.prototype.attrJoin=function(e,r){var t=this.attrIndex(e);t<0?this.attrPush([e,r]):this.attrs[t][1]=this.attrs[t][1]+" "+r},r.exports=n},{}],52:[function(e,r,t){r.exports={Aacute:"\xc1",aacute:"\xe1",Abreve:"\u0102",abreve:"\u0103",ac:"\u223e",acd:"\u223f",acE:"\u223e\u0333",Acirc:"\xc2",acirc:"\xe2",acute:"\xb4",Acy:"\u0410",acy:"\u0430",AElig:"\xc6",aelig:"\xe6",af:"\u2061",Afr:"\ud835\udd04",afr:"\ud835\udd1e",Agrave:"\xc0",agrave:"\xe0",alefsym:"\u2135",aleph:"\u2135",Alpha:"\u0391",alpha:"\u03b1",Amacr:"\u0100",amacr:"\u0101",amalg:"\u2a3f",amp:"&",AMP:"&",andand:"\u2a55",And:"\u2a53",and:"\u2227",andd:"\u2a5c",andslope:"\u2a58",andv:"\u2a5a",ang:"\u2220",ange:"\u29a4",angle:"\u2220",angmsdaa:"\u29a8",angmsdab:"\u29a9",angmsdac:"\u29aa",angmsdad:"\u29ab",angmsdae:"\u29ac",angmsdaf:"\u29ad",angmsdag:"\u29ae",angmsdah:"\u29af",angmsd:"\u2221",angrt:"\u221f",angrtvb:"\u22be",angrtvbd:"\u299d",angsph:"\u2222",angst:"\xc5",angzarr:"\u237c",Aogon:"\u0104",aogon:"\u0105",Aopf:"\ud835\udd38",aopf:"\ud835\udd52",apacir:"\u2a6f",ap:"\u2248",apE:"\u2a70",ape:"\u224a",apid:"\u224b",apos:"'",ApplyFunction:"\u2061",approx:"\u2248",approxeq:"\u224a",Aring:"\xc5",aring:"\xe5",Ascr:"\ud835\udc9c",ascr:"\ud835\udcb6",Assign:"\u2254",ast:"*",asymp:"\u2248",asympeq:"\u224d",Atilde:"\xc3",atilde:"\xe3",Auml:"\xc4",auml:"\xe4",awconint:"\u2233",awint:"\u2a11",backcong:"\u224c",backepsilon:"\u03f6",backprime:"\u2035",backsim:"\u223d",backsimeq:"\u22cd",Backslash:"\u2216",Barv:"\u2ae7",barvee:"\u22bd",barwed:"\u2305",Barwed:"\u2306",barwedge:"\u2305",bbrk:"\u23b5",bbrktbrk:"\u23b6",bcong:"\u224c",Bcy:"\u0411",bcy:"\u0431",bdquo:"\u201e",becaus:"\u2235",because:"\u2235",Because:"\u2235",bemptyv:"\u29b0",bepsi:"\u03f6",bernou:"\u212c",Bernoullis:"\u212c",Beta:"\u0392",beta:"\u03b2",beth:"\u2136",between:"\u226c",Bfr:"\ud835\udd05",bfr:"\ud835\udd1f",bigcap:"\u22c2",bigcirc:"\u25ef",bigcup:"\u22c3",bigodot:"\u2a00",bigoplus:"\u2a01",bigotimes:"\u2a02",bigsqcup:"\u2a06",bigstar:"\u2605",bigtriangledown:"\u25bd",bigtriangleup:"\u25b3",biguplus:"\u2a04",bigvee:"\u22c1",bigwedge:"\u22c0",bkarow:"\u290d",blacklozenge:"\u29eb",blacksquare:"\u25aa",blacktriangle:"\u25b4",blacktriangledown:"\u25be",blacktriangleleft:"\u25c2",blacktriangleright:"\u25b8",blank:"\u2423",blk12:"\u2592",blk14:"\u2591",blk34:"\u2593",block:"\u2588",bne:"=\u20e5",bnequiv:"\u2261\u20e5",bNot:"\u2aed",bnot:"\u2310",Bopf:"\ud835\udd39",bopf:"\ud835\udd53",bot:"\u22a5",bottom:"\u22a5",bowtie:"\u22c8",boxbox:"\u29c9",boxdl:"\u2510",boxdL:"\u2555",boxDl:"\u2556",boxDL:"\u2557",boxdr:"\u250c",boxdR:"\u2552",boxDr:"\u2553",boxDR:"\u2554",boxh:"\u2500",boxH:"\u2550",boxhd:"\u252c",boxHd:"\u2564",boxhD:"\u2565",boxHD:"\u2566",boxhu:"\u2534",boxHu:"\u2567",boxhU:"\u2568",boxHU:"\u2569",boxminus:"\u229f",boxplus:"\u229e",boxtimes:"\u22a0",boxul:"\u2518",boxuL:"\u255b",boxUl:"\u255c",boxUL:"\u255d",boxur:"\u2514",boxuR:"\u2558",boxUr:"\u2559",boxUR:"\u255a",boxv:"\u2502",boxV:"\u2551",boxvh:"\u253c",boxvH:"\u256a",boxVh:"\u256b",boxVH:"\u256c",boxvl:"\u2524",boxvL:"\u2561",boxVl:"\u2562",boxVL:"\u2563",boxvr:"\u251c",boxvR:"\u255e",boxVr:"\u255f",boxVR:"\u2560",bprime:"\u2035",breve:"\u02d8",Breve:"\u02d8",brvbar:"\xa6",bscr:"\ud835\udcb7",Bscr:"\u212c",bsemi:"\u204f",bsim:"\u223d",bsime:"\u22cd",bsolb:"\u29c5",bsol:"\\",bsolhsub:"\u27c8",bull:"\u2022",bullet:"\u2022",bump:"\u224e",bumpE:"\u2aae",bumpe:"\u224f",Bumpeq:"\u224e",bumpeq:"\u224f",Cacute:"\u0106",cacute:"\u0107",capand:"\u2a44",capbrcup:"\u2a49",capcap:"\u2a4b",cap:"\u2229",Cap:"\u22d2",capcup:"\u2a47",capdot:"\u2a40",CapitalDifferentialD:"\u2145",caps:"\u2229\ufe00",caret:"\u2041",caron:"\u02c7",Cayleys:"\u212d",ccaps:"\u2a4d",Ccaron:"\u010c",ccaron:"\u010d",Ccedil:"\xc7",ccedil:"\xe7",Ccirc:"\u0108",ccirc:"\u0109",Cconint:"\u2230",ccups:"\u2a4c",ccupssm:"\u2a50",Cdot:"\u010a",cdot:"\u010b",cedil:"\xb8",Cedilla:"\xb8",cemptyv:"\u29b2",cent:"\xa2",centerdot:"\xb7",CenterDot:"\xb7",cfr:"\ud835\udd20",Cfr:"\u212d",CHcy:"\u0427",chcy:"\u0447",check:"\u2713",checkmark:"\u2713",Chi:"\u03a7",chi:"\u03c7",circ:"\u02c6",circeq:"\u2257",circlearrowleft:"\u21ba",circlearrowright:"\u21bb",circledast:"\u229b",circledcirc:"\u229a",circleddash:"\u229d",CircleDot:"\u2299",circledR:"\xae",circledS:"\u24c8",CircleMinus:"\u2296",CirclePlus:"\u2295",CircleTimes:"\u2297",cir:"\u25cb",cirE:"\u29c3",cire:"\u2257",cirfnint:"\u2a10",cirmid:"\u2aef",cirscir:"\u29c2",ClockwiseContourIntegral:"\u2232",CloseCurlyDoubleQuote:"\u201d",CloseCurlyQuote:"\u2019",clubs:"\u2663",clubsuit:"\u2663",colon:":",Colon:"\u2237",Colone:"\u2a74",colone:"\u2254",coloneq:"\u2254",comma:",",commat:"@",comp:"\u2201",compfn:"\u2218",complement:"\u2201",complexes:"\u2102",cong:"\u2245",congdot:"\u2a6d",Congruent:"\u2261",conint:"\u222e",Conint:"\u222f",ContourIntegral:"\u222e",copf:"\ud835\udd54",Copf:"\u2102",coprod:"\u2210",Coproduct:"\u2210",copy:"\xa9",COPY:"\xa9",copysr:"\u2117",CounterClockwiseContourIntegral:"\u2233",crarr:"\u21b5",cross:"\u2717",Cross:"\u2a2f",Cscr:"\ud835\udc9e",cscr:"\ud835\udcb8",csub:"\u2acf",csube:"\u2ad1",csup:"\u2ad0",csupe:"\u2ad2",ctdot:"\u22ef",cudarrl:"\u2938",cudarrr:"\u2935",cuepr:"\u22de",cuesc:"\u22df",cularr:"\u21b6",cularrp:"\u293d",cupbrcap:"\u2a48",cupcap:"\u2a46",CupCap:"\u224d",cup:"\u222a",Cup:"\u22d3",cupcup:"\u2a4a",cupdot:"\u228d",cupor:"\u2a45",cups:"\u222a\ufe00",curarr:"\u21b7",curarrm:"\u293c",curlyeqprec:"\u22de",curlyeqsucc:"\u22df",curlyvee:"\u22ce",curlywedge:"\u22cf",curren:"\xa4",curvearrowleft:"\u21b6",curvearrowright:"\u21b7",cuvee:"\u22ce",cuwed:"\u22cf",cwconint:"\u2232",cwint:"\u2231",cylcty:"\u232d",dagger:"\u2020",Dagger:"\u2021",daleth:"\u2138",darr:"\u2193",Darr:"\u21a1",dArr:"\u21d3",dash:"\u2010",Dashv:"\u2ae4",dashv:"\u22a3",dbkarow:"\u290f",dblac:"\u02dd",Dcaron:"\u010e",dcaron:"\u010f",Dcy:"\u0414",dcy:"\u0434",ddagger:"\u2021",ddarr:"\u21ca",DD:"\u2145",dd:"\u2146",DDotrahd:"\u2911",ddotseq:"\u2a77",deg:"\xb0",Del:"\u2207",Delta:"\u0394",delta:"\u03b4",demptyv:"\u29b1",dfisht:"\u297f",Dfr:"\ud835\udd07",dfr:"\ud835\udd21",dHar:"\u2965",dharl:"\u21c3",dharr:"\u21c2",DiacriticalAcute:"\xb4",DiacriticalDot:"\u02d9",DiacriticalDoubleAcute:"\u02dd",DiacriticalGrave:"`",DiacriticalTilde:"\u02dc",diam:"\u22c4",diamond:"\u22c4",Diamond:"\u22c4",diamondsuit:"\u2666",diams:"\u2666",die:"\xa8",DifferentialD:"\u2146",digamma:"\u03dd",disin:"\u22f2",div:"\xf7",divide:"\xf7",divideontimes:"\u22c7",divonx:"\u22c7",DJcy:"\u0402",djcy:"\u0452",dlcorn:"\u231e",dlcrop:"\u230d",dollar:"$",Dopf:"\ud835\udd3b",dopf:"\ud835\udd55",Dot:"\xa8",dot:"\u02d9",DotDot:"\u20dc",doteq:"\u2250",doteqdot:"\u2251",DotEqual:"\u2250",dotminus:"\u2238",dotplus:"\u2214",dotsquare:"\u22a1",doublebarwedge:"\u2306",DoubleContourIntegral:"\u222f",DoubleDot:"\xa8",DoubleDownArrow:"\u21d3",DoubleLeftArrow:"\u21d0",DoubleLeftRightArrow:"\u21d4",DoubleLeftTee:"\u2ae4",DoubleLongLeftArrow:"\u27f8",DoubleLongLeftRightArrow:"\u27fa",DoubleLongRightArrow:"\u27f9",DoubleRightArrow:"\u21d2",DoubleRightTee:"\u22a8",DoubleUpArrow:"\u21d1",DoubleUpDownArrow:"\u21d5",DoubleVerticalBar:"\u2225",DownArrowBar:"\u2913",downarrow:"\u2193",DownArrow:"\u2193",Downarrow:"\u21d3",DownArrowUpArrow:"\u21f5",DownBreve:"\u0311",downdownarrows:"\u21ca",downharpoonleft:"\u21c3",downharpoonright:"\u21c2",DownLeftRightVector:"\u2950",DownLeftTeeVector:"\u295e",DownLeftVectorBar:"\u2956",DownLeftVector:"\u21bd",DownRightTeeVector:"\u295f",DownRightVectorBar:"\u2957",DownRightVector:"\u21c1",DownTeeArrow:"\u21a7",DownTee:"\u22a4",drbkarow:"\u2910",drcorn:"\u231f",drcrop:"\u230c",Dscr:"\ud835\udc9f",dscr:"\ud835\udcb9",DScy:"\u0405",dscy:"\u0455",dsol:"\u29f6",Dstrok:"\u0110",dstrok:"\u0111",dtdot:"\u22f1",dtri:"\u25bf",dtrif:"\u25be",duarr:"\u21f5",duhar:"\u296f",dwangle:"\u29a6",DZcy:"\u040f",dzcy:"\u045f",dzigrarr:"\u27ff",Eacute:"\xc9",eacute:"\xe9",easter:"\u2a6e",Ecaron:"\u011a",ecaron:"\u011b",Ecirc:"\xca",ecirc:"\xea",ecir:"\u2256",ecolon:"\u2255",Ecy:"\u042d",ecy:"\u044d",eDDot:"\u2a77",Edot:"\u0116",edot:"\u0117",eDot:"\u2251",ee:"\u2147",efDot:"\u2252",Efr:"\ud835\udd08",efr:"\ud835\udd22",eg:"\u2a9a",Egrave:"\xc8",egrave:"\xe8",egs:"\u2a96",egsdot:"\u2a98",el:"\u2a99",Element:"\u2208",elinters:"\u23e7",ell:"\u2113",els:"\u2a95",elsdot:"\u2a97",Emacr:"\u0112",emacr:"\u0113",empty:"\u2205",emptyset:"\u2205",EmptySmallSquare:"\u25fb",emptyv:"\u2205",EmptyVerySmallSquare:"\u25ab",emsp13:"\u2004",emsp14:"\u2005",emsp:"\u2003",ENG:"\u014a",eng:"\u014b",ensp:"\u2002",Eogon:"\u0118",eogon:"\u0119",Eopf:"\ud835\udd3c",eopf:"\ud835\udd56",epar:"\u22d5",eparsl:"\u29e3",eplus:"\u2a71",epsi:"\u03b5",Epsilon:"\u0395",epsilon:"\u03b5",epsiv:"\u03f5",eqcirc:"\u2256",eqcolon:"\u2255",eqsim:"\u2242",eqslantgtr:"\u2a96",eqslantless:"\u2a95",Equal:"\u2a75",equals:"=",EqualTilde:"\u2242",equest:"\u225f",Equilibrium:"\u21cc",equiv:"\u2261",equivDD:"\u2a78",eqvparsl:"\u29e5",erarr:"\u2971",erDot:"\u2253",escr:"\u212f",Escr:"\u2130",esdot:"\u2250",Esim:"\u2a73",esim:"\u2242",Eta:"\u0397",eta:"\u03b7",ETH:"\xd0",eth:"\xf0",Euml:"\xcb",euml:"\xeb",euro:"\u20ac",excl:"!",exist:"\u2203",Exists:"\u2203",expectation:"\u2130",exponentiale:"\u2147",ExponentialE:"\u2147",fallingdotseq:"\u2252",Fcy:"\u0424",fcy:"\u0444",female:"\u2640",ffilig:"\ufb03",fflig:"\ufb00",ffllig:"\ufb04",Ffr:"\ud835\udd09",ffr:"\ud835\udd23",filig:"\ufb01",FilledSmallSquare:"\u25fc",FilledVerySmallSquare:"\u25aa",fjlig:"fj",flat:"\u266d",fllig:"\ufb02",fltns:"\u25b1",fnof:"\u0192",Fopf:"\ud835\udd3d",fopf:"\ud835\udd57",forall:"\u2200",ForAll:"\u2200",fork:"\u22d4",forkv:"\u2ad9",Fouriertrf:"\u2131",fpartint:"\u2a0d",frac12:"\xbd",frac13:"\u2153",frac14:"\xbc",frac15:"\u2155",frac16:"\u2159",frac18:"\u215b",frac23:"\u2154",frac25:"\u2156",frac34:"\xbe",frac35:"\u2157",frac38:"\u215c",frac45:"\u2158",frac56:"\u215a",frac58:"\u215d",frac78:"\u215e",frasl:"\u2044",frown:"\u2322",fscr:"\ud835\udcbb",Fscr:"\u2131",gacute:"\u01f5",Gamma:"\u0393",gamma:"\u03b3",Gammad:"\u03dc",gammad:"\u03dd",gap:"\u2a86",Gbreve:"\u011e",gbreve:"\u011f",Gcedil:"\u0122",Gcirc:"\u011c",gcirc:"\u011d",Gcy:"\u0413",gcy:"\u0433",Gdot:"\u0120",gdot:"\u0121",ge:"\u2265",gE:"\u2267",gEl:"\u2a8c",gel:"\u22db",geq:"\u2265",geqq:"\u2267",geqslant:"\u2a7e",gescc:"\u2aa9",ges:"\u2a7e",gesdot:"\u2a80",gesdoto:"\u2a82",gesdotol:"\u2a84",gesl:"\u22db\ufe00",gesles:"\u2a94",Gfr:"\ud835\udd0a",gfr:"\ud835\udd24",gg:"\u226b",Gg:"\u22d9",ggg:"\u22d9",gimel:"\u2137",GJcy:"\u0403",gjcy:"\u0453",gla:"\u2aa5",gl:"\u2277",glE:"\u2a92",glj:"\u2aa4",gnap:"\u2a8a",gnapprox:"\u2a8a",gne:"\u2a88",gnE:"\u2269",gneq:"\u2a88",gneqq:"\u2269",gnsim:"\u22e7",Gopf:"\ud835\udd3e",gopf:"\ud835\udd58",grave:"`",GreaterEqual:"\u2265",GreaterEqualLess:"\u22db",GreaterFullEqual:"\u2267",GreaterGreater:"\u2aa2",GreaterLess:"\u2277",GreaterSlantEqual:"\u2a7e",GreaterTilde:"\u2273",Gscr:"\ud835\udca2",gscr:"\u210a",gsim:"\u2273",gsime:"\u2a8e",gsiml:"\u2a90",gtcc:"\u2aa7",gtcir:"\u2a7a",gt:">",GT:">",Gt:"\u226b",gtdot:"\u22d7",gtlPar:"\u2995",gtquest:"\u2a7c",gtrapprox:"\u2a86",gtrarr:"\u2978",gtrdot:"\u22d7",gtreqless:"\u22db",gtreqqless:"\u2a8c",gtrless:"\u2277",gtrsim:"\u2273",gvertneqq:"\u2269\ufe00",gvnE:"\u2269\ufe00",Hacek:"\u02c7",hairsp:"\u200a",half:"\xbd",hamilt:"\u210b",HARDcy:"\u042a",hardcy:"\u044a",harrcir:"\u2948",harr:"\u2194",hArr:"\u21d4",harrw:"\u21ad",Hat:"^",hbar:"\u210f",Hcirc:"\u0124",hcirc:"\u0125",hearts:"\u2665",heartsuit:"\u2665",hellip:"\u2026",hercon:"\u22b9",hfr:"\ud835\udd25",Hfr:"\u210c",HilbertSpace:"\u210b",hksearow:"\u2925",hkswarow:"\u2926",hoarr:"\u21ff",homtht:"\u223b",hookleftarrow:"\u21a9",hookrightarrow:"\u21aa",hopf:"\ud835\udd59",Hopf:"\u210d",horbar:"\u2015",HorizontalLine:"\u2500",hscr:"\ud835\udcbd",Hscr:"\u210b",hslash:"\u210f",Hstrok:"\u0126",hstrok:"\u0127",HumpDownHump:"\u224e",HumpEqual:"\u224f",hybull:"\u2043",hyphen:"\u2010",Iacute:"\xcd",iacute:"\xed",ic:"\u2063",Icirc:"\xce",icirc:"\xee",Icy:"\u0418",icy:"\u0438",Idot:"\u0130",IEcy:"\u0415",iecy:"\u0435",iexcl:"\xa1",iff:"\u21d4",ifr:"\ud835\udd26",Ifr:"\u2111",Igrave:"\xcc",igrave:"\xec",ii:"\u2148",iiiint:"\u2a0c",iiint:"\u222d",iinfin:"\u29dc",iiota:"\u2129",IJlig:"\u0132",ijlig:"\u0133",Imacr:"\u012a",imacr:"\u012b",image:"\u2111",ImaginaryI:"\u2148",imagline:"\u2110",imagpart:"\u2111",imath:"\u0131",Im:"\u2111",imof:"\u22b7",imped:"\u01b5",Implies:"\u21d2",incare:"\u2105",in:"\u2208",infin:"\u221e",infintie:"\u29dd",inodot:"\u0131",intcal:"\u22ba",int:"\u222b",Int:"\u222c",integers:"\u2124",Integral:"\u222b",intercal:"\u22ba",Intersection:"\u22c2",intlarhk:"\u2a17",intprod:"\u2a3c",InvisibleComma:"\u2063",InvisibleTimes:"\u2062",IOcy:"\u0401",iocy:"\u0451",Iogon:"\u012e",iogon:"\u012f",Iopf:"\ud835\udd40",iopf:"\ud835\udd5a",Iota:"\u0399",iota:"\u03b9",iprod:"\u2a3c",iquest:"\xbf",iscr:"\ud835\udcbe",Iscr:"\u2110",isin:"\u2208",isindot:"\u22f5",isinE:"\u22f9",isins:"\u22f4",isinsv:"\u22f3",isinv:"\u2208",it:"\u2062",Itilde:"\u0128",itilde:"\u0129",Iukcy:"\u0406",iukcy:"\u0456",Iuml:"\xcf",iuml:"\xef",Jcirc:"\u0134",jcirc:"\u0135",Jcy:"\u0419",jcy:"\u0439",Jfr:"\ud835\udd0d",jfr:"\ud835\udd27",jmath:"\u0237",Jopf:"\ud835\udd41",jopf:"\ud835\udd5b",Jscr:"\ud835\udca5",jscr:"\ud835\udcbf",Jsercy:"\u0408",jsercy:"\u0458",Jukcy:"\u0404",jukcy:"\u0454",Kappa:"\u039a",kappa:"\u03ba",kappav:"\u03f0",Kcedil:"\u0136",kcedil:"\u0137",Kcy:"\u041a",kcy:"\u043a",Kfr:"\ud835\udd0e",kfr:"\ud835\udd28",kgreen:"\u0138",KHcy:"\u0425",khcy:"\u0445",KJcy:"\u040c",kjcy:"\u045c",Kopf:"\ud835\udd42",kopf:"\ud835\udd5c",Kscr:"\ud835\udca6",kscr:"\ud835\udcc0",lAarr:"\u21da",Lacute:"\u0139",lacute:"\u013a",laemptyv:"\u29b4",lagran:"\u2112",Lambda:"\u039b",lambda:"\u03bb",lang:"\u27e8",Lang:"\u27ea",langd:"\u2991",langle:"\u27e8",lap:"\u2a85",Laplacetrf:"\u2112",laquo:"\xab",larrb:"\u21e4",larrbfs:"\u291f",larr:"\u2190",Larr:"\u219e",lArr:"\u21d0",larrfs:"\u291d",larrhk:"\u21a9",larrlp:"\u21ab",larrpl:"\u2939",larrsim:"\u2973",larrtl:"\u21a2",latail:"\u2919",lAtail:"\u291b",lat:"\u2aab",late:"\u2aad",lates:"\u2aad\ufe00",lbarr:"\u290c",lBarr:"\u290e",lbbrk:"\u2772",lbrace:"{",lbrack:"[",lbrke:"\u298b",lbrksld:"\u298f",lbrkslu:"\u298d",Lcaron:"\u013d",lcaron:"\u013e",Lcedil:"\u013b",lcedil:"\u013c",lceil:"\u2308",lcub:"{",Lcy:"\u041b",lcy:"\u043b",ldca:"\u2936",ldquo:"\u201c",ldquor:"\u201e",ldrdhar:"\u2967",ldrushar:"\u294b",ldsh:"\u21b2",le:"\u2264",lE:"\u2266",LeftAngleBracket:"\u27e8",LeftArrowBar:"\u21e4",leftarrow:"\u2190",LeftArrow:"\u2190",Leftarrow:"\u21d0",LeftArrowRightArrow:"\u21c6",leftarrowtail:"\u21a2",LeftCeiling:"\u2308",LeftDoubleBracket:"\u27e6",LeftDownTeeVector:"\u2961",LeftDownVectorBar:"\u2959",LeftDownVector:"\u21c3",LeftFloor:"\u230a",leftharpoondown:"\u21bd",leftharpoonup:"\u21bc",leftleftarrows:"\u21c7",leftrightarrow:"\u2194",LeftRightArrow:"\u2194",Leftrightarrow:"\u21d4",leftrightarrows:"\u21c6",leftrightharpoons:"\u21cb",leftrightsquigarrow:"\u21ad",LeftRightVector:"\u294e",LeftTeeArrow:"\u21a4",LeftTee:"\u22a3",LeftTeeVector:"\u295a",leftthreetimes:"\u22cb",LeftTriangleBar:"\u29cf",LeftTriangle:"\u22b2",LeftTriangleEqual:"\u22b4",LeftUpDownVector:"\u2951",LeftUpTeeVector:"\u2960",LeftUpVectorBar:"\u2958",LeftUpVector:"\u21bf",LeftVectorBar:"\u2952",LeftVector:"\u21bc",lEg:"\u2a8b",leg:"\u22da",leq:"\u2264",leqq:"\u2266",leqslant:"\u2a7d",lescc:"\u2aa8",les:"\u2a7d",lesdot:"\u2a7f",lesdoto:"\u2a81",lesdotor:"\u2a83",lesg:"\u22da\ufe00",lesges:"\u2a93",lessapprox:"\u2a85",lessdot:"\u22d6",lesseqgtr:"\u22da",lesseqqgtr:"\u2a8b",LessEqualGreater:"\u22da",LessFullEqual:"\u2266",LessGreater:"\u2276",lessgtr:"\u2276",LessLess:"\u2aa1",lesssim:"\u2272",LessSlantEqual:"\u2a7d",LessTilde:"\u2272",lfisht:"\u297c",lfloor:"\u230a",Lfr:"\ud835\udd0f",lfr:"\ud835\udd29",lg:"\u2276",lgE:"\u2a91",lHar:"\u2962",lhard:"\u21bd",lharu:"\u21bc",lharul:"\u296a",lhblk:"\u2584",LJcy:"\u0409",ljcy:"\u0459",llarr:"\u21c7",ll:"\u226a",Ll:"\u22d8",llcorner:"\u231e",Lleftarrow:"\u21da",llhard:"\u296b",lltri:"\u25fa",Lmidot:"\u013f",lmidot:"\u0140",lmoustache:"\u23b0",lmoust:"\u23b0",lnap:"\u2a89",lnapprox:"\u2a89",lne:"\u2a87",lnE:"\u2268",lneq:"\u2a87",lneqq:"\u2268",lnsim:"\u22e6",loang:"\u27ec",loarr:"\u21fd",lobrk:"\u27e6",longleftarrow:"\u27f5",LongLeftArrow:"\u27f5",Longleftarrow:"\u27f8",longleftrightarrow:"\u27f7",LongLeftRightArrow:"\u27f7",Longleftrightarrow:"\u27fa",longmapsto:"\u27fc",longrightarrow:"\u27f6",LongRightArrow:"\u27f6",Longrightarrow:"\u27f9",looparrowleft:"\u21ab",looparrowright:"\u21ac",lopar:"\u2985",Lopf:"\ud835\udd43",lopf:"\ud835\udd5d",loplus:"\u2a2d",lotimes:"\u2a34",lowast:"\u2217",lowbar:"_",LowerLeftArrow:"\u2199",LowerRightArrow:"\u2198",loz:"\u25ca",lozenge:"\u25ca",lozf:"\u29eb",lpar:"(",lparlt:"\u2993",lrarr:"\u21c6",lrcorner:"\u231f",lrhar:"\u21cb",lrhard:"\u296d",lrm:"\u200e",lrtri:"\u22bf",lsaquo:"\u2039",lscr:"\ud835\udcc1",Lscr:"\u2112",lsh:"\u21b0",Lsh:"\u21b0",lsim:"\u2272",lsime:"\u2a8d",lsimg:"\u2a8f",lsqb:"[",lsquo:"\u2018",lsquor:"\u201a",Lstrok:"\u0141",lstrok:"\u0142",ltcc:"\u2aa6",ltcir:"\u2a79",lt:"<",LT:"<",Lt:"\u226a",ltdot:"\u22d6",lthree:"\u22cb",ltimes:"\u22c9",ltlarr:"\u2976",ltquest:"\u2a7b",ltri:"\u25c3",ltrie:"\u22b4",ltrif:"\u25c2",ltrPar:"\u2996",lurdshar:"\u294a",luruhar:"\u2966",lvertneqq:"\u2268\ufe00",lvnE:"\u2268\ufe00",macr:"\xaf",male:"\u2642",malt:"\u2720",maltese:"\u2720",Map:"\u2905",map:"\u21a6",mapsto:"\u21a6",mapstodown:"\u21a7",mapstoleft:"\u21a4",mapstoup:"\u21a5",marker:"\u25ae",mcomma:"\u2a29",Mcy:"\u041c",mcy:"\u043c",mdash:"\u2014",mDDot:"\u223a",measuredangle:"\u2221",MediumSpace:"\u205f",Mellintrf:"\u2133",Mfr:"\ud835\udd10",mfr:"\ud835\udd2a",mho:"\u2127",micro:"\xb5",midast:"*",midcir:"\u2af0",mid:"\u2223",middot:"\xb7",minusb:"\u229f",minus:"\u2212",minusd:"\u2238",minusdu:"\u2a2a",MinusPlus:"\u2213",mlcp:"\u2adb",mldr:"\u2026",mnplus:"\u2213",models:"\u22a7",Mopf:"\ud835\udd44",mopf:"\ud835\udd5e",mp:"\u2213",mscr:"\ud835\udcc2",Mscr:"\u2133",mstpos:"\u223e",Mu:"\u039c",mu:"\u03bc",multimap:"\u22b8",mumap:"\u22b8",nabla:"\u2207",Nacute:"\u0143",nacute:"\u0144",nang:"\u2220\u20d2",nap:"\u2249",napE:"\u2a70\u0338",napid:"\u224b\u0338",napos:"\u0149",napprox:"\u2249",natural:"\u266e",naturals:"\u2115",natur:"\u266e",nbsp:"\xa0",nbump:"\u224e\u0338",nbumpe:"\u224f\u0338",ncap:"\u2a43",Ncaron:"\u0147",ncaron:"\u0148",Ncedil:"\u0145",ncedil:"\u0146",ncong:"\u2247",ncongdot:"\u2a6d\u0338",ncup:"\u2a42",Ncy:"\u041d",ncy:"\u043d",ndash:"\u2013",nearhk:"\u2924",nearr:"\u2197",neArr:"\u21d7",nearrow:"\u2197",ne:"\u2260",nedot:"\u2250\u0338",NegativeMediumSpace:"\u200b",NegativeThickSpace:"\u200b",NegativeThinSpace:"\u200b",NegativeVeryThinSpace:"\u200b",nequiv:"\u2262",nesear:"\u2928",nesim:"\u2242\u0338",NestedGreaterGreater:"\u226b",NestedLessLess:"\u226a",NewLine:"\n",nexist:"\u2204",nexists:"\u2204",Nfr:"\ud835\udd11",nfr:"\ud835\udd2b",ngE:"\u2267\u0338",nge:"\u2271",ngeq:"\u2271",ngeqq:"\u2267\u0338",ngeqslant:"\u2a7e\u0338",nges:"\u2a7e\u0338",nGg:"\u22d9\u0338",ngsim:"\u2275",nGt:"\u226b\u20d2",ngt:"\u226f",ngtr:"\u226f",nGtv:"\u226b\u0338",nharr:"\u21ae",nhArr:"\u21ce",nhpar:"\u2af2",ni:"\u220b",nis:"\u22fc",nisd:"\u22fa",niv:"\u220b",NJcy:"\u040a",njcy:"\u045a",nlarr:"\u219a",nlArr:"\u21cd",nldr:"\u2025",nlE:"\u2266\u0338",nle:"\u2270",nleftarrow:"\u219a",nLeftarrow:"\u21cd",nleftrightarrow:"\u21ae",nLeftrightarrow:"\u21ce",nleq:"\u2270",nleqq:"\u2266\u0338",nleqslant:"\u2a7d\u0338",nles:"\u2a7d\u0338",nless:"\u226e",nLl:"\u22d8\u0338",nlsim:"\u2274",nLt:"\u226a\u20d2",nlt:"\u226e",nltri:"\u22ea",nltrie:"\u22ec",nLtv:"\u226a\u0338",nmid:"\u2224",NoBreak:"\u2060",NonBreakingSpace:"\xa0",nopf:"\ud835\udd5f",Nopf:"\u2115",Not:"\u2aec",not:"\xac",NotCongruent:"\u2262",NotCupCap:"\u226d",NotDoubleVerticalBar:"\u2226",NotElement:"\u2209",NotEqual:"\u2260",NotEqualTilde:"\u2242\u0338",NotExists:"\u2204",NotGreater:"\u226f",NotGreaterEqual:"\u2271",NotGreaterFullEqual:"\u2267\u0338",NotGreaterGreater:"\u226b\u0338",NotGreaterLess:"\u2279",NotGreaterSlantEqual:"\u2a7e\u0338",NotGreaterTilde:"\u2275",NotHumpDownHump:"\u224e\u0338",NotHumpEqual:"\u224f\u0338",notin:"\u2209",notindot:"\u22f5\u0338",notinE:"\u22f9\u0338",notinva:"\u2209",notinvb:"\u22f7",notinvc:"\u22f6",NotLeftTriangleBar:"\u29cf\u0338",NotLeftTriangle:"\u22ea",NotLeftTriangleEqual:"\u22ec",NotLess:"\u226e",NotLessEqual:"\u2270",NotLessGreater:"\u2278",NotLessLess:"\u226a\u0338",NotLessSlantEqual:"\u2a7d\u0338",NotLessTilde:"\u2274",NotNestedGreaterGreater:"\u2aa2\u0338",NotNestedLessLess:"\u2aa1\u0338",notni:"\u220c",notniva:"\u220c",notnivb:"\u22fe",notnivc:"\u22fd",NotPrecedes:"\u2280",NotPrecedesEqual:"\u2aaf\u0338",NotPrecedesSlantEqual:"\u22e0",NotReverseElement:"\u220c",NotRightTriangleBar:"\u29d0\u0338",NotRightTriangle:"\u22eb",NotRightTriangleEqual:"\u22ed",NotSquareSubset:"\u228f\u0338",NotSquareSubsetEqual:"\u22e2",NotSquareSuperset:"\u2290\u0338",NotSquareSupersetEqual:"\u22e3",NotSubset:"\u2282\u20d2",NotSubsetEqual:"\u2288",NotSucceeds:"\u2281",NotSucceedsEqual:"\u2ab0\u0338",NotSucceedsSlantEqual:"\u22e1",NotSucceedsTilde:"\u227f\u0338",NotSuperset:"\u2283\u20d2",NotSupersetEqual:"\u2289",NotTilde:"\u2241",NotTildeEqual:"\u2244",NotTildeFullEqual:"\u2247",NotTildeTilde:"\u2249",NotVerticalBar:"\u2224",nparallel:"\u2226",npar:"\u2226",nparsl:"\u2afd\u20e5",npart:"\u2202\u0338",npolint:"\u2a14",npr:"\u2280",nprcue:"\u22e0",nprec:"\u2280",npreceq:"\u2aaf\u0338",npre:"\u2aaf\u0338",nrarrc:"\u2933\u0338",nrarr:"\u219b",nrArr:"\u21cf",nrarrw:"\u219d\u0338",nrightarrow:"\u219b",nRightarrow:"\u21cf",nrtri:"\u22eb",nrtrie:"\u22ed",nsc:"\u2281",nsccue:"\u22e1",nsce:"\u2ab0\u0338",Nscr:"\ud835\udca9",nscr:"\ud835\udcc3",nshortmid:"\u2224",nshortparallel:"\u2226",nsim:"\u2241",nsime:"\u2244",nsimeq:"\u2244",nsmid:"\u2224",nspar:"\u2226",nsqsube:"\u22e2",nsqsupe:"\u22e3",nsub:"\u2284",nsubE:"\u2ac5\u0338",nsube:"\u2288",nsubset:"\u2282\u20d2",nsubseteq:"\u2288",nsubseteqq:"\u2ac5\u0338",nsucc:"\u2281",nsucceq:"\u2ab0\u0338",nsup:"\u2285",nsupE:"\u2ac6\u0338",nsupe:"\u2289",nsupset:"\u2283\u20d2",nsupseteq:"\u2289",nsupseteqq:"\u2ac6\u0338",ntgl:"\u2279",Ntilde:"\xd1",ntilde:"\xf1",ntlg:"\u2278",ntriangleleft:"\u22ea",ntrianglelefteq:"\u22ec",ntriangleright:"\u22eb",ntrianglerighteq:"\u22ed",Nu:"\u039d",nu:"\u03bd",num:"#",numero:"\u2116",numsp:"\u2007",nvap:"\u224d\u20d2",nvdash:"\u22ac",nvDash:"\u22ad",nVdash:"\u22ae",nVDash:"\u22af",nvge:"\u2265\u20d2",nvgt:">\u20d2",nvHarr:"\u2904",nvinfin:"\u29de",nvlArr:"\u2902",nvle:"\u2264\u20d2",nvlt:"<\u20d2",nvltrie:"\u22b4\u20d2",nvrArr:"\u2903",nvrtrie:"\u22b5\u20d2",nvsim:"\u223c\u20d2",nwarhk:"\u2923",nwarr:"\u2196",nwArr:"\u21d6",nwarrow:"\u2196",nwnear:"\u2927",Oacute:"\xd3",oacute:"\xf3",oast:"\u229b",Ocirc:"\xd4",ocirc:"\xf4",ocir:"\u229a",Ocy:"\u041e",ocy:"\u043e",odash:"\u229d",Odblac:"\u0150",odblac:"\u0151",odiv:"\u2a38",odot:"\u2299",odsold:"\u29bc",OElig:"\u0152",oelig:"\u0153",ofcir:"\u29bf",Ofr:"\ud835\udd12",ofr:"\ud835\udd2c",ogon:"\u02db",Ograve:"\xd2",ograve:"\xf2",ogt:"\u29c1",ohbar:"\u29b5",ohm:"\u03a9",oint:"\u222e",olarr:"\u21ba",olcir:"\u29be",olcross:"\u29bb",oline:"\u203e",olt:"\u29c0",Omacr:"\u014c",omacr:"\u014d",Omega:"\u03a9",omega:"\u03c9",Omicron:"\u039f",omicron:"\u03bf",omid:"\u29b6",ominus:"\u2296",Oopf:"\ud835\udd46",oopf:"\ud835\udd60",opar:"\u29b7",OpenCurlyDoubleQuote:"\u201c",OpenCurlyQuote:"\u2018",operp:"\u29b9",oplus:"\u2295",orarr:"\u21bb",Or:"\u2a54",or:"\u2228",ord:"\u2a5d",order:"\u2134",orderof:"\u2134",ordf:"\xaa",ordm:"\xba",origof:"\u22b6",oror:"\u2a56",orslope:"\u2a57",orv:"\u2a5b",oS:"\u24c8",Oscr:"\ud835\udcaa",oscr:"\u2134",Oslash:"\xd8",oslash:"\xf8",osol:"\u2298",Otilde:"\xd5",otilde:"\xf5",otimesas:"\u2a36",Otimes:"\u2a37",otimes:"\u2297",Ouml:"\xd6",ouml:"\xf6",ovbar:"\u233d",OverBar:"\u203e",OverBrace:"\u23de",OverBracket:"\u23b4",OverParenthesis:"\u23dc",para:"\xb6",parallel:"\u2225",par:"\u2225",parsim:"\u2af3",parsl:"\u2afd",part:"\u2202",PartialD:"\u2202",Pcy:"\u041f",pcy:"\u043f",percnt:"%",period:".",permil:"\u2030",perp:"\u22a5",pertenk:"\u2031",Pfr:"\ud835\udd13",pfr:"\ud835\udd2d",Phi:"\u03a6",phi:"\u03c6",phiv:"\u03d5",phmmat:"\u2133",phone:"\u260e",Pi:"\u03a0",pi:"\u03c0",pitchfork:"\u22d4",piv:"\u03d6",planck:"\u210f",planckh:"\u210e",plankv:"\u210f",plusacir:"\u2a23",plusb:"\u229e",pluscir:"\u2a22",plus:"+",plusdo:"\u2214",plusdu:"\u2a25",pluse:"\u2a72",PlusMinus:"\xb1",plusmn:"\xb1",plussim:"\u2a26",plustwo:"\u2a27",pm:"\xb1",Poincareplane:"\u210c",pointint:"\u2a15",popf:"\ud835\udd61",Popf:"\u2119",pound:"\xa3",prap:"\u2ab7",Pr:"\u2abb",pr:"\u227a",prcue:"\u227c",precapprox:"\u2ab7",prec:"\u227a",preccurlyeq:"\u227c",Precedes:"\u227a",PrecedesEqual:"\u2aaf",PrecedesSlantEqual:"\u227c",PrecedesTilde:"\u227e",preceq:"\u2aaf",precnapprox:"\u2ab9",precneqq:"\u2ab5",precnsim:"\u22e8",pre:"\u2aaf",prE:"\u2ab3",precsim:"\u227e",prime:"\u2032",Prime:"\u2033",primes:"\u2119",prnap:"\u2ab9",prnE:"\u2ab5",prnsim:"\u22e8",prod:"\u220f",Product:"\u220f",profalar:"\u232e",profline:"\u2312",profsurf:"\u2313",prop:"\u221d",Proportional:"\u221d",Proportion:"\u2237",propto:"\u221d",prsim:"\u227e",prurel:"\u22b0",Pscr:"\ud835\udcab",pscr:"\ud835\udcc5",Psi:"\u03a8",psi:"\u03c8",puncsp:"\u2008",Qfr:"\ud835\udd14",qfr:"\ud835\udd2e",qint:"\u2a0c",qopf:"\ud835\udd62",Qopf:"\u211a",qprime:"\u2057",Qscr:"\ud835\udcac",qscr:"\ud835\udcc6",quaternions:"\u210d",quatint:"\u2a16",quest:"?",questeq:"\u225f",quot:'"',QUOT:'"',rAarr:"\u21db",race:"\u223d\u0331",Racute:"\u0154",racute:"\u0155",radic:"\u221a",raemptyv:"\u29b3",rang:"\u27e9",Rang:"\u27eb",rangd:"\u2992",range:"\u29a5",rangle:"\u27e9",raquo:"\xbb",rarrap:"\u2975",rarrb:"\u21e5",rarrbfs:"\u2920",rarrc:"\u2933",rarr:"\u2192",Rarr:"\u21a0",rArr:"\u21d2",rarrfs:"\u291e",rarrhk:"\u21aa",rarrlp:"\u21ac",rarrpl:"\u2945",rarrsim:"\u2974",Rarrtl:"\u2916",rarrtl:"\u21a3",rarrw:"\u219d",ratail:"\u291a",rAtail:"\u291c",ratio:"\u2236",rationals:"\u211a",rbarr:"\u290d",rBarr:"\u290f",RBarr:"\u2910",rbbrk:"\u2773",rbrace:"}",rbrack:"]",rbrke:"\u298c",rbrksld:"\u298e",rbrkslu:"\u2990",Rcaron:"\u0158",rcaron:"\u0159",Rcedil:"\u0156",rcedil:"\u0157",rceil:"\u2309",rcub:"}",Rcy:"\u0420",rcy:"\u0440",rdca:"\u2937",rdldhar:"\u2969",rdquo:"\u201d",rdquor:"\u201d",rdsh:"\u21b3",real:"\u211c",realine:"\u211b",realpart:"\u211c",reals:"\u211d",Re:"\u211c",rect:"\u25ad",reg:"\xae",REG:"\xae",ReverseElement:"\u220b",ReverseEquilibrium:"\u21cb",ReverseUpEquilibrium:"\u296f",rfisht:"\u297d",rfloor:"\u230b",rfr:"\ud835\udd2f",Rfr:"\u211c",rHar:"\u2964",rhard:"\u21c1",rharu:"\u21c0",rharul:"\u296c",Rho:"\u03a1",rho:"\u03c1",rhov:"\u03f1",RightAngleBracket:"\u27e9",RightArrowBar:"\u21e5",rightarrow:"\u2192",RightArrow:"\u2192",Rightarrow:"\u21d2",RightArrowLeftArrow:"\u21c4",rightarrowtail:"\u21a3",RightCeiling:"\u2309",RightDoubleBracket:"\u27e7",RightDownTeeVector:"\u295d",RightDownVectorBar:"\u2955",RightDownVector:"\u21c2",RightFloor:"\u230b",rightharpoondown:"\u21c1",rightharpoonup:"\u21c0",rightleftarrows:"\u21c4",rightleftharpoons:"\u21cc",rightrightarrows:"\u21c9",rightsquigarrow:"\u219d",RightTeeArrow:"\u21a6",RightTee:"\u22a2",RightTeeVector:"\u295b",rightthreetimes:"\u22cc",RightTriangleBar:"\u29d0",RightTriangle:"\u22b3",RightTriangleEqual:"\u22b5",RightUpDownVector:"\u294f",RightUpTeeVector:"\u295c",RightUpVectorBar:"\u2954",RightUpVector:"\u21be",RightVectorBar:"\u2953",RightVector:"\u21c0",ring:"\u02da",risingdotseq:"\u2253",rlarr:"\u21c4",rlhar:"\u21cc",rlm:"\u200f",rmoustache:"\u23b1",rmoust:"\u23b1",rnmid:"\u2aee",roang:"\u27ed",roarr:"\u21fe",robrk:"\u27e7",ropar:"\u2986",ropf:"\ud835\udd63",Ropf:"\u211d",roplus:"\u2a2e",rotimes:"\u2a35",RoundImplies:"\u2970",rpar:")",rpargt:"\u2994",rppolint:"\u2a12",rrarr:"\u21c9",Rrightarrow:"\u21db",rsaquo:"\u203a",rscr:"\ud835\udcc7",Rscr:"\u211b",rsh:"\u21b1",Rsh:"\u21b1",rsqb:"]",rsquo:"\u2019",rsquor:"\u2019",rthree:"\u22cc",rtimes:"\u22ca",rtri:"\u25b9",rtrie:"\u22b5",rtrif:"\u25b8",rtriltri:"\u29ce",RuleDelayed:"\u29f4",ruluhar:"\u2968",rx:"\u211e",Sacute:"\u015a",sacute:"\u015b",sbquo:"\u201a",scap:"\u2ab8",Scaron:"\u0160",scaron:"\u0161",Sc:"\u2abc",sc:"\u227b",sccue:"\u227d",sce:"\u2ab0",scE:"\u2ab4",Scedil:"\u015e",scedil:"\u015f",Scirc:"\u015c",scirc:"\u015d",scnap:"\u2aba",scnE:"\u2ab6",scnsim:"\u22e9",scpolint:"\u2a13",scsim:"\u227f",Scy:"\u0421",scy:"\u0441",sdotb:"\u22a1",sdot:"\u22c5",sdote:"\u2a66",searhk:"\u2925",searr:"\u2198",seArr:"\u21d8",searrow:"\u2198",sect:"\xa7",semi:";",seswar:"\u2929",setminus:"\u2216",setmn:"\u2216",sext:"\u2736",Sfr:"\ud835\udd16",sfr:"\ud835\udd30",sfrown:"\u2322",sharp:"\u266f",SHCHcy:"\u0429",shchcy:"\u0449",SHcy:"\u0428",shcy:"\u0448",ShortDownArrow:"\u2193",ShortLeftArrow:"\u2190",shortmid:"\u2223",shortparallel:"\u2225",ShortRightArrow:"\u2192",ShortUpArrow:"\u2191",shy:"\xad",Sigma:"\u03a3",sigma:"\u03c3",sigmaf:"\u03c2",sigmav:"\u03c2",sim:"\u223c",simdot:"\u2a6a",sime:"\u2243",simeq:"\u2243",simg:"\u2a9e",simgE:"\u2aa0",siml:"\u2a9d",simlE:"\u2a9f",simne:"\u2246",simplus:"\u2a24",simrarr:"\u2972",slarr:"\u2190",SmallCircle:"\u2218",smallsetminus:"\u2216",smashp:"\u2a33",smeparsl:"\u29e4",smid:"\u2223",smile:"\u2323",smt:"\u2aaa",smte:"\u2aac",smtes:"\u2aac\ufe00",SOFTcy:"\u042c",softcy:"\u044c",solbar:"\u233f",solb:"\u29c4",sol:"/",Sopf:"\ud835\udd4a",sopf:"\ud835\udd64",spades:"\u2660",spadesuit:"\u2660",spar:"\u2225",sqcap:"\u2293",sqcaps:"\u2293\ufe00",sqcup:"\u2294",sqcups:"\u2294\ufe00",Sqrt:"\u221a",sqsub:"\u228f",sqsube:"\u2291",sqsubset:"\u228f",sqsubseteq:"\u2291",sqsup:"\u2290",sqsupe:"\u2292",sqsupset:"\u2290",sqsupseteq:"\u2292",square:"\u25a1",Square:"\u25a1",SquareIntersection:"\u2293",SquareSubset:"\u228f",SquareSubsetEqual:"\u2291",SquareSuperset:"\u2290",SquareSupersetEqual:"\u2292",SquareUnion:"\u2294",squarf:"\u25aa",squ:"\u25a1",squf:"\u25aa",srarr:"\u2192",Sscr:"\ud835\udcae",sscr:"\ud835\udcc8",ssetmn:"\u2216",ssmile:"\u2323",sstarf:"\u22c6",Star:"\u22c6",star:"\u2606",starf:"\u2605",straightepsilon:"\u03f5",straightphi:"\u03d5",strns:"\xaf",sub:"\u2282",Sub:"\u22d0",subdot:"\u2abd",subE:"\u2ac5",sube:"\u2286",subedot:"\u2ac3",submult:"\u2ac1",subnE:"\u2acb",subne:"\u228a",subplus:"\u2abf",subrarr:"\u2979",subset:"\u2282",Subset:"\u22d0",subseteq:"\u2286",subseteqq:"\u2ac5",SubsetEqual:"\u2286",subsetneq:"\u228a",subsetneqq:"\u2acb",subsim:"\u2ac7",subsub:"\u2ad5",subsup:"\u2ad3",succapprox:"\u2ab8",succ:"\u227b",succcurlyeq:"\u227d",Succeeds:"\u227b",SucceedsEqual:"\u2ab0",SucceedsSlantEqual:"\u227d",SucceedsTilde:"\u227f",succeq:"\u2ab0",succnapprox:"\u2aba",succneqq:"\u2ab6",succnsim:"\u22e9",succsim:"\u227f",SuchThat:"\u220b",sum:"\u2211",Sum:"\u2211",sung:"\u266a",sup1:"\xb9",sup2:"\xb2",sup3:"\xb3",sup:"\u2283",Sup:"\u22d1",supdot:"\u2abe",supdsub:"\u2ad8",supE:"\u2ac6",supe:"\u2287",supedot:"\u2ac4",Superset:"\u2283",SupersetEqual:"\u2287",suphsol:"\u27c9",suphsub:"\u2ad7",suplarr:"\u297b",supmult:"\u2ac2",supnE:"\u2acc",supne:"\u228b",supplus:"\u2ac0",supset:"\u2283",Supset:"\u22d1",supseteq:"\u2287",supseteqq:"\u2ac6",supsetneq:"\u228b",supsetneqq:"\u2acc",supsim:"\u2ac8",supsub:"\u2ad4",supsup:"\u2ad6",swarhk:"\u2926",swarr:"\u2199",swArr:"\u21d9",swarrow:"\u2199",swnwar:"\u292a",szlig:"\xdf",Tab:"\t",target:"\u2316",Tau:"\u03a4",tau:"\u03c4",tbrk:"\u23b4",Tcaron:"\u0164",tcaron:"\u0165",Tcedil:"\u0162",tcedil:"\u0163",Tcy:"\u0422",tcy:"\u0442",tdot:"\u20db",telrec:"\u2315",Tfr:"\ud835\udd17",tfr:"\ud835\udd31",there4:"\u2234",therefore:"\u2234",Therefore:"\u2234",Theta:"\u0398",theta:"\u03b8",thetasym:"\u03d1",thetav:"\u03d1",thickapprox:"\u2248",thicksim:"\u223c",ThickSpace:"\u205f\u200a",ThinSpace:"\u2009",thinsp:"\u2009",thkap:"\u2248",thksim:"\u223c",THORN:"\xde",thorn:"\xfe",tilde:"\u02dc",Tilde:"\u223c",TildeEqual:"\u2243",TildeFullEqual:"\u2245",TildeTilde:"\u2248",timesbar:"\u2a31",timesb:"\u22a0",times:"\xd7",timesd:"\u2a30",tint:"\u222d",toea:"\u2928",topbot:"\u2336",topcir:"\u2af1",top:"\u22a4",Topf:"\ud835\udd4b",topf:"\ud835\udd65",topfork:"\u2ada",tosa:"\u2929",tprime:"\u2034",trade:"\u2122",TRADE:"\u2122",triangle:"\u25b5",triangledown:"\u25bf",triangleleft:"\u25c3",trianglelefteq:"\u22b4",triangleq:"\u225c",triangleright:"\u25b9",trianglerighteq:"\u22b5",tridot:"\u25ec",trie:"\u225c",triminus:"\u2a3a",TripleDot:"\u20db",triplus:"\u2a39",trisb:"\u29cd",tritime:"\u2a3b",trpezium:"\u23e2",Tscr:"\ud835\udcaf",tscr:"\ud835\udcc9",TScy:"\u0426",tscy:"\u0446",TSHcy:"\u040b",tshcy:"\u045b",Tstrok:"\u0166",tstrok:"\u0167",twixt:"\u226c",twoheadleftarrow:"\u219e",twoheadrightarrow:"\u21a0",Uacute:"\xda",uacute:"\xfa",uarr:"\u2191",Uarr:"\u219f",uArr:"\u21d1",Uarrocir:"\u2949",Ubrcy:"\u040e",ubrcy:"\u045e",Ubreve:"\u016c",ubreve:"\u016d",Ucirc:"\xdb",ucirc:"\xfb",Ucy:"\u0423",ucy:"\u0443",udarr:"\u21c5",Udblac:"\u0170",udblac:"\u0171",udhar:"\u296e",ufisht:"\u297e",Ufr:"\ud835\udd18",ufr:"\ud835\udd32",Ugrave:"\xd9",ugrave:"\xf9",uHar:"\u2963",uharl:"\u21bf",uharr:"\u21be",uhblk:"\u2580",ulcorn:"\u231c",ulcorner:"\u231c",ulcrop:"\u230f",ultri:"\u25f8",Umacr:"\u016a",umacr:"\u016b",uml:"\xa8",UnderBar:"_",UnderBrace:"\u23df",UnderBracket:"\u23b5",UnderParenthesis:"\u23dd",Union:"\u22c3",UnionPlus:"\u228e",Uogon:"\u0172",uogon:"\u0173",Uopf:"\ud835\udd4c",uopf:"\ud835\udd66",UpArrowBar:"\u2912",uparrow:"\u2191",UpArrow:"\u2191",Uparrow:"\u21d1",UpArrowDownArrow:"\u21c5",updownarrow:"\u2195",UpDownArrow:"\u2195",Updownarrow:"\u21d5",UpEquilibrium:"\u296e",upharpoonleft:"\u21bf",upharpoonright:"\u21be",uplus:"\u228e",UpperLeftArrow:"\u2196",UpperRightArrow:"\u2197",upsi:"\u03c5",Upsi:"\u03d2",upsih:"\u03d2",Upsilon:"\u03a5",upsilon:"\u03c5",UpTeeArrow:"\u21a5",UpTee:"\u22a5",upuparrows:"\u21c8",urcorn:"\u231d",urcorner:"\u231d",urcrop:"\u230e",Uring:"\u016e",uring:"\u016f",urtri:"\u25f9",Uscr:"\ud835\udcb0",uscr:"\ud835\udcca",utdot:"\u22f0",Utilde:"\u0168",utilde:"\u0169",utri:"\u25b5",utrif:"\u25b4",uuarr:"\u21c8",Uuml:"\xdc",uuml:"\xfc",uwangle:"\u29a7",vangrt:"\u299c",varepsilon:"\u03f5",varkappa:"\u03f0",varnothing:"\u2205",varphi:"\u03d5",varpi:"\u03d6",varpropto:"\u221d",varr:"\u2195",vArr:"\u21d5",varrho:"\u03f1",varsigma:"\u03c2",varsubsetneq:"\u228a\ufe00",varsubsetneqq:"\u2acb\ufe00",varsupsetneq:"\u228b\ufe00",varsupsetneqq:"\u2acc\ufe00",vartheta:"\u03d1",vartriangleleft:"\u22b2",vartriangleright:"\u22b3",vBar:"\u2ae8",Vbar:"\u2aeb",vBarv:"\u2ae9",Vcy:"\u0412",vcy:"\u0432",vdash:"\u22a2",vDash:"\u22a8",Vdash:"\u22a9",VDash:"\u22ab",Vdashl:"\u2ae6",veebar:"\u22bb",vee:"\u2228",Vee:"\u22c1",veeeq:"\u225a",vellip:"\u22ee",verbar:"|",Verbar:"\u2016",vert:"|",Vert:"\u2016",VerticalBar:"\u2223",VerticalLine:"|",VerticalSeparator:"\u2758",VerticalTilde:"\u2240",VeryThinSpace:"\u200a",Vfr:"\ud835\udd19",vfr:"\ud835\udd33",vltri:"\u22b2",vnsub:"\u2282\u20d2",vnsup:"\u2283\u20d2",Vopf:"\ud835\udd4d",vopf:"\ud835\udd67",vprop:"\u221d",vrtri:"\u22b3",Vscr:"\ud835\udcb1",vscr:"\ud835\udccb",vsubnE:"\u2acb\ufe00",vsubne:"\u228a\ufe00",vsupnE:"\u2acc\ufe00",vsupne:"\u228b\ufe00",Vvdash:"\u22aa",vzigzag:"\u299a",Wcirc:"\u0174",wcirc:"\u0175",wedbar:"\u2a5f",wedge:"\u2227",Wedge:"\u22c0",wedgeq:"\u2259",weierp:"\u2118",Wfr:"\ud835\udd1a",wfr:"\ud835\udd34",Wopf:"\ud835\udd4e",wopf:"\ud835\udd68",wp:"\u2118",wr:"\u2240",wreath:"\u2240",Wscr:"\ud835\udcb2",wscr:"\ud835\udccc",xcap:"\u22c2",xcirc:"\u25ef",xcup:"\u22c3",xdtri:"\u25bd",Xfr:"\ud835\udd1b",xfr:"\ud835\udd35",xharr:"\u27f7",xhArr:"\u27fa",Xi:"\u039e",xi:"\u03be",xlarr:"\u27f5",xlArr:"\u27f8",xmap:"\u27fc",xnis:"\u22fb",xodot:"\u2a00",Xopf:"\ud835\udd4f",xopf:"\ud835\udd69",xoplus:"\u2a01",xotime:"\u2a02",xrarr:"\u27f6",xrArr:"\u27f9",Xscr:"\ud835\udcb3",xscr:"\ud835\udccd",xsqcup:"\u2a06",xuplus:"\u2a04",xutri:"\u25b3",xvee:"\u22c1",xwedge:"\u22c0",Yacute:"\xdd",yacute:"\xfd",YAcy:"\u042f",yacy:"\u044f",Ycirc:"\u0176",ycirc:"\u0177",Ycy:"\u042b",ycy:"\u044b",yen:"\xa5",Yfr:"\ud835\udd1c",yfr:"\ud835\udd36",YIcy:"\u0407",yicy:"\u0457",Yopf:"\ud835\udd50",yopf:"\ud835\udd6a",Yscr:"\ud835\udcb4",yscr:"\ud835\udcce",YUcy:"\u042e",yucy:"\u044e",yuml:"\xff",Yuml:"\u0178",Zacute:"\u0179",zacute:"\u017a",Zcaron:"\u017d",zcaron:"\u017e",Zcy:"\u0417",zcy:"\u0437",Zdot:"\u017b",zdot:"\u017c",zeetrf:"\u2128",ZeroWidthSpace:"\u200b",Zeta:"\u0396",zeta:"\u03b6",zfr:"\ud835\udd37",Zfr:"\u2128",ZHcy:"\u0416",zhcy:"\u0436",zigrarr:"\u21dd",zopf:"\ud835\udd6b",Zopf:"\u2124",Zscr:"\ud835\udcb5",zscr:"\ud835\udccf",zwj:"\u200d",zwnj:"\u200c"}},{}],53:[function(e,r,t){"use strict";function n(e){return Array.prototype.slice.call(arguments,1).forEach(function(r){r&&Object.keys(r).forEach(function(t){e[t]=r[t]})}),e}function s(e){return Object.prototype.toString.call(e)}function o(e){return"[object String]"===s(e)}function i(e){return"[object Object]"===s(e)}function a(e){return"[object RegExp]"===s(e)}function c(e){return"[object Function]"===s(e)}function l(e){return e.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}function u(e){return Object.keys(e||{}).reduce(function(e,r){return e||b.hasOwnProperty(r)},!1)}function p(e){e.__index__=-1,e.__text_cache__=""}function h(e){return function(r,t){var n=r.slice(t);return e.test(n)?n.match(e)[0].length:0}}function f(){return function(e,r){r.normalize(e)}}function d(r){function t(e){return e.replace("%TLDS%",s.src_tlds)}function n(e,r){throw new Error('(LinkifyIt) Invalid schema "'+e+'": '+r)}var s=r.re=e("./lib/re")(r.__opts__),u=r.__tlds__.slice();r.onCompile(),r.__tlds_replaced__||u.push(v),u.push(s.src_xn),s.src_tlds=u.join("|"),s.email_fuzzy=RegExp(t(s.tpl_email_fuzzy),"i"),s.link_fuzzy=RegExp(t(s.tpl_link_fuzzy),"i"),s.link_no_ip_fuzzy=RegExp(t(s.tpl_link_no_ip_fuzzy),"i"),s.host_fuzzy_test=RegExp(t(s.tpl_host_fuzzy_test),"i");var d=[];r.__compiled__={},Object.keys(r.__schemas__).forEach(function(e){var t=r.__schemas__[e];if(null!==t){var s={validate:null,link:null};if(r.__compiled__[e]=s,i(t))return a(t.validate)?s.validate=h(t.validate):c(t.validate)?s.validate=t.validate:n(e,t),void(c(t.normalize)?s.normalize=t.normalize:t.normalize?n(e,t):s.normalize=f());o(t)?d.push(e):n(e,t)}}),d.forEach(function(e){r.__compiled__[r.__schemas__[e]]&&(r.__compiled__[e].validate=r.__compiled__[r.__schemas__[e]].validate,r.__compiled__[e].normalize=r.__compiled__[r.__schemas__[e]].normalize)}),r.__compiled__[""]={validate:null,normalize:f()};var m=Object.keys(r.__compiled__).filter(function(e){return e.length>0&&r.__compiled__[e]}).map(l).join("|");r.re.schema_test=RegExp("(^|(?!_)(?:[><\uff5c]|"+s.src_ZPCc+"))("+m+")","i"),r.re.schema_search=RegExp("(^|(?!_)(?:[><\uff5c]|"+s.src_ZPCc+"))("+m+")","ig"),r.re.pretest=RegExp("("+r.re.schema_test.source+")|("+r.re.host_fuzzy_test.source+")|@","i"),p(r)}function m(e,r){var t=e.__index__,n=e.__last_index__,s=e.__text_cache__.slice(t,n);this.schema=e.__schema__.toLowerCase(),this.index=t+r,this.lastIndex=n+r,this.raw=s,this.text=s,this.url=s}function _(e,r){var t=new m(e,r);return e.__compiled__[t.schema].normalize(t,e),t}function g(e,r){if(!(this instanceof g))return new g(e,r);r||u(e)&&(r=e,e={}),this.__opts__=n({},b,r),this.__index__=-1,this.__last_index__=-1,this.__schema__="",this.__text_cache__="",this.__schemas__=n({},k,e),this.__compiled__={},this.__tlds__=x,this.__tlds_replaced__=!1,this.re={},d(this)}var b={fuzzyLink:!0,fuzzyEmail:!0,fuzzyIP:!1},k={"http:":{validate:function(e,r,t){var n=e.slice(r);return t.re.http||(t.re.http=new RegExp("^\\/\\/"+t.re.src_auth+t.re.src_host_port_strict+t.re.src_path,"i")),t.re.http.test(n)?n.match(t.re.http)[0].length:0}},"https:":"http:","ftp:":"http:","//":{validate:function(e,r,t){var n=e.slice(r);return t.re.no_http||(t.re.no_http=new RegExp("^"+t.re.src_auth+"(?:localhost|(?:(?:"+t.re.src_domain+")\\.)+"+t.re.src_domain_root+")"+t.re.src_port+t.re.src_host_terminator+t.re.src_path,"i")),t.re.no_http.test(n)?r>=3&&":"===e[r-3]?0:r>=3&&"/"===e[r-3]?0:n.match(t.re.no_http)[0].length:0}},"mailto:":{validate:function(e,r,t){var n=e.slice(r);return t.re.mailto||(t.re.mailto=new RegExp("^"+t.re.src_email_name+"@"+t.re.src_host_strict,"i")),t.re.mailto.test(n)?n.match(t.re.mailto)[0].length:0}}},v="a[cdefgilmnoqrstuwxz]|b[abdefghijmnorstvwyz]|c[acdfghiklmnoruvwxyz]|d[ejkmoz]|e[cegrstu]|f[ijkmor]|g[abdefghilmnpqrstuwy]|h[kmnrtu]|i[delmnoqrst]|j[emop]|k[eghimnprwyz]|l[abcikrstuvy]|m[acdeghklmnopqrstuvwxyz]|n[acefgilopruz]|om|p[aefghklmnrstwy]|qa|r[eosuw]|s[abcdeghijklmnortuvxyz]|t[cdfghjklmnortvwz]|u[agksyz]|v[aceginu]|w[fs]|y[et]|z[amw]",x="biz|com|edu|gov|net|org|pro|web|xxx|aero|asia|coop|info|museum|name|shop|\u0440\u0444".split("|");g.prototype.add=function(e,r){return this.__schemas__[e]=r,d(this),this},g.prototype.set=function(e){return this.__opts__=n(this.__opts__,e),this},g.prototype.test=function(e){if(this.__text_cache__=e,this.__index__=-1,!e.length)return!1;var r,t,n,s,o,i,a,c;if(this.re.schema_test.test(e))for((a=this.re.schema_search).lastIndex=0;null!==(r=a.exec(e));)if(s=this.testSchemaAt(e,r[2],a.lastIndex)){this.__schema__=r[2],this.__index__=r.index+r[1].length,this.__last_index__=r.index+r[0].length+s;break}return this.__opts__.fuzzyLink&&this.__compiled__["http:"]&&(c=e.search(this.re.host_fuzzy_test))>=0&&(this.__index__<0||c=0&&null!==(n=e.match(this.re.email_fuzzy))&&(o=n.index+n[1].length,i=n.index+n[0].length,(this.__index__<0||othis.__last_index__)&&(this.__schema__="mailto:",this.__index__=o,this.__last_index__=i)),this.__index__>=0},g.prototype.pretest=function(e){return this.re.pretest.test(e)},g.prototype.testSchemaAt=function(e,r,t){return this.__compiled__[r.toLowerCase()]?this.__compiled__[r.toLowerCase()].validate(e,t,this):0},g.prototype.match=function(e){var r=0,t=[];this.__index__>=0&&this.__text_cache__===e&&(t.push(_(this,r)),r=this.__last_index__);for(var n=r?e.slice(r):e;this.test(n);)t.push(_(this,r)),n=n.slice(this.__last_index__),r+=this.__last_index__;return t.length?t:null},g.prototype.tlds=function(e,r){return e=Array.isArray(e)?e:[e],r?(this.__tlds__=this.__tlds__.concat(e).sort().filter(function(e,r,t){return e!==t[r-1]}).reverse(),d(this),this):(this.__tlds__=e.slice(),this.__tlds_replaced__=!0,d(this),this)},g.prototype.normalize=function(e){e.schema||(e.url="http://"+e.url),"mailto:"!==e.schema||/^mailto:/i.test(e.url)||(e.url="mailto:"+e.url)},g.prototype.onCompile=function(){},r.exports=g},{"./lib/re":54}],54:[function(e,r,t){"use strict";r.exports=function(r){var t={};t.src_Any=e("uc.micro/properties/Any/regex").source,t.src_Cc=e("uc.micro/categories/Cc/regex").source,t.src_Z=e("uc.micro/categories/Z/regex").source,t.src_P=e("uc.micro/categories/P/regex").source,t.src_ZPCc=[t.src_Z,t.src_P,t.src_Cc].join("|"),t.src_ZCc=[t.src_Z,t.src_Cc].join("|");return t.src_pseudo_letter="(?:(?![><\uff5c]|"+t.src_ZPCc+")"+t.src_Any+")",t.src_ip4="(?:(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)",t.src_auth="(?:(?:(?!"+t.src_ZCc+"|[@/\\[\\]()]).)+@)?",t.src_port="(?::(?:6(?:[0-4]\\d{3}|5(?:[0-4]\\d{2}|5(?:[0-2]\\d|3[0-5])))|[1-5]?\\d{1,4}))?",t.src_host_terminator="(?=$|[><\uff5c]|"+t.src_ZPCc+")(?!-|_|:\\d|\\.-|\\.(?!$|"+t.src_ZPCc+"))",t.src_path="(?:[/?#](?:(?!"+t.src_ZCc+"|[><\uff5c]|[()[\\]{}.,\"'?!\\-]).|\\[(?:(?!"+t.src_ZCc+"|\\]).)*\\]|\\((?:(?!"+t.src_ZCc+"|[)]).)*\\)|\\{(?:(?!"+t.src_ZCc+'|[}]).)*\\}|\\"(?:(?!'+t.src_ZCc+'|["]).)+\\"|\\\'(?:(?!'+t.src_ZCc+"|[']).)+\\'|\\'(?="+t.src_pseudo_letter+"|[-]).|\\.{2,3}[a-zA-Z0-9%/]|\\.(?!"+t.src_ZCc+"|[.]).|"+(r&&r["---"]?"\\-(?!--(?:[^-]|$))(?:-*)|":"\\-+|")+"\\,(?!"+t.src_ZCc+").|\\!(?!"+t.src_ZCc+"|[!]).|\\?(?!"+t.src_ZCc+"|[?]).)+|\\/)?",t.src_email_name='[\\-;:&=\\+\\$,\\"\\.a-zA-Z0-9_]+',t.src_xn="xn--[a-z0-9\\-]{1,59}",t.src_domain_root="(?:"+t.src_xn+"|"+t.src_pseudo_letter+"{1,63})",t.src_domain="(?:"+t.src_xn+"|(?:"+t.src_pseudo_letter+")|(?:"+t.src_pseudo_letter+"(?:-(?!-)|"+t.src_pseudo_letter+"){0,61}"+t.src_pseudo_letter+"))",t.src_host="(?:(?:(?:(?:"+t.src_domain+")\\.)*"+t.src_domain+"))",t.tpl_host_fuzzy="(?:"+t.src_ip4+"|(?:(?:(?:"+t.src_domain+")\\.)+(?:%TLDS%)))",t.tpl_host_no_ip_fuzzy="(?:(?:(?:"+t.src_domain+")\\.)+(?:%TLDS%))",t.src_host_strict=t.src_host+t.src_host_terminator,t.tpl_host_fuzzy_strict=t.tpl_host_fuzzy+t.src_host_terminator,t.src_host_port_strict=t.src_host+t.src_port+t.src_host_terminator,t.tpl_host_port_fuzzy_strict=t.tpl_host_fuzzy+t.src_port+t.src_host_terminator,t.tpl_host_port_no_ip_fuzzy_strict=t.tpl_host_no_ip_fuzzy+t.src_port+t.src_host_terminator,t.tpl_host_fuzzy_test="localhost|www\\.|\\.\\d{1,3}\\.|(?:\\.(?:%TLDS%)(?:"+t.src_ZPCc+"|>|$))",t.tpl_email_fuzzy="(^|[><\uff5c]|\\(|"+t.src_ZCc+")("+t.src_email_name+"@"+t.tpl_host_fuzzy_strict+")",t.tpl_link_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|"+t.src_ZPCc+"))((?![$+<=>^`|\uff5c])"+t.tpl_host_port_fuzzy_strict+t.src_path+")",t.tpl_link_no_ip_fuzzy="(^|(?![.:/\\-_@])(?:[$+<=>^`|\uff5c]|"+t.src_ZPCc+"))((?![$+<=>^`|\uff5c])"+t.tpl_host_port_no_ip_fuzzy_strict+t.src_path+")",t}},{"uc.micro/categories/Cc/regex":61,"uc.micro/categories/P/regex":63,"uc.micro/categories/Z/regex":64,"uc.micro/properties/Any/regex":66}],55:[function(e,r,t){"use strict";function n(e){var r,t,n=o[e];if(n)return n;for(n=o[e]=[],r=0;r<128;r++)t=String.fromCharCode(r),n.push(t);for(r=0;r=55296&&c<=57343?"\ufffd\ufffd\ufffd":String.fromCharCode(c),r+=6):240==(248&s)&&r+91114111?l+="\ufffd\ufffd\ufffd\ufffd":(c-=65536,l+=String.fromCharCode(55296+(c>>10),56320+(1023&c))),r+=9):l+="\ufffd";return l})}var o={};s.defaultChars=";/?:@&=+$,#",s.componentChars="",r.exports=s},{}],56:[function(e,r,t){"use strict";function n(e){var r,t,n=o[e];if(n)return n;for(n=o[e]=[],r=0;r<128;r++)t=String.fromCharCode(r),/^[0-9a-z]$/i.test(t)?n.push(t):n.push("%"+("0"+r.toString(16).toUpperCase()).slice(-2));for(r=0;r=55296&&a<=57343){if(a>=55296&&a<=56319&&o+1=56320&&c<=57343){u+=encodeURIComponent(e[o]+e[o+1]),o++;continue}u+="%EF%BF%BD"}else u+=encodeURIComponent(e[o]);return u}var o={};s.defaultChars=";/?:@&=+$,-_.!~*'()#",s.componentChars="-_.!~*'()",r.exports=s},{}],57:[function(e,r,t){"use strict";r.exports=function(e){var r="";return r+=e.protocol||"",r+=e.slashes?"//":"",r+=e.auth?e.auth+"@":"",e.hostname&&-1!==e.hostname.indexOf(":")?r+="["+e.hostname+"]":r+=e.hostname||"",r+=e.port?":"+e.port:"",r+=e.pathname||"",r+=e.search||"",r+=e.hash||""}},{}],58:[function(e,r,t){"use strict";r.exports.encode=e("./encode"),r.exports.decode=e("./decode"),r.exports.format=e("./format"),r.exports.parse=e("./parse")},{"./decode":55,"./encode":56,"./format":57,"./parse":59}],59:[function(e,r,t){"use strict";function n(){this.protocol=null,this.slashes=null,this.auth=null,this.port=null,this.hostname=null,this.hash=null,this.search=null,this.pathname=null}var s=/^([a-z0-9.+-]+:)/i,o=/:[0-9]*$/,i=/^(\/\/?(?!\/)[^\?\s]*)(\?[^\s]*)?$/,a=["<",">",'"',"`"," ","\r","\n","\t"],c=["{","}","|","\\","^","`"].concat(a),l=["'"].concat(c),u=["%","/","?",";","#"].concat(l),p=["/","?","#"],h=/^[+a-z0-9A-Z_-]{0,63}$/,f=/^([+a-z0-9A-Z_-]{0,63})(.*)$/,d={javascript:!0,"javascript:":!0},m={http:!0,https:!0,ftp:!0,gopher:!0,file:!0,"http:":!0,"https:":!0,"ftp:":!0,"gopher:":!0,"file:":!0};n.prototype.parse=function(e,r){var t,n,o,a,c,l=e;if(l=l.trim(),!r&&1===e.split("#").length){var _=i.exec(l);if(_)return this.pathname=_[1],_[2]&&(this.search=_[2]),this}var g=s.exec(l);if(g&&(o=(g=g[0]).toLowerCase(),this.protocol=g,l=l.substr(g.length)),(r||g||l.match(/^\/\/[^@\/]+@[^@\/]+/))&&(!(c="//"===l.substr(0,2))||g&&d[g]||(l=l.substr(2),this.slashes=!0)),!d[g]&&(c||g&&!m[g])){var b=-1;for(t=0;t127?w+="x":w+=A[D];if(!w.match(h)){var E=C.slice(0,t),S=C.slice(t+1),F=A.match(f);F&&(E.push(F[1]),S.unshift(F[2])),S.length&&(l=S.join(".")+l),this.hostname=E.join(".");break}}}}this.hostname.length>255&&(this.hostname=""),y&&(this.hostname=this.hostname.substr(1,this.hostname.length-2))}var L=l.indexOf("#");-1!==L&&(this.hash=l.substr(L),l=l.slice(0,L));var z=l.indexOf("?");return-1!==z&&(this.search=l.substr(z),l=l.slice(0,z)),l&&(this.pathname=l),m[o]&&this.hostname&&!this.pathname&&(this.pathname=""),this},n.prototype.parseHost=function(e){var r=o.exec(e);r&&(":"!==(r=r[0])&&(this.port=r.substr(1)),e=e.substr(0,e.length-r.length)),e&&(this.hostname=e)},r.exports=function(e,r){if(e&&e instanceof n)return e;var t=new n;return t.parse(e,r),t}},{}],60:[function(e,r,t){(function(e){!function(n){function s(e){throw new RangeError(L[e])}function o(e,r){for(var t=e.length,n=[];t--;)n[t]=r(e[t]);return n}function i(e,r){var t=e.split("@"),n="";return t.length>1&&(n=t[0]+"@",e=t[1]),n+o((e=e.replace(F,".")).split("."),r).join(".")}function a(e){for(var r,t,n=[],s=0,o=e.length;s=55296&&r<=56319&&s65535&&(r+=I((e-=65536)>>>10&1023|55296),e=56320|1023&e),r+=I(e)}).join("")}function l(e){return e-48<10?e-22:e-65<26?e-65:e-97<26?e-97:v}function u(e,r){return e+22+75*(e<26)-((0!=r)<<5)}function p(e,r,t){var n=0;for(e=t?T(e/A):e>>1,e+=T(e/r);e>z*y>>1;n+=v)e=T(e/z);return T(n+(z+1)*e/(e+C))}function h(e){var r,t,n,o,i,a,u,h,f,d,m=[],_=e.length,g=0,b=D,C=w;for((t=e.lastIndexOf(q))<0&&(t=0),n=0;n=128&&s("not-basic"),m.push(e.charCodeAt(n));for(o=t>0?t+1:0;o<_;){for(i=g,a=1,u=v;o>=_&&s("invalid-input"),((h=l(e.charCodeAt(o++)))>=v||h>T((k-g)/a))&&s("overflow"),g+=h*a,f=u<=C?x:u>=C+y?y:u-C,!(hT(k/(d=v-f))&&s("overflow"),a*=d;C=p(g-i,r=m.length+1,0==i),T(g/r)>k-b&&s("overflow"),b+=T(g/r),g%=r,m.splice(g++,0,b)}return c(m)}function f(e){var r,t,n,o,i,c,l,h,f,d,m,_,g,b,C,A=[];for(_=(e=a(e)).length,r=D,t=0,i=w,c=0;c<_;++c)(m=e[c])<128&&A.push(I(m));for(n=o=A.length,o&&A.push(q);n<_;){for(l=k,c=0;c<_;++c)(m=e[c])>=r&&mT((k-t)/(g=n+1))&&s("overflow"),t+=(l-r)*g,r=l,c=0;c<_;++c)if((m=e[c])k&&s("overflow"),m==r){for(h=t,f=v;d=f<=i?x:f>=i+y?y:f-i,!(h= 0x80 (not a basic code point)","invalid-input":"Invalid input"},z=v-x,T=Math.floor,I=String.fromCharCode;if(g={version:"1.4.1",ucs2:{decode:a,encode:c},decode:h,encode:f,toASCII:function(e){return i(e,function(e){return S.test(e)?"xn--"+f(e):e})},toUnicode:function(e){return i(e,function(e){return E.test(e)?h(e.slice(4).toLowerCase()):e})}},d&&m)if(r.exports==d)m.exports=g;else for(b in g)g.hasOwnProperty(b)&&(d[b]=g[b]);else n.punycode=g}(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],61:[function(e,r,t){r.exports=/[\0-\x1F\x7F-\x9F]/},{}],62:[function(e,r,t){r.exports=/[\xAD\u0600-\u0605\u061C\u06DD\u070F\u08E2\u180E\u200B-\u200F\u202A-\u202E\u2060-\u2064\u2066-\u206F\uFEFF\uFFF9-\uFFFB]|\uD804\uDCBD|\uD82F[\uDCA0-\uDCA3]|\uD834[\uDD73-\uDD7A]|\uDB40[\uDC01\uDC20-\uDC7F]/},{}],63:[function(e,r,t){r.exports=/[!-#%-\*,-/:;\?@\[-\]_\{\}\xA1\xA7\xAB\xB6\xB7\xBB\xBF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u0AF0\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166D\u166E\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205E\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E44\u3001-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]|\uD800[\uDD00-\uDD02\uDF9F\uDFD0]|\uD801\uDD6F|\uD802[\uDC57\uDD1F\uDD3F\uDE50-\uDE58\uDE7F\uDEF0-\uDEF6\uDF39-\uDF3F\uDF99-\uDF9C]|\uD804[\uDC47-\uDC4D\uDCBB\uDCBC\uDCBE-\uDCC1\uDD40-\uDD43\uDD74\uDD75\uDDC5-\uDDC9\uDDCD\uDDDB\uDDDD-\uDDDF\uDE38-\uDE3D\uDEA9]|\uD805[\uDC4B-\uDC4F\uDC5B\uDC5D\uDCC6\uDDC1-\uDDD7\uDE41-\uDE43\uDE60-\uDE6C\uDF3C-\uDF3E]|\uD807[\uDC41-\uDC45\uDC70\uDC71]|\uD809[\uDC70-\uDC74]|\uD81A[\uDE6E\uDE6F\uDEF5\uDF37-\uDF3B\uDF44]|\uD82F\uDC9F|\uD836[\uDE87-\uDE8B]|\uD83A[\uDD5E\uDD5F]/},{}],64:[function(e,r,t){r.exports=/[ \xA0\u1680\u2000-\u200A\u202F\u205F\u3000]/},{}],65:[function(e,r,t){"use strict";t.Any=e("./properties/Any/regex"),t.Cc=e("./categories/Cc/regex"),t.Cf=e("./categories/Cf/regex"),t.P=e("./categories/P/regex"),t.Z=e("./categories/Z/regex")},{"./categories/Cc/regex":61,"./categories/Cf/regex":62,"./categories/P/regex":63,"./categories/Z/regex":64,"./properties/Any/regex":66}],66:[function(e,r,t){r.exports=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/},{}],67:[function(e,r,t){"use strict";r.exports=e("./lib/")},{"./lib/":9}]},{},[67])(67)}); From a8da26077435c30218e3c1bd057d78f54cdbb576 Mon Sep 17 00:00:00 2001 From: longze chen Date: Thu, 3 May 2018 00:03:51 -0400 Subject: [PATCH 2/5] MD renderer drops python markdown - Instead of sending the HTML rendered by python markdown, MD renderer passes the WB download URL directly to the template. - Direct-to-wb replaces through-renderer as the new dispatch type. --- mfr/extensions/md/render.py | 18 +++--------------- 1 file changed, 3 insertions(+), 15 deletions(-) diff --git a/mfr/extensions/md/render.py b/mfr/extensions/md/render.py index 792f07256..f91a8fc7d 100644 --- a/mfr/extensions/md/render.py +++ b/mfr/extensions/md/render.py @@ -1,20 +1,11 @@ import os -import markdown -from markdown.extensions import Extension - from mako.lookup import TemplateLookup -from mfr.core import extension - - -class EscapeHtml(Extension): - def extendMarkdown(self, md, md_globals): - del md.preprocessors['html_block'] - del md.inlinePatterns['html'] +from mfr.core.extension import BaseRenderer -class MdRenderer(extension.BaseRenderer): +class MdRenderer(BaseRenderer): TEMPLATE = TemplateLookup( directories=[ @@ -23,13 +14,10 @@ class MdRenderer(extension.BaseRenderer): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.metrics.add('markdown_version', markdown.version) def render(self): """Render a markdown file to html.""" - with open(self.file_path, 'r') as fp: - body = markdown.markdown(fp.read(), extensions=[EscapeHtml()]) - return self.TEMPLATE.render(base=self.assets_url, body=body) + return self.TEMPLATE.render(base=self.assets_url, url=self.metadata.download_url) @property def file_required(self): From a66e702c8a2190d5163ce1b4f85923d0355c21e1 Mon Sep 17 00:00:00 2001 From: longze chen Date: Thu, 3 May 2018 00:08:54 -0400 Subject: [PATCH 3/5] Render MD files at the frontend, similar to OSF - MFR frontend makes XHR to fetch the raw content directly from WB with CORS enforced. Markdownit and its plugins sanitize and render the content before updating the MFR viewer. --- mfr/extensions/md/templates/viewer.mako | 76 +++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 5 deletions(-) diff --git a/mfr/extensions/md/templates/viewer.mako b/mfr/extensions/md/templates/viewer.mako index d7e166caf..5cf26dbf7 100644 --- a/mfr/extensions/md/templates/viewer.mako +++ b/mfr/extensions/md/templates/viewer.mako @@ -1,8 +1,74 @@ - - -
    -${body} -
    + + + + + +## Quirks: +## +## ``markdownit`` and its plugins take in teh raw MD content and outputs renderable HTML that can be +## directly embedded. However, for security conerns, MFR mustn't put the raw content onto the page. +## It uses XMLHttpRequest to fetch the file content from WB and let ``markdownit`` santize and parse +## it into the renderable HTML. +## +## Cross Origin Resource Sharing (CORS) is enforced for the XMLHttpRequest. One one hand, WB has +## already been configured to respond with header "Access-Control-Allow-Origin", which allows the +## MFR domain. On the other hand, OSF hasn't. This is why the request must goes to WB directly. +## +
    + + + + + + +## Note Loading markdown-it.min.js from CDN does not work + + + + + + + + + + From 044ab11b75d2436c4937b48bd0bf1e91f9686fe5 Mon Sep 17 00:00:00 2001 From: longze chen Date: Thu, 3 May 2018 00:24:17 -0400 Subject: [PATCH 4/5] Add a README for the MD renderer explaining quirks --- mfr/extensions/md/README.md | 41 +++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 mfr/extensions/md/README.md diff --git a/mfr/extensions/md/README.md b/mfr/extensions/md/README.md new file mode 100644 index 000000000..28f1e2c89 --- /dev/null +++ b/mfr/extensions/md/README.md @@ -0,0 +1,41 @@ +## Using Markdown-it with plugins + +If we had `npm`, here were the would-be configuration. + +```bash +npm markdown-it@8.4.0 +npm install @centerforopenscience/markdown-it-toc@1.1.1 +npm install markdown-it-highlightjs@3.0.0 +npm install markdown-it-ins-del@0.1.1 +npm install markdown-it-sanitizer@0.4.3 +npm install markdown-it-mathjax@2.0.0 +``` + +For MFR, a customized local copy of each script is stored in the extension's static folder. There are a few issues: + +* MFR scripts run directly in the browser without Babel. For ES5 compatibility, developers must use [Babel](https://babeljs.io/repl/) to convert ES6 `markdown-it-highlightjs` to an ES5 version. + +* MFR does not use a package manager. Thus, `require` is **NOT** available. For the `viewer.mako` to be able to load these libraries, customization is necessary to export via `root.`. The main script in the `viewer.mako` uses `window.` to access them. `markdown-it` and `markdown-it-sanitizer` are already set up to be exported code. MFR loads the `min` version directly. `markdown-it-toc`, `markdown-it-highlightjs`, `markdown-it-ins-del` and `markdown-it-mathjax` are not. The following wrapper must be used. + + ```javascript + (function (root, factory) { + if (typeof exports === "object") { + module.exports = factory(); + } else { + root. = factory(); + } + }) (this, function () { + return function(md/*, optional arguments*/) { + /* library code */ + } + }); + ``` + +Here is a list of the original copies of the scripts: + +* [markdown-it@08.4.0](https://github.com/markdown-it/markdown-it/blob/8.4.0/bin/markdown-it.js) +* [markdown-it-sanitizer@0.4.3](https://github.com/svbergerem/markdown-it-sanitizer/blob/v0.4.3/dist/markdown-it-sanitizer.min.js) +* [markdown-it-mathjax@2.0.0](https://github.com/classeur/markdown-it-mathjax/blob/v2.0.0/markdown-it-mathjax.js) +* [markdown-it-toc@1.1.1](https://github.com/cos-forks/markdown-it-toc/blob/1.1.1/index.js) +* [markdown-it-ins-del@1.0.0](https://github.com/brianjgeiger/markdown-it-ins-del/blob/1.0.0/index.js) +* [markdown-it-higlightjs@3.0.0](https://github.com/cslzchen/markdown-it-highlightjs/blob/release/3.0.0/index.es5.js) From 5e4f4fd30040c906f2f24434d6b31c59c08614be Mon Sep 17 00:00:00 2001 From: longze chen Date: Thu, 3 May 2018 09:56:37 -0400 Subject: [PATCH 5/5] Update tests for the new MD renderer Empty __init__.py and unused fixtures/files are removed. The new test only verifies the download url. The acutual render process is done in the browser. --- tests/extensions/md/__init__.py | 0 tests/extensions/md/files/invalid.md | Bin 78396 -> 0 bytes tests/extensions/md/test_renderer.py | 60 ++++++--------------------- 3 files changed, 12 insertions(+), 48 deletions(-) delete mode 100644 tests/extensions/md/__init__.py delete mode 100644 tests/extensions/md/files/invalid.md diff --git a/tests/extensions/md/__init__.py b/tests/extensions/md/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/extensions/md/files/invalid.md b/tests/extensions/md/files/invalid.md deleted file mode 100644 index c59f175ed65dbda596d01a7705b15f9bf8ce6597..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78396 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

    R|01!swXJq#X=} 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 diff --git a/tests/extensions/md/test_renderer.py b/tests/extensions/md/test_renderer.py index cf83ff13a..f11734dd8 100644 --- a/tests/extensions/md/test_renderer.py +++ b/tests/extensions/md/test_renderer.py @@ -1,4 +1,5 @@ import os + import pytest from mfr.core.provider import ProviderMetadata @@ -6,7 +7,7 @@ @pytest.fixture -def metadata(): +def provider_metadata(): return ProviderMetadata('test', '.md', 'text/plain', '1234', 'http://wb.osf.io/file/test.md?token=1234') @@ -15,10 +16,6 @@ def test_md_file_path(): return os.path.join(os.path.dirname(os.path.abspath(__file__)), 'files', 'test.md') -@pytest.fixture -def invalid_md_file_path(): - return os.path.join(os.path.dirname(os.path.abspath(__file__)), 'files', 'invalid.md') - @pytest.fixture def url(): return 'http://osf.io/file/test.md' @@ -35,51 +32,18 @@ def export_url(): @pytest.fixture -def renderer(metadata, test_md_file_path, url, assets_url, export_url): - return MdRenderer(metadata, test_md_file_path, url, assets_url, export_url) +def mock_renderer(provider_metadata, test_md_file_path, url, assets_url, export_url): + return MdRenderer(provider_metadata, test_md_file_path, url, assets_url, export_url) class TestMdRenderer: - def test_render_md_file_required(self, renderer): - assert renderer.file_required is True - - def test_render_md_cache_result(self, renderer): - assert renderer.cache_result is True - - def test_render_md(self, test_md_file_path, assets_url, export_url): - metadata = ProviderMetadata('test', '.md', 'text/plain', '1234', 'http://wb.osf.io/file/test.md?token=1234') - renderer = MdRenderer(metadata, test_md_file_path, url, assets_url, export_url) - body = renderer.render() - inbody = """ -

    Heading

    -

    Sub-heading

    -

    Another deeper heading

    -

    Paragraphs are separated -by a blank line.

    -

    Leave 2 spaces at the end of a line to do a
    -line break

    -

    Text attributes italic, bold, -monospace.

    -

    A link. -[28]

    -

    Shopping list:

    -
      -
    • apples
    • -
    • oranges
    • -
    • pears
    • -
    -

    Numbered list:

    -
      -
    1. apples
    2. -
    3. oranges
    4. -
    5. pears
    6. -
    -

    The rain---not the reign---in -Spain.

    -

    <script> -alert("Hello world"); -</script>

    -""" - assert inbody in body + def test_render_md_file_required(self, mock_renderer): + assert mock_renderer.file_required is True + + def test_render_md_cache_result(self, mock_renderer): + assert mock_renderer.cache_result is True + def test_render_md(self, mock_renderer): + body = mock_renderer.render() + assert mock_renderer.metadata.download_url in body