Skip to content

Commit 480f0c3

Browse files
authored
Merge pull request #1302 from quarto-dev/bugfix/ext
Extension `Formats` Name Tweak
2 parents fad79a0 + 0970b13 commit 480f0c3

File tree

7 files changed

+47
-39
lines changed

7 files changed

+47
-39
lines changed

src/command/list/cmd.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,20 +77,20 @@ async function outputExtensions(
7777
extension.contributes.filters &&
7878
extension.contributes.filters?.length > 0
7979
) {
80-
contribs.push("filter");
80+
contribs.push("filters");
8181
}
8282

8383
if (
8484
extension.contributes.shortcodes &&
8585
extension.contributes.shortcodes?.length > 0
8686
) {
87-
contribs.push("shortcode");
87+
contribs.push("shortcodes");
8888
}
8989

9090
if (
91-
extension.contributes.format
91+
extension.contributes.formats
9292
) {
93-
contribs.push("format");
93+
contribs.push("formats");
9494
}
9595
return contribs.join(", ");
9696
};

src/command/render/render-contexts.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ import {
4444
kIncludeBeforeBody,
4545
kIncludeInHeader,
4646
kIpynbFilters,
47-
kLatexInputPaths,
4847
kMetadataFormat,
4948
kOutputExt,
5049
kOutputFile,
@@ -573,7 +572,7 @@ const readExtensionFormat = async (
573572
);
574573

575574
// Read the yaml file and resolve / bucketize
576-
const extensionFormat = extension?.contributes.format;
575+
const extensionFormat = extension?.contributes.formats;
577576
if (extensionFormat) {
578577
const extensionMetadata =
579578
(extensionFormat[formatDesc.baseFormat] || {}) as Metadata;

src/extension/extension-shared.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ export interface Extension extends Record<string, unknown> {
2525
contributes: {
2626
shortcodes?: string[];
2727
filters?: QuartoFilter[];
28-
format?: Record<string, unknown>;
28+
formats?: Record<string, unknown>;
2929
};
3030
}
3131

@@ -42,7 +42,7 @@ export interface ExtensionContext {
4242
find(
4343
name: string,
4444
input: string,
45-
contributes?: "shortcodes" | "filters" | "format",
45+
contributes?: "shortcodes" | "filters" | "formats",
4646
project?: ProjectContext,
4747
): Extension[];
4848
}

src/extension/extension.ts

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export function createExtensionContext(): ExtensionContext {
6363
const find = (
6464
name: string,
6565
input: string,
66-
contributes?: "shortcodes" | "filters" | "format",
66+
contributes?: "shortcodes" | "filters" | "formats",
6767
project?: ProjectContext,
6868
): Extension[] => {
6969
const extId = toExtensionId(name);
@@ -145,15 +145,15 @@ const loadExtension = (
145145
function findExtensions(
146146
extensions: Extension[],
147147
extensionId: ExtensionId,
148-
contributes?: "shortcodes" | "filters" | "format",
148+
contributes?: "shortcodes" | "filters" | "formats",
149149
) {
150150
// Filter the extension based upon what they contribute
151151
const exts = extensions.filter((ext) => {
152152
if (contributes === "shortcodes" && ext.contributes.shortcodes) {
153153
return true;
154154
} else if (contributes === "filters" && ext.contributes.filters) {
155155
return true;
156-
} else if (contributes === "format" && ext.contributes.format) {
156+
} else if (contributes === "formats" && ext.contributes.formats) {
157157
return true;
158158
} else {
159159
return contributes === undefined;
@@ -239,6 +239,7 @@ export function readExtensions(
239239
}
240240
}
241241
}
242+
242243
return extensions;
243244
}
244245

@@ -352,7 +353,7 @@ function validateExtension(extension: Extension) {
352353
const contribs = [
353354
extension.contributes.filters,
354355
extension.contributes.shortcodes,
355-
extension.contributes.format,
356+
extension.contributes.formats,
356357
];
357358
contribs.forEach((contrib) => {
358359
if (contrib) {
@@ -391,37 +392,45 @@ function readExtension(
391392
// Paths used should be considered relative to this dir
392393
const extensionDir = dirname(extensionFile);
393394

395+
// The formats that are being contributed
396+
const formats = contributes?.formats as Metadata ||
397+
contributes?.format as Metadata || {};
398+
394399
// Read any embedded extension
395400
const embeddedExtensions = existsSync(join(extensionDir, kExtensionDir))
396401
? readExtensions(join(extensionDir, kExtensionDir))
397402
: [];
398403

399-
// The items that can be contributed
400-
// Resolve shortcodes and filters (these might come from embedded extension)
401-
// Note that resolving will throw if the extension cannot be resolved
402-
const shortcodes = (contributes?.shortcodes as string[] || []).flatMap((
403-
shortcode,
404-
) => {
405-
return resolveShortcode(embeddedExtensions, extensionDir, shortcode);
406-
});
407-
const filters = (contributes?.filters as QuartoFilter[] || []).flatMap(
408-
(filter) => {
409-
return resolveFilter(embeddedExtensions, extensionDir, filter);
410-
},
411-
);
412-
const format = contributes?.format as Metadata || {};
413-
414404
// Process the special 'common' key by merging it
415405
// into any key that isn't 'common' and then removing it
416-
Object.keys(format).filter((key) => {
406+
Object.keys(formats).filter((key) => {
417407
return key !== kCommon;
418408
}).forEach((key) => {
419-
format[key] = mergeConfigs(
420-
format[kCommon] || {},
421-
format[key],
409+
formats[key] = mergeConfigs(
410+
formats[kCommon] || {},
411+
formats[key],
412+
);
413+
414+
const formatMeta = formats[key] as Metadata;
415+
416+
// Resolve shortcodes and filters (these might come from embedded extension)
417+
// Note that resolving will throw if the extension cannot be resolved
418+
formatMeta.shortcodes = (formatMeta.shortcodes as string[] || []).flatMap((
419+
shortcode,
420+
) => {
421+
return resolveShortcode(embeddedExtensions, extensionDir, shortcode);
422+
});
423+
formatMeta.filters = (formatMeta.filters as QuartoFilter[] || []).flatMap(
424+
(filter) => {
425+
return resolveFilter(embeddedExtensions, extensionDir, filter);
426+
},
422427
);
423428
});
424-
delete format[kCommon];
429+
delete formats[kCommon];
430+
431+
// Alias the contributions
432+
const shortcodes = (contributes?.shortcodes || []) as string[];
433+
const filters = (contributes?.filters || {}) as QuartoFilter[];
425434

426435
// Create the extension data structure
427436
return {
@@ -433,7 +442,7 @@ function readExtension(
433442
contributes: {
434443
shortcodes: shortcodes.map((code) => join(extensionDir, code)),
435444
filters,
436-
format,
445+
formats,
437446
},
438447
};
439448
}

src/extension/install.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ async function determineInstallDir(
115115
// use its path as the target for installation
116116
const extension = context.extension(extensionName, dir);
117117
if (extension) {
118-
if (Object.keys(extension?.contributes.format || {}).length > 0) {
118+
if (Object.keys(extension?.contributes.formats || {}).length > 0) {
119119
return extension?.path;
120120
} else {
121121
throw new Error(
@@ -324,10 +324,10 @@ async function confirmInstallation(
324324
const contributes = to.contributes;
325325
const extTypes: string[] = [];
326326
if (
327-
contributes.format &&
328-
Object.keys(contributes.format).length > 0
327+
contributes.formats &&
328+
Object.keys(contributes.formats).length > 0
329329
) {
330-
Object.keys(contributes.format).length === 1
330+
Object.keys(contributes.formats).length === 1
331331
? extTypes.push("format")
332332
: extTypes.push("formats");
333333
}

tests/docs/extensions/format/academic/_extensions/quarto-journals/elsevier/_extension.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: Elsevier Journal Format
22
contributes:
3-
format:
3+
formats:
44
common:
55
date-format: full
66
pdf:

tests/run-tests.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ source bin/activate
3333
python3 -m pip install -r requirements.txt -q
3434

3535
# Ensure that tinytex is installed
36-
quarto tools install tinytex
36+
quarto install tool tinytex --no-prompt
3737

3838
"${DENO_DIR}/tools/deno" test ${QUARTO_DENO_OPTIONS} ${QUARTO_DENO_EXTRA_OPTIONS} "${QUARTO_IMPORT_ARGMAP}" $@
3939

0 commit comments

Comments
 (0)