2016-11-29 01:07:47 +08:00
|
|
|
|
var Docsify = (function () {
|
|
|
|
|
'use strict';
|
2016-11-20 15:56:37 +08:00
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
/**
|
|
|
|
|
* Simple ajax
|
|
|
|
|
* @param {String} url
|
2016-12-16 22:38:44 +08:00
|
|
|
|
* @param {String} [method=GET]
|
|
|
|
|
* @param {Function} [loading] handle loading
|
2016-11-29 01:07:47 +08:00
|
|
|
|
* @return {Promise}
|
|
|
|
|
*/
|
2016-12-16 22:38:44 +08:00
|
|
|
|
function load (url, method, loading) {
|
|
|
|
|
if ( method === void 0 ) method = 'GET';
|
2016-11-26 18:09:55 +08:00
|
|
|
|
|
|
|
|
|
var xhr = new XMLHttpRequest();
|
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
xhr.open(method, url);
|
2016-11-26 18:09:55 +08:00
|
|
|
|
xhr.send();
|
|
|
|
|
|
|
|
|
|
return {
|
2016-11-29 01:07:47 +08:00
|
|
|
|
then: function (success, error) {
|
|
|
|
|
if ( error === void 0 ) error = function () {};
|
|
|
|
|
|
2016-12-16 22:38:44 +08:00
|
|
|
|
if (loading) {
|
2016-12-19 21:53:25 +08:00
|
|
|
|
var id = setInterval(function (_) { return loading({ step: Math.floor(Math.random() * 5 + 1) }); },
|
|
|
|
|
500);
|
2016-12-16 22:38:44 +08:00
|
|
|
|
xhr.addEventListener('progress', loading);
|
2016-12-19 21:53:25 +08:00
|
|
|
|
xhr.addEventListener('loadend', function (evt) {
|
|
|
|
|
loading(evt);
|
|
|
|
|
clearInterval(id);
|
|
|
|
|
});
|
2016-12-16 22:38:44 +08:00
|
|
|
|
}
|
2016-11-29 01:07:47 +08:00
|
|
|
|
xhr.addEventListener('error', error);
|
|
|
|
|
xhr.addEventListener('load', function (ref) {
|
|
|
|
|
var target = ref.target;
|
|
|
|
|
|
|
|
|
|
target.status >= 400 ? error(target) : success(target.response);
|
|
|
|
|
});
|
2016-12-16 22:38:44 +08:00
|
|
|
|
},
|
|
|
|
|
abort: function () { return xhr.readyState !== 4 && xhr.abort(); }
|
2016-11-26 18:09:55 +08:00
|
|
|
|
}
|
2016-11-29 01:07:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 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
|
|
|
|
|
}
|
2016-11-26 18:09:55 +08:00
|
|
|
|
|
2016-12-08 21:12:33 +08:00
|
|
|
|
var cacheRoute$1 = null;
|
|
|
|
|
var cacheHash = null;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* hash route
|
|
|
|
|
*/
|
|
|
|
|
function getRoute () {
|
|
|
|
|
var loc = window.location;
|
|
|
|
|
if (cacheHash === loc.hash && !isNil(cacheRoute$1)) { return cacheRoute$1 }
|
|
|
|
|
|
|
|
|
|
var route = loc.hash.match(/^#\/([^#]+)/);
|
|
|
|
|
|
|
|
|
|
if (route && route.length === 2) {
|
|
|
|
|
route = route[1];
|
|
|
|
|
} else {
|
|
|
|
|
route = /^#\//.test(loc.hash) ? '' : loc.pathname;
|
|
|
|
|
}
|
|
|
|
|
cacheRoute$1 = route;
|
|
|
|
|
cacheHash = loc.hash;
|
|
|
|
|
|
|
|
|
|
return route
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-17 15:17:20 +08:00
|
|
|
|
function isMobile () {
|
2016-12-18 10:49:56 +08:00
|
|
|
|
return document.body.clientWidth <= 600
|
2016-12-17 15:17:20 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-12-31 14:16:39 +08:00
|
|
|
|
function slugify (string) {
|
|
|
|
|
var re = /[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,.\/:;<=>?@\[\]^`{|}~]/g;
|
|
|
|
|
var maintainCase = false;
|
|
|
|
|
var replacement = '-';
|
2017-01-04 21:42:40 +08:00
|
|
|
|
|
2016-12-31 14:16:39 +08:00
|
|
|
|
slugify.occurrences = slugify.occurrences || {};
|
|
|
|
|
|
|
|
|
|
if (typeof string !== 'string') { return '' }
|
|
|
|
|
if (!maintainCase) { string = string.toLowerCase(); }
|
|
|
|
|
|
|
|
|
|
var slug = string.trim()
|
2017-01-09 17:50:43 +08:00
|
|
|
|
.replace(/<[^>\d]+>/g, '')
|
2016-12-31 14:16:39 +08:00
|
|
|
|
.replace(re, '')
|
2017-01-10 14:40:21 +08:00
|
|
|
|
.replace(/\s/g, replacement)
|
|
|
|
|
.replace(/-+/g, replacement)
|
|
|
|
|
.replace(/^(\d)/, '_$1');
|
2016-12-31 14:16:39 +08:00
|
|
|
|
var occurrences = slugify.occurrences[slug];
|
|
|
|
|
|
|
|
|
|
if (slugify.occurrences.hasOwnProperty(slug)) {
|
|
|
|
|
occurrences++;
|
|
|
|
|
} else {
|
|
|
|
|
occurrences = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
slugify.occurrences[slug] = occurrences;
|
|
|
|
|
|
|
|
|
|
if (occurrences) {
|
|
|
|
|
slug = slug + '-' + occurrences;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return slug
|
|
|
|
|
}
|
|
|
|
|
|
2017-01-04 21:42:40 +08:00
|
|
|
|
slugify.clear = function () {
|
|
|
|
|
slugify.occurrences = {};
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
|
|
|
var merge = Object.assign || function (to) {
|
|
|
|
|
var arguments$1 = arguments;
|
|
|
|
|
|
|
|
|
|
for (var i = 1; i < arguments.length; i++) {
|
|
|
|
|
var from = Object(arguments$1[i]);
|
|
|
|
|
|
|
|
|
|
for (var key in from) {
|
|
|
|
|
if (hasOwnProperty.call(from, key)) {
|
|
|
|
|
to[key] = from[key];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return to
|
|
|
|
|
};
|
|
|
|
|
|
2016-12-13 22:11:50 +08:00
|
|
|
|
/**
|
|
|
|
|
* Active sidebar when scroll
|
|
|
|
|
* @link https://buble.surge.sh/
|
|
|
|
|
*/
|
|
|
|
|
function scrollActiveSidebar () {
|
2016-12-17 15:17:20 +08:00
|
|
|
|
if (isMobile()) { return }
|
2016-12-13 22:11:50 +08:00
|
|
|
|
|
2017-01-10 23:33:41 +08:00
|
|
|
|
var hoveredOverSidebar = false;
|
2016-12-13 22:11:50 +08:00
|
|
|
|
var anchors = document.querySelectorAll('.anchor');
|
2017-01-10 23:33:41 +08:00
|
|
|
|
var sidebar = document.querySelector('aside.sidebar');
|
2016-12-13 22:11:50 +08:00
|
|
|
|
var nav = {};
|
2017-01-10 23:33:41 +08:00
|
|
|
|
var lis = sidebar.querySelectorAll('li');
|
|
|
|
|
var active = sidebar.querySelector('li.active');
|
2016-12-13 22:11:50 +08:00
|
|
|
|
|
|
|
|
|
for (var i = 0, len = lis.length; i < len; i += 1) {
|
|
|
|
|
var li = lis[i];
|
|
|
|
|
var href = li.querySelector('a').getAttribute('href');
|
|
|
|
|
|
2016-12-31 13:47:16 +08:00
|
|
|
|
if (href !== '/') {
|
|
|
|
|
var match = href.match('#([^#]+)$');
|
|
|
|
|
if (match && match.length) { href = match[0].slice(1); }
|
|
|
|
|
}
|
2016-12-13 22:11:50 +08:00
|
|
|
|
|
2016-12-18 15:37:47 +08:00
|
|
|
|
nav[decodeURIComponent(href)] = li;
|
2016-12-13 22:11:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function highlight () {
|
2017-01-10 23:33:41 +08:00
|
|
|
|
var top = document.body.scrollTop;
|
|
|
|
|
var last;
|
|
|
|
|
|
2016-12-13 22:11:50 +08:00
|
|
|
|
for (var i = 0, len = anchors.length; i < len; i += 1) {
|
2016-12-22 00:26:06 +08:00
|
|
|
|
var node = anchors[i];
|
2016-12-13 22:11:50 +08:00
|
|
|
|
|
2017-01-10 23:33:41 +08:00
|
|
|
|
if (node.offsetTop > top) {
|
|
|
|
|
if (!last) { last = node; }
|
|
|
|
|
break
|
|
|
|
|
} else {
|
|
|
|
|
last = node;
|
2016-12-13 22:11:50 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2017-01-10 23:33:41 +08:00
|
|
|
|
if (!last) { return }
|
|
|
|
|
var li = nav[last.getAttribute('data-id')];
|
|
|
|
|
|
|
|
|
|
if (!li || li === active) { return }
|
|
|
|
|
if (active) { active.classList.remove('active'); }
|
|
|
|
|
|
|
|
|
|
li.classList.add('active');
|
|
|
|
|
active = li;
|
2017-01-12 20:29:40 +08:00
|
|
|
|
!hoveredOverSidebar && !sticky.noSticky && active.scrollIntoView(false);
|
2016-12-13 22:11:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-12-22 00:26:06 +08:00
|
|
|
|
window.removeEventListener('scroll', highlight);
|
|
|
|
|
window.addEventListener('scroll', highlight);
|
2017-01-10 23:33:41 +08:00
|
|
|
|
sidebar.addEventListener('mouseover', function () { hoveredOverSidebar = true; });
|
|
|
|
|
sidebar.addEventListener('mouseleave', function () { hoveredOverSidebar = false; });
|
2016-12-13 22:11:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function scrollIntoView () {
|
|
|
|
|
var id = window.location.hash.match(/#[^#\/]+$/g);
|
|
|
|
|
if (!id || !id.length) { return }
|
2016-12-17 15:56:55 +08:00
|
|
|
|
var section = document.querySelector(decodeURIComponent(id[0]));
|
2016-12-13 22:11:50 +08:00
|
|
|
|
|
2017-01-10 23:33:41 +08:00
|
|
|
|
if (section) { setTimeout(function () { return section.scrollIntoView(); }, 0); }
|
|
|
|
|
|
|
|
|
|
return section
|
2016-12-13 22:11:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Acitve link
|
|
|
|
|
*/
|
|
|
|
|
function activeLink (dom, activeParent) {
|
|
|
|
|
var host = window.location.href;
|
|
|
|
|
|
|
|
|
|
dom = typeof dom === 'object' ? dom : document.querySelector(dom);
|
2016-12-31 13:47:16 +08:00
|
|
|
|
if (!dom) { return }
|
|
|
|
|
var target;[].slice.call(dom.querySelectorAll('a'))
|
|
|
|
|
.sort(function (a, b) { return b.href.length - a.href.length; })
|
|
|
|
|
.forEach(function (node) {
|
|
|
|
|
if (host.indexOf(node.href) === 0 && !target) {
|
|
|
|
|
activeParent
|
2017-01-10 23:33:41 +08:00
|
|
|
|
? node.parentNode.classList.add('active')
|
|
|
|
|
: node.classList.add('active');
|
2016-12-31 13:47:16 +08:00
|
|
|
|
target = node;
|
|
|
|
|
} else {
|
|
|
|
|
activeParent
|
2017-01-10 23:33:41 +08:00
|
|
|
|
? node.parentNode.classList.remove('active')
|
|
|
|
|
: node.classList.remove('active');
|
2016-12-31 13:47:16 +08:00
|
|
|
|
}
|
|
|
|
|
});
|
2016-12-13 22:11:50 +08:00
|
|
|
|
|
2016-12-31 13:47:16 +08:00
|
|
|
|
return target
|
2016-12-13 22:11:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* sidebar toggle
|
|
|
|
|
*/
|
|
|
|
|
function bindToggle (dom) {
|
|
|
|
|
dom = typeof dom === 'object' ? dom : document.querySelector(dom);
|
|
|
|
|
if (!dom) { return }
|
|
|
|
|
var body = document.body;
|
|
|
|
|
|
|
|
|
|
dom.addEventListener('click', function () { return body.classList.toggle('close'); });
|
|
|
|
|
|
2016-12-31 22:04:54 +08:00
|
|
|
|
if (isMobile()) {
|
2017-01-10 23:33:41 +08:00
|
|
|
|
var sidebar = document.querySelector('aside.sidebar');
|
2017-01-12 21:31:22 +08:00
|
|
|
|
sidebar.addEventListener('click', function () {
|
|
|
|
|
body.classList.toggle('close');
|
|
|
|
|
setTimeout(function () { return activeLink(sidebar, true); }, 0);
|
2017-01-10 23:33:41 +08:00
|
|
|
|
});
|
2016-12-31 22:04:54 +08:00
|
|
|
|
}
|
2016-12-13 22:11:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
2017-01-10 23:33:41 +08:00
|
|
|
|
function scroll2Top (offset) {
|
|
|
|
|
if ( offset === void 0 ) offset = 0;
|
|
|
|
|
|
|
|
|
|
document.body.scrollTop = offset === true ? 0 : Number(offset);
|
2016-12-16 22:38:44 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-12-22 00:26:06 +08:00
|
|
|
|
function sticky () {
|
2017-01-12 20:29:40 +08:00
|
|
|
|
sticky.dom = sticky.dom || document.querySelector('section.cover');
|
|
|
|
|
var coverHeight = sticky.dom.getBoundingClientRect().height;
|
2016-12-22 00:26:06 +08:00
|
|
|
|
|
|
|
|
|
return (function () {
|
2017-01-12 20:29:40 +08:00
|
|
|
|
if (window.pageYOffset >= coverHeight || sticky.dom.classList.contains('hidden')) {
|
2016-12-22 00:26:06 +08:00
|
|
|
|
document.body.classList.add('sticky');
|
2017-01-12 20:29:40 +08:00
|
|
|
|
sticky.noSticky = false;
|
2016-12-22 00:26:06 +08:00
|
|
|
|
} else {
|
|
|
|
|
document.body.classList.remove('sticky');
|
2017-01-12 20:29:40 +08:00
|
|
|
|
sticky.noSticky = true;
|
2016-12-22 00:26:06 +08:00
|
|
|
|
}
|
|
|
|
|
})()
|
|
|
|
|
}
|
|
|
|
|
|
2016-11-26 18:09:55 +08:00
|
|
|
|
var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function createCommonjsModule(fn, module) {
|
|
|
|
|
return module = { exports: {} }, fn(module, module.exports), module.exports;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var marked = createCommonjsModule(function (module, exports) {
|
|
|
|
|
/**
|
|
|
|
|
* marked - a markdown parser
|
|
|
|
|
* Copyright (c) 2011-2014, Christopher Jeffrey. (MIT Licensed)
|
|
|
|
|
* https://github.com/chjj/marked
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
(function() {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Block-Level Grammar
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
var block = {
|
|
|
|
|
newline: /^\n+/,
|
|
|
|
|
code: /^( {4}[^\n]+\n*)+/,
|
|
|
|
|
fences: noop,
|
|
|
|
|
hr: /^( *[-*_]){3,} *(?:\n+|$)/,
|
|
|
|
|
heading: /^ *(#{1,6}) *([^\n]+?) *#* *(?:\n+|$)/,
|
|
|
|
|
nptable: noop,
|
|
|
|
|
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: noop,
|
|
|
|
|
paragraph: /^((?:[^\n]+\n?(?!hr|heading|lheading|blockquote|tag|def))+)\n*/,
|
|
|
|
|
text: /^[^\n]+/
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
block.bullet = /(?:[*+-]|\d+\.)/;
|
|
|
|
|
block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
|
|
|
|
|
block.item = replace(block.item, 'gm')
|
|
|
|
|
(/bull/g, block.bullet)
|
|
|
|
|
();
|
|
|
|
|
|
|
|
|
|
block.list = replace(block.list)
|
|
|
|
|
(/bull/g, block.bullet)
|
|
|
|
|
('hr', '\\n+(?=\\1?(?:[-*_] *){3,}(?:\\n+|$))')
|
|
|
|
|
('def', '\\n+(?=' + block.def.source + ')')
|
|
|
|
|
();
|
|
|
|
|
|
|
|
|
|
block.blockquote = replace(block.blockquote)
|
|
|
|
|
('def', block.def)
|
|
|
|
|
();
|
|
|
|
|
|
|
|
|
|
block._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';
|
|
|
|
|
|
|
|
|
|
block.html = replace(block.html)
|
|
|
|
|
('comment', /<!--[\s\S]*?-->/)
|
|
|
|
|
('closed', /<(tag)[\s\S]+?<\/\1>/)
|
|
|
|
|
('closing', /<tag(?:"[^"]*"|'[^']*'|[^'">])*?>/)
|
|
|
|
|
(/tag/g, block._tag)
|
|
|
|
|
();
|
|
|
|
|
|
|
|
|
|
block.paragraph = replace(block.paragraph)
|
|
|
|
|
('hr', block.hr)
|
|
|
|
|
('heading', block.heading)
|
|
|
|
|
('lheading', block.lheading)
|
|
|
|
|
('blockquote', block.blockquote)
|
|
|
|
|
('tag', '<' + block._tag)
|
|
|
|
|
('def', block.def)
|
|
|
|
|
();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Normal Block Grammar
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
block.normal = merge({}, block);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* GFM Block Grammar
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
block.gfm = merge({}, block.normal, {
|
|
|
|
|
fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\s*\1 *(?:\n+|$)/,
|
|
|
|
|
paragraph: /^/,
|
|
|
|
|
heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
block.gfm.paragraph = replace(block.paragraph)
|
|
|
|
|
('(?!', '(?!'
|
|
|
|
|
+ block.gfm.fences.source.replace('\\1', '\\2') + '|'
|
|
|
|
|
+ block.list.source.replace('\\1', '\\3') + '|')
|
|
|
|
|
();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* GFM + Tables Block Grammar
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
block.tables = merge({}, block.gfm, {
|
|
|
|
|
nptable: /^ *(\S.*\|.*)\n *([-:]+ *\|[-| :]*)\n((?:.*\|.*(?:\n|$))*)\n*/,
|
|
|
|
|
table: /^ *\|(.+)\n *\|( *[-:]+[-| :]*)\n((?: *\|.*(?:\n|$))*)\n*/
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Block Lexer
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
function Lexer(options) {
|
|
|
|
|
this.tokens = [];
|
|
|
|
|
this.tokens.links = {};
|
|
|
|
|
this.options = options || marked.defaults;
|
|
|
|
|
this.rules = block.normal;
|
|
|
|
|
|
|
|
|
|
if (this.options.gfm) {
|
|
|
|
|
if (this.options.tables) {
|
|
|
|
|
this.rules = block.tables;
|
|
|
|
|
} else {
|
|
|
|
|
this.rules = block.gfm;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Expose Block Rules
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
Lexer.rules = block;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Static Lex Method
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
Lexer.lex = function(src, options) {
|
|
|
|
|
var lexer = new Lexer(options);
|
|
|
|
|
return lexer.lex(src);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Preprocessing
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
Lexer.prototype.lex = function(src) {
|
|
|
|
|
src = src
|
|
|
|
|
.replace(/\r\n|\r/g, '\n')
|
|
|
|
|
.replace(/\t/g, ' ')
|
|
|
|
|
.replace(/\u00a0/g, ' ')
|
|
|
|
|
.replace(/\u2424/g, '\n');
|
|
|
|
|
|
|
|
|
|
return this.token(src, true);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Lexing
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
Lexer.prototype.token = function(src, top, bq) {
|
|
|
|
|
var this$1 = this;
|
|
|
|
|
|
|
|
|
|
var src = src.replace(/^ +$/gm, '')
|
|
|
|
|
, next
|
|
|
|
|
, loose
|
|
|
|
|
, cap
|
|
|
|
|
, bull
|
|
|
|
|
, b
|
|
|
|
|
, item
|
|
|
|
|
, space
|
|
|
|
|
, i
|
|
|
|
|
, l;
|
|
|
|
|
|
|
|
|
|
while (src) {
|
|
|
|
|
// newline
|
|
|
|
|
if (cap = this$1.rules.newline.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
if (cap[0].length > 1) {
|
|
|
|
|
this$1.tokens.push({
|
|
|
|
|
type: 'space'
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// code
|
|
|
|
|
if (cap = this$1.rules.code.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
cap = cap[0].replace(/^ {4}/gm, '');
|
|
|
|
|
this$1.tokens.push({
|
|
|
|
|
type: 'code',
|
|
|
|
|
text: !this$1.options.pedantic
|
|
|
|
|
? cap.replace(/\n+$/, '')
|
|
|
|
|
: cap
|
|
|
|
|
});
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// fences (gfm)
|
|
|
|
|
if (cap = this$1.rules.fences.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
this$1.tokens.push({
|
|
|
|
|
type: 'code',
|
|
|
|
|
lang: cap[2],
|
|
|
|
|
text: cap[3] || ''
|
|
|
|
|
});
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// heading
|
|
|
|
|
if (cap = this$1.rules.heading.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
this$1.tokens.push({
|
|
|
|
|
type: 'heading',
|
|
|
|
|
depth: cap[1].length,
|
|
|
|
|
text: cap[2]
|
|
|
|
|
});
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// table no leading pipe (gfm)
|
|
|
|
|
if (top && (cap = this$1.rules.nptable.exec(src))) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
|
|
|
|
|
item = {
|
|
|
|
|
type: 'table',
|
|
|
|
|
header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
|
|
|
|
|
align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
|
|
|
|
|
cells: cap[3].replace(/\n$/, '').split('\n')
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < item.align.length; i++) {
|
|
|
|
|
if (/^ *-+: *$/.test(item.align[i])) {
|
|
|
|
|
item.align[i] = 'right';
|
|
|
|
|
} else if (/^ *:-+: *$/.test(item.align[i])) {
|
|
|
|
|
item.align[i] = 'center';
|
|
|
|
|
} else if (/^ *:-+ *$/.test(item.align[i])) {
|
|
|
|
|
item.align[i] = 'left';
|
|
|
|
|
} else {
|
|
|
|
|
item.align[i] = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < item.cells.length; i++) {
|
|
|
|
|
item.cells[i] = item.cells[i].split(/ *\| */);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this$1.tokens.push(item);
|
|
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// lheading
|
|
|
|
|
if (cap = this$1.rules.lheading.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
this$1.tokens.push({
|
|
|
|
|
type: 'heading',
|
|
|
|
|
depth: cap[2] === '=' ? 1 : 2,
|
|
|
|
|
text: cap[1]
|
|
|
|
|
});
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// hr
|
|
|
|
|
if (cap = this$1.rules.hr.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
this$1.tokens.push({
|
|
|
|
|
type: 'hr'
|
|
|
|
|
});
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// blockquote
|
|
|
|
|
if (cap = this$1.rules.blockquote.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
|
|
|
|
|
this$1.tokens.push({
|
|
|
|
|
type: 'blockquote_start'
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
cap = cap[0].replace(/^ *> ?/gm, '');
|
|
|
|
|
|
|
|
|
|
// Pass `top` to keep the current
|
|
|
|
|
// "toplevel" state. This is exactly
|
|
|
|
|
// how markdown.pl works.
|
|
|
|
|
this$1.token(cap, top, true);
|
|
|
|
|
|
|
|
|
|
this$1.tokens.push({
|
|
|
|
|
type: 'blockquote_end'
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// list
|
|
|
|
|
if (cap = this$1.rules.list.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
bull = cap[2];
|
|
|
|
|
|
|
|
|
|
this$1.tokens.push({
|
|
|
|
|
type: 'list_start',
|
|
|
|
|
ordered: bull.length > 1
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Get each top-level item.
|
|
|
|
|
cap = cap[0].match(this$1.rules.item);
|
|
|
|
|
|
|
|
|
|
next = false;
|
|
|
|
|
l = cap.length;
|
|
|
|
|
i = 0;
|
|
|
|
|
|
|
|
|
|
for (; i < l; i++) {
|
|
|
|
|
item = cap[i];
|
|
|
|
|
|
|
|
|
|
// Remove the list item's bullet
|
|
|
|
|
// so it is seen as the next token.
|
|
|
|
|
space = item.length;
|
|
|
|
|
item = item.replace(/^ *([*+-]|\d+\.) +/, '');
|
|
|
|
|
|
|
|
|
|
// Outdent whatever the
|
|
|
|
|
// list item contains. Hacky.
|
|
|
|
|
if (~item.indexOf('\n ')) {
|
|
|
|
|
space -= item.length;
|
|
|
|
|
item = !this$1.options.pedantic
|
|
|
|
|
? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
|
|
|
|
|
: item.replace(/^ {1,4}/gm, '');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Determine whether the next list item belongs here.
|
|
|
|
|
// Backpedal if it does not belong in this list.
|
|
|
|
|
if (this$1.options.smartLists && i !== l - 1) {
|
|
|
|
|
b = block.bullet.exec(cap[i + 1])[0];
|
|
|
|
|
if (bull !== b && !(bull.length > 1 && b.length > 1)) {
|
|
|
|
|
src = cap.slice(i + 1).join('\n') + src;
|
|
|
|
|
i = l - 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Determine whether item is loose or not.
|
|
|
|
|
// Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
|
|
|
|
|
// for discount behavior.
|
|
|
|
|
loose = next || /\n\n(?!\s*$)/.test(item);
|
|
|
|
|
if (i !== l - 1) {
|
|
|
|
|
next = item.charAt(item.length - 1) === '\n';
|
|
|
|
|
if (!loose) { loose = next; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this$1.tokens.push({
|
|
|
|
|
type: loose
|
|
|
|
|
? 'loose_item_start'
|
|
|
|
|
: 'list_item_start'
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Recurse.
|
|
|
|
|
this$1.token(item, false, bq);
|
|
|
|
|
|
|
|
|
|
this$1.tokens.push({
|
|
|
|
|
type: 'list_item_end'
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this$1.tokens.push({
|
|
|
|
|
type: 'list_end'
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// html
|
|
|
|
|
if (cap = this$1.rules.html.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
this$1.tokens.push({
|
|
|
|
|
type: this$1.options.sanitize
|
|
|
|
|
? 'paragraph'
|
|
|
|
|
: 'html',
|
|
|
|
|
pre: !this$1.options.sanitizer
|
|
|
|
|
&& (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
|
|
|
|
|
text: cap[0]
|
|
|
|
|
});
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// def
|
|
|
|
|
if ((!bq && top) && (cap = this$1.rules.def.exec(src))) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
this$1.tokens.links[cap[1].toLowerCase()] = {
|
|
|
|
|
href: cap[2],
|
|
|
|
|
title: cap[3]
|
|
|
|
|
};
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// table (gfm)
|
|
|
|
|
if (top && (cap = this$1.rules.table.exec(src))) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
|
|
|
|
|
item = {
|
|
|
|
|
type: 'table',
|
|
|
|
|
header: cap[1].replace(/^ *| *\| *$/g, '').split(/ *\| */),
|
|
|
|
|
align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
|
|
|
|
|
cells: cap[3].replace(/(?: *\| *)?\n$/, '').split('\n')
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < item.align.length; i++) {
|
|
|
|
|
if (/^ *-+: *$/.test(item.align[i])) {
|
|
|
|
|
item.align[i] = 'right';
|
|
|
|
|
} else if (/^ *:-+: *$/.test(item.align[i])) {
|
|
|
|
|
item.align[i] = 'center';
|
|
|
|
|
} else if (/^ *:-+ *$/.test(item.align[i])) {
|
|
|
|
|
item.align[i] = 'left';
|
|
|
|
|
} else {
|
|
|
|
|
item.align[i] = null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < item.cells.length; i++) {
|
|
|
|
|
item.cells[i] = item.cells[i]
|
|
|
|
|
.replace(/^ *\| *| *\| *$/g, '')
|
|
|
|
|
.split(/ *\| */);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this$1.tokens.push(item);
|
|
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// top-level paragraph
|
|
|
|
|
if (top && (cap = this$1.rules.paragraph.exec(src))) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
this$1.tokens.push({
|
|
|
|
|
type: 'paragraph',
|
|
|
|
|
text: cap[1].charAt(cap[1].length - 1) === '\n'
|
|
|
|
|
? cap[1].slice(0, -1)
|
|
|
|
|
: cap[1]
|
|
|
|
|
});
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// text
|
|
|
|
|
if (cap = this$1.rules.text.exec(src)) {
|
|
|
|
|
// Top-level should never reach here.
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
this$1.tokens.push({
|
|
|
|
|
type: 'text',
|
|
|
|
|
text: cap[0]
|
|
|
|
|
});
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (src) {
|
|
|
|
|
throw new
|
|
|
|
|
Error('Infinite loop on byte: ' + src.charCodeAt(0));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return this.tokens;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Inline-Level Grammar
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
var inline = {
|
|
|
|
|
escape: /^\\([\\`*{}\[\]()#+\-.!_>])/,
|
|
|
|
|
autolink: /^<([^ >]+(@|:\/)[^ >]+)>/,
|
|
|
|
|
url: noop,
|
|
|
|
|
tag: /^<!--[\s\S]*?-->|^<\/?\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: noop,
|
|
|
|
|
text: /^[\s\S]+?(?=[\\<!\[_*`]| {2,}\n|$)/
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
inline._inside = /(?:\[[^\]]*\]|[^\[\]]|\](?=[^\[]*\]))*/;
|
|
|
|
|
inline._href = /\s*<?([\s\S]*?)>?(?:\s+['"]([\s\S]*?)['"])?\s*/;
|
|
|
|
|
|
|
|
|
|
inline.link = replace(inline.link)
|
|
|
|
|
('inside', inline._inside)
|
|
|
|
|
('href', inline._href)
|
|
|
|
|
();
|
|
|
|
|
|
|
|
|
|
inline.reflink = replace(inline.reflink)
|
|
|
|
|
('inside', inline._inside)
|
|
|
|
|
();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Normal Inline Grammar
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
inline.normal = merge({}, inline);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Pedantic Inline Grammar
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
inline.pedantic = merge({}, inline.normal, {
|
|
|
|
|
strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
|
|
|
|
|
em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* GFM Inline Grammar
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
inline.gfm = merge({}, inline.normal, {
|
|
|
|
|
escape: replace(inline.escape)('])', '~|])')(),
|
|
|
|
|
url: /^(https?:\/\/[^\s<]+[^<.,:;"')\]\s])/,
|
|
|
|
|
del: /^~~(?=\S)([\s\S]*?\S)~~/,
|
|
|
|
|
text: replace(inline.text)
|
|
|
|
|
(']|', '~]|')
|
|
|
|
|
('|', '|https?://|')
|
|
|
|
|
()
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* GFM + Line Breaks Inline Grammar
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
inline.breaks = merge({}, inline.gfm, {
|
|
|
|
|
br: replace(inline.br)('{2,}', '*')(),
|
|
|
|
|
text: replace(inline.gfm.text)('{2,}', '*')()
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Inline Lexer & Compiler
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
function InlineLexer(links, options) {
|
|
|
|
|
this.options = options || marked.defaults;
|
|
|
|
|
this.links = links;
|
|
|
|
|
this.rules = inline.normal;
|
|
|
|
|
this.renderer = this.options.renderer || new Renderer;
|
|
|
|
|
this.renderer.options = this.options;
|
|
|
|
|
|
|
|
|
|
if (!this.links) {
|
|
|
|
|
throw new
|
|
|
|
|
Error('Tokens array requires a `links` property.');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (this.options.gfm) {
|
|
|
|
|
if (this.options.breaks) {
|
|
|
|
|
this.rules = inline.breaks;
|
|
|
|
|
} else {
|
|
|
|
|
this.rules = inline.gfm;
|
|
|
|
|
}
|
|
|
|
|
} else if (this.options.pedantic) {
|
|
|
|
|
this.rules = inline.pedantic;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Expose Inline Rules
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
InlineLexer.rules = inline;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Static Lexing/Compiling Method
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
InlineLexer.output = function(src, links, options) {
|
|
|
|
|
var inline = new InlineLexer(links, options);
|
|
|
|
|
return inline.output(src);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Lexing/Compiling
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
InlineLexer.prototype.output = function(src) {
|
|
|
|
|
var this$1 = this;
|
|
|
|
|
|
|
|
|
|
var out = ''
|
|
|
|
|
, link
|
|
|
|
|
, text
|
|
|
|
|
, href
|
|
|
|
|
, cap;
|
|
|
|
|
|
|
|
|
|
while (src) {
|
|
|
|
|
// escape
|
|
|
|
|
if (cap = this$1.rules.escape.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
out += cap[1];
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// autolink
|
|
|
|
|
if (cap = this$1.rules.autolink.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
if (cap[2] === '@') {
|
|
|
|
|
text = cap[1].charAt(6) === ':'
|
|
|
|
|
? this$1.mangle(cap[1].substring(7))
|
|
|
|
|
: this$1.mangle(cap[1]);
|
|
|
|
|
href = this$1.mangle('mailto:') + text;
|
|
|
|
|
} else {
|
|
|
|
|
text = escape(cap[1]);
|
|
|
|
|
href = text;
|
|
|
|
|
}
|
|
|
|
|
out += this$1.renderer.link(href, null, text);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// url (gfm)
|
|
|
|
|
if (!this$1.inLink && (cap = this$1.rules.url.exec(src))) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
text = escape(cap[1]);
|
|
|
|
|
href = text;
|
|
|
|
|
out += this$1.renderer.link(href, null, text);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// tag
|
|
|
|
|
if (cap = this$1.rules.tag.exec(src)) {
|
|
|
|
|
if (!this$1.inLink && /^<a /i.test(cap[0])) {
|
|
|
|
|
this$1.inLink = true;
|
|
|
|
|
} else if (this$1.inLink && /^<\/a>/i.test(cap[0])) {
|
|
|
|
|
this$1.inLink = false;
|
|
|
|
|
}
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
out += this$1.options.sanitize
|
|
|
|
|
? this$1.options.sanitizer
|
|
|
|
|
? this$1.options.sanitizer(cap[0])
|
|
|
|
|
: escape(cap[0])
|
|
|
|
|
: cap[0];
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// link
|
|
|
|
|
if (cap = this$1.rules.link.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
this$1.inLink = true;
|
|
|
|
|
out += this$1.outputLink(cap, {
|
|
|
|
|
href: cap[2],
|
|
|
|
|
title: cap[3]
|
|
|
|
|
});
|
|
|
|
|
this$1.inLink = false;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// reflink, nolink
|
|
|
|
|
if ((cap = this$1.rules.reflink.exec(src))
|
|
|
|
|
|| (cap = this$1.rules.nolink.exec(src))) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
|
|
|
|
|
link = this$1.links[link.toLowerCase()];
|
|
|
|
|
if (!link || !link.href) {
|
|
|
|
|
out += cap[0].charAt(0);
|
|
|
|
|
src = cap[0].substring(1) + src;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
this$1.inLink = true;
|
|
|
|
|
out += this$1.outputLink(cap, link);
|
|
|
|
|
this$1.inLink = false;
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// strong
|
|
|
|
|
if (cap = this$1.rules.strong.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
out += this$1.renderer.strong(this$1.output(cap[2] || cap[1]));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// em
|
|
|
|
|
if (cap = this$1.rules.em.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
out += this$1.renderer.em(this$1.output(cap[2] || cap[1]));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// code
|
|
|
|
|
if (cap = this$1.rules.code.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
out += this$1.renderer.codespan(escape(cap[2], true));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// br
|
|
|
|
|
if (cap = this$1.rules.br.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
out += this$1.renderer.br();
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// del (gfm)
|
|
|
|
|
if (cap = this$1.rules.del.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
out += this$1.renderer.del(this$1.output(cap[1]));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// text
|
|
|
|
|
if (cap = this$1.rules.text.exec(src)) {
|
|
|
|
|
src = src.substring(cap[0].length);
|
|
|
|
|
out += this$1.renderer.text(escape(this$1.smartypants(cap[0])));
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (src) {
|
|
|
|
|
throw new
|
|
|
|
|
Error('Infinite loop on byte: ' + src.charCodeAt(0));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return out;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Compile Link
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
InlineLexer.prototype.outputLink = function(cap, link) {
|
|
|
|
|
var href = escape(link.href)
|
|
|
|
|
, title = link.title ? escape(link.title) : null;
|
|
|
|
|
|
|
|
|
|
return cap[0].charAt(0) !== '!'
|
|
|
|
|
? this.renderer.link(href, title, this.output(cap[1]))
|
|
|
|
|
: this.renderer.image(href, title, escape(cap[1]));
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Smartypants Transformations
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
InlineLexer.prototype.smartypants = function(text) {
|
|
|
|
|
if (!this.options.smartypants) { return text; }
|
|
|
|
|
return text
|
|
|
|
|
// em-dashes
|
|
|
|
|
.replace(/---/g, '\u2014')
|
|
|
|
|
// en-dashes
|
|
|
|
|
.replace(/--/g, '\u2013')
|
|
|
|
|
// opening singles
|
|
|
|
|
.replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
|
|
|
|
|
// closing singles & apostrophes
|
|
|
|
|
.replace(/'/g, '\u2019')
|
|
|
|
|
// opening doubles
|
|
|
|
|
.replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
|
|
|
|
|
// closing doubles
|
|
|
|
|
.replace(/"/g, '\u201d')
|
|
|
|
|
// ellipses
|
|
|
|
|
.replace(/\.{3}/g, '\u2026');
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Mangle Links
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
InlineLexer.prototype.mangle = function(text) {
|
|
|
|
|
if (!this.options.mangle) { return text; }
|
|
|
|
|
var out = ''
|
|
|
|
|
, l = text.length
|
|
|
|
|
, i = 0
|
|
|
|
|
, ch;
|
|
|
|
|
|
|
|
|
|
for (; i < l; i++) {
|
|
|
|
|
ch = text.charCodeAt(i);
|
|
|
|
|
if (Math.random() > 0.5) {
|
|
|
|
|
ch = 'x' + ch.toString(16);
|
|
|
|
|
}
|
|
|
|
|
out += '&#' + ch + ';';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return out;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Renderer
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
function Renderer(options) {
|
|
|
|
|
this.options = options || {};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.code = function(code, lang, escaped) {
|
|
|
|
|
if (this.options.highlight) {
|
|
|
|
|
var out = this.options.highlight(code, lang);
|
|
|
|
|
if (out != null && out !== code) {
|
|
|
|
|
escaped = true;
|
|
|
|
|
code = out;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!lang) {
|
|
|
|
|
return '<pre><code>'
|
|
|
|
|
+ (escaped ? code : escape(code, true))
|
|
|
|
|
+ '\n</code></pre>';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return '<pre><code class="'
|
|
|
|
|
+ this.options.langPrefix
|
|
|
|
|
+ escape(lang, true)
|
|
|
|
|
+ '">'
|
|
|
|
|
+ (escaped ? code : escape(code, true))
|
|
|
|
|
+ '\n</code></pre>\n';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.blockquote = function(quote) {
|
|
|
|
|
return '<blockquote>\n' + quote + '</blockquote>\n';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.html = function(html) {
|
|
|
|
|
return html;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.heading = function(text, level, raw) {
|
|
|
|
|
return '<h'
|
|
|
|
|
+ level
|
|
|
|
|
+ ' id="'
|
|
|
|
|
+ this.options.headerPrefix
|
|
|
|
|
+ raw.toLowerCase().replace(/[^\w]+/g, '-')
|
|
|
|
|
+ '">'
|
|
|
|
|
+ text
|
|
|
|
|
+ '</h'
|
|
|
|
|
+ level
|
|
|
|
|
+ '>\n';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.hr = function() {
|
|
|
|
|
return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.list = function(body, ordered) {
|
|
|
|
|
var type = ordered ? 'ol' : 'ul';
|
|
|
|
|
return '<' + type + '>\n' + body + '</' + type + '>\n';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.listitem = function(text) {
|
|
|
|
|
return '<li>' + text + '</li>\n';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.paragraph = function(text) {
|
|
|
|
|
return '<p>' + text + '</p>\n';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.table = function(header, body) {
|
|
|
|
|
return '<table>\n'
|
|
|
|
|
+ '<thead>\n'
|
|
|
|
|
+ header
|
|
|
|
|
+ '</thead>\n'
|
|
|
|
|
+ '<tbody>\n'
|
|
|
|
|
+ body
|
|
|
|
|
+ '</tbody>\n'
|
|
|
|
|
+ '</table>\n';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.tablerow = function(content) {
|
|
|
|
|
return '<tr>\n' + content + '</tr>\n';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.tablecell = function(content, flags) {
|
|
|
|
|
var type = flags.header ? 'th' : 'td';
|
|
|
|
|
var tag = flags.align
|
|
|
|
|
? '<' + type + ' style="text-align:' + flags.align + '">'
|
|
|
|
|
: '<' + type + '>';
|
|
|
|
|
return tag + content + '</' + type + '>\n';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// span level renderer
|
|
|
|
|
Renderer.prototype.strong = function(text) {
|
|
|
|
|
return '<strong>' + text + '</strong>';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.em = function(text) {
|
|
|
|
|
return '<em>' + text + '</em>';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.codespan = function(text) {
|
|
|
|
|
return '<code>' + text + '</code>';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.br = function() {
|
|
|
|
|
return this.options.xhtml ? '<br/>' : '<br>';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.del = function(text) {
|
|
|
|
|
return '<del>' + text + '</del>';
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.link = function(href, title, text) {
|
|
|
|
|
if (this.options.sanitize) {
|
|
|
|
|
try {
|
|
|
|
|
var prot = decodeURIComponent(unescape(href))
|
|
|
|
|
.replace(/[^\w:]/g, '')
|
|
|
|
|
.toLowerCase();
|
|
|
|
|
} catch (e) {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0) {
|
|
|
|
|
return '';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
var out = '<a href="' + href + '"';
|
|
|
|
|
if (title) {
|
|
|
|
|
out += ' title="' + title + '"';
|
|
|
|
|
}
|
|
|
|
|
out += '>' + text + '</a>';
|
|
|
|
|
return out;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.image = function(href, title, text) {
|
|
|
|
|
var out = '<img src="' + href + '" alt="' + text + '"';
|
|
|
|
|
if (title) {
|
|
|
|
|
out += ' title="' + title + '"';
|
|
|
|
|
}
|
|
|
|
|
out += this.options.xhtml ? '/>' : '>';
|
|
|
|
|
return out;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Renderer.prototype.text = function(text) {
|
|
|
|
|
return text;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Parsing & Compiling
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
function Parser(options) {
|
|
|
|
|
this.tokens = [];
|
|
|
|
|
this.token = null;
|
|
|
|
|
this.options = options || marked.defaults;
|
|
|
|
|
this.options.renderer = this.options.renderer || new Renderer;
|
|
|
|
|
this.renderer = this.options.renderer;
|
|
|
|
|
this.renderer.options = this.options;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Static Parse Method
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
Parser.parse = function(src, options, renderer) {
|
|
|
|
|
var parser = new Parser(options, renderer);
|
|
|
|
|
return parser.parse(src);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Parse Loop
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
Parser.prototype.parse = function(src) {
|
|
|
|
|
var this$1 = this;
|
|
|
|
|
|
|
|
|
|
this.inline = new InlineLexer(src.links, this.options, this.renderer);
|
|
|
|
|
this.tokens = src.reverse();
|
|
|
|
|
|
|
|
|
|
var out = '';
|
|
|
|
|
while (this.next()) {
|
|
|
|
|
out += this$1.tok();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return out;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Next Token
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
Parser.prototype.next = function() {
|
|
|
|
|
return this.token = this.tokens.pop();
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Preview Next Token
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
Parser.prototype.peek = function() {
|
|
|
|
|
return this.tokens[this.tokens.length - 1] || 0;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Parse Text Tokens
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
Parser.prototype.parseText = function() {
|
|
|
|
|
var this$1 = this;
|
|
|
|
|
|
|
|
|
|
var body = this.token.text;
|
|
|
|
|
|
|
|
|
|
while (this.peek().type === 'text') {
|
|
|
|
|
body += '\n' + this$1.next().text;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return this.inline.output(body);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Parse Current Token
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
Parser.prototype.tok = function() {
|
|
|
|
|
var this$1 = 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 header = ''
|
|
|
|
|
, body = ''
|
|
|
|
|
, i
|
|
|
|
|
, row
|
|
|
|
|
, cell
|
|
|
|
|
, flags
|
|
|
|
|
, j;
|
|
|
|
|
|
|
|
|
|
// header
|
|
|
|
|
cell = '';
|
|
|
|
|
for (i = 0; i < this.token.header.length; i++) {
|
|
|
|
|
flags = { header: true, align: this$1.token.align[i] };
|
|
|
|
|
cell += this$1.renderer.tablecell(
|
|
|
|
|
this$1.inline.output(this$1.token.header[i]),
|
|
|
|
|
{ header: true, align: this$1.token.align[i] }
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
header += this.renderer.tablerow(cell);
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < this.token.cells.length; i++) {
|
|
|
|
|
row = this$1.token.cells[i];
|
|
|
|
|
|
|
|
|
|
cell = '';
|
|
|
|
|
for (j = 0; j < row.length; j++) {
|
|
|
|
|
cell += this$1.renderer.tablecell(
|
|
|
|
|
this$1.inline.output(row[j]),
|
|
|
|
|
{ header: false, align: this$1.token.align[j] }
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
body += this$1.renderer.tablerow(cell);
|
|
|
|
|
}
|
|
|
|
|
return this.renderer.table(header, body);
|
|
|
|
|
}
|
|
|
|
|
case 'blockquote_start': {
|
|
|
|
|
var body = '';
|
|
|
|
|
|
|
|
|
|
while (this.next().type !== 'blockquote_end') {
|
|
|
|
|
body += this$1.tok();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return this.renderer.blockquote(body);
|
|
|
|
|
}
|
|
|
|
|
case 'list_start': {
|
|
|
|
|
var body = ''
|
|
|
|
|
, ordered = this.token.ordered;
|
|
|
|
|
|
|
|
|
|
while (this.next().type !== 'list_end') {
|
|
|
|
|
body += this$1.tok();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return this.renderer.list(body, ordered);
|
|
|
|
|
}
|
|
|
|
|
case 'list_item_start': {
|
|
|
|
|
var body = '';
|
|
|
|
|
|
|
|
|
|
while (this.next().type !== 'list_item_end') {
|
|
|
|
|
body += this$1.token.type === 'text'
|
|
|
|
|
? this$1.parseText()
|
|
|
|
|
: this$1.tok();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return this.renderer.listitem(body);
|
|
|
|
|
}
|
|
|
|
|
case 'loose_item_start': {
|
|
|
|
|
var body = '';
|
|
|
|
|
|
|
|
|
|
while (this.next().type !== 'list_item_end') {
|
|
|
|
|
body += this$1.tok();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return this.renderer.listitem(body);
|
|
|
|
|
}
|
|
|
|
|
case 'html': {
|
|
|
|
|
var html = !this.token.pre && !this.options.pedantic
|
|
|
|
|
? this.inline.output(this.token.text)
|
|
|
|
|
: this.token.text;
|
|
|
|
|
return this.renderer.html(html);
|
|
|
|
|
}
|
|
|
|
|
case 'paragraph': {
|
|
|
|
|
return this.renderer.paragraph(this.inline.output(this.token.text));
|
|
|
|
|
}
|
|
|
|
|
case 'text': {
|
|
|
|
|
return this.renderer.paragraph(this.parseText());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Helpers
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
function escape(html, encode) {
|
|
|
|
|
return html
|
|
|
|
|
.replace(!encode ? /&(?!#?\w+;)/g : /&/g, '&')
|
|
|
|
|
.replace(/</g, '<')
|
|
|
|
|
.replace(/>/g, '>')
|
|
|
|
|
.replace(/"/g, '"')
|
|
|
|
|
.replace(/'/g, ''');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function unescape(html) {
|
|
|
|
|
// explicitly match decimal, hex, and named HTML entities
|
|
|
|
|
return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/g, function(_, n) {
|
|
|
|
|
n = n.toLowerCase();
|
|
|
|
|
if (n === 'colon') { return ':'; }
|
|
|
|
|
if (n.charAt(0) === '#') {
|
|
|
|
|
return n.charAt(1) === 'x'
|
|
|
|
|
? String.fromCharCode(parseInt(n.substring(2), 16))
|
|
|
|
|
: String.fromCharCode(+n.substring(1));
|
|
|
|
|
}
|
|
|
|
|
return '';
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function replace(regex, opt) {
|
|
|
|
|
regex = regex.source;
|
|
|
|
|
opt = opt || '';
|
|
|
|
|
return function self(name, val) {
|
|
|
|
|
if (!name) { return new RegExp(regex, opt); }
|
|
|
|
|
val = val.source || val;
|
|
|
|
|
val = val.replace(/(^|[^\[])\^/g, '$1');
|
|
|
|
|
regex = regex.replace(name, val);
|
|
|
|
|
return self;
|
|
|
|
|
};
|
|
|
|
|
}
|
2016-11-20 15:56:37 +08:00
|
|
|
|
|
2016-11-26 18:09:55 +08:00
|
|
|
|
function noop() {}
|
|
|
|
|
noop.exec = noop;
|
2016-11-20 15:56:37 +08:00
|
|
|
|
|
2016-11-26 18:09:55 +08:00
|
|
|
|
function merge(obj) {
|
|
|
|
|
var arguments$1 = arguments;
|
2016-11-20 15:56:37 +08:00
|
|
|
|
|
2016-11-26 18:09:55 +08:00
|
|
|
|
var i = 1
|
|
|
|
|
, target
|
|
|
|
|
, key;
|
2016-11-20 15:56:37 +08:00
|
|
|
|
|
2016-11-26 18:09:55 +08:00
|
|
|
|
for (; i < arguments.length; i++) {
|
|
|
|
|
target = arguments$1[i];
|
|
|
|
|
for (key in target) {
|
|
|
|
|
if (Object.prototype.hasOwnProperty.call(target, key)) {
|
|
|
|
|
obj[key] = target[key];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return obj;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Marked
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
function marked(src, opt, callback) {
|
|
|
|
|
if (callback || typeof opt === 'function') {
|
|
|
|
|
if (!callback) {
|
|
|
|
|
callback = opt;
|
|
|
|
|
opt = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
opt = merge({}, marked.defaults, opt || {});
|
|
|
|
|
|
|
|
|
|
var highlight = opt.highlight
|
|
|
|
|
, tokens
|
|
|
|
|
, pending
|
|
|
|
|
, i = 0;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
tokens = Lexer.lex(src, opt);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
return callback(e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pending = tokens.length;
|
|
|
|
|
|
|
|
|
|
var done = function(err) {
|
|
|
|
|
if (err) {
|
|
|
|
|
opt.highlight = highlight;
|
|
|
|
|
return callback(err);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var out;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
out = Parser.parse(tokens, opt);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
err = e;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
opt.highlight = highlight;
|
|
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
? callback(err)
|
|
|
|
|
: callback(null, out);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (!highlight || highlight.length < 3) {
|
|
|
|
|
return done();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
delete opt.highlight;
|
|
|
|
|
|
|
|
|
|
if (!pending) { return done(); }
|
|
|
|
|
|
|
|
|
|
for (; i < tokens.length; i++) {
|
|
|
|
|
(function(token) {
|
|
|
|
|
if (token.type !== 'code') {
|
|
|
|
|
return --pending || done();
|
|
|
|
|
}
|
|
|
|
|
return highlight(token.text, token.lang, function(err, code) {
|
|
|
|
|
if (err) { return done(err); }
|
|
|
|
|
if (code == null || code === token.text) {
|
|
|
|
|
return --pending || done();
|
|
|
|
|
}
|
|
|
|
|
token.text = code;
|
|
|
|
|
token.escaped = true;
|
|
|
|
|
--pending || done();
|
|
|
|
|
});
|
|
|
|
|
})(tokens[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
try {
|
|
|
|
|
if (opt) { opt = merge({}, marked.defaults, opt); }
|
|
|
|
|
return Parser.parse(Lexer.lex(src, opt), opt);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
e.message += '\nPlease report this to https://github.com/chjj/marked.';
|
|
|
|
|
if ((opt || marked.defaults).silent) {
|
|
|
|
|
return '<p>An error occured:</p><pre>'
|
|
|
|
|
+ escape(e.message + '', true)
|
|
|
|
|
+ '</pre>';
|
|
|
|
|
}
|
|
|
|
|
throw e;
|
2016-11-20 15:56:37 +08:00
|
|
|
|
}
|
2016-11-26 18:09:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Options
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
marked.options =
|
|
|
|
|
marked.setOptions = function(opt) {
|
|
|
|
|
merge(marked.defaults, opt);
|
|
|
|
|
return marked;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
marked.defaults = {
|
|
|
|
|
gfm: true,
|
|
|
|
|
tables: true,
|
|
|
|
|
breaks: false,
|
|
|
|
|
pedantic: false,
|
|
|
|
|
sanitize: false,
|
|
|
|
|
sanitizer: null,
|
|
|
|
|
mangle: true,
|
|
|
|
|
smartLists: false,
|
|
|
|
|
silent: false,
|
|
|
|
|
highlight: null,
|
|
|
|
|
langPrefix: 'lang-',
|
|
|
|
|
smartypants: false,
|
|
|
|
|
headerPrefix: '',
|
|
|
|
|
renderer: new Renderer,
|
|
|
|
|
xhtml: false
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Expose
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
marked.Parser = Parser;
|
|
|
|
|
marked.parser = Parser.parse;
|
|
|
|
|
|
|
|
|
|
marked.Renderer = Renderer;
|
|
|
|
|
|
|
|
|
|
marked.Lexer = Lexer;
|
|
|
|
|
marked.lexer = Lexer.lex;
|
|
|
|
|
|
|
|
|
|
marked.InlineLexer = InlineLexer;
|
|
|
|
|
marked.inlineLexer = InlineLexer.output;
|
|
|
|
|
|
|
|
|
|
marked.parse = marked;
|
|
|
|
|
|
2017-01-12 20:29:40 +08:00
|
|
|
|
{
|
2016-11-26 18:09:55 +08:00
|
|
|
|
module.exports = marked;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}).call(function() {
|
|
|
|
|
return this || (typeof window !== 'undefined' ? window : commonjsGlobal);
|
|
|
|
|
}());
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
var prism = createCommonjsModule(function (module) {
|
|
|
|
|
/* **********************************************
|
|
|
|
|
Begin prism-core.js
|
|
|
|
|
********************************************** */
|
|
|
|
|
|
|
|
|
|
var _self = (typeof window !== 'undefined')
|
|
|
|
|
? window // if in browser
|
|
|
|
|
: (
|
|
|
|
|
(typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope)
|
|
|
|
|
? self // if in worker
|
|
|
|
|
: {} // if in node js
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Prism: Lightweight, robust, elegant syntax highlighting
|
|
|
|
|
* MIT license http://www.opensource.org/licenses/mit-license.php/
|
|
|
|
|
* @author Lea Verou http://lea.verou.me
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
var Prism = (function(){
|
|
|
|
|
|
|
|
|
|
// Private helper vars
|
|
|
|
|
var lang = /\blang(?:uage)?-(\w+)\b/i;
|
|
|
|
|
var uniqueId = 0;
|
|
|
|
|
|
|
|
|
|
var _ = _self.Prism = {
|
|
|
|
|
util: {
|
|
|
|
|
encode: function (tokens) {
|
|
|
|
|
if (tokens instanceof Token) {
|
|
|
|
|
return new Token(tokens.type, _.util.encode(tokens.content), tokens.alias);
|
|
|
|
|
} else if (_.util.type(tokens) === 'Array') {
|
|
|
|
|
return tokens.map(_.util.encode);
|
|
|
|
|
} else {
|
|
|
|
|
return tokens.replace(/&/g, '&').replace(/</g, '<').replace(/\u00a0/g, ' ');
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
type: function (o) {
|
|
|
|
|
return Object.prototype.toString.call(o).match(/\[object (\w+)\]/)[1];
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
objId: function (obj) {
|
|
|
|
|
if (!obj['__id']) {
|
|
|
|
|
Object.defineProperty(obj, '__id', { value: ++uniqueId });
|
|
|
|
|
}
|
|
|
|
|
return obj['__id'];
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// Deep clone a language definition (e.g. to extend it)
|
|
|
|
|
clone: function (o) {
|
|
|
|
|
var type = _.util.type(o);
|
|
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
|
case 'Object':
|
|
|
|
|
var clone = {};
|
|
|
|
|
|
|
|
|
|
for (var key in o) {
|
|
|
|
|
if (o.hasOwnProperty(key)) {
|
|
|
|
|
clone[key] = _.util.clone(o[key]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return clone;
|
|
|
|
|
|
|
|
|
|
case 'Array':
|
|
|
|
|
// Check for existence for IE8
|
|
|
|
|
return o.map && o.map(function(v) { return _.util.clone(v); });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return o;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
languages: {
|
|
|
|
|
extend: function (id, redef) {
|
|
|
|
|
var lang = _.util.clone(_.languages[id]);
|
|
|
|
|
|
|
|
|
|
for (var key in redef) {
|
|
|
|
|
lang[key] = redef[key];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return lang;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Insert a token before another token in a language literal
|
|
|
|
|
* As this needs to recreate the object (we cannot actually insert before keys in object literals),
|
|
|
|
|
* we cannot just provide an object, we need anobject and a key.
|
|
|
|
|
* @param inside The key (or language id) of the parent
|
|
|
|
|
* @param before The key to insert before. If not provided, the function appends instead.
|
|
|
|
|
* @param insert Object with the key/value pairs to insert
|
|
|
|
|
* @param root The object that contains `inside`. If equal to Prism.languages, it can be omitted.
|
|
|
|
|
*/
|
|
|
|
|
insertBefore: function (inside, before, insert, root) {
|
|
|
|
|
root = root || _.languages;
|
|
|
|
|
var grammar = root[inside];
|
|
|
|
|
|
|
|
|
|
if (arguments.length == 2) {
|
|
|
|
|
insert = arguments[1];
|
|
|
|
|
|
|
|
|
|
for (var newToken in insert) {
|
|
|
|
|
if (insert.hasOwnProperty(newToken)) {
|
|
|
|
|
grammar[newToken] = insert[newToken];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return grammar;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var ret = {};
|
|
|
|
|
|
|
|
|
|
for (var token in grammar) {
|
|
|
|
|
|
|
|
|
|
if (grammar.hasOwnProperty(token)) {
|
|
|
|
|
|
|
|
|
|
if (token == before) {
|
|
|
|
|
|
|
|
|
|
for (var newToken in insert) {
|
|
|
|
|
|
|
|
|
|
if (insert.hasOwnProperty(newToken)) {
|
|
|
|
|
ret[newToken] = insert[newToken];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret[token] = grammar[token];
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Update references in other language definitions
|
|
|
|
|
_.languages.DFS(_.languages, function(key, value) {
|
|
|
|
|
if (value === root[inside] && key != inside) {
|
|
|
|
|
this[key] = ret;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
return root[inside] = ret;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// Traverse a language definition with Depth First Search
|
|
|
|
|
DFS: function(o, callback, type, visited) {
|
|
|
|
|
visited = visited || {};
|
|
|
|
|
for (var i in o) {
|
|
|
|
|
if (o.hasOwnProperty(i)) {
|
|
|
|
|
callback.call(o, i, o[i], type || i);
|
|
|
|
|
|
|
|
|
|
if (_.util.type(o[i]) === 'Object' && !visited[_.util.objId(o[i])]) {
|
|
|
|
|
visited[_.util.objId(o[i])] = true;
|
|
|
|
|
_.languages.DFS(o[i], callback, null, visited);
|
|
|
|
|
}
|
|
|
|
|
else if (_.util.type(o[i]) === 'Array' && !visited[_.util.objId(o[i])]) {
|
|
|
|
|
visited[_.util.objId(o[i])] = true;
|
|
|
|
|
_.languages.DFS(o[i], callback, i, visited);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
plugins: {},
|
|
|
|
|
|
|
|
|
|
highlightAll: function(async, callback) {
|
|
|
|
|
var env = {
|
|
|
|
|
callback: callback,
|
|
|
|
|
selector: 'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
_.hooks.run("before-highlightall", env);
|
|
|
|
|
|
|
|
|
|
var elements = env.elements || document.querySelectorAll(env.selector);
|
|
|
|
|
|
|
|
|
|
for (var i=0, element; element = elements[i++];) {
|
|
|
|
|
_.highlightElement(element, async === true, env.callback);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
highlightElement: function(element, async, callback) {
|
|
|
|
|
// Find language
|
|
|
|
|
var language, grammar, parent = element;
|
|
|
|
|
|
|
|
|
|
while (parent && !lang.test(parent.className)) {
|
|
|
|
|
parent = parent.parentNode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (parent) {
|
|
|
|
|
language = (parent.className.match(lang) || [,''])[1].toLowerCase();
|
|
|
|
|
grammar = _.languages[language];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Set language on the element, if not present
|
|
|
|
|
element.className = element.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
|
|
|
|
|
|
|
|
|
|
// Set language on the parent, for styling
|
|
|
|
|
parent = element.parentNode;
|
|
|
|
|
|
|
|
|
|
if (/pre/i.test(parent.nodeName)) {
|
|
|
|
|
parent.className = parent.className.replace(lang, '').replace(/\s+/g, ' ') + ' language-' + language;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var code = element.textContent;
|
|
|
|
|
|
|
|
|
|
var env = {
|
|
|
|
|
element: element,
|
|
|
|
|
language: language,
|
|
|
|
|
grammar: grammar,
|
|
|
|
|
code: code
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
_.hooks.run('before-sanity-check', env);
|
|
|
|
|
|
|
|
|
|
if (!env.code || !env.grammar) {
|
2017-01-12 20:29:40 +08:00
|
|
|
|
if (env.code) {
|
|
|
|
|
env.element.textContent = env.code;
|
|
|
|
|
}
|
2016-11-26 18:09:55 +08:00
|
|
|
|
_.hooks.run('complete', env);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_.hooks.run('before-highlight', env);
|
|
|
|
|
|
|
|
|
|
if (async && _self.Worker) {
|
|
|
|
|
var worker = new Worker(_.filename);
|
|
|
|
|
|
|
|
|
|
worker.onmessage = function(evt) {
|
|
|
|
|
env.highlightedCode = evt.data;
|
|
|
|
|
|
|
|
|
|
_.hooks.run('before-insert', env);
|
|
|
|
|
|
|
|
|
|
env.element.innerHTML = env.highlightedCode;
|
|
|
|
|
|
|
|
|
|
callback && callback.call(env.element);
|
|
|
|
|
_.hooks.run('after-highlight', env);
|
|
|
|
|
_.hooks.run('complete', env);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
worker.postMessage(JSON.stringify({
|
|
|
|
|
language: env.language,
|
|
|
|
|
code: env.code,
|
|
|
|
|
immediateClose: true
|
|
|
|
|
}));
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
env.highlightedCode = _.highlight(env.code, env.grammar, env.language);
|
|
|
|
|
|
|
|
|
|
_.hooks.run('before-insert', env);
|
|
|
|
|
|
|
|
|
|
env.element.innerHTML = env.highlightedCode;
|
|
|
|
|
|
|
|
|
|
callback && callback.call(element);
|
|
|
|
|
|
|
|
|
|
_.hooks.run('after-highlight', env);
|
|
|
|
|
_.hooks.run('complete', env);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
highlight: function (text, grammar, language) {
|
|
|
|
|
var tokens = _.tokenize(text, grammar);
|
|
|
|
|
return Token.stringify(_.util.encode(tokens), language);
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
tokenize: function(text, grammar, language) {
|
|
|
|
|
var Token = _.Token;
|
|
|
|
|
|
|
|
|
|
var strarr = [text];
|
|
|
|
|
|
|
|
|
|
var rest = grammar.rest;
|
|
|
|
|
|
|
|
|
|
if (rest) {
|
|
|
|
|
for (var token in rest) {
|
|
|
|
|
grammar[token] = rest[token];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
delete grammar.rest;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tokenloop: for (var token in grammar) {
|
|
|
|
|
if(!grammar.hasOwnProperty(token) || !grammar[token]) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var patterns = grammar[token];
|
|
|
|
|
patterns = (_.util.type(patterns) === "Array") ? patterns : [patterns];
|
|
|
|
|
|
|
|
|
|
for (var j = 0; j < patterns.length; ++j) {
|
|
|
|
|
var pattern = patterns[j],
|
|
|
|
|
inside = pattern.inside,
|
|
|
|
|
lookbehind = !!pattern.lookbehind,
|
|
|
|
|
greedy = !!pattern.greedy,
|
|
|
|
|
lookbehindLength = 0,
|
|
|
|
|
alias = pattern.alias;
|
|
|
|
|
|
2017-01-12 20:29:40 +08:00
|
|
|
|
if (greedy && !pattern.pattern.global) {
|
|
|
|
|
// Without the global flag, lastIndex won't work
|
|
|
|
|
var flags = pattern.pattern.toString().match(/[imuy]*$/)[0];
|
|
|
|
|
pattern.pattern = RegExp(pattern.pattern.source, flags + "g");
|
|
|
|
|
}
|
|
|
|
|
|
2016-11-26 18:09:55 +08:00
|
|
|
|
pattern = pattern.pattern || pattern;
|
|
|
|
|
|
2017-01-12 20:29:40 +08:00
|
|
|
|
// Don’t cache length as it changes during the loop
|
|
|
|
|
for (var i=0, pos = 0; i<strarr.length; pos += strarr[i].length, ++i) {
|
2016-11-26 18:09:55 +08:00
|
|
|
|
|
|
|
|
|
var str = strarr[i];
|
|
|
|
|
|
|
|
|
|
if (strarr.length > text.length) {
|
|
|
|
|
// Something went terribly wrong, ABORT, ABORT!
|
|
|
|
|
break tokenloop;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (str instanceof Token) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pattern.lastIndex = 0;
|
|
|
|
|
|
|
|
|
|
var match = pattern.exec(str),
|
|
|
|
|
delNum = 1;
|
|
|
|
|
|
|
|
|
|
// Greedy patterns can override/remove up to two previously matched tokens
|
|
|
|
|
if (!match && greedy && i != strarr.length - 1) {
|
2017-01-12 20:29:40 +08:00
|
|
|
|
pattern.lastIndex = pos;
|
|
|
|
|
match = pattern.exec(text);
|
|
|
|
|
if (!match) {
|
|
|
|
|
break;
|
2016-11-26 18:09:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
2017-01-12 20:29:40 +08:00
|
|
|
|
var from = match.index + (lookbehind ? match[1].length : 0),
|
|
|
|
|
to = match.index + match[0].length,
|
|
|
|
|
k = i,
|
|
|
|
|
p = pos;
|
|
|
|
|
|
|
|
|
|
for (var len = strarr.length; k < len && p < to; ++k) {
|
|
|
|
|
p += strarr[k].length;
|
|
|
|
|
// Move the index i to the element in strarr that is closest to from
|
|
|
|
|
if (from >= p) {
|
|
|
|
|
++i;
|
|
|
|
|
pos = p;
|
|
|
|
|
}
|
2016-11-26 18:09:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
2017-01-12 20:29:40 +08:00
|
|
|
|
/*
|
|
|
|
|
* If strarr[i] is a Token, then the match starts inside another Token, which is invalid
|
|
|
|
|
* If strarr[k - 1] is greedy we are in conflict with another greedy pattern
|
|
|
|
|
*/
|
|
|
|
|
if (strarr[i] instanceof Token || strarr[k - 1].greedy) {
|
2016-11-26 18:09:55 +08:00
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Number of tokens to delete and replace with the new match
|
2017-01-12 20:29:40 +08:00
|
|
|
|
delNum = k - i;
|
|
|
|
|
str = text.slice(pos, p);
|
|
|
|
|
match.index -= pos;
|
2016-11-26 18:09:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!match) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(lookbehind) {
|
|
|
|
|
lookbehindLength = match[1].length;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var from = match.index + lookbehindLength,
|
|
|
|
|
match = match[0].slice(lookbehindLength),
|
|
|
|
|
to = from + match.length,
|
|
|
|
|
before = str.slice(0, from),
|
|
|
|
|
after = str.slice(to);
|
|
|
|
|
|
|
|
|
|
var args = [i, delNum];
|
|
|
|
|
|
|
|
|
|
if (before) {
|
|
|
|
|
args.push(before);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var wrapped = new Token(token, inside? _.tokenize(match, inside) : match, alias, match, greedy);
|
|
|
|
|
|
|
|
|
|
args.push(wrapped);
|
|
|
|
|
|
|
|
|
|
if (after) {
|
|
|
|
|
args.push(after);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Array.prototype.splice.apply(strarr, args);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return strarr;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
hooks: {
|
|
|
|
|
all: {},
|
|
|
|
|
|
|
|
|
|
add: function (name, callback) {
|
|
|
|
|
var hooks = _.hooks.all;
|
|
|
|
|
|
|
|
|
|
hooks[name] = hooks[name] || [];
|
|
|
|
|
|
|
|
|
|
hooks[name].push(callback);
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
run: function (name, env) {
|
|
|
|
|
var callbacks = _.hooks.all[name];
|
|
|
|
|
|
|
|
|
|
if (!callbacks || !callbacks.length) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (var i=0, callback; callback = callbacks[i++];) {
|
|
|
|
|
callback(env);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var Token = _.Token = function(type, content, alias, matchedStr, greedy) {
|
|
|
|
|
this.type = type;
|
|
|
|
|
this.content = content;
|
|
|
|
|
this.alias = alias;
|
|
|
|
|
// Copy of the full string this token was created from
|
2017-01-12 20:29:40 +08:00
|
|
|
|
this.length = (matchedStr || "").length|0;
|
2016-11-26 18:09:55 +08:00
|
|
|
|
this.greedy = !!greedy;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Token.stringify = function(o, language, parent) {
|
|
|
|
|
if (typeof o == 'string') {
|
|
|
|
|
return o;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (_.util.type(o) === 'Array') {
|
|
|
|
|
return o.map(function(element) {
|
|
|
|
|
return Token.stringify(element, language, o);
|
|
|
|
|
}).join('');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var env = {
|
|
|
|
|
type: o.type,
|
|
|
|
|
content: Token.stringify(o.content, language, parent),
|
|
|
|
|
tag: 'span',
|
|
|
|
|
classes: ['token', o.type],
|
|
|
|
|
attributes: {},
|
|
|
|
|
language: language,
|
|
|
|
|
parent: parent
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (env.type == 'comment') {
|
|
|
|
|
env.attributes['spellcheck'] = 'true';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (o.alias) {
|
|
|
|
|
var aliases = _.util.type(o.alias) === 'Array' ? o.alias : [o.alias];
|
|
|
|
|
Array.prototype.push.apply(env.classes, aliases);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
_.hooks.run('wrap', env);
|
|
|
|
|
|
2017-01-12 20:29:40 +08:00
|
|
|
|
var attributes = Object.keys(env.attributes).map(function(name) {
|
|
|
|
|
return name + '="' + (env.attributes[name] || '').replace(/"/g, '"') + '"';
|
|
|
|
|
}).join(' ');
|
2016-11-26 18:09:55 +08:00
|
|
|
|
|
2017-01-12 20:29:40 +08:00
|
|
|
|
return '<' + env.tag + ' class="' + env.classes.join(' ') + '"' + (attributes ? ' ' + attributes : '') + '>' + env.content + '</' + env.tag + '>';
|
2016-11-26 18:09:55 +08:00
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if (!_self.document) {
|
|
|
|
|
if (!_self.addEventListener) {
|
|
|
|
|
// in Node.js
|
|
|
|
|
return _self.Prism;
|
|
|
|
|
}
|
|
|
|
|
// In worker
|
|
|
|
|
_self.addEventListener('message', function(evt) {
|
|
|
|
|
var message = JSON.parse(evt.data),
|
|
|
|
|
lang = message.language,
|
|
|
|
|
code = message.code,
|
|
|
|
|
immediateClose = message.immediateClose;
|
|
|
|
|
|
|
|
|
|
_self.postMessage(_.highlight(code, _.languages[lang], lang));
|
|
|
|
|
if (immediateClose) {
|
|
|
|
|
_self.close();
|
|
|
|
|
}
|
|
|
|
|
}, false);
|
|
|
|
|
|
|
|
|
|
return _self.Prism;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//Get current script and highlight
|
|
|
|
|
var script = document.currentScript || [].slice.call(document.getElementsByTagName("script")).pop();
|
|
|
|
|
|
|
|
|
|
if (script) {
|
|
|
|
|
_.filename = script.src;
|
|
|
|
|
|
|
|
|
|
if (document.addEventListener && !script.hasAttribute('data-manual')) {
|
|
|
|
|
if(document.readyState !== "loading") {
|
2017-01-12 20:29:40 +08:00
|
|
|
|
if (window.requestAnimationFrame) {
|
|
|
|
|
window.requestAnimationFrame(_.highlightAll);
|
|
|
|
|
} else {
|
|
|
|
|
window.setTimeout(_.highlightAll, 16);
|
|
|
|
|
}
|
2016-11-26 18:09:55 +08:00
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
document.addEventListener('DOMContentLoaded', _.highlightAll);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return _self.Prism;
|
|
|
|
|
|
|
|
|
|
})();
|
|
|
|
|
|
2017-01-12 20:29:40 +08:00
|
|
|
|
if ('object' !== 'undefined' && module.exports) {
|
2016-11-26 18:09:55 +08:00
|
|
|
|
module.exports = Prism;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// hack for components to work correctly in node.js
|
|
|
|
|
if (typeof commonjsGlobal !== 'undefined') {
|
|
|
|
|
commonjsGlobal.Prism = Prism;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* **********************************************
|
|
|
|
|
Begin prism-markup.js
|
|
|
|
|
********************************************** */
|
|
|
|
|
|
|
|
|
|
Prism.languages.markup = {
|
|
|
|
|
'comment': /<!--[\w\W]*?-->/,
|
|
|
|
|
'prolog': /<\?[\w\W]+?\?>/,
|
2017-01-12 20:29:40 +08:00
|
|
|
|
'doctype': /<!DOCTYPE[\w\W]+?>/i,
|
2016-11-26 18:09:55 +08:00
|
|
|
|
'cdata': /<!\[CDATA\[[\w\W]*?]]>/i,
|
|
|
|
|
'tag': {
|
2017-01-12 20:29:40 +08:00
|
|
|
|
pattern: /<\/?(?!\d)[^\s>\/=$<]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,
|
2016-11-26 18:09:55 +08:00
|
|
|
|
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
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Plugin to make entity title show the real entity, idea by Roman Komarov
|
|
|
|
|
Prism.hooks.add('wrap', function(env) {
|
|
|
|
|
|
|
|
|
|
if (env.type === 'entity') {
|
|
|
|
|
env.attributes['title'] = env.content.replace(/&/, '&');
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Prism.languages.xml = Prism.languages.markup;
|
|
|
|
|
Prism.languages.html = Prism.languages.markup;
|
|
|
|
|
Prism.languages.mathml = Prism.languages.markup;
|
|
|
|
|
Prism.languages.svg = Prism.languages.markup;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* **********************************************
|
|
|
|
|
Begin prism-css.js
|
|
|
|
|
********************************************** */
|
|
|
|
|
|
|
|
|
|
Prism.languages.css = {
|
|
|
|
|
'comment': /\/\*[\w\W]*?\*\//,
|
|
|
|
|
'atrule': {
|
|
|
|
|
pattern: /@[\w-]+?.*?(;|(?=\s*\{))/i,
|
|
|
|
|
inside: {
|
|
|
|
|
'rule': /@[\w-]+/
|
|
|
|
|
// See rest below
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
'url': /url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,
|
|
|
|
|
'selector': /[^\{\}\s][^\{\};]*?(?=\s*\{)/,
|
2017-01-12 20:29:40 +08:00
|
|
|
|
'string': {
|
|
|
|
|
pattern: /("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,
|
|
|
|
|
greedy: true
|
|
|
|
|
},
|
2016-11-26 18:09:55 +08:00
|
|
|
|
'property': /(\b|\B)[\w-]+(?=\s*:)/i,
|
|
|
|
|
'important': /\B!important\b/i,
|
|
|
|
|
'function': /[-a-z0-9]+(?=\()/i,
|
|
|
|
|
'punctuation': /[(){};:]/
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
Prism.languages.css['atrule'].inside.rest = Prism.util.clone(Prism.languages.css);
|
|
|
|
|
|
|
|
|
|
if (Prism.languages.markup) {
|
|
|
|
|
Prism.languages.insertBefore('markup', 'tag', {
|
|
|
|
|
'style': {
|
|
|
|
|
pattern: /(<style[\w\W]*?>)[\w\W]*?(?=<\/style>)/i,
|
|
|
|
|
lookbehind: true,
|
|
|
|
|
inside: Prism.languages.css,
|
|
|
|
|
alias: 'language-css'
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Prism.languages.insertBefore('inside', 'attr-value', {
|
|
|
|
|
'style-attr': {
|
|
|
|
|
pattern: /\s*style=("|').*?\1/i,
|
|
|
|
|
inside: {
|
|
|
|
|
'attr-name': {
|
|
|
|
|
pattern: /^\s*style/i,
|
|
|
|
|
inside: Prism.languages.markup.tag.inside
|
|
|
|
|
},
|
|
|
|
|
'punctuation': /^\s*=\s*['"]|['"]\s*$/,
|
|
|
|
|
'attr-value': {
|
|
|
|
|
pattern: /.+/i,
|
|
|
|
|
inside: Prism.languages.css
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
alias: 'language-css'
|
|
|
|
|
}
|
|
|
|
|
}, Prism.languages.markup.tag);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* **********************************************
|
|
|
|
|
Begin prism-clike.js
|
|
|
|
|
********************************************** */
|
|
|
|
|
|
|
|
|
|
Prism.languages.clike = {
|
|
|
|
|
'comment': [
|
|
|
|
|
{
|
|
|
|
|
pattern: /(^|[^\\])\/\*[\w\W]*?\*\//,
|
|
|
|
|
lookbehind: true
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
pattern: /(^|[^\\:])\/\/.*/,
|
|
|
|
|
lookbehind: true
|
|
|
|
|
}
|
|
|
|
|
],
|
|
|
|
|
'string': {
|
|
|
|
|
pattern: /(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,
|
|
|
|
|
greedy: true
|
|
|
|
|
},
|
|
|
|
|
'class-name': {
|
|
|
|
|
pattern: /((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,
|
|
|
|
|
lookbehind: true,
|
|
|
|
|
inside: {
|
|
|
|
|
punctuation: /(\.|\\)/
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
'keyword': /\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,
|
|
|
|
|
'boolean': /\b(true|false)\b/,
|
|
|
|
|
'function': /[a-z0-9_]+(?=\()/i,
|
|
|
|
|
'number': /\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,
|
|
|
|
|
'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,
|
|
|
|
|
'punctuation': /[{}[\];(),.:]/
|
2016-11-20 15:56:37 +08:00
|
|
|
|
};
|
|
|
|
|
|
2016-11-26 18:09:55 +08:00
|
|
|
|
|
|
|
|
|
/* **********************************************
|
|
|
|
|
Begin prism-javascript.js
|
|
|
|
|
********************************************** */
|
|
|
|
|
|
|
|
|
|
Prism.languages.javascript = Prism.languages.extend('clike', {
|
|
|
|
|
'keyword': /\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|var|void|while|with|yield)\b/,
|
|
|
|
|
'number': /\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,
|
|
|
|
|
// Allow for all non-ASCII characters (See http://stackoverflow.com/a/2008444)
|
2017-01-12 20:29:40 +08:00
|
|
|
|
'function': /[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i,
|
|
|
|
|
'operator': /--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*\*?|\/|~|\^|%|\.{3}/
|
2016-11-26 18:09:55 +08:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Prism.languages.insertBefore('javascript', 'keyword', {
|
|
|
|
|
'regex': {
|
|
|
|
|
pattern: /(^|[^/])\/(?!\/)(\[.+?]|\\.|[^/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,
|
|
|
|
|
lookbehind: true,
|
|
|
|
|
greedy: true
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Prism.languages.insertBefore('javascript', 'string', {
|
|
|
|
|
'template-string': {
|
|
|
|
|
pattern: /`(?:\\\\|\\?[^\\])*?`/,
|
|
|
|
|
greedy: true,
|
|
|
|
|
inside: {
|
|
|
|
|
'interpolation': {
|
|
|
|
|
pattern: /\$\{[^}]+\}/,
|
|
|
|
|
inside: {
|
|
|
|
|
'interpolation-punctuation': {
|
|
|
|
|
pattern: /^\$\{|\}$/,
|
|
|
|
|
alias: 'punctuation'
|
|
|
|
|
},
|
|
|
|
|
rest: Prism.languages.javascript
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
'string': /[\s\S]+/
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (Prism.languages.markup) {
|
|
|
|
|
Prism.languages.insertBefore('markup', 'tag', {
|
|
|
|
|
'script': {
|
|
|
|
|
pattern: /(<script[\w\W]*?>)[\w\W]*?(?=<\/script>)/i,
|
|
|
|
|
lookbehind: true,
|
|
|
|
|
inside: Prism.languages.javascript,
|
|
|
|
|
alias: 'language-javascript'
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Prism.languages.js = Prism.languages.javascript;
|
|
|
|
|
|
|
|
|
|
/* **********************************************
|
|
|
|
|
Begin prism-file-highlight.js
|
|
|
|
|
********************************************** */
|
|
|
|
|
|
|
|
|
|
(function () {
|
|
|
|
|
if (typeof self === 'undefined' || !self.Prism || !self.document || !document.querySelector) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
self.Prism.fileHighlight = function() {
|
|
|
|
|
|
|
|
|
|
var Extensions = {
|
|
|
|
|
'js': 'javascript',
|
|
|
|
|
'py': 'python',
|
|
|
|
|
'rb': 'ruby',
|
|
|
|
|
'ps1': 'powershell',
|
|
|
|
|
'psm1': 'powershell',
|
|
|
|
|
'sh': 'bash',
|
|
|
|
|
'bat': 'batch',
|
|
|
|
|
'h': 'c',
|
|
|
|
|
'tex': 'latex'
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
if(Array.prototype.forEach) { // Check to prevent error in IE8
|
|
|
|
|
Array.prototype.slice.call(document.querySelectorAll('pre[data-src]')).forEach(function (pre) {
|
|
|
|
|
var src = pre.getAttribute('data-src');
|
|
|
|
|
|
|
|
|
|
var language, parent = pre;
|
|
|
|
|
var lang = /\blang(?:uage)?-(?!\*)(\w+)\b/i;
|
|
|
|
|
while (parent && !lang.test(parent.className)) {
|
|
|
|
|
parent = parent.parentNode;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (parent) {
|
|
|
|
|
language = (pre.className.match(lang) || [, ''])[1];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!language) {
|
|
|
|
|
var extension = (src.match(/\.(\w+)$/) || [, ''])[1];
|
|
|
|
|
language = Extensions[extension] || extension;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var code = document.createElement('code');
|
|
|
|
|
code.className = 'language-' + language;
|
|
|
|
|
|
|
|
|
|
pre.textContent = '';
|
|
|
|
|
|
|
|
|
|
code.textContent = 'Loading…';
|
|
|
|
|
|
|
|
|
|
pre.appendChild(code);
|
|
|
|
|
|
|
|
|
|
var xhr = new XMLHttpRequest();
|
|
|
|
|
|
|
|
|
|
xhr.open('GET', src, true);
|
|
|
|
|
|
|
|
|
|
xhr.onreadystatechange = function () {
|
|
|
|
|
if (xhr.readyState == 4) {
|
|
|
|
|
|
|
|
|
|
if (xhr.status < 400 && xhr.responseText) {
|
|
|
|
|
code.textContent = xhr.responseText;
|
|
|
|
|
|
|
|
|
|
Prism.highlightElement(code);
|
|
|
|
|
}
|
|
|
|
|
else if (xhr.status >= 400) {
|
|
|
|
|
code.textContent = '✖ Error ' + xhr.status + ' while fetching file: ' + xhr.statusText;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
code.textContent = '✖ Error: File does not exist or is empty';
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
xhr.send(null);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
document.addEventListener('DOMContentLoaded', self.Prism.fileHighlight);
|
|
|
|
|
|
|
|
|
|
})();
|
|
|
|
|
});
|
|
|
|
|
|
2016-11-20 22:29:36 +08:00
|
|
|
|
/**
|
2016-11-29 01:07:47 +08:00
|
|
|
|
* Render github corner
|
|
|
|
|
* @param {Object} data
|
|
|
|
|
* @return {String}
|
2016-11-20 22:29:36 +08:00
|
|
|
|
*/
|
2016-11-29 01:07:47 +08:00
|
|
|
|
function corner (data) {
|
|
|
|
|
if (!data) { return '' }
|
|
|
|
|
if (!/\/\//.test(data)) { data = 'https://github.com/' + data; }
|
2016-11-29 21:43:29 +08:00
|
|
|
|
data = data.replace(/^git\+/, '');
|
2016-11-20 22:29:36 +08:00
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
return ("\n <a href=\"" + data + "\" class=\"github-corner\" aria-label=\"View source on Github\">\n <svg viewBox=\"0 0 250 250\" aria-hidden=\"true\">\n <path d=\"M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z\"></path>\n <path d=\"M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2\" fill=\"currentColor\" style=\"transform-origin: 130px 106px;\" class=\"octo-arm\"></path>\n <path d=\"M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z\" fill=\"currentColor\" class=\"octo-body\"></path>\n </svg>\n </a>")
|
|
|
|
|
}
|
2016-11-20 22:29:36 +08:00
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
/**
|
|
|
|
|
* Render main content
|
|
|
|
|
*/
|
2016-12-22 00:26:06 +08:00
|
|
|
|
function main (tpl) {
|
2017-01-01 12:01:23 +08:00
|
|
|
|
var aside = tpl + "<aside class=\"sidebar\"></aside>";
|
|
|
|
|
|
|
|
|
|
return (isMobile() ? (aside + "<main>") : ("<main>" + aside)) +
|
|
|
|
|
"<section class=\"content\">\n <article class=\"markdown-section\"></article>\n </section>\n </main>"
|
2016-12-22 00:26:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Cover Page
|
|
|
|
|
*/
|
|
|
|
|
function cover () {
|
|
|
|
|
var SL = ', 100%, 85%';
|
|
|
|
|
var bgc = "linear-gradient(to left bottom, hsl(" + (Math.floor(Math.random() * 255) + SL) + ") 0%, hsl(" + (Math.floor(Math.random() * 255) + SL) + ") 100%)";
|
|
|
|
|
|
2016-12-31 13:47:16 +08:00
|
|
|
|
return ("<section class=\"cover\" style=\"background: " + bgc + "\">\n <div class=\"cover-main\"></div>\n <div class=\"mask\"></div>\n </section>")
|
2016-11-29 01:07:47 +08:00
|
|
|
|
}
|
2016-11-20 22:29:36 +08:00
|
|
|
|
|
2016-12-22 00:26:06 +08:00
|
|
|
|
function toggle () {
|
2016-12-31 22:04:54 +08:00
|
|
|
|
return "<button class=\"sidebar-toggle\">\n <div class=\"sidebar-toggle-button\">\n <span></span><span></span><span></span>\n </div>\n </button>"
|
2016-11-29 21:43:29 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
/**
|
|
|
|
|
* Render tree
|
|
|
|
|
* @param {Array} tree
|
|
|
|
|
* @param {String} tpl
|
|
|
|
|
* @return {String}
|
|
|
|
|
*/
|
|
|
|
|
function tree (toc, tpl) {
|
2016-11-20 22:29:36 +08:00
|
|
|
|
if ( tpl === void 0 ) tpl = '';
|
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
if (!toc || !toc.length) { return '' }
|
2016-11-20 22:29:36 +08:00
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
toc.forEach(function (node) {
|
2016-11-27 18:56:25 +08:00
|
|
|
|
tpl += "<li><a class=\"section-link\" href=\"" + (node.slug) + "\">" + (node.title) + "</a></li>";
|
2016-11-20 22:29:36 +08:00
|
|
|
|
if (node.children) {
|
2016-11-29 01:07:47 +08:00
|
|
|
|
tpl += "<li><ul class=\"children\">" + (tree(node.children)) + "</li></ul>";
|
2016-11-20 22:29:36 +08:00
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
2016-11-26 18:09:55 +08:00
|
|
|
|
return tpl
|
2016-11-29 01:07:47 +08:00
|
|
|
|
}
|
2016-11-20 15:56:37 +08:00
|
|
|
|
|
2017-01-24 22:31:27 +08:00
|
|
|
|
function helper (className, content) {
|
|
|
|
|
return ("<p class=\"" + className + "\">" + (content.slice(5).trim()) + "</p>")
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-08 21:12:33 +08:00
|
|
|
|
var OPTIONS$1 = {};
|
2017-01-04 21:42:40 +08:00
|
|
|
|
var markdown = marked;
|
|
|
|
|
var toc = [];
|
2016-12-13 22:11:50 +08:00
|
|
|
|
var CACHE = {};
|
2016-12-08 21:12:33 +08:00
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
var renderTo = function (dom, content) {
|
|
|
|
|
dom = typeof dom === 'object' ? dom : document.querySelector(dom);
|
|
|
|
|
dom.innerHTML = content;
|
2017-01-04 21:42:40 +08:00
|
|
|
|
slugify.clear();
|
2016-11-29 01:07:47 +08:00
|
|
|
|
|
|
|
|
|
return dom
|
2016-11-20 22:29:36 +08:00
|
|
|
|
};
|
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
/**
|
2017-01-04 21:42:40 +08:00
|
|
|
|
* init render
|
|
|
|
|
* @param {Object} options
|
2016-11-29 01:07:47 +08:00
|
|
|
|
*/
|
2017-01-04 21:42:40 +08:00
|
|
|
|
function init (options) {
|
|
|
|
|
OPTIONS$1 = options;
|
2016-11-29 01:07:47 +08:00
|
|
|
|
|
2017-01-04 21:42:40 +08:00
|
|
|
|
var renderer = new marked.Renderer();
|
|
|
|
|
/**
|
|
|
|
|
* render anchor tag
|
|
|
|
|
* @link https://github.com/chjj/marked#overriding-renderer-methods
|
|
|
|
|
*/
|
|
|
|
|
renderer.heading = function (text, level) {
|
|
|
|
|
var slug = slugify(text);
|
|
|
|
|
var route = '';
|
|
|
|
|
|
|
|
|
|
if (OPTIONS$1.router) {
|
|
|
|
|
route = "#/" + (getRoute());
|
|
|
|
|
}
|
2016-11-29 01:07:47 +08:00
|
|
|
|
|
2017-01-04 21:42:40 +08:00
|
|
|
|
toc.push({ level: level, slug: (route + "#" + (encodeURIComponent(slug))), title: text });
|
2016-12-08 21:12:33 +08:00
|
|
|
|
|
2017-01-04 21:42:40 +08:00
|
|
|
|
return ("<h" + level + " id=\"" + slug + "\"><a href=\"" + route + "#" + slug + "\" data-id=\"" + slug + "\" class=\"anchor\"><span>" + text + "</span></a></h" + level + ">")
|
|
|
|
|
};
|
|
|
|
|
// highlight code
|
|
|
|
|
renderer.code = function (code, lang) {
|
|
|
|
|
if ( lang === void 0 ) lang = '';
|
2016-11-20 22:29:36 +08:00
|
|
|
|
|
2017-01-24 11:28:04 +08:00
|
|
|
|
var hl = prism.highlight(code, prism.languages[lang] || prism.languages.markup);
|
2016-11-26 18:09:55 +08:00
|
|
|
|
|
2017-01-24 11:28:04 +08:00
|
|
|
|
return ("<pre v-pre data-lang=\"" + lang + "\"><code class=\"lang-" + lang + "\">" + hl + "</code></pre>")
|
2017-01-04 21:42:40 +08:00
|
|
|
|
};
|
|
|
|
|
renderer.link = function (href, title, text) {
|
|
|
|
|
if (OPTIONS$1.router && !/:/.test(href)) {
|
|
|
|
|
href = ("#/" + href).replace(/\/\//g, '/');
|
|
|
|
|
}
|
2016-12-08 21:12:33 +08:00
|
|
|
|
|
2017-01-04 21:42:40 +08:00
|
|
|
|
return ("<a href=\"" + href + "\" title=\"" + (title || '') + "\">" + text + "</a>")
|
|
|
|
|
};
|
2017-01-10 23:33:41 +08:00
|
|
|
|
renderer.paragraph = function (text) {
|
2017-01-24 22:31:27 +08:00
|
|
|
|
if (/^!>/.test(text)) {
|
|
|
|
|
return helper('tip', text)
|
|
|
|
|
} else if (/^\?>/.test(text)) {
|
|
|
|
|
return helper('warn', text)
|
|
|
|
|
}
|
|
|
|
|
return ("<p>" + text + "</p>")
|
2017-01-10 23:33:41 +08:00
|
|
|
|
};
|
2017-01-04 21:42:40 +08:00
|
|
|
|
|
|
|
|
|
if (typeof OPTIONS$1.markdown === 'function') {
|
|
|
|
|
markdown.setOptions({ renderer: renderer });
|
|
|
|
|
markdown = OPTIONS$1.markdown.call(this, markdown);
|
|
|
|
|
} else {
|
|
|
|
|
markdown.setOptions(merge({ renderer: renderer }, OPTIONS$1.markdown));
|
|
|
|
|
}
|
|
|
|
|
}
|
2016-11-29 01:07:47 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* App
|
|
|
|
|
*/
|
2016-12-08 21:12:33 +08:00
|
|
|
|
function renderApp (dom, replace) {
|
2016-11-29 01:07:47 +08:00
|
|
|
|
var nav = document.querySelector('nav') || document.createElement('nav');
|
|
|
|
|
|
2016-12-22 00:26:06 +08:00
|
|
|
|
if (!OPTIONS$1.repo) { nav.classList.add('no-badge'); }
|
|
|
|
|
|
|
|
|
|
dom[replace ? 'outerHTML' : 'innerHTML'] = corner(OPTIONS$1.repo) +
|
|
|
|
|
(OPTIONS$1.coverpage ? cover() : '') +
|
|
|
|
|
main(OPTIONS$1.sidebarToggle ? toggle() : '');
|
2016-11-29 01:07:47 +08:00
|
|
|
|
document.body.insertBefore(nav, document.body.children[0]);
|
2016-11-29 21:43:29 +08:00
|
|
|
|
|
|
|
|
|
// bind toggle
|
|
|
|
|
bindToggle('button.sidebar-toggle');
|
2016-12-22 00:26:06 +08:00
|
|
|
|
// bind sticky effect
|
|
|
|
|
if (OPTIONS$1.coverpage) {
|
|
|
|
|
!isMobile() && window.addEventListener('scroll', sticky);
|
|
|
|
|
} else {
|
|
|
|
|
document.body.classList.add('sticky');
|
|
|
|
|
}
|
2016-11-26 18:09:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
/**
|
|
|
|
|
* article
|
|
|
|
|
*/
|
2016-12-08 21:12:33 +08:00
|
|
|
|
function renderArticle (content) {
|
2017-01-04 21:42:40 +08:00
|
|
|
|
renderTo('article', content ? markdown(content) : 'not found');
|
2016-12-31 13:47:16 +08:00
|
|
|
|
if (!OPTIONS$1.sidebar && !OPTIONS$1.loadSidebar) { renderSidebar(); }
|
2016-12-16 22:38:44 +08:00
|
|
|
|
|
2017-01-24 11:28:04 +08:00
|
|
|
|
if (content && typeof Vue !== 'undefined') {
|
|
|
|
|
var script = content.match('<script[^>]*?>([^<]+)</script>');
|
|
|
|
|
|
2017-01-24 22:31:27 +08:00
|
|
|
|
script && document.body.querySelector('article script').remove();
|
|
|
|
|
CACHE.vm && CACHE.vm.$destroy();
|
|
|
|
|
CACHE.vm = script
|
2017-01-24 11:28:04 +08:00
|
|
|
|
? new Function(("return " + (script[1].trim())))()
|
|
|
|
|
: new Vue({ el: 'main' }); // eslint-disable-line
|
2017-01-24 22:31:27 +08:00
|
|
|
|
CACHE.vm && CACHE.vm.$nextTick(function (_) { return scrollActiveSidebar(); });
|
2016-12-31 13:47:16 +08:00
|
|
|
|
}
|
2017-01-10 23:33:41 +08:00
|
|
|
|
if (OPTIONS$1.auto2top) { setTimeout(function () { return scroll2Top(OPTIONS$1.auto2top); }, 0); }
|
2016-11-29 01:07:47 +08:00
|
|
|
|
}
|
2016-11-27 18:56:25 +08:00
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
/**
|
|
|
|
|
* navbar
|
|
|
|
|
*/
|
2016-12-08 21:12:33 +08:00
|
|
|
|
function renderNavbar (content) {
|
2016-12-17 15:38:00 +08:00
|
|
|
|
if (CACHE.navbar && CACHE.navbar === content) { return }
|
|
|
|
|
CACHE.navbar = content;
|
2016-11-26 18:09:55 +08:00
|
|
|
|
|
2017-01-04 21:42:40 +08:00
|
|
|
|
if (content) { renderTo('nav', markdown(content)); }
|
2016-11-29 01:07:47 +08:00
|
|
|
|
activeLink('nav');
|
|
|
|
|
}
|
2016-11-20 15:56:37 +08:00
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
/**
|
|
|
|
|
* sidebar
|
|
|
|
|
*/
|
2016-12-08 21:12:33 +08:00
|
|
|
|
function renderSidebar (content) {
|
2016-12-31 13:47:16 +08:00
|
|
|
|
var html;
|
2016-11-29 01:07:47 +08:00
|
|
|
|
|
|
|
|
|
if (content) {
|
2017-01-04 21:42:40 +08:00
|
|
|
|
html = markdown(content);
|
2017-01-12 20:29:40 +08:00
|
|
|
|
// find url tag
|
|
|
|
|
html = html.match(/<ul[^>]*>([\s\S]+)<\/ul>/g)[0];
|
2016-12-08 21:12:33 +08:00
|
|
|
|
} else if (OPTIONS$1.sidebar) {
|
2016-12-31 13:47:16 +08:00
|
|
|
|
html = tree(OPTIONS$1.sidebar, '<ul>');
|
2016-11-29 01:07:47 +08:00
|
|
|
|
} else {
|
2016-12-31 13:47:16 +08:00
|
|
|
|
html = tree(genTree(toc, OPTIONS$1.maxLevel), '<ul>');
|
2016-11-29 01:07:47 +08:00
|
|
|
|
}
|
|
|
|
|
|
2017-01-12 20:29:40 +08:00
|
|
|
|
html = (OPTIONS$1.name ? ("<h1><a href=\"" + (OPTIONS$1.nameLink) + "\">" + (OPTIONS$1.name) + "</a></h1>") : '') + html;
|
2016-12-31 13:47:16 +08:00
|
|
|
|
renderTo('aside.sidebar', html);
|
|
|
|
|
var target = activeLink('aside.sidebar', true);
|
2017-01-10 23:33:41 +08:00
|
|
|
|
if (target) { renderSubSidebar(target); }
|
2016-12-08 21:12:33 +08:00
|
|
|
|
toc = [];
|
2016-12-31 13:47:16 +08:00
|
|
|
|
|
|
|
|
|
scrollActiveSidebar();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function renderSubSidebar (target) {
|
|
|
|
|
if (!OPTIONS$1.subMaxLevel) { return }
|
|
|
|
|
target.parentNode.innerHTML += tree(genTree(toc, OPTIONS$1.subMaxLevel), '<ul>');
|
2016-12-08 21:12:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-12-22 00:26:06 +08:00
|
|
|
|
/**
|
|
|
|
|
* Cover Page
|
|
|
|
|
*/
|
|
|
|
|
function renderCover (content) {
|
|
|
|
|
renderCover.dom = renderCover.dom || document.querySelector('section.cover');
|
|
|
|
|
if (!content) {
|
2016-12-31 13:47:16 +08:00
|
|
|
|
renderCover.dom.classList.remove('show');
|
|
|
|
|
return
|
2016-12-22 00:26:06 +08:00
|
|
|
|
}
|
2016-12-31 13:47:16 +08:00
|
|
|
|
renderCover.dom.classList.add('show');
|
2017-01-12 20:29:40 +08:00
|
|
|
|
if (renderCover.rendered) { return sticky() }
|
2016-12-31 13:47:16 +08:00
|
|
|
|
|
|
|
|
|
// render cover
|
2017-01-13 23:33:04 +08:00
|
|
|
|
var cacheToc = toc.slice();
|
2017-01-04 21:42:40 +08:00
|
|
|
|
var html = markdown(content);
|
2017-01-12 20:29:40 +08:00
|
|
|
|
var match = html.trim().match('<p><img[^s]+src="(.*?)"[^a]+alt="(.*?)">([^<]*?)</p>$');
|
2016-12-31 13:47:16 +08:00
|
|
|
|
|
2017-01-13 23:33:04 +08:00
|
|
|
|
toc = cacheToc.slice();
|
|
|
|
|
|
2016-12-31 13:47:16 +08:00
|
|
|
|
// render background
|
|
|
|
|
if (match) {
|
|
|
|
|
var coverEl = document.querySelector('section.cover');
|
|
|
|
|
|
|
|
|
|
if (match[2] === 'color') {
|
2017-01-12 20:29:40 +08:00
|
|
|
|
coverEl.style.background = match[1] + (match[3] || '');
|
2016-12-31 13:47:16 +08:00
|
|
|
|
} else {
|
|
|
|
|
coverEl.classList.add('has-mask');
|
|
|
|
|
coverEl.style.backgroundImage = "url(" + (match[1]) + ")";
|
|
|
|
|
}
|
|
|
|
|
html = html.replace(match[0], '');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
renderTo('.cover-main', html);
|
|
|
|
|
renderCover.rendered = true;
|
2016-12-23 21:47:31 +08:00
|
|
|
|
|
|
|
|
|
sticky();
|
2016-12-22 00:26:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-12-16 22:38:44 +08:00
|
|
|
|
/**
|
|
|
|
|
* render loading bar
|
|
|
|
|
* @return {[type]} [description]
|
|
|
|
|
*/
|
|
|
|
|
function renderLoading (ref) {
|
|
|
|
|
var loaded = ref.loaded;
|
|
|
|
|
var total = ref.total;
|
2016-12-19 21:53:25 +08:00
|
|
|
|
var step = ref.step;
|
2016-12-16 22:38:44 +08:00
|
|
|
|
|
2016-12-19 21:53:25 +08:00
|
|
|
|
var num;
|
2016-12-16 22:38:44 +08:00
|
|
|
|
|
2016-12-17 15:38:00 +08:00
|
|
|
|
if (!CACHE.loading) {
|
2016-12-16 22:38:44 +08:00
|
|
|
|
var div = document.createElement('div');
|
|
|
|
|
|
|
|
|
|
div.classList.add('progress');
|
|
|
|
|
document.body.appendChild(div);
|
2016-12-17 15:38:00 +08:00
|
|
|
|
CACHE.loading = div;
|
2016-12-16 22:38:44 +08:00
|
|
|
|
}
|
2016-12-19 21:53:25 +08:00
|
|
|
|
if (step) {
|
|
|
|
|
num = parseInt(CACHE.loading.style.width, 10) + step;
|
|
|
|
|
num = num > 80 ? 80 : num;
|
|
|
|
|
} else {
|
|
|
|
|
num = Math.floor(loaded / total * 100);
|
|
|
|
|
}
|
2016-12-17 09:01:41 +08:00
|
|
|
|
|
2016-12-17 15:38:00 +08:00
|
|
|
|
CACHE.loading.style.opacity = 1;
|
|
|
|
|
CACHE.loading.style.width = num >= 95 ? '100%' : num + '%';
|
|
|
|
|
|
2016-12-17 09:01:41 +08:00
|
|
|
|
if (num >= 95) {
|
2016-12-19 21:53:25 +08:00
|
|
|
|
clearTimeout(renderLoading.cacheTimeout);
|
|
|
|
|
renderLoading.cacheTimeout = setTimeout(function (_) {
|
2016-12-17 15:38:00 +08:00
|
|
|
|
CACHE.loading.style.opacity = 0;
|
|
|
|
|
CACHE.loading.style.width = '0%';
|
2016-12-17 09:01:41 +08:00
|
|
|
|
}, 200);
|
|
|
|
|
}
|
2016-12-16 22:38:44 +08:00
|
|
|
|
}
|
|
|
|
|
|
2017-01-04 21:42:40 +08:00
|
|
|
|
var OPTIONS = merge({
|
2016-11-29 01:07:47 +08:00
|
|
|
|
el: '#app',
|
|
|
|
|
repo: '',
|
|
|
|
|
maxLevel: 6,
|
2016-12-31 13:47:16 +08:00
|
|
|
|
subMaxLevel: 0,
|
2016-11-29 01:07:47 +08:00
|
|
|
|
sidebar: '',
|
2016-11-29 21:43:29 +08:00
|
|
|
|
sidebarToggle: false,
|
2016-11-29 01:07:47 +08:00
|
|
|
|
loadSidebar: null,
|
2016-12-08 21:12:33 +08:00
|
|
|
|
loadNavbar: null,
|
2016-12-16 22:38:44 +08:00
|
|
|
|
router: false,
|
2016-12-20 21:20:08 +08:00
|
|
|
|
homepage: 'README.md',
|
2016-12-22 00:26:06 +08:00
|
|
|
|
coverpage: '',
|
2016-12-20 21:20:08 +08:00
|
|
|
|
basePath: '',
|
2017-01-12 20:29:40 +08:00
|
|
|
|
auto2top: false,
|
|
|
|
|
name: '',
|
|
|
|
|
nameLink: window.location.pathname
|
2017-01-04 21:42:40 +08:00
|
|
|
|
}, window.$docsify);
|
2016-11-29 01:07:47 +08:00
|
|
|
|
var script = document.currentScript || [].slice.call(document.getElementsByTagName('script')).pop();
|
2016-11-20 22:29:36 +08:00
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
// load configuration for script attribute
|
|
|
|
|
if (script) {
|
|
|
|
|
for (var prop in OPTIONS) {
|
|
|
|
|
var val = script.getAttribute('data-' + camel2kebab(prop));
|
2017-01-13 23:33:04 +08:00
|
|
|
|
OPTIONS[prop] = isNil(val) ? OPTIONS[prop] : (val || true);
|
2016-11-29 01:07:47 +08:00
|
|
|
|
}
|
|
|
|
|
if (OPTIONS.loadSidebar === true) { OPTIONS.loadSidebar = '_sidebar.md'; }
|
|
|
|
|
if (OPTIONS.loadNavbar === true) { OPTIONS.loadNavbar = '_navbar.md'; }
|
2016-12-22 00:26:06 +08:00
|
|
|
|
if (OPTIONS.coverpage === true) { OPTIONS.coverpage = '_coverpage.md'; }
|
2017-01-13 23:33:04 +08:00
|
|
|
|
if (OPTIONS.repo === true) { OPTIONS.repo = ''; }
|
|
|
|
|
if (OPTIONS.name === true) { OPTIONS.name = ''; }
|
2016-11-29 01:07:47 +08:00
|
|
|
|
if (OPTIONS.sidebar) { OPTIONS.sidebar = window[OPTIONS.sidebar]; }
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-08 21:12:33 +08:00
|
|
|
|
// load options
|
2017-01-04 21:42:40 +08:00
|
|
|
|
init(OPTIONS);
|
2016-11-29 01:07:47 +08:00
|
|
|
|
|
2016-12-08 21:12:33 +08:00
|
|
|
|
var cacheRoute = null;
|
2016-12-16 22:38:44 +08:00
|
|
|
|
var cacheXhr = null;
|
2016-11-29 01:07:47 +08:00
|
|
|
|
|
2016-12-13 22:11:50 +08:00
|
|
|
|
var mainRender = function (cb) {
|
2016-12-20 21:20:08 +08:00
|
|
|
|
var route = OPTIONS.basePath + getRoute();
|
2016-12-13 22:11:50 +08:00
|
|
|
|
if (cacheRoute === route) { return cb() }
|
2016-12-20 21:20:08 +08:00
|
|
|
|
|
2016-12-08 21:12:33 +08:00
|
|
|
|
var basePath = cacheRoute = route;
|
|
|
|
|
|
|
|
|
|
if (!/\//.test(basePath)) {
|
|
|
|
|
basePath = '';
|
|
|
|
|
} else if (basePath && !/\/$/.test(basePath)) {
|
2016-12-13 22:11:50 +08:00
|
|
|
|
basePath = basePath.match(/(\S*\/)[^\/]+$/)[1];
|
2016-12-08 21:12:33 +08:00
|
|
|
|
}
|
2016-11-29 01:07:47 +08:00
|
|
|
|
|
2016-12-20 21:20:08 +08:00
|
|
|
|
var page;
|
|
|
|
|
if (!route) {
|
|
|
|
|
page = OPTIONS.homepage || 'README.md';
|
|
|
|
|
} else if (/\/$/.test(route)) {
|
|
|
|
|
page = route + "README.md";
|
|
|
|
|
} else {
|
|
|
|
|
page = route + ".md";
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-22 00:26:06 +08:00
|
|
|
|
// Render Cover page
|
2016-12-23 21:47:31 +08:00
|
|
|
|
if (OPTIONS.coverpage && page === OPTIONS.homepage) {
|
|
|
|
|
load(OPTIONS.coverpage).then(renderCover);
|
2016-12-22 00:26:06 +08:00
|
|
|
|
}
|
|
|
|
|
|
2016-12-16 22:38:44 +08:00
|
|
|
|
cacheXhr && cacheXhr.abort && cacheXhr.abort();
|
2016-11-29 01:07:47 +08:00
|
|
|
|
// Render markdown file
|
2016-12-20 21:20:08 +08:00
|
|
|
|
cacheXhr = load(page, 'GET', renderLoading);
|
2016-12-16 22:38:44 +08:00
|
|
|
|
cacheXhr.then(function (result) {
|
|
|
|
|
renderArticle(result);
|
2016-12-23 21:47:31 +08:00
|
|
|
|
// clear cover
|
|
|
|
|
if (OPTIONS.coverpage && page !== OPTIONS.homepage) { renderCover(); }
|
|
|
|
|
// render sidebar
|
2016-12-16 22:38:44 +08:00
|
|
|
|
if (OPTIONS.loadSidebar) {
|
2017-01-24 11:28:04 +08:00
|
|
|
|
var renderSidebar$$1 = function (result) { renderSidebar(result); cb(); };
|
|
|
|
|
|
|
|
|
|
load(basePath + OPTIONS.loadSidebar).then(renderSidebar$$1,
|
|
|
|
|
function (_) { return load(OPTIONS.loadSidebar).then(renderSidebar$$1); });
|
2016-12-16 22:38:44 +08:00
|
|
|
|
} else {
|
|
|
|
|
cb();
|
|
|
|
|
}
|
|
|
|
|
}, function (_) { return renderArticle(null); });
|
2016-11-29 01:07:47 +08:00
|
|
|
|
|
|
|
|
|
// Render navbar
|
|
|
|
|
if (OPTIONS.loadNavbar) {
|
2017-01-24 11:28:04 +08:00
|
|
|
|
load(basePath + OPTIONS.loadNavbar).then(renderNavbar,
|
|
|
|
|
function (_) { return load(OPTIONS.loadNavbar).then(renderNavbar); });
|
2016-12-08 21:12:33 +08:00
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var Docsify = function () {
|
|
|
|
|
var dom = document.querySelector(OPTIONS.el) || document.body;
|
|
|
|
|
var replace = dom !== document.body;
|
2016-12-13 22:11:50 +08:00
|
|
|
|
var main = function () {
|
2017-01-04 21:42:40 +08:00
|
|
|
|
mainRender(function (_) {
|
|
|
|
|
scrollIntoView();
|
|
|
|
|
activeLink('nav');
|
|
|
|
|
});
|
2016-12-13 22:11:50 +08:00
|
|
|
|
};
|
2016-12-08 21:12:33 +08:00
|
|
|
|
|
|
|
|
|
// Render app
|
|
|
|
|
renderApp(dom, replace);
|
2016-12-13 22:11:50 +08:00
|
|
|
|
main();
|
2016-12-08 21:12:33 +08:00
|
|
|
|
if (OPTIONS.router) {
|
|
|
|
|
if (!/^#\//.test(window.location.hash)) { window.location.hash = '#/'; }
|
2016-12-13 22:11:50 +08:00
|
|
|
|
window.addEventListener('hashchange', main);
|
2016-11-29 01:07:47 +08:00
|
|
|
|
}
|
2016-11-20 15:56:37 +08:00
|
|
|
|
};
|
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
var index = Docsify();
|
2016-11-20 15:56:37 +08:00
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
return index;
|
2016-11-20 15:56:37 +08:00
|
|
|
|
|
2016-11-29 01:07:47 +08:00
|
|
|
|
}());
|