Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quarto-dev
GitHub Repository: quarto-dev/quarto-cli
Path: blob/main/src/format/formats.ts
6449 views
1
/*
2
* formats.ts
3
*
4
* Copyright (C) 2020-2022 Posit Software, PBC
5
*/
6
7
import {
8
kBaseFormat,
9
kDefaultImageExtension,
10
kEcho,
11
kFigHeight,
12
kFigWidth,
13
kOutputDivs,
14
kPageWidth,
15
kTargetFormat,
16
kVariant,
17
kWarning,
18
} from "../config/constants.ts";
19
20
import { Format } from "../config/types.ts";
21
22
// these have been moved to imports.ts and imported from top-level quarto.ts
23
// to avoid circular dependencies
24
//
25
// import { htmlFormat } from "./html/format-html.ts";
26
// import { revealjsFormat } from "./reveal/format-reveal.ts";
27
// import { asciidocFormat } from "./asciidoc/format-asciidoc.ts";
28
29
import { beamerFormat, latexFormat, pdfFormat } from "./pdf/format-pdf.ts";
30
import { epubFormat } from "./epub/format-epub.ts";
31
import { docxFormat } from "./docx/format-docx.ts";
32
import {
33
createEbookFormat,
34
createFormat,
35
createHtmlPresentationFormat,
36
createWordprocessorFormat,
37
plaintextFormat,
38
} from "./formats-shared.ts";
39
import { ipynbFormat } from "./ipynb/format-ipynb.ts";
40
import { parseFormatString } from "../core/pandoc/pandoc-formats.ts";
41
import {
42
commonmarkFormat,
43
gfmFormat,
44
markdownFormat,
45
markdownWithCommonmarkExtensionsFormat,
46
pandocMarkdownFormat,
47
} from "./markdown/format-markdown.ts";
48
import { jatsFormat } from "./jats/format-jats.ts";
49
import { typstFormat } from "./typst/format-typst.ts";
50
import { mergePandocVariant } from "../config/metadata.ts";
51
import { writerFormatHandlers } from "./format-handlers.ts";
52
53
export function defaultWriterFormat(to: string): Format {
54
// to can sometimes have a variant, don't include that in the lookup here
55
const formatDescriptor = parseFormatString(to);
56
let lookupTo = formatDescriptor.baseFormat;
57
let pandocTo = lookupTo;
58
59
// get defaults for writer
60
let writerFormat: Format | undefined;
61
62
let handled = false;
63
for (const handler of writerFormatHandlers) {
64
const result = handler(lookupTo);
65
if (result) {
66
handled = true;
67
if (result.pandocTo) {
68
pandocTo = result.pandocTo;
69
}
70
writerFormat = result.format;
71
break;
72
}
73
}
74
75
if (!handled) {
76
switch (lookupTo) {
77
// these have been moved to imports.ts and imported from top-level quarto.ts
78
// to avoid circular dependencies
79
//
80
// case "html":
81
// case "html4":
82
// case "html5":
83
// writerFormat = htmlFormat(7, 5);
84
// break;
85
// case "revealjs":
86
// writerFormat = revealjsFormat();
87
// break;
88
// case "asciidoc":
89
// case "asciidoctor":
90
// writerFormat = asciidocFormat();
91
// break;
92
93
case "pdf":
94
writerFormat = pdfFormat();
95
break;
96
97
case "beamer":
98
writerFormat = beamerFormat();
99
break;
100
101
case "latex":
102
writerFormat = latexFormat("LaTeX");
103
break;
104
105
case "context":
106
writerFormat = latexFormat("ConTeXt");
107
break;
108
109
case "s5":
110
writerFormat = createHtmlPresentationFormat("S5", 9.5, 6.5);
111
break;
112
case "dzslides":
113
writerFormat = createHtmlPresentationFormat("DZSlides", 9.5, 6.5);
114
break;
115
case "slidy":
116
writerFormat = createHtmlPresentationFormat("Slidy", 9.5, 6.5);
117
break;
118
case "slideous":
119
writerFormat = createHtmlPresentationFormat("Slideous", 9.5, 6.5);
120
break;
121
122
case "markdown":
123
writerFormat = pandocMarkdownFormat();
124
pandocTo = to;
125
break;
126
127
case "markdown_phpextra":
128
case "markdown_github":
129
case "markdown_mmd":
130
case "markdown_strict":
131
writerFormat = markdownFormat("Markdown");
132
pandocTo = to;
133
break;
134
135
case "markua":
136
writerFormat = markdownFormat("Markua");
137
pandocTo = to;
138
break;
139
140
case "md":
141
writerFormat = markdownWithCommonmarkExtensionsFormat();
142
lookupTo = "commonmark";
143
pandocTo = "markdown_strict";
144
break;
145
146
case "commonmark":
147
case "commonmark_x":
148
writerFormat = commonmarkFormat(to);
149
pandocTo = to;
150
break;
151
152
case "gfm":
153
writerFormat = gfmFormat();
154
pandocTo = to;
155
break;
156
157
case "docbook":
158
case "docbook4":
159
case "docbook5":
160
writerFormat = plaintextFormat("DocBook", "xml");
161
break;
162
163
case "docx":
164
writerFormat = docxFormat();
165
break;
166
167
case "pptx":
168
writerFormat = powerpointFormat();
169
break;
170
171
case "odt":
172
writerFormat = createWordprocessorFormat("OpenOffice", "odt");
173
break;
174
175
case "opendocument":
176
writerFormat = createWordprocessorFormat("OpenDocument", "xml");
177
break;
178
179
case "rtf":
180
writerFormat = rtfFormat();
181
break;
182
183
case "plain":
184
writerFormat = plaintextFormat("Text", "txt");
185
break;
186
187
case "epub":
188
case "epub2":
189
case "epub3":
190
writerFormat = epubFormat(lookupTo);
191
break;
192
193
case "fb2":
194
writerFormat = createEbookFormat("FictionBook", "fb2");
195
break;
196
197
case "zimwiki":
198
writerFormat = plaintextFormat("Zim Wiki", "zim");
199
break;
200
201
case "jats":
202
writerFormat = jatsFormat("JATS", "xml");
203
break;
204
case "jats_archiving":
205
writerFormat = jatsFormat("JATS Archiving", "xml");
206
break;
207
case "jats_articleauthoring":
208
writerFormat = jatsFormat("JATS Authoring", "xml");
209
break;
210
case "jats_publishing":
211
writerFormat = jatsFormat("JATS Publising", "xml");
212
break;
213
214
case "ipynb":
215
writerFormat = ipynbFormat();
216
break;
217
218
case "biblatex":
219
writerFormat = bibliographyFormat("BibLaTeX", "bib");
220
break;
221
case "bibtex":
222
writerFormat = bibliographyFormat("BibTeX", "bib");
223
break;
224
case "csljson":
225
writerFormat = bibliographyFormat("CSL-JSON", "csl");
226
break;
227
228
case "typst":
229
writerFormat = typstFormat();
230
break;
231
232
case "texttile":
233
writerFormat = plaintextFormat("Textile", to);
234
break;
235
case "texinfo":
236
writerFormat = plaintextFormat("GNU TexInfo", to);
237
break;
238
case "tei":
239
writerFormat = plaintextFormat("TEI Simple", to);
240
break;
241
case "rst":
242
writerFormat = plaintextFormat("reST", to);
243
break;
244
case "org":
245
writerFormat = plaintextFormat("Org-Mode", to);
246
break;
247
case "opml":
248
writerFormat = plaintextFormat("OPML", to);
249
break;
250
case "muse":
251
writerFormat = plaintextFormat("Muse", to);
252
break;
253
case "ms":
254
writerFormat = plaintextFormat("Groff Manuscript", to);
255
break;
256
case "native":
257
writerFormat = plaintextFormat("Native", to);
258
break;
259
case "man":
260
writerFormat = plaintextFormat("Groff Man Page", to);
261
break;
262
case "dokuwiki":
263
writerFormat = plaintextFormat("DocuWiki", to);
264
break;
265
case "haddock":
266
writerFormat = plaintextFormat("Haddock markup", to);
267
break;
268
case "json":
269
writerFormat = plaintextFormat("JSON", to);
270
break;
271
case "icml":
272
writerFormat = plaintextFormat("InDesign", to);
273
break;
274
case "jira":
275
writerFormat = plaintextFormat("Jira Wiki", to);
276
break;
277
case "mediawiki":
278
writerFormat = plaintextFormat("MediaWiki", to);
279
break;
280
case "xwiki":
281
writerFormat = plaintextFormat("XWiki", to);
282
break;
283
284
default:
285
writerFormat = unknownFormat("txt");
286
}
287
}
288
289
if (writerFormat === undefined) {
290
throw new Error(
291
"Should never get here, but TypeScript's analysis doesn't know.",
292
);
293
}
294
295
// set the writer
296
writerFormat.pandoc = writerFormat.pandoc || {};
297
if (!writerFormat.pandoc.to) {
298
writerFormat.pandoc.to = pandocTo;
299
}
300
301
// Set the originating to
302
writerFormat.identifier[kTargetFormat] = to;
303
writerFormat.identifier[kBaseFormat] = lookupTo;
304
305
// Merge any explicitly provided variants
306
writerFormat.render[kVariant] = mergePandocVariant(
307
writerFormat.render[kVariant],
308
formatDescriptor.variants.join(""),
309
);
310
311
// return the createFormat
312
return writerFormat;
313
}
314
315
function powerpointFormat(): Format {
316
return createFormat("Powerpoint", "pptx", {
317
render: {
318
[kPageWidth]: 10,
319
[kOutputDivs]: false,
320
},
321
execute: {
322
[kFigWidth]: 11,
323
[kFigHeight]: 5.5,
324
[kEcho]: false,
325
[kWarning]: false,
326
},
327
pandoc: {
328
[kDefaultImageExtension]: "png",
329
},
330
});
331
}
332
333
function rtfFormat(): Format {
334
return createFormat("RTF", "rtf", createWordprocessorFormat("RTF", "rtf"), {
335
pandoc: {
336
standalone: true,
337
},
338
});
339
}
340
341
function unknownFormat(ext: string): Format {
342
return createFormat("Unknown", ext);
343
}
344
345
function bibliographyFormat(displayName: string, ext: string): Format {
346
return createFormat(displayName, ext);
347
}
348
349