UNPKG

mdtocs

Version:

Markdown table of contents generator.

59 lines (58 loc) 1.8 kB
"use strict"; 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; }