diff --git a/DESCRIPTION b/DESCRIPTION index 797f81c..b780b5a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -33,8 +33,11 @@ Depends: Imports: rmarkdown (>= 1.7) Suggests: + xfun (>= 0.21), + xml2, bslib, - testthat (>= 3.0.0) + testthat (>= 3.0.0), + withr (>= 2.4.2) Encoding: UTF-8 Roxygen: list(markdown = TRUE) RoxygenNote: 7.1.2 diff --git a/R/revealjs_presentation.R b/R/revealjs_presentation.R index 12edafc..94e21e6 100644 --- a/R/revealjs_presentation.R +++ b/R/revealjs_presentation.R @@ -64,6 +64,8 @@ revealjs_presentation <- function(incremental = FALSE, center = FALSE, slide_level = 2, + toc = FALSE, + toc_depth = 3, fig_width = 8, fig_height = 6, fig_retina = if (!fig_caption) 2, @@ -88,6 +90,9 @@ revealjs_presentation <- function(incremental = FALSE, # base pandoc options for all reveal.js output args <- c() + + # table of contents + args <- c(args, pandoc_toc_args(toc, toc_depth)) # template path and assets if (identical(template, "default")) { diff --git a/R/utils.R b/R/utils.R index 52381a2..7251cff 100644 --- a/R/utils.R +++ b/R/utils.R @@ -27,4 +27,4 @@ process_reveal_option <- function(option, value) { } } pandoc_variable_arg(option, value) -} \ No newline at end of file +} diff --git a/inst/rmarkdown/templates/revealjs_presentation/resources/default.html b/inst/rmarkdown/templates/revealjs_presentation/resources/default.html index 4a7ef29..9729ed4 100644 --- a/inst/rmarkdown/templates/revealjs_presentation/resources/default.html +++ b/inst/rmarkdown/templates/revealjs_presentation/resources/default.html @@ -549,7 +549,12 @@

$date$

$endif$ $if(toc)$
+
$endif$ diff --git a/man/revealjs_presentation.Rd b/man/revealjs_presentation.Rd index e89753d..4aed888 100644 --- a/man/revealjs_presentation.Rd +++ b/man/revealjs_presentation.Rd @@ -8,6 +8,8 @@ revealjs_presentation( incremental = FALSE, center = FALSE, slide_level = 2, + toc = FALSE, + toc_depth = 3, fig_width = 8, fig_height = 6, fig_retina = if (!fig_caption) 2, @@ -45,6 +47,11 @@ produced, with level 1 headers building horizontally and level 2 headers building vertically. It is not recommended that you use deeper nesting of section levels with reveal.js.} +\item{toc}{\code{TRUE} to include a table of contents in the output (only +level 1 headers will be included in the table of contents).} + +\item{toc_depth}{Depth of headers to include in table of contents} + \item{fig_width}{Default width (in inches) for figures} \item{fig_height}{Default height (in inches) for figures} diff --git a/tests/testthat/helpers.R b/tests/testthat/helpers.R new file mode 100644 index 0000000..ce5d6c4 --- /dev/null +++ b/tests/testthat/helpers.R @@ -0,0 +1,49 @@ +local_temp_rmd_file <- function(..., .env = parent.frame()) { + path <- withr::local_tempfile(.local_envir = .env, fileext = ".Rmd") + xfun::write_utf8(c(...), path) + path +} + +local_temp_draft <- function(.env = parent.frame()) { + path <- withr::local_tempfile(.local_envir = .env, fileext = ".Rmd") + # TODO: Use `rmarkdown::draft()` when rmarkdown 2.12 is out. + pkg_file <- getFromNamespace("pkg_file", "rmarkdown") + template_path <- pkg_file("rmarkdown", "templates", "revealjs_presentation", + package = "revealjs") + rmarkdown::draft(path, template_path, edit = FALSE) +} + +.render_and_read <- function(input, xml = TRUE, ...) { + skip_if_not_pandoc() + output_file <- withr::local_tempfile(fileext = ".html") + res <- rmarkdown::render(input, output_file = output_file, quiet = TRUE, ...) + if (xml) { + xml2::read_html(res) + } else { + xfun::read_utf8(res) + } +} + +# Use to test pandoc availability or version lower than +skip_if_not_pandoc <- function(ver = NULL) { + if (!pandoc_available(ver)) { + msg <- if (is.null(ver)) { + "Pandoc is not available" + } else { + sprintf("Version of Pandoc is lower than %s.", ver) + } + skip(msg) + } +} + +# Use to test version greater than +skip_if_pandoc <- function(ver = NULL) { + if (pandoc_available(ver)) { + msg <- if (is.null(ver)) { + "Pandoc is available" + } else { + sprintf("Version of Pandoc is greater than %s.", ver) + } + skip(msg) + } +} \ No newline at end of file diff --git a/tests/testthat/test-revealjs_presentation.R b/tests/testthat/test-revealjs_presentation.R new file mode 100644 index 0000000..ade1c9a --- /dev/null +++ b/tests/testthat/test-revealjs_presentation.R @@ -0,0 +1,20 @@ +test_that("toc argument works", { + skip_if_not_pandoc() + skip_if_not_installed("xml2") + rmd <- local_temp_draft() + html <- .render_and_read( + rmd, + output_options = list( + toc = TRUE, + pandoc_args = c(pandoc_variable_arg("toc-title", "TOC")) + ) + ) + toc <- xml2::xml_find_all(html, "//section[@id='TOC']") + expect_length(toc, 1) + expect_equal( + xml2::xml_text( + xml2::xml_find_all(toc, "./nav/*[contains(@id, 'toc-title')]") + ), + "TOC" + ) +})