55 lines
1.1 KiB
JavaScript
55 lines
1.1 KiB
JavaScript
"use strict";
|
|
|
|
|
|
|
|
// U T I L S
|
|
|
|
const idRegex = /(".*")/g;
|
|
const numberRegex = /^[0-9]/g;
|
|
const renderedHeaderRegex = /(<h\d\sid.*h\d>)/g;
|
|
const titleRegex = /(>.*<)/g;
|
|
|
|
|
|
|
|
// E X P O R T
|
|
|
|
export default (state, emit, markdown) => {
|
|
const collectionOfTocElements = [];
|
|
const tocElements = markdown.match(renderedHeaderRegex);
|
|
|
|
for (const item of tocElements) {
|
|
const id = item.match(idRegex)[0].replace(/"/g, "");
|
|
const title = item.match(titleRegex)[0].replace(">", "").replace("<", "");
|
|
|
|
collectionOfTocElements.push(`
|
|
<li>
|
|
<a href="${slugify(id)}" title="Go to '${title}'">${title}</a>
|
|
</li>
|
|
`);
|
|
}
|
|
|
|
return `
|
|
<ul class="component--glossary-toc">
|
|
${collectionOfTocElements.join("")}
|
|
</ul>
|
|
`;
|
|
};
|
|
|
|
|
|
|
|
// H E L P E R
|
|
|
|
function slugify(stringToSlugify) {
|
|
let finalString = stringToSlugify
|
|
.toLowerCase()
|
|
.replace(/###\s/g, "")
|
|
.replace(/\s\/\s/g, "-")
|
|
.replace(/\s/g, "-")
|
|
.replace(/%/g, "")
|
|
.replace(/\(/g, "")
|
|
.replace(/\)/g, "")
|
|
.replace(/,/g, "");
|
|
|
|
if (finalString.match(numberRegex)) finalString = `_${finalString}`;
|
|
return `#${finalString}`;
|
|
}
|