Path: blob/main/src/render/notebook/notebook-contributor-jats.ts
6474 views
/*1* notebook-contributor-jats.ts2*3* Copyright (C) 2020-2022 Posit Software, PBC4*/56import { renderFile } from "../../command/render/render-files.ts";7import {8ExecutedFile,9RenderedFile,10RenderServices,11} from "../../command/render/types.ts";12import {13kClearCellOptions,14kClearHiddenClasses,15kIpynbProduceSourceNotebook,16kJatsSubarticleId,17kKeepHidden,18kNotebookPreserveCells,19kOutputFile,20kRemoveHidden,21kTemplate,22kTo,23kVariant,24} from "../../config/constants.ts";25import { InternalError } from "../../core/lib/error.ts";26import { dirAndStem } from "../../core/path.ts";27import {28kJatsSubarticle,29kLintXml,30} from "../../format/jats/format-jats-types.ts";31import { subarticleTemplatePath } from "../../format/jats/format-jats-paths.ts";32import { ProjectContext } from "../../project/types.ts";33import { NotebookContributor, NotebookMetadata } from "./notebook-types.ts";34import { error } from "../../deno_ral/log.ts";35import { Format } from "../../config/types.ts";36import { safeCloneDeep } from "../../core/safe-clone-deep.ts";3738export const jatsContributor: NotebookContributor = {39resolve: resolveJats,40render: renderJats,41outputFile,42};4344function outputFile(45nbAbsPath: string,46): string {47return jatsOutputFile(nbAbsPath);48}4950function resolveJats(51nbAbsPath: string,52token: string,53executedFile: ExecutedFile,54_notebookMetadata?: NotebookMetadata,55) {56const resolved = safeCloneDeep(executedFile);57const to =58resolved.recipe.format.render[kVariant]?.includes("+element_citations")59? "jats+element_citations"60: "jats";6162resolved.recipe.format.metadata[kLintXml] = false;63resolved.recipe.format.metadata[kJatsSubarticle] = true;64resolved.recipe.format.metadata[kJatsSubarticleId] = token;65resolved.recipe.format.pandoc[kOutputFile] = outputFile(66nbAbsPath,67);68resolved.recipe.output = resolved.recipe.format.pandoc[kOutputFile];69resolved.recipe.format.pandoc.to = to;70resolved.recipe.format.pandoc[kTemplate] = subarticleTemplatePath;7172// Configure echo for this rendering73resolved.recipe.format.execute.echo = false;74resolved.recipe.format.execute.warning = false;75resolved.recipe.format.render[kKeepHidden] = true;76resolved.recipe.format.metadata[kClearHiddenClasses] = "all";77resolved.recipe.format.metadata[kRemoveHidden] = "none";7879// If this recipe is using a a source notebook, clear the cell options80// from the output when rendering81if (resolved.recipe.format.render[kIpynbProduceSourceNotebook]) {82resolved.recipe.format.render[kClearCellOptions] = true;83}8485return resolved;86}87async function renderJats(88nbPath: string,89format: Format,90subArticleToken: string,91services: RenderServices,92_notebookMetadata: NotebookMetadata | undefined,93project: ProjectContext,94): Promise<RenderedFile> {95const to = format.render[kVariant]?.includes("+element_citations")96? "jats+element_citations"97: "jats";9899const rendered = await renderFile(100{ path: nbPath, formats: ["jats"] },101{102services,103flags: {104metadata: {105[kTo]: to,106[kLintXml]: false,107[kJatsSubarticle]: true,108[kJatsSubarticleId]: subArticleToken,109[kOutputFile]: outputFile(nbPath),110[kTemplate]: subarticleTemplatePath,111[kNotebookPreserveCells]: true,112},113quiet: false,114},115echo: true,116warning: true,117quietPandoc: true,118},119services,120project,121);122123// An error occurred rendering this subarticle124if (rendered.error) {125error("Rendering of subarticle produced an unexpected result");126throw (rendered.error);127}128129// There should be only one file130if (rendered.files.length !== 1) {131throw new InternalError(132`Rendering a JATS subarticle should only result in a single file. This attempt resulted in ${rendered.files.length} file(s).`,133);134}135136return rendered.files[0];137}138139function jatsOutputFile(nbAbsPath: string) {140const [_dir, stem] = dirAndStem(nbAbsPath);141return `${stem}.subarticle.xml`;142}143144145