initial commit
diff --git a/R/revealjs_presentation.R b/R/revealjs_presentation.R
new file mode 100644
index 0000000..61cda17
--- /dev/null
+++ b/R/revealjs_presentation.R
@@ -0,0 +1,203 @@
+#' Convert to a reveal.js presentation
+#'
+#' Format for converting from R Markdown to a reveal.js presentation.
+#'
+#' @inheritParams rmarkdown::beamer_presentation
+#' @inheritParams rmarkdown::pdf_document
+#' @inheritParams rmarkdown::html_document
+#'
+#' @param center \code{TRUE} to vertically center content on slides
+#' @param theme Visual theme ("default", "simple", sky", "beige", "serif", or
+#' "solarized").
+#' @param transition Slide transition ("default", "cube", "page", "concave",
+#' "zoom", "linear", "fade", or "none")
+#' @param template Pandoc template to use for rendering. Pass "default"
+#' to use the rmarkdown package default template; pass \code{NULL}
+#' to use pandoc's built-in template; pass a path to use a custom template
+#' that you've created. Note that if you don't use the "default" template
+#' then some features of \code{revealjs_presentation} won't be available
+#' (see the Templates section below for more details).
+#'
+#' @return R Markdown output format to pass to \code{\link{render}}
+#'
+#' @details
+#'
+#' In reveal.js presentations you can use level 1 or level 2 headers for
+#' slides. If you use a mix of level 1 and level 2 headers then a
+#' two-dimensional layout will be produced, with level 1 headers building
+#' horizontally and level 2 headers building vertically.
+#'
+#' For more information on markdown syntax for presentations see
+#' \href{http://johnmacfarlane.net/pandoc/demo/example9/producing-slide-shows-with-pandoc.html}{producing
+#' slide shows with pandoc}.
+#'
+#' @section Templates:
+#'
+#' You can provide a custom HTML template to be used for rendering. The syntax
+#' for templates is described in the documentation on
+#' \href{http://johnmacfarlane.net/pandoc/demo/example9/templates.html}{pandoc
+#' templates}. You can also use the basic pandoc template by passing
+#' \code{template = NULL}.
+#'
+#' Note however that if you choose not to use the "default" reveal.js template
+#' then several aspects of reveal.js presentation rendering will behave
+#' differently:
+#'
+#' \itemize{
+#' \item{The \code{center} parameter does not work (you'd need to
+#' set this directly in the template).
+#' }
+#' \item{The built-in template includes some additional tweaks to styles
+#' to optimize for output from R, these won't be present.
+#' }
+#' \item{MathJax will not work if \code{self_contained} is \code{TRUE}
+#' (these two options can't be used together in normal pandoc templates).
+#' }
+#' }
+#'
+#' @examples
+#' \dontrun{
+#'
+#' library(rmarkdown)
+#' library(revealjs)
+#'
+#' # simple invocation
+#' render("pres.Rmd", revealjs_presentation())
+#'
+#' # specify an option for incremental rendering
+#' render("pres.Rmd", revealjs_presentation(incremental = TRUE))
+#' }
+#'
+#'
+#' @export
+revealjs_presentation <- function(incremental = FALSE,
+ center = FALSE,
+ fig_width = 8,
+ fig_height = 6,
+ fig_retina = if (!fig_caption) 2,
+ fig_caption = FALSE,
+ smart = TRUE,
+ self_contained = TRUE,
+ theme = "default",
+ transition = "default",
+ highlight = "default",
+ mathjax = "default",
+ template = "default",
+ includes = NULL,
+ keep_md = FALSE,
+ lib_dir = NULL,
+ pandoc_args = NULL,
+ ...) {
+
+ # function to lookup reveal resource
+ reveal_resources <- function() {
+ system.file("rmarkdown/templates/revealjs_presentation",
+ package = "revealjs")
+ }
+
+ # base pandoc options for all reveal.js output
+ args <- c()
+
+ # template path and assets
+ if (identical(template, "default"))
+ args <- c(args, "--template",
+ pandoc_path_arg(file.path(reveal_resources(), "default.html")))
+ else if (!is.null(template))
+ args <- c(args, "--template", pandoc_path_arg(template))
+
+ # incremental
+ if (incremental)
+ args <- c(args, "--incremental")
+
+ # centering
+ if (center)
+ args <- c(args, "--variable", "center")
+
+ # theme
+ theme <- match.arg(theme, revealjs_themes())
+ if (identical(theme, "default"))
+ theme <- "simple"
+ else if (identical(theme, "dark"))
+ theme <- "default"
+ if (theme %in% c("default", "blood", "moon", "night"))
+ args <- c(args, "--variable", "theme-dark")
+ args <- c(args, "--variable", paste("theme=", theme, sep=""))
+
+
+ # transition
+ transition <- match.arg(transition, revealjs_transitions())
+ args <- c(args, "--variable", paste("transition=", transition, sep=""))
+
+ # content includes
+ args <- c(args, includes_to_pandoc_args(includes))
+
+ # pre-processor for arguments that may depend on the name of the
+ # the input file (e.g. ones that need to copy supporting files)
+ pre_processor <- function(metadata, input_file, runtime, knit_meta, files_dir,
+ output_dir) {
+
+ # use files_dir as lib_dir if not explicitly specified
+ if (is.null(lib_dir))
+ lib_dir <- files_dir
+
+ # extra args
+ args <- c()
+
+ # reveal.js
+ revealjs_path <- reveal_resources()
+ if (!self_contained || identical(.Platform$OS.type, "windows"))
+ revealjs_path <- relative_to(
+ output_dir, render_supporting_files(revealjs_path, lib_dir))
+ args <- c(args, "--variable", paste("revealjs-url=",
+ pandoc_path_arg(revealjs_path), sep=""))
+
+ # highlight
+ args <- c(args, pandoc_highlight_args(highlight, default = "pygments"))
+
+ # return additional args
+ args
+ }
+
+ # return format
+ output_format(
+ knitr = knitr_options_html(fig_width, fig_height, fig_retina, keep_md),
+ pandoc = pandoc_options(to = "revealjs",
+ from = rmarkdown_format(ifelse(fig_caption,
+ "",
+ "-implicit_figures")),
+ args = args),
+ keep_md = keep_md,
+ clean_supporting = self_contained,
+ pre_processor = pre_processor,
+ base_format = html_document_base(smart = smart, lib_dir = lib_dir,
+ self_contained = self_contained,
+ mathjax = mathjax,
+ pandoc_args = pandoc_args, ...))
+}
+
+revealjs_themes <- function() {
+ c("default",
+ "simple",
+ "sky",
+ "beige",
+ "serif",
+ "solarized",
+ "dark",
+ "blood",
+ "moon",
+ "night")
+}
+
+
+revealjs_transitions <- function() {
+ c("default",
+ "cube",
+ "page",
+ "concave",
+ "zoom",
+ "linear",
+ "fade",
+ "none")
+}
+
+