/** * 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\n\n`; } return `\n\n![${filename}](${mediaPath})\n\n`; }); }