38 lines
980 B
JavaScript
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)}));
|
|
} |