147 lines
4.1 KiB
JavaScript
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
|
||
|
|
};
|