R/templates.R

Defines functions use_config_yml use_gitignore use_r_buildignore use_task_schedule use_r_profile .use_template word_document_rstudio word_document_te

Documented in use_config_yml use_gitignore use_r_buildignore use_r_profile use_task_schedule .use_template word_document_rstudio word_document_te

#' Custom Word document template
#'
#' @description Export an Rmarkdown file to a Word document using a custom template.
#' @details All of the default arguments are the same as those from the original
#' `rmarkdown::word_document()`. The `_te` version uses a personally
#' customized Word document. The `_rstudio` version is the document
#' that is generated by knitting the default `rmarkdown` Word document template.
#' @inheritParams rmarkdown::word_document
#' @param reference_docx path. Refers to custom word document template.
#' @rdname word_document
#' @export
#' @seealso <https://github.com/rstudio/rmarkdown/blob/master/R/word_document.R>.
word_document_te <-
  function(toc = FALSE,
           toc_depth = 3,
           fig_width = 5,
           fig_height = 4,
           fig_caption = TRUE,
           df_print = "default",
           smart = TRUE,
           highlight = "default",
           # reference_docx = "default",
           reference_docx = system.file("templates", "te", "template-te.docx", package = "teproj"),
           keep_md = FALSE,
           md_extensions = NULL,
           pandoc_args = NULL) {
    rmarkdown::word_document(
      toc = FALSE,
      toc_depth = toc_depth,
      fig_width = fig_width,
      fig_height = fig_height,
      fig_caption = fig_caption,
      df_print = df_print,
      smart = smart,
      highlight = highlight,
      reference_docx = reference_docx,
      keep_md = keep_md,
      md_extensions = md_extensions,
      pandoc_args = pandoc_args
    )
  }

#' @param ... dots. Arguments passed to `word_dcoument_te()`.
#' @rdname word_document
#' @export
word_document_rstudio <-
  function(...,
           reference_docx = system.file("templates", "rstudio", "template-default.docx", package = "teproj")) {
    word_document_te(..., reference_docx = reference_docx)
  }

#' Custom template file
#'
#' @description Add a {template} file to the project.
#' @details Calls `usethis::use_template()`. Really only would need to use
#' `system.file()`, `file.copy()`, etc. if there are no variables to be filled in the template file.
#' (See the `data` argument of `usethis::use_template()`.
#' Nonetheless, `usethis::use_template()`'s additional functionality (e.g.
#' prompting the user about overwriting files) is useful.
#' @param template character. Name of template file. Default value is provided.
#' @param save_as character. Location/name of file to save. Default is provided.
#' @param package character. Name of package. Default is name of this package.
#' @param ... dots. Arguments passed to `usethis::use_template()`.
#' @rdname use_template
#' @seealso <https://github.com/r-lib/usethis/blob/master/R/template.R>.
.use_template <-
  function(template, save_as = template, package = "teproj", ...) {
    if (!requireNamespace("usethis", quietly = TRUE)) {
      stop("Must have `{usethis}` package installed.", call. = FALSE)
    }
    # if (!requireNamespace("whisker", quietly = TRUE)) {
    #   stop("Must have `{whisker}` package installed.", call. = FALSE)
    # }
    dir <- dirname(save_as)
    create_dir(dir)

    # # NOTE: Not working...???
    # usethis::use_template(template = template, package = package)

    # So recreating the functionality of the
    # `usethis::use_template()` and the `whisker::render.plot()` functions
    # (the latter of which is called by the former).

    # First line in `usethis::use_template()`.
    # # NOTE: Not working...???
    # template_contents <-
    #   usethis:::render_template(
    #     template = ".Rprofile",
    #     package = "teproj"
    #   )

    # First line in `usethis::render_template()`.
    # (called in `usethis::use_template()`).
    # template_path <-
    #   usethis:::find_template(
    #     template = ".Rprofile",
    #     package = "teproj"
    #   )
    # Or just do this...
    template_path <-
      base::system.file(
        "templates",
        template,
        package = package
      )

    # Second line in `usethis::render_template()` (broken down into parts).
    template_contents_raw <-
      readLines(template_path, encoding = "UTF-8")
    # # NOTE: Not working...???
    # template_contents <- whisker::whisker.render(template_content_raw)
    # So doing this instead...
    # Main action in `whisker::whisker.render()`.
    # .parseTemplate <- utils::getFromNamespace("whisker", "parseTemplate")
    # tmpl <- .parseTemplate(template_contents_raw)
    # tmpl_parse <- tmpl(list())
    # Actually, if no data to pass to `tampl()`, then just skip this.

    tmpl_parse <- template_contents_raw
    # Back to `usethis::render_template()`.
    template_contents <- strsplit(tmpl_parse, "\n")[[1]]

    # Back to `usethis::use_template()`.
    # Use `getFromNamespace()` to avoid R CMD CHECK note about non-exported function.
    .write_over <- utils::getFromNamespace("write_over", "usethis")
    new <- .write_over(save_as, template_contents)

    # Skipping some of the other lines in `usethis::use_template()`.
    invisible(new)

  }

#' @rdname use_template
#' @export
use_r_profile <-
  function(template = ".Rprofile",
           save_as = template,
           ...) {
    .use_template(template = template, save_as = save_as)
  }

#' @rdname use_template
#' @export
use_task_schedule <-
  function(template = "schedule-task.R",
           save_as = file.path("R", template),
           ...) {
    .use_template(template = template, save_as = save_as)
  }

#' @rdname use_template
#' @export
use_r_buildignore <-
  function(template = ".Rbuildignore",
           save_as = template,
           ...) {
    .use_template(template = template, save_as = save_as)
  }

#' @rdname use_template
#' @export
use_gitignore <-
  function(template = ".gitignore",
           save_as = template,
           ...) {
    .use_template(template = template, save_as = save_as)
  }

#' @rdname use_template
#' @export
use_config_yml <-
  function(template = "config.yml",
           save_as = template,
           ...) {
    .use_template(template = template, save_as = save_as)
  }
tonyelhabr/teproj documentation built on June 21, 2020, 12:56 p.m.