diff --git a/news/changelog-1.8.md b/news/changelog-1.8.md index af1507c22e1..8e6746bfa2a 100644 --- a/news/changelog-1.8.md +++ b/news/changelog-1.8.md @@ -78,6 +78,7 @@ All changes included in 1.8: ## Lua Filters and API +- ([#11750](https://github.com/quarto-dev/quarto-cli/pull/11750)): Extend filter path resolution to support `at`/`path` filters from extensions. - ([#12727](https://github.com/quarto-dev/quarto-cli/issues/12727)): Do not crash in the presence of malformed tabset contents. - ([#12806](https://github.com/quarto-dev/quarto-cli/pull/12806)): Use pandoc APIs to handle codepage conversion on Windows. - ([#12811](https://github.com/quarto-dev/quarto-cli/pull/12811)): Add support for YouTube Shorts in `video` shortcode. diff --git a/src/command/render/filters.ts b/src/command/render/filters.ts index 0c87d1ece77..fdb4281d4f2 100644 --- a/src/command/render/filters.ts +++ b/src/command/render/filters.ts @@ -851,19 +851,28 @@ async function resolveFilterExtension( // Resolve any filters that are provided by an extension const results: (QuartoFilter | QuartoFilter[])[] = []; const getFilter = async (filter: QuartoFilter) => { - // Look for extension names in the filter list and result them + // Look for extension names in the filter list and resolve them // into the filters provided by the extension - if ( - filter !== kQuartoFilterMarker && filter !== kQuartoCiteProcMarker && - typeof filter === "string" - ) { + if (filter === kQuartoFilterMarker || filter === kQuartoCiteProcMarker) { + return filter; + } + + let pathToResolve: string | null = null; + + if (typeof filter === "string") { + pathToResolve = filter; + } else if (typeof filter === "object" && filter.path) { + pathToResolve = filter.path; + } + + if (pathToResolve) { // The filter string points to an executable file which exists - if (existsSync(filter) && !Deno.statSync(filter).isDirectory) { + if (existsSync(pathToResolve) && !Deno.statSync(pathToResolve).isDirectory) { return filter; } const extensions = await options.services.extension?.find( - filter, + pathToResolve, options.source, "filters", options.project?.config, @@ -873,15 +882,35 @@ async function resolveFilterExtension( // Filter this list of extensions const filteredExtensions = filterExtensions( extensions || [], - filter, + pathToResolve, "filter", ); // Return any contributed plugins if (filteredExtensions.length > 0) { // This matches an extension, use the contributed filters - const filters = extensions[0].contributes.filters; - if (filters) { - return filters; + const extensionFilters = extensions[0].contributes.filters; + if (extensionFilters) { + // After "path" resolution, "at" needs to be preserved + if (typeof filter === "string") { + return extensionFilters; + } else if (isFilterEntryPoint(filter)) { + return extensionFilters.map(extFilter => { + if (typeof extFilter === "string") { + return { + type: extFilter.endsWith(".lua") ? "lua" : "json" as "lua" | "json", + path: extFilter, + at: filter.at + }; + } else { + return { + ...extFilter, + at: filter.at + }; + } + }); + } else { + return extensionFilters; + } } else { return filter; } diff --git a/tests/docs/smoke-all/2025/07/13/11750.qmd b/tests/docs/smoke-all/2025/07/13/11750.qmd new file mode 100644 index 00000000000..743c01d0c49 --- /dev/null +++ b/tests/docs/smoke-all/2025/07/13/11750.qmd @@ -0,0 +1,24 @@ +--- +title: "Issue 11750" +format: html +filters: + - path: cite + at: post-quarto +_quarto: + tests: + html: + ensureFileRegexMatches: + - + - '
' + - '' +--- + +::: {#fig-test} +Not a figure + +But a caption +::: + +@fig-test + +@mcanouil diff --git a/tests/docs/smoke-all/2025/07/13/_extensions/cite/_extension.yml b/tests/docs/smoke-all/2025/07/13/_extensions/cite/_extension.yml new file mode 100644 index 00000000000..dced8e560a4 --- /dev/null +++ b/tests/docs/smoke-all/2025/07/13/_extensions/cite/_extension.yml @@ -0,0 +1,7 @@ +title: Cite +author: Mickaƫl Canouil +version: 1.0.0 +quarto-required: ">=1.8.0" +contributes: + filters: + - cite.lua diff --git a/tests/docs/smoke-all/2025/07/13/_extensions/cite/cite.lua b/tests/docs/smoke-all/2025/07/13/_extensions/cite/cite.lua new file mode 100644 index 00000000000..e2c362a123a --- /dev/null +++ b/tests/docs/smoke-all/2025/07/13/_extensions/cite/cite.lua @@ -0,0 +1,3 @@ +function Cite(cite) + return pandoc.Link(cite.content, "https://github.com/" .. cite.content[1].text:sub(2)) +end