UNPKG

mdtocs

Version:

Markdown table of contents generator.

59 lines (58 loc) 1.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parse = parse; const constants_1 = require("../constants"); function parse(markdown) { const headings = markdown.match(constants_1.HEADINGS_REGEX); if (headings === null) { return []; } const fragments = {}; const initialValue = []; return headings.reduce((accumulator, heading) => { const [level, text] = getHeadingLevelAndText(heading); if (level && text) { accumulator.push({ level, text, fragment: createFragment(text, fragments), }); } return accumulator; }, initialValue); } function getHeadingLevelAndText(heading) { const headingMatch = heading.match(constants_1.HEADING_REGEX); if (headingMatch === null) { return []; } const [, headingLevel, headingText, headingTextAlternate, headingLevelAlternate,] = headingMatch; let text; let 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) { const fragment = text .toLowerCase() .split(constants_1.WHITESPACE_REGEX) .join('-') .replace(constants_1.INVALID_FRAGMENT_REGEX, ''); const count = fragments[fragment]; if (count) { fragments[fragment]++; return fragment + constants_1.HYPHEN + count; } fragments[fragment] = 1; return fragment; }