export function toAnchor(name) { return name .trim() .toLowerCase() .replace(/\W/g, '-') // replace non-words with dashes .replace(/-{2,}/g, '-') // deduplicate .replace(/-+$/, '') // remove trailing dashes .replace(/^-+/, ''); } // lazy export function removeMarkdown(md) { return md .replace(/```(.+)```/gm, (_, m) => m) .replace(/``(.+)``/gm, (_, m) => m) .replace(/`(.+)`/gm, (_, m) => m) .replace(/__(.+)__/gm, (_, m) => m) .replace(/_(.+)_/gm, (_, m) => m) .replace(/\*\*(.+)\*\*/gm, (_, m) => m) .replace(/\*(.+)\*/gm, (_, m) => m) } function countHashes(l) { let count = 0; let line = l.split(''); while (line.splice(0, 1)[0] === '#') { count++; } return {level: count, name: line.join('')}; } export function extractAnchors(md) { return md .split('\n') .filter(l => l.trim().startsWith('#')) .map(l => countHashes(l)) .map(l => ({level: l.level, name: removeMarkdown(l.name)})); }