Skip to content

Commit 5e091c7

Browse files
authored
Merge pull request #13067 from mcanouil/fix/issue11750
fix: extend filter path resolution to support `at`/`path` filters from extensions
2 parents 522d1fe + 1302d40 commit 5e091c7

File tree

5 files changed

+75
-11
lines changed

5 files changed

+75
-11
lines changed

news/changelog-1.8.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ All changes included in 1.8:
7878

7979
## Lua Filters and API
8080

81+
- ([#11750](https://github.com/quarto-dev/quarto-cli/pull/11750)): Extend filter path resolution to support `at`/`path` filters from extensions.
8182
- ([#12727](https://github.com/quarto-dev/quarto-cli/issues/12727)): Do not crash in the presence of malformed tabset contents.
8283
- ([#12806](https://github.com/quarto-dev/quarto-cli/pull/12806)): Use pandoc APIs to handle codepage conversion on Windows.
8384
- ([#12811](https://github.com/quarto-dev/quarto-cli/pull/12811)): Add support for YouTube Shorts in `video` shortcode.

src/command/render/filters.ts

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -851,19 +851,28 @@ async function resolveFilterExtension(
851851
// Resolve any filters that are provided by an extension
852852
const results: (QuartoFilter | QuartoFilter[])[] = [];
853853
const getFilter = async (filter: QuartoFilter) => {
854-
// Look for extension names in the filter list and result them
854+
// Look for extension names in the filter list and resolve them
855855
// into the filters provided by the extension
856-
if (
857-
filter !== kQuartoFilterMarker && filter !== kQuartoCiteProcMarker &&
858-
typeof filter === "string"
859-
) {
856+
if (filter === kQuartoFilterMarker || filter === kQuartoCiteProcMarker) {
857+
return filter;
858+
}
859+
860+
let pathToResolve: string | null = null;
861+
862+
if (typeof filter === "string") {
863+
pathToResolve = filter;
864+
} else if (typeof filter === "object" && filter.path) {
865+
pathToResolve = filter.path;
866+
}
867+
868+
if (pathToResolve) {
860869
// The filter string points to an executable file which exists
861-
if (existsSync(filter) && !Deno.statSync(filter).isDirectory) {
870+
if (existsSync(pathToResolve) && !Deno.statSync(pathToResolve).isDirectory) {
862871
return filter;
863872
}
864873

865874
const extensions = await options.services.extension?.find(
866-
filter,
875+
pathToResolve,
867876
options.source,
868877
"filters",
869878
options.project?.config,
@@ -873,15 +882,35 @@ async function resolveFilterExtension(
873882
// Filter this list of extensions
874883
const filteredExtensions = filterExtensions(
875884
extensions || [],
876-
filter,
885+
pathToResolve,
877886
"filter",
878887
);
879888
// Return any contributed plugins
880889
if (filteredExtensions.length > 0) {
881890
// This matches an extension, use the contributed filters
882-
const filters = extensions[0].contributes.filters;
883-
if (filters) {
884-
return filters;
891+
const extensionFilters = extensions[0].contributes.filters;
892+
if (extensionFilters) {
893+
// After "path" resolution, "at" needs to be preserved
894+
if (typeof filter === "string") {
895+
return extensionFilters;
896+
} else if (isFilterEntryPoint(filter)) {
897+
return extensionFilters.map(extFilter => {
898+
if (typeof extFilter === "string") {
899+
return {
900+
type: extFilter.endsWith(".lua") ? "lua" : "json" as "lua" | "json",
901+
path: extFilter,
902+
at: filter.at
903+
};
904+
} else {
905+
return {
906+
...extFilter,
907+
at: filter.at
908+
};
909+
}
910+
});
911+
} else {
912+
return extensionFilters;
913+
}
885914
} else {
886915
return filter;
887916
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
---
2+
title: "Issue 11750"
3+
format: html
4+
filters:
5+
- path: cite
6+
at: post-quarto
7+
_quarto:
8+
tests:
9+
html:
10+
ensureFileRegexMatches:
11+
-
12+
- '<p><a href="#fig-test" class="quarto-xref">Figure&nbsp;1</a></p>'
13+
- '<p><a href="https://github.com/mcanouil">@mcanouil</a></p>'
14+
---
15+
16+
::: {#fig-test}
17+
Not a figure
18+
19+
But a caption
20+
:::
21+
22+
@fig-test
23+
24+
@mcanouil
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
title: Cite
2+
author: Mickaël Canouil
3+
version: 1.0.0
4+
quarto-required: ">=1.8.0"
5+
contributes:
6+
filters:
7+
- cite.lua
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
function Cite(cite)
2+
return pandoc.Link(cite.content, "https://github.com/" .. cite.content[1].text:sub(2))
3+
end

0 commit comments

Comments
 (0)