From 2451b8678f89cfa821e60434549a053265d18ef3 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Thu, 6 Jun 2024 12:47:49 -0500 Subject: [PATCH 01/31] Drop unnused site-bad-logo test site --- tests/testthat/assets/site-bad-logo/DESCRIPTION | 11 ----------- tests/testthat/assets/site-bad-logo/_pkgdown.yml | 4 ---- tests/testthat/assets/site-bad-logo/logo.png | Bin 103 -> 0 bytes 3 files changed, 15 deletions(-) delete mode 100644 tests/testthat/assets/site-bad-logo/DESCRIPTION delete mode 100644 tests/testthat/assets/site-bad-logo/_pkgdown.yml delete mode 100644 tests/testthat/assets/site-bad-logo/logo.png diff --git a/tests/testthat/assets/site-bad-logo/DESCRIPTION b/tests/testthat/assets/site-bad-logo/DESCRIPTION deleted file mode 100644 index 645763ba7..000000000 --- a/tests/testthat/assets/site-bad-logo/DESCRIPTION +++ /dev/null @@ -1,11 +0,0 @@ -Package: testpackage -Version: 1.0.0 -Title: A test package -Description: The logo.png file in this package is empty and can't be - converted to favicons by the API. -Authors@R: c( - person("Hadley", "Wickham", , "hadley@rstudio.com", role = c("aut", "cre")), - person("RStudio", role = c("cph", "fnd")) - ) -RoxygenNote: 6.1.1 -Encoding: UTF-8 diff --git a/tests/testthat/assets/site-bad-logo/_pkgdown.yml b/tests/testthat/assets/site-bad-logo/_pkgdown.yml deleted file mode 100644 index cd790122f..000000000 --- a/tests/testthat/assets/site-bad-logo/_pkgdown.yml +++ /dev/null @@ -1,4 +0,0 @@ -url: http://example.com/pkg - -template: - bootstrap: 5 diff --git a/tests/testthat/assets/site-bad-logo/logo.png b/tests/testthat/assets/site-bad-logo/logo.png deleted file mode 100644 index 1b1e662cd2dc511c2aa331c75f3d039fe9435830..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>rX+877l!}s{b%+Ad7K3vk;M!Q t+`=Ht$S`Y;1W=IM)5S4_<9c#J0+7SZz^HI_%5flz!PC{xWt~$(699>Q6fyt+ From 937878b3fbdc0e7eda5d2b877bc1b7c28bb7e4a5 Mon Sep 17 00:00:00 2001 From: olivroy <52606734+olivroy@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:34:51 -0400 Subject: [PATCH 02/31] Fix typo (#2557) --- vignettes/customise.Rmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vignettes/customise.Rmd b/vignettes/customise.Rmd index efdf05cf7..104df56e3 100644 --- a/vignettes/customise.Rmd +++ b/vignettes/customise.Rmd @@ -71,7 +71,7 @@ template: (Themes are unlikely to work with the light switch, but you can try it and see.) Changing the bootswatch theme affects both the HTML (via the navbar, more on that below) and the CSS, so you'll need to re-build your complete site with `build_site()` to fully appreciate the changes. -While you're experimenting, you can speed things up by just rebuilding the home page and the CSS by running `build_home_index(); init_site()` (and then refreshing the browser). +While you're experimenting, you can speed things up by just rebuilding the home page and the CSS by running `build_home_index()`; `init_site()` (and then refreshing the browser). Bootswatch templates with tall navbars (e.g. lux, pulse) also require that you set the `pkgdown-nav-height` bslib variable. Because Bootswatch themes are provided by the [bslib](https://rstudio.github.io/bslib/) R package, you can also nest the `bootswatch` field under the `bslib` field. From e7eed2a2fd6db638ea6a09c5d098ca4a629dc64c Mon Sep 17 00:00:00 2001 From: olivroy <52606734+olivroy@users.noreply.github.com> Date: Thu, 6 Jun 2024 16:37:13 -0400 Subject: [PATCH 03/31] Correctly expand paths on Windows, and nudge towards fs paths (#2640) * Correctly expand paths on Windows, and nudge towards fs paths * Add comment to explain difference between fs path and base path --- R/package.R | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/R/package.R b/R/package.R index e5c3692bb..ce80d7b88 100644 --- a/R/package.R +++ b/R/package.R @@ -19,10 +19,24 @@ as_pkgdown <- function(pkg = ".", override = list()) { check_string(pkg) if (!dir_exists(pkg)) { + if (dir.exists(pkg)) { #nolint + # path expansion with fs and base R is different on Windows. + # By default "~/", is typically C:/Users/username/Documents, while fs see "~/" as C:/Users/username, to be more platform portable. + # Read more in ?fs::path_expand + cli::cli_abort( + "pkgdown accepts {.href [fs paths](https://fs.r-lib.org/reference/path_expand.html#details)}." + ) + } cli::cli_abort("{.file {pkg}} is not an existing directory") } + + if (!dir.exists(pkg)) { #nolint + # Use complete path if fs path doesn't exist according to base R #2639 + pkg <- path_expand(pkg) + } + src_path <- pkg - + desc <- read_desc(src_path) meta <- read_meta(src_path) meta <- modify_list(meta, override) From dbe4195a5c93124ee0dcdc0bf7b83c81e87efdf2 Mon Sep 17 00:00:00 2001 From: olivroy <52606734+olivroy@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:07:11 -0400 Subject: [PATCH 04/31] Lint tests (#2641) * Lint tests * Update tests/testthat/test-package.R --- tests/testthat/test-build-home-authors.R | 2 +- tests/testthat/test-build-home-index.R | 2 +- tests/testthat/test-build-home.R | 2 +- tests/testthat/test-markdown.R | 2 +- tests/testthat/test-repo.R | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/testthat/test-build-home-authors.R b/tests/testthat/test-build-home-authors.R index ed5dfaefa..e6245a875 100644 --- a/tests/testthat/test-build-home-authors.R +++ b/tests/testthat/test-build-home-authors.R @@ -183,7 +183,7 @@ test_that("source link is added to citation page", { suppressMessages(build_citation_authors(pkg)) lines <- read_lines(path(pkg$dst_path, "authors.html")) - expect_true(any(grepl("inst/CITATION", lines))) + expect_match(lines, "inst/CITATION", all = FALSE, fixed = TRUE) }) test_that("multiple citations all have HTML and BibTeX formats", { diff --git a/tests/testthat/test-build-home-index.R b/tests/testthat/test-build-home-index.R index 03217b080..317164ac1 100644 --- a/tests/testthat/test-build-home-index.R +++ b/tests/testthat/test-build-home-index.R @@ -50,7 +50,7 @@ test_that("version formatting in preserved", { suppressMessages(build_home_index(pkg)) index <- read_lines(path(pkg$dst_path, "index.html")) - expect_true(any(grepl("1.0.0-9000", index, fixed = TRUE))) + expect_match(index, "1.0.0-9000", fixed = TRUE, all = FALSE) }) test_that("data_home_sidebar() works by default", { diff --git a/tests/testthat/test-build-home.R b/tests/testthat/test-build-home.R index 48844dbe6..9ab6fb918 100644 --- a/tests/testthat/test-build-home.R +++ b/tests/testthat/test-build-home.R @@ -29,6 +29,6 @@ test_that(".github files are copied and linked", { suppressMessages(build_home(pkg)) lines <- read_lines(path(pkg$dst_path, "index.html")) - expect_true(any(grepl('href="CODE_OF_CONDUCT.html"', lines))) + expect_match(lines, 'href="CODE_OF_CONDUCT.html"', fixed = TRUE, all = FALSE) expect_true(file_exists(path(pkg$dst_path, "404.html"))) }) diff --git a/tests/testthat/test-markdown.R b/tests/testthat/test-markdown.R index ef453a0bc..224df1536 100644 --- a/tests/testthat/test-markdown.R +++ b/tests/testthat/test-markdown.R @@ -44,7 +44,7 @@ test_that("markdown_body() captures title", { # And can optionally strip it html <- markdown_body(pkg, temp, strip_header = TRUE) expect_equal(attr(html, "title"), "Title") - expect_false(grepl("Title", html)) + expect_no_match(html, "Title") }) test_that("markdown_text_*() handles UTF-8 correctly", { diff --git a/tests/testthat/test-repo.R b/tests/testthat/test-repo.R index 2b608810d..3ff8d30cd 100644 --- a/tests/testthat/test-repo.R +++ b/tests/testthat/test-repo.R @@ -160,7 +160,7 @@ test_that("meta overrides autodetection", { test_that("returns NULL if no urls found", { pkg <- local_pkgdown_site(desc = list(URL = "https://pkgdown.r-lib.org")) - expect_equal(package_repo(pkg), NULL) + expect_null(package_repo(pkg)) }) test_that("repo_type detects repo type", { From b31a55611735b2e73fe367f19359c9582f61e7a9 Mon Sep 17 00:00:00 2001 From: olivroy <52606734+olivroy@users.noreply.github.com> Date: Thu, 6 Jun 2024 17:48:30 -0400 Subject: [PATCH 05/31] Remove `document`, and warn on `autolink_html()` usage (#2643) * Make `document` defunct, and warn on `autolink_html()` usage * Actually remove `document` as it was deprecated for 5 years. --- NEWS.md | 2 ++ R/autolink_html.R | 7 ++++++- R/build-reference.R | 11 ----------- R/build.R | 12 +----------- man/autolink_html.Rd | 2 +- man/build_reference.Rd | 3 --- man/build_site.Rd | 5 +---- 7 files changed, 11 insertions(+), 31 deletions(-) diff --git a/NEWS.md b/NEWS.md index 2f5fe8cc5..c66eeb4b6 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,7 @@ # pkgdown (development version) +* `document` in `build_site()` and `build_reference()` has been removed after being deprecated in pkgdown 1.4.0. `devel` should be used instead. +* `autolink_html()` was deprecated in pkgdown 1.6.0 and now warns every time you use it. `downlit::downlit_html_path()` should be used instead. * `build_news()` only syntax highlights the page once, not twice, which prevents every block of R code getting a blank line at the start (#2630). ```R diff --git a/R/autolink_html.R b/R/autolink_html.R index a03c5ebcd..e19487fb8 100644 --- a/R/autolink_html.R +++ b/R/autolink_html.R @@ -3,7 +3,7 @@ #' @description #' `r lifecycle::badge("deprecated")` #' -#' Please use [downlit::downlit_html_path] instead. +#' Please use [downlit::downlit_html_path()] instead. #' #' @param input,output Input and output paths for HTML file #' @param local_packages A named character vector providing relative paths @@ -21,6 +21,11 @@ #' ) #' } autolink_html <- function(input, output = input, local_packages = character()) { + lifecycle::deprecate_warn( + "1.6.0", + "autolink_html()", + "downlit::downlit_html_path()" + ) withr::local_options(list( downlit.package = "", downlit.local_packages = local_packages diff --git a/R/build-reference.R b/R/build-reference.R index 16ad706af..e80a07ed2 100644 --- a/R/build-reference.R +++ b/R/build-reference.R @@ -146,7 +146,6 @@ #' If `TRUE` (the default), assumes you are in a live development #' environment, and loads source package with [pkgload::load_all()]. #' If `FALSE`, uses the installed version of the package. -#' @param document **Deprecated** Use `devel` instead. #' @param topics Build only specified topics. If supplied, sets `lazy` #' and `preview` to `FALSE`. #' @export @@ -158,7 +157,6 @@ build_reference <- function(pkg = ".", override = list(), preview = NA, devel = TRUE, - document = "DEPRECATED", topics = NULL) { pkg <- section_init(pkg, depth = 1L, override = override) check_bool(lazy) @@ -168,15 +166,6 @@ build_reference <- function(pkg = ".", check_bool(devel) check_character(topics, allow_null = TRUE) - if (document != "DEPRECATED") { - lifecycle::deprecate_warn( - "1.4.0", - "build_site(document)", - details = "build_site(devel)" - ) - devel <- document - } - cli::cli_rule("Building function reference") build_reference_index(pkg) diff --git a/R/build.R b/R/build.R index 24e17cb87..7434d61ae 100644 --- a/R/build.R +++ b/R/build.R @@ -326,22 +326,12 @@ build_site <- function(pkg = ".", preview = NA, devel = FALSE, new_process = !devel, - install = !devel, - document = "DEPRECATED") { + install = !devel) { pkg <- as_pkgdown(pkg, override = override) check_bool(devel) check_bool(new_process) check_bool(install) - if (document != "DEPRECATED") { - lifecycle::deprecate_warn( - "1.4.0", - "build_site(document)", - details = "build_site(devel)" - ) - devel <- document - } - if (install) { withr::local_temp_libpaths() cli::cli_rule("Installing package {.pkg {pkg$package}} into temporary library") diff --git a/man/autolink_html.Rd b/man/autolink_html.Rd index 0bed63ca7..c041a455f 100644 --- a/man/autolink_html.Rd +++ b/man/autolink_html.Rd @@ -16,7 +16,7 @@ from the target HTML document.} \description{ \ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} -Please use \link[downlit:downlit_html_path]{downlit::downlit_html_path} instead. +Please use \code{\link[downlit:downlit_html_path]{downlit::downlit_html_path()}} instead. } \examples{ \dontrun{ diff --git a/man/build_reference.Rd b/man/build_reference.Rd index 93742339b..b59282481 100644 --- a/man/build_reference.Rd +++ b/man/build_reference.Rd @@ -14,7 +14,6 @@ build_reference( override = list(), preview = NA, devel = TRUE, - document = "DEPRECATED", topics = NULL ) @@ -45,8 +44,6 @@ If \code{TRUE} (the default), assumes you are in a live development environment, and loads source package with \code{\link[pkgload:load_all]{pkgload::load_all()}}. If \code{FALSE}, uses the installed version of the package.} -\item{document}{\strong{Deprecated} Use \code{devel} instead.} - \item{topics}{Build only specified topics. If supplied, sets \code{lazy} and \code{preview} to \code{FALSE}.} } diff --git a/man/build_site.Rd b/man/build_site.Rd index 6b79760bc..4f5dd0918 100644 --- a/man/build_site.Rd +++ b/man/build_site.Rd @@ -14,8 +14,7 @@ build_site( preview = NA, devel = FALSE, new_process = !devel, - install = !devel, - document = "DEPRECATED" + install = !devel ) } \arguments{ @@ -57,8 +56,6 @@ in the current process affects the build process.} \item{install}{If \code{TRUE}, will install the package in a temporary library so it is available for vignettes.} - -\item{document}{\strong{Deprecated} Use \code{devel} instead.} } \description{ \code{build_site()} is a convenient wrapper around six functions: From f24f8b70bbb380778d01b63c33e5dec5f585a780 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 7 Jun 2024 09:38:20 -0500 Subject: [PATCH 06/31] Don't preview by default (#2638) --- NEWS.md | 1 + R/build-articles.R | 2 +- R/build-home.R | 2 +- R/build-news.R | 2 +- R/build-reference.R | 2 +- R/build-tutorials.R | 2 +- R/preview.R | 2 +- man/build_articles.Rd | 2 +- man/build_home.Rd | 2 +- man/build_news.Rd | 2 +- man/build_reference.Rd | 2 +- man/build_tutorials.Rd | 2 +- man/preview_site.Rd | 2 +- 13 files changed, 13 insertions(+), 12 deletions(-) diff --git a/NEWS.md b/NEWS.md index c66eeb4b6..432f5de67 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,6 @@ # pkgdown (development version) +* `build_*()` (apart from `build_site()`) functions no longer default to previewing in interactive sessions since they now all emit specific links to newly generated files. * `document` in `build_site()` and `build_reference()` has been removed after being deprecated in pkgdown 1.4.0. `devel` should be used instead. * `autolink_html()` was deprecated in pkgdown 1.6.0 and now warns every time you use it. `downlit::downlit_html_path()` should be used instead. * `build_news()` only syntax highlights the page once, not twice, which prevents every block of R code getting a blank line at the start (#2630). diff --git a/R/build-articles.R b/R/build-articles.R index 38411d683..b3a626b0f 100644 --- a/R/build-articles.R +++ b/R/build-articles.R @@ -198,7 +198,7 @@ build_articles <- function(pkg = ".", lazy = TRUE, seed = 1014L, override = list(), - preview = NA) { + preview = FALSE) { pkg <- section_init(pkg, depth = 1L, override = override) check_bool(quiet) check_bool(lazy) diff --git a/R/build-home.R b/R/build-home.R index 142378b33..194ca69a8 100644 --- a/R/build-home.R +++ b/R/build-home.R @@ -288,7 +288,7 @@ #' @order 1 build_home <- function(pkg = ".", override = list(), - preview = NA, + preview = FALSE, quiet = TRUE) { pkg <- section_init(pkg, depth = 0L, override = override) diff --git a/R/build-news.R b/R/build-news.R index 9868637d7..9ebc1e6ef 100644 --- a/R/build-news.R +++ b/R/build-news.R @@ -74,7 +74,7 @@ #' @export build_news <- function(pkg = ".", override = list(), - preview = NA) { + preview = FALSE) { pkg <- section_init(pkg, depth = 1L, override = override) if (!has_news(pkg$src_path)) return(invisible()) diff --git a/R/build-reference.R b/R/build-reference.R index e80a07ed2..70550d540 100644 --- a/R/build-reference.R +++ b/R/build-reference.R @@ -155,7 +155,7 @@ build_reference <- function(pkg = ".", run_dont_run = FALSE, seed = 1014L, override = list(), - preview = NA, + preview = FALSE, devel = TRUE, topics = NULL) { pkg <- section_init(pkg, depth = 1L, override = override) diff --git a/R/build-tutorials.R b/R/build-tutorials.R index 1060a3e87..6157f4e30 100644 --- a/R/build-tutorials.R +++ b/R/build-tutorials.R @@ -28,7 +28,7 @@ #' @inheritParams build_articles #' @family site components #' @export -build_tutorials <- function(pkg = ".", override = list(), preview = NA) { +build_tutorials <- function(pkg = ".", override = list(), preview = FALSE) { pkg <- section_init(pkg, depth = 1L, override = override) tutorials <- pkg$tutorials diff --git a/R/preview.R b/R/preview.R index f5f362624..4200f498a 100644 --- a/R/preview.R +++ b/R/preview.R @@ -3,7 +3,7 @@ #' @inheritParams build_article #' @param path Path relative to destination #' @export -preview_site <- function(pkg = ".", path = ".", preview = NA) { +preview_site <- function(pkg = ".", path = ".", preview = TRUE) { pkg <- as_pkgdown(pkg) check_string(path) check_bool(preview, allow_na = TRUE) diff --git a/man/build_articles.Rd b/man/build_articles.Rd index 3fff2a557..e6f89ecee 100644 --- a/man/build_articles.Rd +++ b/man/build_articles.Rd @@ -12,7 +12,7 @@ build_articles( lazy = TRUE, seed = 1014L, override = list(), - preview = NA + preview = FALSE ) build_article( diff --git a/man/build_home.Rd b/man/build_home.Rd index 224f4b5c6..b854a52e3 100644 --- a/man/build_home.Rd +++ b/man/build_home.Rd @@ -5,7 +5,7 @@ \alias{build_home_index} \title{Build home section} \usage{ -build_home(pkg = ".", override = list(), preview = NA, quiet = TRUE) +build_home(pkg = ".", override = list(), preview = FALSE, quiet = TRUE) build_home_index(pkg = ".", quiet = TRUE) } diff --git a/man/build_news.Rd b/man/build_news.Rd index 73f2d24f7..194d6b7b2 100644 --- a/man/build_news.Rd +++ b/man/build_news.Rd @@ -4,7 +4,7 @@ \alias{build_news} \title{Build news section} \usage{ -build_news(pkg = ".", override = list(), preview = NA) +build_news(pkg = ".", override = list(), preview = FALSE) } \arguments{ \item{pkg}{Path to package.} diff --git a/man/build_reference.Rd b/man/build_reference.Rd index b59282481..4d1388429 100644 --- a/man/build_reference.Rd +++ b/man/build_reference.Rd @@ -12,7 +12,7 @@ build_reference( run_dont_run = FALSE, seed = 1014L, override = list(), - preview = NA, + preview = FALSE, devel = TRUE, topics = NULL ) diff --git a/man/build_tutorials.Rd b/man/build_tutorials.Rd index cebe6612f..a2cb248bc 100644 --- a/man/build_tutorials.Rd +++ b/man/build_tutorials.Rd @@ -4,7 +4,7 @@ \alias{build_tutorials} \title{Build tutorials section} \usage{ -build_tutorials(pkg = ".", override = list(), preview = NA) +build_tutorials(pkg = ".", override = list(), preview = FALSE) } \arguments{ \item{pkg}{Path to package.} diff --git a/man/preview_site.Rd b/man/preview_site.Rd index d8b84405b..532983386 100644 --- a/man/preview_site.Rd +++ b/man/preview_site.Rd @@ -4,7 +4,7 @@ \alias{preview_site} \title{Open site in browser} \usage{ -preview_site(pkg = ".", path = ".", preview = NA) +preview_site(pkg = ".", path = ".", preview = TRUE) } \arguments{ \item{pkg}{Path to package.} From 8defd983aab0cf0eb9517813ecb4102915c84008 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 7 Jun 2024 10:53:52 -0500 Subject: [PATCH 07/31] Combine section_init() and create_subdir() (#2646) * Combine section_init() and create_subdir() * We can figure out `depth` based on whether or not a `subdir` is supplied * Ensures all user facing functions have the same interface * Brings together directory checking code in one place * Check for files, not directory Fixes #2644. Closes #2645 --- R/build-article.R | 3 ++- R/build-articles.R | 8 +++----- R/build-home-index.R | 4 ++-- R/build-home.R | 3 +-- R/build-news.R | 3 +-- R/build-redirects.R | 2 +- R/build-reference.R | 7 +++---- R/build-search-docs.R | 3 ++- R/build-tutorials.R | 3 +-- R/build.R | 2 +- R/clean.R | 26 ++++++++++++++++++++++++-- R/context.R | 20 ++++++++++++++++++-- R/init.R | 27 +++++---------------------- R/pkgdown.R | 11 ++++++----- R/utils-fs.R | 9 --------- man/build_articles.Rd | 3 ++- man/build_home.Rd | 2 +- man/build_reference.Rd | 2 +- man/init_site.Rd | 5 ++++- 19 files changed, 78 insertions(+), 65 deletions(-) diff --git a/R/build-article.R b/R/build-article.R index d7fc69cdc..84ec3dafd 100644 --- a/R/build-article.R +++ b/R/build-article.R @@ -13,8 +13,9 @@ build_article <- function(name, seed = 1014L, new_process = TRUE, pandoc_args = character(), + override = list(), quiet = TRUE) { - pkg <- as_pkgdown(pkg) + pkg <- section_init(pkg, "articles", override = override) # Look up in pkg vignette data - this allows convenient automatic # specification of depth, output destination, and other parameters that diff --git a/R/build-articles.R b/R/build-articles.R index b3a626b0f..6f095bb63 100644 --- a/R/build-articles.R +++ b/R/build-articles.R @@ -199,7 +199,7 @@ build_articles <- function(pkg = ".", seed = 1014L, override = list(), preview = FALSE) { - pkg <- section_init(pkg, depth = 1L, override = override) + pkg <- section_init(pkg, "articles", override = override) check_bool(quiet) check_bool(lazy) check_number_whole(seed, allow_null = TRUE) @@ -228,10 +228,8 @@ build_articles <- function(pkg = ".", #' @export #' @rdname build_articles #' @order 3 -build_articles_index <- function(pkg = ".") { - pkg <- as_pkgdown(pkg) - - create_subdir(pkg, "articles") +build_articles_index <- function(pkg = ".", override = list()) { + pkg <- section_init(pkg, "articles", override = override) render_page( pkg, "article-index", diff --git a/R/build-home-index.R b/R/build-home-index.R index 36801a8c9..cf5cf79d9 100644 --- a/R/build-home-index.R +++ b/R/build-home-index.R @@ -1,7 +1,7 @@ #' @export #' @rdname build_home -build_home_index <- function(pkg = ".", quiet = TRUE) { - pkg <- section_init(pkg, depth = 0L) +build_home_index <- function(pkg = ".", override = list(), quiet = TRUE) { + pkg <- section_init(pkg, override = override) src_path <- path_index(pkg) dst_path <- path(pkg$dst_path, "index.html") diff --git a/R/build-home.R b/R/build-home.R index 194ca69a8..ec06a6e64 100644 --- a/R/build-home.R +++ b/R/build-home.R @@ -291,11 +291,10 @@ build_home <- function(pkg = ".", preview = FALSE, quiet = TRUE) { - pkg <- section_init(pkg, depth = 0L, override = override) + pkg <- section_init(pkg, override = override) check_bool(quiet) cli::cli_rule("Building home") - create_subdir(pkg, "") build_citation_authors(pkg) diff --git a/R/build-news.R b/R/build-news.R index 9ebc1e6ef..da554025a 100644 --- a/R/build-news.R +++ b/R/build-news.R @@ -75,12 +75,11 @@ build_news <- function(pkg = ".", override = list(), preview = FALSE) { - pkg <- section_init(pkg, depth = 1L, override = override) + pkg <- section_init(pkg, "news", override = override) if (!has_news(pkg$src_path)) return(invisible()) cli::cli_rule("Building news") - create_subdir(pkg, "news") one_page <- config_pluck_bool(pkg, "news.one_page", default = TRUE) if (one_page) { diff --git a/R/build-redirects.R b/R/build-redirects.R index f4e4fc735..ac55a0f04 100644 --- a/R/build-redirects.R +++ b/R/build-redirects.R @@ -25,7 +25,7 @@ #' @export build_redirects <- function(pkg = ".", override = list()) { - pkg <- section_init(pkg, depth = 1L, override = override) + pkg <- section_init(pkg, override = override) has_url <- !is.null(config_pluck_string(pkg, "url")) redirects <- data_redirects(pkg, has_url) diff --git a/R/build-reference.R b/R/build-reference.R index 70550d540..de8992149 100644 --- a/R/build-reference.R +++ b/R/build-reference.R @@ -158,7 +158,7 @@ build_reference <- function(pkg = ".", preview = FALSE, devel = TRUE, topics = NULL) { - pkg <- section_init(pkg, depth = 1L, override = override) + pkg <- section_init(pkg, "reference", override = override) check_bool(lazy) check_bool(examples) check_bool(run_dont_run) @@ -242,9 +242,8 @@ examples_env <- function(pkg, seed = 1014L, devel = TRUE, envir = parent.frame() #' @export #' @rdname build_reference -build_reference_index <- function(pkg = ".") { - pkg <- section_init(pkg, depth = 1L) - create_subdir(pkg, "reference") +build_reference_index <- function(pkg = ".", override = list()) { + pkg <- section_init(pkg, "reference", override = override) # Copy icons, if needed dir_copy_to( diff --git a/R/build-search-docs.R b/R/build-search-docs.R index f1a2fad18..788d00525 100644 --- a/R/build-search-docs.R +++ b/R/build-search-docs.R @@ -79,8 +79,9 @@ build_sitemap <- function(pkg = ".") { #' build_search <- function(pkg = ".", override = list()) { - pkg <- section_init(pkg, depth = 1L, override = override) + pkg <- section_init(pkg, override = override) cli::cli_rule("Building search index") + search_index <- build_search_index(pkg) jsonlite::write_json( search_index, diff --git a/R/build-tutorials.R b/R/build-tutorials.R index 6157f4e30..006f9f72f 100644 --- a/R/build-tutorials.R +++ b/R/build-tutorials.R @@ -29,7 +29,7 @@ #' @family site components #' @export build_tutorials <- function(pkg = ".", override = list(), preview = FALSE) { - pkg <- section_init(pkg, depth = 1L, override = override) + pkg <- section_init(pkg, "tutorials", override = override) tutorials <- pkg$tutorials @@ -38,7 +38,6 @@ build_tutorials <- function(pkg = ".", override = list(), preview = FALSE) { } cli::cli_rule("Building tutorials") - create_subdir(pkg, "tutorials") data <- purrr::transpose(tutorials) diff --git a/R/build.R b/R/build.R index 7434d61ae..1889c4a9b 100644 --- a/R/build.R +++ b/R/build.R @@ -422,7 +422,7 @@ build_site_local <- function(pkg = ".", preview = NA, devel = TRUE) { - pkg <- section_init(pkg, depth = 0, override = override) + pkg <- section_init(pkg, override = override) cli::cli_rule("Building pkgdown site for package {.pkg {pkg$package}}") cli::cli_inform("Reading from: {src_path(path_abs(pkg$src_path))}") diff --git a/R/clean.R b/R/clean.R index 6116f3ae8..6c4ba235d 100644 --- a/R/clean.R +++ b/R/clean.R @@ -15,8 +15,8 @@ clean_site <- function(pkg = ".", quiet = FALSE) { if (!dir_exists(pkg$dst_path)) return(invisible()) - top_level <- dir_ls(pkg$dst_path) - top_level <- top_level[!path_file(top_level) %in% c("CNAME", "dev")] + check_dest_is_pkgdown(pkg) + top_level <- dest_files(pkg) is_dir <- is_dir(top_level) dir_delete(top_level[is_dir]) @@ -24,3 +24,25 @@ clean_site <- function(pkg = ".", quiet = FALSE) { invisible(TRUE) } + +check_dest_is_pkgdown <- function(pkg) { + if (file_exists(path(pkg$dst_path, "pkgdown.yml"))) { + return() + } + + cli::cli_abort(c( + "{.file {pkg$dst_path}} is non-empty and not built by pkgdown", + "!" = "Make sure it contains no important information \\ + and use {.run pkgdown::clean_site()} to delete its contents." + ) + ) +} + +dest_files <- function(pkg) { + if (!dir_exists(pkg$dst_path)) { + character() + } else { + top_level <- dir_ls(pkg$dst_path) + top_level[!path_file(top_level) %in% c("CNAME", "dev")] + } +} diff --git a/R/context.R b/R/context.R index a82ecc0b6..a0fd58e45 100644 --- a/R/context.R +++ b/R/context.R @@ -1,7 +1,23 @@ -section_init <- function(pkg, depth, override = list(), .frame = parent.frame()) { +section_init <- function(pkg, + subdir = NULL, + override = list(), + .frame = parent.frame()) { + rstudio_save_all() pkg <- as_pkgdown(pkg, override = override) + + if (length(dest_files(pkg)) > 0) { + check_dest_is_pkgdown(pkg) + } else { + init_site(pkg) + } + + if (is.null(subdir)) { + depth <- 0 + } else { + depth <- 1 + dir_create(path(pkg$dst_path, subdir)) + } - rstudio_save_all() local_envvar_pkgdown(pkg, .frame) local_options_link(pkg, depth = depth, .frame = .frame) diff --git a/R/init.R b/R/init.R index 90ddc21d3..25516ec32 100644 --- a/R/init.R +++ b/R/init.R @@ -20,17 +20,11 @@ #' #' @inheritParams build_articles #' @export -init_site <- function(pkg = ".") { - pkg <- as_pkgdown(pkg) - - if (is_non_pkgdown_site(pkg$dst_path)) { - cli::cli_abort(c( - "{.file {pkg$dst_path}} is non-empty and not built by pkgdown", - "!" = "Make sure it contains no important information \\ - and use {.run pkgdown::clean_site()} to delete its contents." - ) - ) - } +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() + pkg <- as_pkgdown(pkg, override = override) cli::cli_rule("Initialising site") dir_create(pkg$dst_path) @@ -156,14 +150,3 @@ site_meta <- function(pkg) { print_yaml(yaml) } - -is_non_pkgdown_site <- function(dst_path) { - if (!dir_exists(dst_path)) { - return(FALSE) - } - - top_level <- dir_ls(dst_path) - top_level <- top_level[!path_file(top_level) %in% c("CNAME", "dev", "deps")] - - length(top_level) >= 1 && !"pkgdown.yml" %in% path_file(top_level) -} diff --git a/R/pkgdown.R b/R/pkgdown.R index 3ecf33449..ef88c1100 100644 --- a/R/pkgdown.R +++ b/R/pkgdown.R @@ -25,6 +25,11 @@ local_pkgdown_site <- function(path = NULL, check_string(path, allow_null = TRUE) dst_path <- withr::local_tempdir(.local_envir = env) + # Simulate init_site() so we only have to run it if we care about + file_create(path(dst_path, "pkgdown.yml")) + dir_create(path(dst_path, "deps")) + file_create(path(dst_path, "deps", "data-deps.txt")) + meta <- modify_list(meta, list(destination = dst_path)) if (is.null(path)) { @@ -46,12 +51,8 @@ local_pkgdown_site <- function(path = NULL, # Make it a bit easier to create other files dir_create(path(path, "R")) dir_create(path(path, "vignettes")) - - # Create dummy deps so it's not 100% necessary to run init_site() - dir_create(path(dst_path, "deps")) - file_create(path(dst_path, "deps", "data-deps.txt")) } - + as_pkgdown(path, meta) } diff --git a/R/utils-fs.R b/R/utils-fs.R index f424d1e09..5c1b98b02 100644 --- a/R/utils-fs.R +++ b/R/utils-fs.R @@ -52,15 +52,6 @@ file_copy_to <- function(src_paths, file_copy(src_paths[!eq], dst_paths[!eq], overwrite = TRUE) } -# Checks init_site() first. -create_subdir <- function(pkg, subdir) { - if (!dir_exists(pkg$dst_path)) { - init_site(pkg) - } - dir_create(path(pkg$dst_path, subdir)) - -} - out_of_date <- function(source, target, call = caller_env()) { if (!file_exists(target)) { return(TRUE) diff --git a/man/build_articles.Rd b/man/build_articles.Rd index e6f89ecee..f5be82a18 100644 --- a/man/build_articles.Rd +++ b/man/build_articles.Rd @@ -22,10 +22,11 @@ build_article( seed = 1014L, new_process = TRUE, pandoc_args = character(), + override = list(), quiet = TRUE ) -build_articles_index(pkg = ".") +build_articles_index(pkg = ".", override = list()) } \arguments{ \item{pkg}{Path to package.} diff --git a/man/build_home.Rd b/man/build_home.Rd index b854a52e3..9db92d68c 100644 --- a/man/build_home.Rd +++ b/man/build_home.Rd @@ -7,7 +7,7 @@ \usage{ build_home(pkg = ".", override = list(), preview = FALSE, quiet = TRUE) -build_home_index(pkg = ".", quiet = TRUE) +build_home_index(pkg = ".", override = list(), quiet = TRUE) } \arguments{ \item{pkg}{Path to package.} diff --git a/man/build_reference.Rd b/man/build_reference.Rd index 4d1388429..3ae9edd16 100644 --- a/man/build_reference.Rd +++ b/man/build_reference.Rd @@ -17,7 +17,7 @@ build_reference( topics = NULL ) -build_reference_index(pkg = ".") +build_reference_index(pkg = ".", override = list()) } \arguments{ \item{pkg}{Path to package.} diff --git a/man/init_site.Rd b/man/init_site.Rd index 5e0638c91..9d44cc1aa 100644 --- a/man/init_site.Rd +++ b/man/init_site.Rd @@ -4,10 +4,13 @@ \alias{init_site} \title{Initialise site infrastructure} \usage{ -init_site(pkg = ".") +init_site(pkg = ".", override = list()) } \arguments{ \item{pkg}{Path to package.} + +\item{override}{An optional named list used to temporarily override +values in \verb{_pkgdown.yml}} } \description{ \code{init_site()}: From 2c8d15d58331bc5ef4ef2e42097e37554d8780b5 Mon Sep 17 00:00:00 2001 From: olivroy <52606734+olivroy@users.noreply.github.com> Date: Fri, 7 Jun 2024 15:43:31 -0400 Subject: [PATCH 08/31] Don't call `init_site()` when `lazy = TRUE` + use posix line end + document `init_site()` + speed cli console output (#2642) * use Posix line ending in pkgdown * Use `withr::local_options(cli.num_colors = num_col, .local_envir = .frame)` in `section_init()` * Document `init_site()` usage. * Only call `init_site()` when lazy = FALSE, since `build_home()` will call it anyway if necessary. * Add `local_options_console()` to `init_site()` * Apply suggestions from code review Co-authored-by: Hadley Wickham --------- Co-authored-by: Hadley Wickham --- R/build.R | 6 +++++- R/context.R | 7 +++++++ R/init.R | 9 +++++++++ R/theme.R | 2 ++ man/init_site.Rd | 10 ++++++++++ pkgdown.Rproj | 1 + 6 files changed, 34 insertions(+), 1 deletion(-) diff --git a/R/build.R b/R/build.R index 1889c4a9b..4870f6dfc 100644 --- a/R/build.R +++ b/R/build.R @@ -430,7 +430,11 @@ build_site_local <- function(pkg = ".", pkgdown_sitrep(pkg) - init_site(pkg) + if (!lazy) { + # Only force init_site() if `!lazy` + # if site is not initialized, it will be in build_home() + init_site(pkg, override) + } build_home(pkg, override = override, preview = FALSE) build_reference( diff --git a/R/context.R b/R/context.R index a0fd58e45..16f761187 100644 --- a/R/context.R +++ b/R/context.R @@ -20,10 +20,17 @@ section_init <- function(pkg, local_envvar_pkgdown(pkg, .frame) local_options_link(pkg, depth = depth, .frame = .frame) + cache_cli_colours(.frame = .frame) pkg } +cache_cli_colours <- function(.frame = parent.frame()) { + # https://github.com/r-lib/cli/issues/607 + num_col <- getOption("cli.num_colors", default = cli::num_ansi_colors()) + withr::local_options(cli.num_colors = num_col, .local_envir = .frame) +} + local_options_link <- function(pkg, depth, .frame = parent.frame()) { article_index <- article_index(pkg) Rdname <- get_rdname(pkg$topics) diff --git a/R/init.R b/R/init.R index 25516ec32..f36ecbd0f 100644 --- a/R/init.R +++ b/R/init.R @@ -8,6 +8,14 @@ #' * 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. #' @@ -24,6 +32,7 @@ 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") diff --git a/R/theme.R b/R/theme.R index 235a3bba1..2c7bafaf8 100644 --- a/R/theme.R +++ b/R/theme.R @@ -29,8 +29,10 @@ build_bslib <- function(pkg = ".", call = caller_env()) { data_deps <- function(pkg, depth) { if (!file_exists(data_deps_path(pkg))) { + # this is unlikely to occur after #2439 and #2571 cli::cli_abort( "Run {.fn pkgdown::init_site} first.", + .internal = TRUE, call = caller_env() ) } diff --git a/man/init_site.Rd b/man/init_site.Rd index 9d44cc1aa..b769b65a9 100644 --- a/man/init_site.Rd +++ b/man/init_site.Rd @@ -21,6 +21,16 @@ values in \verb{_pkgdown.yml}} \item runs \code{build_favicons()}, if needed. } +Typically, you will not need to call this function directly, as all \verb{build_*()} +functions will run \code{init_site()} if needed. + +The only good reasons to call \code{init_site()} directly are the following: +\itemize{ +\item If you add or modify a package logo. +\item If you add or modify \code{pkgdown/extra.scss}. +\item If you modify \code{template.bslib} variables in \verb{_pkgdown.yml}. +} + See \code{vignette("customise")} for the various ways you can customise the display of your site. } diff --git a/pkgdown.Rproj b/pkgdown.Rproj index 8eb3054db..1a7bd8269 100644 --- a/pkgdown.Rproj +++ b/pkgdown.Rproj @@ -14,6 +14,7 @@ LaTeX: pdfLaTeX AutoAppendNewline: Yes StripTrailingWhitespace: Yes +LineEndingConversion: Posix BuildType: Package PackageUseDevtools: Yes From aa841af63f03bc7190464e9cd4dd3fca1d442ec6 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Mon, 10 Jun 2024 08:39:08 -0500 Subject: [PATCH 09/31] Bump downlit version (#2648) To ensure that all pkgdown users get the latest verson --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index eb905638e..90a057567 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,7 +26,7 @@ Imports: cli (>= 3.6.1), desc (>= 1.4.0), digest, - downlit (>= 0.4.0), + downlit (>= 0.4.4), fontawesome, fs (>= 1.4.0), httr2 (>= 1.0.0), From 7180f25738031f889152e204687d51888b145673 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Mon, 10 Jun 2024 11:27:43 -0500 Subject: [PATCH 10/31] Actually use the translation of abstract (#2652) --- NEWS.md | 1 + inst/BS5/templates/content-article.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 432f5de67..ad5bba889 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,6 @@ # pkgdown (development version) +* `build_article()` now translates the "Abstract" title if it's used. * `build_*()` (apart from `build_site()`) functions no longer default to previewing in interactive sessions since they now all emit specific links to newly generated files. * `document` in `build_site()` and `build_reference()` has been removed after being deprecated in pkgdown 1.4.0. `devel` should be used instead. * `autolink_html()` was deprecated in pkgdown 1.6.0 and now warns every time you use it. `downlit::downlit_html_path()` should be used instead. diff --git a/inst/BS5/templates/content-article.html b/inst/BS5/templates/content-article.html index b2be7817c..75d48f936 100644 --- a/inst/BS5/templates/content-article.html +++ b/inst/BS5/templates/content-article.html @@ -39,7 +39,7 @@

$date$

$if(abstract)$
-

Abstract

+

{{#translate}}{{abstract}}{{/translate}}

$abstract$
$endif$ From fd8ed2468448e2a5790b2bc92260461fbaa1c2b3 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Mon, 10 Jun 2024 11:50:08 -0500 Subject: [PATCH 11/31] Tidying up utils and helpers (#2651) --- R/build-home-index.R | 5 ++ R/pkgdown.R | 59 ---------------------- R/rd-html.R | 7 +++ R/utils-io.R | 5 +- R/utils.R | 32 ++---------- tests/testthat/helper.R | 68 ++++++++++++++++++++++++++ tests/testthat/test-build-home-index.R | 8 +++ tests/testthat/test-utils.R | 9 ---- 8 files changed, 94 insertions(+), 99 deletions(-) diff --git a/R/build-home-index.R b/R/build-home-index.R index cf5cf79d9..d589970b4 100644 --- a/R/build-home-index.R +++ b/R/build-home-index.R @@ -226,3 +226,8 @@ req_pkgdown_cache <- function(req) { max_age = 86400 # 1 day ) } + +# authors forced to wrap words in '' to prevent spelling errors +cran_unquote <- function(string) { + gsub("\\'(.*?)\\'", "\\1", string) +} diff --git a/R/pkgdown.R b/R/pkgdown.R index ef88c1100..d61a3cecf 100644 --- a/R/pkgdown.R +++ b/R/pkgdown.R @@ -17,62 +17,3 @@ local_envvar_pkgdown <- function(pkg, scope = parent.frame()) { .local_envir = scope ) } - -local_pkgdown_site <- function(path = NULL, - meta = list(), - desc = list(), - env = caller_env()) { - check_string(path, allow_null = TRUE) - - dst_path <- withr::local_tempdir(.local_envir = env) - # Simulate init_site() so we only have to run it if we care about - file_create(path(dst_path, "pkgdown.yml")) - dir_create(path(dst_path, "deps")) - file_create(path(dst_path, "deps", "data-deps.txt")) - - meta <- modify_list(meta, list(destination = dst_path)) - - if (is.null(path)) { - path <- withr::local_tempdir(.local_envir = env) - - description <- desc::desc("!new") - description$set("Package", "testpackage") - description$set("Title", "A test package") - if (length(desc) > 0) - inject(description$set(!!!desc)) - description$write(file = path(path, "DESCRIPTION")) - - # Default to BS5 only if template not specified - meta$template <- meta$template %||% list(bootstrap = 5) - - # Record meta in case we re-run as_pkgdown() - yaml::write_yaml(meta, path(path, "_pkgdown.yml")) - - # Make it a bit easier to create other files - dir_create(path(path, "R")) - dir_create(path(path, "vignettes")) - } - - as_pkgdown(path, meta) -} - -local_pkgdown_template_pkg <- function(path = NULL, meta = NULL, env = parent.frame()) { - if (is.null(path)) { - path <- withr::local_tempdir(.local_envir = env) - desc <- desc::desc("!new") - desc$set("Package", "templatepackage") - desc$set("Title", "A test template package") - desc$write(file = path(path, "DESCRIPTION")) - } - - if (!is.null(meta)) { - path_pkgdown_yml <- path(path, "inst", "pkgdown", "_pkgdown.yml") - dir_create(path_dir(path_pkgdown_yml)) - yaml::write_yaml(meta, path_pkgdown_yml) - } - - pkgload::load_all(path, quiet = TRUE) - withr::defer(pkgload::unload("templatepackage"), envir = env) - - path -} diff --git a/R/rd-html.R b/R/rd-html.R index 12466497a..2e8a4acd5 100644 --- a/R/rd-html.R +++ b/R/rd-html.R @@ -50,6 +50,13 @@ flatten_para <- function(x, ...) { paste0(blocks, collapse = "") } +split_at_linebreaks <- function(text) { + if (length(text) == 0) { + character() + } else { + strsplit(text, "\\n\\s*\\n")[[1]] + } +} flatten_text <- function(x, ...) { if (length(x) == 0) return("") diff --git a/R/utils-io.R b/R/utils-io.R index 90d078e9c..87ce958ca 100644 --- a/R/utils-io.R +++ b/R/utils-io.R @@ -5,8 +5,8 @@ read_file <- function(path) { paste0(lines, "\n", collapse = "") } -# Inspired by roxygen2 utils-io.R (https://github.com/klutometis/roxygen/) -------- +# Inspired by roxygen2 utils-io.R (https://github.com/klutometis/roxygen/) -------- read_lines <- function(path, n = -1L) { base::readLines(path, n = n, encoding = "UTF-8", warn = FALSE) # nolint } @@ -22,8 +22,7 @@ file_equal <- function(src, dst) { return(FALSE) src_hash <- digest::digest(file = src, algo = "xxhash64") - dst_hash <- digest::digest(file = dst, algo = "xxhash64") + dst_hash <- digest::digest(file = dst, algo = "xxhash64") identical(src_hash, dst_hash) } - diff --git a/R/utils.R b/R/utils.R index f95dac9d2..bb33a495a 100644 --- a/R/utils.R +++ b/R/utils.R @@ -1,13 +1,3 @@ -set_contains <- function(haystack, needles) { - all(needles %in% haystack) -} - -split_at_linebreaks <- function(text) { - if (length(text) < 1) - return(character()) - strsplit(text, "\\n\\s*\\n")[[1]] -} - up_path <- function(depth) { paste(rep.int("../", depth), collapse = "") } @@ -53,6 +43,10 @@ unwrap_purrr_error <- function(code) { ) } +tr_ <- function(...) { + enc2utf8(gettext(..., domain = "R-pkgdown")) +} + # devtools metadata ------------------------------------------------------- system_file <- function(..., package) { @@ -84,24 +78,10 @@ writing_file <- function(path, show) { cli::cli_inform("Writing {.run [{text}](pkgdown::preview_page('{path}'))}") } -skip_if_no_pandoc <- function(version = "1.12.3") { - testthat::skip_if_not(rmarkdown::pandoc_available(version)) -} - has_internet <- function() { getOption("pkgdown.internet", default = TRUE) } -# remove '' quoting -# e.g. 'title' becomes title.s -cran_unquote <- function(string) { - gsub("\\'(.*?)\\'", "\\1", string) -} - -isFALSE <- function(x) { - is.logical(x) && length(x) == 1L && !is.na(x) && !x -} - modify_list <- function(x, y) { if (is.null(x)) { return(y) @@ -221,7 +201,3 @@ print.pkgdown_xml <- function(x, ...) { cat(as.character(x, options = c("format", "no_declaration")), sep = "\n") invisible(x) } - -tr_ <- function(...) { - enc2utf8(gettext(..., domain = "R-pkgdown")) -} diff --git a/tests/testthat/helper.R b/tests/testthat/helper.R index 43d617c8b..c3f89ac5a 100644 --- a/tests/testthat/helper.R +++ b/tests/testthat/helper.R @@ -1,3 +1,47 @@ +skip_if_no_pandoc <- function(version = "1.12.3") { + testthat::skip_if_not(rmarkdown::pandoc_available(version)) +} + +# Simulate a package -------------------------------------------------------- + +local_pkgdown_site <- function(path = NULL, + meta = list(), + desc = list(), + env = caller_env()) { + check_string(path, allow_null = TRUE) + + dst_path <- withr::local_tempdir(.local_envir = env) + # Simulate init_site() so we only have to run it if we care about + file_create(path(dst_path, "pkgdown.yml")) + dir_create(path(dst_path, "deps")) + file_create(path(dst_path, "deps", "data-deps.txt")) + + meta <- modify_list(meta, list(destination = dst_path)) + + if (is.null(path)) { + path <- withr::local_tempdir(.local_envir = env) + + description <- desc::desc("!new") + description$set("Package", "testpackage") + description$set("Title", "A test package") + if (length(desc) > 0) + inject(description$set(!!!desc)) + description$write(file = path(path, "DESCRIPTION")) + + # Default to BS5 only if template not specified + meta$template <- meta$template %||% list(bootstrap = 5) + + # Record meta in case we re-run as_pkgdown() + yaml::write_yaml(meta, path(path, "_pkgdown.yml")) + + # Make it a bit easier to create other files + dir_create(path(path, "R")) + dir_create(path(path, "vignettes")) + } + + as_pkgdown(path, meta) +} + pkg_add_file <- function(pkg, path, lines = NULL) { full_path <- path(pkg$src_path, path) dir_create(path_dir(full_path)) @@ -36,3 +80,27 @@ pkg_vignette <- function(..., title = "title") { c("---", yaml, "---", contents) } r_code_block <- function(...) c("```{r}", ..., "```") + +# Simulate a template package ------------------------------------------------ + +local_pkgdown_template_pkg <- function(path = NULL, meta = NULL, env = parent.frame()) { + if (is.null(path)) { + path <- withr::local_tempdir(.local_envir = env) + desc <- desc::desc("!new") + desc$set("Package", "templatepackage") + desc$set("Title", "A test template package") + desc$write(file = path(path, "DESCRIPTION")) + } + + if (!is.null(meta)) { + path_pkgdown_yml <- path(path, "inst", "pkgdown", "_pkgdown.yml") + dir_create(path_dir(path_pkgdown_yml)) + yaml::write_yaml(meta, path_pkgdown_yml) + } + + pkgload::load_all(path, quiet = TRUE) + withr::defer(pkgload::unload("templatepackage"), envir = env) + + path +} + \ No newline at end of file diff --git a/tests/testthat/test-build-home-index.R b/tests/testthat/test-build-home-index.R index 317164ac1..283b39126 100644 --- a/tests/testthat/test-build-home-index.R +++ b/tests/testthat/test-build-home-index.R @@ -145,3 +145,11 @@ test_that("package repo verification", { list(repo = "Bioconductor", url = "https://www.bioconductor.org/packages/Biobase") ) }) + + +test_that("cran_unquote works", { + expect_equal( + cran_unquote("'Quoting' is CRAN's thing."), + "Quoting is CRAN's thing." + ) +}) diff --git a/tests/testthat/test-utils.R b/tests/testthat/test-utils.R index 27a5cc460..e1acabed4 100644 --- a/tests/testthat/test-utils.R +++ b/tests/testthat/test-utils.R @@ -3,15 +3,6 @@ test_that("pkgdown.internet can be set and read", { expect_false(has_internet()) }) -test_that("cran_unquote works", { - expect_equal(cran_unquote("Quoting is CRAN's thing."), - "Quoting is CRAN's thing.") - expect_equal(cran_unquote("'R-hub' is great!"), - "R-hub is great!") - expect_equal(cran_unquote("From 'README' to 'html' with 'pkgdown'"), - "From README to html with pkgdown") -}) - test_that("is_internal_link() works", { pkg=list(meta=list(url="https://pkgdown.r-lib.org")) expect_false(is_internal_link("https://github.com", pkg = pkg)) From 2caf6258dfd8e28a9083df5ac496800f70b0a92a Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Mon, 10 Jun 2024 13:51:33 -0500 Subject: [PATCH 12/31] Improve preview docs/tests/implementation (#2650) --- NEWS.md | 1 + R/preview.R | 35 ++++++++++++++++++++++++-------- man/preview_page.Rd | 3 +-- man/preview_site.Rd | 5 ++++- tests/testthat/_snaps/preview.md | 5 +++++ tests/testthat/test-preview.R | 16 +++++++++++++++ 6 files changed, 54 insertions(+), 11 deletions(-) diff --git a/NEWS.md b/NEWS.md index ad5bba889..4e800a793 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,6 @@ # pkgdown (development version) +* `preivew_page()` has been deprecated (#2650). * `build_article()` now translates the "Abstract" title if it's used. * `build_*()` (apart from `build_site()`) functions no longer default to previewing in interactive sessions since they now all emit specific links to newly generated files. * `document` in `build_site()` and `build_reference()` has been removed after being deprecated in pkgdown 1.4.0. `devel` should be used instead. diff --git a/R/preview.R b/R/preview.R index 4200f498a..6c84e503f 100644 --- a/R/preview.R +++ b/R/preview.R @@ -1,35 +1,54 @@ #' Open site in browser #' +#' `preview_site()` opens your pkgdown site in your browser. pkgdown has been +#' carefully designed to work even when served from the file system like +#' this; the only part that doesn't work is search. You can use `servr::httw("docs/")` +#' to create a server to make search work locally. +#' #' @inheritParams build_article #' @param path Path relative to destination #' @export preview_site <- function(pkg = ".", path = ".", preview = TRUE) { - pkg <- as_pkgdown(pkg) - check_string(path) + path <- local_path(pkg, path) + check_bool(preview, allow_na = TRUE) - if (is.na(preview)) { preview <- interactive() && !is_testing() } if (preview) { cli::cli_inform(c(i = "Previewing site")) - utils::browseURL(path(pkg$dst_path, path, "index.html")) + utils::browseURL(path) } invisible() } +local_path <- function(pkg, path, call = caller_env()) { + pkg <- as_pkgdown(pkg) + check_string(path, call = call) + + abs_path <- path_abs(path, pkg$dst_path) + if (!file_exists(abs_path)) { + cli::cli_abort("Can't find file {.path {path}}.", call = call) + } + + if (is_dir(abs_path)) { + abs_path <- path(abs_path, "index.html") + } + abs_path +} + #' Preview a local pkgdown page in the browser #' -#' Only works when rendering the working directory, as this is the most -#' common interactive workflow. +#' @description +#' `r lifecycle::badge("deprecated")` Use [preview_site()] instead. #' #' @export #' @keywords internal preview_page <- function(path, pkg = ".") { - pkg <- as_pkgdown(".") - utils::browseURL(path_abs(path(pkg$dst_path, path))) + lifecycle::deprecate_warn("2.1.0", "preview_page()", "preview_site()") + preview_site(pkg, path, preview = TRUE) } is_testing <- function() { diff --git a/man/preview_page.Rd b/man/preview_page.Rd index 32ddc627b..c1c929fd5 100644 --- a/man/preview_page.Rd +++ b/man/preview_page.Rd @@ -7,7 +7,6 @@ preview_page(path, pkg = ".") } \description{ -Only works when rendering the working directory, as this is the most -common interactive workflow. +\ifelse{html}{\href{https://lifecycle.r-lib.org/articles/stages.html#deprecated}{\figure{lifecycle-deprecated.svg}{options: alt='[Deprecated]'}}}{\strong{[Deprecated]}} Use \code{\link[=preview_site]{preview_site()}} instead. } \keyword{internal} diff --git a/man/preview_site.Rd b/man/preview_site.Rd index 532983386..d12fb6750 100644 --- a/man/preview_site.Rd +++ b/man/preview_site.Rd @@ -15,5 +15,8 @@ preview_site(pkg = ".", path = ".", preview = TRUE) freshly generated section in browser.} } \description{ -Open site in browser +\code{preview_site()} opens your pkgdown site in your browser. pkgdown has been +carefully designed to work even when served from the file system like +this; the only part that doesn't work is search. You can use \code{servr::httw("docs/")} +to create a server to make search work locally. } diff --git a/tests/testthat/_snaps/preview.md b/tests/testthat/_snaps/preview.md index 84b9cb23e..fcef0e918 100644 --- a/tests/testthat/_snaps/preview.md +++ b/tests/testthat/_snaps/preview.md @@ -5,6 +5,11 @@ Condition Error in `preview_site()`: ! `path` must be a single string, not the number 1. + Code + preview_site(pkg, path = "foo") + Condition + Error in `preview_site()`: + ! Can't find file 'foo'. Code preview_site(pkg, preview = 1) Condition diff --git a/tests/testthat/test-preview.R b/tests/testthat/test-preview.R index ffaf0fe6b..e83424178 100644 --- a/tests/testthat/test-preview.R +++ b/tests/testthat/test-preview.R @@ -3,6 +3,22 @@ test_that("checks its inputs", { expect_snapshot(error = TRUE, { preview_site(pkg, path = 1) + preview_site(pkg, path = "foo") preview_site(pkg, preview = 1) }) }) + +test_that("local_path adds index.html if needed", { + pkg <- local_pkgdown_site() + file_create(path(pkg$dst_path, "test.html")) + expect_equal( + local_path(pkg, "test.html"), + path(pkg$dst_path, "test.html") + ) + + dir_create(path(pkg$dst_path, "reference")) + expect_equal( + local_path(pkg, "reference"), + path(pkg$dst_path, "reference", "index.html") + ) +}) From ebc777fbb584b7e821f3f5dfe8a9432ee964a8f9 Mon Sep 17 00:00:00 2001 From: Hugo Gruson <10783929+Bisaloo@users.noreply.github.com> Date: Mon, 10 Jun 2024 22:03:47 +0200 Subject: [PATCH 13/31] Fix typo in NEWS (#2653) --- NEWS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NEWS.md b/NEWS.md index 4e800a793..40d0a8419 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,6 +1,6 @@ # pkgdown (development version) -* `preivew_page()` has been deprecated (#2650). +* `preview_page()` has been deprecated (#2650). * `build_article()` now translates the "Abstract" title if it's used. * `build_*()` (apart from `build_site()`) functions no longer default to previewing in interactive sessions since they now all emit specific links to newly generated files. * `document` in `build_site()` and `build_reference()` has been removed after being deprecated in pkgdown 1.4.0. `devel` should be used instead. From 9d12165b8cd084432410b682a97032fa20171c74 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Tue, 11 Jun 2024 09:04:45 -0500 Subject: [PATCH 14/31] evaluate now on CRAN (#2655) --- DESCRIPTION | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 90a057567..ef658f0c0 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -44,7 +44,7 @@ Imports: Suggests: covr, diffviewer, - evaluate (>= 0.23.0.9000), + evaluate (>= 0.24.0), gert, gt, htmltools, @@ -71,4 +71,3 @@ Encoding: UTF-8 Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.1 SystemRequirements: pandoc -Remotes: r-lib/evaluate From db625c561d9c913da9da1831cf4bf0547686f0a1 Mon Sep 17 00:00:00 2001 From: Salim B Date: Wed, 12 Jun 2024 02:11:26 +0200 Subject: [PATCH 15/31] Add @salim-b as author (#2649) --- DESCRIPTION | 2 ++ NEWS.md | 2 +- man/pkgdown-package.Rd | 1 + pkgdown/_pkgdown.yml | 2 ++ 4 files changed, 6 insertions(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index ef658f0c0..c1dc651f4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -9,6 +9,8 @@ Authors@R: c( person("Maëlle", "Salmon", role = "aut", comment = c(ORCID = "0000-0002-2815-0399")), person("Olivier", "Roy", role = "aut"), + person("Salim", "Brüggemann", role = "aut", + comment = c(ORCID = "0000-0002-5329-5987")), person("Posit Software, PBC", role = c("cph", "fnd")) ) Description: Generate an attractive and useful website from a source diff --git a/NEWS.md b/NEWS.md index 40d0a8419..60ae56ad9 100644 --- a/NEWS.md +++ b/NEWS.md @@ -17,7 +17,7 @@ * When built on GitHub, source urls now use the name of the current upstream branch (rather than `HEAD`), which is more likely to generate correct links (#2597). * New `vignette("non-english")` that discusses non-English sites including how to submit new translations (#2605). * `build_reference()` now generates the usage that users actually type for infix and replacement methods (#2303). -* @olivroy is now a pkgdown author in recognition of his contributions. +* @olivroy and @salim-b are now pkgdown authors in recognition of their contributions. * `pkgdown_sitrep()`/`check_pkgdown()` now check that you have up-to-date favicons if you have a package logo. * pkgdown now uses httr2 instead of httr (#2600). * New `template.math-rendering` allows you to control how math is rendered across your site. The default uses `mathml` which is low-dependency, but has the lowest fidelity. You can also use `mathjax`, the previous default, and `katex`, a faster alternative. (#1966). diff --git a/man/pkgdown-package.Rd b/man/pkgdown-package.Rd index c88eab63a..e2a1364f7 100644 --- a/man/pkgdown-package.Rd +++ b/man/pkgdown-package.Rd @@ -27,6 +27,7 @@ Authors: \item Jay Hesselberth (\href{https://orcid.org/0000-0002-6299-179X}{ORCID}) \item Maëlle Salmon (\href{https://orcid.org/0000-0002-2815-0399}{ORCID}) \item Olivier Roy + \item Salim Brüggemann (\href{https://orcid.org/0000-0002-5329-5987}{ORCID}) } Other contributors: diff --git a/pkgdown/_pkgdown.yml b/pkgdown/_pkgdown.yml index f47693756..b1dd5e22d 100644 --- a/pkgdown/_pkgdown.yml +++ b/pkgdown/_pkgdown.yml @@ -4,6 +4,8 @@ home: title: Build websites for R packages authors: + Salim Brüggemann: + href: https://salim.space Jay Hesselberth: href: https://hesselberthlab.org Maëlle Salmon: From 76ce62d8a0f04f846883cff044a53e3aaaf3a623 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Wed, 12 Jun 2024 11:30:26 -0500 Subject: [PATCH 16/31] Actions update (#2657) --- .github/workflows/R-CMD-check.yaml | 17 ++++++++++------- .github/workflows/netlify.yaml | 2 +- .github/workflows/no-pandoc.yaml | 2 +- .github/workflows/pr-commands.yaml | 6 ++++-- .github/workflows/test-coverage.yaml | 21 ++++++++++++++++----- README.Rmd | 2 +- README.md | 6 +++--- 7 files changed, 36 insertions(+), 20 deletions(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index d9fced246..e712a2167 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -12,6 +12,8 @@ on: name: R-CMD-check +permissions: read-all + jobs: R-CMD-check: runs-on: ${{ matrix.config.os }} @@ -28,19 +30,19 @@ jobs: # use 4.1 to check with rtools40's older compiler - {os: windows-latest, r: '4.1'} - - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} - - {os: ubuntu-latest, r: 'release'} - - {os: ubuntu-latest, r: 'oldrel-1'} - - {os: ubuntu-latest, r: 'oldrel-2'} - - {os: ubuntu-latest, r: 'oldrel-3'} - - {os: ubuntu-latest, r: 'oldrel-4'} + - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} + - {os: ubuntu-latest, r: 'release'} + - {os: ubuntu-latest, r: 'oldrel-1'} + - {os: ubuntu-latest, r: 'oldrel-2'} + - {os: ubuntu-latest, r: 'oldrel-3'} + - {os: ubuntu-latest, r: 'oldrel-4'} env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} R_KEEP_PKG_SOURCE: yes steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/setup-pandoc@v2 @@ -58,3 +60,4 @@ jobs: - uses: r-lib/actions/check-r-package@v2 with: upload-snapshots: true + build_args: 'c("--no-manual","--compact-vignettes=gs+qpdf")' diff --git a/.github/workflows/netlify.yaml b/.github/workflows/netlify.yaml index d9994b1c3..10c6fe1e0 100644 --- a/.github/workflows/netlify.yaml +++ b/.github/workflows/netlify.yaml @@ -10,7 +10,7 @@ jobs: env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/setup-tinytex@v2 diff --git a/.github/workflows/no-pandoc.yaml b/.github/workflows/no-pandoc.yaml index 9e0e7b502..7d3c32c89 100644 --- a/.github/workflows/no-pandoc.yaml +++ b/.github/workflows/no-pandoc.yaml @@ -15,7 +15,7 @@ jobs: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} R_KEEP_PKG_SOURCE: yes steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - uses: r-lib/actions/setup-r@v2 with: diff --git a/.github/workflows/pr-commands.yaml b/.github/workflows/pr-commands.yaml index 71f335b3e..d1f765096 100644 --- a/.github/workflows/pr-commands.yaml +++ b/.github/workflows/pr-commands.yaml @@ -6,6 +6,8 @@ on: name: Commands +permissions: read-all + jobs: document: if: ${{ github.event.issue.pull_request && (github.event.comment.author_association == 'MEMBER' || github.event.comment.author_association == 'OWNER') && startsWith(github.event.comment.body, '/document') }} @@ -14,7 +16,7 @@ jobs: env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/pr-fetch@v2 with: @@ -51,7 +53,7 @@ jobs: env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/pr-fetch@v2 with: diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 4b5b0eb68..2aec33d37 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -8,6 +8,8 @@ on: name: test-coverage +permissions: read-all + jobs: test-coverage: runs-on: ubuntu-latest @@ -15,7 +17,7 @@ jobs: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: r-lib/actions/setup-pandoc@v2 @@ -25,28 +27,37 @@ jobs: - uses: r-lib/actions/setup-r-dependencies@v2 with: - extra-packages: any::covr + extra-packages: any::covr, any::xml2 needs: coverage - name: Test coverage run: | - covr::codecov( + cov <- covr::package_coverage( quiet = FALSE, clean = FALSE, install_path = file.path(normalizePath(Sys.getenv("RUNNER_TEMP"), winslash = "/"), "package") ) + covr::to_cobertura(cov) shell: Rscript {0} + - uses: codecov/codecov-action@v4 + with: + fail_ci_if_error: ${{ github.event_name != 'pull_request' && true || false }} + file: ./cobertura.xml + plugin: noop + disable_search: true + token: ${{ secrets.CODECOV_TOKEN }} + - name: Show testthat output if: always() run: | ## -------------------------------------------------------------------- - find ${{ runner.temp }}/package -name 'testthat.Rout*' -exec cat '{}' \; || true + find '${{ runner.temp }}/package' -name 'testthat.Rout*' -exec cat '{}' \; || true shell: bash - name: Upload test results if: failure() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: coverage-test-failures path: ${{ runner.temp }}/package diff --git a/README.Rmd b/README.Rmd index b24dccae9..1693157c3 100644 --- a/README.Rmd +++ b/README.Rmd @@ -16,7 +16,7 @@ knitr::opts_chunk$set( [![CRAN Status](https://www.r-pkg.org/badges/version/pkgdown)](https://cran.r-project.org/package=pkgdown){.pkgdown-release} -[![R-CMD-check](https://github.com/r-lib/pkgdown/workflows/R-CMD-check/badge.svg)](https://github.com/r-lib/pkgdown/actions){.pkgdown-devel} +[![R-CMD-check](https://github.com/r-lib/pkgdown/actions/workflows/R-CMD-check.yaml/badge.svg)](https://github.com/r-lib/pkgdown/actions/workflows/R-CMD-check.yaml){.pkgdown-devel} [![Codecov test coverage](https://codecov.io/gh/r-lib/pkgdown/branch/main/graph/badge.svg)](https://app.codecov.io/gh/r-lib/pkgdown?branch=main) diff --git a/README.md b/README.md index 0a820511c..f186e8bd0 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,10 @@ - R-CMD-check [![Codecov test coverage](https://codecov.io/gh/r-lib/pkgdown/branch/main/graph/badge.svg)](https://app.codecov.io/gh/r-lib/pkgdown?branch=main) From 3a97851481c66a5f44200664779d4d2e08d598a8 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Thu, 13 Jun 2024 15:26:07 -0500 Subject: [PATCH 17/31] Support quarto vignettes (#2656) Fixes #2210 --- .Rbuildignore | 1 + .github/workflows/R-CMD-check.yaml | 7 + .github/workflows/netlify.yaml | 5 + .github/workflows/pkgdown.yaml | 4 +- .github/workflows/test-coverage.yaml | 7 + DESCRIPTION | 6 +- NEWS.md | 1 + R/build-article.R | 37 ++++- R/build-articles.R | 3 +- R/build-news.R | 2 +- R/build-quarto-articles.R | 150 ++++++++++++++++++ R/build-search-docs.R | 2 +- R/package.R | 38 ++++- R/render.R | 8 +- R/tweak-tags.R | 10 +- R/utils-fs.R | 17 +- R/utils.R | 33 +++- inst/BS5/assets/pkgdown.scss | 144 +++++++++++++++++ inst/BS5/templates/content-quarto.html | 36 +++++ inst/BS5/templates/head.html | 1 + inst/quarto/template.html | 61 +++++++ pkgdown/_pkgdown.yml | 1 + .../testthat/_snaps/build-quarto-articles.md | 19 +++ tests/testthat/helper.R | 15 +- tests/testthat/test-build-quarto-articles.R | 105 ++++++++++++ vignettes/pitbull.jpg | Bin 0 -> 53524 bytes vignettes/quarto.qmd | 105 ++++++++++++ vignettes/shar-pei.jpg | Bin 0 -> 52857 bytes vignettes/test/quarto-features.qmd | 54 +++++++ 29 files changed, 835 insertions(+), 37 deletions(-) create mode 100644 R/build-quarto-articles.R create mode 100644 inst/BS5/templates/content-quarto.html create mode 100644 inst/quarto/template.html create mode 100644 tests/testthat/_snaps/build-quarto-articles.md create mode 100644 tests/testthat/test-build-quarto-articles.R create mode 100644 vignettes/pitbull.jpg create mode 100644 vignettes/quarto.qmd create mode 100644 vignettes/shar-pei.jpg create mode 100644 vignettes/test/quarto-features.qmd diff --git a/.Rbuildignore b/.Rbuildignore index dd8e33561..620b2328e 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -20,3 +20,4 @@ ^CRAN-SUBMISSION$ ^tools$ ^\.lintr.R$ +^vignettes/\.quarto$ diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index e712a2167..cd91a64f1 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -44,6 +44,13 @@ jobs: steps: - uses: actions/checkout@v4 + - uses: quarto-dev/quarto-actions/setup@v2 + with: + version: pre-release + tinytex: true + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: r-lib/actions/setup-pandoc@v2 - uses: r-lib/actions/setup-r@v2 diff --git a/.github/workflows/netlify.yaml b/.github/workflows/netlify.yaml index 10c6fe1e0..3bc4f8ebd 100644 --- a/.github/workflows/netlify.yaml +++ b/.github/workflows/netlify.yaml @@ -16,6 +16,11 @@ jobs: - uses: r-lib/actions/setup-pandoc@v2 + - name: Set up Quarto + uses: quarto-dev/quarto-actions/setup@v2 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: r-lib/actions/setup-r@v2 with: use-public-rspm: true diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml index b37ac1ff3..1b952d124 100644 --- a/.github/workflows/pkgdown.yaml +++ b/.github/workflows/pkgdown.yaml @@ -24,9 +24,9 @@ jobs: steps: - uses: actions/checkout@v4 - - uses: r-lib/actions/setup-pandoc@v2 + - uses: quarto-dev/quarto-actions/setup@v2 - - uses: r-lib/actions/setup-tinytex@v2 + - uses: r-lib/actions/setup-pandoc@v2 - uses: r-lib/actions/setup-r@v2 with: diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 2aec33d37..2565dbe3e 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -21,6 +21,13 @@ jobs: - uses: r-lib/actions/setup-pandoc@v2 + - uses: quarto-dev/quarto-actions/setup@v2 + with: + version: pre-release + tinytex: true + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - uses: r-lib/actions/setup-r@v2 with: use-public-rspm: true diff --git a/DESCRIPTION b/DESCRIPTION index c1dc651f4..ba804ff60 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -56,6 +56,7 @@ Suggests: magick, methods, pkgload (>= 1.0.2), + quarto, rsconnect, rstudioapi, rticles, @@ -63,12 +64,13 @@ Suggests: testthat (>= 3.1.3), tools VignetteBuilder: - knitr + knitr, + quarto Config/Needs/website: usethis, servr Config/potools/style: explicit Config/testthat/edition: 3 Config/testthat/parallel: true -Config/testthat/start-first: build-article, build-reference +Config/testthat/start-first: build-article, build-quarto-article, build-reference Encoding: UTF-8 Roxygen: list(markdown = TRUE) RoxygenNote: 7.3.1 diff --git a/NEWS.md b/NEWS.md index 60ae56ad9..117c06cef 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,5 +1,6 @@ # pkgdown (development version) +* `build_articles()` and `build_article()` now support articles/vignettes written with quarto. Combining the disparate quarto and pkgdown templating systems is a delicate art, so while I've done my best to make it work, there may be some rough edges. So please file an issue you encounter quarto features that don't work quite right. Learn more in `vignette("quarto")`(#2210). * `preview_page()` has been deprecated (#2650). * `build_article()` now translates the "Abstract" title if it's used. * `build_*()` (apart from `build_site()`) functions no longer default to previewing in interactive sessions since they now all emit specific links to newly generated files. diff --git a/R/build-article.R b/R/build-article.R index 84ec3dafd..c5dc5713a 100644 --- a/R/build-article.R +++ b/R/build-article.R @@ -28,6 +28,7 @@ build_article <- function(name, input <- pkg$vignettes$file_in[vig] output_file <- pkg$vignettes$file_out[vig] depth <- pkg$vignettes$depth[vig] + type <- pkg$vignettes$type[vig] input_path <- path_abs(input, pkg$src_path) output_path <- path_abs(output_file, pkg$dst_path) @@ -36,10 +37,39 @@ build_article <- function(name, return(invisible()) } - cli::cli_inform("Reading {src_path(input)}") + if (type == "rmd") { + build_rmarkdown_article( + pkg = pkg, + input_file = input, + input_path = input_path, + output_file = output_file, + output_path = output_path, + depth = depth, + seed = seed, + new_process = new_process, + pandoc_args = pandoc_args, + quiet = quiet + ) + } else { + build_quarto_articles(pkg = pkg, article = name, quiet = quiet) + } +} + +build_rmarkdown_article <- function(pkg, + input_file, + input_path, + output_file, + output_path, + depth, + seed = NULL, + new_process = TRUE, + pandoc_args = character(), + quiet = TRUE, + call = caller_env() ) { + cli::cli_inform("Reading {src_path(input_file)}") digest <- file_digest(output_path) - data <- data_article(pkg, input) + data <- data_article(pkg, input_file, call = call) if (data$as_is) { if (identical(data$ext, "html")) { setup <- rmarkdown_setup_custom(pkg, input_path, depth = depth, data = data) @@ -68,7 +98,7 @@ build_article <- function(name, if (new_process) { path <- withCallingHandlers( callr::r_safe(rmarkdown_render_with_seed, args = args, show = !quiet), - error = function(cnd) wrap_rmarkdown_error(cnd, input) + error = function(cnd) wrap_rmarkdown_error(cnd, input_file, call) ) } else { path <- inject(rmarkdown_render_with_seed(!!!args)) @@ -96,6 +126,7 @@ build_article <- function(name, } + data_article <- function(pkg, input, call = caller_env()) { yaml <- rmarkdown::yaml_front_matter(path_abs(input, pkg$src_path)) diff --git a/R/build-articles.R b/R/build-articles.R index 6f095bb63..77ce72b41 100644 --- a/R/build-articles.R +++ b/R/build-articles.R @@ -212,13 +212,14 @@ build_articles <- function(pkg = ".", build_articles_index(pkg) unwrap_purrr_error(purrr::walk( - pkg$vignettes$name, + pkg$vignettes$name[pkg$vignettes$type == "rmd"], build_article, pkg = pkg, lazy = lazy, seed = seed, quiet = quiet )) + build_quarto_articles(pkg, quiet = quiet) preview_site(pkg, "articles", preview = preview) } diff --git a/R/build-news.R b/R/build-news.R index da554025a..97b1ca46c 100644 --- a/R/build-news.R +++ b/R/build-news.R @@ -332,7 +332,7 @@ tweak_news_anchor <- function(html, version) { } tweak_section_levels <- function(html) { - sections <- xml2::xml_find_all(html, ".//div[contains(@class, 'section level')]") + sections <- xml2::xml_find_all(html, ".//div[contains(@class, 'section level')]|//main/section") # Update headings xml2::xml_set_name(xml2::xml_find_all(sections, ".//h5"), "h6") diff --git a/R/build-quarto-articles.R b/R/build-quarto-articles.R new file mode 100644 index 000000000..b50aa4171 --- /dev/null +++ b/R/build-quarto-articles.R @@ -0,0 +1,150 @@ +build_quarto_articles <- function(pkg = ".", article = NULL, quiet = TRUE) { + check_required("quarto") + pkg <- as_pkgdown(pkg) + + qmds <- pkg$vignettes[pkg$vignettes$type == "qmd", ] + if (!is.null(article)) { + qmds <- qmds[qmds$name == article, ] + } + if (nrow(qmds) == 0) { + return() + } + + # Let user know what's happening + old_digest <- purrr::map_chr(path(pkg$dst_path, qmds$file_out), file_digest) + for (file in qmds$file_in) { + cli::cli_inform("Reading {src_path(file)}") + } + cli::cli_inform("Running {.code quarto render}") + + # If needed, temporarily make a quarto project so we can build entire dir + if (is.null(article)) { + project_path <- path(pkg$src_path, "vignettes", "_quarto.yaml") + if (!file_exists(project_path)) { + yaml::write_yaml(list(project = list(render = list("*.qmd"))), project_path) + withr::defer(file_delete(project_path)) + } + } + + if (is.null(article)) { + src_path <- path(pkg$src_path, "vignettes") + } else { + src_path <- path(pkg$src_path, qmds$file_in) + } + output_dir <- quarto_render(pkg, src_path, quiet = quiet) + + # Read generated data from quarto template and render into pkgdown template + unwrap_purrr_error(purrr::walk2(qmds$file_in, qmds$file_out, function(input_file, output_file) { + built_path <- path(output_dir, path_rel(output_file, "articles")) + if (!file_exists(built_path)) { + cli::cli_abort("No built file found for {.file {input_file}}") + } + if (path_ext(output_file) == "html") { + data <- data_quarto_article(pkg, built_path, input_file) + render_page(pkg, "quarto", data, output_file, quiet = TRUE) + + update_html(path(pkg$dst_path, output_file), tweak_quarto_html) + } else { + file_copy(built_path, path(pkg$dst_path, output_file), overwrite = TRUE) + } + })) + + # Report on which files have changed + new_digest <- purrr::map_chr(path(pkg$dst_path, qmds$file_out), file_digest) + changed <- new_digest != old_digest + for (file in qmds$file_out[changed]) { + writing_file(path(pkg$dst_path, file), file) + } + + # Copy resources + resources <- setdiff( + dir_ls(output_dir, recurse = TRUE, type = "file"), + path(output_dir, path_rel(qmds$file_out, "articles")) + ) + file_copy_to( + src_paths = resources, + dst_paths = path(pkg$dst_path, "articles", path_rel(resources, output_dir)), + src_root = output_dir, + dst_root = pkg$dst_path, + src_label = NULL + ) + + invisible() +} + +quarto_render <- function(pkg, path, quiet = TRUE, frame = caller_env()) { + # Override default quarto format + metadata_path <- withr::local_tempfile( + fileext = ".yml", + pattern = "pkgdown-quarto-metadata-", + ) + write_yaml(quarto_format(pkg), metadata_path) + + output_dir <- withr::local_tempdir("pkgdown-quarto-", .local_envir = frame) + quarto::quarto_render( + path, + metadata_file = metadata_path, + execute_dir = output_dir, + quarto_args = c("--output-dir", output_dir), + quiet = quiet, + as_job = FALSE + ) + + output_dir +} + +quarto_format <- function(pkg) { + list( + lang = pkg$lang, + format = list( + html = list( + template = system_file("quarto", "template.html", package = "pkgdown"), + minimal = TRUE, + theme = "none", + `html-math-method` = config_math_rendering(pkg), + `embed-resources` = FALSE, + `citations-hover` = TRUE, + `link-citations` = TRUE, + `section-divs` = TRUE, + toc = FALSE # pkgdown generates with js + ) + ) + ) +} + +data_quarto_article <- function(pkg, path, input_path) { + html <- xml2::read_html(path, encoding = "UTF-8") + meta_div <- xml2::xml_find_first(html, "//body/div[@class='meta']") + + # Manually drop any jquery deps + head <- xpath_xml(html, "//head/script|//head/link") + head <- head[!grepl("jquery", xml2::xml_attr(head, "src"))] + + list( + pagetitle = escape_html(xpath_text(html, "//head/title")), + toc = TRUE, + source = repo_source(pkg, input_path), + includes = list( + head = xml2str(head), + before = xpath_contents(html, "//body/div[@class='includes-before']"), + after = xpath_contents(html, "//body/div[@class='includes-after']"), + style = xpath_text(html, "//head/style") + ), + meta = list( + title = xpath_contents(meta_div, "./h1"), + subtitle = xpath_contents(meta_div, "./p[@class='subtitle']"), + author = xpath_contents(meta_div, "./p[@class='author']"), + date = xpath_contents(meta_div, "./p[@class='date']"), + abstract = xpath_contents(meta_div, "./div[@class='abstract']") + ), + body = xpath_contents(html, "//main") + ) +} + +tweak_quarto_html <- function(html) { + # 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) + } +} diff --git a/R/build-search-docs.R b/R/build-search-docs.R index 788d00525..61a197966 100644 --- a/R/build-search-docs.R +++ b/R/build-search-docs.R @@ -144,7 +144,7 @@ file_search_index <- function(path, pkg) { # Get contents minus logo node <- xml2::xml_find_all(html, ".//main") xml2::xml_remove(xml2::xml_find_first(node, ".//img[contains(@class, 'pkg-logo')]")) - sections <- xml2::xml_find_all(node, ".//div[contains(@class, 'section')]") + sections <- xml2::xml_find_all(node, ".//div[contains(@class, 'section')]|.//section") purrr::pmap( list( diff --git a/R/package.R b/R/package.R index ce80d7b88..7b0068722 100644 --- a/R/package.R +++ b/R/package.R @@ -319,11 +319,12 @@ package_vignettes <- function(path = ".") { vig_path <- vig_path[!grepl("^_", path_file(vig_path))] vig_path <- vig_path[!grepl("^tutorials", path_dir(vig_path))] - yaml <- purrr::map(path(base, vig_path), rmarkdown::yaml_front_matter) - title <- purrr::map_chr(yaml, list("title", 1), .default = "UNKNOWN TITLE") - desc <- purrr::map_chr(yaml, list("description", 1), .default = NA_character_) - ext <- purrr::map_chr(yaml, c("pkgdown", "extension"), .default = "html") - title[ext == "pdf"] <- paste0(title[ext == "pdf"], " (PDF)") + type <- tolower(path_ext(vig_path)) + + meta <- purrr::map(path(base, vig_path), article_metadata) + title <- purrr::map_chr(meta, "title") + desc <- purrr::map_chr(meta, "desc") + ext <- purrr::map_chr(meta, "ext") # Vignettes will be written to /articles/ with path relative to vignettes/ # *except* for vignettes in vignettes/articles, which are moved up a level @@ -336,6 +337,7 @@ package_vignettes <- function(path = ".") { out <- tibble::tibble( name = as.character(path_ext_remove(vig_path)), + type = type, file_in = as.character(file_in), file_out = as.character(file_out), title = title, @@ -345,6 +347,32 @@ package_vignettes <- function(path = ".") { out[order(path_file(out$file_out)), ] } +article_metadata <- function(path) { + if (path_ext(path) == "qmd") { + inspect <- quarto::quarto_inspect(path) + meta <- inspect$formats[[1]]$metadata + + out <- list( + title = meta$title %||% "UNKNOWN TITLE", + desc = meta$description %||% NA_character_, + ext = path_ext(inspect$formats[[1]]$pandoc$`output-file`) %||% "html" + ) + } else { + yaml <- rmarkdown::yaml_front_matter(path) + out <- list( + title = yaml$title[[1]] %||% "UNKNOWN TITLE", + desc = yaml$description[[1]] %||% NA_character_, + ext = yaml$pkgdown$extension %||% "html" + ) + } + + if (out$ext == "pdf") { + out$title <- paste0(out$title, " (PDF)") + } + + out +} + find_template_config <- function(package, bs_version = NULL, error_call = caller_env()) { diff --git a/R/render.R b/R/render.R index 072cdd31d..51fad944f 100644 --- a/R/render.R +++ b/R/render.R @@ -23,7 +23,7 @@ render_page <- function(pkg = ".", name, data, path, depth = NULL, quiet = FALSE pkg <- as_pkgdown(pkg) if (is.null(depth)) { - depth <- length(strsplit(path, "/")[[1]]) - 1L + depth <- dir_depth(path) } html <- render_page_html(pkg, name = name, data = data, depth = depth) @@ -64,7 +64,7 @@ render_page_html <- function(pkg, name, data = list(), depth = 0L) { rendered <- render_template(template, components) # Strip trailing whitespace - rendered <- gsub("\\s+\n", "\n", rendered, perl = TRUE) + rendered <- gsub(" +\n", "\n", rendered, perl = TRUE) xml2::read_html(rendered, encoding = "UTF-8") } @@ -234,9 +234,7 @@ write_if_different <- function(pkg, contents, path, quiet = FALSE, check = TRUE) full_path <- path_abs(path, start = pkg$dst_path) if (check && !made_by_pkgdown(full_path)) { - if (!quiet) { - cli::cli_inform("Skipping {.file {path}}: not generated by pkgdown") - } + cli::cli_inform("Skipping {.file {path}}: not generated by pkgdown") return(FALSE) } diff --git a/R/tweak-tags.R b/R/tweak-tags.R index d6a962b39..1e6f5a05b 100644 --- a/R/tweak-tags.R +++ b/R/tweak-tags.R @@ -2,15 +2,19 @@ tweak_anchors <- function(html) { headings <- xml2::xml_find_all(html, ".//h1|.//h2|.//h3|.//h4|.//h5|.//h6") # Find all headings that are contained in a div with an id and # have class 'section' + is_ok <- xml2::xml_find_lgl(headings, - "boolean(parent::div[contains(@class, 'section') and @id])" + "boolean( + (parent::div[contains(@class, 'section') and @id]) or + (parent::section[@id]) + )" ) headings <- headings[is_ok] if (length(headings) == 0) { return(invisible()) } - id <- xml2::xml_find_chr(headings, "string(parent::div/@id)") + id <- xml2::xml_find_chr(headings, "string(parent::div/@id|parent::section/@id)") # Update ids: dot in the anchor breaks scrollspy and rd translation # doesn't have enough information to generate unique ids @@ -156,7 +160,7 @@ tweak_tables <- function(html) { # from https://github.com/rstudio/bookdown/blob/ed31991df3bb826b453f9f50fb43c66508822a2d/R/bs4_book.R#L307 tweak_footnotes <- function(html) { - container <- xml2::xml_find_all(html, ".//div[contains(@class, 'footnotes')]") + container <- xml2::xml_find_all(html, ".//div[contains(@class, 'footnotes')]|.//section[contains(@class, 'footnotes')]") if (length(container) != 1) { return() } diff --git a/R/utils-fs.R b/R/utils-fs.R index 5c1b98b02..984415a07 100644 --- a/R/utils-fs.R +++ b/R/utils-fs.R @@ -33,7 +33,7 @@ file_copy_to <- function(src_paths, dst_paths, src_root, dst_root, - src_label = "", + src_label = NULL, dst_label = "") { # Ensure all the "to" directories exist dst_dirs <- unique(path_dir(dst_paths)) @@ -41,12 +41,17 @@ file_copy_to <- function(src_paths, eq <- purrr::map2_lgl(src_paths, dst_paths, file_equal) if (any(!eq)) { - src <- paste0(src_label, path_rel(src_paths[!eq], src_root)) dst <- paste0(dst_label, path_rel(dst_paths[!eq], dst_root)) - - purrr::walk2(src, dst, function(src, dst) { - cli::cli_inform("Copying {src_path(src)} to {dst_path(dst)}") - }) + if (is.null(src_label)) { + purrr::walk(dst, function(dst) { + cli::cli_inform("Copying {dst_path(dst)}") + }) + } else { + src <- paste0(src_label, path_rel(src_paths[!eq], src_root)) + purrr::walk2(src, dst, function(src, dst) { + cli::cli_inform("Copying {src_path(src)} to {dst_path(dst)}") + }) + } } file_copy(src_paths[!eq], dst_paths[!eq], overwrite = TRUE) diff --git a/R/utils.R b/R/utils.R index bb33a495a..0a9a05f13 100644 --- a/R/utils.R +++ b/R/utils.R @@ -3,6 +3,7 @@ up_path <- function(depth) { } dir_depth <- function(x) { + # length(strsplit(path, "/")[[1]]) - 1L purrr::map_int(strsplit(x, ""), function(x) sum(x == "/")) } @@ -154,8 +155,9 @@ ruler <- function(width = getOption("width")) { get_section_level <- function(section) { class <- xml2::xml_attr(section, "class") - has_level <- grepl("level(\\d+)", class) - ifelse(has_level, as.numeric(gsub(".*section level(\\d+).*", '\\1', class)), 0) +level <- as.numeric(re_match(class, "level(\\d+)")[[1]]) + level[is.na(level)] <- 0 + level } section_id <- function(section) { @@ -178,15 +180,36 @@ print.print_yaml <- function(x, ...) { } write_yaml <- function(x, path) { - write_lines(yaml::as.yaml(x), path = path) + yaml::write_yaml( + x, + path, + handlers = list(logical = yaml::verbatim_logical) + ) } # Helpers for testing ----------------------------------------------------- -xpath_xml <- function(x, xpath) { - x <- xml2::xml_find_all(x, xpath) +xpath_xml <- function(x, xpath = NULL) { + if (!is.null(xpath)) { + x <- xml2::xml_find_all(x, xpath) + } structure(x, class = c("pkgdown_xml", class(x))) } +xpath_contents <- function(x, xpath) { + x <- xml2::xml_find_all(x, xpath) + + contents <- xml2::xml_contents(x) + if (length(contents) == 0) { + NULL + } else { + xml2str(contents) + } +} +xml2str <- function(x) { + strings <- as.character(x, options = c("format", "no_declaration")) + paste0(strings, collapse = "") +} + xpath_attr <- function(x, xpath, attr) { gsub("\r", "", xml2::xml_attr(xml2::xml_find_all(x, xpath), attr), fixed = TRUE) } diff --git a/inst/BS5/assets/pkgdown.scss b/inst/BS5/assets/pkgdown.scss index aa51029ef..86d40cc6b 100644 --- a/inst/BS5/assets/pkgdown.scss +++ b/inst/BS5/assets/pkgdown.scss @@ -572,3 +572,147 @@ mark { } } } + +/* Quarto specific =========================================================== */ +// Selectively copied from https://github.com/quarto-dev/quarto-cli/blob/main/src/resources/formats/html/_quarto-rules.scss#L110 + +span.smallcaps {font-variant: small-caps;} + +// task-list -------------------------------------------------------------- + +ul.task-list{list-style: none;} +ul.task-list li input[type="checkbox"] { + width: 0.8em; + margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ + vertical-align: middle; +} + +// Figure and layout -------------------------------------------------------- + +figure.figure { + display: block; +} + +.quarto-layout-panel { + margin-bottom: 1em; +} + +.quarto-layout-panel > figure { + width: 100%; +} +.quarto-layout-panel > figure > figcaption, +.quarto-layout-panel > .panel-caption { + margin-top: 10pt; +} + +.quarto-layout-panel > .table-caption { + margin-top: 0px; +} + +.table-caption p { + margin-bottom: 0.5em; +} + +.quarto-layout-row { + display: flex; + flex-direction: row; + align-items: flex-start; +} +.quarto-layout-valign-top { + align-items: flex-start; +} +.quarto-layout-valign-bottom { + align-items: flex-end; +} +.quarto-layout-valign-center { + align-items: center; +} +.quarto-layout-cell { + position: relative; + margin-right: 20px; +} +.quarto-layout-cell:last-child { + margin-right: 0; +} +.quarto-layout-cell figure, +.quarto-layout-cell > p { + margin: 0.2em; +} +.quarto-layout-cell img { + max-width: 100%; +} +.quarto-layout-cell .html-widget { + width: 100% !important; +} +.quarto-layout-cell div figure p { + margin: 0; +} +.quarto-layout-cell figure { + display: block; + margin-inline-start: 0; + margin-inline-end: 0; +} +.quarto-layout-cell table { + display: inline-table; +} +.quarto-layout-cell-subref figcaption, +figure .quarto-layout-row figure figcaption { + text-align: center; + font-style: italic; +} +.quarto-figure { + position: relative; + margin-bottom: 1em; +} + +.quarto-figure > figure { + width: 100%; + margin-bottom: 0; +} +.quarto-figure-left > figure > p, +.quarto-figure-left > figure > div /* for mermaid and dot diagrams */ { + text-align: left; +} +.quarto-figure-center > figure > p, +.quarto-figure-center > figure > div /* for mermaid and dot diagrams */ { + text-align: center; +} +.quarto-figure-right > figure > p, +.quarto-figure-right > figure > div /* for mermaid and dot diagrams */ { + text-align: right; +} + +.quarto-figure > figure > div.cell-annotation, +.quarto-figure > figure > div code { + text-align: left; /* override align center for code blocks */ +} + +figure > p:empty { + display: none; +} +figure > p:first-child { + margin-top: 0; + margin-bottom: 0; +} + +figure > figcaption.quarto-float-caption-bottom { + margin-bottom: 0.5em; +} +figure > figcaption.quarto-float-caption-top { + margin-top: 0.5em; +} + +// mermaid --------------------------------------------------------- + +:root { + --mermaid-bg-color: transparent; + --mermaid-edge-color: var(--bs-secondary); + --mermaid-fg-color: var(--bs-body-color); + --mermaid-fg-color--lighter: RGBA(var(--bs-body-color-rgb), 0.9); + --mermaid-fg-color--lightest: RGBA(var(--bs-body-color-rgb), 0.8); + --mermaid-font-family: var(--bs-body-font-family); + --mermaid-label-bg-color: var(--bs-primary); + --mermaid-label-fg-color: var(--bs-body-color); + --mermaid-node-bg-color: RGBA(var(--bs-primary-rgb), 0.1); + --mermaid-node-fg-color: var(--bs-primary); +} diff --git a/inst/BS5/templates/content-quarto.html b/inst/BS5/templates/content-quarto.html new file mode 100644 index 000000000..fb6134547 --- /dev/null +++ b/inst/BS5/templates/content-quarto.html @@ -0,0 +1,36 @@ +
+
+ + + {{#abstract}}
+

{{#translate}}{{abstract}}{{/translate}}

+ {{{.}}} +
{{/abstract}} + + {{#includes}}{{{before}}}{{/includes}} + + {{{body}}} + + {{#includes}}{{{after}}}{{/includes}} + +
+ + {{#toc}} + + {{/toc}} +
diff --git a/inst/BS5/templates/head.html b/inst/BS5/templates/head.html index b0c7b6bbe..e1b49079d 100644 --- a/inst/BS5/templates/head.html +++ b/inst/BS5/templates/head.html @@ -17,6 +17,7 @@ {{#uses_katex}}{{/uses_katex}} {{{headdeps}}} +{{#includes}}{{{head}}}{{/includes}} diff --git a/inst/quarto/template.html b/inst/quarto/template.html new file mode 100644 index 000000000..4d2d021f6 --- /dev/null +++ b/inst/quarto/template.html @@ -0,0 +1,61 @@ + + + + + $pagetitle$ + + +$for(css)$ + +$endfor$ +$for(header-includes)$ + $header-includes$ +$endfor$ + + + +
+$for(include-before)$ +$include-before$ +$endfor$ +
+ +
+$if(title)$ +

$title$

+$endif$ + +$if(subtitle)$ +

$subtitle$

+$endif$ + +$for(author)$ +

$author$

+$endfor$ + +$if(date)$ +

$date$

+$endif$ + +$if(abstract)$ +
+ $abstract$ +
+$endif$ + +
+ +
+$body$ +
+ +
+$for(include-after)$ +$include-after$ +$endfor$ +
+ + + diff --git a/pkgdown/_pkgdown.yml b/pkgdown/_pkgdown.yml index b1dd5e22d..ce3a05f76 100644 --- a/pkgdown/_pkgdown.yml +++ b/pkgdown/_pkgdown.yml @@ -35,6 +35,7 @@ articles: navbar: ~ contents: - customise + - quarto - translations - accessibility - linking diff --git a/tests/testthat/_snaps/build-quarto-articles.md b/tests/testthat/_snaps/build-quarto-articles.md new file mode 100644 index 000000000..bf7b98aee --- /dev/null +++ b/tests/testthat/_snaps/build-quarto-articles.md @@ -0,0 +1,19 @@ +# we find out if quarto styles change + + Code + cat(data$includes$style) + Output + + code{white-space: pre-wrap;} + span.smallcaps{font-variant: small-caps;} + div.columns{display: flex; gap: min(4vw, 1.5em);} + div.column{flex: auto; overflow-x: auto;} + div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;} + ul.task-list{list-style: none;} + ul.task-list li input[type="checkbox"] { + width: 0.8em; + margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ + vertical-align: middle; + } + + diff --git a/tests/testthat/helper.R b/tests/testthat/helper.R index c3f89ac5a..2362b0ae1 100644 --- a/tests/testthat/helper.R +++ b/tests/testthat/helper.R @@ -1,5 +1,9 @@ skip_if_no_pandoc <- function(version = "1.12.3") { - testthat::skip_if_not(rmarkdown::pandoc_available(version)) + skip_if_not(rmarkdown::pandoc_available(version), "pandoc not available") +} +skip_if_no_quarto <- function() { + skip_on_os("windows") # quarto set up currently broken? + skip_if(is.null(quarto::quarto_path()), "quarto not available") } # Simulate a package -------------------------------------------------------- @@ -10,7 +14,9 @@ local_pkgdown_site <- function(path = NULL, env = caller_env()) { check_string(path, allow_null = TRUE) - dst_path <- withr::local_tempdir(.local_envir = env) + dst_path <- path_real( + withr::local_tempdir(.local_envir = env, pattern = "pkgdown-dst") + ) # Simulate init_site() so we only have to run it if we care about file_create(path(dst_path, "pkgdown.yml")) dir_create(path(dst_path, "deps")) @@ -19,7 +25,9 @@ local_pkgdown_site <- function(path = NULL, meta <- modify_list(meta, list(destination = dst_path)) if (is.null(path)) { - path <- withr::local_tempdir(.local_envir = env) + path <- path_real( + withr::local_tempdir(.local_envir = env, pattern = "pkgdown-src") + ) description <- desc::desc("!new") description$set("Package", "testpackage") @@ -79,6 +87,7 @@ pkg_vignette <- function(..., title = "title") { c("---", yaml, "---", contents) } + r_code_block <- function(...) c("```{r}", ..., "```") # Simulate a template package ------------------------------------------------ diff --git a/tests/testthat/test-build-quarto-articles.R b/tests/testthat/test-build-quarto-articles.R new file mode 100644 index 000000000..2caa1e781 --- /dev/null +++ b/tests/testthat/test-build-quarto-articles.R @@ -0,0 +1,105 @@ +test_that("can build all quarto article", { + skip_if_no_quarto() + + pkg <- local_pkgdown_site() + pkg <- pkg_add_file(pkg, "vignettes/vig1.qmd") + pkg <- pkg_add_file(pkg, "vignettes/vig2.qmd") + + suppressMessages(build_articles(pkg)) + + expect_true(file_exists(path(pkg$dst_path, "articles/vig1.html"))) + expect_true(file_exists(path(pkg$dst_path, "articles/vig2.html"))) +}) + +test_that("can build a single quarto article", { + skip_if_no_quarto() + + pkg <- local_pkgdown_site() + pkg <- pkg_add_file(pkg, "vignettes/vig1.qmd") + pkg <- pkg_add_file(pkg, "vignettes/vig2.qmd") + + suppressMessages(build_article("vig1", pkg)) + + expect_true(file_exists(path(pkg$dst_path, "articles/vig1.html"))) + expect_false(file_exists(path(pkg$dst_path, "articles/vig2.html"))) +}) + +test_that("doesn't do anything if no quarto articles", { + pkg <- local_pkgdown_site() + expect_no_error(suppressMessages(build_quarto_articles(pkg))) +}) + +test_that("can render a pdf qmd", { + skip_if_no_quarto() + + pkg <- local_pkgdown_site() + pkg <- pkg_add_file(pkg, "vignettes/vig1.qmd", pkg_vignette( + format = list(pdf = list(toc = TRUE)) + )) + + expect_equal(pkg$vignettes$type, "qmd") + expect_equal(pkg$vignettes$file_out, "articles/vig1.pdf") + + suppressMessages(build_article("vig1", pkg)) + expect_true(file_exists(path(pkg$dst_path, "articles/vig1.pdf"))) +}) + +test_that("auto-adjusts heading levels", { + skip_if_no_quarto() + + pkg <- local_pkgdown_site() + pkg <- pkg_add_file(pkg, "vignettes/vig1.qmd", pkg_vignette( + "# Heading 1", + "# Heading 2" + )) + + suppressMessages(build_article("vig1", pkg)) + + html <- xml2::read_html(path(pkg$dst_path, "articles/vig1.html")) + expect_equal(xpath_text(html, "//h1"), "title") + expect_equal(xpath_text(html, "//h2"), c("Heading 1\n", "Heading 2\n")) +}) + +test_that("we find out if quarto styles change", { + skip_if_no_quarto() + + pkg <- local_pkgdown_site() + pkg <- pkg_add_file(pkg, "vignettes/vig1.qmd") + + output_dir <- quarto_render(pkg, path(pkg$src_path, "vignettes", "vig1.qmd")) + + data <- data_quarto_article(pkg, path(output_dir, "vig1.html"), "vig1.qmd") + expect_snapshot(cat(data$includes$style)) +}) + +test_that("quarto articles are included in the index", { + skip_if_no_quarto() + + pkg <- local_pkgdown_site() + pkg <- pkg_add_file(pkg, "vignettes/vig1.qmd", pkg_vignette( + "## Heading 1", + "Some text" + )) + + suppressMessages(build_article("vig1", pkg)) + index <- build_search_index(pkg) + + expect_equal(index[[1]]$path, "/articles/vig1.html") + expect_equal(index[[1]]$what, "Heading 1") + expect_equal(index[[1]]$text, "text") # some is a stop word +}) + +test_that("quarto headings get anchors", { + skip_if_no_quarto() + + pkg <- local_pkgdown_site() + pkg <- pkg_add_file(pkg, "vignettes/vig1.qmd", pkg_vignette( + "## Heading 1", + "### Heading 2" + )) + + suppressMessages(build_article("vig1", pkg)) + html <- xml2::read_html(path(pkg$dst_path, "articles/vig1.html")) + headings <- xpath_xml(html, "//h2|//h3") + expect_equal(xpath_attr(headings, "./a", "href"), c("#heading-1", "#heading-2")) +}) diff --git a/vignettes/pitbull.jpg b/vignettes/pitbull.jpg new file mode 100644 index 0000000000000000000000000000000000000000..13eeeb9829093de6f171e9662388532695f3262d GIT binary patch literal 53524 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 literal 0 HcmV?d00001 diff --git a/vignettes/quarto.qmd b/vignettes/quarto.qmd new file mode 100644 index 000000000..b24eec23e --- /dev/null +++ b/vignettes/quarto.qmd @@ -0,0 +1,105 @@ +--- +title: quarto vignettes +description: > + Learn how quarto vignettes work with pkgdown, including currently supported + features and known limitations. +vignette: > + %\VignetteIndexEntry{quarto vignettes} + %\VignetteEngine{quarto::html} + %\VignetteEncoding{UTF-8} +knitr: + opts_chunk: + collapse: true + comment: '#>' +--- + +pkgdown effectively uses quarto only to generate HTML and then supplies its own CSS and JS. This means that when quarto introduces new features, pkgdown may lag behind in their support. If you're trying out something that doesn't work (and isn't mentioned explicitly below), please [file an issue](https://github.com/r-lib/pkgdown/issues) so we can look into it. + +## Operation + +pkgdown turns your articles directory into a quarto project by temporarily adding a `_quarto.yml` to your articles. You can also add your own if you want to control options for all quarto articles. If you do so, and you have a mix of `.qmd` and `.Rmd` files, you'll need to include the following yaml so that RMarkdown can continue to handle the .Rmd files: + +```yaml +project: + render: ['*.qmd'] +``` + +### GitHub actions + +Currently, you'll need to manually install Quarto in your GitHub actions. ([Hopefully this will change in the future](https://github.com/r-lib/actions/issues/866)). Add the following lines to install quarto: + +```yaml + - name: Set up Quarto + uses: quarto-dev/quarto-actions/setup@v2 + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} +``` + +## Limitations + +* Callouts are not currently supported (). + +* pkgdown assumes that you're using [quarto vignette style](https://quarto-dev.github.io/quarto-r/articles/hello.html), or more generally an html format with [`minimal: true`](https://quarto.org/docs/output-formats/html-basics.html#minimal-html). Specifically, only HTML vignettes are currently supported. + +* You can't customise mermaid styles with quarto mermaid themes. If you want to change the colours, you'll need to provide your own custom CSS as shown in [the quarto docs](https://quarto.org/docs/authoring/diagrams.html#customizing-mermaid). + +* pkgdown will pass the `lang` setting on to quarto, but the set of available language is not perfectly matched. Learn more in , including how to supply your own translations. + +## Supported features + +The following sections demonstrate a bunch of useful quarto features so that we can make sure that they work. + +### Inline formatting + +* [Small caps]{.smallcaps} + +* Here is a footnote reference[^1] + +[^1]: And here is the footnote. + +### Code + +```{r} +#| fig.alt: A plot of the numbers 1, 2, and 3 +1 + 1 +2 + 2 + +plot(1:3) +``` + +### Figures + +::: {#fig-puppies layout-ncol=2} +![A sketch of a pitbull puppy](pitbull.jpg){#fig-pitbull} + +![A sketch of a sharpei puppy](shar-pei.jpg){#fig-shar-pei} + +Cute puppies +::: + +### Equations +$$ +\frac{\partial \mathrm C}{ \partial \mathrm t } + \frac{1}{2}\sigma^{2} \mathrm S^{2} +\frac{\partial^{2} \mathrm C}{\partial \mathrm C^2} + + \mathrm r \mathrm S \frac{\partial \mathrm C}{\partial \mathrm S}\ = + \mathrm r \mathrm C +$$ {#eq-black-scholes} + + +### Cross references + +See @fig-puppies for two cute puppies. + +Black-Scholes (@eq-black-scholes) is a mathematical model that seeks to explain the behavior of financial derivatives, most commonly options. + +## To do + +* [ ] Code annotations +* [ ] Tabsets +* [x] Citations +* [x] Task/to do lists +* [x] Figures +* [x] Equations +* [x] Cross-references +* [x] Footnotes +* [x] Callouts diff --git a/vignettes/shar-pei.jpg b/vignettes/shar-pei.jpg new file mode 100644 index 0000000000000000000000000000000000000000..98908610d00e4edeefbfc27583f703e8cff2511c GIT binary patch literal 52857 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 R&Hrs~_Fwa}|2+Sj`(Grm$DIHG literal 0 HcmV?d00001 diff --git a/vignettes/test/quarto-features.qmd b/vignettes/test/quarto-features.qmd new file mode 100644 index 000000000..7969c81c8 --- /dev/null +++ b/vignettes/test/quarto-features.qmd @@ -0,0 +1,54 @@ +--- +title: quarto features +knitr: + opts_chunk: + collapse: true + comment: '#>' +bibliography: jss.bib +--- + +## Citations + +* Citation: @JSSv059i10 + +## Code annotations + +```r +library(tidyverse) +library(palmerpenguins) +penguins |> # <1> + mutate( # <2> + bill_ratio = bill_depth_mm / bill_length_mm, # <2> + bill_area = bill_depth_mm * bill_length_mm # <2> + ) # <2> +``` +1. Take `penguins`, and then, +2. add new columns for the bill ratio and bill area. + +## Diagrams + +```{mermaid} +flowchart LR + A[Hard edge] --> B(Round edge) + B --> C{Decision} + C --> D[Result one] + C --> E[Result two] +``` + +## HTML widgets + +```{r, echo=FALSE} +dir <- tempdir() +path1 <- file.path(dir, "a.txt") +writeLines(letters, path1) +path2 <- file.path(dir, "b.txt") +writeLines(letters[-(10:11)], path2) + +diffviewer::visual_diff(path1, path2) +``` + +## Keyboard + +* Keyboard shortcut: {{< kbd Shift-Ctrl-P >}} + +## References From 3d24d9cef8ebe9d10bc1460cb837a934ab1ca7f4 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Fri, 14 Jun 2024 07:44:43 -0500 Subject: [PATCH 18/31] Need pre-release quarto --- vignettes/quarto.qmd | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/vignettes/quarto.qmd b/vignettes/quarto.qmd index b24eec23e..5f64cf341 100644 --- a/vignettes/quarto.qmd +++ b/vignettes/quarto.qmd @@ -26,11 +26,13 @@ project: ### GitHub actions -Currently, you'll need to manually install Quarto in your GitHub actions. ([Hopefully this will change in the future](https://github.com/r-lib/actions/issues/866)). Add the following lines to install quarto: +Currently, you'll need to manually install the pre-release version of Quarto in your GitHub actions. ([Hopefully this will change in the future](https://github.com/r-lib/actions/issues/866)). Add the following lines to install quarto: ```yaml - name: Set up Quarto uses: quarto-dev/quarto-actions/setup@v2 + with: + version: pre-release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} ``` From b60ce037847554ba708fe76df581cf83a6f6688d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kirill=20M=C3=BCller?= Date: Sat, 15 Jun 2024 22:22:19 +0200 Subject: [PATCH 19/31] Update German translation (#2660) --- po/R-de.po | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/po/R-de.po b/po/R-de.po index 55fffb701..351de423c 100644 --- a/po/R-de.po +++ b/po/R-de.po @@ -110,7 +110,7 @@ msgstr "Verhaltensregeln" #: build-home-community.R:31 msgid "Getting help" -msgstr "" +msgstr "Hilfe erhalten" #: build-home-community.R:38 msgid "Community" @@ -170,7 +170,7 @@ msgstr "CRAN-Veröffentlichung: %s" #: build-reference-index.R:22 msgid "Package index" -msgstr "" +msgstr "Paketindex" #: build-reference-index.R:158 msgid "All functions" @@ -212,19 +212,20 @@ msgstr "Verzeichnis" #: navbar.R:140 msgid "Light switch" -msgstr "" +# Appearance +msgstr "Erscheinungsbild" #: navbar.R:143 msgid "Light" -msgstr "" +msgstr "Hell" #: navbar.R:144 msgid "Dark" -msgstr "" +msgstr "Dunkel" #: navbar.R:145 msgid "Auto" -msgstr "" +msgstr "Automatisch" #: navbar.R:180 msgid "Get started" @@ -236,19 +237,19 @@ msgstr "Mehr Artikel ..." #: package.R:300 msgid "deprecated" -msgstr "" +msgstr "veraltet" #: package.R:301 msgid "superseded" -msgstr "" +msgstr "überholt" #: package.R:302 msgid "experimental" -msgstr "" +msgstr "experimentell" #: package.R:303 msgid "stable" -msgstr "" +msgstr "stabil" #: rd-data.R:23 msgid "Details" @@ -336,11 +337,11 @@ msgstr "Quelle:" msgid "Dev status" msgstr "Entwicklungsstatus" -#: usage.R:23 +#: usage.R:47 msgid "# Default %s method" -msgstr "" +msgstr "# Standard-%s-Methode" -#: usage.R:25 +#: usage.R:49 #, fuzzy #| msgid "# %s method for %s" msgid "# %s method for class '%s'" From 55754cb1646180d562b7fb0d9598699c153562f4 Mon Sep 17 00:00:00 2001 From: Lars Dalby Date: Sat, 15 Jun 2024 22:23:01 +0200 Subject: [PATCH 20/31] Update Danish translations, see #2659 (#2661) --- inst/po/ca/LC_MESSAGES/R-pkgdown.mo | Bin 3891 -> 3779 bytes inst/po/de/LC_MESSAGES/R-pkgdown.mo | Bin 3936 -> 3824 bytes inst/po/dk/LC_MESSAGES/R-pkgdown.mo | Bin 3662 -> 4054 bytes inst/po/es/LC_MESSAGES/R-pkgdown.mo | Bin 4005 -> 3893 bytes inst/po/fr/LC_MESSAGES/R-pkgdown.mo | Bin 3919 -> 3799 bytes inst/po/ko/LC_MESSAGES/R-pkgdown.mo | Bin 3765 -> 3612 bytes inst/po/pt/LC_MESSAGES/R-pkgdown.mo | Bin 3550 -> 3434 bytes inst/po/tr/LC_MESSAGES/R-pkgdown.mo | Bin 3631 -> 3519 bytes inst/po/zh_CN/LC_MESSAGES/R-pkgdown.mo | Bin 3373 -> 3267 bytes po/R-dk.po | 24 ++++++++++++------------ 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/inst/po/ca/LC_MESSAGES/R-pkgdown.mo b/inst/po/ca/LC_MESSAGES/R-pkgdown.mo index 04d6d18d849a3737e8ec66ea13ea77dbe47e192e..e5fb6fc9b77b77fb1cefeb65d139af5f3999771b 100644 GIT binary patch delta 1560 zcmYk+OGs346vy#1K>B5D z*l%3MRXn)i^>J*Weh)Rk92Vg>)C7wd!5|eG!zh+}J%L(S6VlW={do^+oc>%rW0vNk zj2q{W!!B`RlXeA5@fvF7w^2!X=sreGIE~urOVrNhQ49Kn>h}Y+kPs)ekD;DdV3_$W z!9^W5pgNpHt#}aWYeTpihu!O_i6&5)xsO`#wEGm*?*(e2*X|r@+>gj%UpZye;1?H4 zNq|wcfS4Ocb!bGjYe#kL#g*9S_tV%IFdINEWQ@jI*e!PwHU1M+|5;SKcM;ydCYa-f zcK896%Aal_y);l9)v+0w!@5ulO?v$V_EA5DYw!Vb*bFCS;uV(T8}|#Ue<(`+_0g5` zVl+VlwV(#nKy7~i2x@`HumT5=HChI>pb^vrW2k{AQRB^^zM1E!jm+XEe2=Wb{%8OW zE8@4M3Cd9&Yf&9qQK>qFYIhWyFpbL82x@`}RJ%Kv%K+-*ok6vG>wd;O>c3I#GeKUY zQWQq*s2H`f4X6gye!m{IfDYua6enfkIIhFTl{A0 zvWMIKx*HROcE#dtCy^rd5qg)(N(0eD=+)E^`lfmb6@3qNL^GjG9VGsjJm$9!uf<*c z4Xfxwtj}HjOQ9|+iEVyw2ks&C8kFh-L<^x0QQwf#t#`kf(5qC@ADxQ64eLESl&#KB U2eP9Dhx4)vkw<~-RP{quoTx|wY3?OX?NP^J;=|T5a_ke}(|lE(O^ zhl*b4wGW1|igpOq;UQ|~FOf0K3})i2^%H8KAE+H#Kuy@eO__x1=R}Q@XD!CC5?4{7 zkEyp0T2MRUK~12?I)HkA6qV>As^4XF;!S&h5^G|Nd5YSxFTAXYETSg(%bJ|Z{%fED zE=p8^da)KYP$O!kt*9+MYW1QLT|o7_fsAGDpeFplwqIZu?KhZ>37ijAlaJbwa_#>* zDsFB_4=O<~>LWad8sHLYLRV3VZdsq$=QF5@zQcU{j4aYDpeDA2${)v{j`A0x^18!R z^bs|pR@8zU@d#?Bex$D%Lk(~R)$tzc{YR)Bn?}9&7PsLC)Q&Bo@~3k?dM^jHfPB=^ zgxys1V!QPO#?tnoIs{N#bsn{%an!`F+2?od{rjj1Od&t>ii>vQJ+8&?sD8gud1BdK z@`jC*idK?`+Nw(A+ldw>Y$4i+W}=KJBsz#HqLOGORI~{GcbQr>C{4sBLb(}prR-R# z=^vi{{wR&hL|3d?uP)k+QhTFe)q@IK-;0|Gt&X{yYQjV8A&Lo3AbKSGu#VVD=o{Ei zM90^;x`}#1AISmYf6>|PvJIED2zL@XmKu9cXR4xar#xCSW()2nHW2z|+KKJNdO|y` zW2n(bP(tYIR?%6h=s%z-ag_yKXS|`){sGsZKR_$87=J1zvt!iP9~$!eTmkQ(H{kX4 zN4gU`V{=Pfhv%k3{sFJLo%IG>ed;lhG98nBXk;iD>I=DeHb`gs1|tX4#vK0u&@F>E diff --git a/inst/po/de/LC_MESSAGES/R-pkgdown.mo b/inst/po/de/LC_MESSAGES/R-pkgdown.mo index 84d95233c984d3ca92eac72c9329e3961c8d1227..cf57e85a2b356b6dff890fcbf4afa029af25aed6 100644 GIT binary patch delta 1526 zcmXxkOGs2v9LMqh=s4;$mO80THl}4h@{w6%4@WDF9*gKfw5rG;D1vek?P?%fvIV{F0AFFXaHee}sVKJUUjq5|^ zP1$vCxP|NJxa-%0*v|C`YJw?TgR`g`EMORayGt11x`0l#m!TG3jdWQfs=p02PZySR ze>+Zv!!B_mDZ7egcmuWK`>4$rb|0fAN~1D-j>>2fb>k`2xEa&}exQE8=>1FHUO;Cv z_qP%%8qkee=}F`_b`DGMqT7$U(LL0TJVY%x?LI|~8$&H5<4&OFeUBVA?d_j2rLFi* zMGIJT1KdReN>LNVkS?pmwbNz@DVEGQKZYpQ45+rU}%5W1O_mv#5!$U?<+h3LHb-_$}&&)2Q*E++U~!mQf2W zim?BhD9$KlT#tIDt*9UNVmY4i{%fc$??>J6HflkG$efn;{xNTViAv~=_kTsr{}Yw? za*B#Ft>C{!^45f!sKc*&a0k~XP!rujEp!BxVH%a;C|2St)E3X6e*Xv6fIeTJm;6pTi_kMJTNn;sBv%(Lm_!IjGNoJw&$TQrY7d zaaZ426+Ou2mD=i_tGbKW>TUJ7pU{KULpwz5B=qL!Sruw|dY!5Xy_PC^T~+i6%S1yL U0-1sQBe|K`@asS(6M2#IAMiDAYXATM delta 1637 zcmYk6OGuPa6vyxA_-Hhz(MdBM9aDSw$X8irPp!#?CLvT(5i*Ua(I_(-5yF555fKGu zo5D?HJHw1t1zMZ3ox2ERHnxeNT-8SU{l^=4ng9LWd%t_mJ?GqSzF)q0QEWNeIcaDC zREXM>jOl@+PCB(zW3qt*rb92>41JcBa1-+;`@9wMGwpO~unT(OMJPW*a0?uV*u~5v z268;LzF=NLH}hFLUx4+@zd$)ygBj3+cOBrPbHQ@UTA0ba+0NUb{C7c2%_aLh2(vlg z3^9*_M$6Ms1{a|AU4gP2fLSnV*T-P9!#|fsEqGGmHr9TzG*vu4QrUchw}3iDv)%dQ>JdH z1oL14tbnR?0BV1%lYtx$Ky1wjl;OBtzX$o5$8<7$0p)N8DuV?myCtZM=AF)%K51%=>qrz|d2ejVOiJy-z6}p{+3|6>6D2MXR-phoiu_3F)u0oo4pktP zrbVAOHNC>ss2=H3Pon=#Uy>#}QC-xE&;g`-*o)Nk5~%G*<%y9od*ETDi`Ct%;w@LmmQwKNH{p$KN$8$LcO6# yC>)$?PHRi{YI}7@VtdHn`|(}EV9d4P@M3UH2GJX#$gNO+urJ&noomUQN%{w}fQB^y diff --git a/inst/po/dk/LC_MESSAGES/R-pkgdown.mo b/inst/po/dk/LC_MESSAGES/R-pkgdown.mo index b7e84a817da87a4707d5089d0f1e21dd3dd6e605..3c0994f8175d7c6cc62ec125863474d4c9093c32 100644 GIT binary patch literal 4054 zcmaKtO^h5z6~~Kw8V4uA5E}y_6&r&SXU4mW@yEtC@p^Zijo0?ZySB&yq@L-Tp7!)~ z5B;(B9)JTPiU>mDBM6BQ0g897Grv9-_DEYH+LBG0r)E11pflJ!Z+a-_+QUE z?=3a*_1^)y2nOjk^8Q$f&4Ze^5gTCK{{LEoqvU3J%egR6)1>bMMZS*rJy-!2A z<{N(gJHG!Tcpu|GfjZBxpzQj+=W9^<{|x1~H=z7+9qQbhc*)+aQ0wo9OqnLsx`Tdx z){mcsk1+mOsPDfDb&l^s+4%$bet5<6WysIG%1eHG4eA_kdj1n?-CIz0yzO~A9qGLn z%AV~|^Ol$Vv=?gsgPxB=e&vO9!Y{{=sO8A{Jr{P@@X__yKRjKARfKZn=pUxV_~ zOKc{;y#kewe}Kx1zeBCN4*AsF!lu%{1#$$l4Qkv%#c?lGTxK9YbCQ?*vEus?)Vk91 zOHlhf1KGlS4^F}tq4fO;%8&o@^VgyFe+SAhn=o430k!^NDE$XKAA|DG6Mp_lKmIu= zyCb+A=1|{#4c-dB>F1w=+W&`8e!2=3_g_NA^LJ3^{Uem0UWb@w{sCqGzoG2e!ld@w z4t3t0zCQ)!pQBKEmY~je9zFs;@8_R|vf~9PJ70u~)6d|C;jf|ezYb;R8&LY*hWh>; zD0}ZwnuYKx5~mJVEKTWcDxJ9%N|E(iUAJTsr= z{h&1S6%I|}wo40VPP$U-^U{TC*SmLJGB68iBOL0Gf9FK%$clo=B)e>7j_Ut&MXD(9>h7JyG)Pf zh7awY{S*5iGUr^!ZnzL66>slzPo><2*j=(&s^-wUrk(W% zapH0sX?=w_TisMH)$PGrUWcihB_ZF1K^fHc*V)Dwp&R6`9Vi3b<$=p%1w2R$cTV5; zgP3ld(#+i|`_mv}IHxHpJ}+FzN>aHXh(Wj-7wE*2v`7LOu#{&PUAt^7gbja?Y3to; zr!mSiHXfiXB+2GuOw^CV$8IinwXkwOineXChX*)>HUZHPE7LMVo;Qgl@0aN zR(F}Sj@vL*wsc2HDt{ODP{zg=u@J6_=YSaa_+d4Dygjsm7_e zEC+o&+X>2)FU?coCB&h}ywp|?@*sxXQv7QW)GKb?j-1{NxM(vLLgg5O>UPau?l+zaFsQBTOv~sCAsY++dII*ob%!8;{ z!!OR9UcW}|n{h=iAKFGiBPZpg^Q2gh5*ii0?!C(Zg)Qj#ucdOXS2)$d+GoBFhQ1D( zQ(50~KZ(oy`W4%~$e9MC`)BKWV5`x-z6P4bwL;S4-UU6?!n*t^peUon4C6vRnt67m z+W45&sqMIniCJF1rh-U@6zf-p`?S`gi1mH`LjHdh94JHTs9~leZcZtuhVSW78WcF8 zbo^Cgf>};D<+uvgi%HH-9^mJTi3{snvB1$A!-O24LkVOqtY6K;codTnm5`iafNokF zP9Imrg#R#ZX-GbqnQ?~6MAr?NBS~yFpjqUutc&A~ORBIFaPJMF7*$4>m==X9iIjqJ j_)R6U<=BdQKCF>(VknUOJ(uWMt&hn}#u{B6-P->FAIzvD delta 1738 zcmZwHSx8h-9LMo9Woo15lG)-mYL>aQXIWXPrBV`rz7;bV z-|Xi`36EnIosvX8I?`TL``gIR z4EWi9C3;MaKIVme@fLLypHN%nV^&Hy2~{sZwV!KUh8mz2`I*gJ7GMi1&sqEY8fv^g z)B^7%vH!YxVjH|cCH`a`LaqFdeLsQGbp+|Cc11W9D^Ts$p^l&l^(|~hweLV3#bMO9 za}>1`Cu7`bhTW)y*O5h=e$U}ButqD}4CRB%$aXrq! z7F7Pjs0qeSaHE9hQ5||vGrfXpcmp-DyVm1UfsD*q%O+1d}$xKw9nW#MT zQ2ncr{xMU_jgJQ^EW)fHRujvKnM5wJjwmBah-yMbv*&-6nXd|E8Bsutd?$MFpQ3+o zDwU(KQ=GrHWo#KwrN};5Jm$r0d%p%}5n8=gsO_&ORuKV$4KVYF8bTjoDWPwymQd06 zP(dstrs?m0E%C4DD5`8F-vatJ zM^;Gas8vez^{VLXOi`dX8t8J|J>j-MdpJVP)a;JBkzlLq4aaZsHYN0W!wD^U^#?<( zZf7_Yh&b&|#0j-JronLoQ8yTIoi;C&Sm<3!T-)~}vCZcl@Mrh+_|trOqp8Df&cD>n z!LBYR)E;z0ouLlzL((pA}djqLc{sJr=sOta# diff --git a/inst/po/es/LC_MESSAGES/R-pkgdown.mo b/inst/po/es/LC_MESSAGES/R-pkgdown.mo index cceb45a9aadf9cd849e523f77d346baf56648a14..a5b84d4a0b56172d462656d6a774f6a1ebe5d6a1 100644 GIT binary patch delta 1560 zcmYM!OGs2v9LMqhIHptMt+cesN+)ZwDIcSijy-Iq6f1JmDkNFw_F#xr=B|NWeE?|J<1IaeQ7k5u`SWra75 z(n%~OItt7VVP7E^%8yxQAG- zqAdw9s}k^>Rj2`tsD3S|foYtJyWIUAyb>@wf?7CB=LPr&wKE=*YkZBf9@Q@y=KNJj zaYJXn12teT>WxpJCh}2RKZIKNw!8lXS<_zP9(;oljIhtz>LxBqxE(cbmvcYrMf*$G ze=U5@b-aN}=ng7@ho}WdQ2oYH-^vHn#9vVTf8k>Mi#n1D{#5ilj!L{4HNF*>U>9m! zuTO=f?Ko=SDP#`2gp2SN>Ij~>`!BGb_G{FHS=93YS!%%$>Z2`1C0dKx`gV7JCkAOB zKz%cQFBJ_uhDzilYD>?cGQ5aN=(>A;7g^JWF^Z$8g+3xb`_4uE|DomylckQZ95sI& z`BZYHU4Q=@U84G8>Yz}g^p>a zaQ^(mvl@42-OLkPl7_|Atj`uJyUv^tYkvGGe8>w;DGQm4uFJ8_`VYFF;4C?blbooX}aT=%`fm cjad5dK&G~+Cy*H`eiY2?4vz;iG4E`_f9GLodH?_b delta 1668 zcmXxkO-PhM9LMo-)imEVvn6eK&|{GGKZPQY@D&qqbB->+Myq)1-qz}$*6uAsCn|NMHtb* z6=djRYVC_=)Q+^H7SL(+qS_Cj2D*yscM~)4j;$ZV;W%TSqjsW!!L)!AxCXmW^*yQV zzXrNSg}h}Oj#%%b?!rSF>|9$NUQ z_Fn^!Qz55NU;G|5@n_rcJL(I5qZaTF)jo?q1x;LvYF~%CJFTb*PNVvHF(3O;M|8u! zAB~XF7mT9@c#0cw3e|BQ`6#o1>bQu^ZT{doOk#E&Ng=Af3@fn~HJ;nPzl2)QWz;1e zLM=3MkBqi{!oHZsc*-A8muDW;@gr&>Ur}4Tgj(P-YGTc%_vy&mOg=hTj+*Ew($t(o zwf7_AM9dX3I?L;*0Y;I#6HRK^OtcV9L@BX}Xd^0!ZNz>;NyoweF0)GoQX{d2(5`9X zSlS)SV1fSrl^Rxve(?sIkD=Wtv4#3rC2qC(gIG>z@vJ?%{q1;wC?d2QJBdR?4Y7mJ z9Xm`!=hua*B5DcU(j!DH>2B<`1;@G>_Ym6tYFnorR4OFOqB&!><32+7Nk`a9)DgOf zIzk&E_e2}-`nf)IbNUBO<%hDLX)r3hFt#vnLCQy diff --git a/inst/po/fr/LC_MESSAGES/R-pkgdown.mo b/inst/po/fr/LC_MESSAGES/R-pkgdown.mo index 71019b80bf8f87b57133a44b6fc001f5bebbeb3b..b954b747a2793cb370b8465ca400b5e9cd29f60e 100644 GIT binary patch delta 1526 zcmYk+Pe@cz6vy#1I*mGN>P(te+LTsWYHDf!{F5a_wI~RJ!v08`AdnUX(ZUziD*6MN z(H~NXf`Q4d6$|$n zt%F!YG^d$$VP}{FZF-qmCVsOyCNv#2B_q4Fz z*ag3E3G*1}@$*HIO@jY@dHeTkYkh)N{szC%5C6#3bNU;m1MO7WeJ z5}0#CtfC1q)PqWpA*;aUSmW25F%~jA;NvH`Srs{lO8g2kWVcZBAE2K54E3pBM5+I3 zI>TI8i4&-aGpNM=pe9B*k$I>@i&5iM91dY4>XTjb>km=)KgVJmbVpDNPhuQ@W>bIN z7~%sdvnVQo0@Q9V#}ceZmG&^I>dZET0g2{L#PBkB3mTYS~%|V{!UzP z)?~GG_7hdaMq&@4rnge&jXI$<5n5Qu<@SCG$9t#4;Xu1bZTljr;%oV(jsIx2&M!19 z8Q9?cR;(aY53;q*Lb7NC7FyCj zYanuo<^*Fp@RpmM+8Sfh!G&uv6E|R>=K*`(gqptv8EP)t`$0@+ zebdK*CLF|UypL>VlwA_O#4LP;%6uACoUhh7)PnPSN1I6sFPFoeo@1ew!3K_5Q1PNEk2fU3-ARKoMtAE-(W)VS-If)RWDHm19bxreIQGdio^B&srRQ4jD1>0%bV z)L$KbaX||#q29f+$bmH6h-IjO^~h#g*=gJrYd0$4D6*M5>`vhWR3hK(^+nXUW!!|G zWa_U2hZmxSt1$ylqB^#t66-=G(1S`WhWZse#?3f}D)kiV70jT6pHQ!65n0nDF-YHz z4^_GB7zg_3{HP8!NMF;0TktF@kv>!cH<2QlyQqX8VL6UsytJr<7f|DVq8{iEsuEsS zRp}j6#bPBKXyJgp(1?1HHq=6w?fq_4VmD9=4PiV1)DwoVEA=BAfBhnH)?u zs$#`R0=MJ7f5r z+a1$inp)Kg@t32zu5O8(6xj>=R^8ZckB{OuLS-V^_;0iUYYB(YW9=r65qpRdLbW}v zzc)42tDLAL^tII!|C_#sYI~x(spS&~2)&10gqmKW+J3?xKQd+~))4w4^|I@Ty@cwk zm+VzKdh3ORz6v${p49Z!nIgv@ae6}0tKm+kE8Nf7#9UIl%hxc_8;o8H_d5Ndu26rd zH#iaS6eMO9Ij5(_)H$Saec^%li1XfQS5AF6IM5U7jdsL`b%r9$w=zd$qA>Y&!atZ1 BibVhb diff --git a/inst/po/ko/LC_MESSAGES/R-pkgdown.mo b/inst/po/ko/LC_MESSAGES/R-pkgdown.mo index 185c21cd478d1f5a596b31b9ef5be5d28c9686a6..6c87e85750840a68e955cde9b2be3ad6c4858fb1 100644 GIT binary patch delta 1492 zcmXxkOGs2v9LMo9j?UDKl{1ZHjhc{Kx#!&fJ?GqW&)mtX(Ms=A zwD_i@>?SISmLlhl;l5%Hl&2-m&B1Y;hc9q0zOnZA7@(fTAkJV6zhe|AqT2 ze+~J%=UO>gK*J78IEYQuyHOnsV;JwD26%!Yd}d~_l=_s_KcWVhL4NKB2VMV->Sq=g zVVKT>&T}ro36pg7SdNXT8SgZlj>gy&FCG=!SaFzUWrs0lnoR_nk#eq~9Dw^?L>Rxf|Ag2elFp z(9?`3IFYYVH%y~C$|67amBW1eY3=`{k4Z5r<;O@~j&W4I9rXa6RzHGzfa9of`fwo* zgjj#Q`>Ql)bB&@pc!X*nM=jw?^Bwk3&!ReN<1v)K7nRqA>L+EMMpE5?T_3Xc>!|zg zhFO2jWXuwtTf%FrPg~*_tRnB5T@NstI*6HZGlBKA*IE6r*@K$c3DioQxB5lT5-y=; zdJR)Jf=loZ@^caHRtMD_G;k7iy%}|VKWas~Q3ISoKlY>YFIf8^YGp55yEkGN?wgOz zNmR!f)C#>t4e;5n|1$rg@=Dks8aRqfrX-dq<<5i7q@~~OHe%5!BID=Y|rBw zvDMDC<5l!cXwRMTtw3!sZAukQKu^0t70NQAEq9hbYyrI%=9*izHThLEKYcqi=1U(cJz4Z0vB7AR delta 1642 zcmZwHSx8h-9LMpajeF+SV!1TaG%aRUnwFN9l|Ds*5d;MlI#!SlX$$qx6fIZ~2x=IZ z3PF@52pR?1ix3jzQ@#aJJp|!Mi9G~i_5H~|eCcri_jAvF?zu}>_OqPuhjdSeBUKUE z#GYv9j^k+$C(`#A=hATs%IKSgcID{}-j;V9}($5D6o6}6ygRKMS-g`{v&`%F}Q0OOh8 zZR8>!OHm!_Q7gWH^mUgp4R4yAsEPVecQS-p@TfV4>h}&c(R=d?YTPO0a6dVP)gX$| zw6*h53&=FrqB@kJ+Et=D?!^Uo(8}v%lyf1>rTh|&)$bnqu-Eb`S*$JKYiS1 z3N GjIm=E~K$4y=*?zfE!TdC8({eHV@!o^2bo)45QkQS^YR_oKNOAWC}Nv#Qtlb zcus1t2-VS#T1cK*fgG-eliD4%d;_ZeCCtIAR^Mag{pOJQ67y&`V)@CiUHm`|{0p@s z31pPd;G_wBs1>ilBUpq>u@&j!`jEpt=cM+pQT1<8^Kn{)AB5 zw3^sXC}|S@O>ToSq%DM(&dak6;@I-SL0UM^$rXW+I|-A z))7@iIkBA3-4zf!iH*csLOWPVC}~&niA}^3VmI+G`Iz5rwVXa3CA~-`gdWR!LP_7b z(q>}i>=o|koGYX@gym(0theY1D++LcK6jmZ5MWFq%Fy%Uey kBiFko+PVfa5+6pTPIf$sv{2gHGI?isqGw?6S<;EA`yQUO%vT!gtC}OBax7lg|247_nX`&PTuc+_q=!Sx#!+gGI-FSc^a4{Bux=U4}g7(dhe4s5rObDmV!h?-^t%dj(g* zDVSt^`%Fih{o(ivD$pWqfMI59Cyh`E<)C(0fJ)#1)c9Waz2ChbfCb*4h8jNx32FBs zk3FJU!TR=89XJiO&>Yl>%tK|o2zjhbqXZ(XDkh);rl1nZy7w)xa*|LB_c$Jb8b1g% z{|xky4bvpxRrg^8WV=`Uy4e4^%=mOx6h|p~f{sCDaZzt`92V zqfoU!4i#r8&iQM=bzbNWjKF2^7F-J_A&(;w0Qwi{;?Qs%lZc@&uHEZc!PkT#(mt4u0s2I(#Zwwg{; z;JEc|?)7kZUtCIA2c delta 1543 zcmYk6O-PhM7{_PT)pYH{kJ7aC-PE*NGqo(;tUMHHw-BKs!q#0CX;)S~RK!Msr=lb( zx_C)20}&FDq(it+hYnHHK_Q_aqPj#Kg0SfKUuUD?{m*Znd7pXandhC|FGWkmv8CL! z+lJPHHlgwqV@^O{8XfJX+n8K90$0H?m-nS!rD!i?ptYP6<^&C0K3kdRT<*hg#PG zb)Y`TV}`P*zfN}9PTYb`*rQP2Y5^+qZ;-vsGTaE=Op2vYCu)ScRBcdxC!rDwKvlF4 z7Q#zV{&%1f8~0FuEtqFQnZJO#3$LI8eu8@c6DEETeAw04ZnzodL0*|!$YYx6v_YG- zPg%PMD$aR3e+BxmZ^RfBFn9u$z#FL2E<&B)y?y@~s&p=PSArfWe=n3@C8Ri}#FUxLYcEr2Z%)&DByMLa33nr6jb0js82Kxb%M8$tC0AfUYKm93{;_1RED-A zwPvJs{H-KD8A!C(G z6pRMLf$5R-%GCT7_xQwMq$}d|cSbw4U^cVQRd`%}@rU6+Z>Q50bV5Vn_;`FKI56$? Hw5I$8vao{U diff --git a/inst/po/tr/LC_MESSAGES/R-pkgdown.mo b/inst/po/tr/LC_MESSAGES/R-pkgdown.mo index b2e44d7f2915e61154335c4ee9185476d78d1df4..756dd3bf519ee8c55ce0467542a8a3216d8876e8 100644 GIT binary patch delta 1432 zcmYk6O>9h26vxlZ^vg{3V+>X8R7bUxQHJ^)HPa1}ZqOhWx|lQ(VL>!qNO&6|5nqW4 zizX}x3&|`7J0A(@LRbh1wLqj@Nwk|uhy=g?b6?`-{qOId`|dsW+;i`H#nz`S-lurQ zHKXKED@ugT4#3(9D$21+vl@6D&VeVLeFj!xUxd|g494L&Y=A|m@y{Gz!g}m?&Yps6 z%{==~LlaYYi@{zfhj|!<3r!_3xBnxFzoLG3UN6+j=<`0eifpz9xkY5EUAjUR)!v^$W; z?o&0gzCBO_PCza60V*S3p&~9r9{WY503xg^);%*lTZui9d|>GFF?&d z3_WBcRCVx_dvO6~LuS{Z0(eVQaySVU;53!`XCOnY43*N~P#a0$eIe|EI)WV3`+blh zb`Q-`Q9sm<2B7BearQyD1bf)o=iprI zORx)$!+G#|jQnfC_jE+y7br(lP=U=ry|3YbX<8%H#3WPz8P}hMn!m%@18@`eeyD)2 zKm~dW>L~9*1yuBC$l+tx@dj$)&rlP7Ku!1q6<9U1#5mLuB%uQ7fJ*%;s58$&`P~JZ z;jrsJ4Yi@mP#f}YxEHsf96f{_y+3&|3`&xQcF6C+QfN6+$sz@)vgIHAns3`L+P%tZ zwApW&ZH2mT1fcs*)My>*kwMXq=>M_-V;R!Ub)h;@P!_qy8rX}pJKY^+L7#OCQU-#e z?6w7lTi?GFL0=yYrIL(W2U?GoBK-?;D2?=aHlcQ;vI4C{I`eL%%cqh-8xcwMk8>MT fmUVR2UpO&Rx>wm2Dos}9Bc-0``B3R~tPuVS+4p3l delta 1539 zcmYk+OGs2v9LMqFV|-U?Q)ZfuscEH_Y4(^NP78Z2axpE0LPAHKqPa1n^jb_7xJe<2 zh@yf(dJrNu3wtaQj9f(|ZVGA2q8^>*V3Nt8AVI@~W)l?^sE$F*#a`5aG0eg9)*;NJJZj5#P!oHIT;?%1J%5TC?-gpiceorsqsIM( z9^P-#DJ`QS2Q_0KYVnQM7Sw=#^x{6$ijJZt){E*FMNQ-qs{OEie#6#}VIB43sP^wM zgZG;+WVp;XZUy+$n#X8*Q5k9_waD%nKdOBIHG%!sAhIaaiCm_~);p*jIEQ-iko7vo z)!_jd4K#sV<{7ueIAiPQ(4S(=2hiCnrN%7KY%nf?WmpYKrPI{6*!1G zikms?zZy(Zp#f&`Fut`7YZ#rZX+;fq5Y;|tJ&s)F0ylkB!>Dm?p%!)z)qfl{@h7(a zHLj*SpUeKM;SVYn;U8Rsc^u$UY(l+wFQ#ETYQP|BC7t&98KkQjMD-g%P2{eve}w8k zWy{ZTE9KcZ8O>a8*F^GBXIq4tP&qdZSZ~V#)Qbfl8URE>NJ?sisSGL@6juSTn^B-Rm1I|+@) z--`Pla8vUFad&X#8wo$LgV;rASJ)gkZQ#C{*tk$MW!5Cx%C&?hTtw6m$)rCuCH=>= z5L$#jKJAA4`(H(-gh-~9WPHhjwf4XAZu0s$vO%Vr*h1)=(T5oz8VGHzj!7SxQXNrG zY$w(eRfJNL8gC=mRrefQQRk?$HI=^VnD1n$zt8FR^*B*ViBq1+l!CT_NLPQ@iTI+S zo=`Lt=}L@d>`C*|I6QMd9PuUlIo$(^x$Mg+-Zm$4A{IWI>~Sm-dpVgnlG~N~4}1`T Aw*UYD diff --git a/inst/po/zh_CN/LC_MESSAGES/R-pkgdown.mo b/inst/po/zh_CN/LC_MESSAGES/R-pkgdown.mo index 16f245ada3a2284790314a1eaf30861e367da206..52c3f75b3a2e5028da03b8db2c7c3099e5856639 100644 GIT binary patch delta 1432 zcmYk6OGuPa6vxjvzM3)fRWoBX<5X7W)Ray3G;JepBEm%k;zELupp2v-s@X^oR1_Jt z=m9|>WC%?NZbB%MT11P83UU!`B8XWeQEmGD$1~yK{_pRe`#AT0=YHS!xbb-`J6l(J z)38po0yUJF9fnn6L*9%nDC!tZzg7}UW|LyBdoG=32(&JDN>-iL}e3E9e?!KLs8 ztYLrqL_-hz-I<39GzS}C39I!a5vT(tp`I`Wb$|}2`Q1L=>;3&OMgLK#`J<4K_7GBR zoT`@n?Wr2@CDcYApfd6W>cn%9Vt=W0fFQey)ldOrPzP!9{uWrsB-F-T&Vx|%2cXsu z!Ys03s%m)N2QI_tVd*%LnAOGgeLml*&vm#9X6(~Z!#5mLj z%`ghn-roZi_yE*KeeR!do`YI{$^C1v4gaqDZ=u$GhKiqun*S$DLnjIlT^+Sh6QeK) zTfIN+Y=_*6b-3RR6>vYK*dh0iK*c@oyx{#;owuFY2Q(-)?j2K*tG9ZTKt)?gLkHsb zU`ezd$#x^XoU&c>DAam-nGPXKqn(A;{N3w)Venbnc9cLZl+6v!v z^Mb)fZ*PVfr0nP=)SIu*dO3=rqUl=WMaTEIwf{RvEp2^{%F1fA4Xr`?7j&W&(iKHe z6OwH}t!M{oL938#3)+qrBVF%ar0ddWZTkjJ4d=$n;(^@9@@Ozu8A=3lnegwxKa~_= AivR!s delta 1532 zcmYk6OGuPa6vyxQZnR7-O-mb_(JbwumX*^(H$9e-n}mw+8IhKwn+&EjtVLihBy15a zgdQN7F2o`z1Zz`4w8)^Kzy}0Dxd|=k_aDzhhwp!X=bX9s-22_{-kHcA$_al?kL!0> zHCl%PG0q)_C2=&^&3Nb1VINF_gK!xfvUm(85I={B@Fi6Lw{Ru=3e|t!_y?vECo+h9 z*k$3Ak;sP{SOb$`6I8(v^ukVK4@@EMv-l3w!X7{#H$tP|$D!&?Le-msnQ$7a?r#{+ z{4S1YH3=`&ihWQoUuvv?Dj0;T;9;mYIsvt?Ca7_3Pz&jX>VLz2AF%u&EFnJx)&C<* zV1D-vhsXV-NrMZ<6sl>WJg7G*g6y6PLiMkPTEG!w4dkWVDahj*E#C^Y0~ett?lIni zVGX#Cqe71$k9$J10!~=|9nA1J_X%nXf3PZzOJb0iYRoj|8Us+@x)^GQgHStj6zauJ zdf9&^nn|co2iyxUS;uk9Pa0oa{=M;w@jFz(MW{OQysnr6wR0Iz^AsA(Enk(){;T6L z5@IdXiccFaSpJIfI@CnHa19)={0P(p<1ljQES@sXK-HhOcmb9XCx#iNft55GcnE5O zTBrf_PzyS1aVJ#2E*J~@Ek9tq3;9a!p2fpZ^~NBNdtvb#sJh_~=FHg-zl<@fpmeqTYzcdntm zxwYQc*xE)kdOqIoNjuolQrCW_wZ+%g(Adz{&{8+rmyi>iN%yiqX!h~b+1pnON&}(k cYtLr-hesbS^LdgZ?sRY0+~w}kSKdX>U;NaBcK`qY diff --git a/po/R-dk.po b/po/R-dk.po index c65bb4abd..a4708b79d 100644 --- a/po/R-dk.po +++ b/po/R-dk.po @@ -108,7 +108,7 @@ msgstr "Etisk regelsæt" #: build-home-community.R:31 msgid "Getting help" -msgstr "" +msgstr "Få hjælp" #: build-home-community.R:38 msgid "Community" @@ -168,7 +168,7 @@ msgstr "CRAN udgivelse: %s" #: build-reference-index.R:22 msgid "Package index" -msgstr "" +msgstr "Pakke indeks" #: build-reference-index.R:158 msgid "All functions" @@ -210,19 +210,19 @@ msgstr "Reference" #: navbar.R:140 msgid "Light switch" -msgstr "" +msgstr "Lyskontakt" #: navbar.R:143 msgid "Light" -msgstr "" +msgstr "Lys" #: navbar.R:144 msgid "Dark" -msgstr "" +msgstr "Mørk" #: navbar.R:145 msgid "Auto" -msgstr "" +msgstr "Auto" #: navbar.R:180 msgid "Get started" @@ -234,19 +234,19 @@ msgstr "Flere artikler..." #: package.R:300 msgid "deprecated" -msgstr "" +msgstr "udfaset" #: package.R:301 msgid "superseded" -msgstr "" +msgstr "erstattet" #: package.R:302 msgid "experimental" -msgstr "" +msgstr "eksperimentel" #: package.R:303 msgid "stable" -msgstr "" +msgstr "stabil" #: rd-data.R:23 msgid "Details" @@ -318,7 +318,7 @@ msgstr "Eksempler" #: render.R:104 msgid "Additional details" -msgstr "" +msgstr "Yderligere detaljer" #: render.R:106 #, fuzzy @@ -336,7 +336,7 @@ msgstr "Udviklingsstatus" #: usage.R:23 msgid "# Default %s method" -msgstr "" +msgstr "# Standard %s metode" #: usage.R:25 #, fuzzy From c0a09226e29533e62d67c18bf14406ee5466d5d2 Mon Sep 17 00:00:00 2001 From: Richard Iannone Date: Sat, 15 Jun 2024 16:26:26 -0400 Subject: [PATCH 21/31] Update R-pt.po (#2662) Co-authored-by: Hadley Wickham --- po/R-pt.po | 59 +++++++++++++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/po/R-pt.po b/po/R-pt.po index 07a26903a..633fa527c 100644 --- a/po/R-pt.po +++ b/po/R-pt.po @@ -1,16 +1,16 @@ msgid "" msgstr "" -"Project-Id-Version: pkgdown 1.9000.9000.9000\n" +"Project-Id-Version: pkgdown 2.0.9.9000\n" +"Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-05-24 09:36-0500\n" -"PO-Revision-Date: 2021-11-12 15:18-0500\n" -"Last-Translator: \n" -"Language-Team: \n" +"PO-Revision-Date: 2024-06-16 00:00-0500\n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" "Language: pt\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 3.0\n" -"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" #: build-404.R:11 msgid "Page not found (404)" @@ -26,7 +26,7 @@ msgstr "Artigos" #: build-articles.R:570 msgid "All vignettes" -msgstr "" +msgstr "Todas as vinhetas" #: build-footer.R:34 msgid "Developed by" @@ -38,7 +38,7 @@ msgstr "Site criado com pkgdown %s." #: build-home-authors.R:12 msgid "Authors and Citation" -msgstr "" +msgstr "Autores e citação" #: build-home-authors.R:101 msgid "More about authors..." @@ -94,7 +94,7 @@ msgstr "tradutor" #: build-home-authors.R:254 render.R:103 msgid "Citation" -msgstr "" +msgstr "Citação" #: build-home-authors.R:255 msgid "Citing %s" @@ -110,7 +110,7 @@ msgstr "Código de conduta" #: build-home-community.R:31 msgid "Getting help" -msgstr "" +msgstr "Obter ajuda" #: build-home-community.R:38 msgid "Community" @@ -170,15 +170,15 @@ msgstr "Lançamento CRAN: %s" #: build-reference-index.R:22 msgid "Package index" -msgstr "" +msgstr "Índice de pacotes" #: build-reference-index.R:158 msgid "All functions" -msgstr "" +msgstr "Todas as funções" #: build-reference.R:371 msgid "Usage" -msgstr "" +msgstr "Uso" #: build-tutorials.R:47 navbar.R:152 msgid "Tutorials" @@ -200,7 +200,7 @@ msgstr "Versão não lançada" #, fuzzy #| msgid "Search for" msgid "Search site" -msgstr "Procurar" +msgstr "Pesquisar site" #: navbar-menu.R:174 msgid "Search for" @@ -212,19 +212,20 @@ msgstr "Referência" #: navbar.R:140 msgid "Light switch" -msgstr "" +# Appearance +msgstr "Interruptor de luz" #: navbar.R:143 msgid "Light" -msgstr "" +msgstr "Clara" #: navbar.R:144 msgid "Dark" -msgstr "" +msgstr "Escuro" #: navbar.R:145 msgid "Auto" -msgstr "" +msgstr "Auto" #: navbar.R:180 msgid "Get started" @@ -236,19 +237,19 @@ msgstr "Mais artigos..." #: package.R:300 msgid "deprecated" -msgstr "" +msgstr "obsoleta" #: package.R:301 msgid "superseded" -msgstr "" +msgstr "substituída" #: package.R:302 msgid "experimental" -msgstr "" +msgstr "experimental" #: package.R:303 msgid "stable" -msgstr "" +msgstr "estável" #: rd-data.R:23 msgid "Details" @@ -320,13 +321,13 @@ msgstr "Exemplos" #: render.R:104 msgid "Additional details" -msgstr "" +msgstr "Detalhes adicionais" #: render.R:106 #, fuzzy #| msgid "Toggle navigation" msgid "Site navigation" -msgstr "Alternar de navegação" +msgstr "Ativar/desativar navegação" #: repo.R:35 msgid "Source:" @@ -336,15 +337,15 @@ msgstr "Fonte:" msgid "Dev status" msgstr "Status de desenvolvimento" -#: usage.R:23 +#: usage.R:47 msgid "# Default %s method" -msgstr "" +msgstr "# Método %s padrão" -#: usage.R:25 +#: usage.R:49 #, fuzzy #| msgid "# %s method for %s" msgid "# %s method for class '%s'" -msgstr "# %s método para %s" +msgstr "# método %s para a classe '%s'" #~ msgid "Function reference" -#~ msgstr "Referência de funções" +#~ msgstr "Referência para funções" From ad3ffd6c11182b49d256858fa08449a08ad36cd9 Mon Sep 17 00:00:00 2001 From: Joan Maspons Date: Sun, 16 Jun 2024 12:03:51 +0200 Subject: [PATCH 22/31] Update Catalan translations (#2664) --- po/R-ca.po | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/po/R-ca.po b/po/R-ca.po index 120ff0ac0..68132b875 100644 --- a/po/R-ca.po +++ b/po/R-ca.po @@ -2,14 +2,15 @@ msgid "" msgstr "" "Project-Id-Version: pkgdown 2.0.6.9000\n" "POT-Creation-Date: 2024-05-24 09:36-0500\n" -"PO-Revision-Date: 2023-08-16 00:23+0200\n" -"Last-Translator: jmaspons \n" +"PO-Revision-Date: 2024-06-16 09:24+0200\n" +"Last-Translator: Joan Maspons \n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Lokalize 23.04.3\n" +"X-Generator: Lokalize 24.05.0\n" +"Language-Team: Catalan <>\n" #: build-404.R:11 msgid "Page not found (404)" @@ -170,7 +171,7 @@ msgstr "Versió del CRAN: %s" #: build-reference-index.R:22 msgid "Package index" -msgstr "" +msgstr "Índex del paquet" #: build-reference-index.R:158 msgid "All functions" @@ -197,10 +198,9 @@ msgid "Unreleased version" msgstr "Versió no publicada" #: navbar-menu.R:173 -#, fuzzy #| msgid "Search for" msgid "Search site" -msgstr "Cerca" +msgstr "Cerca al lloc" #: navbar-menu.R:174 msgid "Search for" @@ -212,19 +212,19 @@ msgstr "Referència" #: navbar.R:140 msgid "Light switch" -msgstr "" +msgstr "Interruptor de color" #: navbar.R:143 msgid "Light" -msgstr "" +msgstr "Clar" #: navbar.R:144 msgid "Dark" -msgstr "" +msgstr "Fosc" #: navbar.R:145 msgid "Auto" -msgstr "" +msgstr "Automàtic" #: navbar.R:180 msgid "Get started" @@ -236,19 +236,19 @@ msgstr "Més articles..." #: package.R:300 msgid "deprecated" -msgstr "" +msgstr "obsolet" #: package.R:301 msgid "superseded" -msgstr "" +msgstr "reemplaçat" #: package.R:302 msgid "experimental" -msgstr "" +msgstr "experimental" #: package.R:303 msgid "stable" -msgstr "" +msgstr "estable" #: rd-data.R:23 msgid "Details" @@ -320,13 +320,12 @@ msgstr "Exemples" #: render.R:104 msgid "Additional details" -msgstr "" +msgstr "Detalls addicionals" #: render.R:106 -#, fuzzy #| msgid "Toggle navigation" msgid "Site navigation" -msgstr "Commuta la navegació" +msgstr "Navegació del lloc" #: repo.R:35 msgid "Source:" @@ -338,13 +337,13 @@ msgstr "Estat de desenvolupament" #: usage.R:23 msgid "# Default %s method" -msgstr "" +msgstr "# Mètode %s per defecte" #: usage.R:25 -#, fuzzy #| msgid "# %s method for %s" msgid "# %s method for class '%s'" -msgstr "# Mètode %s per a %s" +msgstr "# Mètode %s per a la classe %s" #~ msgid "Function reference" #~ msgstr "Llistat de funcions" + From 8eac429ecf8564f1122cd7d502de3d93e9ee4e7d Mon Sep 17 00:00:00 2001 From: Diego H Date: Mon, 17 Jun 2024 10:27:59 +0200 Subject: [PATCH 23/31] Update Spanish translation (#2665) --- po/R-es.po | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/po/R-es.po b/po/R-es.po index b17584105..85a7a0a04 100644 --- a/po/R-es.po +++ b/po/R-es.po @@ -1,9 +1,9 @@ msgid "" msgstr "" -"Project-Id-Version: pkgdown 1.9000.9000.9000\n" +"Project-Id-Version: pkgdown 2.0.9.9000\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-05-24 09:36-0500\n" -"PO-Revision-Date: 2022-11-25 23:09+0000\n" +"PO-Revision-Date: 2024-06-17 07:31+0000\n" "Last-Translator: @dieghernan\n" "Language-Team: es\n" "Language: es\n" @@ -175,7 +175,7 @@ msgstr "Versión CRAN: %s" #: build-reference-index.R:22 msgid "Package index" -msgstr "" +msgstr "Índice del paquete" #: build-reference-index.R:158 msgid "All functions" @@ -205,7 +205,7 @@ msgstr "Versión no publicada" #, fuzzy #| msgid "Search for" msgid "Search site" -msgstr "Buscar" +msgstr "Buscar en el sitio" #: navbar-menu.R:174 msgid "Search for" @@ -217,19 +217,19 @@ msgstr "Índice" #: navbar.R:140 msgid "Light switch" -msgstr "" +msgstr "Interruptor de color" #: navbar.R:143 msgid "Light" -msgstr "" +msgstr "Claro" #: navbar.R:144 msgid "Dark" -msgstr "" +msgstr "Oscuro" #: navbar.R:145 msgid "Auto" -msgstr "" +msgstr "Auto" #: navbar.R:180 msgid "Get started" @@ -239,21 +239,23 @@ msgstr "Primeros pasos" msgid "More articles..." msgstr "Más artículos..." +# Assuming feminine (e.g. functions). Arguments in Spanish are masculine (e.g. obsoleto) #: package.R:300 msgid "deprecated" -msgstr "" +msgstr "obsoleta" +# Assuming feminine (e.g. functions). Arguments in Spanish are masculine (e.g. reemplazado) #: package.R:301 msgid "superseded" -msgstr "" +msgstr "reemplazada" #: package.R:302 msgid "experimental" -msgstr "" +msgstr "experimental" #: package.R:303 msgid "stable" -msgstr "" +msgstr "estable" #: rd-data.R:23 msgid "Details" @@ -325,13 +327,13 @@ msgstr "Ejemplos" #: render.R:104 msgid "Additional details" -msgstr "" +msgstr "Detalles adicionales" #: render.R:106 #, fuzzy #| msgid "Toggle navigation" msgid "Site navigation" -msgstr "Cambiar la navegación" +msgstr "Navegación del sitio" #: repo.R:35 msgid "Source:" @@ -343,13 +345,13 @@ msgstr "Estado de desarrollo" #: usage.R:23 msgid "# Default %s method" -msgstr "" +msgstr "# Método %s por defecto" #: usage.R:25 #, fuzzy #| msgid "# %s method for %s" msgid "# %s method for class '%s'" -msgstr "# %s método para %s" +msgstr "# Método %s para la clase %s" #~ msgid "Function reference" #~ msgstr "Índice de funciones" From 819cede3fbbb2410912f4d49365177c9159b809f Mon Sep 17 00:00:00 2001 From: Joan Maspons Date: Mon, 17 Jun 2024 10:59:17 +0200 Subject: [PATCH 24/31] Improve Catalan translations (#2666) As per https://github.com/r-lib/pkgdown/pull/2665#discussion_r1642402004 --- po/R-ca.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/po/R-ca.po b/po/R-ca.po index 68132b875..22194ece0 100644 --- a/po/R-ca.po +++ b/po/R-ca.po @@ -236,11 +236,11 @@ msgstr "Més articles..." #: package.R:300 msgid "deprecated" -msgstr "obsolet" +msgstr "obsoleta" #: package.R:301 msgid "superseded" -msgstr "reemplaçat" +msgstr "reemplaçada" #: package.R:302 msgid "experimental" @@ -342,7 +342,7 @@ msgstr "# Mètode %s per defecte" #: usage.R:25 #| msgid "# %s method for %s" msgid "# %s method for class '%s'" -msgstr "# Mètode %s per a la classe %s" +msgstr "# Mètode %s per a la classe «%s»" #~ msgid "Function reference" #~ msgstr "Llistat de funcions" From 076d915caef1c47b4a2ba8774625f8ad880ef76a Mon Sep 17 00:00:00 2001 From: Jay Hesselberth Date: Tue, 18 Jun 2024 03:17:35 -0600 Subject: [PATCH 25/31] Use quarto action consistently (#2668) Includes tinytex to fix build errors --- .github/workflows/pkgdown.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/pkgdown.yaml b/.github/workflows/pkgdown.yaml index 1b952d124..4bae74da9 100644 --- a/.github/workflows/pkgdown.yaml +++ b/.github/workflows/pkgdown.yaml @@ -25,6 +25,11 @@ jobs: - uses: actions/checkout@v4 - uses: quarto-dev/quarto-actions/setup@v2 + with: + version: pre-release + tinytex: true + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - uses: r-lib/actions/setup-pandoc@v2 From 3c2fcb95250f96f29f742f576f4bf730ba96d339 Mon Sep 17 00:00:00 2001 From: Hugo Gruson <10783929+Bisaloo@users.noreply.github.com> Date: Wed, 19 Jun 2024 15:33:22 +0200 Subject: [PATCH 26/31] Fix typo which prevents finding templates (#2669) --- R/templates.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/templates.R b/R/templates.R index 873c0c22c..542229156 100644 --- a/R/templates.R +++ b/R/templates.R @@ -44,7 +44,7 @@ template_candidates <- function(type, name, ext = ".html", pkg = list()) { templates_dir <- function(pkg = list(), call = caller_env()) { config_pluck_list(pkg, "template") path <- config_pluck_string(pkg, "template.path") - package <- config_pluck_string(pkg, "templates.package") + package <- config_pluck_string(pkg, "template.package") if (!is.null(path)) { if (!dir_exists(path)) { From f58482e7d0606338e58b6e33f0e27f36fee62eed Mon Sep 17 00:00:00 2001 From: "J.P. Le Cavalier" Date: Wed, 19 Jun 2024 09:33:58 -0400 Subject: [PATCH 27/31] Update fr translations (#2663) --- po/R-fr.po | 42 ++++++++++++++++++------------------------ 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/po/R-fr.po b/po/R-fr.po index ef6678a21..8baec8f9e 100644 --- a/po/R-fr.po +++ b/po/R-fr.po @@ -1,10 +1,10 @@ msgid "" msgstr "" -"Project-Id-Version: pkgdown 1.9000.9000.9000\n" +"Project-Id-Version: pkgdown 2.0.9.9000\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-05-24 09:36-0500\n" -"PO-Revision-Date: 2021-10-27 11:57-0500\n" -"Last-Translator: \n" +"PO-Revision-Date: 2024-06-15 20:28-0400\n" +"Last-Translator: J.P. Le Cavalier \n" "Language-Team: fr\n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -111,7 +111,7 @@ msgstr "Code de conduite" #: build-home-community.R:31 msgid "Getting help" -msgstr "" +msgstr "Obtenir de l'aide" #: build-home-community.R:38 msgid "Community" @@ -171,7 +171,7 @@ msgstr "Version CRAN : %s" #: build-reference-index.R:22 msgid "Package index" -msgstr "" +msgstr "Index du paquetage" #: build-reference-index.R:158 msgid "All functions" @@ -198,10 +198,8 @@ msgid "Unreleased version" msgstr "Version inédite" #: navbar-menu.R:173 -#, fuzzy -#| msgid "Search for" msgid "Search site" -msgstr "Rechercher" +msgstr "Rechercher sur le site" #: navbar-menu.R:174 msgid "Search for" @@ -213,19 +211,19 @@ msgstr "Référence" #: navbar.R:140 msgid "Light switch" -msgstr "" +msgstr "Interrupteur" #: navbar.R:143 msgid "Light" -msgstr "" +msgstr "Clair" #: navbar.R:144 msgid "Dark" -msgstr "" +msgstr "Sombre" #: navbar.R:145 msgid "Auto" -msgstr "" +msgstr "Automatique" #: navbar.R:180 msgid "Get started" @@ -237,19 +235,19 @@ msgstr "Plus d'articles..." #: package.R:300 msgid "deprecated" -msgstr "" +msgstr "obsolète" #: package.R:301 msgid "superseded" -msgstr "" +msgstr "remplacée" #: package.R:302 msgid "experimental" -msgstr "" +msgstr "expérimentale" #: package.R:303 msgid "stable" -msgstr "" +msgstr "stable" #: rd-data.R:23 msgid "Details" @@ -321,13 +319,11 @@ msgstr "Exemples" #: render.R:104 msgid "Additional details" -msgstr "" +msgstr "Détails supplémentaires" #: render.R:106 -#, fuzzy -#| msgid "Toggle navigation" msgid "Site navigation" -msgstr "Activer la navigation" +msgstr "Navigation sur le site" #: repo.R:35 msgid "Source:" @@ -339,13 +335,11 @@ msgstr "Statut de développement" #: usage.R:23 msgid "# Default %s method" -msgstr "" +msgstr "# Méthode %s par défaut" #: usage.R:25 -#, fuzzy -#| msgid "# %s method for %s" msgid "# %s method for class '%s'" -msgstr "# Méthode %s pour %s" +msgstr "# Méthode %s pour la classe %s" #~ msgid "Function reference" #~ msgstr "Documentation des fonctions" From 1bd2f9b5de3b632c1ce633c9d2878396950d7f89 Mon Sep 17 00:00:00 2001 From: Mine Cetinkaya-Rundel Date: Wed, 19 Jun 2024 16:34:25 +0300 Subject: [PATCH 28/31] Update Turkish translation, addresses #2659 (#2667) --- po/R-tr.po | 58 ++++++++++++++++++++++-------------------------------- 1 file changed, 24 insertions(+), 34 deletions(-) diff --git a/po/R-tr.po b/po/R-tr.po index 33bb449d0..e237a49f1 100644 --- a/po/R-tr.po +++ b/po/R-tr.po @@ -18,8 +18,7 @@ msgstr "Sayfa bulunamıyor (404)" #: build-404.R:12 msgid "Content not found. Please use links in the navbar." -msgstr "" -"İçerik bulunamıyor. Lütfen yukarıdaki gezinme çubuğundaki bağları kullanın." +msgstr "İçerik bulunamıyor. Lütfen yukarıdaki gezinme çubuğundaki bağları kullanın." #: build-articles.R:432 navbar.R:186 navbar.R:196 navbar.R:217 msgid "Articles" @@ -27,7 +26,7 @@ msgstr "Makaleler" #: build-articles.R:570 msgid "All vignettes" -msgstr "" +msgstr "Bütün makaleler" #: build-footer.R:34 msgid "Developed by" @@ -39,7 +38,7 @@ msgstr "Site pkgdown %s ile geliştirilmiştir." #: build-home-authors.R:12 msgid "Authors and Citation" -msgstr "" +msgstr "Yazarlar ve Alıntı" #: build-home-authors.R:101 msgid "More about authors..." @@ -59,11 +58,11 @@ msgstr "derleyici" #: build-home-authors.R:192 msgid "contractor" -msgstr "anlaşmalı taraf" +msgstr "yüklenici" #: build-home-authors.R:193 msgid "contributor" -msgstr "katkıda bulunan" +msgstr "katılımcı" #: build-home-authors.R:194 msgid "copyright holder" @@ -71,11 +70,11 @@ msgstr "telif hakkı sahibi" #: build-home-authors.R:195 msgid "maintainer" -msgstr "koruyucu" +msgstr "bakımcı" #: build-home-authors.R:196 msgid "data contributor" -msgstr "veri katkısında bulunan" +msgstr "veri katılımcısı" #: build-home-authors.R:197 msgid "funder" @@ -95,7 +94,7 @@ msgstr "çevirmen" #: build-home-authors.R:254 render.R:103 msgid "Citation" -msgstr "" +msgstr "Alıntı" #: build-home-authors.R:255 msgid "Citing %s" @@ -111,7 +110,7 @@ msgstr "Davranış kuralları" #: build-home-community.R:31 msgid "Getting help" -msgstr "" +msgstr "Yardım" #: build-home-community.R:38 msgid "Community" @@ -171,15 +170,15 @@ msgstr "CRAN yayını: %s" #: build-reference-index.R:22 msgid "Package index" -msgstr "" +msgstr "Paket dizini" #: build-reference-index.R:158 msgid "All functions" -msgstr "" +msgstr "Bütün fonksiyonlar" #: build-reference.R:371 msgid "Usage" -msgstr "" +msgstr "Kullanım" #: build-tutorials.R:47 navbar.R:152 msgid "Tutorials" @@ -198,8 +197,6 @@ msgid "Unreleased version" msgstr "Yayınlanmamış sürüm" #: navbar-menu.R:173 -#, fuzzy -#| msgid "Search for" msgid "Search site" msgstr "Ara" @@ -213,19 +210,19 @@ msgstr "Referans" #: navbar.R:140 msgid "Light switch" -msgstr "" +msgstr "Koyu/açık" #: navbar.R:143 msgid "Light" -msgstr "" +msgstr "Koyu" #: navbar.R:144 msgid "Dark" -msgstr "" +msgstr "Açık" #: navbar.R:145 msgid "Auto" -msgstr "" +msgstr "Otomatik" #: navbar.R:180 msgid "Get started" @@ -237,19 +234,19 @@ msgstr "Diğer makaleler..." #: package.R:300 msgid "deprecated" -msgstr "" +msgstr "artık kullanılmayan" #: package.R:301 msgid "superseded" -msgstr "" +msgstr "yerine gelen" #: package.R:302 msgid "experimental" -msgstr "" +msgstr "deneysel" #: package.R:303 msgid "stable" -msgstr "" +msgstr "sabit" #: rd-data.R:23 msgid "Details" @@ -321,13 +318,11 @@ msgstr "Örnekler" #: render.R:104 msgid "Additional details" -msgstr "" +msgstr "Ek detaylar" #: render.R:106 -#, fuzzy -#| msgid "Toggle navigation" msgid "Site navigation" -msgstr "Gezinmeyi aç/kapat" +msgstr "Site navigasyonu" #: repo.R:35 msgid "Source:" @@ -339,13 +334,8 @@ msgstr "Geliştirme statüsü" #: usage.R:23 msgid "# Default %s method" -msgstr "" +msgstr "# Varsayılan %s metodu" #: usage.R:25 -#, fuzzy -#| msgid "# %s method for %s" msgid "# %s method for class '%s'" -msgstr "%s için # %s metodu" - -#~ msgid "Function reference" -#~ msgstr "Fonksiyon referansı" +msgstr "# %s için %s metodu" From aed6c2d3a13913cbe2cc7c39a4472d2d349dcdd5 Mon Sep 17 00:00:00 2001 From: Hadley Wickham Date: Wed, 19 Jun 2024 14:44:16 +0100 Subject: [PATCH 29/31] Roughly organise news --- .gitignore | 2 + NEWS.md | 131 +++++++++++++++++++++++++++++------------------------ 2 files changed, 74 insertions(+), 59 deletions(-) diff --git a/.gitignore b/.gitignore index 7c6b284f0..df027dcf3 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ inst/doc .env *.tex docs + +/.quarto/ diff --git a/NEWS.md b/NEWS.md index 117c06cef..5e843c445 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,82 +1,95 @@ # pkgdown (development version) -* `build_articles()` and `build_article()` now support articles/vignettes written with quarto. Combining the disparate quarto and pkgdown templating systems is a delicate art, so while I've done my best to make it work, there may be some rough edges. So please file an issue you encounter quarto features that don't work quite right. Learn more in `vignette("quarto")`(#2210). -* `preview_page()` has been deprecated (#2650). -* `build_article()` now translates the "Abstract" title if it's used. -* `build_*()` (apart from `build_site()`) functions no longer default to previewing in interactive sessions since they now all emit specific links to newly generated files. -* `document` in `build_site()` and `build_reference()` has been removed after being deprecated in pkgdown 1.4.0. `devel` should be used instead. -* `autolink_html()` was deprecated in pkgdown 1.6.0 and now warns every time you use it. `downlit::downlit_html_path()` should be used instead. -* `build_news()` only syntax highlights the page once, not twice, which prevents every block of R code getting a blank line at the start (#2630). - - ```R - 1 + 1 - ``` +## Major changes -* `build_reference()` no longer displays `\dontshow{}` or `\testonly{}` blocks in examples. It will run the code in `\dontshow{}`; it won't run the code in `\testonly{}`(#2188). -* `build_article()` no long has a `data` argument. This is technically a breaking change, but I can't figure out why anyone would have ever used it. -* `build_reference()` does a better job of parsing `\value{}` blocks (#2371). -* When built on GitHub, source urls now use the name of the current upstream branch (rather than `HEAD`), which is more likely to generate correct links (#2597). -* New `vignette("non-english")` that discusses non-English sites including how to submit new translations (#2605). -* `build_reference()` now generates the usage that users actually type for infix and replacement methods (#2303). * @olivroy and @salim-b are now pkgdown authors in recognition of their contributions. -* `pkgdown_sitrep()`/`check_pkgdown()` now check that you have up-to-date favicons if you have a package logo. -* pkgdown now uses httr2 instead of httr (#2600). +* `build_articles()` and `build_article()` now support articles/vignettes written with quarto. Combining the disparate quarto and pkgdown templating systems is a delicate art, so while I've done my best to make it work, there may be some rough edges. So please file an issue you encounter quarto features that don't work quite right. Learn more in `vignette("quarto")`(#2210). +* New light switch makes it easy for users to switch between light and dark themes for the website (based on work in bslib by @gadenbuie). For now this behaviour is opt-in with `template.light-switch: true` but in the future we may turn it on automatically. See the customization vignette for details (#1696). +* New `vignette("non-english")` that discusses non-English sites including how to submit new translations (#2605). +* New `vignette("accessibility")` describes what manual tasks you need to perform to make your site as accessible as possible (#2344). * New `template.math-rendering` allows you to control how math is rendered across your site. The default uses `mathml` which is low-dependency, but has the lowest fidelity. You can also use `mathjax`, the previous default, and `katex`, a faster alternative. (#1966). -* Mathjax now uses version 3.2.2. -* `build_sitemap()` no longer includes redirected pages (#2582). * All external assets (JS, CSS, fonts) are now directly included in the site instead of fetched from external CDN (@salim-b, #2249) -* `build_reference_index()` now displays function lifecycle badges next to the function name (#2123). The badges are extracted only from the function description. You can now also use `has_lifecycle()` to select functions by their lifecycle status. -* `build_articles()` now recognises a new `external-articles` top-level field that allows you to define articles that live in other packages (#2028). -* New light switch makes it easy for users to switch between light and dark themes for the website (based on work in bslib by @gadenbuie). For now this behaviour is opt-in with `template.light-switch: true` but in the future we may turn it on automatically. See the customization vignette for details (#1696). -* The search dropdown has been tweaked to look more like the other navbar menu items (#2338). -* `vignette("search")` has been removed since BS3 is deprecated and all the BS5 docs are also included in `build_search()` (#2564). * YAML validation has been substantially improved so you should get much clearer errors if you have made a mistake (#1927). Please file an issue if you find a case where the error message is not helpful. -* `template_reference()` and `template_article()` now only add backticks to function names if needed (#2561). -* Custom navbars that specify `icon` but not `aria-label` will now generate a message reminding you to provide one for to improve accessibility (#2533). -* `init_site()` will no longer automatically build favicons on CI systems (e.g. GHA). This is an expensive operation that uses an external service so it should only be run locally (#2553). -* `build_home_index()` now reports when rendering the home page (#2544). + +## Lifecycle chagnes + +* `autolink_html()` was deprecated in pkgdown 1.6.0 and now warns every time you use it. `downlit::downlit_html_path()` should be used instead. +* `build_site(document)` and `build_reference(document)` has been removed after being deprecated in pkgdown 1.4.0. `devel` should be used instead. +* `preview_page()` has been deprecated (#2650). * Bootstrap 3 has been deprecated. It was superseded in December 2021, and now we're starting to more directly encourage folks to move away from it. + +## Front end changes + +* When built on GitHub, source urls now use the name of the current upstream branch (rather than `HEAD`), which is more likely to generate correct links (#2597). +* The search dropdown has been tweaked to look more like the other navbar menu items (#2338). * Improve HTML5 compliance (#2369): * No longer support IE9 or earlier * Strip trailing whitespace * Label `