Files
Docs-Viewer/src/markdown/preprocess.js
litruv 10e9f7ac2f Port Docs-Viewer to slatehtml as the docs-viewer package.
Replace the classic DOM shell with slate widgets, markdown→slate rendering, and a CI index build that uses build-docs.cjs.
2026-08-02 20:48:31 +10:00

61 lines
2.0 KiB
JavaScript

/**
* Frontmatter, wiki links, and wiki image embeds (Docs-Viewer compatible).
*/
export function extractMetadata(content) {
const lines = String(content || "").trim().split("\n");
let metadata = {};
let contentStart = 0;
if (lines[0]?.trim() === "---") {
const endMetadata = lines.findIndex((line, index) => index > 0 && line.trim() === "---");
if (endMetadata !== -1) {
const entries = lines
.slice(1, endMetadata)
.map((line) => line.match(/^([\w-]+):\s*(.*)$/))
.filter(Boolean)
.map(([, key, value]) => {
if (key === "defaultOpen") {
return [key, value.trim().toLowerCase() === "true"];
}
if (key === "sort") return [key, parseInt(value.trim(), 10)];
return [key, value.trim()];
});
metadata = Object.fromEntries(entries);
contentStart = endMetadata + 1;
}
}
return {
metadata,
content: lines.slice(contentStart).join("\n").trim(),
};
}
export function ensureTitle(content, title) {
const stripped = String(content || "")
.replace(/^#\s+.*$/m, "")
.trim();
return `# ${title}\n\n${stripped}`;
}
export function processWikiLinks(content, indexService, documents) {
return String(content || "").replace(/\[\[(.*?)\]\]/g, (match, linkText) => {
const [targetTitle, displayText] = linkText.split("|").map((s) => s.trim());
if (/\.(png|jpg|jpeg|gif|webp|mp4|webm)$/i.test(targetTitle)) return match;
const doc = indexService.findDocumentByTitle(documents, targetTitle);
if (!doc) return match;
return `[${displayText || doc.title}](?${doc.slug})`;
});
}
export function processImages(content, _basePath) {
return String(content || "").replace(/!\[\[(.*?)\]\]/g, (match, filename) => {
const mediaPath = `./docs/images/${filename}`;
if (filename.toLowerCase().endsWith(".mp4") || filename.toLowerCase().endsWith(".webm")) {
return `\n\n<video src="${mediaPath}" controls playsinline></video>\n\n`;
}
return `\n\n![${filename}](${mediaPath})\n\n`;
});
}