cleanrmd Reference

Clean HTML R Markdown Documents

Updated: June 14, 2022
Version: 0.1.0

Garrick Aden-Buie

cleanrmd_themes() - List cleanrmd themes

Description

Lists the available themes in cleanrmd

Usage

cleanrmd_themes()

Value

A character string of available theme names.

cleanrmd theme list

cleanrmd includes the following no-class CSS themes:

Examples

cleanrmd_themes()
##  [1] "almond"            "awsm.css"          "axist"            
##  [4] "bamboo"            "bullframe"         "holiday"          
##  [7] "kacit"             "latex.css"         "markdown-splendor"
## [10] "markdown-retro"    "markdown-air"      "markdown-modest"  
## [13] "marx"              "minicss"           "new.css"          
## [16] "no-class"          "picocss"           "sakura"           
## [19] "sakura-vader"      "semantic"          "simplecss"        
## [22] "style-sans"        "style-serif"       "stylize"          
## [25] "superstylin"       "tacit"             "vanilla"          
## [28] "water"             "water-dark"        "writ"

html_document_clean() - Clean Rmarkdown HTML Document

Description

Clean HTML documents with R Markdown.

Usage

html_document_clean(
  ...,
  theme = "no-class",
  css = NULL,
  toc = FALSE,
  toc_depth = 3,
  title_in_header = TRUE,
  mathjax = NULL,
  use_fontawesome = FALSE,
  fig_width = 10,
  fig_height = 7,
  fig_retina = 2,
  keep_md = FALSE,
  dev = "png",
  highlight = "default",
  pandoc_args = NULL,
  extra_dependencies = NULL,
  md_extensions = NULL,
  self_contained = !is.null(theme)
)

Arguments

theme

The class-less CSS theme to use, one of cleanrmd_themes().

css

CSS and/or Sass files to include. Files with an extension of .sass or .scss are compiled to CSS via sass::sass(). Also, if theme is a bslib::bs_theme() object, Sass code may reference the relevant Bootstrap Sass variables, functions, mixins, etc.

toc

TRUE to include a table of contents in the output

toc_depth

Depth of headers to include in table of contents

title_in_header

If TRUE (default), the title, subtitle, author, and date are placed in a ⁠<header>⁠ tag. This is semantically correct HTML but some CSS frameworks work better with this structure than others.

mathjax

Include mathjax. The “default” option uses an https URL from a MathJax CDN. The “local” option uses a local version of MathJax (which is copied into the output directory). You can pass an alternate URL or pass NULL to exclude MathJax entirely.

use_fontawesome

Should links to FontAwesome be included in the HTML document’s ⁠<head>⁠? Only enable if you are including FontAwesome icons in your HTML document.

fig_width

Default width (in inches) for figures

fig_height

Default height (in inches) for figures

fig_retina

Scaling to perform for retina displays (defaults to 2, which currently works for all widely used retina displays). Set to NULL to prevent retina scaling. Note that this will always be NULL when keep_md is specified (this is because fig_retina relies on outputting HTML directly into the markdown document).

keep_md

Keep the markdown file generated by knitting.

dev

Graphics device to use for figure output (defaults to png)

highlight

Syntax highlight engine and style, either a built-in Pandoc highlighting theme, a theme provided by rmarkdown, or a prismjs theme (see below). Pass NULL to prevent syntax highlighting.

Pandoc themes. By default, uses Pandoc’s highlighting style. Pandoc’s built-in styles include “tango”, “pygments”, “kate”, “monochrome”, “espresso”, “zenburn”, “haddock” and “breezedark”.

Two custom styles are also included, “arrow”, an accessible color scheme, and “rstudio”, which mimics the default IDE theme. Alternatively, supply a path to a .theme to use a custom Pandoc style. Note that custom themes require Pandoc 2.0+.

Prism themes. To use the prismjs syntax highlighter, pass one of “prism”, “prism-coy”, “prism-dark”, “prism-funky”, “prism-okaidia”, “prism-solarizedlight”, “prism-tomorrow”, or “prism-twilight”. To use an alternate Prism theme file, pass the URL or path to the theme’s CSS file prefixed with “prism:”, e.g. prism:my-theme.css. Note that the Prism dependencies are not embedded into self-contained documents so they will require an active internet connection to work.

