blob: 2aa1fa32bfa4f653005cab26796e4e3764089863 [file] [log] [blame]
find_file <- function(template, file) {
template <- system.file("rmarkdown", "templates", template, file,
package = "posterdown")
if (template == "") {
stop("Couldn't find template file ", template, "/", file, call. = FALSE)
}
template
}
find_resource <- function(template, file) {
find_file(template, file.path("resources", file))
}
knitr_fun <- function(name) utils::getFromNamespace(name, 'knitr')
output_asis <- knitr_fun('output_asis')
merge_list <- function(x, y) {
fun <- knitr_fun('merge_list')
fun(as.list(x), y)
}
#' Render a pandoc template.
#'
#' This is a hacky way to access the pandoc templating engine.
#'
#' @param metadata A named list containing metadata to pass to template.
#' @param template Path to a pandoc template.
#' @param output Path to save output.
#' @return (Invisibly) The path of the generate file.
#' @examples
#' x <- posterdown:::template_pandoc(
#' list(preamble = "%abc", filename = "wickham"),
#' posterdown:::find_resource("posterdown_generic", "template.tex"),
#' tempfile()
#' )
#' if (interactive()) file.show(x)
#' @noRd
template_pandoc <- function(metadata, template, output, verbose = FALSE) {
tmp <- tempfile(fileext = ".md")
on.exit(unlink(tmp))
cat("---\n", file = tmp)
cat(yaml::as.yaml(metadata), file = tmp, append = TRUE)
cat("---\n", file = tmp, append = TRUE)
cat("\n", file = tmp, append = TRUE)
rmarkdown::pandoc_convert(tmp, "markdown", output = output,
options = paste0("--template=", template), verbose = verbose)
invisible(output)
}
# Call rmarkdown::pdf_document and mark the return value as inheriting pdf_document
inherit_pdf_document <- function(...) {
fmt <- rmarkdown::pdf_document(...)
fmt$inherits <- "pdf_document"
fmt
}
# Helper function to create a custom format derived from pdf_document
# that includes a custom LaTeX template and custom CSL definition
pdf_document_format <- function(..., format, template, csl) {
# base format
fmt <- inherit_pdf_document(..., template = find_resource(format, template))
# add csl to pandoc_args
fmt$pandoc$args <- c(fmt$pandoc$args,
"--csl",
rmarkdown::pandoc_path_arg(find_resource(format, csl)))
# return format
fmt
}