mdtocs
Version:
Markdown table of contents generator.
59 lines (58 loc) • 1.8 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parse = parse;
var constants_1 = require("../constants");
function parse(markdown) {
var headings = markdown.match(constants_1.HEADINGS_REGEX);
if (headings === null) {
return [];
}
var fragments = {};
var initialValue = [];
return headings.reduce(function (accumulator, heading) {
var _a = getHeadingLevelAndText(heading), level = _a[0], text = _a[1];
if (level && text) {
accumulator.push({
level: level,
text: text,
fragment: createFragment(text, fragments),
});
}
return accumulator;
}, initialValue);
}
function getHeadingLevelAndText(heading) {
var headingMatch = heading.match(constants_1.HEADING_REGEX);
if (headingMatch === null) {
return [];
}
var headingLevel = headingMatch[1], headingText = headingMatch[2], headingTextAlternate = headingMatch[3], headingLevelAlternate = headingMatch[4];
var text;
var level;
if (headingLevelAlternate) {
level = headingLevelAlternate === constants_1.HYPHEN ? 2 : 1;
text = headingTextAlternate.trim();
}
else {
level = headingLevel.length;
text = headingText.trim();
}
if (!text) {
return [];
}
return [level, text];
}
function createFragment(text, fragments) {
var fragment = text
.toLowerCase()
.split(constants_1.WHITESPACE_REGEX)
.join('-')
.replace(constants_1.INVALID_FRAGMENT_REGEX, '');
var count = fragments[fragment];
if (count) {
fragments[fragment]++;
return fragment + constants_1.HYPHEN + count;
}
fragments[fragment] = 1;
return fragment;
}