pandoc_args

Additional command line options to pass to pandoc

extra_dependencies, …

Additional function arguments to pass to the base R Markdown HTML output formatter html_document_base

md_extensions

Markdown extensions to be added or removed from the default definition of R Markdown. See the rmarkdown_format for additional details.

self_contained

Produce a standalone HTML file with no external dependencies, using data: URIs to incorporate the contents of linked scripts, stylesheets, images, and videos. Note that even for self contained documents MathJax is still loaded externally (this is necessary because of its size).

Value

An R Markdown output format that can be used with ⁠output:⁠ in an .Rmd or for use with rmarkdown::render().

MathJax

Note that MathJax is disabled by default to reduce the overall size of the final document. You can enable MathJax by setting mathjax = "default", see rmarkdown::html_document() for more options.

See Also

use_cleanrmd() for using cleanrmd themes in places other than in R Markdown documents

Examples

html_document_clean()
## $knitr
## $knitr$opts_knit
## NULL
## 
## $knitr$opts_chunk
## $knitr$opts_chunk$dev
## [1] "png"
## 
## $knitr$opts_chunk$dpi
## [1] 96
## 
## $knitr$opts_chunk$fig.width
## [1] 10
## 
## $knitr$opts_chunk$fig.height
## [1] 7
## 
## $knitr$opts_chunk$fig.retina
## [1] 2
## 
## 
## $knitr$knit_hooks
## NULL
## 
## $knitr$opts_hooks
## NULL
## 
## $knitr$opts_template
## NULL
## 
## 
## $pandoc
## $pandoc$to
## [1] "html5"
## 
## $pandoc$from
## [1] "markdown+autolink_bare_uris+tex_math_single_backslash"
## 
## $pandoc$args
## [1] "--self-contained"                                                                                                          
## [2] "--variable"                                                                                                                
## [3] "disable-fontawesome"                                                                                                       
## [4] "--variable"                                                                                                                
## [5] "title-in-header"                                                                                                           
## [6] "--highlight-style"                                                                                                         
## [7] "/Users/garrick/Library/R/x86_64/4.2/library/rmarkdown/rmarkdown/highlight/arrow.theme"                                     
## [8] "--template"                                                                                                                
## [9] "/private/var/folders/zw/8z2vpz1s0cl3gwpyh5p72mwh0000gn/T/RtmplmuF9u/temp_libpath39b50e3b68/cleanrmd/template/cleanrmd.html"
## 
## $pandoc$keep_tex
## [1] FALSE
## 
## $pandoc$latex_engine
## [1] "pdflatex"
## 
## $pandoc$ext
## NULL
## 
## $pandoc$lua_filters
## [1] "/Users/garrick/Library/R/x86_64/4.2/library/rmarkdown/rmarkdown/lua/pagebreak.lua"
## [2] "/Users/garrick/Library/R/x86_64/4.2/library/rmarkdown/rmarkdown/lua/latex-div.lua"
## 
## 
## $keep_md
## [1] FALSE
## 
## $clean_supporting
## [1] TRUE
## 
## $df_print
## NULL
## 
## $pre_knit
## function (input, ...) 
## {
##     if (is_bs_theme(theme)) {
##         for (f in css) theme <<- bslib::bs_add_rules(theme, xfun::read_utf8(f))
##         css <<- NULL
##         old_theme <<- bslib::bs_global_set(theme)
##     }
## }
## <bytecode: 0x7fc31a640698>
## <environment: 0x7fc31a9a82a8>
## 
## $post_knit
## function (metadata, input_file, runtime, ...) 
## {
## }
## <bytecode: 0x7fc31a643968>
## <environment: 0x7fc31a9a82a8>
## 
## $pre_processor
## function (metadata, input_file, runtime, knit_meta, files_dir, 
##     output_dir) 
## {
##     args <- c()
##     if (is.null(lib_dir)) 
##         lib_dir <<- files_dir
##     output_dir <<- output_dir
##     if (!is.null(theme)) {
##         theme_arg <- if (is.list(theme)) 
##             "bootstrap"
##         else theme
##         args <- c(args, pandoc_variable_arg("theme", theme_arg))
##     }
##     for (f in css) {
##         if (grepl("\\.s[ac]ss$", f)) {
##             if (!xfun::loadable("sass")) {
##                 stop2("Using `.sass` or `.scss` file in `css` argument requires the sass package.")
##             }
##             f <- sass::sass(sass::sass_file(f), output = sass::output_template(basename = xfun::sans_ext(basename(f)), 
##                 dirname = "sass", path = lib_dir), options = sass::sass_options(output_style = "compressed"))
##             f <- normalized_relative_to(output_dir, f)
##         }
##         args <- c(args, "--css", pandoc_path_arg(f, backslash = FALSE))
##     }
##     math_support <- add_math_support(math, template, lib_dir, 
##         output_dir)
##     args <- c(args, math_support$args)
##     extra_dependencies <- c(extra_dependencies, math_support$extra_dependencies)
##     format_deps <- list()
##     format_deps <- append(format_deps, html_dependency_header_attrs())
##     if (!is.null(theme)) {
##         format_deps <- append(format_deps, list(html_dependency_jquery()))
##         if (is_bs_theme(theme)) {
##             theme <- bslib::bs_global_get()
##         }
##         bootstrap_deps <- if (is_bs_theme(theme) && is_shiny(runtime, 
##             metadata[["server"]])) {
##             list(shiny_bootstrap_lib(theme))
##         }
##         else {
##             bootstrap_dependencies(theme)
##         }
##         format_deps <- append(format_deps, htmltools::resolveDependencies(bootstrap_deps))
##     }
##     else if (isTRUE(bootstrap_compatible) && is_shiny(runtime, 
##         metadata[["server"]])) {
##         format_deps <- append(format_deps, bootstrap_dependencies("bootstrap"))
##     }
##     format_deps <- append(format_deps, extra_dependencies)
##     extras <- html_extras_for_document(knit_meta, runtime, dependency_resolver, 
##         format_deps)
##     args <- c(args, pandoc_html_extras_args(extras, self_contained, 
##         lib_dir, output_dir))
##     preserved_chunks <<- extract_preserve_chunks(input_file)
##     args
## }
## <bytecode: 0x7fc31a643380>
## <environment: 0x7fc31a9a82a8>
## 
## $intermediates_generator
## function (original_input, intermediates_dir) 
## {
##     copy_render_intermediates(original_input, intermediates_dir, 
##         !self_contained)
## }
## <bytecode: 0x7fc31a649188>
## <environment: 0x7fc31a9a82a8>
## 
## $post_processor
## function (metadata, input_file, output_file, clean, verbose) 
## {
##     if (identical(math_method, "r-katex") && xfun::pkg_available("katex", 
##         "1.4.0")) {
##         katex::render_math_in_html(output_file, output = output_file)
##     }
##     output_str <- read_utf8(output_file)
##     s1 <- "<span class=\"sc\">|</span><span class=\"er\">&gt;</span>"
##     s2 <- "<span class=\"ot\">=</span><span class=\"er\">&gt;</span>"
##     if ((length(preserved_chunks) == 0 && !isTRUE(copy_resources) && 
##         self_contained) && !length(c(grep(s1, output_str, fixed = TRUE), 
##         grep(s2, output_str, fixed = TRUE)))) 
##         return(output_file)
##     if (length(preserved_chunks) > 0) {
##         for (i in names(preserved_chunks)) {
##             output_str <- gsub(paste0("<p>", i, "</p>"), i, output_str, 
##                 fixed = TRUE, useBytes = TRUE)
##             output_str <- gsub(paste0(" id=\"[^\"]*?", i, "[^\"]*?\" "), 
##                 " ", output_str, useBytes = TRUE)
##         }
##         output_str <- restorePreserveChunks(output_str, preserved_chunks)
##     }
##     if (copy_resources) {
##         output_str <- copy_html_resources(one_string(output_str), 
##             lib_dir, output_dir)
##     }
##     else if (!self_contained) {
##         image_relative <- function(img_src, src) {
##             in_file <- utils::URLdecode(src)
##             if (grepl("^[.][.]", in_file)) 
##                 return(img_src)
##             if (length(in_file) && file.exists(in_file)) {
##                 img_src <- sub(src, utils::URLencode(normalized_relative_to(output_dir, 
##                   in_file)), img_src, fixed = TRUE)
##             }
##             img_src
##         }
##         output_str <- process_images(output_str, image_relative)
##     }
##     output_str <- gsub(s1, "<span class=\"sc\">|&gt;</span>", 
##         output_str, fixed = TRUE)
##     output_str <- gsub(s2, "<span class=\"ot\">=&gt;</span>", 
##         output_str, fixed = TRUE)
##     write_utf8(output_str, output_file)
##     output_file
## }
## <bytecode: 0x7fc31a6485f0>
## <environment: 0x7fc31a9a82a8>
## 
## $on_exit
## function () 
## {
##     if (is.function(base)) 
##         base()
##     if (is.function(overlay)) 
##         overlay()
## }
## <bytecode: 0x7fc31fdc3550>
## <environment: 0x7fc31a9f04a0>
## 
## attr(,"class")
## [1] "rmarkdown_output_format"
if (interactive()) {
rmarkdown::render("input.Rmd", html_document_clean())

}

