guidebook/src/lib/anchors.js

38 lines
980 B
JavaScript

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)}));
}