showdown-toc-export
Version:
A showdown extension to output toc info.
135 lines (131 loc) • 4.33 kB
JavaScript
;
function ownKeys(e, r) {
var t = Object.keys(e);
if (Object.getOwnPropertySymbols) {
var o = Object.getOwnPropertySymbols(e);
r && (o = o.filter(function (r) {
return Object.getOwnPropertyDescriptor(e, r).enumerable;
})), t.push.apply(t, o);
}
return t;
}
function _objectSpread2(e) {
for (var r = 1; r < arguments.length; r++) {
var t = null != arguments[r] ? arguments[r] : {};
r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {
_defineProperty(e, r, t[r]);
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {
Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));
});
}
return e;
}
function _defineProperty(obj, key, value) {
key = _toPropertyKey(key);
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
return obj;
}
function _toPrimitive(input, hint) {
if (typeof input !== "object" || input === null) return input;
var prim = input[Symbol.toPrimitive];
if (prim !== undefined) {
var res = prim.call(input, hint || "default");
if (typeof res !== "object") return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _toPropertyKey(arg) {
var key = _toPrimitive(arg, "string");
return typeof key === "symbol" ? key : String(key);
}
function showdownToc() {
var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
toc = _ref.toc,
getToc = _ref.getToc;
return function () {
return [{
type: 'output',
filter: function filter(source) {
var regex = /(<h([1-6]).*?id="([^"]*?)".*?>(.+?)<\/h[1-6]>)|(<p>\[toc\]<\/p>)/g;
// find and collect all headers and [toc] node;
var collection = [];
source.replace(regex, function (wholeMatch, _, level, anchor, text) {
if (wholeMatch === '<p>[toc]</p>') {
collection.push({
type: 'toc'
});
} else {
text = text.replace(/<[^>]+>/g, '');
var tocItem = {
anchor: anchor,
level: Number(level),
text: text
};
if (toc) {
toc.push(tocItem);
}
collection.push(_objectSpread2({
type: 'header'
}, tocItem));
}
return '';
});
console.log("collectioncollection", collection);
// calculate toc info
var tocCollection = [];
collection.forEach(function (_ref2, index) {
var type = _ref2.type;
if (type === 'toc') {
if (collection[index + 1] && collection[index + 1].type === 'header') {
var headers = [];
var levelToToc = collection[index + 1].level;
for (var i = index + 1; i < collection.length; i++) {
if (collection[i].type === 'toc') break;
var level = collection[i].level;
if (level === levelToToc) {
headers.push(collection[i]);
}
}
tocCollection.push(headers);
} else {
tocCollection.push([]);
}
}
});
// replace [toc] node in source
var _origin = [].concat(tocCollection);
var _source = "";
source = source.replace(/<p>\[toc\]<\/p>[\n]*/g, function () {
var headers = tocCollection.shift();
if (headers && headers.length) {
var str = "<ol>".concat(headers.map(function (_ref3) {
var text = _ref3.text,
anchor = _ref3.anchor;
return "<li><a href=\"#".concat(anchor, "\">").concat(text, "</a></li>");
}).join(''), "</ol>\n");
_source = str;
return str;
}
return '';
});
getToc && getToc({
source: _source,
origin: _origin.shift(),
collection: collection
});
return source;
}
}];
};
}
module.exports = showdownToc;