Skip to content

Commit 6b7bb1f

Browse files
committed
extensions return fully-qualified filter declarations to avoid double-appending project paths
1 parent 7f65fda commit 6b7bb1f

File tree

6 files changed

+159
-274
lines changed

6 files changed

+159
-274
lines changed

src/command/preview/preview.ts

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ import { renderFormats } from "../render/render-contexts.ts";
5757
import { renderResultFinalOutput } from "../render/render.ts";
5858
import { replacePandocArg } from "../render/flags.ts";
5959

60-
import { Format, isPandocFilter } from "../../config/types.ts";
60+
import {
61+
Format,
62+
isPandocFilter,
63+
isQuartoFilterEntryPointQualifiedFull,
64+
} from "../../config/types.ts";
6165
import {
6266
kPdfJsInitialPath,
6367
pdfJsBaseDir,
@@ -467,17 +471,34 @@ export async function renderForPreview(
467471
extensionFiles.push(...renderResult.files.reduce(
468472
(extensionFiles: string[], file: RenderResultFile) => {
469473
const shortcodes = file.format.render.shortcodes || [];
470-
const filters = (file.format.pandoc.filters || []).map((filter) =>
471-
isPandocFilter(filter) ? filter.path : filter
472-
);
474+
const filters = (file.format.pandoc.filters || []).map((filter) => {
475+
if (isPandocFilter(filter)) {
476+
return filter.path;
477+
}
478+
if (isQuartoFilterEntryPointQualifiedFull(filter)) {
479+
switch (filter.path.type) {
480+
case "absolute":
481+
return filter.path.path;
482+
case "relative":
483+
return join(dirname(file.input), filter.path.path);
484+
case "project-relative":
485+
return join(
486+
project?.dir ?? dirname(file.input),
487+
filter.path.path,
488+
);
489+
}
490+
}
491+
return filter;
492+
});
473493
const ipynbFilters = file.format.execute["ipynb-filters"] || [];
474494
[...shortcodes, ...filters.map((filter) => filter), ...ipynbFilters]
475495
.forEach((extensionFile) => {
476496
if (!isAbsolute(extensionFile)) {
477-
const extensionFullPath = join(dirname(file.input), extensionFile);
478-
if (existsSync(extensionFullPath)) {
479-
extensionFiles.push(normalizePath(extensionFullPath));
480-
}
497+
extensionFile = join(dirname(file.input), extensionFile);
498+
}
499+
// const extensionFullPath = join(dirname(file.input), extensionFile);
500+
if (existsSync(extensionFile)) {
501+
extensionFiles.push(normalizePath(extensionFile));
481502
}
482503
});
483504
return extensionFiles;

src/command/render/filters.ts

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ import {
6565
QuartoFilterEntryPointQualifiedFull,
6666
} from "../../config/types.ts";
6767
import { QuartoFilterSpec } from "./types.ts";
68-
import { Metadata } from "../../config/types.ts";
68+
import { Metadata, QualifiedPath } from "../../config/types.ts";
6969
import { kProjectType } from "../../project/types.ts";
7070
import { bibEngine } from "../../config/pdf.ts";
7171
import { rBinaryPath, resourcePath } from "../../core/resources.ts";
@@ -772,7 +772,7 @@ export async function resolveFilters(
772772
return filter.path;
773773
case "relative":
774774
return resolve(dirname(options.source), filter.path);
775-
case "project":
775+
case "project-relative":
776776
return resolve(join(options.project.dir, filter.path));
777777
}
778778
};
@@ -891,13 +891,18 @@ async function resolveFilterExtension(
891891
return { type: filter };
892892
}
893893
if (typeof filter !== "string") {
894-
const fileType: "project" | "relative" = filter.path.startsWith("/")
895-
? "project"
896-
: "relative";
897-
const path = {
898-
type: fileType,
899-
path: filter.path,
900-
};
894+
const path: QualifiedPath = (() => {
895+
if (typeof filter.path !== "string") {
896+
const result = filter.path;
897+
return result;
898+
}
899+
const fileType: "project-relative" | "relative" =
900+
filter.path.startsWith("/") ? "project-relative" : "relative";
901+
return {
902+
type: fileType,
903+
path: filter.path,
904+
};
905+
})();
901906
// deno-lint-ignore no-explicit-any
902907
if ((filter as any).at) {
903908
const entryPoint = filter as QuartoFilterEntryPoint;
@@ -939,8 +944,8 @@ async function resolveFilterExtension(
939944
const filterType: "json" | "lua" = extname(filter) !== ".lua"
940945
? "json"
941946
: "lua";
942-
const pathType: "project" | "relative" = filter.startsWith("/")
943-
? "project"
947+
const pathType: "project-relative" | "relative" = filter.startsWith("/")
948+
? "project-relative"
944949
: "relative";
945950

946951
return {
@@ -999,15 +1004,21 @@ async function resolveFilterExtension(
9991004
},
10001005
};
10011006
}
1002-
1007+
if (typeof f.path === "string") {
1008+
return {
1009+
...f,
1010+
// deno-lint-ignore no-explicit-any
1011+
at: (f as any).at ?? "__quarto-auto",
1012+
path: {
1013+
type: "absolute",
1014+
path: f.path,
1015+
},
1016+
};
1017+
}
10031018
return {
10041019
...f,
1005-
// deno-lint-ignore no-explicit-any
10061020
at: (f as any).at ?? "__quarto-auto",
1007-
path: {
1008-
type: "absolute",
1009-
path: f.path,
1010-
},
1021+
path: f.path,
10111022
};
10121023
});
10131024
};

src/command/render/pandoc.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ import { isWindows } from "../../deno_ral/platform.ts";
207207
import { appendToCombinedLuaProfile } from "../../core/performance/perfetto-utils.ts";
208208
import { makeTimedFunctionAsync } from "../../core/performance/function-times.ts";
209209
import { walkJson } from "../../core/json.ts";
210+
import { asRawPath } from "../../core/qualified-path.ts";
210211

211212
// in case we are running multiple pandoc processes
212213
// we need to make sure we capture all of the trace files
@@ -919,11 +920,19 @@ export async function runPandoc(
919920
allDefaults.filters = allDefaults.filters.map((filter) => {
920921
if (typeof filter === "string") {
921922
return pandocMetadataPath(filter);
922-
} else {
923+
} else if (typeof filter.path === "string") {
923924
return {
924925
type: filter.type,
925926
path: pandocMetadataPath(filter.path),
926927
};
928+
} else {
929+
return {
930+
type: filter.type,
931+
path: pandocMetadataPath(asRawPath(filter.path, {
932+
projectRoot: options.project.dir,
933+
currentFileDir: dirname(options.source),
934+
})),
935+
};
927936
}
928937
});
929938

src/config/types.ts

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -277,11 +277,17 @@ export interface FormatDependency {
277277
resources?: DependencyFile[];
278278
}
279279

280-
type QualifiedPath = {
280+
export type PathType = "project-relative" | "relative" | "absolute";
281+
282+
type BasePath = {
281283
path: string;
282-
type: "relative" | "project" | "absolute";
283284
};
284285

286+
export type QualifiedPath = BasePath & { type: PathType };
287+
export type AbsolutePath = BasePath & { type: "absolute" };
288+
export type RelativePath = BasePath & { type: "relative" };
289+
export type ProjectRelativePath = BasePath & { type: "project-relative" };
290+
285291
export interface DependencyFile {
286292
name: string;
287293
path: string;
@@ -369,10 +375,20 @@ export type QuartoFilterEntryPointQualified =
369375
| QuartoFilterEntryPointQualifiedFull
370376
| QuartoFilterSpecialEntryPoint;
371377

372-
export type QuartoFilter = string | PandocFilter | QuartoFilterEntryPoint;
378+
export type QuartoFilter =
379+
| string
380+
| PandocFilter
381+
| QuartoFilterEntryPoint
382+
| QuartoFilterEntryPointQualifiedFull;
373383

374384
export function isPandocFilter(filter: QuartoFilter): filter is PandocFilter {
375-
return (<PandocFilter> filter).path !== undefined;
385+
return typeof (<PandocFilter> filter).path === "string";
386+
}
387+
388+
export function isQuartoFilterEntryPointQualifiedFull(
389+
filter: QuartoFilter,
390+
): filter is QuartoFilterEntryPointQualifiedFull {
391+
return typeof (<PandocFilter> filter).path !== "string";
376392
}
377393

378394
export function isFilterEntryPoint(

0 commit comments

Comments
 (0)