use_cleanrmd() - Use a clean CSS theme from cleanrmd

Description

Provides a cleanrmd CSS theme using htmltools. You can use this CSS theme anywhere that HTML dependencies are handled via htmltools::htmlDependency(), for example in R Markdown or Quarto documents or in Shiny apps.

Usage

use_cleanrmd(name = NULL)

cleanrmd_theme_dependency(name = NULL)

Arguments

name The name of the theme, see cleanrmd_themes() for a list of available themes. If NULL, all themes will be loaded with a simple drop down theme picker.

Value

use_cleanrmd() returns an htmltools::tagList() with an htmltools::htmlDependency(). cleanrmd_theme_dependency() returns only the htmltools::htmlDependency().

Functions

R Markdown documents

In R Markdown (static or Shiny prerendered), you should use the html_document_clean() output format to use a cleanrmd theme.

---
output:
  cleanrmd::html_document_clean:
    theme: NULL # or pick a specific theme
    self_contained: false
---

Quarto documents

You can also use cleanrmd in Quarto documents or apps (using server: shiny). You'll need to turn off the themes provided by Quarto with theme: none and then call cleanrmd::use_cleanrmd() in a code chunk in your document.

---
title: "Untitled"
format:
  html:
    theme: none
#server: shiny
---

Shiny apps

