# File level tweaks --------------------------------------------
tweak_page <- function(html, name, pkg = list(bs_version = 3)) {
# Syntax highlighting and linking
if (name == "reference-topic") {
# Reference topic takes a minimal approach since some is
# already handled by Rd processing
tweak_reference_highlighting(html)
tweak_extra_logo(html)
} else {
downlit::downlit_html_node(html)
# Rescue highlighting of non-collapsed output - needed for ANSI escapes
pre <- xml2::xml_find_all(html, ".//pre[not(contains(@class, 'downlit'))]")
is_wrapped <- is_wrapped_pre(pre)
purrr::walk(pre[!is_wrapped], tweak_highlight_r)
}
tweak_anchors(html)
tweak_link_md(html)
tweak_link_external(html, pkg = pkg)
tweak_img_src(html)
tweak_strip(html, !identical(pkg$development$mode, "release"))
# BS3 uses table for layout of reference-index
if (name != "reference-index") {
tweak_tables(html)
}
if (pkg$bs_version > 3) {
tweak_footnotes(html)
tweak_tabsets(html)
tweak_useless_toc(html)
}
if (!is.null(pkg$desc) && pkg$desc$has_dep("R6")) {
tweak_link_R6(html, pkg$package)
}
}
tweak_rmarkdown_html <- function(html, input_path, pkg = list(bs_version = 3)) {
# Tweak classes of navbar
toc <- xml2::xml_find_all(html, ".//div[@id='tocnav']//ul")
xml2::xml_attr(toc, "class") <- "nav nav-pills nav-stacked"
# Make sure all images use relative paths
img <- xml2::xml_find_all(html, "//img")
src <- xml2::xml_attr(img, "src")
abs_src <- is_absolute_path(src)
if (any(abs_src)) {
purrr::walk2(
img[abs_src],
path_rel(src[abs_src], input_path),
xml2::xml_set_attr,
attr = "src"
)
}
# If top-level headings use h1, move everything down one level
h1 <- xml2::xml_find_all(html, "//h1")
if (length(h1) > 1) {
tweak_section_levels(html)
}
# Has to occur after path normalisation
# This get called twice on the contents of content-article.html, but that
# should be harmless
tweak_page(html, "article", pkg = pkg)
invisible()
}
# Strip off #toc if it's not needed; easier to do this here than in js
tweak_useless_toc <- function(html) {
contents <- xml2::xml_find_all(html, ".//main")
headings <- xml2::xml_find_all(contents, ".//h2|.//h3|.//h4|.//h5|.//h6")
if (length(headings) > 1) {
return()
}
toc <- xml2::xml_find_first(html, '//nav[@id="toc"]')
sidebar <- xml2::xml_parent(toc)
if (length(xml2::xml_children(sidebar)) == 1) {
xml2::xml_remove(sidebar)
} else {
xml2::xml_remove(toc)
}
}
# Update file on disk -----------------------------------------------------
update_html <- function(path, tweak, ...) {
raw <- read_file(path)
# Following the xml 1.0 spec, libxml2 drops low-bit ASCII characters
# so we convert to \u2029, relying on downlit to convert back in
# token_escape().
raw <- gsub("\033", "\u2029", raw, fixed = TRUE)
html <- xml2::read_html(raw, encoding = "UTF-8")
tweak(html, ...)
xml2::write_html(html, path, format = FALSE)
path
}