2026-05-31 13:54:31 +02:00

147 lines
4.1 KiB
JavaScript

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
};