From 35d3bd1647d68c0f7c5f90e5f0d69092593be4e7 Mon Sep 17 00:00:00 2001
From: "cinwell.li"
Date: Tue, 29 Nov 2016 01:07:47 +0800
Subject: [PATCH] customize sidebar and navbar via markdown file, #6 (#8)
* Refactor: use iife
* Feat: customize sidebar and navbar via markdown file, #6
* Add changelog
---
CHANGELOG.md | 8 +-
build/build.js | 5 +-
docs/README.md | 57 +++++
docs/zh-cn.md | 60 +++++
lib/docsify.js | 404 +++++++++++++++++++-------------
lib/docsify.min.js | 2 +-
lib/themes/vue.css | 2 +-
src/ajax.js | 17 --
src/{bind-event.js => event.js} | 27 ++-
src/gen-toc.js | 44 ----
src/index.js | 113 ++++-----
src/render.js | 78 ++++--
src/tpl.js | 51 ++++
src/util.js | 68 ++++++
themes/buble.css | 8 +-
themes/vue.css | 14 +-
16 files changed, 625 insertions(+), 333 deletions(-)
delete mode 100644 src/ajax.js
rename src/{bind-event.js => event.js} (64%)
delete mode 100644 src/gen-toc.js
create mode 100644 src/tpl.js
create mode 100644 src/util.js
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c6a5869a..a21a9ac7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,9 +1,13 @@
+## 0.5.0
+### Features
+- Custom sidebars and navbars by markdown file
+
## 0.4.2
-## Bug fixes
+### Bug fixes
- Correct catch ajax error
## 0.4.1
-## Bug fixes
+### Bug fixes
- catch ajax error
## 0.4.0
diff --git a/build/build.js b/build/build.js
index b6862edf..f8a69229 100644
--- a/build/build.js
+++ b/build/build.js
@@ -15,11 +15,14 @@ var build = function (opts) {
console.log(dest)
bundle.write({
- format: 'umd',
+ format: 'iife',
moduleName: opts.moduleName || 'Docsify',
dest: dest
})
})
+ .catch(function (err) {
+ console.error(err)
+ })
}
build({
diff --git a/docs/README.md b/docs/README.md
index 5b439d33..1be47040 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -144,3 +144,60 @@ Custom sidebar. if it'set, the TOC will be disabeld. Bind global variables on th
```
+
+#### load-sidebar
+
+Load sidebar markdown file. If it is configured, load the current directory `_sidebar.md` by default. If the file isn't exist, sidebar will appear TOC.
+
+```html
+
+```
+
+You can specify a file:
+
+```html
+
+```
+
+The contents of the file can be:
+
+```markdown
+- [Home](/)
+- [Installation](/installation)
+- Essentials
+ - [Getting Started](/getting-started)
+ - [Dynamic Route Matching](/dynamic-matching)
+ - [Nested Routes](/nested-routes)
+ - [Programmatic Navigation](/navigation)
+ - [Named Routes](/named-routes)
+ - [Named Views](/named-views)
+ - [Redirect and Alias](/redirect-and-alias)
+ - [HTML5 History Mode](/history-mode)
+```
+
+#### load-navbar
+
+Load navbar markdown file. If it is configured, load the current directory `_navbar.md` by default.
+
+```html
+
+```
+
+You can specify a file:
+
+```html
+
+```
+
+The contents of the file can be:
+
+```markdown
+- [en](/)
+- [chinese](/zh-cn)
+```
+
+## FAQ
+
+### Why use `404.html` instead of `index.html`
+
+[issues/7](https://github.com/QingWei-Li/docsify/issues/7)
diff --git a/docs/zh-cn.md b/docs/zh-cn.md
index 7c1baa7e..a664c4e2 100644
--- a/docs/zh-cn.md
+++ b/docs/zh-cn.md
@@ -142,3 +142,63 @@ docsify serve docs
```
+#### load-sidebar
+
+读取侧边栏配置文件,如果配置,默认加载当前目录下的 `_sidebar.md`。如果文件不存在,会显示 TOC 作为侧边栏内容。如果你有二级目录,也应该放置一份配置文件。
+
+```html
+
+```
+
+你可以指定侧边栏文件名
+
+```html
+
+```
+
+`_sidebar.md` 的内容可以是这样的
+
+```markdown
+- [Home](/)
+- [Installation](/installation)
+- Essentials
+ - [Getting Started](/getting-started)
+ - [Dynamic Route Matching](/dynamic-matching)
+ - [Nested Routes](/nested-routes)
+ - [Programmatic Navigation](/navigation)
+ - [Named Routes](/named-routes)
+ - [Named Views](/named-views)
+ - [Redirect and Alias](/redirect-and-alias)
+ - [HTML5 History Mode](/history-mode)
+```
+
+#### load-navbar
+
+读取导航配置文件,如果配置,默认加载当前目录下的 `_navbar.md`。如果文件不存在,会显示 html 里定义的导航栏。
+
+```html
+
+```
+
+你可以指定导航栏文件名
+
+```html
+
+```
+
+`_navbar.md` 的内容可以是这样
+
+```markdown
+- [en](/)
+- [中文](/zh-cn)
+```
+
+## FAQ
+
+### 为什么是 `404.html` 而不用 `index.html`
+
+docsify 想要实现的是用最简单的方式 **动态渲染内容**。
+
+例如我有两个文档分别为 `README.md` 和 `guide.md`,如果我用 `index.html` 作为文件名,`README.md` 可以被正确的渲染因为我们已经规定它为首页文件,但是如果我们访问 `my-domain.com/guide` 想要得到的结果是 `guide.md` 的内容,它将无法工作,因为目录下并不存在一个 `guide.html` 的文件。
+
+但是 GitHub Pages 服务器找不到资源, 就会回退并渲染 `404.html` 文件。😄
diff --git a/lib/docsify.js b/lib/docsify.js
index 38301bf8..4057936e 100644
--- a/lib/docsify.js
+++ b/lib/docsify.js
@@ -1,28 +1,80 @@
-(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
- typeof define === 'function' && define.amd ? define(factory) :
- (global.Docsify = factory());
-}(this, (function () { 'use strict';
+var Docsify = (function () {
+'use strict';
-var ajax = function (url, options) {
- if ( options === void 0 ) options = {};
+/**
+ * Simple ajax
+ * @param {String} url
+ * @param {String} [method=get]
+ * @return {Promise}
+ */
+function load (url, method) {
+ if ( method === void 0 ) method = 'get';
var xhr = new XMLHttpRequest();
- xhr.open(options.method || 'get', url);
+ xhr.open(method, url);
xhr.send();
return {
- then: function (cb) {
- xhr.addEventListener('load', cb);
- return this
- },
- catch: function (cb) {
- xhr.addEventListener('error', cb);
- return this
+ then: function (success, error) {
+ if ( error === void 0 ) error = function () {};
+
+ xhr.addEventListener('error', error);
+ xhr.addEventListener('load', function (ref) {
+ var target = ref.target;
+
+ target.status >= 400 ? error(target) : success(target.response);
+ });
}
}
-};
+}
+
+/**
+ * gen toc tree
+ * @link https://github.com/killercup/grock/blob/5280ae63e16c5739e9233d9009bc235ed7d79a50/styles/solarized/assets/js/behavior.coffee#L54-L81
+ * @param {Array} toc
+ * @param {Number} maxLevel
+ * @return {Array}
+ */
+function genTree (toc, maxLevel) {
+ var headlines = [];
+ var last = {};
+
+ toc.forEach(function (headline) {
+ var level = headline.level || 1;
+ var len = level - 1;
+
+ if (level > maxLevel) { return }
+ if (last[len]) {
+ last[len].children = last[len].children || [];
+ last[len].children.push(headline);
+ } else {
+ headlines.push(headline);
+ }
+ last[level] = headline;
+ });
+
+ return headlines
+}
+
+/**
+ * camel to kebab
+ * @link https://github.com/bokuweb/kebab2camel/blob/master/index.js
+ * @param {String} str
+ * @return {String}
+ */
+function camel2kebab (str) {
+ return str.replace(/([A-Z])/g, function (m) { return '-' + m.toLowerCase(); })
+}
+
+/**
+ * is nil
+ * @param {Object} object
+ * @return {Boolean}
+ */
+function isNil (o) {
+ return o === null || o === undefined
+}
var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
@@ -2119,96 +2171,52 @@ Prism.languages.js = Prism.languages.javascript;
});
/**
- * @link from https://github.com/killercup/grock/blob/5280ae63e16c5739e9233d9009bc235ed7d79a50/styles/solarized/assets/js/behavior.coffee#L54-L81
+ * Render github corner
+ * @param {Object} data
+ * @return {String}
*/
-var tocToTree = function (toc, maxLevel) {
- var headlines = [];
- var last = {};
+function corner (data) {
+ if (!data) { return '' }
+ if (!/\/\//.test(data)) { data = 'https://github.com/' + data; }
- toc.forEach(function (headline) {
- var level = headline.level || 1;
- var len = level - 1;
+ return ("\n \n \n ")
+}
- if (level > maxLevel) { return }
- if (last[len]) {
- last[len].children = last[len].children || [];
- last[len].children.push(headline);
- } else {
- headlines.push(headline);
- }
- last[level] = headline;
- });
+/**
+ * Render main content
+ * @return {[type]} [description]
+ */
+function main () {
+ return "\n \n \n "
+}
- return headlines
-};
-
-var buildHeadlinesTree = function (tree, tpl) {
+/**
+ * Render tree
+ * @param {Array} tree
+ * @param {String} tpl
+ * @return {String}
+ */
+function tree (toc, tpl) {
if ( tpl === void 0 ) tpl = '';
- if (!tree || !tree.length) { return '' }
+ if (!toc || !toc.length) { return '' }
- tree.forEach(function (node) {
+ toc.forEach(function (node) {
tpl += "" + (node.title) + "";
if (node.children) {
- tpl += "" + (buildHeadlinesTree(node.children)) + "
";
+ tpl += "" + (tree(node.children)) + "
";
}
});
return tpl
-};
-
-var genToc = function (toc, opts) {
- var tree = Array.isArray(opts.sidebar)
- ? opts.sidebar
- : tocToTree(toc, opts['max-level']);
-
- return buildHeadlinesTree(tree, '')
-};
-
-var cornerTpl = "\n \n \n \n";
-var toc = [];
-var renderer = new marked.Renderer();
+}
/**
- * render anchor tag
- * @link https://github.com/chjj/marked#overriding-renderer-methods
+ * Active sidebar when scroll
+ * @link https://buble.surge.sh/
*/
-renderer.heading = function (text, level) {
- var slug = text.replace(/<(?:.|\n)*?>/gm, '').toLowerCase().replace(/[\s\n\t]+/g, '-');
-
- toc.push({ level: level, slug: '#' + slug, title: text });
-
- return ("" + text + "")
-};
-
-// highlight code
-renderer.code = function (code, lang) {
- if ( lang === void 0 ) lang = '';
-
- var hl = prism.highlight(code, prism.languages[lang] || prism.languages.markup);
-
- return ("
" + hl + "
")
-};
-marked.setOptions({ renderer: renderer });
-
-var render = function (content, opts) {
- if ( opts === void 0 ) opts = {};
-
- var corner = '';
-
- if (opts.repo) {
- var repo = /\/\//.test(opts.repo) ? opts.repo : ('https://github.com/' + opts.repo);
- corner = cornerTpl.replace(/{{repo}}/g, repo);
- }
-
- var section = "\n " + (marked(content)) + "\n ";
- var sidebar = "";
-
- return (corner + "" + sidebar + section + "")
-};
-
-function scrollActiveSidebar (isCustom) {
- if (/mobile/i.test(navigator.userAgent) || isCustom) { return }
+function scrollActiveSidebar () {
+ if (/mobile/i.test(navigator.userAgent)) { return }
var anchors = document.querySelectorAll('.anchor');
var nav = {};
@@ -2257,84 +2265,160 @@ function scrollActiveSidebar (isCustom) {
scrollIntoView();
}
-var bindEvent = function (isCustom) {
- scrollActiveSidebar(isCustom);
-};
+/**
+ * Acitve link
+ */
+function activeLink (dom, activeParent) {
+ var host = document.location.origin + document.location.pathname;
-var DEFAULT_OPTS = {
- el: '#app',
- repo: '',
- 'max-level': 6,
- sidebar: ''
-};
+ dom = typeof dom === 'object' ? dom : document.querySelector(dom);
+ if (!dom) { return
-var script = document.currentScript || [].slice.call(document.getElementsByTagName('script')).pop();
-
-if (script) {
- for (var prop in DEFAULT_OPTS) {
- DEFAULT_OPTS[prop] = script.getAttribute('data-' + prop) || DEFAULT_OPTS[prop];
- }
-}
-
-var Docsify = function Docsify (opts) {
- Docsify.installed = true;
-
- this.opts = Object.assign({}, opts, DEFAULT_OPTS);
- this.replace = true;
- this.dom = document.querySelector(this.opts.el);
- if (!this.dom) {
- this.dom = document.body;
- this.replace = false;
- }
- if (this.opts.sidebar) { this.opts.sidebar = window[this.opts.sidebar]; }
-
- this.loc = document.location.pathname;
- if (/\/$/.test(this.loc)) { this.loc += 'README'; }
-
- this.load();
-
- var nav = document.querySelector('nav');
- if (nav) { this.activeNav(nav); }
-};
-
-Docsify.prototype.load = function load () {
- var this$1 = this;
-
- ajax(((this.loc) + ".md"))
- .then(function (res) {
- var target = res.target;
- if (target.status >= 400) {
- this$1.render('not found');
- } else {
- this$1.render(res.target.response);
- bindEvent(!!this$1.opts.sidebar);
- if (this$1.opts.sidebar) {
- this$1.activeNav(document.querySelector('aside.sidebar'), true);
- }
- }
- })
- .catch(function (_) { return this$1.render('not found'); });
-};
-
-Docsify.prototype.render = function render$1 (content) {
- this.dom[this.replace ? 'outerHTML' : 'innerHTML'] = render(content, this.opts);
-};
-
-Docsify.prototype.activeNav = function activeNav (elm, activeParentNode) {
- var host = document.location.origin + document.location.pathname;[].slice.call(elm.querySelectorAll('a')).forEach(function (node) {
+ ; }[].slice.call(dom.querySelectorAll('a')).forEach(function (node) {
if (node.href === host) {
- activeParentNode
+ activeParent
? node.parentNode.setAttribute('class', 'active')
: node.setAttribute('class', 'active');
}
});
+}
+
+var renderTo = function (dom, content) {
+ dom = typeof dom === 'object' ? dom : document.querySelector(dom);
+ dom.innerHTML = content;
+
+ return dom
+};
+var toc = [];
+var renderer = new marked.Renderer();
+
+/**
+ * render anchor tag
+ * @link https://github.com/chjj/marked#overriding-renderer-methods
+ */
+renderer.heading = function (text, level) {
+ var slug = text.toLowerCase().replace(/<(?:.|\n)*?>/gm, '').replace(/[\s\n\t]+/g, '-');
+
+ toc.push({ level: level, slug: '#' + slug, title: text });
+
+ return ("" + text + "")
+};
+// highlight code
+renderer.code = function (code, lang) {
+ if ( lang === void 0 ) lang = '';
+
+ var hl = prism.highlight(code, prism.languages[lang] || prism.languages.markup);
+
+ return ("" + hl + "
")
+};
+marked.setOptions({ renderer: renderer });
+
+/**
+ * App
+ */
+function renderApp (dom, replace, opts) {
+ var nav = document.querySelector('nav') || document.createElement('nav');
+
+ dom[replace ? 'outerHTML' : 'innerHTML'] = corner(opts.repo) + main();
+ document.body.insertBefore(nav, document.body.children[0]);
+}
+
+/**
+ * article
+ */
+function renderArticle (content) {
+ if ( content === void 0 ) content = 'not found';
+
+ renderTo('article', marked(content));
+ if (!renderSidebar.rendered) { renderSidebar(null); }
+ if (!renderNavbar.rendered) { renderNavbar(null); }
+}
+
+/**
+ * navbar
+ */
+function renderNavbar (content, OPTIONS) {
+ if ( OPTIONS === void 0 ) OPTIONS = {};
+
+ renderNavbar.rendered = true;
+
+ if (content) { renderTo('nav', marked(content)); }
+ activeLink('nav');
+}
+
+/**
+ * sidebar
+ */
+function renderSidebar (content, OPTIONS) {
+ if ( OPTIONS === void 0 ) OPTIONS = {};
+
+ renderSidebar.rendered = true;
+
+ var isToc = false;
+
+ if (content) {
+ content = marked(content);
+ } else if (OPTIONS.sidebar) {
+ content = tree(OPTIONS.sidebar, '');
+ } else {
+ content = tree(genTree(toc, OPTIONS.maxLevel), '');
+ isToc = true;
+ }
+
+ renderTo('aside.sidebar', content);
+ isToc ? scrollActiveSidebar() : activeLink('aside.sidebar', true);
+}
+
+var OPTIONS = {
+ el: '#app',
+ repo: '',
+ maxLevel: 6,
+ sidebar: '',
+ loadSidebar: null,
+ loadNavbar: null
+};
+var script = document.currentScript || [].slice.call(document.getElementsByTagName('script')).pop();
+
+// load configuration for script attribute
+if (script) {
+ for (var prop in OPTIONS) {
+ var val = script.getAttribute('data-' + camel2kebab(prop));
+ OPTIONS[prop] = isNil(val) ? OPTIONS[prop] : true;
+ }
+ if (OPTIONS.loadSidebar === true) { OPTIONS.loadSidebar = '_sidebar.md'; }
+ if (OPTIONS.loadNavbar === true) { OPTIONS.loadNavbar = '_navbar.md'; }
+ if (OPTIONS.sidebar) { OPTIONS.sidebar = window[OPTIONS.sidebar]; }
+}
+
+var Docsify = function () {
+ var dom = document.querySelector(OPTIONS.el) || document.body;
+ var replace = dom !== document.body;
+ var loc = document.location.pathname;
+
+ if (/\/$/.test(loc)) { loc += 'README'; }
+
+ // Render app
+ renderApp(dom, replace, OPTIONS);
+
+ // Render markdown file
+ load((loc + ".md"))
+ .then(renderArticle, function (_) { return renderArticle(); });
+
+ // Render sidebar
+ if (OPTIONS.loadSidebar) {
+ load(OPTIONS.loadSidebar)
+ .then(function (content) { return renderSidebar(content, OPTIONS); });
+ }
+
+ // Render navbar
+ if (OPTIONS.loadNavbar) {
+ load(OPTIONS.loadNavbar)
+ .then(function (content) { return renderNavbar(content, OPTIONS); });
+ }
};
-window.addEventListener('load', function () {
- if (Docsify.installed) { return }
- new Docsify();
-});
+var index = Docsify();
-return Docsify;
+return index;
-})));
+}());
diff --git a/lib/docsify.min.js b/lib/docsify.min.js
index c430f891..4335829c 100644
--- a/lib/docsify.min.js
+++ b/lib/docsify.min.js
@@ -1 +1 @@
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Docsify=t()}(this,function(){"use strict";function e(e,t){return t={exports:{}},e(t,t.exports),t.exports}function t(e){function t(){for(var e=0,t=r.length;e10){var o=i[n.id];if(!o)return;if(o===a)return;return a&&a.setAttribute("class",""),o.setAttribute("class","active"),void(a=o)}}}function n(){var e=window.location.hash.slice(1);if(e){var t=document.querySelector("#"+e);t&&t.scrollIntoView()}}if(!/mobile/i.test(navigator.userAgent)&&!e){for(var r=document.querySelectorAll(".anchor"),i={},s=document.querySelectorAll(".sidebar li"),a=null,o=0,l=s.length;o/g,">").replace(/"/g,""").replace(/'/g,"'")}function o(e){return e.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/g,function(e,t){return t=t.toLowerCase(),"colon"===t?":":"#"===t.charAt(0)?"x"===t.charAt(1)?String.fromCharCode(parseInt(t.substring(2),16)):String.fromCharCode(+t.substring(1)):""})}function l(e,t){return e=e.source,t=t||"",function n(r,i){return r?(i=i.source||i,i=i.replace(/(^|[^\[])\^/g,"$1"),e=e.replace(r,i),n):new RegExp(e,t)}}function u(){}function c(e){for(var t,n,r=arguments,i=1;iAn error occured:
"+a(e.message+"",!0)+"
";throw e}}var h={newline:/^\n+/,code:/^( {4}[^\n]+\n*)+/,fences:u,hr:/^( *[-*_]){3,} *(?:\n+|$)/,heading:/^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,nptable:u,lheading:/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,blockquote:/^( *>[^\n]+(\n(?!def)[^\n]+)*\n*)+/,list:/^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,html:/^ *(?:comment *(?:\n|\s*$)|closed *(?:\n{2,}|\s*$)|closing *(?:\n{2,}|\s*$))/,def:/^ *\[([^\]]+)\]: *([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$)/,table:u,paragraph:/^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,text:/^[^\n]+/};h.bullet=/(?:[*+-]|\d+\.)/,h.item=/^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/,h.item=l(h.item,"gm")(/bull/g,h.bullet)(),h.list=l(h.list)(/bull/g,h.bullet)("hr","\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))")("def","\\n+(?="+h.def.source+")")(),h.blockquote=l(h.blockquote)("def",h.def)(),h._tag="(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:/|[^\\w\\s@]*@)\\b",h.html=l(h.html)("comment",//)("closed",/<(tag)[\s\S]+?<\/\1>/)("closing",/])*?>/)(/tag/g,h._tag)(),h.paragraph=l(h.paragraph)("hr",h.hr)("heading",h.heading)("lheading",h.lheading)("blockquote",h.blockquote)("tag","<"+h._tag)("def",h.def)(),h.normal=c({},h),h.gfm=c({},h.normal,{fences:/^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,paragraph:/^/,heading:/^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/}),h.gfm.paragraph=l(h.paragraph)("(?!","(?!"+h.gfm.fences.source.replace("\\1","\\2")+"|"+h.list.source.replace("\\1","\\3")+"|")(),h.tables=c({},h.gfm,{nptable:/^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,table:/^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/}),n.rules=h,n.lex=function(e,t){var r=new n(t);return r.lex(e)},n.prototype.lex=function(e){return e=e.replace(/\r\n|\r/g,"\n").replace(/\t/g," ").replace(/\u00a0/g," ").replace(/\u2424/g,"\n"),this.token(e,!0)},n.prototype.token=function(e,t,n){for(var r,i,s,a,o,l,u,c,p,g=this,e=e.replace(/^ +$/gm,"");e;)if((s=g.rules.newline.exec(e))&&(e=e.substring(s[0].length),s[0].length>1&&g.tokens.push({type:"space"})),s=g.rules.code.exec(e))e=e.substring(s[0].length),s=s[0].replace(/^ {4}/gm,""),g.tokens.push({type:"code",text:g.options.pedantic?s:s.replace(/\n+$/,"")});else if(s=g.rules.fences.exec(e))e=e.substring(s[0].length),g.tokens.push({type:"code",lang:s[2],text:s[3]||""});else if(s=g.rules.heading.exec(e))e=e.substring(s[0].length),g.tokens.push({type:"heading",depth:s[1].length,text:s[2]});else if(t&&(s=g.rules.nptable.exec(e))){for(e=e.substring(s[0].length),l={type:"table",header:s[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:s[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:s[3].replace(/\n$/,"").split("\n")},c=0;c ?/gm,""),g.token(s,t,!0),g.tokens.push({type:"blockquote_end"});else if(s=g.rules.list.exec(e)){for(e=e.substring(s[0].length),a=s[2],g.tokens.push({type:"list_start",ordered:a.length>1}),s=s[0].match(g.rules.item),r=!1,p=s.length,c=0;c1&&o.length>1||(e=s.slice(c+1).join("\n")+e,c=p-1)),i=r||/\n\n(?!\s*$)/.test(l),c!==p-1&&(r="\n"===l.charAt(l.length-1),i||(i=r)),g.tokens.push({type:i?"loose_item_start":"list_item_start"}),g.token(l,!1,n),g.tokens.push({type:"list_item_end"});g.tokens.push({type:"list_end"})}else if(s=g.rules.html.exec(e))e=e.substring(s[0].length),g.tokens.push({type:g.options.sanitize?"paragraph":"html",pre:!g.options.sanitizer&&("pre"===s[1]||"script"===s[1]||"style"===s[1]),text:s[0]});else if(!n&&t&&(s=g.rules.def.exec(e)))e=e.substring(s[0].length),g.tokens.links[s[1].toLowerCase()]={href:s[2],title:s[3]};else if(t&&(s=g.rules.table.exec(e))){for(e=e.substring(s[0].length),l={type:"table",header:s[1].replace(/^ *| *\| *$/g,"").split(/ *\| */),align:s[2].replace(/^ *|\| *$/g,"").split(/ *\| */),cells:s[3].replace(/(?: *\| *)?\n$/,"").split("\n")},c=0;c])/,autolink:/^<([^ >]+(@|:\/)[^ >]+)>/,url:u,tag:/^|^<\/?\w+(?:"[^"]*"|'[^']*'|[^'">])*?>/,link:/^!?\[(inside)\]\(href\)/,reflink:/^!?\[(inside)\]\s*\[([^\]]*)\]/,nolink:/^!?\[((?:\[[^\]]*\]|[^\[\]])*)\]/,strong:/^__([\s\S]+?)__(?!_)|^\*\*([\s\S]+?)\*\*(?!\*)/,em:/^\b_((?:[^_]|__)+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,code:/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)/,br:/^ {2,}\n(?!\s*$)/,del:u,text:/^[\s\S]+?(?=[\\?(?:\s+['"]([\s\S]*?)['"])?\s*/,g.link=l(g.link)("inside",g._inside)("href",g._href)(),g.reflink=l(g.reflink)("inside",g._inside)(),g.normal=c({},g),g.pedantic=c({},g.normal,{strong:/^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,em:/^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/}),g.gfm=c({},g.normal,{escape:l(g.escape)("])","~|])")(),url:/^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,del:/^~~(?=\S)([\s\S]*?\S)~~/,text:l(g.text)("]|","~]|")("|","|https?://|")()}),g.breaks=c({},g.gfm,{br:l(g.br)("{2,}","*")(),text:l(g.gfm.text)("{2,}","*")()}),r.rules=g,r.output=function(e,t,n){var i=new r(t,n);return i.output(e)},r.prototype.output=function(e){for(var t,n,r,i,s=this,o="";e;)if(i=s.rules.escape.exec(e))e=e.substring(i[0].length),o+=i[1];else if(i=s.rules.autolink.exec(e))e=e.substring(i[0].length),"@"===i[2]?(n=":"===i[1].charAt(6)?s.mangle(i[1].substring(7)):s.mangle(i[1]),r=s.mangle("mailto:")+n):(n=a(i[1]),r=n),o+=s.renderer.link(r,null,n);else if(s.inLink||!(i=s.rules.url.exec(e))){if(i=s.rules.tag.exec(e))!s.inLink&&/^/i.test(i[0])&&(s.inLink=!1),e=e.substring(i[0].length),o+=s.options.sanitize?s.options.sanitizer?s.options.sanitizer(i[0]):a(i[0]):i[0];else if(i=s.rules.link.exec(e))e=e.substring(i[0].length),s.inLink=!0,o+=s.outputLink(i,{href:i[2],title:i[3]}),s.inLink=!1;else if((i=s.rules.reflink.exec(e))||(i=s.rules.nolink.exec(e))){if(e=e.substring(i[0].length),t=(i[2]||i[1]).replace(/\s+/g," "),t=s.links[t.toLowerCase()],!t||!t.href){o+=i[0].charAt(0),e=i[0].substring(1)+e;continue}s.inLink=!0,o+=s.outputLink(i,t),s.inLink=!1}else if(i=s.rules.strong.exec(e))e=e.substring(i[0].length),o+=s.renderer.strong(s.output(i[2]||i[1]));else if(i=s.rules.em.exec(e))e=e.substring(i[0].length),o+=s.renderer.em(s.output(i[2]||i[1]));else if(i=s.rules.code.exec(e))e=e.substring(i[0].length),o+=s.renderer.codespan(a(i[2],!0));else if(i=s.rules.br.exec(e))e=e.substring(i[0].length),o+=s.renderer.br();else if(i=s.rules.del.exec(e))e=e.substring(i[0].length),o+=s.renderer.del(s.output(i[1]));else if(i=s.rules.text.exec(e))e=e.substring(i[0].length),o+=s.renderer.text(a(s.smartypants(i[0])));else if(e)throw new Error("Infinite loop on byte: "+e.charCodeAt(0))}else e=e.substring(i[0].length),n=a(i[1]),r=n,o+=s.renderer.link(r,null,n);return o},r.prototype.outputLink=function(e,t){var n=a(t.href),r=t.title?a(t.title):null;return"!"!==e[0].charAt(0)?this.renderer.link(n,r,this.output(e[1])):this.renderer.image(n,r,a(e[1]))},r.prototype.smartypants=function(e){return this.options.smartypants?e.replace(/---/g,"—").replace(/--/g,"–").replace(/(^|[-\u2014\/(\[{"\s])'/g,"$1‘").replace(/'/g,"’").replace(/(^|[-\u2014\/(\[{\u2018\s])"/g,"$1“").replace(/"/g,"”").replace(/\.{3}/g,"…"):e},r.prototype.mangle=function(e){if(!this.options.mangle)return e;for(var t,n="",r=e.length,i=0;i.5&&(t="x"+t.toString(16)),n+=""+t+";";return n},i.prototype.code=function(e,t,n){if(this.options.highlight){var r=this.options.highlight(e,t);null!=r&&r!==e&&(n=!0,e=r)}return t?''+(n?e:a(e,!0))+"\n
\n":""+(n?e:a(e,!0))+"\n
"},i.prototype.blockquote=function(e){return"\n"+e+"
\n"},i.prototype.html=function(e){return e},i.prototype.heading=function(e,t,n){return"\n"},i.prototype.hr=function(){return this.options.xhtml?"
\n":"
\n"},i.prototype.list=function(e,t){var n=t?"ol":"ul";return"<"+n+">\n"+e+""+n+">\n"},i.prototype.listitem=function(e){return""+e+"\n"},i.prototype.paragraph=function(e){return""+e+"
\n"},i.prototype.table=function(e,t){return"\n"},i.prototype.tablerow=function(e){return"\n"+e+"
\n"},i.prototype.tablecell=function(e,t){var n=t.header?"th":"td",r=t.align?"<"+n+' style="text-align:'+t.align+'">':"<"+n+">";return r+e+""+n+">\n"},i.prototype.strong=function(e){return""+e+""},i.prototype.em=function(e){return""+e+""},i.prototype.codespan=function(e){return""+e+""},i.prototype.br=function(){return this.options.xhtml?"
":"
"},i.prototype.del=function(e){return""+e+""},i.prototype.link=function(e,t,n){if(this.options.sanitize){try{var r=decodeURIComponent(o(e)).replace(/[^\w:]/g,"").toLowerCase()}catch(e){return""}if(0===r.indexOf("javascript:")||0===r.indexOf("vbscript:"))return""}var i='"+n+""},i.prototype.image=function(e,t,n){var r='
":">"},i.prototype.text=function(e){return e},s.parse=function(e,t,n){var r=new s(t,n);return r.parse(e)},s.prototype.parse=function(e){var t=this;this.inline=new r(e.links,this.options,this.renderer),this.tokens=e.reverse();for(var n="";this.next();)n+=t.tok();return n},s.prototype.next=function(){return this.token=this.tokens.pop()},s.prototype.peek=function(){return this.tokens[this.tokens.length-1]||0},s.prototype.parseText=function(){for(var e=this,t=this.token.text;"text"===this.peek().type;)t+="\n"+e.next().text;return this.inline.output(t)},s.prototype.tok=function(){var e=this;switch(this.token.type){case"space":return"";case"hr":return this.renderer.hr();case"heading":return this.renderer.heading(this.inline.output(this.token.text),this.token.depth,this.token.text);case"code":return this.renderer.code(this.token.text,this.token.lang,this.token.escaped);case"table":var t,n,r,i,s,a="",o="";for(r="",t=0;te.length)break e;if(!(b instanceof i)){c.lastIndex=0;var y=c.exec(b),k=1;if(!y&&g&&m!=s.length-1){var v=s[m+1].matchedStr||s[m+1],x=b+v;if(m=b.length)continue;var S=y.index+y[0].length,_=b.length+v.length;if(k=3,S<=_){if(s[m+1].greedy)continue;k=2,x=x.slice(0,_)}b=x}if(y){h&&(d=y[1].length);var w=y.index+d,y=y[0].slice(d),S=w+y.length,C=b.slice(0,w),A=b.slice(S),L=[m,k];C&&L.push(C);var $=new i(o,p?r.tokenize(y,p):y,f,y,g);L.push($),A&&L.push(A),Array.prototype.splice.apply(s,L)}}}}}return s},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var i,s=0;i=n[s++];)i(t)}}},i=r.Token=function(e,t,n,r,i){this.type=e,this.content=t,this.alias=n,this.matchedStr=r||null,this.greedy=!!i};if(i.stringify=function(e,t,n){if("string"==typeof e)return e;if("Array"===r.util.type(e))return e.map(function(n){return i.stringify(n,t,e)}).join("");var s={type:e.type,content:i.stringify(e.content,t,n),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:n};if("comment"==s.type&&(s.attributes.spellcheck="true"),e.alias){var a="Array"===r.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(s.classes,a)}r.hooks.run("wrap",s);var o="";for(var l in s.attributes)o+=(o?" ":"")+l+'="'+(s.attributes[l]||"")+'"';return"<"+s.tag+' class="'+s.classes.join(" ")+'" '+o+">"+s.content+""+s.tag+">"},!t.document)return t.addEventListener?(t.addEventListener("message",function(e){var n=JSON.parse(e.data),i=n.language,s=n.code,a=n.immediateClose;t.postMessage(r.highlight(s,r.languages[i],i)),a&&t.close()},!1),t.Prism):t.Prism;var s=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return s&&(r.filename=s.src,document.addEventListener&&!s.hasAttribute("data-manual")&&("loading"!==document.readyState?requestAnimationFrame(r.highlightAll,0):document.addEventListener("DOMContentLoaded",r.highlightAll))),t.Prism}();"undefined"!=typeof e&&e.exports&&(e.exports=n),"undefined"!=typeof r&&(r.Prism=n),n.languages.markup={comment://,prolog:/<\?[\w\W]+?\?>/,doctype://,cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=.$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/?[\da-z]{1,8};/i},n.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),n.languages.xml=n.languages.markup,n.languages.html=n.languages.markup,n.languages.mathml=n.languages.markup,n.languages.svg=n.languages.markup,n.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},n.languages.css.atrule.inside.rest=n.util.clone(n.languages.css),n.languages.markup&&(n.languages.insertBefore("markup","tag",{style:{pattern:/(