In Shiny apps, you'll need to use shiny::basicPage() rather than shiny::fluidPage(). Then call use_cleanrmd() in your app to use a cleanrmd theme.

library(shiny)

ui <- shiny::basicPage(
  cleanrmd::use_cleanrmd(),

  h2("Old Faithful Geyser Data"),

  sliderInput(
    "bins",
    "Number of bins:",
    min = 1,
    max = 50,
    value = 30
  ),
  plotOutput("distPlot")
)

Examples

page <- htmltools::withTags(
  main(
    h2("Small Demo"),
    p("Clean, simple, classy but class-less:"),
    ul(
      li("Works almost anywhere"),
      li("Small and simple"),
      li("Easy to extend"),
      li("Good enough but not perfect")
    )
  )
)

# no styles
if (interactive()) {
  htmltools::browsable(page)
}

# all clean styles
page_clean <- htmltools::tagList(page, use_cleanrmd())
if (interactive()) {
  htmltools::browsable(page_clean)
}

# one clean style
page_water <- htmltools::tagList(page, use_cleanrmd("water"))
if (interactive()) {
  htmltools::browsable(page_water)
}

cleanrmd_theme_dependency("bamboo")
## List of 10
##  $ name      : chr "cleanrmd"
##  $ version   : chr "0.1.0"
##  $ src       :List of 1
##   ..$ file: chr "resources/bamboo"
##  $ meta      : NULL
##  $ script    : NULL
##  $ stylesheet: chr "bamboo.css"
##  $ head      : NULL
##  $ attachment: NULL
##  $ package   : chr "cleanrmd"
##  $ all_files : logi TRUE
##  - attr(*, "class")= chr "html_dependency"