Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quarto-dev
GitHub Repository: quarto-dev/quarto-cli
Path: blob/main/src/execute/markdown.ts
6458 views
1
/*
2
* markdown.ts
3
*
4
* Copyright (C) 2020-2022 Posit Software, PBC
5
*/
6
7
import { extname } from "../deno_ral/path.ts";
8
9
import {
10
DependenciesOptions,
11
ExecuteOptions,
12
ExecutionEngineDiscovery,
13
ExecutionEngineInstance,
14
ExecutionTarget,
15
kMarkdownEngine,
16
kQmdExtensions,
17
PostProcessOptions,
18
} from "./types.ts";
19
import { MappedString } from "../core/lib/text-types.ts";
20
import { EngineProjectContext } from "../project/types.ts";
21
import type { QuartoAPI } from "../core/api/index.ts";
22
23
export const kMdExtensions = [".md", ".markdown"];
24
25
let quarto: QuartoAPI;
26
27
/**
28
* Markdown engine implementation with discovery and launch capabilities
29
*/
30
export const markdownEngineDiscovery: ExecutionEngineDiscovery = {
31
init: (quartoAPI) => {
32
quarto = quartoAPI;
33
},
34
35
name: kMarkdownEngine,
36
defaultExt: ".qmd",
37
defaultYaml: () => [],
38
defaultContent: () => [],
39
validExtensions: () => kQmdExtensions.concat(kMdExtensions),
40
claimsFile: (_file: string, ext: string) => {
41
return kMdExtensions.includes(ext.toLowerCase());
42
},
43
claimsLanguage: (_language: string) => {
44
return false;
45
},
46
canFreeze: false,
47
generatesFigures: false,
48
49
/**
50
* Launch a dynamic execution engine with project context
51
*/
52
launch: (context: EngineProjectContext): ExecutionEngineInstance => {
53
return {
54
name: markdownEngineDiscovery.name,
55
canFreeze: markdownEngineDiscovery.canFreeze,
56
57
markdownForFile(file: string): Promise<MappedString> {
58
return Promise.resolve(quarto.mappedString.fromFile(file));
59
},
60
61
target: (file: string, _quiet?: boolean, markdown?: MappedString) => {
62
const md = markdown ?? quarto.mappedString.fromFile(file);
63
const target: ExecutionTarget = {
64
source: file,
65
input: file,
66
markdown: md,
67
metadata: quarto.markdownRegex.extractYaml(md.value),
68
};
69
return Promise.resolve(target);
70
},
71
72
partitionedMarkdown: (file: string) => {
73
return Promise.resolve(
74
quarto.markdownRegex.partition(Deno.readTextFileSync(file)),
75
);
76
},
77
78
execute: (options: ExecuteOptions) => {
79
// read markdown
80
const markdown = options.target.markdown.value;
81
82
// if it's plain md, validate that it doesn't have executable cells in it
83
if (extname(options.target.input).toLowerCase() === ".md") {
84
const languages = quarto.markdownRegex.getLanguages(markdown);
85
if (languages.size > 0) {
86
throw new Error(
87
"You must use the .qmd extension for documents with executable code.",
88
);
89
}
90
}
91
92
return Promise.resolve({
93
engine: kMarkdownEngine,
94
markdown,
95
supporting: [],
96
filters: [],
97
});
98
},
99
100
dependencies: (_options: DependenciesOptions) => {
101
return Promise.resolve({
102
includes: {},
103
});
104
},
105
106
postprocess: (_options: PostProcessOptions) => Promise.resolve(),
107
};
108
},
109
};
110
111