Update to reveal.js 4.1.2 (#136)

- New tools/ script to manually keep step for updates
- Plugins are all updated
- Template update following latest Pandoc version
- updated README for documentation
- Help page updated 
- See other change in NEWS file
diff --git a/tools/update-reveal.R b/tools/update-reveal.R
new file mode 100644
index 0000000..3be6803
--- /dev/null
+++ b/tools/update-reveal.R
@@ -0,0 +1,177 @@
+################################################ 
+# Script to update reveal.js resources         #
+# - To document steps so to execute  manually  #
+################################################
+
+
+# 01 - Update reveal.js library ------------------------------------------------
+
+## Main workflow:
+##   * Download new release
+##   * move plugins specific to revealjs package
+##   * Check using version control the differences
+##   * Adapt the code base if necessary
+## 
+## Notes from updates
+##
+## 3.3 -> 4.1.2 (27/09/2021): 
+##  * Upgrade notes: https://revealjs.com/upgrading/
+##  * note-server and multiplex plugins where removed, but they weren't use in the package
+##  * JS and CSS files were moved to dist/, including themes/
+##  * css/monokai moved to plugin/highlight
+##  * print CSS were removed
+##  * head.min.js deleted
+##  * Plugin registration has changed
+##  * html5shiv deleted
+
+
+# download latest source
+dir.create(tmp_dir <- tempfile())
+owd <- setwd(tmp_dir)
+latest <- xfun::github_releases("hakimel/reveal.js", pattern = "([0-9.]+)")[1]
+url <- sprintf("https://github.com/hakimel/reveal.js/archive/refs/tags/%s.zip", latest)
+xfun::download_file(url)
+fs::dir_ls()
+unzip(basename(url))
+reveal_folder <- fs::path_abs(fs::dir_ls(glob = "reveal.js-*"))
+setwd(owd)
+
+# Replace the library in the package 
+current <- fs::dir_ls("inst", glob = "*/reveal.js-*")
+new <- fs::path("inst", fs::path_file(reveal_folder), "/")
+fs::dir_copy(reveal_folder, fs::path("inst", fs::path_file(reveal_folder)), overwrite = TRUE)
+
+# move non-core plugins to new library folder
+plugins <- c("chalkboard", "menu")
+purrr::walk(plugins, ~{
+  fs::dir_copy(fs::path(current, "plugin", .x), fs::path(new, "plugin", .x))
+})
+
+# Delete old version
+fs::dir_delete(current)
+
+# Stage file to look at differences
+gert::git_add("inst/")
+
+fs::dir_delete(tmp_dir)
+
+# Update .Rbuildignore
+current <- fs::dir_ls("inst", glob = "*/reveal.js-*")
+buildignore <- xfun::read_utf8(".Rbuildignore")
+i <- grep("inst/reveal", buildignore)
+buildignore <- buildignore[-i]
+ignore <- fs::dir_ls(current, regexp = ".*(dist|plugin|LICENSE|README.md).*", invert = TRUE, all = TRUE)
+ignore_reg <- gsub("reveal\\.js-[^/]*", "reveal\\.js-[^/]+", ignore)
+xfun::write_utf8(c(buildignore, ignore_reg), ".Rbuildignore")
+
+# Make fonts local -------------------------------------------------------
+
+current <- fs::dir_ls("inst", glob = "*/reveal.js-*")
+themes <- fs::dir_ls(fs::path(current, "dist", "theme"), glob = "*.css")
+themes <- purrr::set_names(themes, nm = fs::path_file(fs::path_ext_remove(themes)))
+url_fonts <- purrr::map(themes, ~ {
+  css_theme <- xfun::read_utf8(.x)
+  fonts <- stringr::str_extract(css_theme, "(?<=@import url\\()https://[^)]+")
+  as.character(na.omit(fonts))
+})
+fonts <- unique(purrr::simplify(url_fonts))
+sort(fonts)
+
+# is there duplicate font ? 
+dup <- duplicated(purrr::map_chr(stringr::str_match_all(fonts, "(?<=family=)([^:]+)"), ~ .x[1,1]))
+fonts[dup]
+
+# if this is ok download theme
+get_fonts <- purrr::map(fonts, ~ {
+    font_url <- .x
+    if (!grepl("https://fonts.googleapis.com", font_url, fixed = TRUE)) stop("Not a good font. Handle manuallly.")
+    # from sass:::font_dep_google_local
+    tmpdir <- tempfile()
+    dir.create(tmpdir, recursive = TRUE)
+    css_file <- file.path(tmpdir, "font.css")
+    css <- sass:::read_gfont_url(font_url, css_file)
+    urls <- sass:::extract_group(css, "url\\(([^)]+)")
+    family <- stringr::str_match_all(font_url, "(?<=family=)([^:]+)")[[1]][2]
+    family <- sub("\\s+", "_", sass:::trim_ws(family))
+    family <- sub("\\+", "-", family)
+    basenames <- paste(family, seq_along(urls), sep = "-")
+    basenames <- fs::path_ext_set(basenames, fs::path_ext(fs::path_file(urls)))
+    Map(function(url, nm) {
+      f <- file.path(tmpdir, nm)
+      xfun::download_file(url, f, mode = "wb")
+      css <<- sub(url, nm, css, fixed = TRUE)
+    }, urls, basenames)
+    xfun::write_utf8(css, css_file)
+    font <- list(name = family, dir = dirname(css_file), css = basename(css_file))
+    fs::dir_create(font_folder <- fs::path(current, "dist", "theme", "fonts", font$name))
+    fs::file_copy(fs::dir_ls(font$dir), font_folder, overwrite = TRUE)
+    unlink(font$dir, recursive = TRUE)
+    font
+})
+
+get_fonts <- purrr::set_names(get_fonts, fonts)
+local_fonts <- purrr::map(get_fonts, ~ {
+  font_folder <- fs::path(current, "dist", "theme", "fonts", .x$name)
+  fs::path(".", fs::path_rel(fs::path(font_folder, .x$css), fs::path_dir(themes[1])))
+})
+
+for(theme in themes) {
+  purrr::iwalk(local_fonts, ~ xfun::gsub_file(theme, pattern = .y, replacement = .x, fixed = TRUE))
+}
+
+gert::git_add(fs::path(current, "dist", "theme"))
+
+
+# Update plugins ----------------------------------------------------------
+
+revealjs_lib <- fs::dir_ls("inst", glob = "*/reveal.js-*")
+stopifnot(length(revealjs_lib) == 1)
+
+## MENU PLUGGINS
+## https://github.com/denehyg/reveal.js-menu
+dir.create(tmp_dir <- tempfile())
+owd <- setwd(tmp_dir)
+latest <- xfun::github_releases("denehyg/reveal.js-menu", pattern = "([0-9.]+)")[1]
+url <- sprintf("https://github.com/denehyg/reveal.js-menu/archive/refs/tags/%s.zip", latest)
+xfun::download_file(url)
+fs::dir_ls()
+unzip(basename(url))
+new_plugin <- fs::path_abs(fs::dir_ls(glob = "reveal.js-*"))
+setwd(owd)
+
+### keep only necessary resources
+plugin_folder <- fs::path(revealjs_lib, "plugin", "menu")
+fs::dir_delete(plugin_folder)
+to_keep <- c("menu.css", "menu.js", "LICENSE")
+fs::dir_create(plugin_folder)
+fs::file_copy(fs::path(new_plugin, to_keep), fs::path(plugin_folder, to_keep), overwrite = TRUE)
+
+### Create VERSION file
+writeLines(latest, fs::path(plugin_folder, "VERSION"))
+
+gert::git_add(plugin_folder)
+
+## reveal.js-plugins repo
+## https://github.com/rajgoel/reveal.js-plugins/
+
+dir.create(tmp_dir <- tempfile())
+owd <- setwd(tmp_dir)
+latest <- xfun::github_releases("rajgoel/reveal.js-plugins", pattern = "([0-9.]+)")[1]
+url <- sprintf("https://github.com/rajgoel/reveal.js-plugins/archive/refs/tags/%s.zip", latest)
+xfun::download_file(url)
+fs::dir_ls()
+unzip(basename(url))
+new_plugin <- fs::path_abs(fs::dir_ls(glob = "reveal.js-*"))
+setwd(owd)
+
+### keep only necessary resources
+plugins_to_keep <- c("chalkboard", "customcontrols")
+plugin_folders <- fs::path(revealjs_lib, "plugin", plugins_to_keep)
+fs::dir_delete(plugin_folders[fs::dir_exists(plugin_folders)])
+purrr::walk(plugin_folders, ~ {
+  fs::dir_copy(fs::path(new_plugin, fs::path_file(.x)), .x, overwrite = TRUE)
+  fs::file_copy(fs::path(new_plugin, "LICENSE"), .x, overwrite = TRUE)
+  writeLines(latest, fs::path(.x, "VERSION"))
+})
+
+gert::git_add(plugin_folders)