R/exec.R

Defines functions knitr_progress DiagrammeR_dot2svg exec_render exec_knit

Documented in DiagrammeR_dot2svg exec_knit exec_render

#' Shortcut to use knitr and rmarkdown from commandline
#'
#' @param input File path.
#' @param output File or directory path.
#' @rdname exec
#' @export
exec_knit = function(input, output = NA) {
  if (is.na(output)) {
    withr::local_dir(dirname(input))
    input = basename(input)
    output = NULL
  } else {
    input = normalizePath(input)
    if (dir.exists(output)) {
      withr::local_dir(output)
      output = NULL
    } else {
      withr::local_dir(dirname(output))
      output = basename(output)
    }
  }
  inputname = stringr::str_replace_all(basename(input), "\\W+", "-")
  knitr::opts_knit$set(unnamed.chunk.label = glue("_{inputname}"))
  knitr::opts_chunk$set(cache.path = glue(".cache/{inputname}/"))
  knitr::opts_chunk$set(error = FALSE)
  withr::local_options(knitr.progress.fun = knitr_progress)
  knit_engines_set_cache_stan()
  invisible(knitr::knit(input, output))
}

#' @param output_dir Directory path.
#' @rdname exec
#' @export
exec_render = function(input, output_dir = NA) {
  if (is.na(output_dir)) {
    output_dir = getwd()
  }
  rmarkdown::render(input, output_dir = output_dir)
}

#' @rdname exec
#' @export
DiagrammeR_dot2svg = function(input, output_dir = NA) {
  stopifnot(file.exists(input))
  if (is.na(output_dir)) {
    output_dir = getwd()
  }
  widget = DiagrammeR::grViz(input)
  svg = DiagrammeRsvg::export_svg(widget)
  pattern = stringr::regex(".+(?=<svg)", dotall = TRUE)
  svg = stringr::str_replace(svg, pattern, "")
  outfile = stringr::str_replace(input, "\\.dot$|\\.gr$", ".svg")
  cat(svg, file = fs::path(output_dir, outfile))
}

knitr_progress = function(total, labels) {
  envir = parent.frame()
  list(
    update = \(i) if (nzchar(labels[i])) {
      cli::cli_progress_step(labels[i], .envir = envir)
    },
    done = \() cli::cli_process_done(.envir = envir)
  )
}
heavywatal/rwtl documentation built on April 29, 2024, 2:02 a.m.