import {
kListings,
kNumberDepth,
kNumberOffset,
kNumberSections,
} from "../../config/constants.ts";
import { FormatPandoc } from "../../config/types.ts";
import { PandocFlags } from "../../config/types.ts";
import { Metadata } from "../../config/types.ts";
import { PandocOptions } from "./types.ts";
import {
crossrefIndexForOutputFile,
kCrossrefIndexFile,
kCrossrefInputType,
} from "../../project/project-crossrefs.ts";
import { pandocMetadataPath } from "./render-paths.ts";
import { isMultiFileBookFormat } from "../../project/types/book/book-shared.ts";
import { projectIsBook } from "../../project/project-shared.ts";
export function crossrefFilterActive(options: PandocOptions) {
return options.format.metadata.crossref !== false;
}
export function crossrefFilterParams(
options: PandocOptions,
defaults?: FormatPandoc,
) {
const flags = options.flags;
const metadata = options.format.metadata;
const kCrossrefFilterParams = [kListings, kNumberSections, kNumberOffset];
const params: Metadata = {};
kCrossrefFilterParams.forEach((option) => {
let value = crossrefOption(option, flags, defaults);
if (value) {
if (option === kNumberOffset) {
if (typeof value === "number") {
value = [value];
}
if (
!Array.isArray(value) || value.some((num) => !Number.isInteger(num))
) {
throw new Error(
"Invalid value for number-offset (should be an array of numbers)",
);
}
if (defaults?.[kNumberSections] === undefined) {
params[kNumberSections] = true;
}
}
params[option] = value;
}
});
params[kNumberDepth] = metadata?.[kNumberDepth];
if (!options.project?.isSingleFile) {
if (
!projectIsBook(options.project) || isMultiFileBookFormat(options.format)
) {
params[kCrossrefIndexFile] = pandocMetadataPath(
crossrefIndexForOutputFile(
options.project!.dir,
options.source,
options.output,
),
);
}
} else {
const crossrefIndex = Deno.env.get("QUARTO_CROSSREF_INDEX_PATH");
if (crossrefIndex) {
params[kCrossrefIndexFile] = pandocMetadataPath(crossrefIndex);
}
}
const crossrefInputType = Deno.env.get("QUARTO_CROSSREF_INPUT_TYPE");
if (crossrefInputType) {
params[kCrossrefInputType] = crossrefInputType;
}
return params;
}
function crossrefOption(
name: string,
flags?: PandocFlags,
defaults?: FormatPandoc,
) {
if (flags && Object.keys(flags).includes(name)) {
return (flags as any)[name];
} else if (Object.keys(defaults || {}).includes(name)) {
return (defaults as any)[name];
} else {
return undefined;
}
}