1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
|
#' Initialise site infrastructure
#'
#' @description
#' `init_site()`:
#'
#' * creates the output directory (`docs/`),
#' * generates a machine readable description of the site, used for autolinking,
#' * copies CSS/JS assets and extra files, and
#' * runs `build_favicons()`, if needed.
#'
#' Typically, you will not need to call this function directly, as all `build_*()`
#' functions will run `init_site()` if needed.
#'
#' The only good reasons to call `init_site()` directly are the following:
#' * If you add or modify a package logo.
#' * If you add or modify `pkgdown/extra.scss`.
#' * If you modify `template.bslib` variables in `_pkgdown.yml`.
#'
#' See `vignette("customise")` for the various ways you can customise the
#' display of your site.
#'
#' # Build-ignored files
#' We recommend using [usethis::use_pkgdown_github_pages()] to build-ignore `docs/` and
#' `_pkgdown.yml`. If use another directory, or create the site manually,
#' you'll need to add them to `.Rbuildignore` yourself. A `NOTE` about
#' an unexpected file during `R CMD CHECK` is an indication you have not
#' correctly ignored these files.
#'
#' @inheritParams build_articles
#' @export
init_site <- function(pkg = ".", override = list()) {
# This is the only user facing function that doesn't call section_init()
# because section_init() can conditionally call init_site()
rstudio_save_all()
cache_cli_colours()
pkg <- as_pkgdown(pkg, override = override)
cli::cli_rule("Initialising site")
dir_create(pkg$dst_path)
copy_assets(pkg)
if (pkg$bs_version > 3) {
build_bslib(pkg)
}
# Building favicons is expensive, so we hopefully only do it once, locally
if (has_logo(pkg) && !has_favicons(pkg) && !on_ci()) {
build_favicons(pkg)
}
copy_favicons(pkg)
copy_logo(pkg)
build_site_meta(pkg)
invisible()
}
copy_assets <- function(pkg = ".") {
pkg <- as_pkgdown(pkg)
template <- config_pluck(pkg, "template")
# pkgdown assets
if (!identical(template$default_assets, FALSE)) {
copy_asset_dir(
pkg,
path_pkgdown(paste0("BS", pkg$bs_version, "/", "assets")),
src_root = path_pkgdown(),
src_label = "<pkgdown>/"
)
}
# package assets
if (!is.null(template$package)) {
copy_asset_dir(
pkg,
path_package_pkgdown("assets", template$package, pkg$bs_version),
src_root = system_file(package = template$package),
src_label = paste0("<", template$package, ">/")
)
}
# extras
copy_asset_dir(pkg, "pkgdown", file_regexp = "^extra")
# site assets
copy_asset_dir(pkg, "pkgdown/assets")
invisible()
}
copy_asset_dir <- function(
pkg,
dir,
src_root = pkg$src_path,
src_label = "",
file_regexp = NULL
) {
src_dir <- path_abs(dir, pkg$src_path)
if (!file_exists(src_dir)) {
return(character())
}
src_paths <- dir_ls(src_dir, recurse = TRUE)
src_paths <- src_paths[!is_dir(src_paths)]
if (!is.null(file_regexp)) {
src_paths <- src_paths[grepl(file_regexp, path_file(src_paths))]
}
src_paths <- src_paths[path_ext(src_paths) != "scss"] # Handled in bs_theme()
dst_paths <- path(pkg$dst_path, path_rel(src_paths, src_dir))
file_copy_to(
src_paths = src_paths,
src_root = src_root,
src_label = src_label,
dst_paths = dst_paths,
dst_root = pkg$dst_path
)
}
timestamp <- function(time = Sys.time()) {
attr(time, "tzone") <- "UTC"
strftime(time, "%Y-%m-%dT%H:%MZ", tz = "UTC")
}
# Generate site meta data file (available to website viewers)
build_site_meta <- function(pkg = ".") {
meta <- site_meta(pkg)
# Install pkgdown.yml to ./inst if requested,
install_metadata <- pkg$install_metadata %||% FALSE
if (install_metadata) {
path_meta <- path(pkg$src_path, "inst", "pkgdown.yml")
dir_create(path_dir(path_meta))
write_yaml(meta, path_meta)
}
path_meta <- path(pkg$dst_path, "pkgdown.yml")
write_yaml(meta, path_meta)
invisible()
}
site_meta <- function(pkg) {
article_index <- article_index(pkg)
yaml <- list(
pandoc = as.character(rmarkdown::pandoc_version()),
pkgdown = as.character(utils::packageDescription(
"pkgdown",
fields = "Version"
)),
pkgdown_sha = utils::packageDescription("pkgdown")$GithubSHA1,
articles = as.list(article_index),
last_built = timestamp()
)
url <- config_pluck_string(pkg, "url")
if (!is.null(url)) {
yaml$urls <- list(
reference = paste0(url, "/reference"),
article = paste0(url, "/articles")
)
}
print_yaml(yaml)
}
|