@nuxtjs/mdc
Version:
Nuxt MDC module
38 lines (37 loc) • 1.41 kB
JavaScript
export function parseThematicBlock(lang) {
if (!lang?.trim()) {
return {
language: void 0,
highlights: void 0,
filename: void 0,
meta: void 0
};
}
const languageMatches = lang.replace(/[{|[](.+)/, "").match(/^[^ \t]+(?=[ \t]|$)/);
const highlightTokensMatches = lang.match(/\{([^}]*)\}/);
const filenameMatches = lang.match(/\[(.*)\]/);
const meta = lang.replace(languageMatches?.[0] ?? "", "").replace(highlightTokensMatches?.[0] ?? "", "").replace(filenameMatches?.[0] ?? "", "").trim();
let filename = void 0;
if (filenameMatches?.[1]) {
filename = filenameMatches[1].replace(/\\([[\]{}().*+?^$|])/g, "$1");
}
return {
language: languageMatches?.[0] || void 0,
highlights: parseHighlightedLines(highlightTokensMatches?.[1] || void 0),
// https://github.com/nuxt/content/pull/2169
filename,
meta
};
}
function parseHighlightedLines(lines) {
const lineArray = String(lines || "").split(",").filter(Boolean).flatMap((line) => {
const [start, end] = line.trim().split("-").map((a) => Number(a.trim()));
return Array.from({ length: (end || start) - start + 1 }).map((_, i) => start + i);
});
return lineArray.length ? lineArray : void 0;
}
const TAG_NAME_REGEXP = /^<\/?([\w-]+)(\s[^>]*?)?\/?>/;
export function getTagName(value) {
const result = String(value).match(TAG_NAME_REGEXP);
return result && result[1];
}