import { detectFeatures, getDefaultConfig, parse, parseSlide, parseSync, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig } from "./chunk-JZNWQ6OH.mjs"; import { parseAspectRatio, parseRangeString } from "./chunk-47YLTX76.mjs"; // src/fs.ts import fs from "node:fs"; import { dirname, resolve } from "node:path"; import { slash } from "@antfu/utils"; import YAML from "yaml"; var preparserExtensionLoader = null; function injectPreparserExtensionLoader(fn) { preparserExtensionLoader = fn; } async function load(userRoot, filepath, loadedSource = {}, mode) { const markdown = loadedSource[filepath] ?? fs.readFileSync(filepath, "utf-8"); let extensions; if (preparserExtensionLoader) { const lines = markdown.split(/\r?\n/g); let hm = ""; if (lines[0].match(/^---([^-].*)?$/) && !lines[1]?.match(/^\s*$/)) { let hEnd = 1; while (hEnd < lines.length && !lines[hEnd].trimEnd().match(/^---$/)) hEnd++; hm = lines.slice(1, hEnd).join("\n"); } const o = YAML.parse(hm) ?? {}; extensions = await preparserExtensionLoader(o, filepath, mode); } const markdownFiles = {}; const watchFiles = {}; const slides = []; async function loadMarkdown(path, range, frontmatterOverride, importers) { let md = markdownFiles[path]; if (!md) { const raw = loadedSource[path] ?? fs.readFileSync(path, "utf-8"); md = await parse(raw, path, extensions); markdownFiles[path] = md; watchFiles[path] = /* @__PURE__ */ new Set(); } const directImporter = importers?.at(-1); for (const index of parseRangeString(md.slides.length, range)) { const subSlide = md.slides[index - 1]; try { await loadSlide(md, subSlide, frontmatterOverride, importers); } catch (e) { md.errors ??= []; md.errors.push({ row: subSlide.start, message: `Error when loading slide: ${e}` }); continue; } if (directImporter) (directImporter.imports ??= []).push(subSlide); } return md; } async function loadSlide(md, slide, frontmatterOverride, importChain) { if (slide.frontmatter.disabled || slide.frontmatter.hide) return; if (slide.frontmatter.src) { const [rawPath, rangeRaw] = slide.frontmatter.src.split("#"); const path = slash( rawPath.startsWith("/") ? resolve(userRoot, rawPath.substring(1)) : resolve(dirname(slide.filepath), rawPath) ); frontmatterOverride = { ...slide.frontmatter, ...frontmatterOverride }; delete frontmatterOverride.src; if (!fs.existsSync(path)) { md.errors ??= []; md.errors.push({ row: slide.start, message: `Imported markdown file not found: ${path}` }); } else { await loadMarkdown(path, rangeRaw, frontmatterOverride, importChain ? [...importChain, slide] : [slide]); } } else { slides.push({ frontmatter: { ...slide.frontmatter, ...frontmatterOverride }, content: slide.content, revision: slide.revision, frontmatterRaw: slide.frontmatterRaw, note: slide.note, title: slide.title, level: slide.level, index: slides.length, importChain, source: slide }); } } const entry = await loadMarkdown(slash(filepath)); const headmatter = { ...entry.slides[0]?.frontmatter }; if (slides[0]?.title) headmatter.title ??= slides[0].title; return { slides, entry, headmatter, features: detectFeatures(slides.map((s) => s.source.raw).join("")), markdownFiles, watchFiles }; } async function save(markdown) { const fileContent = stringify(markdown); fs.writeFileSync(markdown.filepath, fileContent, "utf-8"); return fileContent; } export { detectFeatures, getDefaultConfig, injectPreparserExtensionLoader, load, parse, parseAspectRatio, parseRangeString, parseSlide, parseSync, prettify, prettifySlide, resolveConfig, resolveFonts, save, stringify, stringifySlide, verifyConfig };