You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.2 KiB
45 lines
1.2 KiB
3 years ago
|
import path from 'path';
|
||
|
import LRUCache from 'lru-cache';
|
||
|
import slash from 'slash';
|
||
|
import fetchCode from '../md/utils/fetchCode';
|
||
|
|
||
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
||
|
const debug = require('debug')('vitepress:md');
|
||
|
const cache = new LRUCache<string, MarkdownCompileResult>({ max: 1024 });
|
||
|
|
||
|
interface MarkdownCompileResult {
|
||
|
vueSrc: string;
|
||
|
}
|
||
|
|
||
|
export function createVueToMarkdownRenderFn(root: string = process.cwd()): any {
|
||
|
return (src: string, file: string): MarkdownCompileResult => {
|
||
|
const relativePath = slash(path.relative(root, file));
|
||
|
|
||
|
const cached = cache.get(src);
|
||
|
if (cached) {
|
||
|
debug(`[cache hit] ${relativePath}`);
|
||
|
return cached;
|
||
|
}
|
||
|
|
||
|
const start = Date.now();
|
||
|
const docs = fetchCode(src, 'docs')?.trim();
|
||
|
const template = fetchCode(src, 'template');
|
||
|
const script = fetchCode(src, 'script');
|
||
|
const style = fetchCode(src, 'style');
|
||
|
const newContent = `${docs}
|
||
|
\`\`\`vue
|
||
|
${template}
|
||
|
${script}
|
||
|
${style}
|
||
|
\`\`\`
|
||
|
`;
|
||
|
debug(`[render] ${file} in ${Date.now() - start}ms.`);
|
||
|
const result = {
|
||
|
vueSrc: newContent?.trim(),
|
||
|
ignore: !docs,
|
||
|
};
|
||
|
cache.set(src, result);
|
||
|
return result;
|
||
|
};
|
||
|
}
|