"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createMarkdownToVueRenderFn = void 0;
const path_1 = __importDefault(require("path"));
const gray_matter_1 = __importDefault(require("gray-matter"));
const lru_cache_1 = __importDefault(require("lru-cache"));
const markdown_1 = require("./markdown/markdown");
const parseHeader_1 = require("./utils/parseHeader");
const debug = require('debug')('vitepress:md');
const cache = new lru_cache_1.default({ max: 1024 });
function createMarkdownToVueRenderFn(root, options = {}) {
const md = markdown_1.createMarkdownRenderer(options);
return (src, file, lastUpdated, injectData = true) => {
file = path_1.default.relative(root, file);
const cached = cache.get(src);
if (cached) {
debug(`[cache hit] ${file}`);
return cached;
}
const start = Date.now();
const { content, data: frontmatter } = gray_matter_1.default(src);
const { html, data } = md.render(content);
// TODO validate data.links?
// inject page data
const pageData = {
title: inferTitle(frontmatter, content),
frontmatter,
headers: data.headers,
relativePath: file.replace(/\\/g, '/'),
lastUpdated
};
const additionalBlocks = injectData
? injectPageData(data.hoistedTags || [], pageData)
: data.hoistedTags || [];
const vueSrc = additionalBlocks.join('\n') + `\n${html}
`;
debug(`[render] ${file} in ${Date.now() - start}ms.`);
const result = { vueSrc, pageData };
cache.set(src, result);
return result;
};
}
exports.createMarkdownToVueRenderFn = createMarkdownToVueRenderFn;
const scriptRE = /<\/script>/;
const defaultExportRE = /((?:^|\n|;)\s*)export(\s*)default/;
const namedDefaultExportRE = /((?:^|\n|;)\s*)export(.+)as(\s*)default/;
function injectPageData(tags, data) {
const code = `\nexport const __pageData = ${JSON.stringify(JSON.stringify(data))}`;
const existingScriptIndex = tags.findIndex((tag) => scriptRE.test(tag));
if (existingScriptIndex > -1) {
const tagSrc = tags[existingScriptIndex];
// user has `);
}
else {
tags.push(``);
}
return tags;
}
const inferTitle = (frontmatter, content) => {
if (frontmatter.home) {
return 'Home';
}
if (frontmatter.title) {
return parseHeader_1.deeplyParseHeader(frontmatter.title);
}
const match = content.match(/^\s*#+\s+(.*)/m);
if (match) {
return parseHeader_1.deeplyParseHeader(match[1].trim());
}
return '';
};
//# sourceMappingURL=markdownToVue.js.map