markdown-toc-unlazy
Version:
Generate a markdown TOC (table of contents) with Remarkable.
92 lines (79 loc) • 2.13 kB
JavaScript
/**
* Module dependencies
*/
var diacritics = require('diacritics-map');
var concat = require('concat-stream');
var li = require('list-item');
var mdlink = require('markdown-link');
var m = require('minimist');
var merge = require('mixin-deep');
var pick = require('object.pick');
var remarkable = require('remarkable');
var repeat = require('repeat-string');
var strip_color = require('strip-color');
/**
* Get the "title" from a markdown link
*/
function getTitle(str) {
if (/^\[[^\]]+\]\(/.test(str)) {
var m = /^\[([^\]]+)\]/.exec(str);
if (m) return m[1];
}
return str;
};
/**
* Slugify the url part of a markdown link.
*
* @name options.slugify
* @param {String} `str` The string to slugify
* @param {Object} `options` Pass a custom slugify function on `options.slugify`
* @return {String}
* @api public
*/
function slugify(str, options) {
options = options || {};
if (options.slugify === false) return str;
if (typeof options.slugify === 'function') {
return options.slugify(str, options);
}
str = getTitle(str);
str = strip_color(str);
str = str.toLowerCase();
// `.split()` is often (but not always) faster than `.replace()`
str = str.split(' ').join('-');
str = str.split(/\t/).join('--');
if (options.stripHeadingTags !== false) {
str = str.split(/<\/?[^>]+>/).join('');
}
str = str.split(/[|$&`~=\\\/@+*!?({[\]})<>=.,;:'"^]/).join('');
str = str.split(/[。?!,、;:“”【】()〔〕[]﹃﹄“ ”‘’﹁﹂—…-~《》〈〉「」]/).join('');
str = replaceDiacritics(str);
if (options.num) {
str += '-' + options.num;
}
return str;
};
function replaceDiacritics(str) {
return str.replace(/[À-ž]/g, function(ch) {
return diacritics[ch] || ch;
});
}
/**
* Expose `utils` modules
*/
const utils = {
concat: concat,
li: li,
mdlink: mdlink,
minimist: m,
merge: merge,
pick: pick,
Remarkable: remarkable,
repeat: repeat,
strip_color: strip_color,
slugify: slugify,
getTitle: getTitle,
replaceDiacritics: replaceDiacritics
};
module.exports = utils;
;