diff --git a/.Rbuildignore b/.Rbuildignore index 620b2328e..84163ab97 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -21,3 +21,6 @@ ^tools$ ^\.lintr.R$ ^vignettes/\.quarto$ +^vignettes/articles/\.quarto$ +^vignettes/articles/*_files$ +^vignettes/articles$ diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index cd91a64f1..377bb63c5 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -10,7 +10,7 @@ on: pull_request: branches: [main, master] -name: R-CMD-check +name: R-CMD-check.yaml permissions: read-all @@ -27,8 +27,8 @@ jobs: - {os: macos-latest, r: 'release'} - {os: windows-latest, r: 'release'} - # use 4.1 to check with rtools40's older compiler - - {os: windows-latest, r: '4.1'} + # use 4.0 or 4.1 to check with rtools40's older compiler + - {os: windows-latest, r: 'oldrel-4'} - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} - {os: ubuntu-latest, r: 'release'} @@ -44,15 +44,10 @@ 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-tinytex@v2 + - uses: r-lib/actions/setup-r@v2 with: r-version: ${{ matrix.config.r }} @@ -63,6 +58,7 @@ jobs: with: extra-packages: any::rcmdcheck needs: check + quarto-version: 1.6.32 - uses: r-lib/actions/check-r-package@v2 with: diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yaml index c3a09d8dc..f9fe26967 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yaml @@ -21,11 +21,13 @@ jobs: - uses: r-lib/actions/setup-r@v2 with: use-public-rspm: true - + - uses: r-lib/actions/setup-r-dependencies@v2 with: extra-packages: any::lintr, local::. needs: lint + + - uses: r-lib/actions/setup-tinytex@v2 - name: Lint run: lintr::lint_package() diff --git a/.github/workflows/netlify.yaml b/.github/workflows/netlify.yaml index 3bc4f8ebd..10c6fe1e0 100644 --- a/.github/workflows/netlify.yaml +++ b/.github/workflows/netlify.yaml @@ -16,11 +16,6 @@ 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 4bae74da9..0927d63fc 100644 --- a/.github/workflows/pkgdown.yaml +++ b/.github/workflows/pkgdown.yaml @@ -3,11 +3,13 @@ on: push: branches: [main, master] + pull_request: + branches: [main, master] release: types: [published] workflow_dispatch: -name: pkgdown +name: pkgdown.yaml permissions: read-all @@ -24,13 +26,6 @@ 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 @@ -41,6 +36,8 @@ jobs: with: extra-packages: any::pkgdown, local::. needs: website + + - uses: r-lib/actions/setup-tinytex@v2 - name: Build site run: pkgdown::build_site_github_pages(new_process = FALSE, install = FALSE) diff --git a/.github/workflows/pr-commands.yaml b/.github/workflows/pr-commands.yaml index d1f765096..2edd93f27 100644 --- a/.github/workflows/pr-commands.yaml +++ b/.github/workflows/pr-commands.yaml @@ -4,7 +4,7 @@ on: issue_comment: types: [created] -name: Commands +name: pr-commands.yaml permissions: read-all @@ -15,6 +15,8 @@ jobs: runs-on: ubuntu-latest env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + permissions: + contents: write steps: - uses: actions/checkout@v4 @@ -52,6 +54,8 @@ jobs: runs-on: ubuntu-latest env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + permissions: + contents: write steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 2565dbe3e..9dfa2d652 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -6,7 +6,7 @@ on: pull_request: branches: [main, master] -name: test-coverage +name: test-coverage.yaml permissions: read-all @@ -21,13 +21,6 @@ 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 @@ -36,6 +29,9 @@ jobs: with: extra-packages: any::covr, any::xml2 needs: coverage + quarto-version: 1.6.32 + + - uses: r-lib/actions/setup-tinytex@v2 - name: Test coverage run: | diff --git a/.gitignore b/.gitignore index df027dcf3..baa1d4b10 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ inst/doc docs /.quarto/ +**/.quarto/ diff --git a/DESCRIPTION b/DESCRIPTION index ba804ff60..e85096559 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: pkgdown Title: Make Static HTML Documentation for a Package -Version: 2.0.9.9000 +Version: 2.1.1.9000 Authors@R: c( person("Hadley", "Wickham", , "hadley@posit.co", role = c("aut", "cre"), comment = c(ORCID = "0000-0003-4757-117X")), @@ -21,7 +21,7 @@ License: MIT + file LICENSE URL: https://pkgdown.r-lib.org/, https://github.com/r-lib/pkgdown BugReports: https://github.com/r-lib/pkgdown/issues Depends: - R (>= 3.6) + R (>= 4.0.0) Imports: bslib (>= 0.5.1), callr (>= 3.7.3), @@ -31,12 +31,12 @@ Imports: downlit (>= 0.4.4), fontawesome, fs (>= 1.4.0), - httr2 (>= 1.0.0), + httr2 (>= 1.0.2), jsonlite, openssl, purrr (>= 1.0.0), ragg, - rlang (>= 1.1.0), + rlang (>= 1.1.4), rmarkdown (>= 2.27), tibble, whisker, @@ -73,5 +73,5 @@ Config/testthat/parallel: true Config/testthat/start-first: build-article, build-quarto-article, build-reference Encoding: UTF-8 Roxygen: list(markdown = TRUE) -RoxygenNote: 7.3.1 +RoxygenNote: 7.3.2 SystemRequirements: pandoc diff --git a/NAMESPACE b/NAMESPACE index b5c4203db..6e2bdfb2f 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -125,6 +125,7 @@ export(build_site) export(build_site_github_pages) export(build_tutorials) export(check_pkgdown) +export(clean_cache) export(clean_site) export(data_template) export(deploy_site_github) diff --git a/NEWS.md b/NEWS.md index 9393e451e..9ff5b63ff 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,9 +1,26 @@ # pkgdown (development version) +* Articles (i.e., vignettes in `vignettes/articles`, created by `usethis::use_article()` and available on pkgdown sites but not included in a built package) have improved test cases (thanks to @venpopov and @ethanbass). +* New `clean_site(force = TRUE)` for cleaning of `docs/` regardless of whether it was built by pkgdown (#2827). +* Links to favicons in page headers were updated to reflect changes to https://realfavicongenerator.net/ (#2804). Favicons should be re-generated by manually removing the `pkgdown/favicon` directory and then running `pkgdown::build_favicons()`. +* Reinstate Rd macro loading, which was accidentally disabled in v2.1.1 (#2782). +* The language of the site is set from the first `Language:` in the `DESCRIPTION` if it is available and no other language is specified (@jonthegeek, #2808). + +# pkgdown 2.1.1 + +* Added keyboard shortcut, `/`, to focus search bar (#2423). +* The `BugReports` field can now be an email (@catalamarti, #2275). +* New `clean_cache()` function removes the contents of the cache directory (#2718). +* pkgdown now depends on R >= 4.0.0 (#2714). +* Updated GitHub Actions advice and workflows around Quarto install (@tanho63, #2743). +* Support ANSI sequences in `index.md` (@krlmlr, #2787). + +# pkgdown 2.1.0 + ## Major changes * Added @olivroy and @salim-b as pkgdown authors in recognition of their contributions. -* `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). +* `build_articles()` and `build_article()` now support articles/vignettes written with quarto (version 1.5 and above). 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("translations")` 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). @@ -35,6 +52,7 @@ * pkgdown no longer overrides the default selection colours. This improves accessibility for users who have set their own colours in their browser settings (#2139, @glin). * If you put a dropdown menu (e.g. articles) on the right hand side of the navbar, it will now be right aligned. This makes longer titles more likely to stay on the page (#2421). * BS5 templates no longer include empty link to logo when none exists (#2536). +* Updated translations from @jplecavalier, @dieghernan, @krlmlr, @LDalby, @rich-iannone, @jmaspons, and @mine-cetinkaya-rundel (#2659). ## `_pkgdown.yaml` @@ -52,7 +70,7 @@ * `` tags now have their `srcref` attributes tweaked in the same way that the `src` attributes of `` tags are (#2402). * `as.pkgdown()` will no longer prompt you to install a missing template package from CRAN, since these are almost always found in GitHub (#2076). * `build_articles()` now recognises a new `external-articles` top-level field that allows you to define articles that live in other packages (#2028). -* `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_article()` no longer has a `data` argument. This is technically a breaking change, but I can't figure out why anyone would have ever used it. * `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. * `build_article()` now translates the "Abstract" title if it's used. * `build_article()` now escapes html characters in the title (#2286). @@ -64,6 +82,7 @@ * `build_home()` now includes the contents of `inst/AUTHORS` on the authors page (#2506). * `build_home_index()` now reports when rendering the home page (#2544). * `build_home_index()` now renders math if you use it in your home page (#2263). +* `build_news()` now works if your package has been archived at some point (#2687). * `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 @@ -79,7 +98,7 @@ * `build_reference()` matches usage for S3 and S4 methods to the style used by R 4.0.0 and later (#2187). * `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_redirects()` is now exported to make it easier to document (#2500). -* `build_redirects()` now automatically adds redirects for topic +* `build_redirects()` now automatically adds redirects for topic aliases. This matches the behaviour of `?` and will help keep links stable in the long term (#1876). * `build_redirects()` now reports which redirects it is generating. * `build_site()` automatically runs `pkgdown_sitrep()` at the start of the process (#2380). @@ -96,85 +115,85 @@ aliases. This matches the behaviour of `?` and will help keep links stable in th * Fixes for regressions in 2.0.8: * Output links generated when building the site work once again (#2435). - - * pkgdown once again uses Bootstrap version specified in a template + + * pkgdown once again uses Bootstrap version specified in a template package (@gadenbuie, #2443). * Front-end improvements: - * The skip link now becomes visible when focussed (#2138). Thanks to @glin + * The skip link now becomes visible when focussed (#2138). Thanks to @glin for the styles! - * The left and right footers no longer contain an extra empty paragraph tag - and the footer gains additional padding-top to keep the whitespace constant + * The left and right footers no longer contain an extra empty paragraph tag + and the footer gains additional padding-top to keep the whitespace constant (#2381). * Clipboard buttons report their action again ("Copied!") (#2462) -* It is now easier to preview parts of the website locally interactively. +* It is now easier to preview parts of the website locally interactively. `build_reference_index()` and friends will call `init_site()` automatically instead of erroring (@olivroy, #2329). * `build_article()` gains a new `new_process` argument which allows to build a - vignette in the current process for debugging purposes. We've also improved - the error messages and tracebacks if an article fails to build, hopefully + vignette in the current process for debugging purposes. We've also improved + the error messages and tracebacks if an article fails to build, hopefully also making debugging easier (#2438). -* `build_article_index()` and `build_reference_index()` use an improved BS5 - template that correctly wraps each section description in a `
`, rather - than a `

`. This eliminates an empty pargraph tag that preceded each section +* `build_article_index()` and `build_reference_index()` use an improved BS5 + template that correctly wraps each section description in a `

`, rather + than a `

`. This eliminates an empty pargraph tag that preceded each section description (#2352). * `build_home()` no longer errors when you have an empty `.md` file (#2309). - It alos no longer renders Github issue and pull request templates + It alos no longer renders Github issue and pull request templates (@hsloot, #2362) -* `build_news()` now warns if it doesn't find any version headings, suggesting +* `build_news()` now warns if it doesn't find any version headings, suggesting that that `NEWS.md` is structured incorrectly (#2213). -* `build_readme()` now correctly tweaks links to markdown files that use an +* `build_readme()` now correctly tweaks links to markdown files that use an anchor, e.g. `foo.md#heading-name` (#2313). -* `build_reference_index()` gives more informative errors if your `contents` +* `build_reference_index()` gives more informative errors if your `contents` field is malformed (#2323). -* `check_pkgdown()` no longer errors if your intro vignette is an article is +* `check_pkgdown()` no longer errors if your intro vignette is an article is not listed in `_pkgdown.yml` (@olivroy #2150). * `data_template()` gives a more informative error if you've misspecified the navbar (#2312). # pkgdown 2.0.8 -* pkgdown is now compatible with (and requires) bslib >= 0.5.1 - (@gadenbuie, #2395), including a fix to BS5 navbar template to get +* pkgdown is now compatible with (and requires) bslib >= 0.5.1 + (@gadenbuie, #2395), including a fix to BS5 navbar template to get `navbar.type: dark` to work with Bootstrap 5.3+ (@tanho63, #2388) -* Now uses [cli](https://github.com/r-lib/cli) to provide interactive feedback. +* Now uses [cli](https://github.com/r-lib/cli) to provide interactive feedback. * Avoid unwanted linebreaks from parsing `DESCRIPTION` (@salim-b, #2247). -* Translations - * New Catalan translation (@jmaspons, #2333). +* Translations + * New Catalan translation (@jmaspons, #2333). * Citation sections are correctly translated (@eliocamp, #2410). -* `build_article_index()` now sorts vignettes and non-vignette articles - alphabetically by their filename (literally, their `basename()`), by default +* `build_article_index()` now sorts vignettes and non-vignette articles + alphabetically by their filename (literally, their `basename()`), by default (@jennybc, #2253). * Deprecated `build_favicon()` was removed (`build_favicons()` remains). -* `build_articles()` now sets RNG seed by default. Use - `build_articles(seed = NULL)` for the old (unreproducible) behaviour. +* `build_articles()` now sets RNG seed by default. Use + `build_articles(seed = NULL)` for the old (unreproducible) behaviour. (@salim-b, #2354). * `build_articles()` will process `.qmd` articles with the quarto vignette builder (@rcannood, #2404). -* `build_articles()` and `build_reference()` now set RNG seed for htmlwidgets - IDs. This reduces noise in final HTML output, both for articles and examples +* `build_articles()` and `build_reference()` now set RNG seed for htmlwidgets + IDs. This reduces noise in final HTML output, both for articles and examples that contain htmlwidgets (@salim-b, #2294, #2354). -* `build_news()` correctly parses of github profiles and issues into links +* `build_news()` correctly parses of github profiles and issues into links when present at the beginning of list items (@pearsonca, #2122) * `build_reference()` sets `seed` correctly; it was previously reset too early @@ -185,16 +204,16 @@ aliases. This matches the behaviour of `?` and will help keep links stable in th * Correct usage for S3 methods with non-syntactic class names (#2384). * Preserve Markdown code blocks with class rmd from roxygen2 docs (@salim-b, #2298). -* `build_reference_index()` no longer generates redundant entries when multiple +* `build_reference_index()` no longer generates redundant entries when multiple explicit `@usage` tags are provided (@klmr, #2302) -* `build_reference_index()` correctly handles topic names that conflict with +* `build_reference_index()` correctly handles topic names that conflict with selector functions (@dmurdoch, #2397). # pkgdown 2.0.7 * Fix topic match selection when there is an unmatched selection followed by a matched selection (@bundfussr, #2234) -* Fix highlighting of nested not R code blocks (for instance, example of R +* Fix highlighting of nested not R code blocks (for instance, example of R Markdown code with chunks) (@idavydov, #2237). * Tweak German translation (@krlmlr, @mgirlich, @lhdjung, #2149, #2236) * Remove mention of (defunct) Twitter card validator, provide alternatives (@Bisaloo, #2185) @@ -210,23 +229,23 @@ Markdown code with chunks) (@idavydov, #2237). (#2150). * If there aren't any functions in the `\usage{}` block, then pkgdown will - now shows all aliases on the reference index, rather than just the topic + now shows all aliases on the reference index, rather than just the topic name (#1624). # pkgdown 2.0.5 -* Correctly generate downlit link targets for topics that have a file name +* Correctly generate downlit link targets for topics that have a file name ending in `.` (#2128). * `build_articles()`: if build fails because the index doesn't include all articles, you're now told what articles are missing (@zkamvar, #2121). * `build_home()` now escapes angle brackets in author comments(#2127). - + * `build_home()` will automatically render and link `.github/SUPPORT.md` (@IndrajeetPatil, #2124). -* `build_news()` once again fails to link `@username` at start of +* `build_news()` once again fails to link `@username` at start of bullet. I had to reverted #2030 because of #2122. * `build_reference()`: restore accidentally nerfed `has_keyword()` and @@ -234,25 +253,25 @@ Markdown code with chunks) (@idavydov, #2237). # pkgdown 2.0.4 -* New `check_pkgdown()` provides a lightweight way to check that your - `_pkgdown.yml` is valid without building the site (#2056). Invalid +* New `check_pkgdown()` provides a lightweight way to check that your + `_pkgdown.yml` is valid without building the site (#2056). Invalid `_pkgdown.yml` now consistently generates errors both locally and on CI (#2055). * `build_article()` now supports inline markdown in the `title` (#2039). -* `build_home()` no longer shows development status badges on the released +* `build_home()` no longer shows development status badges on the released version of the site (#2054). * `build_news()` support automated `@username` links in more places (#2030). -* `build_reference()`: +* `build_reference()`: - * You can once again exclude topics from the reference index with `-` (#2040). + * You can once again exclude topics from the reference index with `-` (#2040). - * Inline markdown in `title`s and `subtitle`s is now supported(#2039). + * Inline markdown in `title`s and `subtitle`s is now supported(#2039). - * Package logos will be automatically stripped from the `.Rd` you don't end + * Package logos will be automatically stripped from the `.Rd` you don't end up with two on one page. (#2083). * `\figure{file}{alternative text}` with multiline alt text is now parsed @@ -275,7 +294,7 @@ Markdown code with chunks) (@idavydov, #2237). * Navbar components now accept `target` argument (#2089, @JSchoenbachler). -* New syntax highlighting themes a11y-light, a11y-dark, monochrome-light, +* New syntax highlighting themes a11y-light, a11y-dark, monochrome-light, monochrome-dark, and solarized # pkgdown 2.0.3 @@ -287,8 +306,8 @@ Markdown code with chunks) (@idavydov, #2237). * New Korean (`ko`) translation thanks to @mrchypark and @peremen (#1944). New Danish (`dk`) translation thanks to @LDalby. -* `build_articles()` now adjusts the heading levels of vignettes/articles that - use `

` as section headings to ensure that there's one top-level heading +* `build_articles()` now adjusts the heading levels of vignettes/articles that + use `

` as section headings to ensure that there's one top-level heading (#2004). This ensures that there's one `

`, the title, on each page, and makes the TOC in the sidebar work correctly. @@ -298,11 +317,11 @@ Markdown code with chunks) (@idavydov, #2237). * `build_news()` once again works if `NEWS.md` uses `

` headings (#1947). -* `build_reference()` now correctly interprets `title: internal`: it removes - the section from the reference index _and_ it doesn't list the topics in that +* `build_reference()` now correctly interprets `title: internal`: it removes + the section from the reference index _and_ it doesn't list the topics in that section as missing (#1958). -* `build_reference()` now gives a correct hint when the reference index YAML +* `build_reference()` now gives a correct hint when the reference index YAML is not formatted correctly (e.g. empty item, or item such as "n" that needs to be escaped with quotes to not be interpreted as Boolean) (#1995). @@ -314,16 +333,16 @@ Markdown code with chunks) (@idavydov, #2237). * The navbar gets a little more space after the version number, and aligns the baseline with rest of the navbar (#1989). - * Long lines in code output once again scroll, rather than being wrapped. + * Long lines in code output once again scroll, rather than being wrapped. While this is different to what you'll see in the console, it's a better - fit for web pages where the available code width varies based on the + fit for web pages where the available code width varies based on the browser width (#1940). - - * scrollspy (which highlights the "active" heading in the sidebar) now - computes the offset dynamically which makes it work better on sites with + + * scrollspy (which highlights the "active" heading in the sidebar) now + computes the offset dynamically which makes it work better on sites with taller navbars (#1993). - * Fixed js issues that occurred on pages without a table of contents + * Fixed js issues that occurred on pages without a table of contents (@gadenbuie, #1998). * When htmlwidgets with jQuery or Bootstrap dependencies are used in examples or @@ -331,7 +350,7 @@ Markdown code with chunks) (@idavydov, #2237). the versions used by the htmlwidget (@gadenbuie, #1997). * pkgdown no longer includes bundled author metadata for Hadley Wickham, - RStudio, or the RConsortium, since there are now ways to include this + RStudio, or the RConsortium, since there are now ways to include this meta data in template packages, and special casing these three entities feels increasingly weird (#1952). @@ -355,111 +374,111 @@ Markdown code with chunks) (@idavydov, #2237). ## Bootstrap 5 * pkgdown can style your site with Bootstrap 5 (with help from @jayhesselberth, - @apreshill, @cpsievert). Opt-in by setting `boostrap` version in your + @apreshill, @cpsievert). Opt-in by setting `boostrap` version in your `_pkgdown.yml`: - + ```yaml template: bootstrap: 5 ``` -* We reviewed site accessibility and made a number of small improvements: +* We reviewed site accessibility and made a number of small improvements: (#782, #1553): * Default font is larger and links are always underlined. * Heading anchors use `aria-hidden` to reduce noise for screenreader users. * Navbar dropdowns has improved `aria-labelledby`. - * The default GitHub/GitLab links gain an `aria-label`; use for other + * The default GitHub/GitLab links gain an `aria-label`; use for other icons is now supported, and encouraged in the docs. * Syntax highlighting uses a new more - [accessible colour scheme](https://apreshill.github.io/rmda11y/arrow.html), + [accessible colour scheme](https://apreshill.github.io/rmda11y/arrow.html), designed by Alison Hill (#1536) * A skip link makes it easier to get directly to the page contents (#1827). -* In-line footnotes mean you can read asides next to the text they refer to. +* In-line footnotes mean you can read asides next to the text they refer to. * Articles support tabsets, [as in R Markdown](https://bookdown.org/yihui/rmarkdown-cookbook/html-tabs.html). (@JamesHWade, #1667). * Other minor styling improvements: - + * The active item in TOC is indicated with background colour, rather than a border. * If present, the package logo is shown on all pages near the header. - * Section anchors now appear on the right (making them usable on mobile + * Section anchors now appear on the right (making them usable on mobile phones) (#1782). * The TOC is scrollable independently of the main content. This makes it more useful on long pages with many headings (#1610). * The sidebar is shown at the bottom of the page on narrow screens. - * Function arguments and the reference index (#1822) use definition lists - (`
`) instead of tables. This gives more room for long argument - names/lists of function and detailed descriptions, and displays better + * Function arguments and the reference index (#1822) use definition lists + (`
`) instead of tables. This gives more room for long argument + names/lists of function and detailed descriptions, and displays better on mobile. * Links on the homepage no longer show the full url in the text. - * The default navbar no longer includes a home icon - this took up - precious horizontal space and wasn't very useful since there was already + * The default navbar no longer includes a home icon - this took up + precious horizontal space and wasn't very useful since there was already a link to the home page immediately to its left (#1383). ## Local search -* pkgdown now supports local searching (i.e. searching without an external - service), and is enabled by default for Bootstrap 5 sites since no set-up is - needed (#1629, with help from @gustavdelius in #1655 and @dieghernan & +* pkgdown now supports local searching (i.e. searching without an external + service), and is enabled by default for Bootstrap 5 sites since no set-up is + needed (#1629, with help from @gustavdelius in #1655 and @dieghernan & @GregorDeCillia in #1770). -* pkgdown builds a more exhaustive `sitemap.xml` even for websites built with - Bootstrap 3. This might change Algolia results if you use Algolia for search +* pkgdown builds a more exhaustive `sitemap.xml` even for websites built with + Bootstrap 3. This might change Algolia results if you use Algolia for search (#1629). ## Customisation -* New `vignette("customise")` documents all the ways you can customise your +* New `vignette("customise")` documents all the ways you can customise your site, including the new options described below (#1573). * Sites can be easily themed with either bootswatch themes or by selectively - overriding the `bslib` variables used to generate the CSS. pkgdown now uses - scss for its own Bootstrap css tweaks, which means that you can customise + overriding the `bslib` variables used to generate the CSS. pkgdown now uses + scss for its own Bootstrap css tweaks, which means that you can customise more of the site from within `_pkgdown.yml`. * You can pick from a variety of built-in syntax highlighting themes (#1823). These control the colours (and background) of code in `
` tags.
 
-* pkgdown can now translate all the text that it generates (#1446): this means 
-  that if you have a package where the docs are written in another language, you 
+* pkgdown can now translate all the text that it generates (#1446): this means
+  that if you have a package where the docs are written in another language, you
   can match all the pkgdown UI to provide a seamless experience to non-English
   speakers. Activate the translations by setting the `lang` in `_pkgdown.yml`:
-   
+
     ```yaml
     lang: fr
     ```
-    
+
     pkgdown includes translations for:
-    
+
     * `es`, Spanish, thanks to @edgararuiz-zz, @dieghernan, @rivaquiroga.
     * `de`, German, thanks to @hfrick.
     * `fr`, French, thanks to @romainfrancois, @lionel-, @jplecavalier, and @maelle.
     * `pt`, Portuguese, thanks to @rich-iannone.
     * `tr`, Turkish, thanks to @mine-cetinkaya-rundel.
     * `zh_CN`, simplified Chinese, thanks to @yitao.
-  
+
     If you're interested in adding translations for your language please file
     an issue and we'll help you get started.
-  
+
 * Template packages can now provide `inst/pkgdown/_pkgdown.yml` which is used
-  as a set of defaults for `_pkgdown.yml`. It can be used to (e.g.) provide 
-  author definitions, select Bootstrap version and define bslib variables, 
+  as a set of defaults for `_pkgdown.yml`. It can be used to (e.g.) provide
+  author definitions, select Bootstrap version and define bslib variables,
   and customise the sidebar, footer, navbar, etc. (#1499).
 
-* New `includes` parameters `in-header`, `before-body`, and `after-body` 
-  make it easy to add arbitrary HTML to every page. Their content will be 
-  placed at the end of the `` tag, right below the opening `` tag, 
-  and before the closing tag `` respectively (#1487). They match the 
+* New `includes` parameters `in-header`, `before-body`, and `after-body`
+  make it easy to add arbitrary HTML to every page. Their content will be
+  placed at the end of the `` tag, right below the opening `` tag,
+  and before the closing tag `` respectively (#1487). They match the
   bookdown options `in_header`, `before_body` and `after_body`.
-  
+
     Additionally, you can use `before_title`, `before_navbar`, and
     `after_navbar` to add arbitrary HTML into the navbar/page header; they
-    will appear to the left of the package name/version, and to the left and 
+    will appear to the left of the package name/version, and to the left and
     right of the navigation links respectively (#1882).
 
 * Authors configuration is more flexible (#1516). You can now:
@@ -475,14 +494,14 @@ Markdown code with chunks) (@idavydov, #2237).
     * Add custom sidebar sections (with Markdown/HTML `text`).
     * Add a table of contents to the home page.
     * Completely suppress the sidebar.
-    * Provide your own HTML for the navbar. 
+    * Provide your own HTML for the navbar.
 
 * Footer specification is more flexible (#1502). You can now:
-    
+
     * Change the placement of elements on the left and right.
     * Add text to the left and right (or even remove/replace default text)
-    
-* You can now exclude all default components from the navbar (#1517). 
+
+* You can now exclude all default components from the navbar (#1517).
 
 * Expert users can now override layout templates provided by pkgdown or template
   packages by placing template files in `pkgdown/templates` (@gadenbuie, #1897).
@@ -490,7 +509,7 @@ Markdown code with chunks) (@idavydov, #2237).
 ## New features
 
 * pkgdown now supports redirects (#1259, @lorenzwalthert). The following yaml
-  demonstrates the syntax, with old paths on the left and new paths/URLs on 
+  demonstrates the syntax, with old paths on the left and new paths/URLs on
   the right.
 
   ```yaml
@@ -500,9 +519,9 @@ Markdown code with chunks) (@idavydov, #2237).
     - ["articles/yet-another-old-vignette-name.html", "https://pkgdown.r-lib.org/dev"]
   ```
 
-* Use HTML classes `pkgdown-devel` or `pkgdown-release` to declare that certain 
+* Use HTML classes `pkgdown-devel` or `pkgdown-release` to declare that certain
   content should appear only on the devel or release site. Use the class
-  `pkgdown-hide` for content that should only appear only on GitHub/CRAN 
+  `pkgdown-hide` for content that should only appear only on GitHub/CRAN
   (#1299).
 
 * New `pkgdown_sitrep()` function reports whether the site is set up correctly;
@@ -510,34 +529,34 @@ Markdown code with chunks) (@idavydov, #2237).
 
 ## Code
 
-* Styling for errors, warnings, and messages has been tweaked. Messages 
+* Styling for errors, warnings, and messages has been tweaked. Messages
   are now displayed the same way as output, and warnings and errors are
   bolded, not coloured. This is part of a suite of changes that aim to
-  give package authors greater control over the appearance of messages, 
-  warnings, and errors. 
+  give package authors greater control over the appearance of messages,
+  warnings, and errors.
 
 * Long lines in code output are now wrapped, rather than requiring scrolling.
-  This better matches `rmarkdown::html_document()` and what you see in the 
+  This better matches `rmarkdown::html_document()` and what you see in the
   console.
-  
-* `build_reference()` now allows linking to topics from other packages (either 
-  function names e.g. `rlang::is_installed` or topic names e.g. 
+
+* `build_reference()` now allows linking to topics from other packages (either
+  function names e.g. `rlang::is_installed` or topic names e.g.
   `sass::font_face`). (#1664)
 
-* `build_reference()` now runs examples with 
-  `options(rlang_interactive = FALSE)` (ensuring non-interactive behaviour in 
-  functions that use `rlang::is_interactive()`), `options(cli.dynamic = FALSE)`, 
+* `build_reference()` now runs examples with
+  `options(rlang_interactive = FALSE)` (ensuring non-interactive behaviour in
+  functions that use `rlang::is_interactive()`), `options(cli.dynamic = FALSE)`,
   `Sys.setenv(RSTUDIO = NA)` and `Sys.setLocale("LC_COLLATE", "C")` (#1693).
-  It also runs `pkgdown/pre-reference.R` before and `pkgdown/post-reference.R` 
-  after examples. These allow you to do any setup or teardown operations you 
+  It also runs `pkgdown/pre-reference.R` before and `pkgdown/post-reference.R`
+  after examples. These allow you to do any setup or teardown operations you
   might need (#1602).
 
 * A reference index section with `title: internal` is now silently dropped,
   allowing you to suppress warnings about topics that are not listed in the
   index (#1716).
 
-* Code blocks are now highlighted according to their declared language 
-  (e.g. `yaml`) if the documentation was built with roxygen2 7.1.2 or later 
+* Code blocks are now highlighted according to their declared language
+  (e.g. `yaml`) if the documentation was built with roxygen2 7.1.2 or later
   (#1690, #1692).
 
 * New `pkgdown_print()` allows you to control how your objects are rendered in
@@ -548,7 +567,7 @@ Markdown code with chunks) (@idavydov, #2237).
 
 * You can globally set the `width` of code output (in reference and articles)
   with
-    
+
     ```yaml
     code:
       width: 50
@@ -561,18 +580,18 @@ Markdown code with chunks) (@idavydov, #2237).
 
 * Auto-linking improvements:
 
-  * Links to inherited R6 methods now work correctly for both internal 
+  * Links to inherited R6 methods now work correctly for both internal
     (#1173, @vandenman) and external (#1476) parent classes.
-    
+
   * Linking no longer fails if a package contains duplicated Rd aliases.
-  
+
   * Correctly link to reference pages when the `\name{}` entry doesn't match
     the file name (@dmurdoch, #1586; #1676).
 
 ## Articles
 
-* Article subtitle, author and date (specified in the YAML frontmatter) are now 
-  correctly omitted from the article table of contents in the sidebar 
+* Article subtitle, author and date (specified in the YAML frontmatter) are now
+  correctly omitted from the article table of contents in the sidebar
   (@maxheld83, #1428).
 
 * Support for `as_is: true` and non-default output formats for vignettes/
@@ -581,18 +600,18 @@ Markdown code with chunks) (@idavydov, #2237).
   know about, but it should be a little more reliable and a little better
   documented (#1757, #1764).
 
-* `build_articles()` no longer fails if you have a directory underneath 
+* `build_articles()` no longer fails if you have a directory underneath
   vignettes with a `.Rmd` extension (#1425).
 
 * `build_articles()` now correctly handles links to images in `man/figures`
   (which have the form `../man/figures`) (#1472).
 
-* `build_articles()` again sets the `theme` argument of the document format 
+* `build_articles()` again sets the `theme` argument of the document format
   to `NULL` when `as_is: true` but lets users override this via the `theme`
   argument of the output format.
 
-* `build_articles()` and `build_home()` now warn if you have images that 
-  won't render on the website because they're in unsupported directories 
+* `build_articles()` and `build_home()` now warn if you have images that
+  won't render on the website because they're in unsupported directories
   (#1810). Generally, it's only safe to refer to figures in `man/figures`
   and `vignettes`.
 
@@ -603,14 +622,14 @@ Markdown code with chunks) (@idavydov, #2237).
 
 ## HTML, CSS and JS
 
-* New `template` option `trailing_slash_redirect` that allows adding a script to 
-  redirect `your-package-url.com` to `your-package-url.com/` (#1439, @cderv, 
+* New `template` option `trailing_slash_redirect` that allows adding a script to
+  redirect `your-package-url.com` to `your-package-url.com/` (#1439, @cderv,
   @apreshill).
 
-* External links now get the class `external-link`. This makes them easier to 
+* External links now get the class `external-link`. This makes them easier to
   style with CSS (#881, #1491).
 
-* Duplicated section ids are now de-duplicated; this makes pkgdown work better 
+* Duplicated section ids are now de-duplicated; this makes pkgdown work better
   with the documentation of R6 classes.
 
 * Updated CSS styles from pandoc to improve styling of reference lists (#1469).
@@ -623,60 +642,60 @@ Markdown code with chunks) (@idavydov, #2237).
 
 * `deploy_to_branch()` now calls `git remote set-branches` with `--add` to avoid
   overwriting the existing `remote.{remote}.fetch` value (@kyleam, #1382).
-  It also now cleans out the website directory by default; revert to previous 
+  It also now cleans out the website directory by default; revert to previous
   behaviour with `clean = FALSE` (#1394).
 
 * `build_reference()` will error if envar `CI` is `true` and there are missing
   topics (@ThierryO, #1378).
 
-* You can override the `auto` development mode detected from the package 
+* You can override the `auto` development mode detected from the package
   version by setting env var `PKGDOWN_DEV_MODE` to `release` or `devel`.
   This is useful if your package uses a different convention to indicate
   development and release versions (#1081).
 
-## Other minor improvements and bug fixes 
+## Other minor improvements and bug fixes
 
 * `\special{}` tags with complex contents are rendered correctly (@klmr, #1744).
 
-* `\arguments{}` and `\value{}` do a better job of handling mingled items and 
-  text (#1479). The contents of `\value{}` are now shown immediately after 
+* `\arguments{}` and `\value{}` do a better job of handling mingled items and
+  text (#1479). The contents of `\value{}` are now shown immediately after
   `\arguments{}`.
 
-* The default "branch" for linking to the file sources is `HEAD`, which will 
+* The default "branch" for linking to the file sources is `HEAD`, which will
   work regardless of whether your default branch is called "main" or "master".
 
-* Non-ORCID comments in `Authors@R` are now more usable: if such comments 
-  exist, the sidebar gains a link to the authors page, where they are displayed 
+* Non-ORCID comments in `Authors@R` are now more usable: if such comments
+  exist, the sidebar gains a link to the authors page, where they are displayed
   (#1516).
 
-* Citations with and without text versions are better handled, and text 
+* Citations with and without text versions are better handled, and text
   citations are correctly escaped for HTML (@bastistician, #1507).
 
-* README badges in a single paragraph placed between ``and 
-  `` comments are again detected (#1603). 
+* README badges in a single paragraph placed between ``and
+  `` comments are again detected (#1603).
 
-* The 404 page (default or from `.github/404.md`) is no longer built in the 
-  development mode (see `?build_site`) as e.g. GitHub pages only uses the 
+* The 404 page (default or from `.github/404.md`) is no longer built in the
+  development mode (see `?build_site`) as e.g. GitHub pages only uses the
   `404.html` in the site root (#1622).
 
-* All links on the 404 pages (navbar, scripts, CSS) are now absolute if there 
+* All links on the 404 pages (navbar, scripts, CSS) are now absolute if there
   is an URL in the configuration file (#1622).
 
-* The version tooltip showed in the top navbar is now only set if you've 
+* The version tooltip showed in the top navbar is now only set if you've
   explicitly set the `development.mode` in `_pkgdown.yml` (#1768).
 
-* All heading (e.g. headings on the reference index page, and the arguments 
+* All heading (e.g. headings on the reference index page, and the arguments
   heading on the reference pages) now get anchors (#1747).
 
 * Use `autolink_bare_uris` for Pandoc above version 2.0 (@marcosmolla, #1618).
 
-* pkgdown now recognizes GitLab URLs to the source repository and adds the 
-  corresponding icon to the navbar (#1493). It also supports 
+* pkgdown now recognizes GitLab URLs to the source repository and adds the
+  corresponding icon to the navbar (#1493). It also supports
   [GitLab subgroups](https://docs.gitlab.com/ee/user/group/subgroups/)
   (@salim-b, #1532).
 
-* Links for GitHub Enterprise and GitLab Enterprise repositories are detected 
-  by assuming such host address begin with `github.` or `gitlab.` 
+* Links for GitHub Enterprise and GitLab Enterprise repositories are detected
+  by assuming such host address begin with `github.` or `gitlab.`
   (@ijlyttle, #1452).
 
 * The rules drawn by the CLI (as for example, in `build_site()`) are protected
@@ -685,7 +704,7 @@ Markdown code with chunks) (@idavydov, #2237).
 * Google Site Verification (https://support.google.com/webmasters/answer/9008080?hl=en)
   can now be configured for pkgdown sites.
 
-* `build_rmarkdown_format` sets `html_document(anchor_sections = FALSE)` 
+* `build_rmarkdown_format` sets `html_document(anchor_sections = FALSE)`
    to avoid needless dependencies (@atusy, #1426).
 
 * Jira issues in NEWS can be automatically linked by setting your project name
@@ -693,27 +712,27 @@ Markdown code with chunks) (@idavydov, #2237).
   `repo: url: issue: ...` in `_pkgdown.yml` (@jonkeane, #1466).
 
 * `build_home()` always creates citation information for the authors page,
-  using metadata from `DESCRIPTION` when there is no `inst/CITATION` file, 
+  using metadata from `DESCRIPTION` when there is no `inst/CITATION` file,
   and links to this from the sidebar (#1904).
 
-* `build_news()` no longer breaks with URLs containing numeric fragments 
+* `build_news()` no longer breaks with URLs containing numeric fragments
   (@krassowski, #1456), recognises more styles of release heading (#1437),
-  and generate stable IDs using a the combination of the heading slug and 
+  and generate stable IDs using a the combination of the heading slug and
   package number. (@Bisaloo, #1015)
 
 # pkgdown 1.6.1
 
-* The article index (used for autolinking vignettes across packages) 
+* The article index (used for autolinking vignettes across packages)
   once again works (#1401).
 
 # pkgdown 1.6.0
 
 ## Major changes
 
-* pkgdown now uses the new [downlit](https://downlit.r-lib.org/) package for all 
-  syntax highlighting and autolinking (in both reference topics and vignettes). 
-  There should be very little change in behaviour because the code in downlit 
-  was extracted from pkgdown, but this makes it easier to use pkgdown's nice 
+* pkgdown now uses the new [downlit](https://downlit.r-lib.org/) package for all
+  syntax highlighting and autolinking (in both reference topics and vignettes).
+  There should be very little change in behaviour because the code in downlit
+  was extracted from pkgdown, but this makes it easier to use pkgdown's nice
   linking/highlighting in more places (#1234).
 
 * pkgdown now uses the `ragg::agg_png()` device to generate example figures.
@@ -728,19 +747,19 @@ Markdown code with chunks) (@idavydov, #2237).
   syntax (@klmr, #1345).
 
 * `#ifdef` and `#ifndef` are now supported; the "current" OS is hard coded to
-  "unix" to ensure reproducible output regardless of where you build the 
+  "unix" to ensure reproducible output regardless of where you build the
   website (#1384).
 
-* Nested `\subsection{}`s now generate appropriate heading levels 
+* Nested `\subsection{}`s now generate appropriate heading levels
   (h3, h4, h5 etc) (#1377), and get anchor links (#1389).
 
 * `\preformatted{}` no longer double escapes its contents (#1311).
 
 ### Articles and vignettes
 
-* `build_articles()` no longer sets the `theme` argument of the document format 
+* `build_articles()` no longer sets the `theme` argument of the document format
   to `NULL` when `as_is: true`. This should allow it to work with a wider
-  range of output formats including `bookdown::html_vignette2()` and 
+  range of output formats including `bookdown::html_vignette2()` and
   friends (@GegznaV, #955, #1352).
 
 * When `build_article()` fails, it gives the complete failure message (#1379).
@@ -749,7 +768,7 @@ Markdown code with chunks) (@idavydov, #2237).
 
 ### Auto-linking and syntax highlighting
 
-* The branch used for source linking can be configured by setting 
+* The branch used for source linking can be configured by setting
   `repo: branch: branch_name` in `_pkgdown.yml` (@jonkeane, #1355):
 
     ```yaml
@@ -757,17 +776,17 @@ Markdown code with chunks) (@idavydov, #2237).
       branch: main
     ```
 
-* `autolink_html()` is (soft) deprecated. Please use 
+* `autolink_html()` is (soft) deprecated. Please use
   `downlit::downlit_html_path()` instead.
 
 * Highlighting of empty expressions works once more (#1310).
 
 * New `deploy$install_metadata` option in `_pkgdown.yml`. Setting it to
   `true` will store site metadata in the package itself, allowing offline
-  access for packages that to autolink to the package's website 
+  access for packages that to autolink to the package's website
   (@mstr3336, #1336).
 
-### Other    
+### Other
 
 * You can now control the background colour of plots with the `figures.bg`
   option (it is transparent by default, and given a white background by
@@ -779,22 +798,22 @@ Markdown code with chunks) (@idavydov, #2237).
 
 * All HTTP requests are now retried upon failure (@jameslamb, #1305).
 
-* Setting `clean = TRUE` in `deploy_site_github()` removes old files from the 
+* Setting `clean = TRUE` in `deploy_site_github()` removes old files from the
   deployed site before building a new one (#1297).
 
 # pkgdown 1.5.1
 
 * Syntax highlighting works on Windows once more (#1282).
 
-* pkgdown no longer fails if your `.Rd` files have duplicated `\aliases` 
+* pkgdown no longer fails if your `.Rd` files have duplicated `\aliases`
   as were produced by an older version of roxygen2 (#1290).
 
 * Rendering empty `.md` file now returns empty string (#1285).
 
 * `build_articles_index()` is now exported to rapidly rebuild the index (#1281)
 
-* `deploy_site_github()` now accepts a `host` argument to specify alternate 
-  hosts (e.g., Github enterprise) (@dimagor, #1165) and once again works as 
+* `deploy_site_github()` now accepts a `host` argument to specify alternate
+  hosts (e.g., Github enterprise) (@dimagor, #1165) and once again works as
   intended on Travis-CI (@jimhester, #1276).
 
 # pkgdown 1.5.0
@@ -805,8 +824,8 @@ Markdown code with chunks) (@idavydov, #2237).
   major new features in this release:
 
     * The articles index page now displays article `description`s,
-      taken from YAML metadata belonging to each article. This lets you provide 
-      more context about each article and describe why one might want to read 
+      taken from YAML metadata belonging to each article. This lets you provide
+      more context about each article and describe why one might want to read
       it (#1227).
 
     * The articles navbar is now also controlled by the `articles` section
@@ -822,7 +841,7 @@ Markdown code with chunks) (@idavydov, #2237).
   [bootstrap-toc](https://afeld.github.io/bootstrap-toc/); this considerably
   improves navigation for long articles and reference pages.
 
-* You can now control the links to source files (in reference pages and 
+* You can now control the links to source files (in reference pages and
   articles) and issues and users (in the NEWS) with new `repo$url` config
   option (#1238). This makes it easier to use pkgdown with GitHub enterprise,
   packages in subdirectories, and other source hosts (like bitbucket).
@@ -836,25 +855,25 @@ Markdown code with chunks) (@idavydov, #2237).
         user: https://github.com/
     ```
 
-    The individual components (e.g. path, issue number, username) are pasted on 
+    The individual components (e.g. path, issue number, username) are pasted on
     the end of these urls so they should have trailing `/`s.
 
-    You don't need to set these links for GitLab, as pkgdown now detects 
+    You don't need to set these links for GitLab, as pkgdown now detects
     GitLab urls automatically (since they use the same structure as GitHub)
-    (#1045). 
+    (#1045).
 
-* There's much richer control over Open Graph and Twitter metadata for the 
-  whole site and for individual articles. See new `vignette("metadata")` for 
+* There's much richer control over Open Graph and Twitter metadata for the
+  whole site and for individual articles. See new `vignette("metadata")` for
   details (@gadenbuie, #936).
 
 * New `deploy_to_branch()` function to build and deploy a site to a branch,
-  defaulting to `gh-pages` for use with GitHub Pages. This is used in our 
+  defaulting to `gh-pages` for use with GitHub Pages. This is used in our
   recommended GitHub action workflow for automatically building and deploying
   pkgdown sites for packages on GitHub (@jimhester, #1221).
 
 * Updated JS libraries: jquery 3.3.1 -> 3.4.1; bootswatch 3.3.7 -> 3.4.0;
   bootstrap 3.3.7 -> bootstrap 3.4.1; docsearch 2.6.1 -> 2.6.3;
-  fontawesome 5.11.1 -> 5.12.1; headroom.js 0.9.44 -> 0.11.0; 
+  fontawesome 5.11.1 -> 5.12.1; headroom.js 0.9.44 -> 0.11.0;
   clipboard.js 2.0.4 -> 2.0.6 (@jayhesselberth).
 
 ## Auto-linking improvements
@@ -867,7 +886,7 @@ Markdown code with chunks) (@idavydov, #2237).
 * `\preformatted{}` blocks are now highlighted and linked if they parse
   as R code (#1180).
 
-* `library(pkgdown)` is now automatically linked to the reference index for 
+* `library(pkgdown)` is now automatically linked to the reference index for
   "pkgdown" not the documentation for `library()` (#1161).
 
 * `help("topic")` is now automatically linked to the documentation for "topic",
@@ -883,10 +902,10 @@ Markdown code with chunks) (@idavydov, #2237).
 * `build_article()` failures now print more information to help you debug
   the problem (#952).
 
-* The name of the vignette mapped to the "Get started" entry in the navbar 
-  is now more flexible. You can use an article (e.g `articles/{pkgname}`) 
-  and if your package has a `.` in its name you can replace it with `-` to 
-  generate a valid article name (e.g. the get started vignette for 
+* The name of the vignette mapped to the "Get started" entry in the navbar
+  is now more flexible. You can use an article (e.g `articles/{pkgname}`)
+  and if your package has a `.` in its name you can replace it with `-` to
+  generate a valid article name (e.g. the get started vignette for
   `pack.down` would be `pack-down`) (#1166).
 
 ### Deployment
@@ -897,27 +916,27 @@ Markdown code with chunks) (@idavydov, #2237).
 * `deploy_to_branch(github_pages = TRUE)` generates a `.nojekyll` to prevent
   jekyll ever executing (#1242).
 
-* `CNAME` is no longer generated by `init_site()`, but is instead conditionally 
-  by `deploy_to_branch()` when `github_pages = TRUE`. This is a better a fit 
+* `CNAME` is no longer generated by `init_site()`, but is instead conditionally
+  by `deploy_to_branch()` when `github_pages = TRUE`. This is a better a fit
   because the `CNAME` file is only needed by GitHub pages (#969).
 
 * `deploy_site_github()` argument `repo_slug` has been deprecated and is no
   longer needed or used. (@jimhester, #1221)
 
-### News 
+### News
 See additional details in `?build_news`:
 
-* You can optionally suppress the CRAN release dates added to the news 
+* You can optionally suppress the CRAN release dates added to the news
   page (#1118).
 
-* Multi-page news style gets a better yaml specification (the old style 
+* Multi-page news style gets a better yaml specification (the old style
   will continue to work so no need to change existing YAML).
 
 ### Reference
 
 * A topic named `index` will not longer clobber the reference index (#1110).
 
-* Topic names/aliases on reference index are now escaped (#1216). 
+* Topic names/aliases on reference index are now escaped (#1216).
 
 * `build_reference()` gives better warnings if your `_pkgdown.yml` is
   constructed incorrectly (#1025).
@@ -925,22 +944,22 @@ See additional details in `?build_news`:
 * New `has_keyword()` topic selector for `reference`. `has_keyword("datasets")`
   is particularly useful for selecting all data documentation (#760).
 
-* New `lacks_concepts()` can select topics that do not contain any of 
+* New `lacks_concepts()` can select topics that do not contain any of
   a number of specified concepts. (@mikldk, #1232)
 
 ### Home, authors, and citation
 
-* pkgdown now escapes html and linkifies links in comments in author info 
+* pkgdown now escapes html and linkifies links in comments in author info
   from DESCRIPTION (@maelle, #1204)
 
-* pkgdown now uses the ORCiD logo included in Font Awesome 5.11 instead of 
+* pkgdown now uses the ORCiD logo included in Font Awesome 5.11 instead of
   querying it from members.orcid.org (@bisaloo, #1153)
 
 * badges are now extracted from everything between ``
   and ``. They used to be extracted only if they were
   direct children of the first `

` after ``. -* `build_home()` now looks for `pkgdown/index.md` in addition to the top-level +* `build_home()` now looks for `pkgdown/index.md` in addition to the top-level `index` or `README` files (@nteetor, #1031) ### Navbar @@ -949,13 +968,13 @@ See additional details in `?build_news`: as it has been specified in the DESCRIPTION file. In particular, version separators (e.g. `.` and `-`) are preserved. (#1170, @kevinushey) -* add support for navbar submenus: you can create submenus following the +* add support for navbar submenus: you can create submenus following the convention established in [rstudio/rmarkdown#721](https://github.com/rstudio/rmarkdown/issues/721) (@ijlyttle, @wendtke, #1213) ### Other * Updated JS libraries: jquery 3.3.1 -> 3.4.1; bootswatch 3.3.7 -> 3.4.0; - bootstrap 3.3.7 -> bootstrap 3.4.1; docsearch 2.6.1 -> 2.6.3 + bootstrap 3.3.7 -> bootstrap 3.4.1; docsearch 2.6.1 -> 2.6.3 (@jayhesselberth). * Markdown conversion now explicitly allows markdown inside of HTML blocks; @@ -974,9 +993,9 @@ See additional details in `?build_news`: * build citation as specified by the `textVersion` argument of `citEntry` in the `CITATION` file (#1096, @yiluheihei) -* `build_site()`, `build_reference()` and `build_home()` gain a parameter +* `build_site()`, `build_reference()` and `build_home()` gain a parameter `devel` which controls whether you're in deployment or development mode. - It generalises and replaces (with deprecation) the existing `document` + It generalises and replaces (with deprecation) the existing `document` argument. Development mode is optimised for rapid iteration and is the default @@ -988,13 +1007,13 @@ See additional details in `?build_news`: library, and runs examples/articles in a new process. * `build_reference()` no longer runs `devtools::document()` (#1079) and - `build_home()` no longer re-builds `README.Rmd` or `index.Rmd`. This makes - the scope of responsibility of pkgdown more clear: it now only + `build_home()` no longer re-builds `README.Rmd` or `index.Rmd`. This makes + the scope of responsibility of pkgdown more clear: it now only creates/modifies files in `doc/`. -* `build_home()` now strips quotes from `Title` and `Description` fields - when generating page metadata. Additionally, you can now override the - defaults via the `title` and `description` fields in the `home` section of +* `build_home()` now strips quotes from `Title` and `Description` fields + when generating page metadata. Additionally, you can now override the + defaults via the `title` and `description` fields in the `home` section of `_pkgdown.yml` (#957, @maelle). * `vignette("linking")` describes how pkgdown's automatic linking works, and @@ -1004,9 +1023,9 @@ See additional details in `?build_news`: ### Rd translation -* `\examples{}` rendering has been completely overhauled so it now first +* `\examples{}` rendering has been completely overhauled so it now first converts the entire mixed Rd-R block to R prior, and then evaluates the - whole thing. This considerably improves the fidelity of the translation + whole thing. This considerably improves the fidelity of the translation at a small cost of no longer being able to remove `\donttest{}` and friends (#1087). @@ -1018,14 +1037,14 @@ See additional details in `?build_news`: * `\tabular{}` translation handles code better (@mitchelloharawild, #978). -* `\subsection{}` contents are now treated as paragraphs, not inline text +* `\subsection{}` contents are now treated as paragraphs, not inline text (#991). * `\preformatted{}` blocks preserve important whitespace (#951). ### Front end -* Links to online documentation for functions in code chunks are no longer +* Links to online documentation for functions in code chunks are no longer displayed when printing (#1135, @bisaloo). * Updated fontawesome to v5.7.1. fontawesome 5 [deprecated the `fa` prefix](https://fontawesome.com/how-to-use/on-the-web/setup/upgrading-from-version-4#changes). @@ -1033,56 +1052,56 @@ See additional details in `?build_news`: (e.g.) `fa fa-home` to `fas fa-home`. Brands now have a separate prefix so `fa fa-github` becomes `fab fa-github` (#953). -* The navbar is now automatically hidden with +* The navbar is now automatically hidden with [headroom.js](https://wicky.nillia.ms/headroom.js/). -* The sticky behaviour of the navbar is now implemented in pure CSS instead of +* The sticky behaviour of the navbar is now implemented in pure CSS instead of relying a the 3rd party javascript library (#1016, @bisaloo) * Favicons are now automatically built from a package logo (#949). ### Linking -* Infix operators (e.g., `%in%` and `%*%`) are now linked to their +* Infix operators (e.g., `%in%` and `%*%`) are now linked to their documentation (#1082). -* Function names can now be included in headers without spurious auto-linking +* Function names can now be included in headers without spurious auto-linking (#948). -* Links to external documentation now point to [rdrr.io](https://rdrr.io) +* Links to external documentation now point to [rdrr.io](https://rdrr.io) (#998). ### Other -* News page recognises more version specifications (including the +* News page recognises more version specifications (including the "(development version)" now used by usethis) (#980). * Subdirectories are supported for assets (#939, @ijlyttle). -* A default 404 page (`404.html`) is built, unless a custom `.github/404.md` +* A default 404 page (`404.html`) is built, unless a custom `.github/404.md` is provided (#947). -* `build_article()` now uses the raw vignette title as page `` +* `build_article()` now uses the raw vignette title as page `<title>` and `og:title` (@maelle, #1037). -* `build_home()` now looks for license files spelled either as LICENSE or +* `build_home()` now looks for license files spelled either as LICENSE or LICENCE (#972). -* `build_home()` can find badges in paragraph coming after the comment +* `build_home()` can find badges in paragraph coming after the comment `<!-- badges: start -->` (#670, @gaborcsardi, @maelle). -* `build_home()` will add a community section to the sidebar if there is either - a code of conduct (`.github/CODE_OF_CONDUCT.md`) or a contributing guide +* `build_home()` will add a community section to the sidebar if there is either + a code of conduct (`.github/CODE_OF_CONDUCT.md`) or a contributing guide (`.github/CONTRIBUTING.md`) (#1044, @maelle). * `build_reference()` gains a `topics` argument which allows you to re-build only specified topics. -* `build_site(new_process = TRUE)` gains a timeout, - `options(pkgdown.timeout = 10)`, that can be used to prevent stalled - builds. +* `build_site(new_process = TRUE)` gains a timeout, + `options(pkgdown.timeout = 10)`, that can be used to prevent stalled + builds. -* `deploy_site_github(install = FALSE)` makes it possible to opt out of +* `deploy_site_github(install = FALSE)` makes it possible to opt out of installation. * `dev_mode()` now recognises `0.1.9000` as a development version of a package @@ -1099,7 +1118,7 @@ See additional details in `?build_news`: * `content-home.html` template is no longer used when the homepage is an `.Rmd` (Reverts #834. Fixes #927, #929) -* `deploy_site_github()` now passes parameters to `build_site()` +* `deploy_site_github()` now passes parameters to `build_site()` (@noamross, #922), and the documentation gives slightly better advice. * Correct off-by-one error in navbar highlighting javascript; now no navbar @@ -1118,9 +1137,9 @@ See additional details in `?build_news`: See documentation for how to set up details (@jimhester). * `build_favicon()` creates high resolution favicons from the package logo, - and saves them in `pkgdown/`. They are created using the - <https://realfavicongenerator.net/> API, and are better suited for modern web - usage (e.g. retina display screens, desktop shortcuts, etc.). This also + and saves them in `pkgdown/`. They are created using the + <https://realfavicongenerator.net/> API, and are better suited for modern web + usage (e.g. retina display screens, desktop shortcuts, etc.). This also removes the dependency on the magick package, making automated deployment a little easier (@bisaloo, #883). @@ -1131,25 +1150,25 @@ See additional details in `?build_news`: * `rd2html()` is now exported to facilitate creation of translation reprexes. -* `\Sexpr{}` conversion supports multiple arguments, eliminating +* `\Sexpr{}` conversion supports multiple arguments, eliminating `x must be a string or a R connection` errors when using `\doi{}` (#738). * `\tabular{}` conversion better handles empty cells (#780). -* `\usage{}` now supports qualified functions eliminating +* `\usage{}` now supports qualified functions eliminating `Error in fun_info(x) : Unknown call: ::` errors (#795). * Invalid tags now generate more informative errors (@BarkleyBG, #771, #891) ## Front end -* The default footer now displays the version of pkgdown used to build - the site (#876). +* The default footer now displays the version of pkgdown used to build + the site (#876). * All third party resources are now fetched from a single CDN and are give a SRI hash (@bisaloo, #893). -* The navbar version now has class "version" so you can more easily control +* The navbar version now has class "version" so you can more easily control its display (#680). * The default css has been tweaked to ensure that icons are visible on all @@ -1159,14 +1178,14 @@ See additional details in `?build_news`: ### Home page -* Can now build sites for older packages that don't have a `Authors@R` field +* Can now build sites for older packages that don't have a `Authors@R` field (#727). * Remote urls ending in `.md` are no longer tweaked to end in `.html` (#763). * Bug report link is only shown if there's a "BugReports" field (#855). -* `content-home.html` template is now used when the homepage is an `.Rmd` +* `content-home.html` template is now used when the homepage is an `.Rmd` (@goldingn, #787). * A link to the source `inst/CITATION` was added to the authors page (#714). @@ -1179,12 +1198,12 @@ See additional details in `?build_news`: * Unexported functions and test helpers are no longer loaded (#789). -* Selectors that do not match topics now generate a warning. If none of the +* Selectors that do not match topics now generate a warning. If none of the specified selectors have a match, no topics are selected (#728). ### Articles -* The display depth of vignette tables of contents can be configured by +* The display depth of vignette tables of contents can be configured by setting `toc: depth` in `_pkgdown.yml` (#821): ```yaml @@ -1197,7 +1216,7 @@ See additional details in `?build_news`: * `init_site()` now creates a CNAME file if one doesn't already exist and the site's metadata includes a `url` field. -* `build_site()` loses vestigal `mathjax` parameter. This didn't appear to do +* `build_site()` loses vestigal `mathjax` parameter. This didn't appear to do anything and no one could remember why it existed (#785). * `build_site()` now uses colours even if `new_process = TRUE` (@jimhester). @@ -1206,40 +1225,40 @@ See additional details in `?build_news`: ## New features -* `build_reference()` and `build_site()` get new `document` argument. When - `TRUE`, the default, will automatically run `devtools::document()` to +* `build_reference()` and `build_site()` get new `document` argument. When + `TRUE`, the default, will automatically run `devtools::document()` to ensure that your documentation is up to date. * `build_site()` gains a `new_process` argument, which defaults to `TRUE`. This will run pkgdown in a separate process, and is recommended practice because it improves reproducibility (#647). -* Improved display for icons: icons must be 30px and stored in top-level - `icons/` directory. They are embedded in a separate column of reference +* Improved display for icons: icons must be 30px and stored in top-level + `icons/` directory. They are embedded in a separate column of reference index table, instead of being inside a comment (!) (#607). ## Front end -* Added a keyboard shortcut for searching. Press `shift` + `/` (`?`) to move - focus to the search bar (#642). +* Added a keyboard shortcut for searching. Press `shift` + `/` (`?`) to move + focus to the search bar (#642). * The Algolia logo is correctly shown in the search results (#673). -* Navbar active tab highlighting uses a superior approach (suggested by +* Navbar active tab highlighting uses a superior approach (suggested by @jcheng5) which should mean that the active page is correctly highlighted in all scenarios (#660). -* `pkgdown.js` is better isolated so it should still work even if you +* `pkgdown.js` is better isolated so it should still work even if you load html widgets that import a different version of jquery (#655). ## Improvements to Rd translation -* `vignette()` calls that don't link to existing vignettes silently fail - to link instead of generating an uninformative error messages (#652). - Automatic linking works for re-exported objects that are not functions +* `vignette()` calls that don't link to existing vignettes silently fail + to link instead of generating an uninformative error messages (#652). + Automatic linking works for re-exported objects that are not functions (@gaborcsardi, #666). -* Empty `\section{}`s are ignored (#656). Previously, empty sections caused +* Empty `\section{}`s are ignored (#656). Previously, empty sections caused error `Error in rep(TRUE, length(x) - 1)`. * `\Sexpr{}` supports `results=text`, `results=Rd` and `results=hide` (#651). @@ -1248,13 +1267,13 @@ See additional details in `?build_news`: ## Minor bug fixes and improvements -* Add `inst/pkgdown.yml` as a possible site configuration file so that packages +* Add `inst/pkgdown.yml` as a possible site configuration file so that packages on CRAN can be built without needing the development version (#662). -* Default navbar template now uses site title, not package name (the package +* Default navbar template now uses site title, not package name (the package name is the default title, so this will not affect most sites) (#654). -* You can suppress indexing by search engines by setting `noindex: true` +* You can suppress indexing by search engines by setting `noindex: true` `pkgdown.yml` (#686) ```yaml @@ -1263,29 +1282,29 @@ See additional details in `?build_news`: noindex: true ``` -* `build_article()` sets `IN_PKGDOWN` env var so `in_pkgdown()` works +* `build_article()` sets `IN_PKGDOWN` env var so `in_pkgdown()` works (#650). * `build_home()`: CITATION files with non-UTF-8 encodings (latin1) work - correctly, instead of generating an error. For non-UTF-8 locales, ensure you - have e.g. `Encoding: latin1` in your `DESCRIPTION`; but best practice is to + correctly, instead of generating an error. For non-UTF-8 locales, ensure you + have e.g. `Encoding: latin1` in your `DESCRIPTION`; but best practice is to re-enode your CITATION file to UTF-8 (#689). -* `build_home()`: Markdown files (e.g., `CODE_OF_CONDUCT.md`) stored in +* `build_home()`: Markdown files (e.g., `CODE_OF_CONDUCT.md`) stored in `.github/` are copied and linked correctly (#682). * `build_news()`: Multi-page changelogs (generated from `NEWS.md` with `news: one_page: false` in `_pkgdown.yml`) are rendered correctly. -* `build_reference()`: reference index shows infix functions (like `%+%`) as +* `build_reference()`: reference index shows infix functions (like `%+%`) as `` `%+%` ``, not `` `%+%`() `` on (#659). # pkgdown 1.0.0 * Major refactoring of path handling. `build_` functions no longer take - `path` or `depth` arguments. Instead, set the `destination` directory + `path` or `depth` arguments. Instead, set the `destination` directory at the top level of `pkgdown.yml`. * Similarly, `build_news()` no longer takes a `one_page` argument; - this should now be specified in the `_pkgdown.yml` instead. See the + this should now be specified in the `_pkgdown.yml` instead. See the documentation for an example. diff --git a/R/build-article.R b/R/build-article.R index c5dc5713a..05f6867fa 100644 --- a/R/build-article.R +++ b/R/build-article.R @@ -113,6 +113,10 @@ build_rmarkdown_article <- function(pkg, input_path = path_dir(input_path), pkg = pkg ) + # Need re-active navbar now that we now the target path + update_html(path, function(html) { + activate_navbar(html, path_rel(path, pkg$dst_path), pkg) + }) } if (digest != file_digest(output_path)) { writing_file(path_rel(output_path, pkg$dst_path), output_file) diff --git a/R/build-home-authors.R b/R/build-home-authors.R index ad5e6c003..8a7100e52 100644 --- a/R/build-home-authors.R +++ b/R/build-home-authors.R @@ -46,8 +46,8 @@ data_authors <- function(pkg = ".", roles = default_roles(), call = caller_env() main = main, inst = inst, needs_page = more_authors || length(comments) > 0 || !is.null(inst), - before = config_pluck_markdown_block(pkg, "template.authors.before", call = call), - after = config_pluck_markdown_block(pkg, "template.authors.after", call = call) + before = config_pluck_markdown_block(pkg, "authors.before", call = call), + after = config_pluck_markdown_block(pkg, "authors.after", call = call) )) } @@ -272,10 +272,14 @@ citation_provided <- function(src_path) { } citation_auto <- function(pkg) { - cit_info <- utils::packageDescription( - path_file(pkg$src_path), - lib.loc = path_dir(pkg$src_path) - ) + desc <- read_desc(pkg$src_path) + cit_info <- as.list(desc$get(desc$fields())) + # utils::packageDescription( + # pkg$package, + # lib.loc = path_dir(pkg$src_path) + # ) + # browser() +# C cit_info$`Date/Publication` <- cit_info$`Date/Publication` %||% Sys.time() if (!is.null(cit_info$Title)) cit_info$Title <- str_squish(cit_info$Title) diff --git a/R/build-home-index.R b/R/build-home-index.R index 85cbbfa7e..d705c15b9 100644 --- a/R/build-home-index.R +++ b/R/build-home-index.R @@ -108,7 +108,7 @@ data_home_sidebar <- function(pkg = ".", call = caller_env()) { "home.sidebar.structure", default = default_sidebar_structure(), call = call - ) + ) # compute all default sections default_components <- list( @@ -122,7 +122,7 @@ data_home_sidebar <- function(pkg = ".", call = caller_env()) { ) needs_components <- setdiff(structure, names(default_components)) - custom_yaml <- config_pluck_sidebar_components(pkg, needs_components, call = call) + custom_yaml <- config_pluck_sidebar_components(pkg, needs_components, call = call) custom_components <- purrr::map(custom_yaml, function(x) { sidebar_section(x$title, markdown_text_block(pkg, x$text)) }) @@ -140,11 +140,11 @@ default_sidebar_structure <- function() { config_pluck_sidebar_components <- function(pkg, new_components, call = caller_env()) { base_path <- "home.sidebar.components" components <- config_pluck_list(pkg, base_path, has_names = new_components, call = call) - + for (name in names(components)) { component <- components[[name]] component_path <- paste0(base_path, ".", name) - + config_pluck_list(pkg, component_path, has_names = c("title", "text"), call = call) config_pluck_string(pkg, paste0(component_path, ".title"), call = call) config_pluck_string(pkg, paste0(component_path, ".text"), call = call) @@ -158,10 +158,15 @@ data_home_sidebar_links <- function(pkg = ".") { repo <- cran_link(pkg$package) links <- config_pluck(pkg, "home.links") + bug_reports <- pkg$desc$get_field("BugReports", default = NULL) + if (!is.null(bug_reports) && grepl("@", bug_reports) && !startsWith(bug_reports, "http")) { + bug_reports <- paste0("mailto:", bug_reports) + } + links <- c( link_url(sprintf(tr_("View on %s"), repo$repo), repo$url), link_url(tr_("Browse source code"), repo_home(pkg)), - link_url(tr_("Report a bug"), pkg$desc$get_field("BugReports", default = NULL)), + link_url(tr_("Report a bug"), bug_reports), purrr::map_chr(links, ~ link_url(.$text, .$href)) ) diff --git a/R/build-home.R b/R/build-home.R index ec06a6e64..357e3ee8c 100644 --- a/R/build-home.R +++ b/R/build-home.R @@ -152,7 +152,7 @@ #' #' ## Additional control via YAML #' -#' You can control additinal aspects of the authors display via the `authors` +#' You can control additional aspects of the authors display via the `authors` #' YAML field: #' #' * display of each author in the footer, sidebar and authors page, diff --git a/R/build-news.R b/R/build-news.R index 97b1ca46c..dff8a2300 100644 --- a/R/build-news.R +++ b/R/build-news.R @@ -192,7 +192,7 @@ data_news <- function(pkg, call = caller_env() ) { } else { timeline <- NULL } - + purrr::walk2( sections, versions, @@ -279,12 +279,11 @@ pkg_timeline <- function(package) { } content <- httr2::resp_body_json(resp) - timeline <- content$timeline + timeline <- unlist(content$timeline) data.frame( version = names(timeline), - date = as.Date(unlist(timeline)), - stringsAsFactors = FALSE, + date = as.Date(timeline), row.names = NULL ) } diff --git a/R/build-quarto-articles.R b/R/build-quarto-articles.R index b50aa4171..148fbb318 100644 --- a/R/build-quarto-articles.R +++ b/R/build-quarto-articles.R @@ -1,5 +1,4 @@ build_quarto_articles <- function(pkg = ".", article = NULL, quiet = TRUE) { - check_required("quarto") pkg <- as_pkgdown(pkg) qmds <- pkg$vignettes[pkg$vignettes$type == "qmd", ] @@ -9,7 +8,17 @@ build_quarto_articles <- function(pkg = ".", article = NULL, quiet = TRUE) { if (nrow(qmds) == 0) { return() } - + if (pkg$bs_version < 5) { + cli::cli_abort(c( + "Quarto articles require Bootstrap 5.", + "i" = "See details at {.url https://pkgdown.r-lib.org/articles/customise.html#getting-started}"), + call = NULL + ) + } + check_installed("quarto") + if (quarto::quarto_version() < "1.5") { + cli::cli_abort("Quarto articles require version 1.5 and above.", call = NULL) + } # 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) { @@ -33,6 +42,12 @@ build_quarto_articles <- function(pkg = ".", article = NULL, quiet = TRUE) { } output_dir <- quarto_render(pkg, src_path, quiet = quiet) + # check for articles (in the `vignette/articles` sense) + article_dir <- fs::path(output_dir,"articles") + if (fs::dir_exists(article_dir)){ + fs::file_move(dir_ls(article_dir), output_dir) + } + # 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")) diff --git a/R/build-reference-index.R b/R/build-reference-index.R index 15d08ad85..7dab32c9c 100644 --- a/R/build-reference-index.R +++ b/R/build-reference-index.R @@ -181,7 +181,10 @@ check_missing_topics <- function(rows, pkg, error_call = caller_env()) { pkg, c( "{sum(missing)} topic{?s} missing from index: {.val {pkg$topics$name[missing]}}.", - i = "Either use {.code @keywords internal} to drop from index, or" + i = paste( + "Either add to the reference index,", + "or use {.code @keywords internal} to drop from the index." + ) ), call = error_call ) diff --git a/R/build.R b/R/build.R index 4870f6dfc..5b7b4022a 100644 --- a/R/build.R +++ b/R/build.R @@ -236,13 +236,24 @@ #' ``` #' #' * `home`: path to package home on source code repository. -#' * `source:`: path to source of individual file in default branch. +#' * `source`: path to source of individual file in default branch +#' (more on that below). #' * `issue`: path to individual issue. #' * `user`: path to user. #' #' The varying components (e.g. path, issue number, user name) are pasted on #' the end of these URLs so they should have trailing `/`s. #' +#' When creating the link to a package source, we have to link to a specific +#' branch. The default behaviour is to use current branch when in GitHub +#' actions and `HEAD` otherwise. You can overide this default with +#' `repo.branch`: +#' +#' ```yaml +#' repo: +#' branch: devel +#' ``` +#' #' pkgdown can automatically link to Jira issues as well if specify both a #' custom `issue` URL as well Jira project names to auto-link in #' `jira_projects`. You can specify as many projects as you would like: @@ -254,15 +265,6 @@ #' issue: https://jira.organisation.com/jira/browse/ #' ``` #' -#' pkgdown defaults to using the "HEAD" branch for source file URLs. This can -#' be configured to use a specific branch when linking to source files by -#' specifying a branch name: -#' -#' ```yaml -#' repo: -#' branch: devel -#' ``` -#' #' # Deployment (`deploy`) #' There is a single `deploy` field #' diff --git a/R/check-built.R b/R/check-built.R index 3f78e2a30..6c55eac1a 100644 --- a/R/check-built.R +++ b/R/check-built.R @@ -14,7 +14,7 @@ check_missing_images <- function(pkg, src_path, dst_path) { img <- xml2::xml_find_all(html, ".//img") src <- xml2::xml_attr(img, "src") - rel_src <- src[xml2::url_parse(src)$scheme == ""] + rel_src <- xml2::url_unescape(src[xml2::url_parse(src)$scheme == ""]) rel_path <- path_norm(path(path_dir(dst_path), rel_src)) exists <- file_exists(path(pkg$dst_path, rel_path)) diff --git a/R/clean.R b/R/clean.R index 6c4ba235d..6ed83b5b8 100644 --- a/R/clean.R +++ b/R/clean.R @@ -3,9 +3,11 @@ #' Delete all files in `docs/` (except for `CNAME`). #' #' @param quiet If `TRUE`, suppresses a message. +#' @param force If `TRUE`, delete contents of `docs` even if it is not a pkgdown site. #' @inheritParams build_site +#' @rdname clean #' @export -clean_site <- function(pkg = ".", quiet = FALSE) { +clean_site <- function(pkg = ".", quiet = FALSE, force = FALSE) { pkg <- as_pkgdown(pkg) @@ -15,8 +17,10 @@ clean_site <- function(pkg = ".", quiet = FALSE) { if (!dir_exists(pkg$dst_path)) return(invisible()) - check_dest_is_pkgdown(pkg) top_level <- dest_files(pkg) + if (length(top_level) > 0 && !force) { + check_dest_is_pkgdown(pkg) + } is_dir <- is_dir(top_level) dir_delete(top_level[is_dir]) @@ -25,6 +29,30 @@ clean_site <- function(pkg = ".", quiet = FALSE) { invisible(TRUE) } +#' Clean cache +#' +#' Delete all files in the pkgdown cache directory. +#' +#' @rdname clean +#' @export +clean_cache <- function(pkg = ".", quiet = FALSE) { + + pkg <- as_pkgdown(pkg) + cache_path <- tools::R_user_dir("pkgdown", "cache") + + if (dir_exists(cache_path)) { + if (!quiet) { + cli::cli_inform( + "Cleaning {.pkg {pkg$package}} cache files from {.path {cache_path}}" + ) + } + + dir_delete(cache_path) + } + + invisible(TRUE) +} + check_dest_is_pkgdown <- function(pkg) { if (file_exists(path(pkg$dst_path, "pkgdown.yml"))) { return() @@ -33,7 +61,7 @@ check_dest_is_pkgdown <- function(pkg) { 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." + and use {.run pkgdown::clean_site(force = TRUE)} to delete its contents." ) ) } @@ -43,6 +71,6 @@ dest_files <- function(pkg) { character() } else { top_level <- dir_ls(pkg$dst_path) - top_level[!path_file(top_level) %in% c("CNAME", "dev")] + top_level[!path_file(top_level) %in% c("CNAME", "dev")] } } diff --git a/R/highlight.R b/R/highlight.R index 19ce4f061..07fb15288 100644 --- a/R/highlight.R +++ b/R/highlight.R @@ -28,8 +28,22 @@ highlight_examples <- function(code, topic, env = globalenv()) { do.call(fig_save, c(list(plot, name), fig_settings())) } - hide_dontshow <- function(src, call) { - if (is_call(call, c("DONTSHOW", "TESTONLY"))) NULL else src + hide_dontshow <- function(src, expr) { + if (is.expression(expr)) { + # evaluate 1.0.0 + if (length(expr) > 0) { + hide <- is_call(expr[[1]], c("DONTSHOW", "TESTONLY")) + } else { + hide <- FALSE + } + } else if (is.call(expr)) { + # evaluate 0.24.0 + hide <- is_call(expr, c("DONTSHOW", "TESTONLY")) + } else { + hide <- FALSE + } + + if (hide) NULL else src } handler <- evaluate::new_output_handler( value = pkgdown_print, diff --git a/R/markdown.R b/R/markdown.R index 0cbdb2b31..8fae5ef21 100644 --- a/R/markdown.R +++ b/R/markdown.R @@ -8,7 +8,7 @@ markdown_text <- function(pkg, text, ...) { markdown_path_html(pkg, md_path, ...) } -markdown_text_inline <- function(pkg, +markdown_text_inline <- function(pkg, text, error_path, error_call = caller_env()) { @@ -62,7 +62,7 @@ markdown_body <- function(pkg, path, strip_header = FALSE) { markdown_path_html <- function(pkg, path, strip_header = FALSE) { html_path <- withr::local_tempfile() convert_markdown_to_html(pkg, path, html_path) - xml <- xml2::read_html(html_path, encoding = "UTF-8") + xml <- read_html_keep_ansi(html_path) if (!inherits(xml, "xml_node")) { return(NULL) } diff --git a/R/navbar.R b/R/navbar.R index d7064fac4..6e887a6cb 100644 --- a/R/navbar.R +++ b/R/navbar.R @@ -1,4 +1,4 @@ -data_navbar <- function(pkg = ".", depth = 0L) { +data_navbar <- function(pkg = ".", depth = 0L, call = caller_env()) { pkg <- as_pkgdown(pkg) navbar <- config_pluck(pkg, "navbar") @@ -13,7 +13,7 @@ data_navbar <- function(pkg = ".", depth = 0L) { ) } - links <- navbar_links(pkg, depth = depth) + links <- navbar_links(pkg, depth = depth, call = call) c(style, links) } @@ -43,12 +43,31 @@ navbar_structure <- function() { )) } -navbar_links <- function(pkg, depth = 0L) { - # Combine default components with user supplied - components <- modify_list( - navbar_components(pkg), - config_pluck(pkg, "navbar.components") +navbar_links <- function(pkg, depth = 0L, call = caller_env()) { + components <- navbar_link_components(pkg, call = call) + + list( + left = render_navbar_links( + components$left, + depth = depth, + pkg = pkg, + side = "left" + ), + right = render_navbar_links( + components$right, + depth = depth, + pkg = pkg, + side = "right" + ) ) +} + +navbar_link_components <- function(pkg, call = caller_env()) { + # Combine default components with user supplied: must not merge recursively + components <- navbar_components(pkg) + components_meta <- config_pluck(pkg, "navbar.components", default = list()) + components[names(components_meta)] <- components_meta + components <- purrr::compact(components) # Combine default structure with user supplied # (must preserve NULLs in yaml to mean display nothing) @@ -57,31 +76,18 @@ navbar_links <- function(pkg, depth = 0L) { config_pluck(pkg, "navbar.structure") ) right_comp <- intersect( - config_pluck_character(pkg, "navbar.structure.right"), + config_pluck_character(pkg, "navbar.structure.right", call = call), names(components) ) left_comp <- intersect( - config_pluck_character(pkg, "navbar.structure.left"), + config_pluck_character(pkg, "navbar.structure.left", call = call), names(components) ) # Backward compatibility left <- config_pluck(pkg, "navbar.left") %||% components[left_comp] right <- config_pluck(pkg, "navbar.right") %||% components[right_comp] - list( - left = render_navbar_links( - left, - depth = depth, - pkg = pkg, - side = "left" - ), - right = render_navbar_links( - right, - depth = depth, - pkg = pkg, - side = "right" - ) - ) + list(left = left, right = right) } render_navbar_links <- function(x, depth = 0L, pkg, side = c("left", "right")) { diff --git a/R/package.R b/R/package.R index 7b0068722..bda66d23f 100644 --- a/R/package.R +++ b/R/package.R @@ -75,7 +75,7 @@ as_pkgdown <- function(pkg = ".", override = list()) { if (!is.null(pkg$meta$url)) { pkg$meta$url <- sub("/$", "", pkg$meta$url) } - + pkg$development <- meta_development(pkg) pkg$prefix <- pkg$development$prefix @@ -85,7 +85,7 @@ as_pkgdown <- function(pkg = ".", override = list()) { pkg$dst_path <- path(pkg$dst_path, pkg$development$destination) } - pkg$lang <- pkg$meta$lang %||% "en" + pkg$lang <- get_pkg_lang(pkg) pkg$install_metadata <- config_pluck_bool(pkg, "deploy.install_metadata", FALSE) pkg$figures <- meta_figures(pkg) pkg$repo <- package_repo(pkg) @@ -106,6 +106,21 @@ read_desc <- function(path = ".") { desc::description$new(path) } +get_pkg_lang <- function(pkg) { + if (!is.null(pkg$meta$lang)) { + return(pkg$meta$lang) + } + + if (pkg$desc$has_fields("Language")) { + field <- pkg$desc$get_field("Language") + if (length(field) && nchar(field) > 0) { + return(regmatches(field, regexpr("[^,]+", field))) + } + } + + return("en") +} + get_bootstrap_version <- function(pkg, template, template_package = NULL, @@ -270,7 +285,7 @@ extract_lifecycle <- function(x) { fig <- extract_figure(desc) if (!is.null(fig) && length(fig) > 0 && length(fig[[1]]) > 0) { - path <- as.character(fig[[1]][[1]]) + path <- as.character(fig[[1]][[1]]) if (grepl("lifecycle", path)) { name <- gsub("lifecycle-", "", path) name <- path_ext_remove(name) @@ -351,12 +366,12 @@ 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( diff --git a/R/rd-example.R b/R/rd-example.R index 134796633..62d2d56ca 100644 --- a/R/rd-example.R +++ b/R/rd-example.R @@ -63,7 +63,7 @@ process_conditional_examples <- function(rd) { if (isTRUE(cond)) { remove <- c(remove, idx, idx + 1L) } else { - cond_expr_str <- paste(deparse(cond_expr), collapse = " ") + cond_expr_str <- deparse1(cond_expr) is_false <- cond_expr_str == "FALSE" if (!is_false) { new_cond <- paste0("if (FALSE) { # ", cond_expr_str) diff --git a/R/render.R b/R/render.R index 51fad944f..f64fcdfbb 100644 --- a/R/render.R +++ b/R/render.R @@ -29,9 +29,7 @@ render_page <- function(pkg = ".", name, data, path, depth = NULL, quiet = FALSE html <- render_page_html(pkg, name = name, data = data, depth = depth) tweak_page(html, name, pkg = pkg) - if (pkg$bs_version > 3) { - activate_navbar(html, data$output_file %||% path, pkg) - } + activate_navbar(html, data$output_file %||% path, pkg) rendered <- as.character(html, options = character()) write_if_different(pkg, rendered, path, quiet = quiet) @@ -165,7 +163,7 @@ check_open_graph <- function(pkg, og, file_path = NULL, call = caller_env()) { if (is.null(og)) { return() } - + is_yaml <- is.null(file_path) base_path <- if (is_yaml) "template.opengraph" else "opengraph" @@ -222,7 +220,7 @@ check_open_graph_list <- function(pkg, } not <- obj_type_friendly(x) config_abort( - pkg, + pkg, "{.field {error_path}} must be a list, not {not}.", path = file_path, call = error_call @@ -261,7 +259,7 @@ same_contents <- function(path, contents) { cur_contents <- paste0(read_lines(path), collapse = "\n") cur_hash <- digest::digest(cur_contents, serialize = FALSE) - + identical(new_hash, cur_hash) } diff --git a/R/test.R b/R/test.R index b3e01d286..db9928ddd 100644 --- a/R/test.R +++ b/R/test.R @@ -129,7 +129,7 @@ NULL #' x <- 4 #' } #' x # should be 1 -#' +#' #' # \dontshow{} ------------------------------------------------------- #' # never shown, always run #' @@ -145,7 +145,7 @@ NULL #' # If FALSE, wrapped in if; if TRUE, not seen #' #' x <- 1 -#' +#' #' @examplesIf FALSE #' x <- 2 #' @examplesIf TRUE @@ -275,3 +275,17 @@ NULL #' @keywords internal #' @family tests NULL + +#' Test case: math rendering in examples +#' +#' @param x \eqn{f(x) > 0}: inline equation +#' +#' @details +#' Display equation: +#' +#' \deqn{y = \alpha + \beta X + \varepsilon} +#' +#' @name test-math-examples +#' @keywords internal +#' @family tests +NULL diff --git a/R/tweak-navbar.R b/R/tweak-navbar.R index cb391490b..d0d96a2b3 100644 --- a/R/tweak-navbar.R +++ b/R/tweak-navbar.R @@ -1,19 +1,21 @@ -activate_navbar <- function(html, path, pkg = list()) { +activate_navbar <- function(html, path, pkg = list(bs_version = 5)) { + if (pkg$bs_version <= 3) { + return() + } + path <- remove_useless_parts(path, pkg = pkg) # Get nav items, their links, their similarity to the current path navbar_haystack <- navbar_links_haystack(html, pkg, path) - - # Nothing similar if (nrow(navbar_haystack) == 0) { return() } # Pick the most similar link, activate the corresponding nav item - tweak_class_prepend( - navbar_haystack$nav_item[which.max(navbar_haystack$similar)][[1]], - "active" - ) + best_match <- navbar_haystack[which.max(navbar_haystack$similar), ] + tweak_class_prepend(best_match$nav_item[[1]], "active") + + invisible() } navbar_links_haystack <- function(html, pkg, path) { diff --git a/R/tweak-page.R b/R/tweak-page.R index 3349dc469..6134c43d5 100644 --- a/R/tweak-page.R +++ b/R/tweak-page.R @@ -47,10 +47,16 @@ tweak_rmarkdown_html <- function(html, input_path, pkg = list(bs_version = 3)) { src <- xml2::xml_attr(img, "src") abs_src <- is_absolute_path(src) if (any(abs_src)) { + img_target_nodes <- img[abs_src] + img_src_real <- path_real(xml2::url_unescape(src[abs_src])) + input_path_real <- path_real(xml2::url_unescape(input_path)) + img_rel_paths <- path_rel(path = img_src_real, start = input_path_real) + img_rel_paths <- xml2::url_escape(img_rel_paths, reserved="/") + purrr::walk2( - img[abs_src], - path_rel(path_real(src[abs_src]), path_real(input_path)), - xml2::xml_set_attr, + .x = img_target_nodes, + .y = img_rel_paths, + .f = xml2::xml_set_attr, attr = "src" ) } @@ -90,14 +96,19 @@ tweak_useless_toc <- function(html) { # Update file on disk ----------------------------------------------------- -update_html <- function(path, tweak, ...) { - +read_html_keep_ansi <- function(path) { raw <- read_file(path) # Following the xml 1.0 spec, libxml2 drops low-bit ASCII characters # so we convert to \u2029, relying on downlit to convert back in # token_escape(). raw <- gsub("\033", "\u2029", raw, fixed = TRUE) - html <- xml2::read_html(raw, encoding = "UTF-8") + # Use charToRaw() to always interpret as string, + # even for length 1 vectors + xml2::read_html(charToRaw(raw), encoding = "UTF-8") +} + +update_html <- function(path, tweak, ...) { + html <- read_html_keep_ansi(path) tweak(html, ...) xml2::write_html(html, path, format = FALSE) diff --git a/R/usage.R b/R/usage.R index 1c4631fa0..6ecc78e71 100644 --- a/R/usage.R +++ b/R/usage.R @@ -19,7 +19,7 @@ as_data.tag_usage <- function(x, ...) { lines <- strsplit(text, "\n", fixed = TRUE)[[1]] parsed <- lapply(lines, function(x) tryCatch(parse(text = x)[[1]], error = function(e) NULL)) needs_tweak <- function(x) { - is_call(x) && !is_call(x, "=") && !is_syntactic(x[[1]]) + is_call(x) && !is_call(x, "=") && (is_symbol(x[[1]]) && !is_syntactic(x[[1]])) } to_tweak <- vapply(parsed, needs_tweak, logical(1)) lines[to_tweak] <- vapply(parsed[to_tweak], deparse1, character(1)) diff --git a/R/utils.R b/R/utils.R index 7f84d5e5c..abd609dd3 100644 --- a/R/utils.R +++ b/R/utils.R @@ -109,7 +109,6 @@ re_match <- function(text, pattern, perl = TRUE, ...) { matchstr[ start == -1 ] <- NA_character_ res <- data.frame( - stringsAsFactors = FALSE, .text = text, .match = matchstr ) @@ -124,7 +123,7 @@ re_match <- function(text, pattern, perl = TRUE, ...) { groupstr[ gstart == -1 ] <- NA_character_ dim(groupstr) <- dim(gstart) - res <- cbind(groupstr, res, stringsAsFactors = FALSE) + res <- cbind(groupstr, res) } names(res) <- c(attr(match, "capture.names"), ".text", ".match") diff --git a/cran-comments.md b/cran-comments.md index 8114d3191..e15572385 100644 --- a/cran-comments.md +++ b/cran-comments.md @@ -4,4 +4,7 @@ ## revdepcheck results -I checked all 139 revdeps and did not see any problems. \ No newline at end of file +We checked 144 reverse dependencies, comparing R CMD check results across CRAN and dev versions of this package. + + * We saw 0 new problems + * We failed to check 3 packages: clusttree, multinma, and scDiffCom diff --git a/inst/BS3/templates/head.html b/inst/BS3/templates/head.html index b569a901e..70037b385 100644 --- a/inst/BS3/templates/head.html +++ b/inst/BS3/templates/head.html @@ -6,12 +6,11 @@ {{#has_favicons}} <!-- favicons --> -<link rel="icon" type="image/png" sizes="16x16" href="{{#site}}{{root}}{{/site}}favicon-16x16.png"> -<link rel="icon" type="image/png" sizes="32x32" href="{{#site}}{{root}}{{/site}}favicon-32x32.png"> -<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="{{#site}}{{root}}{{/site}}apple-touch-icon.png" /> -<link rel="apple-touch-icon" type="image/png" sizes="120x120" href="{{#site}}{{root}}{{/site}}apple-touch-icon-120x120.png" /> -<link rel="apple-touch-icon" type="image/png" sizes="76x76" href="{{#site}}{{root}}{{/site}}apple-touch-icon-76x76.png" /> -<link rel="apple-touch-icon" type="image/png" sizes="60x60" href="{{#site}}{{root}}{{/site}}apple-touch-icon-60x60.png" /> +<link rel="icon" type="image/png" sizes="48x48" href="{{#site}}{{root}}{{/site}}favicon-48x48.png"> +<link rel="icon" type=”image/svg+xml” href="{{#site}}{{root}}{{/site}}favicon.svg"> +<link rel="apple-touch-icon" sizes="180x180" href="{{#site}}{{root}}{{/site}}apple-touch-icon.png"> +<link rel="icon" sizes="any" href="{{#site}}{{root}}{{/site}}favicon.ico" > +<link rel="manifest" href="{{#site}}{{root}}{{/site}}site.webmanifest"> {{/has_favicons}} <!-- jquery --> diff --git a/inst/BS5/assets/pkgdown.js b/inst/BS5/assets/pkgdown.js index 9757bf9ef..1a99c65f5 100644 --- a/inst/BS5/assets/pkgdown.js +++ b/inst/BS5/assets/pkgdown.js @@ -152,3 +152,11 @@ async function searchFuse(query, callback) { }); }); })(window.jQuery || window.$) + +document.addEventListener('keydown', function(event) { + // Check if the pressed key is '/' + if (event.key === '/') { + event.preventDefault(); // Prevent any default action associated with the '/' key + document.getElementById('search-input').focus(); // Set focus to the search input + } +}); diff --git a/inst/BS5/assets/pkgdown.scss b/inst/BS5/assets/pkgdown.scss index acb85107c..86c058680 100644 --- a/inst/BS5/assets/pkgdown.scss +++ b/inst/BS5/assets/pkgdown.scss @@ -3,15 +3,21 @@ .row > main { // Ensure contents never become unreadably wide max-width: 50rem; - - // And that we can break and hypenate very long words - overflow-wrap: break-word; - hyphens: auto; } + +// break and hypenate very long words on small screens +@include media-breakpoint-down(md) { + .row > main { + overflow-wrap: break-word; + hyphens: auto; + } +} + // Put extra space between content and navbar @include media-breakpoint-only(xl) { .container .row { justify-content: space-evenly; } } + // Boost font size and give big (but not infinite) margin on sidebar @include media-breakpoint-up(xxl) { body { font-size: 18px } diff --git a/inst/BS5/templates/head.html b/inst/BS5/templates/head.html index e1b49079d..94f3e394b 100644 --- a/inst/BS5/templates/head.html +++ b/inst/BS5/templates/head.html @@ -5,12 +5,11 @@ {{#has_favicons}} <!-- favicons --> -<link rel="icon" type="image/png" sizes="16x16" href="{{#site}}{{root}}{{/site}}favicon-16x16.png"> -<link rel="icon" type="image/png" sizes="32x32" href="{{#site}}{{root}}{{/site}}favicon-32x32.png"> -<link rel="apple-touch-icon" type="image/png" sizes="180x180" href="{{#site}}{{root}}{{/site}}apple-touch-icon.png" /> -<link rel="apple-touch-icon" type="image/png" sizes="120x120" href="{{#site}}{{root}}{{/site}}apple-touch-icon-120x120.png" /> -<link rel="apple-touch-icon" type="image/png" sizes="76x76" href="{{#site}}{{root}}{{/site}}apple-touch-icon-76x76.png" /> -<link rel="apple-touch-icon" type="image/png" sizes="60x60" href="{{#site}}{{root}}{{/site}}apple-touch-icon-60x60.png" /> +<link rel="icon" type="image/png" sizes="48x48" href="{{#site}}{{root}}{{/site}}favicon-48x48.png"> +<link rel="icon" type=”image/svg+xml” href="{{#site}}{{root}}{{/site}}favicon.svg"> +<link rel="apple-touch-icon" sizes="180x180" href="{{#site}}{{root}}{{/site}}apple-touch-icon.png"> +<link rel="icon" sizes="any" href="{{#site}}{{root}}{{/site}}favicon.ico" > +<link rel="manifest" href="{{#site}}{{root}}{{/site}}site.webmanifest"> {{/has_favicons}} {{#lightswitch}}<script src="{{#site}}{{root}}{{/site}}lightswitch.js"></script>{{/lightswitch}} diff --git a/inst/po/ca/LC_MESSAGES/R-pkgdown.mo b/inst/po/ca/LC_MESSAGES/R-pkgdown.mo index e5fb6fc9b..3a2a99f2e 100644 Binary files a/inst/po/ca/LC_MESSAGES/R-pkgdown.mo and b/inst/po/ca/LC_MESSAGES/R-pkgdown.mo differ diff --git a/inst/po/es/LC_MESSAGES/R-pkgdown.mo b/inst/po/es/LC_MESSAGES/R-pkgdown.mo index a5b84d4a0..30ea82433 100644 Binary files a/inst/po/es/LC_MESSAGES/R-pkgdown.mo and b/inst/po/es/LC_MESSAGES/R-pkgdown.mo differ diff --git a/inst/po/fr/LC_MESSAGES/R-pkgdown.mo b/inst/po/fr/LC_MESSAGES/R-pkgdown.mo index b954b747a..7157e5d1a 100644 Binary files a/inst/po/fr/LC_MESSAGES/R-pkgdown.mo and b/inst/po/fr/LC_MESSAGES/R-pkgdown.mo differ diff --git a/inst/po/tr/LC_MESSAGES/R-pkgdown.mo b/inst/po/tr/LC_MESSAGES/R-pkgdown.mo index 756dd3bf5..28a9893e4 100644 Binary files a/inst/po/tr/LC_MESSAGES/R-pkgdown.mo and b/inst/po/tr/LC_MESSAGES/R-pkgdown.mo differ diff --git a/man/build_home.Rd b/man/build_home.Rd index 9db92d68c..c3e3c5725 100644 --- a/man/build_home.Rd +++ b/man/build_home.Rd @@ -170,7 +170,7 @@ authors page. \subsection{Additional control via YAML}{ -You can control additinal aspects of the authors display via the \code{authors} +You can control additional aspects of the authors display via the \code{authors} YAML field: \itemize{ \item display of each author in the footer, sidebar and authors page, diff --git a/man/build_site.Rd b/man/build_site.Rd index 4f5dd0918..a0e52b6fa 100644 --- a/man/build_site.Rd +++ b/man/build_site.Rd @@ -285,7 +285,8 @@ Otherwise, you can supply your own in the \code{repo} field: }\if{html}{\out{</div>}} \itemize{ \item \code{home}: path to package home on source code repository. -\item \verb{source:}: path to source of individual file in default branch. +\item \code{source}: path to source of individual file in default branch +(more on that below). \item \code{issue}: path to individual issue. \item \code{user}: path to user. } @@ -293,6 +294,15 @@ Otherwise, you can supply your own in the \code{repo} field: The varying components (e.g. path, issue number, user name) are pasted on the end of these URLs so they should have trailing \code{/}s. +When creating the link to a package source, we have to link to a specific +branch. The default behaviour is to use current branch when in GitHub +actions and \code{HEAD} otherwise. You can overide this default with +\code{repo.branch}: + +\if{html}{\out{<div class="sourceCode yaml">}}\preformatted{repo: + branch: devel +}\if{html}{\out{</div>}} + pkgdown can automatically link to Jira issues as well if specify both a custom \code{issue} URL as well Jira project names to auto-link in \code{jira_projects}. You can specify as many projects as you would like: @@ -302,14 +312,6 @@ custom \code{issue} URL as well Jira project names to auto-link in url: issue: https://jira.organisation.com/jira/browse/ }\if{html}{\out{</div>}} - -pkgdown defaults to using the "HEAD" branch for source file URLs. This can -be configured to use a specific branch when linking to source files by -specifying a branch name: - -\if{html}{\out{<div class="sourceCode yaml">}}\preformatted{repo: - branch: devel -}\if{html}{\out{</div>}} } \section{Deployment (\code{deploy})}{ diff --git a/man/clean_site.Rd b/man/clean.Rd similarity index 55% rename from man/clean_site.Rd rename to man/clean.Rd index d8e73f3cf..43572143a 100644 --- a/man/clean_site.Rd +++ b/man/clean.Rd @@ -2,15 +2,22 @@ % Please edit documentation in R/clean.R \name{clean_site} \alias{clean_site} +\alias{clean_cache} \title{Clean site} \usage{ -clean_site(pkg = ".", quiet = FALSE) +clean_site(pkg = ".", quiet = FALSE, force = FALSE) + +clean_cache(pkg = ".", quiet = FALSE) } \arguments{ \item{pkg}{Path to package.} \item{quiet}{If \code{TRUE}, suppresses a message.} + +\item{force}{If \code{TRUE}, delete contents of \code{docs} even if it is not a pkgdown site.} } \description{ Delete all files in \verb{docs/} (except for \code{CNAME}). + +Delete all files in the pkgdown cache directory. } diff --git a/man/index.Rd b/man/index.Rd index 71dc7bcba..da52d62fc 100644 --- a/man/index.Rd +++ b/man/index.Rd @@ -15,6 +15,7 @@ Other tests: \code{\link{test-links}}, \code{\link{test-lists}}, \code{\link{test-long-lines}}, +\code{\link{test-math-examples}}, \code{\link{test-output-styles}}, \code{\link{test-params}}, \code{\link{test-sexpr-title}}, diff --git a/man/test-crayon.Rd b/man/test-crayon.Rd index aa779cb85..1597f40ea 100644 --- a/man/test-crayon.Rd +++ b/man/test-crayon.Rd @@ -22,6 +22,7 @@ Other tests: \code{\link{test-links}}, \code{\link{test-lists}}, \code{\link{test-long-lines}}, +\code{\link{test-math-examples}}, \code{\link{test-output-styles}}, \code{\link{test-params}}, \code{\link{test-sexpr-title}}, diff --git a/man/test-dont.Rd b/man/test-dont.Rd index e4b923f7f..c0b63c0ec 100644 --- a/man/test-dont.Rd +++ b/man/test-dont.Rd @@ -72,6 +72,7 @@ Other tests: \code{\link{test-links}}, \code{\link{test-lists}}, \code{\link{test-long-lines}}, +\code{\link{test-math-examples}}, \code{\link{test-output-styles}}, \code{\link{test-params}}, \code{\link{test-sexpr-title}}, diff --git a/man/test-figures.Rd b/man/test-figures.Rd index 208b1a3e6..fce8b4294 100644 --- a/man/test-figures.Rd +++ b/man/test-figures.Rd @@ -22,6 +22,7 @@ Other tests: \code{\link{test-links}}, \code{\link{test-lists}}, \code{\link{test-long-lines}}, +\code{\link{test-math-examples}}, \code{\link{test-output-styles}}, \code{\link{test-params}}, \code{\link{test-sexpr-title}}, diff --git a/man/test-links.Rd b/man/test-links.Rd index 55ef9507e..201255be3 100644 --- a/man/test-links.Rd +++ b/man/test-links.Rd @@ -22,6 +22,7 @@ Other tests: \code{\link{test-figures}}, \code{\link{test-lists}}, \code{\link{test-long-lines}}, +\code{\link{test-math-examples}}, \code{\link{test-output-styles}}, \code{\link{test-params}}, \code{\link{test-sexpr-title}}, diff --git a/man/test-lists.Rd b/man/test-lists.Rd index edef2f8c7..f3dbdce2d 100644 --- a/man/test-lists.Rd +++ b/man/test-lists.Rd @@ -55,6 +55,7 @@ Other tests: \code{\link{test-figures}}, \code{\link{test-links}}, \code{\link{test-long-lines}}, +\code{\link{test-math-examples}}, \code{\link{test-output-styles}}, \code{\link{test-params}}, \code{\link{test-sexpr-title}}, diff --git a/man/test-long-lines.Rd b/man/test-long-lines.Rd index 39cd7cb03..660f29363 100644 --- a/man/test-long-lines.Rd +++ b/man/test-long-lines.Rd @@ -23,6 +23,7 @@ Other tests: \code{\link{test-figures}}, \code{\link{test-links}}, \code{\link{test-lists}}, +\code{\link{test-math-examples}}, \code{\link{test-output-styles}}, \code{\link{test-params}}, \code{\link{test-sexpr-title}}, diff --git a/man/test-math-examples.Rd b/man/test-math-examples.Rd new file mode 100644 index 000000000..de64ccaae --- /dev/null +++ b/man/test-math-examples.Rd @@ -0,0 +1,33 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/test.R +\name{test-math-examples} +\alias{test-math-examples} +\title{Test case: math rendering in examples} +\arguments{ +\item{x}{\eqn{f(x) > 0}: inline equation} +} +\description{ +Test case: math rendering in examples +} +\details{ +Display equation: + +\deqn{y = \alpha + \beta X + \varepsilon} +} +\seealso{ +Other tests: +\code{\link{index}}, +\code{\link{test-crayon}}, +\code{\link{test-dont}}, +\code{\link{test-figures}}, +\code{\link{test-links}}, +\code{\link{test-lists}}, +\code{\link{test-long-lines}}, +\code{\link{test-output-styles}}, +\code{\link{test-params}}, +\code{\link{test-sexpr-title}}, +\code{\link{test-tables}}, +\code{\link{test-verbatim}} +} +\concept{tests} +\keyword{internal} diff --git a/man/test-output-styles.Rd b/man/test-output-styles.Rd index 674cdc0ef..dc6645ab8 100644 --- a/man/test-output-styles.Rd +++ b/man/test-output-styles.Rd @@ -31,6 +31,7 @@ Other tests: \code{\link{test-links}}, \code{\link{test-lists}}, \code{\link{test-long-lines}}, +\code{\link{test-math-examples}}, \code{\link{test-params}}, \code{\link{test-sexpr-title}}, \code{\link{test-tables}}, diff --git a/man/test-params.Rd b/man/test-params.Rd index 3439897b3..393a2390c 100644 --- a/man/test-params.Rd +++ b/man/test-params.Rd @@ -18,6 +18,7 @@ Other tests: \code{\link{test-links}}, \code{\link{test-lists}}, \code{\link{test-long-lines}}, +\code{\link{test-math-examples}}, \code{\link{test-output-styles}}, \code{\link{test-sexpr-title}}, \code{\link{test-tables}}, diff --git a/man/test-sexpr-title.Rd b/man/test-sexpr-title.Rd index ad502afa3..f64961005 100644 --- a/man/test-sexpr-title.Rd +++ b/man/test-sexpr-title.Rd @@ -15,6 +15,7 @@ Other tests: \code{\link{test-links}}, \code{\link{test-lists}}, \code{\link{test-long-lines}}, +\code{\link{test-math-examples}}, \code{\link{test-output-styles}}, \code{\link{test-params}}, \code{\link{test-tables}}, diff --git a/man/test-tables.Rd b/man/test-tables.Rd index 5a27a2ad9..cf3e14784 100644 --- a/man/test-tables.Rd +++ b/man/test-tables.Rd @@ -18,6 +18,7 @@ Other tests: \code{\link{test-links}}, \code{\link{test-lists}}, \code{\link{test-long-lines}}, +\code{\link{test-math-examples}}, \code{\link{test-output-styles}}, \code{\link{test-params}}, \code{\link{test-sexpr-title}}, diff --git a/man/test-verbatim.Rd b/man/test-verbatim.Rd index a2d74128b..6ece64f32 100644 --- a/man/test-verbatim.Rd +++ b/man/test-verbatim.Rd @@ -45,6 +45,7 @@ Other tests: \code{\link{test-links}}, \code{\link{test-lists}}, \code{\link{test-long-lines}}, +\code{\link{test-math-examples}}, \code{\link{test-output-styles}}, \code{\link{test-params}}, \code{\link{test-sexpr-title}}, diff --git a/pkgdown/_pkgdown.yml b/pkgdown/_pkgdown.yml index ce3a05f76..b19f8e68d 100644 --- a/pkgdown/_pkgdown.yml +++ b/pkgdown/_pkgdown.yml @@ -17,6 +17,7 @@ authors: template: bootstrap: 5 + math-rendering: mathjax light-switch: true bslib: primary: "#0054AD" @@ -51,6 +52,7 @@ articles: easily be tested automatically. contents: - starts_with("test") + - starts_with("articles/test") reference: - title: Build @@ -103,6 +105,8 @@ redirects: news: releases: + - text: "Version 2.1.0" + href: https://www.tidyverse.org/blog/2024/07/pkgdown-2-1-0/ - text: "Version 2.0.0" href: https://www.tidyverse.org/blog/2021/12/pkgdown-2-0-0/ - text: "Version 1.6.0" diff --git a/pkgdown/favicon/apple-touch-icon-120x120.png b/pkgdown/favicon/apple-touch-icon-120x120.png deleted file mode 100644 index abd2b173a..000000000 Binary files a/pkgdown/favicon/apple-touch-icon-120x120.png and /dev/null differ diff --git a/pkgdown/favicon/apple-touch-icon-152x152.png b/pkgdown/favicon/apple-touch-icon-152x152.png deleted file mode 100644 index 802d9ee04..000000000 Binary files a/pkgdown/favicon/apple-touch-icon-152x152.png and /dev/null differ diff --git a/pkgdown/favicon/apple-touch-icon-180x180.png b/pkgdown/favicon/apple-touch-icon-180x180.png deleted file mode 100644 index 36438604a..000000000 Binary files a/pkgdown/favicon/apple-touch-icon-180x180.png and /dev/null differ diff --git a/pkgdown/favicon/apple-touch-icon-60x60.png b/pkgdown/favicon/apple-touch-icon-60x60.png deleted file mode 100644 index 7f48aa8cc..000000000 Binary files a/pkgdown/favicon/apple-touch-icon-60x60.png and /dev/null differ diff --git a/pkgdown/favicon/apple-touch-icon-76x76.png b/pkgdown/favicon/apple-touch-icon-76x76.png deleted file mode 100644 index 2c6da4735..000000000 Binary files a/pkgdown/favicon/apple-touch-icon-76x76.png and /dev/null differ diff --git a/pkgdown/favicon/apple-touch-icon.png b/pkgdown/favicon/apple-touch-icon.png index 6006af40b..5c2b5673f 100644 Binary files a/pkgdown/favicon/apple-touch-icon.png and b/pkgdown/favicon/apple-touch-icon.png differ diff --git a/pkgdown/favicon/favicon-16x16.png b/pkgdown/favicon/favicon-16x16.png deleted file mode 100644 index 11252fbbd..000000000 Binary files a/pkgdown/favicon/favicon-16x16.png and /dev/null differ diff --git a/pkgdown/favicon/favicon-32x32.png b/pkgdown/favicon/favicon-32x32.png deleted file mode 100644 index 9e0df4806..000000000 Binary files a/pkgdown/favicon/favicon-32x32.png and /dev/null differ diff --git a/pkgdown/favicon/favicon-48x48.png b/pkgdown/favicon/favicon-48x48.png new file mode 100644 index 000000000..80da1250b Binary files /dev/null and b/pkgdown/favicon/favicon-48x48.png differ diff --git a/pkgdown/favicon/favicon.ico b/pkgdown/favicon/favicon.ico index 7fef537c9..39c113865 100644 Binary files a/pkgdown/favicon/favicon.ico and b/pkgdown/favicon/favicon.ico differ diff --git a/pkgdown/favicon/favicon.svg b/pkgdown/favicon/favicon.svg new file mode 100644 index 000000000..d6992514f --- /dev/null +++ b/pkgdown/favicon/favicon.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="240" height="277" viewBox="0 0 240 277"><image width="240" height="277" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPAAAAEVCAYAAADeq2gXAAAAIGNIUk0AAHomAACAhAAA+gAAAIDoAAB1MAAA6mAAADqYAAAXcJy6UTwAAAAGYktHRAD/AP8A/6C9p5MAAAAHdElNRQfnCh8ULDn4RDb4AAB/b0lEQVR42u39d5AkWX7fCX6ei9CRWlVm6aququ5pPRocgFAESB6WWIICh90FYMSCJAiQ4IBcu6XtnnHXzu7W7uxsd4ZYcElQc8njUixBrSFJACN6Zlp3V1WXllmpM3S4evfHc/d47hGRqiKysqrj11adER7uz58/96//9O8nGNEzQ9/6R/9z9NECfhfw54Em8P8A/iMQALz+h/7sk57qiAZE4klPYESPTxpwAZ4H/gTwI8BMuO0h8L8DfwW4Ee04AvLTTyMAP8WUAu488KPATwHn+hzyAfALwN8HNqONIyA/vTQC8FNKGngLwA8Afxr4HGDscqgH/AbwJeCXgTaMQPy00gjATxlpwDVQgP0iCsD5fQ5VBf4x8PPAW4CEEZCfNhoB+CmhlLh8HvjjwI8Bc4859D3gr4f/7kYbR0B+OmgE4CNOKeBOo4xTPwNcGvCp3kRx418CKjAC8dNAIwAfYdLAmwO+D/g54NsBc0indID/gNKP/yPgwgjIR5lGAD6CpAFXAJ8Efhb4/UDpkKawibJU/0Xg/WjjCMhHj0YAPkKUEpdPAT8J/ASw+ISmdBP4ReBvA8vRxhGQjw6NAHxESAPvOPCHgD8FvPyk54WyTn8N+AvAvwDqMALxUaERgJ8wacC1ge9G6bnfHX4/StQC/hVKP/4q4MMIyE+aRgB+QpQSl18G/iTwh1Ec+CjTKios8y8D16KNIyA/GRoB+JApBdxF4I8AfxSl8z5NdBll5Po/gPVo4wjIh0sjAB8iaeAtAT+ICn/89JOe12OQj3I3fQn494zCMg+dRgA+BNKAawJfQOm5vxvIPum5DYiqqACQn0cFhIzCMg+JRgAeIqXE5YvATwP/JSqi6lmkUVjmIdMIwEOgFHBngf8KlaP73JOe2yHRmyi30y+huPMIxEOiEYAHTBp488DvRWULfRu7p/k9a+Sg9OIoLNODEZAHTSMAD4hSaX6fRgH396HydT/OtIGyVP9F4MNo4wjIg6ERgB+TUuLyGVSa348DC096bkeMrgN/Cfg7wEq0cQTkx6MRgA9IKeBOAj+MCsb4xJOe2xGmAPgK8GVUVFcTRiB+HBoB+ACkgTcDfC/KLfSdqGqQI9qdGsA/Rxm6vs6oWuaBaQTgfVAqze8VVJrfHwDGnvTcnlJaRmU6/SIq8wkYAXk/NALwHiglLh9Hpfj9JHDiSc/tGaH3UNUy/wGwBSMQ75VGAN6FvvEP/r/4vo9t22UJPyQU1339Sc/rGSQP+DXgfwF+FeWGGgF5FxoBuA+9+0/+AtvVKqdPHLcePlr5DtM0fw5V1ibzpOf2jFMF+IfA/wq8E20cAbk3jQCcoqv/+i+ztrHBP/ilf8b/9Yd+8IV6s/kzruv+SC6bnSwWCljWyE51SHQH1UnibwIPoo0jICdpBOCQmm//c955/wMera6xMDc7X6vXf6zVbv+U63pngyAAwLZtioUCxUJ+BOTDozdQ1up/BtRgBGKdRgBG6bkbW1vMzcwUNra2fqDdbn/RddzP+UEgAIQQSCnj/W3bplQsUCgUsMxhFYgckUYt4N+iwjJ/i1E1kJg+1gB+85e+zObGBp//zKeMr77xrc+12+0vOq77A0EQ5KWUCNG9PBGQhRDYlkWxWKRYyGOOgHwYtAb8XVRE19Vo48cZyB9LAL/7z36BtbU1rl67xsXnnjvfard+ynW9H/V9f04H6E6UAHLEkfMjIB8SXUXFVv89FKiBjyeQP1YAfvuXvszG5haVaoXJiYnpZrP5I47r/Yzv+5f2Ctw0jYD8xMgHfhMlVv87lJj9sQPxxwbAv/bX/wfqjSZTE+PZSrX2/a7nfbHtet9hCsz9grYX6UDO2DalYpF8PhcDWfIxWuzDpRrwT1GGrm/yMasG8sw/U7/yV/88rVaL3/uj/4X4t3/v77/uef6fDoLg9/tBUNpu+niBZCxrkrVVuu7jAi0B5EwI5Fwe0zTi3wfxwhhRFz0A/gbwV1EuKODZB/Iz+yT9q1/4b/F9n1a7TalQOOkH/k8GgfwJKeVSBCIpJS1P0nB8LENQyBjYMdDgcXCWBHImFq0NYwTkIdPbqNpc/ycfgyZtz9wT9E+/9GcABRDLNMcDKf8gyD8lJa/003OllLi+pO1JDAE528A0RPjb4ICczWRi0XoE5KGSS6dJ22/wDDdpe6aenAi8qHDH70RVxfheKaUNe7Mse4HE8SWGEGRNgTEsIJeK5HMjIA+ZtlBN2n6BZ7RJ2zPxxGjABZXm96eAPyilHIeDWZa9QOJ4EtMQZCyBEY4xSB05m81SKhZGQB4+3UR1kvjbwKNo47MA5Kf6SXnnn/wF7ty9h+t5CCGW6KT5nRzE+FIqbuz6EssQZC0xMHDpQM5ls5SKRXK57AjIw6OoSduXgH+JKirw1IP4qXxCovzcIAi4e//BOKp43J8WQnxyUOfQOW0gJS03wPUlOcsgM0wgl4rksiMgD5GaKAB/GdWk7amuBvLUPRlacv0Y8AebrdaPb21vf9Zx3LjLwSAfeF339QJJo+3jSyhkDLLWYCzWagwFZEMIsrks5WKRbC7XEd1HQB40rdCpBnI92vi0AfmpeSI04FrA7wT+DPC7pJS27/vUGw1q9Qae56kLG/DDroO07QXU2j4CQTk3ONeTGiMEsmEkOLIYAXlY9CHKyPX3USVwgacHyEf+SUiVs3keVfnxR1CVIBPkui61eoN6o4Hv++oCh/SwSylpOArIGcugnDOxBmSxjsaHEZAPiTyUu+lLwC/zFDVpO7JPQAq4c8CPotqTnNvpOCllCOQ6jUYTP8zlHahYTVI/rrV9mk5AzjYoZc2B+ZCj64EQyJFoPQLysKiKCgD5eeCtaONRBvKRvPOp9iS/B1W2dV/tSaSUtB2HWq1Os9UiGAaQNYD6gaTa8ml7AYWMSTFrDMz1FF0PKCDnczlKxSLZbGYE5OHQXeCvoZq03Y82HkUgH6k7nirb+ilUIMYPAsX9jKM/zFJKWu021VqNVqvNQbOOdj5fB8iuH1Bp+Xi+pJwzydvGgM+lATkfAjkzAvKQ6FuoJIl/whFt0nYk7nRKXD6F6lj/E8CxxxlXf5iDIKDZalGr1Wk7ztCB3PYUkKWEsZxJbkDJEvq1gQJyIQRyJgHkxxffRwQoffjfofTj3+SINWl7orc4Bdwx4A+iuta/PMjzpIHcaDap1uq4rjsUIOvUdAOqLR9DKCBnBuh6iq4NwDQM8vl8CGR7xIUHT+uoAgL/G3A52vikgfzE7nI/txBgD+ucOpB115Prup0FGcKDH1msq20f2xSM5Sxsc7CcMgayacaidcYeAXkIdA0F4r8LrEYbnxSQD/3u7sctdBjkeV7sehqGD/kwLdZqnA6QC/k8pWIBewTkQVMA/DZKrP43PMEmbYd2Vw/qFjosilxP9UZzKD5kHaBBIGm6AW4gyVoG2QEmS3TONwLyIVAd1aTty8A3eAJhmYdyNwfhFjoMklLiuC61Wp1Gszl011OUh+xLMAXY5uBirPVrAgXkYiFPsVjEtqwRkAdLD4G/hSpEfyvaeBhAHupdHJRb6LBJSkm77VCtK9fTUIBMZ/EjIHuBynoaJpAt06RQKFAsFsjYQzM3fFzpXVRLmH/EITVpGwqAh+UWOgxK+5Aj11OrPSQfMkkdue1JPF+SscRAkyWiccKab1iWRaGQp1RQovWIBkYuqjnbl8K/Q60GMnAAp7OFUN38XhnK7IdIvXzI1Vod5xB8yK6vjF1SSkrZ4bmeQAG5WMhTHAF50LRNp0nbu9HGQQN5YE9gH7fQ93II3fzC/idA5+Ec5MOuu54azSa1eh3HGY7rKZp35HqqtHwylmA8Z2ENyfUEEZCVaG2P+j4Nkm6hdOO/hdKVgcEB+bEfgyfhFopAJYCW41JrNGk7LkIICrksxUIO27KQUg4stFAfx/N96vUG9Xodd0jpixH5geLGdSegYKusp2G5noCwXUyBUSfGgZJENWn7MspqXYfBgPjAtz8F3FngxxiyWygGroBW2+XDG/f48MZ9tqp1XM9HCMhlbGYnx7h0ZomzJ+bJZjIDBbJOrudRr9dDH/JwXU9eIKk0VbJEMat8yMNyPQHYtkWxUBx1YhwstYB/jdKPv8IAmrQd6L5r4M0Bv5dDcAvptZwfrGzw1Xc/4vb9VQgB7Xm+epCFwDINirksM5NlXrl4ilPH5rDtwXJknXTX07B9yK4fsN3sJEsUMoNNlojWOiK9XcwIyAOjVeDvoJq0XYs2HgTI+7rzT8ItpHPd7VqTyzfu8eblW1RqDYQQmKZK21uYmWByrMStByvU6i0mxorUm8oFdGZpjlcvnWZpfhrLNJBy8Fk7Ukocx6Var9FsDj99se0FVJo+gZSM5SzymcG/O3UgZ2yb4qil6qDpMios8++hYq2B/QF5T09XSlw+CfwxhuwWisRCAXh+wEd3HvL1d6+xsV3FNAz8IMAPJIYhePXiaT7/ykVyWZu1zQpvXbnFtTvLVBstBOpBzGczPHdygVcunWZ+egLDEAMDctqn22q34zzkw0iWqDQ9hBCM582Bu56ia4quwbYtSsXiqIHb4MgH/hOdJm37qgay6y1+Em4hneuub9X4+nvXuHzzPq6rHlQzrNgYhPvNTY3x6sXTXDyzRMa2CIKAh2tbvHP1NtfvLNNsO9iWiR9IivkMF04d48XzJ5mdHFNiOQMCcsr1FOUht9vDcT3p542SJSxDAXmQdbr080TXMOrEOHCqAb+EqgbyLfbYpK3vre3hFvo5VLbQUN1CETdzPZ/LN+/zxnvXWN+qYlsWlmXiuB5BEMT6sGkaZGyLF8+f4POvXIwBbFkmnhfwaH2Lr737EXceruF6fvwQlos5Xjh7nBfPn2RyvDTYa+iRvlir1XGGkL6YDgSpt1Wdrpw9+Dpd+vVF19CzE+OoqMDj0H1UJZC/hqoMAvQHctcqp8TlF4Cf4RCyhXSuW280eefKLd6/fp/NagPLMslYFrmsTbPt4Lo+EkkQSE4vzvLpF89xYmGGerPNO1dvs7FV5cXnTnJsdpKb91f47beuUG20mCgV2KzU8TRD02S5wAvnjvPCuROMlwqKGzM4q27Ch9wIfchDSF9Ml/eptX0aTkAhM5ysp+j6omuIGrjl8/lYQhoB+bHoLRQ3/seETdqgG8jx6qaAO49yC/0UcHbYM41udBAE3H2wwtffu8b91S3yWTt8SAS5bIZGy6EZiqPFfI5XL53m1UunKWQz3Ly/wm++eZnltS2klOSyGSbHiqxtVZkaK/G5V57jxMIMH964x9fe+Yi26+H7gRLDgdnJMi9fOMWF04uUCrmhGLpApS8OswRu2vUU1ekqDqFOl37/ousYNXAbKDmoKpl9m7QJgG/9w/85+lYAfgBlXf4cQ4qV7kWu6/LGux/x5pXbNFouhqEaiwkhsAyBaQgcLyAIJKcWZ/ncy8+xND/NVqXOBzfusr5V4/rdZdzQHyulJJ/L8NJzJ3n9+bOMFfM8WN2MxekgkHi+cj2ZhhE+ZDA/Nc4rF09x/uQx8rns8HzIQy6B21WnK+yFXMqZFAZcp6tzTr3vUwjkUd+nQdAWqm71XwTeiza+/of+LOI//vX/kaWlJWO7UvmcFHwR+AGh0v4OjYQQfHj9Lv/mN99CAuVCjlqzRRDImAMbBhRyGV5//iyvXjqDaRpcvfWAr793HaSk5bjYlkm10cLzfE4dm+FzLz/H8flpmm2Xb314g7ev3qbRbGOaBpZpUi7mWJie4NH6NpuVOn4QhOKf5NjsJK9ePMWZ4wtkM/ZQgByVwK3W6zSHVQK3h+tJMpw6Xfp1Rdcx6vs0ULoJ/BUp5d8WgodOu435E//5d73guu7/zTDE/yQQnxFgS3G4pTqEEFy/+4gb91ewTBPLNPH8II4JNoRgZnKMz79ykZcvnMb3fb7x3kd89d2PaLYcXM+n3mzTdj0mSnk+/eI5vv3155mZHKPWbPPLX32Ht6/cjrmzaRg8d3KB7/7sS7xy4RRj5QL3ltdxPA/PDzCEoN50uHrnISvrW+QyNuVCHssarJFG+bFN8rkc2WwWpNKVB2no0oewDEExa2IYgmrLp+kGWIYYuKFL2TKUkdHzPJqtFo7jIgx1vSMgH5gmpZTfI4T4DoFoSxlsmD/yfZ/7dcJgDMMwEAJECN/DArJAJZyvbVWZnxpjo9KJMQaYHCvwvZ97iXMnF3jwaI1f/fp7XL71kHzWZnF2kmqjBcDFkwt892c+wYXTx1VAvpQYhkExn8MPAqr1FuPlAl947RKfe+UC+WyGD2/e5ytvX2Fju4YQBsdmJpCoGGvTMKnWm9y494iVjQr5rE25mB+otTUaw7Is8vkcGTtDIIOBA1kn2xQUwsCPSsvH8QIsc3BNzeP7mgJyq9nCcT0MYWBZ5qgU7j6oY+QVAimX2u3mD2xvbb4k/v7/849tFwvFsVwuRy6XI5PJYFkWInxLIgYvYvWjje0qdx6s8Mb7N9isNjCjF4oQLEyNMTNZ5vrdFeotR+mtSLK2xUQpxysXT3PxzHFs2+b2g1U2tqucWJhharyEaRg4nseDlU0K+Sxzk2Osb9f45gfXef/aPdquy8xEmdefP8PzZ4+zsV3jP3zlHWqNJuVintXNKkEQUMipYJAXz59kfmYCc4BRXYdZAreX66nu+OSs4SRL6NcIo3Yx+6EoFi4yPfquy8bWNitrG2RMedP8Xa+f/2/b7XbOcR38wEcGnYdFGAYi5MdS6AMNeJLhg5LPZRkfK1Es5Gi0HGqNTiRTpd5iZaOK43qhmG3g+QGzU+N8/pVLXDy7hON6vHP1Nt/64AYf3LinorHqTaYny8oqPV7ENk3eu36XX/nau2xUagCcP7nA937uZc6fXKBSa/DWlVvcX9nA9yWBlPi+ivryfJ/VjQrX7z2i0WxTKuQo5AfzAOpjGIZBxrbJ5/PYpoUfBARBMDAgd6LGwm6IlkHeNnB9yXbLJwgktqmMiNFDNIj7rnNkNxKtXRfTMDDNEUdOk551F/getVqND2/c41tX74AMGMvbLfMHPv+JP+f7fs5xHFqtFo7jJMQ3Q6iCa8MEsl4jyrYs5qcnOHdinrFinlqjRb3Zjt9EhmEQSInr+ZxenOX3fOE1js1OcvfhOr/69fd4++od6q02fiBxPJ9yMcfJY7PksjbLa1v8xjc+4BvvX6fVdhgvFfnsy8/x+ZcvkLEt3vvoDr/69fe4cW8FwxBMj5c4f/IY46UCmYylrNZSBZmsbGxz/e4y7bbDWClPTmtz8nhrkQJyJkMhn8M0DeX2Cg1d+r6Pv+5gGIKcbZCzDFqecj/BcOp0JYDsKiC7rodhjoCsX7cQAhkEtFsNbt5b5jffvs7qZoXzC+PMjRcQQrjiF/+bH96UUk5ELhspJUZoWBkbG6dYLJLL5bBtW+l+Yvj6sR7UUak1+fDGPd796C6blRoSYl9mxrY4uzRLqZDn/Rv3qDfaKlkBGCvm+cxL5/nEuRN4vq8484c3qdabZDM2L54/wevPn2G8XOTB6iZff/cjbj9YQ0rJ2RPzPH92iaW5KQVMVA7wxnaND67f4/1rd2lpCf1T40VeOn+C58+eoFzKh2L14DsjDL0Ebo8WMX4Apawx8BYx6fsNnXYx5XSXCY5IC5EhU+KFJSWu22ZlfZNvXr7L/dVtzi2McXpuLIzjlwghqh0Ai47IFL3jbcsin89TLpUpaEA2TEMt6SHqx1uVOldvP+TR+ha3H67hul7sdjEMQRCoi89lbJ47dYzXnz/D7NQYj9a2+O23rnDz/iqBVO6hz738HGeW5mg7Lh9cv8fX37tGtd4il7H4wuvP8/KFkxiGERqvtpmfnmBxdpJiPofrefyHr77LB9fvxm4u0zQo5XPkszYvPXeCC6eXKOSzQwsGcfTui0P2IUctYpBQ1l1PQ3hBfZy7THTWU+J7HtuVCu9cu8e7Nx4xUczw0qlpynk7/Uw14wTPWFkWAkNKAlTCul+r0W41KTSKlMpl8vkCuVwOy7IwTKUjDxPI0YVNjBX57Mvn8byAeyvrvHX5Frfur+B6fhiIEYQRWhkunZqnmM/yjfeu8c0PbrJVa5DL2Lx24RSffvE8xXyWW/dX+No7H2HboUUZyZnjc7xy8RSmafJofYv/8JV3qDfbZCyTs8fneenCKa7dWeb2g1WOz0+zXW1Qa7TiBIvl9W1WNip8cP0+r1w8xbmTC+Sygw8Gydg2k+PjFAuFoZTA1YfIWgYzRYNWCOR626c8hBYx+tz9IKBWV9lcz3qXCV3aDAKfZqPOR3eWeePyPYIg4PWzM8xPFABiJqWtgxlzYPUQioT+EccFC4EZppIV8nkKpTKFQpFsNodtWwhDJf4N09ClkxAC1/W4/XCVNy/f4sHKBo7rhZZpyGctSoUc69t1PM9nbmqcT794nounF/E8lzc/vKnE6Wabs0tzVOpN1jarfPKFM3zP51RbpnqzxT/91Td4uLoJqHKspmnQajsgBFlbGZeEEIlqHNG6WYbB8fkpXr10mtNLc2Ts4QWDtNuO6r7YHk4JXP1cDSeg5vhkTINy1hx4na70+eDZLE6frH4a4LRb3H+0xhuX77K2Vee5xXFOzY5hGVG2XM/19c3/7Nte/HNALkK2vjhKrFZGIwnIQEUOtVtNnHabQHYeFiM+Pm36Hs7Fm6bB9ESZ8ycWmBwr0Ww5VBstfD+IAztMw6SUz/Bdn36B504d4+HqGr/2xvu8e02Jv4Vshnwuy1ZVRWG5ns/ZpTly2QzZjEWt0eb+ygbjpQItx8XzfPK5DFnbpuWozCI/kLG/ObKmqu0BW9UGN+6tsLK+TS5jDdWHXMjnsW0bGcih+JCjF3nGMihkDPwAKi0PP22xHjBHjmLkHceh2WrhB34cDPI0Alk3UCElnuewtr7BV9+7wRsf3mOyYPPJc3PMjedjhhDhqgcZ5n/2bS/+OSFELop40hdFhAA2Is4ShjXKIMDzXNrNJq7rIAOprNRCIEToehqiWK1LCZZpMjc1zvkT84yXC9SbbZqtNoRzdzyPlfVtllc3+Pr7N1herzA5VubVS2f4xPkTPFzbZLvWIAgCPN/n7PF5JsaKgODOwzU2tpXhzHGV0WisVEAYgpbjIoDJcpFLZ5Z47dIZXrl4iudOHWNuagzPD2i0HAzDYGWjyo27j1jfqlLIZSgVlFVZv6GPuw5Rjm4+n8O2bPzAPxTXk+PLuI2qbQ6+RUw0dx3IrWYLPwhCqejpyUVWL7dQTfBcqrUK7310h//0zk081+PVMzOcnCtrsfm7ewDEL/43P7wJTEQANlJidARiAC98IExDxPsawsC2LfL5AoViiUKxSCaTxYjcAYdg6NLfUrVGi8s37vPutbusbVY67ichKOQymIbB7/zU8zx/7gRBIHm4usnbV27huB6nl+Z44exxTNPg2t1lvvHedRqtNo7r09Cag4My8L1y8RSvXDzN5FiRRquN7wcxOBvNNl9/7zrf/OA6vh/E8yzkVEGBly+cYm56Qr0cGSxHBq0Ebm346YueL6m2fVxfUswYQ6nTlb5OeHpqWieDdHzazSa3H67w5kcPaLcdLixNMDde6Np3LxSL0IDiWhrqIxYefY7eroH2IAsif55Du93C971YhhbRC2HIhi69qXXGtliam+LcCWXIqtabtNpuPG/X9dmu1cnZSqSdGitx7uQCF04vMj89znatwTfev85X3rpKpd6k0WrH+cP6+T7z0nm+8PrzFPNZPrr9kF/+ytu8feU2m5VaWLLHoNZocXd5Hc8PyGdsAql808tr29y494h6o0m5kB9aMEg2kyGfU2K77/tDMXRJCaYhyNsGGUtQdwLq7QDTEEPTj/WItXbboRm2vzEtM85FPgqU8OfKANdpsby6xlffu8Hl2yssTRZ48eQ05XxGW6f9LVTMgaMTGoboWoT0QxXpxJFxyzQEIuTcZhgmlysUyOWL5POFjuvpEPx66bG3KjXe/egOl2/eZ7vWxDQMioUszZbD8bkpzp86huv5tB2X9e0ay6ub1JqtUJ81cBwv8cICKOSy/OHv/zyzU+NIKfkPX3mHty7fxLJUqddTi7M0Wg7La1v4fsDsVJnXLp3hweom1+4s03ZcDCGwLJPxUp7nTh7jE+dPMF4eXsso1/WoNeo06o1EQYOBrXvK9VRr+wgE5ZwxlPI+nfMevZrWMrxQEV6057lsVyp8eOsh1++vM13KcmZ+jFzGfGxXY5IDA4T6a1oX1hfKCBXcCMhq1p1Xsu97eI6D57TD6CWpdGNhJMYeBpD14nJCCPLZDCcXZzi5MIMhBJVag7FSqCu3XTYrdd67doe7y+usb1Vpux65jE0+lyUII5+U5CE6EoUQnF6aY3KsiBBgmga3H6wipSrAt12tE/gB0xNlzp1Y4Ls/8xJnT8xTLuS492iDWqONbZnkc1kaLYdbD1a59WAFz/MZLxXIZu3ENQyCTNMgn8uRy+YQQuD7HkEwOENXOuspbyvbSb3t44ZN24Zp6IJOHbJWW6WiWlrm02FRxEWj8Md6rcZHdx7w1fdVKuvzxyc4Pl0K4+j3pufuRAkAx0AVnWin9EJF+wRRuBES2QOGquRNgOe2cdttPM+Na1kZwkhYrIdt6BJCUCrkOL00x+LsJH4QhAB28Dw/TF0UsSVZCEHgBziuRyGf5eKpRQwhaLTayiofBAgEZ4/PKyuwaXL55oNYTzYMg3Ihz2dfucBnXjyPZRq8c+UOv/7G+6xtV7Etg8XZCQTQaDkEgaTRdrnzcI07y2sAjJfyZDLDALJJLpcN/dODT1/U198yVXhmIKHhBCGoRNezNajzdQO5HXosrKEDWbfDyFDPvbe8whsf3uL+yhan50qcXRgna5sDAW5EPTgwRFFWvU4QgTfuQRRZOkV4XPR/SWyckdLH8xwcp43rOAQaYIQxXFdAGsjj5QKLs1NMjpdotRw2KnX8QFXjMA0D2zJxQxHz1OIsv/sLr/HScycp5HOsrG9jmQbZjM2Z43MszU1hGAZ3Hq5x4+5DBMql87mXnuMLr19iaW6KlY1tvvbOR3zj/evUmi1mxov8jtcu8oVPvsDzZ48zNzWG6/pUG02EIag1WqxsbLG2WaXtupSLebIDBHLEIeL0xUwmTNgYnuvJNlUTc9dXfmQAyxiOr7oLyK027XZb6erW4DlyUs+VuE6b9Y0N3v7oDpfvPGKqlOXC4gSlXHQPB3vdXQBOi8vRtmiyCrzx7JUoHVpZCS2q4ZewJnNo05IK7L7v4roOrusQ+J4Sq8NFHablUr8G0zSYGi9z7sQ8s5NjtJyODznSdyVKpzp7fJ5yMc/0RJlTi7PMTk3w0vmTXDi9iOv5vHPlNl995yqNlsP0RJlvf+15XrpwimzG4uqtB3zj/Wvce7QBEi6eXuB7PvsSZ08s0Gq7mJbJsdlJzp6Yp5TPsby2hev5BAFUG01uP1jj9oNVDCEYLxVU0Ezqwdn/OiSPty2LfC7MQw4C/CG6njKWQcYUtD1JywswBENLXdSB7AcB7VC0BgYiWsd6buzPdalWKly5dZ93rt3HQHJhcYKpUm4v/twDU08OrINYAVCG4O1MPp6HjLisjC+qk72oPnUqPSrwB0FAEHj4noPnOkokNTpAjuYwDEoC2WRmcoxzJxZiV1CUwmgIQdNxuPdoHcdRKW/5bIaJchEJPFzd5CtvX+W9a3exLJNXLpziOz75AkvzUzwMkyPevnKLSr1JIZfh2169wOdeuUg2m+G9j+7yK197jxt3HzFeLjI1XuLYzCSO53N3eZ1ASkzDYKyUZ22zyvW7j3iwuonr+mQzFvkBZD6lLda2bcftUyLdf2BATmU9ZS0D01BF6Z2wAsqwgSzDtNBItIakjryfF2I6za/RqHPnwSPeunqXaq3JmbkyCxOFfflzD0p9TXVpEOt3Q3Q+JmKoZSAJXF+NahrIAKVPQxirLDClxIx0ZxkgAx/PdXBaTbKFItlcPvYh6+6sQZMuZuUyNi89d4qzS/NcufWAd67eZnWzAoEqMvDG+9e5cW+FbMam0WpTyGWZnx6nUmtw/sQ8n3zhLHPT4zSabX7rzcu8dfk2tUaLbMbi+TOLfOal80yOj7G8pmpUX7+zjOcHBDIgn8twbHYSyzCYHCvF87Iti0qtGasrtx+scefhGhPlIi+eP6HK4JajzKfBuZ6iQnT1sASuO8Ba1jGQAds0GMsJnLAXsiGgmBleaKZ+nY7jsOm61OsNSiXVZWIvQO5K82u3WN/Y5KO7K1TqTY5NFpgsKV4YDBm4EfXRgTsX3fVPxmxYicxafG8M+viGg4wvQMZ/ZHQ8iruDRPoentPuZNegxVfrfucBL4h+YzO2xeLcJGePz1PIZ6k327iez9RYiXIxx9pWhfXtKo2Ww9pWlefPLvHZl59jvFTg9v1VfuVr7/L+9Xs4rs/i7ATf9ekX+PRL5zEMk299eJNfe+M9HqxshLqhipd+8fwJluam8QPJmx/eYHl9O6zIaTA3Pc6pYzO4rqciv4Sg1Xa4s6xEaz+QjJcGoyMnQmgNg2w2E1eUHLgPWTunZQhyliCQUAmDQSzzsDiyH+rIDoYwQmNXtz8+/Xx7rsPm1hZXbt3n2r0VChmTU7NlipH3YEDrtBfaEcC7rETiazeIOwsGMg7k6OyvJUyEJV2REun7BJ6L77nIIFAW61AUiRanM+7gSB8vm7E5MT/N6aU5LMPg/soG91Y2aLWdRPLC3OQ4xXyONz+8wX968zJrmzUKuSyvXTrFd33mRY7NTvFgdYtf/dp7vHP1dtzDWEpJNmPzqU+c45OfOIdlGtxdXuPKjfu0HZdiLsvveO0SX3j9eS6cXuTM0hyWabAdNnQLAkm92eb2w1XuLqueWOOlAhl7sFZrwzDI5bLkcyrQxBswkKP7GRm68lZYFSQsgTusGOto/jEgfT8sKqDqoCWLCnSeYd/zqNUq3Lq/zIc3HxL4PidmSkwUs0k9d3DT3P069ECOva14AoYKiIHsurHRxZi2Geu2cXWPRCim+muFpV6jrB/TsrEsC9OysTNZrEwWYZrEvFkLZh80mPXGahJY26zwztXbXL39ENf1cLTa09mMjeO4IAQnj83wmRfPc/LYDI7r8dtvXeG9a3dphsBHgmUaHJud4FMvnOPcyQUCKfng+j1++60r1BotluYmQ116mpbjgIR8ThmYHq1vq4IC1+/hel6cj2wYBouzk7x68XTYE3nwmU9SykQb1YEDORWaWWl5NN2AUtakHFbSTO830HuuFRWIMp+iogKB79NqNVhZ2+Sjeyv4ns/iVIFi1h5YGOxBaf8cWEVihFdNHO8cV7LU9KX4s+YqkqlPsYVaSmUsC7cqLq6swoHnEvgeBD4y8JHSR8ogfJkkA04GQWlLb7GQ5fTiHCcWplWgRq0Zc+EoztmyTF69qDo7WKaJHwRsbFdpOQ4Z22K8lOfUsRk+89J5Pv/KReZnJljdrPBbb17m6+9dw/cDXrpwku/41AtMjZe59WCVr8ZGMouxUoGJMZUXe3d5XaU1RrI4UKmFmU8bFSzTZKw42DK4kb87KoEbGYWGYegyDUE+Y5KzDOpOwFbTQwIZS0uWGCJHdlyXZrMVqg4+m5tbvHvtLtfurzJdynJ8ukjGGqw/98Dz3jcHjqiHLqy+hjdU2ZxVZpKluGX8nU6cdBR7nebGZli4zjJNDNPCstQ/0zQRpolhmAgj+mzFHFmEL5hBLqnuAvD9gPsrG7x1+RY376/QdlwVcBFa688szfHyc6dYnJskl7VxXR/XU7nKGdvCDyRrWxUu37zP5RsPqNSbLM5N8tmXnuPs8Xks0+DWg1V+4xvvU6k3VUEB2+LM4hzTE2U+vHmP7WojIbLpczyxME2j2WZirMRrz5/m+AB7IqfPF1XOjAImYDgcueUGbDY8vEAykbcoZYdb3qeTEKIa091a3kAAp+fKZC1zp/zcQ6fHB3D0eberCTl1tJ+ADniFBugwFlsB2QzrFStAm5aqy6WqgZjKWm0oEV2BWEAYsmkMwbesv3Fdz+POwzXeunwrTFjwY7E1m7GZnRrj7NI8UxOqrK1lmliWyTffv86dh2t4vk82Y/OJ8yd4/fmzFPNZXM8nY1t4YdG8dz+6w9XbD2m1nVjY0A1AhhBxWaGMbeF6PrOTY/hBwOpGhXwuw/kTC7xy8RQLs5OYA+qJ3KsEbrVWxxlCCVydGo7PRl1x46mCRTE7nFRCKSX1Zout7Rr1tkMpZzM7lu+69qNABwdw52p33wVN0BWdpzBS+DsFAUgA2Agr+ccgNsy4lI/ixlYIYiMEsYkQBhhh3LVhDh3Ibcfl5v1HvH/tHneX13A8PwGy6BoNQ1U0iUTfly6c5LVLZ1T3iEaLb35wg5WNbV567iTnjis99v7KBv/+K2+zulGho5HDRLmAaZqsb1UxTYOzS3O8/sJZ1rdqvPHeNbZrjc4NDuPBnzt1jFcunmJuarzjmx8gkOP0xXpd2QS08w+SpJTU2oojW4ZgqmgNrE6Xas7usFWpUWuqyqa+5zKWt5mfGhvodQyKHj9lI4xE6fqs7xItkFolRIhovZWnBETogQpkgCkFRqAsrkGgOJg0le/YkqrrggwCjEBxYsMwkUYQcl8TDANkgC/NMIlCDExf0blPxra4dOY4Z5bmuX53mbcu3+Lh6qaq1EEn5DSQAs93GC8X+OQLZ3nh7HFy2QwPVjb49Tfe48HqJoGEBysbnFmaZ3KsyOWb96nUmz2SSdQLbWq8xKdfPMelM0tIqZqhR2RbJn4YstpoqbarN+894sLpRV48f5KZybKWi3ywBz8dFFMulcjn89TrDeqNOq7rDdaQFp6znFOdFitNn0cVh6xtMFW0yDxG1pPjumxV6lTqTRWR5/t4Tgvfc/HtwfaPHiQd3I2kk27Yij73+BcbCqLDJJAyfnWMWJ0wzMjKrUeFRdTxO0vNpiW1F0nvhItBAlmvDHLuxHyY7dSiGeYhCy1O/PTiDK9dOkOpkAepmrJthcXxoki2ta0qd5fXaLtez9BWPwg4vTTH93zuJc4szbO6UeGXv/oOb16+GZe7NYSydpumQTvc1nZc7q9scvP+I5otl7FiVM96MOsAna4LuVwOwxAD9SGnQzOjJuauJ9lo+PiBJGsZu1qs9ZeK5/lsVWqsbFSoN1Ucgue08NpNgkAZKrMZ1VLnKInOEQ0GwPukDpAV702YnDou5BCs4ecwfTFynfQDcUcagM5bIOL1SV90NJdBXE80D9u2ODY7oUrzlAs0Wm3qzbaK+zUN1req3Ly3gh8EjJeKTI6XOHN8nsXZSbaqDdqOS9a2YqOfaRqMFQthjDIszU3xXZ/5BJ/6xDlsy+Kdj27z6994n7WtinJ5SMn0eInf8dpFvv2TL3BiYZqHq1txmSGAtuNx79E6tx6s4nge46UCuQGnMJqGQdSuRzBgIKdCMwsZk2LGoOFINhueKuxgdWc96aqPHwRUaw1WN7aohHHwvtvGbTcJUjW3sxlblVL6WAF4D3KMECl3E6JrCP1vhMkg6GREpYEc19LUOXAC3HoEmD6XwQEZ1E0/NjvJ2eNzFHIZtmsN6s02IGi7Hrfur3L30TqmISjlc6xtVrjzcI16s41lqf5EgZSaoc/gU584y3d++hMcm5nk0foWv/bG+3zrg5vUmw6BlNiWyaUzi3zP517i9NI8y2tbfPWdj1jZ2EYIwURZlW1xPR8hoO2qFMbbD1YJAsl4uUA2Y8VrORAgx+mLGSSDTV9Mu56KWeV6qrZ9tps+GcvANrvz2uvNFmvr22xVG7i+j++6eK0mvucqFS+lamVs68gC+PGNWCnq5QfWF3Cvx6oPmqErcjNpgSCmoapa2GHwh2VZscU60osja3UU0SWEqgwSf44MXgPUkXtRFAxy7e4yrbarXkCBRBiCyXKRar2J6/uxhBFZ5XMZm4lykU++cJYLpxc7/Z/CLhMRjRXzfPIT53jpuZNYpsFbl2/ylbc/ot5sUypkef7MEq9eOk2j5XD11gOu3X1ErdFECCOu0LEwM8GrF09z4fQxbMsaTPoiSb96q92mVlM1n4dpsW66Ktspa3VinNMGqsBz8Zx2GFsQKlk9uHapkOf4sZmh5DE/Lg2MA0cVK9NASBcC0Cl949L7idDSpWuzHf1YiwKLPofF3WVo4IqPkgExz40UZZ296ymSfeb2OOuiB4MszU+FwSAN/CBgrKgS95ttJw6AV9eurj+XzfCF1y9x4fQxmm2HX//6e7zx/nWcUD+2TIOLIde9cPIYW9U6b354gys3H+CFbqXv/syLvHLpNIV8jvFygVNhUEqt0WJ9u0rGtgikpFJrcmd5jVbb5fjCdFw583EoHRSTSF+UwUCDQXSyzU7fY8dx2diusrZVpdV28T0Pr93Ed9vxcxLFD/Qcy7IYP6IceCCFg/Q3decvpOzPITi7j9WP0z8ngkKkRAqJjP3GIEWARMQdBD3fwDIDLEv1u7WCABkGf0gpEUaANEyEDJTLKZq3IUEEIA1kzKkHw5E7Fmt1rsXZSeanxrl/7jhvXb7FvUfrNMLmbZZpxuVrVUqh4Pj8NKcWZxEIrt9d5r1rd5XRzDKZn5rg1UunuHh6CSklb1+5xbcu32RlfZtiPselM4u89vwZpifKbG7XefejOxRyGT5x/gTz0xN856dfZG2rSqXepFTI4fs+zZbDux/d5tyJOU4vzXe9dB93HaLQz0IhTy6XTVTOHAiQNdXN83wqtboSlT2lg/uhZXk/5xrUGgyDBlP5K8FtIRKchIjtzfpypA+OF6kXR45+U3uGWSRCxgEgUoI0VNZS9Eb3ggDbUlFPvgQrCLCCAMNUrqbI5RRHc0mp4rWFDH1ZAXLAorUOZMMwOHlslmOzk9x5uMbbV25zd3lNNTo3DAKpDFa+H6i48LDjxPH5aT7/ygVcz2dhZoJTi7PkQ3/xNz+4wc37K3EW06deOMeF04sI4P1rd/nau9dYWd8mn8uwODdFfk5V4gikOufC9DgZ2+bK7QcqhNX3Hudyd12HQacvxs9PaKCq1ZtsVWq0XA8ZSDy3je86SY6717HpltCOCu0bwB0wEYdQdkIY1eVq8UJdx3eDtCN+R+PvBOQoKUCiHj4hQrNVJH4LCFwf3w+UfhxIPNPENgMsUwHCMEMwywBDhr5jTBAhiA0DEUQcPwniwQFZFSY/d2KBEwsz3Lq/wjtXb7O2VaWYz7JZqSOl5OrtBxRyGV44d5zxUoFve/ViWPPJZWV9i6u3H6pKl67HWFFVuHz10mnGSgWklLz54U1++60rtByXybEiL188xcxkmVbb5avvXGW7WiebsdmuNWm2tpgeL7I0M8bi3PRQOY++jqZpMlYuUcjnqDca1Oqq++J+dHDdQLVVqdFoueqF7jr4jhO7hA5y/yL35VGk/RmxUpZlPUY4Ths8YBRyogJIjzdwuiSJ1Ji7Hu0UgSwZW60iuCzTxLbCbKewqr8RRXDFf8NiAobRKZkizIQfe5DGLv0F2Go7XLu7zOUb99ms1MlmLJU44fsUchmmxkpkbQvH9diuNag2Wni+SupYnJviMy+d5+zx+dgOYFkWjVab1Y0Kvh8wNVFivFRgc7vGNz64zs17yxhCEEiB6/uMFzJ88vkznDu1RCaTeWJhg27YfbG+x+6LOxmoIkkiqdLt7/5kMzanFufi5JCjRPviwDE8NUNLkg5+szs3SMa6spS9RPDOy6LjHZJIoWxVQqCJ1uq3IFC9inzTxA9CIJsBgRVgmBaGEWCayupqyABhWJp+bCAMQAqkYSBl9IIYTIimzpFV3+KTnF2a5+rth3x44x4zEyVWN6tUak2q9VYMTsMwyIUBBp84d5xXLp4mk7F5uLrJ+9fu0Ha9sGjeODOTZQI/YKta54Nrd7ly+wGrm1Us0+DEnIqRLheyvP7COaYmxhOS1ZMg27aZGB+nsIfui47jslWtU603VZWTsDBE4HsDM4513JNHjw6sA8dWOyl7iM4H58Q6kPUxeluJtZI/MZAjQ5ey40phYAgVghkVbfNNE9+ysAKJZcnYyGVZdhha0im2JwJiHVkEEoSBROD7ygUU/zdAIOdzGV69eIrnTi2wsr7Nf/zmhzxa34r3i8vu2Cbf+akXOHdiga1qg99+6wr1ZovVzSrb1QbX7z5iLGw47vsBzbaTyHUu5nM4vmRhYpzPvnyeUiE3kGSHQZAQgmwmQ2bSplgsqHajzVZcmrjbQOXjO+19G6j2QlG46VGkAcRCd1+slh3ce6e9DKsBtN8YSbAngRwIqbilEemxkXgexBw5sCx831e6smWpIJFYtA5HFqoovaHCfiD8jhDIQH2XYvBAlqgOEKeX5igX83F3iUbLUYauIKDWaPFbb13h9sN17jxcZX27xon5KRUSGAQIYdJoOTSaTqx6RIkiAIVchk9/4hxnT8yHYz75/FadohdJLpslm8nQyDXY3Nxms1ILDVR+XFPtoAaqfufV70fyWT5a9FgA7uazmjFKXX6csd/JRoK9Ajp5I/pbAnUgd0TvMP/YB2n4KnBfKAuvIcPi9EGAaZh4fqDaZAYS0wowgwDTDEIgmyAkgTA61mojekVJJEZ82VJIDAaX/RQ9wDMTZX7np1QdaVUZ5AGNlochBMvr2yyvbccAXdmoxAEHfhDgt4MYsKH9j2zG5rVLZ3jt+TOxsesocN3EtWtrKGWA57pIz6PZarKysa1CH73HN1Dpax2R6itlU8hnyWcz2JaqFHMUaV8A3m15ZNheJS5kFz8UEahTsZHsfdHTInP6sLiuVjjTuC5XqBtLAUIEYatU9c+UosONgwDf97F9VTggsMK2KoayFgsTBAYiCDRuHLrKQrEaBIEMevq0D0KxWB2u48LMOLNTL3HpzCLf/OAGtx6skgsfrE6/4oATCzPcWV7D88IXFzJsoyJYmpvksy8/x+nFWRU7HYqkRw684T0NfI9Wq0WjXqPRaNBqNvFcB7etG6gGA1zbVo3hx4oFctlMVyDLUXvJwX458E7GjY6FK5n7q4mVIopHToAx6Zba+fS9g9MRnXPqfug4XbGHfhyB2DBE0tAVBNhBgOWbmJayXksZYARBmH9sEIRAVqGYAEF41UYn90kOrixuwocsVO2thZlJbt1f4daDFZWsENbdcj2f+ysbyEBimQbFfJataoNiPsvrz5/lpQsnKeZzR5Pryk66eBD4OO02jXqNer1O22mDBM91cZqNx9Zz9eMztsV4uUC5WCATJpLsdB+OEh1MhO6bqNDhtp2LhoT+kPbxJoY9+E2JK1fGD6Xmlgo/pANBIhCroI0gFquVD9nCDgICP2xbaVoEgcSUFoYhw8bSAQQi9h+r91VoPCNKYhyGoUslLlw4vcipxVlu3HvE21dus7y2ieN6KvMobFJXbzqcWZrjsy8/x/H56fD4o8V1E32FZIDrODSbDWq1Gu1WK+FKCuIQ2YP6dDvPYi5jMz5WYqyUx36C3Qwfhw48a9kDxLupt53ILG3HROyzNja7c+W4LhQdnSkGa2wh70gN6YiuQHRiqo3QQKVATQzmwAowfB/L9LEsP+xDa8VJ7IYQIRc2iDixxAiFDBHnL4shGLqiggLPnz3OmaU5Hqxu8nB1k1pDtRApFXIszEywNDdFLmsfGQtzRF3tSXyPVgjcZqPRM3MpSvY48PmATJggMl4uPLXAjeixZp9+DNJGrSRgex0R7ZeyWUfgY3cw7w3EEZZFmLigpSACMgji2GNDGEiS3Ng0DTwzwPZVSKYZKA4tQzAr/EbSh0QQJEBM/KIYHpCzGZuzx+c5e3wuUSAlsgccPQuzNn/fp9VqUq/XaOwSTukfJBQyHMuyTCbKxbi657NAg3n9KOTQG6B7X+hE5FWPo9Pmff1zfxATgkjGD43QObOWKKGCNZQlWYYidlTSJwg6fmQz7B0UmKYCtGVhmjIs5RPp+zqI1ZZYCpChe2rQrqcUZ5Kys5JHB7h6G84Ax2lTr9eo12s4bWfXpH9dhN7LuUC5zsqlPJPjZXJZuyvv/Gkma78i1d6txgcP5tDP088TnH5Di84PKRCHc0mBmB5itZ6WaBgijK82CKQfc7Eg5MBBEBDYNr7vY/o+tm1jhjHWpmEqV1NiDTrnllqOZEJPPiIgGwYlYualxPVcZaCq1Wil9NydKGpKvtu5QIXWFvM5JsfLFPPZxDP1rKy0JYQI9Ivea3pVZzEEUZWrDpQG5/ROzGcnfbmHhXyvINbHAVQsrYziqTuhnUYoBkdADoIA27Zj63XGtjGDAGkGmJaNQQBGNzCFJlbHa4ri/M8aiPU8cZD4nh8aqKp99dydxtqJA+vjFHJZJsdLlAq5rsZlz9IKW4QATgMiWogdViuUDA93Obr05dS806J0AsTRuzcCca9xdWu1lAQiSoqQSGmE6YABUprK9eT7KlEi1pdNbFuFaZqmhWlFBrLIyhq9PPRrURw5IHimQJysH+3TbrWo1aq76rk7kd+DA+vj5HNZJseKlAr52I97FDooDIssIYQJ+9M5ddItzx3v6/CpU3ZH47y7gRjC7oohiOnow4lxZUe0jdxOiiNLZeQKLdWmKQlkJwjEsnwCS4nVth1g24FKnrBUeKYq35MEcdyWJuTIQWjJNsRgO8kfJiUb3QW4Tptabe96bv9xVc63fh5QonI+l2Wi/PEBbkQWsYG3hwGplzW432LIMBl+HwLKXt0B6bmJPr93vYQ0fbgniAnjmJNm2xhU6TYxQRyWaahjpVS6stERq5VRyw4raAZkMjIW/SzLwjCibovadUVA1lSEgOCpA3ESMBLPdWk06tSq1X3puX3HjyPKiN14xXyW8XKRQj6LaXx8gBtRtxU6pSP0S0foMn4lVVV6AXm/Re56HZvQWVNz7WX4Sp9PdgbsuJWicXpxYzSxGhmGZQZhFJcSq3X9OApntEJfcSADMnYGKVUgSMSNVUEBOhxYn+NTBuKkngt+5M+tVmk0G/jeYCpRRmNEdZrLxTzZbEZrePbxAW5Eu7qRdrQGRw9/6EbayTzQs9LGTudNnzN9U3q5TnYIXUyIddH40Usg4tQ7rcEOYrUK1jBCwEqMQHEKK5AEgYXvB9i2hW3bBNLC9ANsW6q2MIjQVfx0gjhh0Ax8Wq1W7BZyncGm9hnCYGFmAtuyEsn1H0fgRrRnP3AvEbvzY8S8Qi1Y+wz9rX8dEbJ3qOWOtyMt9iZ+6s/pRfg9iMYPX0Kdl1GfMNG+YrUqDyuNDojT/5TFWllgLVv1Ow6kVAX4bCVWy9RcjzqI026h2J9bq9Fut4fQP1jGum7XrfkYAjeiAwVydCUVhAXsIg6V+K2Ha0f7MYxe730DdtKQ4wc90tFTv+12rAp8JCE6y91ATC+xmlC0VtFchjQwJDEXVmJzgAwCJUaHgLYz2YS4bVlmRzroA+Kj4CtOhD/qem6tRqu5txI4B6Enfd1HlQYSidXx/4qurfq3nuDtGkz01bsT1IMDi16/a+OCltiwFxCnxk8O1y1WS9HxE5umERbeU3qwFQHa6nBlO5MNdWWIalhFhQToAeJIr3gSD3NXTLLvxQkHzUanCJ2+z4iGTwOL5I7ycSWGEi5jMXoXEjtz7L0ep+vl0e/9AN0r2CMNYnTxvt98eonVUiKFD6FerAApYxeIyj22sO0IyDaZTBbVjkdgWWEpH3pz4l7XMExKxJWjwh/b7Sa1mopbHnZP4BHtTANPxdi3H3gngHAAS3WP0MrEOGkgR6ClG8RxAsUe55gIywy0LhGhpVqvGCJlgGXZ6nMgyeYUiKU0sSxU+xitcF4MYs26N2zA6PnWh6Hnjmj/dORyqcRBOXLqWJkWgfXvOtB3AXF0jNgFxPr5k9FcfgxSJVp3iuip1Dg7didlsyKeoompyv9oVSEiEEdi+7CitnbUc1tNfM/ve79GdLh0qADuX81DHlyU7nOeeFx2D15PgxiIXWOhohtW9thZL9bHS3BjP0AaUrmrQu4bgTgaTrhgGiZ2RhAEQkVuSZCBDBMjNHE6DCIZdOilLgoLlD+32WzGccsjPffo0YB7I6VBGFqnewRd7EZ6csKB9L8ILNHX1Ox6urS0F4kqi9MJu9Qiqfu6vXrNMZ57gNKNZRRTDVEuuRH2YnJdR/mGheqna4Z+4m7/eXfo5eNYqHU9V6B09ZYWtzzSc48uDZ0D99WI9/Ag9Mowgp1jtKXGdWX0PUSeTI+bGiOOzEoEVfROCdROuOM1pcXqQAYaJ+4k2kf7Cqe9pzXQf+t1vj3fH13PJdRzazVq9Rrt1kjPfSLUedzCv/3VNwvlSXm88yXGVg+CiDN+RILdJR7GPVh7e+m1PXVdnfRtMVj0Ynsp/3M6tzgMBZXxtKKwy4jzaca6fmBOLVAabKonbdRas7tReeDbcYiihTJq9fKn99KL02vUi3Q9VwCeF+m5VVrN1kAbcY+oP+l48D2fdrWJ22iDIciV82RL+Y5Rtcd9GAiAITpBJDarv2hupJ6PQBq8fXy3na89widJAZqOmBuJ0BEn7qQwRFJxHyBr/4uO1ZhUyM1Fl6V7R6lC4/gdHR186SFTGTa+L5GZcM5BQBDYcSKEvqCRdVpflyCukNk/pDT6Tem5Kj+3Xq/SaDTw3JGeeyikJbD4rsf2gw227q3R2m4QhEZCO59h9rlFJk/N9b0XQxChk6DV3xy9RL7wh94g6AOM7kgw4pdAV2SWTI4V5QaHzDQJ5FBa6IjW0RApy7U2pDostbj9rlFbFzSuGfgBLm7oYiLlglJzjrKZzLCroi7aRuVu9fziSGTXdWM9pFXKgGarRb1epV6v4zruSFw+JNIx0diosnLlPrXVbWWw1JbeabRZ/uAudiFLeW6ipzV2YADu6GodLqxvj0Da9+HYKS66F2eWPbh7KvWxg1aS24leLsS6ccx1Zee8Er2dqeLHUXWOXRaj351L7KMxdAVi6YSgjQquyVg8tm07/B7Ea6pCNX2kdFTHxbADY2QI00XrDpAljuNQr9dU2dZ2i8B/vFKtI9o76YbZrXtrPPrwLm7DUYzD6F573/HYvr9OaXa8rwg9xMmKWH/cE4hhTxx4dwTRAS8kDGlpbhTpmdG4IjZ2aTpnfIyuD0OKMe9OvXR8XTIIJK7rqkZdvp3gxIGvanDZtsS0zASnDoIAz3XiOOpMJkMmq8I0dfJ9j+ZIz31ipD9zGzcf8ejyXXzXjxlHFKiTTtNtbtfxXQ8r011Jc4gAVrOKuLEO4sgCvOtDs5uBaAe9WWr/eg8dWZy14CZtvA4zjqSJpPif0If3A+I+1xhLBFKV6VEZTL4G0s42K7BDfVjGerJKjFD7tFotTNMgl8upAvWZLEhJtbJNvV4b6blPiKK13ry9wvKHd2Nd18pYZMt5hBA0txv4rpe4L37bw3f84QO4v8ujk/CdiJDaw0O0a1mfHm6kPQdzxvpgpwSPPufOtg4n1lMlBwbixKVEIrrEdb2w7laguGrGJwhs/MDHtjppiMnURRU55ToB7VYLO5PBtiza7RbtdlvpWYyAO2xK4yD6Xn20xaPL9whcH8M2mViaZvLUXAzg7QfrPHz3Fr7rJ+LPA9/veR5LhgiJHp4BTV/zl3a4sDqPZknuF5/cc8QO0HTa/UHsgmH3HppUIDsbu+bV1wg3YOrYESS+r6zUvq/E6mw26HBiMwRxyH31tVSWbUHgutSaDXx/ZKA6TIqNVJs12pUGEydnceotpfO2HLKFHPMvnGB8cRphdoIUJpZmqC5vsn1/Y09wtIQwjFhXHKpYlTShJfTixG69QROBqws+OwIqyVd3CqnsKVLH+0cd2pWlWo/LGjQX7swndMURFQRw41K2EScOLNW3KTZYSb3wuUAGPoYpRuLyEyCn0Wbz9gobt1fIjxcZX5pm9dpDmls1ssUcS6+epTQ7Dqhw2fg5NwWFqTLbDzaSsfhG74IOlhDC7I77P/gN746MisIpBeli7z39ur0CN1Ln6Ld/5/f4R7TUnS63Vo/Jd4nUsR6s5+R2H5aI9hoUTHSROuLG7XbEjVUxecu3wkZret+gKDiEQ5EYPu6Ufqba1SZ3v3WN5lZdPYzjRWprFbbvrWFmbI69eCoGL6QiAQE7l0nG0xsi7vGcJks/sLcrVu5LvO6uwKH/1g1i/fzR8V1jpvbpfkloe+40Vw2gvcbRx9dfHjL8EPlvd1yPQSJYW0OdGzuOi+/7eJ5PJhMFeZjhvDoFA0b8driklxUK/IDqoy2srCr02q421U5hoMbGzUf4ns/8peOMHZvacVxhiCTvCSuZ9iA/YcTqPNC62NWZbHKfPifvHXIVc5EOiDu/9Z7D/inWuenmwnpxPj0iaicQx/uE48nIxN/jRTcsUTq5rjo39uPC8rZtY9tmoh5ynDs8oqGQ7hJqbtZYu7FMY73KyU8/p3bQHoBWtYkMAgpTZaZOzyeO70VBIBO6omGInj5iQPa1QvfjyrsDWQ/oSMYX6+J08lxJjXO/tLs3SiTelvrZDsSN4wsaPFD3cq2d9Qtw3UhHVnW1jLB4vJrvk6+h9axSxHVXP3rAxq1HuE2HwlSJbLlAq9pI7uf5CMNg+sw8Vs6Odd5+JDX/PIQc+KChlAcHcq+xOg+fzoV7bdOOOuAC75Rb0JsbR7/JHoa0aJ8kiFFsGS2keggidK9ri9atw40DPM8KC+SJnd7aIxoQtWtN1m8u4zvKb1uYKmNmzJ4PXn6iGIdD7oYZPTIOCcI04q6Xadp3Wdm96MnJsMq0/hodo2+TXduS5+4bjtFzWy8u3++a0ry/l/8u2rfLUq2J1WmJ9RBwnOLGEs/zEtzYMkcAHhoJVOKBG1bhNAXF6bJ6FgLZFdZbnhvHzOwNbhGAI36gx7mnad+BHLvpyRGQdwKxfow6rpfRS/b8PTnGzqJ3Um+MxuytcydGSicekAKy/j0+ViSGPizoJF+IKmLLcVQJ26xtPtbYI+pPMpA0NqpxAoKdy5AfLxJXUdF1WNOgMFlOezX7j+0HIXLD0GNNLUqR/1iRWLuJ13sfp/O5vd0g8H1yEyWE0eks2H2M1ETvrl97cuGdjEvpuOf4GP13KbvEa/0aHk+TfzxKR3F5rjeyRA+RAtenuV2PQZkbK2DnM8qAGgTo8YCGZWLl7D2BF5kSoVEvgD4PrhxIuf+Onqj+pfXGyLWx+0DgNlqsv3+HzY/u49RaYcy0urJIz0yKjsQPbXqwWC9F33e/LxftekKHuv4d7VoFTwa8yflqX0Y+4KFRu97CqYfVUwQUp8eUrho1YNNDFYz+gRi9qCeA+9DAY6GhN0fec2VJw0D6AbUHG7Q2apQWpygem8RMBXL3M4j1nlcyxfGgBfOSWSJPGqojGhjt1+8noBVmCAGYtkVhqtQZLtWEXIj9GRS7AGz114GH0nCnF0feKxfW5+m1HLZuLLNx+X6cudFv3z3MKjEfKXvPZ2+Swgi8zxSF97O5VaPycGPXZ0AGksZmLeaymWKOTCnfyTv3g5QbaO8AllIqHVifXn8OHAw1HzjNkfezmNHxUkrceovA8zGs/RtldHeSPp+EES2QOJUGdjGLYVvxQo58qB8PchptNu+ssHl7FStrU5gqY2Xtvvv7jpfQfwuTJSzNwhz1MI5IiH2U/u2pA5v9DGDDBXDnAvbjKxZdk40Ko8eJz0En8XkvQ+tJT1FucvQ9zKSmemcNGUhKJ6bJTZY6b8xhhFWN6MhQfb3Cg3du0aqo4Avf9WhtNyjNj/c2Oglw6i1VeI6O+0h/ZqWW+SWl7CpIuBN1cWBxiDrwQKjXdQYKwE61SePRNm6jhRACq5AlN1EkM17AtJLd2fdyothyK5Shrb1Vw601yc2MUVqaIlPeuSLgiJ5+2r6/QXO73olp9gJqq9uU5sb7HtPcqqtKGij3UW6imGQ4QdDxWMootnmvHFjGHDgqifx0AbgHgqWU1Jc3aK5W8FpOwl9Tu2eQGS9QXpomP11WrqeuwJLE+nStpYj04zA8rvFoi/ZWneLCBMWlKUz7CC7TiB6bfNejuVVLeE0QUFur4DleQiyOKK3/Ru6jzg49RGjT2Ad+ZeyGMgyD4swYxemxfi6owxGhH5ekH1C7t97hhNpiBH5Aa6OGs92guDDJ+Ok5zOz+9NioWAB0xGu/7VK9s4ZdzpOfKe/Nhzeip4ratRbtWgtIPivtWpNWpa5S/lL33Wu7tCL9FyhMlxWH1DlwWoc1jD1z4Kj+WW6swMzZBcaXpjFtq9+zfPQBnEgm6LEI0bbAD6jeX8dtOkxdWMQuZrVGZd2+472d/Elf/YiGQhIwoLlZU/WnDIFpWXiOGycf1FYrlGZSYrQAp9bCaToAmLZJYarcPXzajbQPHVggmD6zQGl2jEwxp8bbgRENxY30+KubuqhUYIgMdWLdFRT93tqosnH5Hl7DQQgDhBECN6qQuT+reL9i8iM6giT7fE6TAOlL6htVkBLTtigfm0wwi/rqduzn1amxVYtdmpliTnVOSJ0r8LtF6L0yA8M2mTo9F4MXdjYCHz0A77DwUkqsrE1xYZLS0hTZsYIK/EiDeKvOxtUH+I4XR0v1SAjc43lVw5KdfMcjesKk2UT2mgsdi8KAnc8yNj+RMBa1q01lmdbtJ77K/Y1KtRQmy116cqTD6mTsIwprn8bSoy9CRySlJFPMMXVpiUy5oAxOrkdzvULlzhpuvRUvgJSS5nqF7dsrTJ47pgUq98sR2qkALXHaYDogZWSZfvKki5etaoOtO2uMH59WiQX9SECr0sANReFcOU9+soRdyOJH7qRQjC5Oj8WHeW2XVqVJVIQ97T6K55QWoc2h5WX7R4IDRy1Fwm89flc3qXxyhuxEIcSgxMiYlBanmHnxFNmJzg2LFqt2f4PmWqVjP0jEUutWh34zS1bTjKLLkhUqRxz5SZIQArflsPrRA25/9QqrHz2gvl7dmQNL1dIk8AMQgtxEUWUThe6gqOpKfW07dhchlHErAr2d7XYfqbFlXLo3nuM+OPB+L/+JAbgjjspQN5U7rrmZtRVIw5Iy8f5SkCnlmbp4nEwpl+COge+zfWcFv+3tbAXc7eWYqKGXDhE9nFKzI+pN1Udb3P7aVR59eBcnDK5orFeRfv97Enh+7AoyLZP8eCHkqGOxG1Jx6SbtakeMbmzWVH1mCbnxlPsopGRlUEU7+XEfl54IgPXyNghNwRchK+6x9lbO1hKiRTj1yDwvyZTyjJ9dwLDMBKCcSpP6o03tuF4TYl+MtFes90g/fgIklNjc3KwlXIyt7Tpe2+l7mNNsx0Xn7HyGTFG9+AtTZaxcB5S+61FfrwCh/rtVj7Ww2H2Upi4OrPJ5h+TROHwROtFQOs73MzRA9Dooqgtk0AGvbpxSOxWmxyikynVKKak/3MRvu+HG6DS98373Q/3F6hEdyjpIKM2Md8Utuy0n1lW7SKhIKi98HnLjRXW8hEwhS2GylBCja2sVAi/Adz2cmgJ9P/dROKUYwDKQWLkMuXJ+WJpWcGgAjjhUOo9W5ftGnNjoL9XHxxkJy3JsXw5jTkuLUxh2kgu79RbN9SpxZBY99OCe52RPDviPOzfWr9X3fGQQHJqBL1vOxborEIdDKhdRj7kGUonYYTx9YUqL3jMF5fmJhBjdrjRxm231r6VA3899BKiwXz9AmAbjx6c59ZkLjC3uXEb2cWiwANatUdFDrAE3Ad4dhuhJPbhm8nf1W6acJztW0DaHVunV7a4ImUFSP278LANZLzwe+D5b99d58PZNvLb32GNGFPgBbrNNq9KgXWt2jErhvoZlqrjl1Au5uVHtmYLqO54ShVFNxQqTScNVcbqc0G29tktzq0672orHS2cfJeaPJDdR5PjrZzn+2jn1ghiiZDY4N5IeZByBVO+soP2287tZ7vJb6MpBdLivVpDZMA3yU2Wa69WEi8GpNHAbLbLlXO8zDGiBe6Us7rc4/tNAel3kxnqVtevLYWFz+2APa3gLozFblQa1lW3qaxXaYTqpEIJMIcvY4hSTJ2dVjLqE4swYVtaOxWKlGzdxGm1y2stcWZJbOKHLMVPKJwImAOxClsJ0GafeVpw4kDQ2avFnlX001jekwLQsjr14CjNMfU0wr8GTNxgAd/L0woXqH/LY675p69uXOhqyDloNvNp5M2MFDMtMvIF916O9VSdb7hHhIvuf82CYE6k85GiZnp2sJlV9MWDl6gNVWrXtxW66/VLCl1tpsH7zEdXlTdwocUUb0206NDZrNLfqHHvpFFbGJlvKkx8vUn20Fe8bcdrceCFxfxubVfyIk06VkokqoRpWnptg+/56LGY3NmthaxOJlc2SGy/2Fs/D402jk7c+5Pt98JpYektLmTJKxUbdTpIPRB0TUv8EUvvXhwRxD1yROqYXwqx8JlHCMxKPnO1Gp6Ga2NvTtpu8sOOxz7i1OggktdVt/Lar5U/H/9vXOvmux9r1h9z+2hVVKL2lrMhRHHH8z+h0t1+/saykLstIiNFRade4amRI0g9obNTiFL2Yk3YmoiKspspkCtl4c7vSUAn8CPLjBexCpu91HDYdCMC6WJCIU44uBGJAJtYnAVaJ6LrRsq8o6zuepsMK6BpduyjL7K7BK1TBvCB2zHceiOEXYn82g0BiA6ReNDD+3y6k7dOqNrn35g2W378T+3Lj5PhUzHu0ngBb99bD/UW3NVqouGXf6ejjbsuNE/ftQoZ8ijtHZOczcQqfEELV2vaDnd1HT4akIRXt45CUJdnoWIU7AU8y9bn/+F3ct8+ufttVucB7ICGEKo0j02N4+I4bnzeaAVFbwSHTMxcE0vMdKnc3J2iCU211m7vf+IiK1k4zU8gycWKG+edPMHdxicJkqachyG20FUcFMqWkNRrArbdp15rxPFuVBl4YSZUfLyV8vp25hd6M+QmEaSTEe8MyVX3no0O+JYTw1Lz3Ft+rC616OdXOr+FvqSrJ3SAWqb+7zNT1lQ47Vti9zE0Yq5qmwA/w2x6Z8j5sVv1c0z06OOxFhOpVufPpja0+oIIRHlRZ3uTBO7dwm20QYGVtJk/OMXlyhkwxF9/D6dYCyx/cZfPOSrLHVSBpbteZkDMYlkF5boLqo614Pf0w4qo4M5YKn4TijHIfEUBPMXqyRLaYVY3JQuPoxNK0MoodnXeutBDC1NZ03w8idHRZ6AZu113rN5NdOgVKKWmsVpSfdy/F7XotspQJkWrXqe2gJwshVLE91yczXtg3+JLW6sikKXt2sTjSlJ7rHmXo6qMtHrxzM44tzk+UWHjhRKJvLoGym1hZm/lLx2lt10NdtENu0wltIyJhje7owTWkr0Rw5T6SWNkM+TBgo9+9t3MZijNjtKpNClNlZs4tUJ6fxEhx5SdNlhRJXrUnIO86eU3c0cyx/XoOdf6Kjv+4B7UrDRprFUoLkzvPT0oVs5q6LillT9/gQd6oTrXJ5pX7eC2HwvwEpaVp7NDwsa862AmO3Gm9epQekr3MP0H9MjbDa2ps1nj47q0YvKXZcRZfPk02jFjSA36i0e1ChvHFKZrb9cTaBGEnPyEEmWKOwmSJysPNWGxuVxp4bZcgCJQ4DWTLebIp91HX/AWML02TKeSYODETd1Y4YvfFt2LApvyz0QOfuEk9Jt/NfUXiBqRvYDy+/luqJlEvitwWlTur5CaKWLlM38UMvCB2a+jniONUIwMJyRfWXikCbxRaV7u/TmujSmlxmsLCROyaODiQnxLRuocO3G8do7Vwmw7L791WpWyEElUXXz6j/PPBzj7TwnS5yz2ox7FH1ujK8mY8D7fl0K41Cfwg9BMLilPlnaW48PSFqXKcTrjb3J4QdUIpdSAnQh0fM4pE9BhP+zEJ8h0cr9EcnGqTrRuPCHy/e27hR6/l7BjMnr7m/eyjwHsPp9bUrLDgNR22byyz/t4dmmuVOJzwoK1cnoaIrrQFJKJec41ewKsf3VdhjkKJqQufOJkAb1+SKvE+HQGVKFcjVYsTWzNOBX5Ac6tOY1OJ0oZlUIjyePdwL3p9PkrUFcgRaWOJyXfW8EBGiy43U0Js3p2kVEHhgecTeD715U0My2Ti7Hz8JtW5XWO10nEXaWMAHbfRAYxYTqXB5tWwZ1OPmyulpL1dx6k1Kc5PMH5mAeOAHQKjlqXqc+oajszDtLe63FGAQ2V5i827a/E1TJ9dSLhrdiPDNLpcOGbGStyjyBrtPnS0SCplvJJIMoXsUTNEPQ71DuToxY0ZEDcWvTixPqNe40sV45yPxBkpqd5bY+2Du7QrjQR4m+tV6g834vOlz686LyRfKLveTSFoVxpsXOkGby8ybYtMuYB4zP68/ZrGHSmO3NOI1X0dXstl7fqD+MWanygyeXI2PObg12LnMwkVzzANSnPJhITGhorcEkB+srRj14WnjHYOpeylH+9J7NQAPygyTIPyiRlaWzX8thtapbdpb9fJTZawizn8tktzrRJbIbsHEViZqM2j9ruqK9t3FZxKg80r93HrrR1fPEIIspMlxs/Mq6LwDMbosVsb1yfGkXsa6Xu/XLbvr9PcrMfxzpMnZ7Fy9u6is0aBHySKngtDqKygjtiYiI12W456eUS+f8OIk/a73EdPKe0pFjqWOHskIvRag2FZ6rLjRcZOzLJ1/WF8Dt/xqC9vaTex/wNt2iamph/taksXAq/ZpnpvvS94o4fVsExKS9OUj0/H/ZWiMQZFRxPIu5/Ta7ls3lntBGoUc5TnJ/YsOkfku14cxwxKfM72yLXNFrPkJ0u4Dzbi5yEqiLib++hpoz3HhEWCXCRWR5HNYVGc7gMOKubtcszYiRmKC5PhrjIOh9T/9h4X7GJOZcvsdSpBQOXWCk4Yftc9VTWSXcwxdek4Y6fnMMIi3MOkoyRad3klNKtwJMJWV7fiEMaYQ+Yy+zyR6kkUW6Clcgels4mQEmGqoI5IjI7SWvOTpUSM87NA+85G6jA69UmEqX2E38TjWgd2OdywTCafW1R1jVa398TtowcpHzZh3ssMVU2tgCBqYtXDJSaEID87xtjp+T37gBO/67vJeIc9p/TsxpEHQV3z1Xyh6S4Z6YuJkusrDzY6DenCao77FmMlNDfrqtZV+O4qzY7HaXvaosR5vVbWxm22sbI2EydmmT4zf5TimAdCB0onTFul06CNu7JF+wxCtNPGsLI208+fwLBM6qHPb7dzZMp58nqUjzZ/9Zbudcr++q6ZsSifmKG4OKXaP+5yTHRctDZevY3baCH9AMO2sApZLM0gcxAfsjpuz/jfkRIhi1LSrrVobFRpV5v4joeVsynPT9JH+IrB7tRbqoBcuJ+ZsTpW4H3MM65PFR5jZW0lhvehTDFLcWYM3/WZfe5YIrH+6FjxH58OnA+sc+FeNPAl0m1OoT4zdXEJu5Sjeme1k8xN0q0Dyio8fnr+wNbHhI4ZXm5hboLyidn4971IAUIIvLZL9fYqzbVtAtfv5JDaFtnJEsWFyTg0c/8Pm5aH/Bg3QH/RNLfqbN5eobqyhddyE+l5m3dXw74/iaMT96yxmcwIsnOZfYnP0fo0Nmu0wkJ0SCjPT5ArF3Y4xmDhhRMYloWZMY9iFNVAyAIOVP+kA12RyjiKxK2DceG9GGSih8swDcZPzpKfLFF9sEFzvaIs1EHH52sXc4yfnic/M9Y9zj7nEz8AEtrbDXzHw8xYu19bbHBz2bp6P6zPpf0cSLy2i7e8SXO9QnFhkvKJWcyM9RgP3cEf1OhFs35jmY3bK3gttyv3JHIN7XivpKoQKQMZ+2StrL0vMTaKad6+v65cUALMrMXkyVmEKXpasaN7Zeez8foewSiqgZDFAFzaOpB1GooonTwBoMTjqQuLeK0Z3GorruRg5TNkx4ud3OCo+AC9JLjuZYjAU5gbx3c8Wpu1+De31qS1WaM4P7E7yMJ1qN5bj8Hbb//A9aneXcOttZg4fww7LHm6/7Xb523VFqSxVePR+3eorVXC+avfhSHiYP5Aa2KdXLPOSy/wg7j7X0SGbfbMFOs5pZD7NjdqVCNPAzC+OK3S+nawYj8NUVSDoE5UwwEobdBKGrE60Vb7AnGnVEfyXKk3aFpMFkJg57OxMSkeTs+bj0Rg0ee8iePUwzN2co7yqTmaa8rnHL3NpZQ0Hm2RnxnbE0fxGm0aj7YSc++5puHYrc0aG1fuKzXhwCDeB4VDVx9t8fDdW3GsMih9szQ3Tnlugkwhi+/5VB9tsXVnFT+sVdW9lqrLn9dyEuu95wTEKJneC1i7sRz7crPFHNNnF7Q+0M8uOPdCj10TS9eCI7u0+hxl1SSTIXYEsQS7mMXKdQqU7Uf07o7NlXFBPZmc5J5eW4ZlUpifwLAMshNF7GIOJ9LDUCV6nEqD3GRpV+tRa6PWqU2925qGIHYqDbauPWTq0nHMQ4geqj7a5P7bYYpf6D8tL0wye/4Y+clSgnOWZlUFjJXL93oASa174Pn4XrISqO/7e7O0hT9v3Vujuryp7odhMPPcoqqzzLPNWfdKA7GpdxxKHf4bfU8scYpr9qL8zBhzr56ldExZd3dziSSivrpCPTvpMipNT6ZVuT1cGSCV9TTSo6MHNvB9GlEC+U7W50DFSPcT+RL1xVK+3NZmjUoYBCGDZDrkINxFcTvN9WqYXK+SQAzLZPbCkiqNOl2OdVFkR6ecPDmrAimSA8YvyyBIdeoTqoqG7/q7T0yoah0rV+7F4vrEyVkmjs889jU/SzQwp5hu1NIDO6SWDxzvu0MerxCC7FiBmRdOMPvSKcXddntZ7yleWwdz93n3coX5mbEuTtjaqMWdEftR4PmqlEtPl4sKPMjPjDF+ep7isakuK21jeYv2Rg3fcdm8cj+R7aQGOcgd67yInHqLh+/dwqkrn7dhmcxfOs7cxSVM2+wYBVNJKFbW3nfXAbcRtjUR3S+gTg65il9O5wzPXVyKdfARKbIG5jjsok7nBCk6NaJhB11Y94EaBoXZcbITRWoPNnYFmUgZp7pL3nT+9ow/2MNDYRWy5CZKWq8l8B2X5so2mVK+73FRFlX3KUM9+9Qc5ePTcRc7t9Gmdm9d+biDgMD3qT1Yp3xyjtZmjdZGlfzMGKXjMyrmWhzMRRIFqzy6ck9VqwjF5plzx5SeuYsrq5Mc0nst09lDAoHv+WzdX+tw9bCahh7yWHu0zcP3byugS1X+dfGl09g75IB/XMlAiCg6/LEH0/Xhji8/BJbOiXcJ+dMNVKZtMX5qjvKJ2cN/8wr08CYVeTU3FjcVjzOg1io7FtyTftC3K0R2vEhpcarTglKobouTFxYZPz0Xb29vNWiFjbYCP6D+aIu1925TubVC4HoHfqi37q2xfX8j/j62MMnM+WN79kP3/DmsmWCmq4PGeu06G7ceEQSB0qsNda+deouVy/e4961rMXjzkyUWXzlDtpwfgbcHWcA2MBdHADxu5gw6eDsgjjgxUjNwsbtFNqK9+g53Tnns/QCIKK1Ghrb0HeaUHS+SKedob3fio72mQ2u9SmlpuvdZg+75RHPMz4zFXCwyuAlU5szYqTkC16dyd5XA96kvb8U6pRACv+1SubNKZrygVI29UnhjnEab9evL8Zh2PsPshSXMsMPjnsDSS6cP/2/YJrlyIc5CiuYdeD7L798NG2irKo/tajPuwhBRaW6cYy+digM2RuDtJgshlGwXgTcdWHsA2gnEStxT5xmaf7iLkkGfIvWiMrM2E+cWqNxZxQmrEHYfr9bIsEzyM+O0tzt5yFJKGitbFOYmeifw97k8wzRV3nCkW+rnAgxDMH5qlvZ2nXal0SmJm3CnsWe/ano+m3dWaVU7L6KJ4zOqNOs+7klPF5JWPKE0N87W/bVEwEVkAKw82KAS5m7rngHDMJg4McPcpeMjsXkX0hSUTgRVAsgHpHScvi5Ox6JpmCUy6OD7nrPR8we064v00OL8JLMvn2HizELcbrLXdQDkpstdhian2qK1Ves5h37F4w3LUJFcRK+WZMF8ACuXYezETAzSrgdZiAN1gHfqLbburcXf7VymY+Hdz/3YCVdScdEo6CI57TB7LDVOtpTj2MunOTbSefdEyTuvL5Sm+x2U0kfq7ibQ9OJDSIOLuH88rwTXU9dpZW3Gz8wz+/IZiscmVbke0dkrBlU+Q26qI7JG9Z4aj7Z6ttY0TFPFDKfnZCgjjxCpQBUdxEJZvzPF3kayg4YIVh5uxk2+ouydbGSI28d4adVGMeDOy9HK2Cy8cILsWD7RZaHzTx1n5zLMnF3g1GcvMnVq7siVbz2q1G1CTAP3MXTjXqJ0J5OpoxdHFup0zayhUFSUoEfZ22iSmXKe6UvHaVeamJbVtS4qjXCcxqMtAr8D2PZWHafSJDtRTESIGbap9Nx0IEfs/epTTTsc18zY5KZLtKs98pIFO3PBHuS7HpXljU4BhFDU7RdbvCPJ/huicQpTZU5+6jnWri9TD+PVQYVVZos5irPjjC1Mki3nPzYhkIOi/pFYOpB7fd4j9QJxZ7uI84l1UD2OXrx73a64bEfv6wstqMIwyIX6YBSooVvZM2MFMmOFOD46Ms40VraShd6FwLAsrFxGRXFpl6U4ktpHyE7zty7pQCjjWdziMiUp7UsHFtCqNFWCfXiYmbHijnv7WXcZyK5Y53gdU5QbK7D06hncpoPXclTB9oyFncskSryOuO7+aHflKS1WJ8q4yv7/9CFIupeS20XX9scWqcU+CvClr0+Ibr23B1cwbYv87HjXeVrr1TBooxNYYpgGdjnXxSmlH8QF6CV6wb/wlDF3FVi5TCLvWF9DhNG5H3ugxnolEQ1l5zKJptZ7Ja/t0KrUSS9YP6u7EKq/b2G6HIvs6frMI/Dujwz2IoD1AnEayGlK7bMjiGMXTvJ8wyoR0zWiEN3XuONyqN/z02NYqQffCwvrJXVayI4VYv9xRIHv44epehFgu9pphoA2rD5ZPKJT2nUvKyX9gMaWFtYpwcrZe2tXE40RVjipr1c73QQ1Cnr4vBPA1BNMRvRYZLDXhAb9Ie/1gPfjwNr3PYFYc0N0htgfkPX46H29ANJA3uVYK58hF9Y1TgR2rIQ9cyNuKiXZcl6154ivWYnDTrXZscju6BPf/Xr3Qr7rK+OVtrtp7yGnOXW+wAtUE2z/8e7ViB6PBlcgSKRbdadesyGQdwOxDDOHuh4CKeMm370ekC7XTdcDuR89cYcXVXxC9acwP4Gl1cMCcOstWhvVRFS4mbXDrCX9gqG1VU9wrF4JDfHy7TTl3eYbkud4ieolsD8/clyobmWL2uo2diETu3siCvpEnY1o8DTACl8dA5RioiL8l3oYpVQGm5TlGToqX4cba9w8YWjq95Cntqe48L4L7knZF/Yy8luW88y+dCrRNVEGkvryZmyhFqGvtjCnUhP1oH2n0ohTFNON0/dKegTXjtxPQOB6XWGdewVc3N+o4bD20QMCL2DixCyZUk6LdenTAXJEQ6GDA7hLpE6EaiABlX0WcuUUIOOHrQcQY24sU8fp50wBWaRE32FZM6O5iIglhrHL0xePM/viSfJTquJie7tBe6uemHNuokh2vJi4Tt/1qGv5rmkA7zmdco/zD/yga0yv5faN1davO0p+WLlyj8ZGjexYnskTM3Hap2EaTB6fYXxxaqTjHhLtL6E/ndIDCcu0euhkhz3pRuvQmhqHMhIN0XlQEz7A6Hg6LpaYg6YSI6Lj03OKLMgiHj8ae5eM/lTmlL49MUftR2EI8tNjZMeL1B9tUbmzSu3hJvmZsVhENTMW5aVpWlu1jjtIKm5dXpyO3VZ9JtVfJ48t1rtH0Mm0LC5U9pPXdsn0MWTF4A0CVq/eZ/PuKsIUzJxdIFPMYVoGxekyM+cXKc9PjIIwDpEGI0JrXCbScmXqZ9BsXDFXFgmu3LOrHaFIrRm/0yK5Xry7l8jdU2fez/VFHFfzz2rvHoSGZNO2GDsxy/xr58iO5WNjVrRvYW6C/NRYJ1RTqAJym9cf4rteYh0SnNgPerpntGmEGN6DBT21i9ty4o6B+lrpDeF812Pl8j3Wrj1E+pLxxek49HL63DFOfuYC40tTI/AeMhkMVA/ehcInPzI0J0XsnUEMIgYyGlal5jftB+QYCAcR6zTRPQEQob+3Opw/UiLsYpbxM/Ox5VmEfl4rYzFxdh4zm+zg0FjdZvPaw55tU1WLF2dXMXdXI5YMLc6GkRhbSsnGzUc49Xbyt7DuVGOjxr1vXWft2kMCPyA/WWL+0vFY5y9MlpQhK5X4P6Khk2EBV4HT7Gam7SU+pykKi4xAljq+51ESAiFULFYqI6qrXGj4f5kQhZNJEiJEd0JITvsg9/B8xQYl/ZA4rFTjetrYKhgDDc8dyUTnpvmpMuMn59jUejxJKdm+vULgB0ydP6b8y1KBKPB86it9ulCEorNu3d+JrJyNlbVjbh9RY7PG/bdvMPvcErlyniAIcGotKsubVB5sxJU+s6Uciy+dItOj0N4IuIdKPnDVAn4S+C+BPw6c2fWwPcVGhw9y+OTvhpl0LHTnNP3ydwn313VmDcz9gBzuJ3fRf0PbVHIy4XjJeI9QvI25c2e7blxLG6WEEIyfnsOpNalpnSWklFTurtKu1BlbmiE3UURKqD1Ypx5WtNzx1oRzVcvZG85W1iY/UYzL2ujzra1s09ysYYXc1Gu5caRY1Ito8ZXTFKbKiesf0aHTZeAvAv/QAu4B/x/gXwJ/EvhhYLLrEN1AshuI07+FiEiIhWlRWddZieKko4PZEcjQAfNOQNZPk4jB1qepj6tzepkEqH7eSIruxY16uYSi1iwzz58gcH0a65UEiNvbDdYqdzEsE4mMe+ruPUe3zw8hRx9bmGT7wXpXji6oQA/fbXYdWpguc+zFUxT2UzhgRIOmFeDvAH8ZuAZg/ov/9Da/79tfAVgF/j3wBjADnALSgars+F3frnHPiKPF3CjepimSvQoJCE0sjYfufc6kI0skeHMUbhjpq5EVOto/Fofjl4qM940uoCd4RUdkTpeg0YGb8EVH20WYRDBZwq21cLUmajEHD4Jd9UozY6sKnpbRWejwXNmMRSZj4flB+E4N9fN8htZ2AydMREi/ePRieYZlMnlqlmMvnlY9jUb0JKgJ/DPg54C/CawD/OH//q8mZcm/+t/9WPRxDPgDwJ8CXksMlQ6TTD9YKV05MlYldovE1H5cPL1dREYgbdMeuFHC9RQPJbs+pbl3QszuA150wIodQJCmlNiqWpQ4rF+9T/X+RqJkTmc5kgYtfXummGPhk+cxMmbCSi+QlAtZSsUcTccj0ArSCyFoVRrcf+uGajzWY+GEaVCYLDJ99hhjCxNddcBGdCgkga8CX0ZJyA1QwI0owWE1btwG3gL+Napm1jlgHEgBqwfn7PIPd1xA8aERF46MXtq2REhgCsgRvPYK5A4sUxyZqJ9TOF68bxLgPcEbsvI0eNP6bpobo3HqNGc2bYvCzDh2PovXdAgcr+MyCpcwamSt5x+D4uKlxSmE3iEx/H/W7ubAcd+gXIbS7Lhy+4TWbcM2yRRU8+3Z5xaZvbBEYaLYdT0jOhS6Afy/gf8O+DrgQhK8sINtSePGAngF+FkUV+50CduJG2viqJQidh2lObHao5sbx1bVHqJ1LAp3SfT9H7BEPImedK5x24T+vA/Ouyt4tYvyWg5u0yE/Wep4yzXx1ms51Fe3aa5VcJuOChCZLFOYHWPlnVs49VbCIBZxYDNjEWj5zMiIA2cTHLiz9J3vnuPitT0E6oVgZiwVfJJK0hjRodAm8H+gjFQfRBvTwI1o1zujATkDfC/wReC70KO4ermYUgEBUThl17OwA4h77fe4QI7PlQKxvhyREbcX9z0oeKWQCGFQe7DB+tX7zL98JgZxlzlNgPTDLgxC5RN7LYf7X7uC22gnAVzKsfD6+biTYTR3uQuAtYXYaZFGdHjkoGxQXwL+I2HX0H7AjWjPt0gD8iTwh1AW65fiHVKhjemwPh3Euh9VP17qY/WL790ByKnN4ffel6iDOB1a2Z+DJgEc/b4n8Ib/rb5/h42bD8mPl5h/5QzZsUIMYjWXDjh19d1ttnnwtau4zTSA84oD2502NOpQSTm/C4BHdFToTeAvAL8EVGF34Ea05yisP/o//e/Rx03grwC/D/h/AQ+ApO6ru5l0qywSIcJgy7SbUtOBhUiWmElEWGljoj+wMoRBKtSyX/phx2Ld+db5RzzneBygn9EqvX8/8AaOT3OzGhqR6jx6+yatrTpG+J+QogNkDaQQdnfwd+gplDKcjaD6VNA94H9EYelvs0/wwgHvc0o//iRKP/79gHIS9tKNU9yBXURq/dhe2UrqQ29jV+SYFSkwdPlj6bZS9xKdZVoa2I37JkK11B8Dg+ZmjXtfv0zg+fErI1PMMfv8SUrzk+ELSMagj7mwgPqjLZbfvJGoeimlJFsuMP/Jc5i21fGhhy+70ogDH1WqAv8Y+HmUsVjC/oAb0WPdUQ3IOeD7UH6qbwfMnlkxesTVHkRq/XO/MMGdrNYdIPcxSOnniZ3TGvZ0bt/D8r0f0VkgcJttHr55neZGNc5QioI6Js8cY+LUXOgO0uLCw+mtfXiXrVuPugxRuYkiC588r9w80fVIJYmU8pkRgI8WecBvoPTcX0Z5ew4E3Ige+45qIAaYBn4E+BngEjBQbiwTP/VKP+wH5I5+3O+Co9Q+EaI92q8TcJIUa3fTfdPgjf2v23WW375OOyylo49XmBlj4vQ8uemyCswACFQRukdv38RrOUkAB5LC7Bjzr50N15VEdtaIAx8p+gD4BeAfABvweMCNaGB3NAXk88CfAH4UmAW6lV6NG0u5A4jTx2pATlTe0C9oByALehvIdAB31ZjaAbzpbfE0QwAbPcwMzc0qj969Fdd51iO1DMskP1kiPzOGlcvgNtpU760l3EfxOQJJeWmamRdPoi3mCMBHix6h9NtfRPl2gcGAF4Zg69CAbAKfR4nVvxfI7QRiQm4sZW9rcvrYfumHHT003tAHyCCETIQYRqJ2BOBeRqudAKzPIWqSFr0q0q+M1nadlfdv0dTqSsfXE4nyqRDMNEkpmTx/jMlzxzrHjQB8VKiBip76MvA1IIDBATeiod1RDchF4AdR/uNPA3vgxigg76Ibp63N/R74BFfWNsbR0CmXVLR/4rg+II7OtROI1eGiC8Ruo8Xq5buJjKRe19YPvMIQzL18huLChIrc0gCMlBRHAH4SFKDCH7+EimTsCn8cJO29GPA+SQvLdIF3gX+FckGdR4jxnjpq+FlZcSNLbAp7KddUZ3MyqGLvQO7D8eO5RAyx23CV3LVHMgNJEKONo4xXNoUZVYKmXW0QeEHiHLsVt7PzqmhA3P5FvyYpydi9kxlGNDS6Tif88Q36hD8Okg7ljqb045dRbqc/BIwNRKxO6cW9OFlPH6nOXftx4xjEycwj/Vx99eE4H7o3J9alhuZ6hfVrD2huVHcUm6PFkVIyfnqO6UvHO9cZcWCAIKCYz1IsZmmNOPCwaYNO+OOH0cZhAjeiQ72jqbDM7wH+DPCdgNUXyPuwVPcSqZO76kCiJzcWjwnivi6lXUAM4DselQdrbN9Zxak1lVic9kmHQM2Uciy8dg67lNMCXbQ1GAH4MMgB/h1KXP5P7DH8cZA0NBG6F2litY9KSP6XwB3gDELM9XP9dPTRHtw4JUbrn3vqpWnLddrIFZ+3RzCw5leOxutVv6pXUEcvcVqfs5SqeXhuokRxbhyrkFX5wF6gUgzDIDFhCLJjBaYvHSc7UUiCNkGSjDUSoYdI3wL+e1Q04hWGZKTajZ7YHU2J1WdQJX1+HFgAuv3H6NxYGbkSz2MPcVp97c15urgxdInUkcsp+knn2vvxDcf705l/AuDaXz0uOnB9nFqTdqWJ13IAsAoZ8lNlzKytBW5o16RdXzGXGXHgwdNd4K8BfwMVCgkcPnAjeuJ3VAOygbJSfxEVG1roJVbvqBv3cTVFn3cVqfXBhghidQlS072TbqYopLITDKrHfAcJwGoZicnaYlJSzGcoFkYAHhBVSIY/Ak8OuBEdmTuqATkP/B6U//jbAKMnNybpcuoJ4h4hmGkD0Z5ArInTEYiVm+gAIE75xtJA1ucZRXDpPu9kTWztenpc5wjAAyEP+HU64Y8OPHngRnSk7mhKrJ5FRXL9CVRkV29waty4p0gdf+3/vcuwldKJo6CP3iDuXRerKzJrB26sLkMzWBGFReoqQxLIcbL9Dtc4AvBj0/t0wh83o41HBbxwxAAcUQrIl4CfRpW+neqvG3cHXO0lsymxEJrftyeIe4jTu4EYenP7+Lw9AkzUznRx3njuPcAb7afTCMAHpkfA30KlzQ48/HGQdKTvqAZkC/gCSj/+3UA2XUBgL1U/9rMYfUHcxYkVeOOUwxSI1X47c+NonzTtFcAJXT++FhWJNQLwvqgB/AtU+OPXeUKW5f3QU3FHNSCXgP8cFQjyqdiKdQAQ606iXosQpfaL/YB4Fz+x2n8XsbqDwE4yf9gXOW1t7upjpI8VhlKOrNB7ogD4Cgq4/wpVxvVIAzeip+aOpsTqRZTL6Y8h5WmgE8RPDxdTRPsAsdT3icTvWJTeG4jVb72DO9IVN3q6nHoAWEqI63aEeb+97uIIwHuma6hC6X8HVTgdeDrAC08RgCNKAflF4E8i5Q9LmBBSqoZpkXgZGaR0SnGq9POvqaCd33tw4Wh4tM+6Hp1OgkgDdS/6cbRdFXnvtGqJ+yqHE4yvIXqBIEcA3p02gL+HCn+8HG18WoAb0VN7R2MgS2kjxHdK+DMCvkdKaUc1lROGHi0CK017AnH0WePCvWKn1V+t7nU4YD+Om85o0rdF+0fg1UXnSGROv5/UsZ2SOiMAd1EbFf74ZZ5Q+OMg6am/oxpHHpfwBwX8rJTyZSQqFHG3xICQIpE0EahBB8Q6506DWB9fB2xXvHUfIO+kH0spCeJQSk10Dk8t6fFSCMco5UeRWCn6Jqr64z/lAAXkjiI9E3c0IVZLTiH4o8AfkVIuqjzZ3pUpd12Y9APfpzCA2j9lRIqCM0LROlEYT/QWnXvFbesVOWUCxNrLpc/8RwCO6S7wV1Hhj/ejjU87eOEZAXBEEZCllEII8Sngi1LKHwSKgR90AXkvD3RXdFa/elt0J0DoInW0T6JZWx8g68dEIrQ+d5nivF1zDl8WpcLH3g9cAf5P4H/lCIU/DpKeyTuqATknhPg9wM9JKX+HlNKQflKs3iugExy5lz7dw8Wk/ZQYPwHklLU6PZdEmmDIhWPdXDNs6RMdATgOf/xfgF/hiIU/DpKe2Tuqi9VSylkhxH8F/LSU8rwMZF/9eLeCAF1A7ilSp9qTxselLNV6XHQK5AmLs2bEklGCQ8yGO8d2anip+O1y4WMZyHHkwx8HSc/8He0RlvkzwH8hpZyK+u/uGcgJnZekm0pzG+nJgWlduheQ+4nV0OGyEfcNNBbcs+NEnFwB5Y+XFXqZTvXHm9HGZxW4ET3Td1QnTay2hBDfjtKPvx9JVll55Z4s1jqQE/rxPnTjaHtfIKdiOmWQbBsTtx7V5pTWn4VAceBnH8AN4J+j3EJv8BSEPw6Snsk72o9SYnVJCPGDKLfTp6WUQnFkSPt3e1Hf8jw7Wap30Y+j0aQmWad1X90nnByne9yxYu5ZBnAA/DYKuP+apyj8cZD0TN3RvVIKyAtCiB8D/riU8uxO+nGaEr7caGMvbhxu7+dyig4Tqf2icySszn1K6HQHiDzTAL4G/CVU+ONqtPHjBl74mAI4opT/+AUEPw38iJRyKrJW7xXIe+XG0T7povKdY0kYuCIAR+dJpxn2m9czCuB1VPjj/8ZTHP44SHrq7+ggqId+/HNKP5aZQPPBHpgbR5+17TuK1WibduC+O5UJesYAHIU/fgn4TZ7y8MdB0lN7RwdNKbG6LIT4IeBPSylf269YvV9urL72SivqBHOmfb6yz0vlGQRwV/gjjMAb0VN5R4dJKSCfEEL8JPBfSymXdnI76bRfbgyRWE0cKtkLmKpOdGecXq6uZ0gHvoMKf/ybPGPhj4Okp+qOHialwjJfR3Hj34+Upf2I1XvhxsnkiAijaVdR8kMvfv2MALgC/CNU+OPb0cYRcHvTU3FHnySlwjK/H+U//nYZSHMvYnUXN+4TjqlzXUGSScdcP+S+u5XIJayk+ZQB2AN+DaXnPtPhj4OkI31HjxJpQJ4WQvwI8DNSykv7Eav3xI3DYA59S2y8enYB/B6d8MctGAF3r3Rk7+hRpB5NzH9KSvmjSOb0aK7HBrEeUx2lEKY5d/qYpxPAy3SqP35swh8HSUfujj4NpHFjQwjxeZR+/ANSynw62ylNXaGY/URqIeJOC8ik8Soap9f4QkRF/Y40gBvAP0NZlz924Y+DpCNzR59G0oBcEEL8AEo//pwMArGjWK1Zmvtx4gSAo9/0IUiGW6ZL8xxRI1YU/vgl4N/wMQ1/HCQ98Tv6tFNKrJ4HfkxK+VNIeXY3a3Xss4X+/uLOzn1THdXhaQALxopHKpnhI1T449/lYx7+OEgaAXhAlALyCygj14/IQE7uZK3eFcS68Sr6Dn3F52gXwzgy2UjrwP8PFf54Jdo4Au5gaATgAVMqLPM7UGGZ3yeDILNb7rEIt+tATevI/V4Eyc6HYDz5dMI28G/phD/6MALuoGkE4CGRxpHLwA9JKX8WKV/vJ1b3BLH6AeiIxnqljp2qWT7hfOBv0Al/rMEIuMOiEYCHSCmx+jjwE1LKPyqlPB5Zq3cShSFV21rbpu93hAB8B+US+pvAg2jjCLzDoxGAD4FisToIhDCM11Bupx+SQVBKV9eAPu6lHegIAHibTvjjO9HGEXCHTyMAHyJpHDkLfL+U8ueQ8tuDQJppoAoNwLv1Fo6oU9Tu0GpiecCvovTcX2UU/njoNALwIVNKrJ5GFRD4aaR8Pq7/DJ2c4R6ZRzu5pOKiekIOG8DvosIf/yFh+COMwHvYNALwE6IUkM+hSvr8mAzkfMx1tR12A7D6ofNhiAB+SCf88Va0cQTcJ0MjAD9hSoVlfkZK+UXg98kgyOuNvBOtUHv0V0p2eWAYAK7TCX/8BqPwxyNBIwAfEdI4cgH4v4T68edkIEUi4gq6Ct9FPwwJwAHwWyg9998yCn88UjQC8BGiHmGZPy6l/CkZyDMJsTqKk9byDpOW6IEB+Cqd8Me1aOMIvEeHRgA+gpQC8ieklH8K+GEZBBNRm1EIkyGMXgatxwbwGgq0fwkFYmAE3KNIIwAfYdKAbAPfKaX8IlJ+r5QyIyKpWvSKrz4wgFuoLKEvobKGRuGPR5xGAH4KSAPyGPAHpJQ/C7wa9lrp6r90AABLVF7ul1FtSuowAu7TQCMAPyUUW6sBASeAn0TK/xpYioAMgJbQv0cA30K5hP4WykUEjMD7tNAIwE8ZxdxYSoEQrwE/i5Q/JKUsA4iwBekeALyFqkH1C6iaVMAIuE8bjQD8lFIqLPP7gD+LlN8upTQIK3L0AbAL/DJKz/318PsIuE8pjQD8FJMWBIJhiBkkPyal/BmkPAs9OfDbwM8D/xiVgDAC7lNOIwA/A/Q3/u8/TiAllbrDRCn7iSCQP0sQ/OFSPjMRAvhuEMi/IYT468Dd6LgReJ9+GgH4GaK//ef/CJ4fkM/ZmWaj9YOlfOZ/KBayj1qu9+ebLf+3sxlTwgi4zxL9/wECw0edjJJwrgAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII="></image><style>@media (prefers-color-scheme: light) { :root { filter: none; } } +@media (prefers-color-scheme: dark) { :root { filter: none; } } +</style></svg> \ No newline at end of file diff --git a/pkgdown/favicon/site.webmanifest b/pkgdown/favicon/site.webmanifest new file mode 100644 index 000000000..4ebda26b5 --- /dev/null +++ b/pkgdown/favicon/site.webmanifest @@ -0,0 +1,21 @@ +{ + "name": "", + "short_name": "", + "icons": [ + { + "src": "/web-app-manifest-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/web-app-manifest-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} \ No newline at end of file diff --git a/pkgdown/favicon/web-app-manifest-192x192.png b/pkgdown/favicon/web-app-manifest-192x192.png new file mode 100644 index 000000000..f9d35ade7 Binary files /dev/null and b/pkgdown/favicon/web-app-manifest-192x192.png differ diff --git a/pkgdown/favicon/web-app-manifest-512x512.png b/pkgdown/favicon/web-app-manifest-512x512.png new file mode 100644 index 000000000..2f9f2f687 Binary files /dev/null and b/pkgdown/favicon/web-app-manifest-512x512.png differ diff --git a/po/R-fr.po b/po/R-fr.po index 8baec8f9e..d9a31e603 100644 --- a/po/R-fr.po +++ b/po/R-fr.po @@ -171,7 +171,7 @@ msgstr "Version CRAN : %s" #: build-reference-index.R:22 msgid "Package index" -msgstr "Index du paquetage" +msgstr "Index du paquet" #: build-reference-index.R:158 msgid "All functions" diff --git a/revdep/README.md b/revdep/README.md index 7a3e9ac96..8cbc119dd 100644 --- a/revdep/README.md +++ b/revdep/README.md @@ -1,23 +1,15 @@ # Revdeps -## Failed to check (16) +## Failed to check (2) -|package |version |error |warning |note | -|:---------------------|:-------|:-----|:-------|:----| -|biocthis |? | | | | -|biscuiteer |? | | | | -|CiteFuse |? | | | | -|decoupleR |? | | | | -|dorothea |? | | | | -|GenomicSuperSignature |? | | | | -|lefser |? | | | | -|netZooR |? | | | | -|periodicDNA |? | | | | -|scClassify |? | | | | -|singscore |? | | | | -|SPIAT |? | | | | -|spicyR |? | | | | -|velociraptor |? | | | | -|vissE |? | | | | -|VplotR |? | | | | +|package |version |error |warning |note | +|:--------|:-------|:-----|:-------|:----| +|bayesCT |0.99.3 |1 | | | +|multinma |0.7.1 |1 | | | + +## New problems (1) + +|package |version |error |warning |note | +|:----------|:-------|:-----|:-------|:----| +|[preferably](problems.md#preferably)|0.4.1 | |__+1__ | | diff --git a/revdep/cran.md b/revdep/cran.md index a4c3eda28..815b23a77 100644 --- a/revdep/cran.md +++ b/revdep/cran.md @@ -1,7 +1,20 @@ ## revdepcheck results -We checked 155 reverse dependencies (139 from CRAN + 16 from Bioconductor), comparing R CMD check results across CRAN and dev versions of this package. +We checked 144 reverse dependencies, comparing R CMD check results across CRAN and dev versions of this package. - * We saw 0 new problems - * We failed to check 0 packages + * We saw 1 new problems + * We failed to check 2 packages +Issues with CRAN packages are summarised below. + +### New problems +(This reports the first line of each new failure) + +* preferably + checking whether package ‘preferably’ can be installed ... WARNING + I have submitted a patch at https://github.com/amirmasoudabdol/preferably/pull/19. + +### Failed to check + +* bayesCT (NA) +* multinma (NA) diff --git a/revdep/failures.md b/revdep/failures.md index 09cc30c36..3cb79778a 100644 --- a/revdep/failures.md +++ b/revdep/failures.md @@ -1,560 +1,142 @@ -# biocthis +# bayesCT <details> -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/biocthis -* Number of recursive dependencies: 114 +* Version: 0.99.3 +* GitHub: https://github.com/thevaachandereng/bayesCT +* Source code: https://github.com/cran/bayesCT +* Date/Publication: 2020-07-01 09:30:02 UTC +* Number of recursive dependencies: 122 -Run `revdepcheck::cloud_details(, "biocthis")` for more info +Run `revdepcheck::cloud_details(, "bayesCT")` for more info </details> -## Error before installation - -### Devel - -``` - - - - - - -``` -### CRAN - -``` - - - - - - -``` -# biscuiteer - -<details> - -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/biscuiteer -* Number of recursive dependencies: 222 - -Run `revdepcheck::cloud_details(, "biscuiteer")` for more info - -</details> - -## Error before installation - -### Devel - -``` - - - - - - -``` -### CRAN - -``` - - - - - - -``` -# CiteFuse - -<details> - -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/CiteFuse -* Number of recursive dependencies: 182 - -Run `revdepcheck::cloud_details(, "CiteFuse")` for more info - -</details> - -## Error before installation - -### Devel - -``` - - - - - - -``` -### CRAN - -``` - - - - - - -``` -# decoupleR - -<details> - -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/decoupleR -* Number of recursive dependencies: 260 - -Run `revdepcheck::cloud_details(, "decoupleR")` for more info - -</details> - -## Error before installation - -### Devel - -``` - - - - - - -``` -### CRAN - -``` - - - - - - -``` -# dorothea - -<details> - -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/dorothea -* Number of recursive dependencies: 215 - -Run `revdepcheck::cloud_details(, "dorothea")` for more info - -</details> - -## Error before installation - -### Devel - -``` - - - - - - -``` -### CRAN - -``` - - - - - - -``` -# GenomicSuperSignature - -<details> - -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/GenomicSuperSignature -* Number of recursive dependencies: 272 - -Run `revdepcheck::cloud_details(, "GenomicSuperSignature")` for more info - -</details> - -## Error before installation - -### Devel - -``` - - - - - - -``` -### CRAN - -``` - - - - - - -``` -# lefser - -<details> - -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/lefser -* Number of recursive dependencies: 214 - -Run `revdepcheck::cloud_details(, "lefser")` for more info - -</details> - -## Error before installation - -### Devel - -``` - - - - - - -``` -### CRAN - -``` - - - - - - -``` -# netZooR - -<details> - -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/netZooR -* Number of recursive dependencies: 227 - -Run `revdepcheck::cloud_details(, "netZooR")` for more info - -</details> - -## Error before installation - -### Devel - -``` +## In both +* checking whether package ‘bayesCT’ can be installed ... ERROR + ``` + Installation failed. + See ‘/tmp/workdir/bayesCT/new/bayesCT.Rcheck/00install.out’ for details. + ``` - - - - -``` -### CRAN - -``` - - - - - - -``` -# periodicDNA - -<details> - -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/periodicDNA -* Number of recursive dependencies: 129 - -Run `revdepcheck::cloud_details(, "periodicDNA")` for more info - -</details> - -## Error before installation - -### Devel - -``` - - - - - - -``` -### CRAN - -``` - - - - - - -``` -# scClassify - -<details> - -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/scClassify -* Number of recursive dependencies: 162 - -Run `revdepcheck::cloud_details(, "scClassify")` for more info - -</details> - -## Error before installation - -### Devel - -``` - - - - - - -``` -### CRAN - -``` - - - - - - -``` -# singscore - -<details> - -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/singscore -* Number of recursive dependencies: 146 - -Run `revdepcheck::cloud_details(, "singscore")` for more info - -</details> - -## Error before installation - -### Devel - -``` - - - - - - -``` -### CRAN - -``` - - - - - - -``` -# SPIAT - -<details> - -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/SPIAT -* Number of recursive dependencies: 184 - -Run `revdepcheck::cloud_details(, "SPIAT")` for more info - -</details> - -## Error before installation - -### Devel - -``` - - - - - - -``` -### CRAN - -``` - - - - - - -``` -# spicyR - -<details> - -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/spicyR -* Number of recursive dependencies: 246 - -Run `revdepcheck::cloud_details(, "spicyR")` for more info - -</details> - -## Error before installation - -### Devel - -``` - - - - - - -``` -### CRAN - -``` - - - - - - -``` -# velociraptor - -<details> - -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/velociraptor -* Number of recursive dependencies: 237 - -Run `revdepcheck::cloud_details(, "velociraptor")` for more info - -</details> - -## Error before installation +## Installation ### Devel ``` - - - - +* installing *source* package ‘bayesCT’ ... +** package ‘bayesCT’ successfully unpacked and MD5 sums checked +** using staged installation +** R +** data +*** moving datasets to lazyload DB +** inst +** byte-compile and prepare package for lazy loading +Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]) : + namespace ‘Matrix’ 1.5-4.1 is already loaded, but >= 1.6.0 is required +Calls: <Anonymous> ... namespaceImportFrom -> asNamespace -> loadNamespace +Execution halted +ERROR: lazy loading failed for package ‘bayesCT’ +* removing ‘/tmp/workdir/bayesCT/new/bayesCT.Rcheck/bayesCT’ ``` ### CRAN ``` - - - - +* installing *source* package ‘bayesCT’ ... +** package ‘bayesCT’ successfully unpacked and MD5 sums checked +** using staged installation +** R +** data +*** moving datasets to lazyload DB +** inst +** byte-compile and prepare package for lazy loading +Error in loadNamespace(j <- i[[1L]], c(lib.loc, .libPaths()), versionCheck = vI[[j]]) : + namespace ‘Matrix’ 1.5-4.1 is already loaded, but >= 1.6.0 is required +Calls: <Anonymous> ... namespaceImportFrom -> asNamespace -> loadNamespace +Execution halted +ERROR: lazy loading failed for package ‘bayesCT’ +* removing ‘/tmp/workdir/bayesCT/old/bayesCT.Rcheck/bayesCT’ ``` -# vissE +# multinma <details> -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/vissE -* Number of recursive dependencies: 202 +* Version: 0.7.1 +* GitHub: https://github.com/dmphillippo/multinma +* Source code: https://github.com/cran/multinma +* Date/Publication: 2024-06-11 12:20:06 UTC +* Number of recursive dependencies: 152 -Run `revdepcheck::cloud_details(, "vissE")` for more info +Run `revdepcheck::cloud_details(, "multinma")` for more info </details> -## Error before installation - -### Devel - -``` - +## In both +* checking whether package ‘multinma’ can be installed ... ERROR + ``` + Installation failed. + See ‘/tmp/workdir/multinma/new/multinma.Rcheck/00install.out’ for details. + ``` - - - -``` -### CRAN - -``` - - - - - - -``` -# VplotR - -<details> - -* Version: NA -* GitHub: NA -* Source code: https://github.com/cran/VplotR -* Number of recursive dependencies: 144 - -Run `revdepcheck::cloud_details(, "VplotR")` for more info - -</details> - -## Error before installation +## Installation ### Devel ``` +* installing *source* package ‘multinma’ ... +** package ‘multinma’ successfully unpacked and MD5 sums checked +** using staged installation +** libs +using C++ compiler: ‘g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0’ +using C++17 - - +g++ -std=gnu++17 -I"/opt/R/4.3.1/lib/R/include" -DNDEBUG -I"../inst/include" -I"/opt/R/4.3.1/lib/R/site-library/StanHeaders/include/src" -DBOOST_DISABLE_ASSERTS -DEIGEN_NO_DEBUG -DBOOST_MATH_OVERFLOW_ERROR_POLICY=errno_on_error -DUSE_STANC3 -D_HAS_AUTO_PTR_ETC=0 -I'/opt/R/4.3.1/lib/R/site-library/BH/include' -I'/opt/R/4.3.1/lib/R/site-library/Rcpp/include' -I'/opt/R/4.3.1/lib/R/site-library/RcppEigen/include' -I'/opt/R/4.3.1/lib/R/site-library/RcppParallel/include' -I'/opt/R/4.3.1/lib/R/site-library/rstan/include' -I'/opt/R/4.3.1/lib/R/site-library/StanHeaders/include' -I/usr/local/include -I'/opt/R/4.3.1/lib/R/site-library/RcppParallel/include' -D_REENTRANT -DSTAN_THREADS -fpic -g -O2 -c RcppExports.cpp -o RcppExports.o +In file included from /opt/R/4.3.1/lib/R/site-library/RcppEigen/include/Eigen/Core:205, +... +/opt/R/4.3.1/lib/R/site-library/StanHeaders/include/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp:22:56: required from ‘double stan::mcmc::dense_e_metric<Model, BaseRNG>::T(stan::mcmc::dense_e_point&) [with Model = model_survival_param_namespace::model_survival_param; BaseRNG = boost::random::additive_combine_engine<boost::random::linear_congruential_engine<unsigned int, 40014, 0, 2147483563>, boost::random::linear_congruential_engine<unsigned int, 40692, 0, 2147483399> >]’ +/opt/R/4.3.1/lib/R/site-library/StanHeaders/include/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp:21:10: required from here +/opt/R/4.3.1/lib/R/site-library/RcppEigen/include/Eigen/src/Core/DenseCoeffsBase.h:654:74: warning: ignoring attributes on template argument ‘Eigen::internal::packet_traits<double>::type’ {aka ‘__m128d’} [-Wignored-attributes] + 654 | return internal::first_aligned<int(unpacket_traits<DefaultPacketType>::alignment),Derived>(m); + | ^~~~~~~~~ +g++: fatal error: Killed signal terminated program cc1plus +compilation terminated. +make: *** [/opt/R/4.3.1/lib/R/etc/Makeconf:198: stanExports_survival_param.o] Error 1 +ERROR: compilation failed for package ‘multinma’ +* removing ‘/tmp/workdir/multinma/new/multinma.Rcheck/multinma’ ``` ### CRAN ``` +* installing *source* package ‘multinma’ ... +** package ‘multinma’ successfully unpacked and MD5 sums checked +** using staged installation +** libs +using C++ compiler: ‘g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0’ +using C++17 - - +g++ -std=gnu++17 -I"/opt/R/4.3.1/lib/R/include" -DNDEBUG -I"../inst/include" -I"/opt/R/4.3.1/lib/R/site-library/StanHeaders/include/src" -DBOOST_DISABLE_ASSERTS -DEIGEN_NO_DEBUG -DBOOST_MATH_OVERFLOW_ERROR_POLICY=errno_on_error -DUSE_STANC3 -D_HAS_AUTO_PTR_ETC=0 -I'/opt/R/4.3.1/lib/R/site-library/BH/include' -I'/opt/R/4.3.1/lib/R/site-library/Rcpp/include' -I'/opt/R/4.3.1/lib/R/site-library/RcppEigen/include' -I'/opt/R/4.3.1/lib/R/site-library/RcppParallel/include' -I'/opt/R/4.3.1/lib/R/site-library/rstan/include' -I'/opt/R/4.3.1/lib/R/site-library/StanHeaders/include' -I/usr/local/include -I'/opt/R/4.3.1/lib/R/site-library/RcppParallel/include' -D_REENTRANT -DSTAN_THREADS -fpic -g -O2 -c RcppExports.cpp -o RcppExports.o +In file included from /opt/R/4.3.1/lib/R/site-library/RcppEigen/include/Eigen/Core:205, +... +/opt/R/4.3.1/lib/R/site-library/StanHeaders/include/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp:22:56: required from ‘double stan::mcmc::dense_e_metric<Model, BaseRNG>::T(stan::mcmc::dense_e_point&) [with Model = model_survival_param_namespace::model_survival_param; BaseRNG = boost::random::additive_combine_engine<boost::random::linear_congruential_engine<unsigned int, 40014, 0, 2147483563>, boost::random::linear_congruential_engine<unsigned int, 40692, 0, 2147483399> >]’ +/opt/R/4.3.1/lib/R/site-library/StanHeaders/include/src/stan/mcmc/hmc/hamiltonians/dense_e_metric.hpp:21:10: required from here +/opt/R/4.3.1/lib/R/site-library/RcppEigen/include/Eigen/src/Core/DenseCoeffsBase.h:654:74: warning: ignoring attributes on template argument ‘Eigen::internal::packet_traits<double>::type’ {aka ‘__m128d’} [-Wignored-attributes] + 654 | return internal::first_aligned<int(unpacket_traits<DefaultPacketType>::alignment),Derived>(m); + | ^~~~~~~~~ +g++: fatal error: Killed signal terminated program cc1plus +compilation terminated. +make: *** [/opt/R/4.3.1/lib/R/etc/Makeconf:198: stanExports_survival_param.o] Error 1 +ERROR: compilation failed for package ‘multinma’ +* removing ‘/tmp/workdir/multinma/old/multinma.Rcheck/multinma’ ``` diff --git a/revdep/problems.md b/revdep/problems.md index 9a2073633..e995a4e05 100644 --- a/revdep/problems.md +++ b/revdep/problems.md @@ -1 +1,23 @@ -*Wow, no problems at all. :)* \ No newline at end of file +# preferably + +<details> + +* Version: 0.4.1 +* GitHub: https://github.com/amirmasoudabdol/preferably +* Source code: https://github.com/cran/preferably +* Date/Publication: 2022-07-20 14:30:06 UTC +* Number of recursive dependencies: 53 + +Run `revdepcheck::cloud_details(, "preferably")` for more info + +</details> + +## Newly broken + +* checking whether package ‘preferably’ can be installed ... WARNING + ``` + Found the following significant warnings: + Warning: replacing previous import ‘knitr::clean_cache’ by ‘pkgdown::clean_cache’ when loading ‘preferably’ + See ‘/tmp/workdir/preferably/new/preferably.Rcheck/00install.out’ for details. + ``` + diff --git a/tests/testthat/_snaps/build-home-authors.md b/tests/testthat/_snaps/build-home-authors.md index eae9b6540..17dbde716 100644 --- a/tests/testthat/_snaps/build-home-authors.md +++ b/tests/testthat/_snaps/build-home-authors.md @@ -6,15 +6,15 @@ Error in `data_authors_()`: ! In _pkgdown.yml, authors must be a list, not the number 1. Code - data_authors_(template = list(authors = list(before = 1))) + data_authors_(authors = list(before = 1)) Condition Error in `data_authors_()`: - ! In _pkgdown.yml, template.authors.before must be a string, not the number 1. + ! In _pkgdown.yml, authors.before must be a string, not the number 1. Code - data_authors_(template = list(authors = list(after = 1))) + data_authors_(authors = list(after = 1)) Condition Error in `data_authors_()`: - ! In _pkgdown.yml, template.authors.after must be a string, not the number 1. + ! In _pkgdown.yml, authors.after must be a string, not the number 1. # data_home_sidebar_authors validates yaml inputs diff --git a/tests/testthat/_snaps/build-home-index.md b/tests/testthat/_snaps/build-home-index.md index 63e60799b..8de6d29e4 100644 --- a/tests/testthat/_snaps/build-home-index.md +++ b/tests/testthat/_snaps/build-home-index.md @@ -149,3 +149,11 @@ ! In _pkgdown.yml, home.sidebar.components.fancy must have components "title" and "text". 2 missing components: "title" and "text". +# allow email in BugReports + + Code + xpath_xml(html, ".//li/a") + Output + <a href="mailto:me@tidyverse.com">Report a bug</a> + <a href="authors.html#citation">Citing testpackage</a> + diff --git a/tests/testthat/_snaps/build-reference-index.md b/tests/testthat/_snaps/build-reference-index.md index 0f581dc75..456911031 100644 --- a/tests/testthat/_snaps/build-reference-index.md +++ b/tests/testthat/_snaps/build-reference-index.md @@ -57,7 +57,7 @@ Condition Error: ! In _pkgdown.yml, 3 topics missing from index: "c", "e", and "?". - i Either use `@keywords internal` to drop from index, or + i Either add to the reference index, or use `@keywords internal` to drop from the index. # gives informative errors @@ -142,7 +142,7 @@ - is_installed() - check_installed() icon: ~ - - path: https://rdrr.io/pkg/bslib/man/bs_bundle.html + - path: https://rstudio.github.io/bslib/reference/bs_bundle.html title: Add low-level theming customizations (from bslib) lifecycle: ~ aliases: diff --git a/tests/testthat/_snaps/check.md b/tests/testthat/_snaps/check.md index 8c8cb3f13..48ad838dc 100644 --- a/tests/testthat/_snaps/check.md +++ b/tests/testthat/_snaps/check.md @@ -26,7 +26,7 @@ v Articles metadata ok. x Reference metadata not ok. In _pkgdown.yml, 1 topic missing from index: "?". - Either use `@keywords internal` to drop from index, or + Either add to the reference index, or use `@keywords internal` to drop from the index. # checks fails on first problem diff --git a/tests/testthat/_snaps/init.md b/tests/testthat/_snaps/init.md index e38d1432b..56b905cd8 100644 --- a/tests/testthat/_snaps/init.md +++ b/tests/testthat/_snaps/init.md @@ -13,18 +13,18 @@ Updating deps/bootstrap-5.3.1/bootstrap.min.css Updating deps/bootstrap-toc-1.0.1/bootstrap-toc.min.js Updating deps/clipboard.js-2.0.11/clipboard.min.js - Updating deps/font-awesome-6.4.2/css/all.css - Updating deps/font-awesome-6.4.2/css/all.min.css - Updating deps/font-awesome-6.4.2/css/v4-shims.css - Updating deps/font-awesome-6.4.2/css/v4-shims.min.css - Updating deps/font-awesome-6.4.2/webfonts/fa-brands-400.ttf - Updating deps/font-awesome-6.4.2/webfonts/fa-brands-400.woff2 - Updating deps/font-awesome-6.4.2/webfonts/fa-regular-400.ttf - Updating deps/font-awesome-6.4.2/webfonts/fa-regular-400.woff2 - Updating deps/font-awesome-6.4.2/webfonts/fa-solid-900.ttf - Updating deps/font-awesome-6.4.2/webfonts/fa-solid-900.woff2 - Updating deps/font-awesome-6.4.2/webfonts/fa-v4compatibility.ttf - Updating deps/font-awesome-6.4.2/webfonts/fa-v4compatibility.woff2 + Updating deps/font-awesome-6.5.2/css/all.css + Updating deps/font-awesome-6.5.2/css/all.min.css + Updating deps/font-awesome-6.5.2/css/v4-shims.css + Updating deps/font-awesome-6.5.2/css/v4-shims.min.css + Updating deps/font-awesome-6.5.2/webfonts/fa-brands-400.ttf + Updating deps/font-awesome-6.5.2/webfonts/fa-brands-400.woff2 + Updating deps/font-awesome-6.5.2/webfonts/fa-regular-400.ttf + Updating deps/font-awesome-6.5.2/webfonts/fa-regular-400.woff2 + Updating deps/font-awesome-6.5.2/webfonts/fa-solid-900.ttf + Updating deps/font-awesome-6.5.2/webfonts/fa-solid-900.woff2 + Updating deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.ttf + Updating deps/font-awesome-6.5.2/webfonts/fa-v4compatibility.woff2 Updating deps/headroom-0.11.0/headroom.min.js Updating deps/headroom-0.11.0/jQuery.headroom.min.js Updating deps/jquery-3.6.0/jquery-3.6.0.js diff --git a/tests/testthat/_snaps/markdown.md b/tests/testthat/_snaps/markdown.md index c373c1bb0..bb0f83f14 100644 --- a/tests/testthat/_snaps/markdown.md +++ b/tests/testthat/_snaps/markdown.md @@ -19,3 +19,12 @@ Error in `config_math_rendering_()`: ! In _pkgdown.yml, template.math-rendering must be one of mathml, mathjax, and katex, not math. +# preserves ANSI characters + + Code + markdown_text(pkg, sprintf("prefer %s", cli::col_blue("a"))) + Output + {html_document} + <html> + [1] <body><p>prefer \u2029[34ma\u2029[39m</p></body> + diff --git a/tests/testthat/_snaps/navbar.md b/tests/testthat/_snaps/navbar.md index 6ff6d41f5..06b98d626 100644 --- a/tests/testthat/_snaps/navbar.md +++ b/tests/testthat/_snaps/navbar.md @@ -170,7 +170,7 @@ Code data_navbar_(navbar = list(structure = list(left = 1))) Condition - Error in `navbar_links()`: + Error in `data_navbar_()`: ! In _pkgdown.yml, navbar.structure.left must be a character vector, not the number 1. Code data_navbar_(navbar = list(right = "github")) diff --git a/tests/testthat/assets/reference-language/one/DESCRIPTION b/tests/testthat/assets/reference-language/one/DESCRIPTION new file mode 100644 index 000000000..8fd0f7e38 --- /dev/null +++ b/tests/testthat/assets/reference-language/one/DESCRIPTION @@ -0,0 +1,7 @@ +Package: testpackage +Version: 1.0.0 +Title: A test package +Description: A test package +Authors@R: person("Hadley Wickham") +RoxygenNote: 7.3.1 +Language: fr diff --git a/tests/testthat/assets/reference-language/two/DESCRIPTION b/tests/testthat/assets/reference-language/two/DESCRIPTION new file mode 100644 index 000000000..3f6903d33 --- /dev/null +++ b/tests/testthat/assets/reference-language/two/DESCRIPTION @@ -0,0 +1,7 @@ +Package: testpackage +Version: 1.0.0 +Title: A test package +Description: A test package +Authors@R: person("Hadley Wickham") +RoxygenNote: 7.3.1 +Language: en-US, fr diff --git a/tests/testthat/helper.R b/tests/testthat/helper.R index 2362b0ae1..a01804101 100644 --- a/tests/testthat/helper.R +++ b/tests/testthat/helper.R @@ -4,6 +4,7 @@ skip_if_no_pandoc <- function(version = "1.12.3") { skip_if_no_quarto <- function() { skip_on_os("windows") # quarto set up currently broken? skip_if(is.null(quarto::quarto_path()), "quarto not available") + skip_if_not(quarto::quarto_version() >= "1.5", "quarto 1.5 not available") } # Simulate a package -------------------------------------------------------- diff --git a/tests/testthat/test-build-article.R b/tests/testthat/test-build-article.R index 61bd6bf42..5429d9251 100644 --- a/tests/testthat/test-build-article.R +++ b/tests/testthat/test-build-article.R @@ -74,6 +74,20 @@ test_that("BS5 article laid out correctly with and without TOC", { expect_equal(xpath_length(toc_false, ".//aside"), 0) }) +test_that("BS5 article gets correctly activated navbar", { + pkg <- local_pkgdown_site() + pkg <- pkg_add_file(pkg, "vignettes/article.Rmd", pkg_vignette()) + suppressMessages(article_path <- build_article("article", pkg)) + + html <- xml2::read_html(article_path) + navbar <- xml2::xml_find_first(html, ".//div[contains(@class, 'navbar')]") + + expect_equal( + xpath_text(navbar,".//li[contains(@class, 'active')]//button"), + "Articles" + ) +}) + test_that("titles are escaped when needed", { pkg <- local_pkgdown_site() pkg <- pkg_add_file(pkg, "vignettes/test.Rmd", pkg_vignette(title = "a <-> b")) @@ -90,7 +104,7 @@ test_that("output is reproducible by default, i.e. 'seed' is respected", { r_code_block("runif(5L)") )) suppressMessages(path <- build_article("test", pkg)) - + html <- xml2::read_html(path) output <- xpath_text(html, "//main//pre")[[2]] expect_snapshot(cat(output)) @@ -119,7 +133,7 @@ test_that("can control math mode", { suppressMessages(path <- build_article("math", pkg)) html <- xml2::read_html(path) expect_equal(xpath_length(html, ".//span[contains(@class, 'math')]"), 1) - + pkg$meta$template$`math-rendering` <- "katex" suppressMessages(init_site(pkg)) suppressMessages(path <- build_article("math", pkg)) @@ -262,6 +276,21 @@ test_that("warns about missing images", { expect_snapshot(build_article("kitten", pkg)) }) +test_that("spaces in sorce paths do work", { + # create simulated package + pkg0 <- local_pkgdown_site() + pkg0 <- pkg_add_file(pkg0, "vignettes/kitten.Rmd", "![Kitten](kitten.jpg)") + pkg0 <- pkg_add_kitten(pkg0, "vignettes") + + # copy simulated pkg to path that contains spaces + pkg1 <- fs::dir_copy(pkg0$src_path, fs::file_temp(pattern = "beware of spaces-")) + + # check that pkgdown site builds anyways + expect_no_error(suppressMessages( + build_article("kitten", as_pkgdown(pkg1)) + )) +}) + test_that("warns about missing alt-text", { pkg <- local_pkgdown_site() pkg <- pkg_add_file(pkg, "vignettes/kitten.Rmd", "![](kitten.jpg)") diff --git a/tests/testthat/test-build-home-authors.R b/tests/testthat/test-build-home-authors.R index e6245a875..128ff9fce 100644 --- a/tests/testthat/test-build-home-authors.R +++ b/tests/testthat/test-build-home-authors.R @@ -15,8 +15,8 @@ test_that("data_authors validates yaml inputs", { expect_snapshot(error = TRUE, { data_authors_(authors = 1) - data_authors_(template = list(authors = list(before = 1))) - data_authors_(template = list(authors = list(after = 1))) + data_authors_(authors = list(before = 1)) + data_authors_(authors = list(after = 1)) }) }) diff --git a/tests/testthat/test-build-home-index.R b/tests/testthat/test-build-home-index.R index 283b39126..00bc287d1 100644 --- a/tests/testthat/test-build-home-index.R +++ b/tests/testthat/test-build-home-index.R @@ -30,7 +30,7 @@ test_that("math is handled", { expect_equal(xpath_length(html, ".//math"), 1) }) -test_that("data_home() validates yaml metadata", { +test_that("data_home() validates yaml metadata", { data_home_ <- function(...) { pkg <- local_pkgdown_site(meta = list(...)) data_home(pkg) @@ -153,3 +153,22 @@ test_that("cran_unquote works", { "Quoting is CRAN's thing." ) }) + +test_that("allow email in BugReports", { + # currently desc throws a warning if BugReports is an email + pkg <- suppressWarnings(local_pkgdown_site(desc = list(BugReports = "me@tidyverse.com"))) + html <- xml2::read_html(data_home_sidebar(pkg)) + expect_snapshot(xpath_xml(html, ".//li/a")) +}) + +test_that("ANSI are handled", { + withr::local_options(cli.num_colors = 256) + pkg <- local_pkgdown_site() + + pkg <- pkg_add_file(pkg, "index.md", sprintf("prefer %s", cli::col_blue("a"))) + suppressMessages(build_home_index(pkg)) + + html <- xml2::read_html(path(pkg$dst_path, "index.html")) + readme_p <- xml2::xml_find_first(html, ".//main[@id='main']/p") + expect_equal(xml2::xml_text(readme_p), "prefer \u2029[34ma\u2029[39m") +}) diff --git a/tests/testthat/test-build-home-license.R b/tests/testthat/test-build-home-license.R index 5470e8179..285037043 100644 --- a/tests/testthat/test-build-home-license.R +++ b/tests/testthat/test-build-home-license.R @@ -1,6 +1,4 @@ test_that("link_license matchs exactly", { - # R 3.1 uses http url - skip_if_not(getRversion() >= "3.2.0") # Shouldn't match first GPL-2 expect_equal( diff --git a/tests/testthat/test-build-news.R b/tests/testthat/test-build-news.R index 36e0777d5..ba548b5ab 100644 --- a/tests/testthat/test-build-news.R +++ b/tests/testthat/test-build-news.R @@ -23,8 +23,8 @@ test_that("news is syntax highlighted once", { pkg <- local_pkgdown_site() pkg <- pkg_add_file(pkg, "NEWS.md", c( "# testpackage 1.0.0.9000", - "```r", - "x <- 1", + "```r", + "x <- 1", "```" )) suppressMessages(build_news(pkg, preview = FALSE)) @@ -106,14 +106,18 @@ test_that("pkg_timeline fails cleanly for unknown package", { expect_null(pkg_timeline("__XYZ__")) }) +test_that("pkg_timeline works for package that have been archived", { + skip_on_cran() + expect_no_error(pkg_timeline("PF")) +}) + test_that("correct timeline for first ggplot2 releases", { skip_on_cran() timeline <- pkg_timeline("ggplot2")[1:3, ] expected <- data.frame( version = c("0.5", "0.5.1", "0.5.2"), - date = as.Date(c("2007-06-01", "2007-06-09", "2007-06-18")), - stringsAsFactors = FALSE + date = as.Date(c("2007-06-01", "2007-06-09", "2007-06-18")) ) expect_equal(timeline, expected) diff --git a/tests/testthat/test-build-quarto-articles.R b/tests/testthat/test-build-quarto-articles.R index 2caa1e781..317abd9d5 100644 --- a/tests/testthat/test-build-quarto-articles.R +++ b/tests/testthat/test-build-quarto-articles.R @@ -83,7 +83,7 @@ test_that("quarto articles are included in the index", { 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 @@ -103,3 +103,20 @@ test_that("quarto headings get anchors", { headings <- xpath_xml(html, "//h2|//h3") expect_equal(xpath_attr(headings, "./a", "href"), c("#heading-1", "#heading-2")) }) + +test_that("can build quarto articles in articles folder", { + skip_if_no_quarto() + + pkg <- local_pkgdown_site() + pkg <- pkg_add_file(pkg, "vignettes/articles/vig1.qmd") + pkg <- pkg_add_file(pkg, "vignettes/vig2.qmd") + pkg <- pkg_add_file(pkg, "vignettes/articles/vig3.rmd") + pkg <- pkg_add_file(pkg, "vignettes/vig4.rmd") + + 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"))) + expect_true(file_exists(path(pkg$dst_path, "articles/vig3.html"))) + expect_true(file_exists(path(pkg$dst_path, "articles/vig4.html"))) +}) diff --git a/tests/testthat/test-build-reference.R b/tests/testthat/test-build-reference.R index 848e477e0..9e66d796f 100644 --- a/tests/testthat/test-build-reference.R +++ b/tests/testthat/test-build-reference.R @@ -1,5 +1,4 @@ test_that("parse failures include file name", { - skip_if_not(getRversion() >= "4.0.0") pkg <- local_pkgdown_site(test_path("assets/reference-fail")) expect_snapshot(build_reference(pkg), error = TRUE) }) diff --git a/tests/testthat/test-figure.R b/tests/testthat/test-figure.R index e79fdf417..5a9ffd207 100644 --- a/tests/testthat/test-figure.R +++ b/tests/testthat/test-figure.R @@ -1,5 +1,6 @@ test_that("can override defaults in _pkgdown.yml", { skip_if_no_pandoc() + skip_if_no_quarto() withr::local_temp_libpaths() pkg <- local_pkgdown_site(test_path("assets/figure")) diff --git a/tests/testthat/test-highlight.R b/tests/testthat/test-highlight.R index 90abbf56f..2611c494c 100644 --- a/tests/testthat/test-highlight.R +++ b/tests/testthat/test-highlight.R @@ -1,5 +1,5 @@ test_that("highlight_examples captures dependencies", { - withr::defer(file_delete(test_path("Rplot001.png"))) + withr::defer(try(file_delete(test_path("Rplot001.png")), TRUE)) dummy_dep <- htmltools::htmlDependency("dummy", "1.0.0", "dummy.js") widget <- htmlwidgets::createWidget("test", list(), dependencies = dummy_dep) @@ -9,14 +9,13 @@ test_that("highlight_examples captures dependencies", { expect_equal(attr(out, "dependencies")[-1], list(dummy_dep)) }) - test_that("highlight_examples runs and hides DONTSHOW calls()", { out <- highlight_examples("DONTSHOW(x <- 1)\nx") expect_snapshot(cat(strip_html_tags(out))) }) test_that("highlight_text & highlight_examples include sourceCode div", { - withr::defer(file_delete(test_path("Rplot001.png"))) + withr::defer(try(file_delete(test_path("Rplot001.png")), TRUE)) html <- xml2::read_html(highlight_examples("a + a", "x")) expect_equal(xpath_attr(html, "./body/div", "class"), "sourceCode") diff --git a/tests/testthat/test-markdown.R b/tests/testthat/test-markdown.R index 224df1536..46d81f1ed 100644 --- a/tests/testthat/test-markdown.R +++ b/tests/testthat/test-markdown.R @@ -63,3 +63,11 @@ test_that("validates math yaml", { config_math_rendering_(`math-rendering` = "math") }) }) + +test_that("preserves ANSI characters", { + withr::local_options(cli.num_colors = 256) + pkg <- local_pkgdown_site() + expect_snapshot( + markdown_text(pkg, sprintf("prefer %s", cli::col_blue("a"))) + ) +}) diff --git a/tests/testthat/test-navbar.R b/tests/testthat/test-navbar.R index 762e6f5df..4fb0aa28f 100644 --- a/tests/testthat/test-navbar.R +++ b/tests/testthat/test-navbar.R @@ -66,6 +66,19 @@ test_that("can control articles navbar through articles meta", { }) +test_that("can control articles navbar through navbar meta", { + pkg <- local_pkgdown_site(meta = list( + navbar = list( + components = list(articles = menu_submenu("Hi!", list(menu_heading("Hi")))) + ) + )) + pkg <- pkg_add_file(pkg, "vignettes/a.Rmd", pkg_vignette()) + pkg <- pkg_add_file(pkg, "vignettes/b.Rmd", pkg_vignette()) + + navbar <- navbar_link_components(pkg) + expect_equal(navbar$left$articles$text, "Hi!") +}) + test_that("data_navbar() works by default", { pkg <- local_pkgdown_site(meta = list( repo = list(url = list(home = "https://github.com/r-lib/pkgdown/")) diff --git a/tests/testthat/test-package.R b/tests/testthat/test-package.R index a84a593a4..f2a227a3c 100644 --- a/tests/testthat/test-package.R +++ b/tests/testthat/test-package.R @@ -118,3 +118,32 @@ test_that("malformed figures fail gracefully", { expect_null(rd_lifecycle("{\\figure{deprecated.svg}}")) expect_null(rd_lifecycle("{\\figure{}}")) }) + +# language --------------------------------------------------------------------- + +test_that("as_pkgdown sets language", { + # Default + pkg <- as_pkgdown(test_path("assets/reference")) + expect_equal( + pkg$lang, + "en" + ) + # Single language specified in DESCRIPTION + pkg <- as_pkgdown(test_path("assets/reference-language/one")) + expect_equal( + pkg$lang, + "fr" + ) + # Two languages specified in DESCRIPTION + pkg <- as_pkgdown(test_path("assets/reference-language/two")) + expect_equal( + pkg$lang, + "en-US" + ) + # Language specified in _pkgdown.yml or override. + pkg <- as_pkgdown(test_path("assets/reference-language/two"), override = list(lang = "en-GB")) + expect_equal( + pkg$lang, + "en-GB" + ) +}) diff --git a/tests/testthat/test-rd-html.R b/tests/testthat/test-rd-html.R index 4aeed412f..c76b7288d 100644 --- a/tests/testthat/test-rd-html.R +++ b/tests/testthat/test-rd-html.R @@ -428,9 +428,6 @@ test_that("deqn", { }) test_that("special", { - # Fails due to a bug prior to R 4.0.0: - # https://bugs.r-project.org/show_bug.cgi?id=17727 - skip_if_not(getRversion() >= "4.0.0") out <- rd2html("\\special{( \\dots )}") expect_equal(out, "( ... )") }) diff --git a/tests/testthat/test-tweak-page.R b/tests/testthat/test-tweak-page.R index 5db30340c..8d704d095 100644 --- a/tests/testthat/test-tweak-page.R +++ b/tests/testthat/test-tweak-page.R @@ -135,3 +135,36 @@ test_that("h1 section headings adjusted to h2 (and so on)", { c("page-header", "section level2", "section level3", "section level2") ) }) + +test_that("slashes not URL encoded during relative path conversion", { + + # Since the URL conversion process in tweak_markdown_html() makes calls to + # fs::path_real() (which requires paths to exist), we create a + # temporary pkgdown site directory and populate it with an image file, which + # we can then reference in our test HTML file. + + # Create a site + pkg <- local_pkgdown_site() + + # Add the referenced image in a subdirectory of vignettes. + pkg <- pkg_add_kitten(pkg, "vignettes/img/") + + # Get the full path to the image. + sim_path <- path_real(path(pkg$src_path, "vignettes/img/kitten.jpg")) + + # Simulate an output HTML file referencing the absolute path. + html <- xml2::read_html( + sprintf(' + <body> + <img src="%s" /> + </body> + ', sim_path) + ) + + # Function should update the absolute path to a relative path. + tweak_rmarkdown_html(html, path(pkg$src_path, "vignettes")) + + # Check that the relative path has a non-encoded slash. + expect_equal(xpath_attr(html, ".//img", "src"), "img/kitten.jpg") + +}) diff --git a/tests/testthat/test-usage.R b/tests/testthat/test-usage.R index 776f7df50..97a00b83a 100644 --- a/tests/testthat/test-usage.R +++ b/tests/testthat/test-usage.R @@ -186,6 +186,10 @@ test_that("can parse dots", { expect_equal(usage$name, "f") }) +test_that("usage2text can parse symbols (#2727)", { + expect_no_error(usage2text("viridisLite::viridis(21)")) +}) + # short_name -------------------------------------------------------------- test_that("infix functions left as", { diff --git a/vignettes/articles/.gitignore b/vignettes/articles/.gitignore new file mode 100644 index 000000000..ba7abf328 --- /dev/null +++ b/vignettes/articles/.gitignore @@ -0,0 +1,3 @@ +*.html +*.R +*_files diff --git a/vignettes/articles/test-quarto-article.qmd b/vignettes/articles/test-quarto-article.qmd new file mode 100644 index 000000000..086966cfb --- /dev/null +++ b/vignettes/articles/test-quarto-article.qmd @@ -0,0 +1,6 @@ +--- +title: "Test Quarto article" +format: html +--- + +This article should appear on the pkgdown site but not in the built package. diff --git a/vignettes/articles/test-rmarkdown-article.Rmd b/vignettes/articles/test-rmarkdown-article.Rmd new file mode 100644 index 000000000..67c2ea2de --- /dev/null +++ b/vignettes/articles/test-rmarkdown-article.Rmd @@ -0,0 +1,6 @@ +--- +title: "Test Rmarkdown article" +output: html_document +--- + +This article should appear on the pkgdown site but not in the built package. diff --git a/vignettes/customise.Rmd b/vignettes/customise.Rmd index 104df56e3..7f671e656 100644 --- a/vignettes/customise.Rmd +++ b/vignettes/customise.Rmd @@ -21,7 +21,7 @@ We'll start by discussing two techniques that only require tweaks to your `_pkgd We'll then discuss how to add additional HTML and other files. Next, we'll discuss how to give multiple sites the same style using a package, then finish up with some workflow advice. -In terms of your `_pkgdown.yml`, this vignette focusses on the most important fields nested under `template` and `navbar`. To learn more about customising other aspect of the site, see the documentation for the indiviudal functions like `build_reference()`, `build_articles()`, `build_home()`, `build_redirects()`, and `init_site()`. To learn about less important fields nested under `template`, see `build_site()`. +In terms of your `_pkgdown.yml`, this vignette focusses on the most important fields nested under `template` and `navbar`. To learn more about customising other aspects of the site, see the documentation for the indiviudal functions like `build_reference()`, `build_articles()`, `build_home()`, `build_redirects()`, and `init_site()`. To learn about less important fields nested under `template`, see `build_site()`. ```{r setup} library(pkgdown) @@ -45,18 +45,18 @@ Upgrading to Bootstrap 5 has a low chance of breaking your site unless you were There are two ways to change the visual style of your site from `_pkgdown.yml`: using a pre-packaged bootswatch theme or customising theme variables with [bslib](https://rstudio.github.io/bslib/). The following sections show you how. -Please note that pkgdown's default theme has been carefully optimised to be accessible, so if you make changes, make sure that to also read `vignette("accessibility")` to learn about potential accessibility pitfalls. +Please note that pkgdown's default theme has been carefully optimised to be accessible, so if you make changes, make sure to also read `vignette("accessibility")` to learn about potential accessibility pitfalls. ### Light switch {#light-switch} -You can provide a "light switch" to allow your uses to switch between dark and light themes by setting the `light-switch` template option to true: +You can provide a "light switch" to allow your users to switch between dark and light themes by setting the `light-switch` template option to true: ```yaml template: light-switch: true ``` -This will add a `lightswitch` component to the navbar, which defaults to appearing at the far right. This allows the user to select light mode, dark mode, or auto mode (which follows the system setting). The modes are applied using Bootstrap 5.3's [colours modes](https://getbootstrap.com/docs/5.3/customize/color-modes/) so are not separate themes, but a thin layer of colour customisation applied via CSS. +This will add a `lightswitch` component to the navbar, which by default appears at the far right. This allows the user to select light mode, dark mode, or auto mode (which follows the system setting). The modes are applied using Bootstrap 5.3's [colours modes](https://getbootstrap.com/docs/5.3/customize/color-modes/) so are not separate themes, but a thin layer of colour customisation applied via CSS. ### Bootswatch themes @@ -109,7 +109,7 @@ template: You can customise other components by setting more specific bslib variables, taking advantage of inheritance where possible. For example, `table-border-color` defaults to `border-color` which defaults to `gray-300`. -If you want to change the colour of all borders, you can set `border-color`; if you just want to change the colour of table borders, you can set `table-border-color`. +If you want to change the colour of all borders, you can set `border-color` and if you just want to change the colour of table borders, you can set `table-border-color`. You can find a full list of variables in the [bslib docs](https://rstudio.github.io/bslib/articles/bs5-variables/index.html). If you're using the light switch, [many colours](https://getbootstrap.com/docs/5.3/customize/color-modes/#sass-variables) are available for customisation specifically for the dark theme. @@ -178,9 +178,9 @@ template: base_font: proxima-nova ``` -Depending on where the font is from (and if you paid money for it), you may need to take additional steps to ensure that it can only be used from your site, and/or make sure that it can still be used when you're previewing locally. If you're having problems getting a custom font to work, looking for errors in the [browser developer console](https://developer.mozilla.org/en-US/docs/Glossary/Developer_Tools) is a good place to start. +Depending on where the font is from (and if you purchased it), you may need to take additional steps to ensure that it can only be used from your site, and/or make sure that it can still be used when you're previewing locally. If you're having problems getting a custom font to work, looking for errors in the [browser developer console](https://developer.mozilla.org/en-US/docs/Glossary/Developer_Tools) is a good place to start. -When iterating on fonts, you'll need to run `build_home_index(); init_site()` then refresh you browser to see the update. +When iterating on fonts, you'll need to run `build_home_index(); init_site()` then refresh your browser to see the update. ### Syntax highlighting @@ -243,9 +243,9 @@ navbar: bg: primary ``` -You generally don't need to set `bg` if you use a bootswatch theme, as pkgdown will pick the `bg` used on the [Bootstwatch preview](https://bootswatch.com/). +You generally don't need to set `bg` if you use a bootswatch theme, as pkgdown will pick the `bg` used on the [Bootswatch preview](https://bootswatch.com/). Similarly, you don't usually need to set `type` because bootstrap will guess it for you. -If it guesses wrong, override with `type: light` or `type: dark` depending on whether the background colour is light (so you need dark text) or `type: dark` if the background is dark (so you need light text). +If the guess is wrong, you can override with `type: light` or `type: dark` depending on whether the background colour is light (so you need dark text) or `type: dark` if the background is dark (so you need light text). Unfortunately, these are defined relative to the page background, so if you have a dark site you'll need to flip `light` and `dark` (a little experimentation should quickly determine what looks best). Because the navbar is styled with HTML, you'll need to `build_home_index(); init_site()` to see the effect of changing this parameter. @@ -274,13 +274,15 @@ navbar: It makes use of the the following built-in components: - `intro`: "Get Started", which links to a vignette or article with the same name as the package[^dots]. -- `reference`, if there are any `.Rd` files. -- `articles`, if there are any vignettes or articles. -- `tutorials`, if there any tutorials. -- `news`, if `NEWS.md` exists. -- `search`, the search box (see `?build_search` for more details). -- `github`, a link to the source repository (with an icon), if it can be automatically determined from the `DESCRIPTION`. -- `lightswitch`, a ["light switch"](#light-switch) to select light mode, dark mode, or auto mode. +- `reference`: if there are any `.Rd` files. +- `articles`: if there are any vignettes or articles. +- `tutorials`: if there any tutorials. +- `news`: if `NEWS.md` exists. +- `search`: the search box (see `?build_search` for more details). +- `github`: a link to the source repository (with an icon), if it can be automatically determined from the `DESCRIPTION`. +- `lightswitch`; a ["light switch"](#light-switch) to select light mode, dark mode, or auto mode. + +Note that customising `navbar` like this comes with a downside: if pkgdown later changes the defaults, you'll have to update your `_pkgdown.yml`. [^dots]: Note that dots (`.`) in the package name need to be replaced by hyphens (`-`) in the vignette filename to be recognized as the intro. That means for a package `foo.bar` the intro needs to be named `foo-bar.Rmd`. @@ -333,7 +335,7 @@ For example, the following yaml adds a new "twitter" component that appears to t ``` yaml navbar: structure: - right: [twitter, github] + right: [search, twitter, github, lightswitch] components: twitter: icon: fa-twitter @@ -351,7 +353,7 @@ template: after_navbar: <!-- inserted after the navbar links --> ``` -These includes will appear on all screen sizes, and will not be collapsed into the the navbar drop down. +These inclusions will appear on all screen sizes, and will not be collapsed into the the navbar drop down. You can also customise the colour scheme of the navbar by using the `type` and `bg` parameters. See above for details. @@ -372,12 +374,12 @@ footer: Which uses two of the three built-in components: -- `developed_by`, a sentence describing the main authors of the package. (See `?build_home` if you want to tweak *which* authors appear in the footer.) -- `built_with`, a sentence advertising pkgdown. -- `package`, the name of the package. +- `developed_by`: a sentence describing the main authors of the package. (See `?build_home` if you want to tweak *which* authors appear in the footer.) +- `built_with`: a sentence advertising pkgdown. +- `package`: the name of the package. You can override these defaults with the `footer` field. -The example below puts the authors' information on the right along with a legal disclaimer, and puts the pkgdown link on the left. +The example below puts the author's information on the right along with a legal disclaimer, and puts the pkgdown link on the left. ``` yaml footer: @@ -407,7 +409,7 @@ template: You can include additional files by putting them in the right place: -- `pkgdown/extra.css` and `pkgdown/extra.js` will be copied in to rendered site and linked from `<head>` (after the pkgdown defaults). +- `pkgdown/extra.css` and `pkgdown/extra.js` will be copied to the rendered site and linked from `<head>` (after the pkgdown defaults). - `pkgdown/extra.scss` will be added to the scss ruleset used to generate the site CSS. @@ -438,7 +440,7 @@ template: package: theverybest ``` -You then also need to make sure it's available when your site is build. Typically, you won't want to publish this package to CRAN, but you will want to publish to GitHub. Once you've done that, and assuming you're using the [usethis workflow](https://usethis.r-lib.org/reference/use_pkgdown.html), add the following line to your `DESCRIPTION`: +You then also need to make sure it's available when your site is built. Typically, you won't want to publish this package to CRAN, but you will want to publish to GitHub. Once you've done that, and assuming you're using the [usethis workflow](https://usethis.r-lib.org/reference/use_pkgdown.html), add the following line to your `DESCRIPTION`: ```yaml Config/Needs/website: myorg/theverybest @@ -459,7 +461,7 @@ But please note that these templates aren't suitable for use with your own packa If you are updating a template package that works with pkgdown 1.0.0, create directories `inst/pkgdown/BS5/templates` and `inst/pkgdown/BS5/assets` (if you don't have any templates/assets make sure to a add dummy file to ensure that git tracks them). The `templates` and `assets` directories directly under `inst/pkgdown` will be used by pkgdown 1.0.0 and by pkgdown 2.0.0 if `boostrap: 3`. The directories under `inst/pkgdown/BS5/` will be used for pkgdown 2.0.0 with `boostrap: 5`. -This lets your package support both versions of bootstrap and pkgdown. +This lets your package support both versions of Bootstrap and pkgdown. ## PR previews diff --git a/vignettes/how-to-update-released-site.Rmd b/vignettes/how-to-update-released-site.Rmd index ed5513a98..230361f76 100644 --- a/vignettes/how-to-update-released-site.Rmd +++ b/vignettes/how-to-update-released-site.Rmd @@ -14,13 +14,14 @@ vignette: > knitr::opts_chunk$set( collapse = TRUE, comment = "#>", - eval = FALSE + eval = FALSE, + purl = FALSE ) ``` This vignette shows you how to update the released version of your site to match the dev version of the site, so the first step is to ensure that the dev site looks the way that you want it. -This site assumes that you're a using recent version of our recommend [pkgdown action](https://github.com/r-lib/actions/blob/HEAD/examples/pkgdown.yaml). If your workflow does not contain `workflow_dispatch`, you will need to update `.github/actions/pkgdown.yaml` by running `use_github_action("pkgdown")`. +This site assumes that you're using a recent version of our recommended [pkgdown action](https://github.com/r-lib/actions/blob/HEAD/examples/pkgdown.yaml). If your workflow does not contain `workflow_dispatch`, you will need to update `.github/actions/pkgdown.yaml` by running `use_github_action("pkgdown")`. ## Process @@ -36,13 +37,13 @@ gert::git_branch_checkout("main") gert::git_pull() ``` -Next figure out the released version that we're updating: +Next figure out the released version that you're updating: ```{r} ver <- desc::desc_get_version()[1, 1:3] ``` -We'll use this to create and checkout the branch that you'll work in: +You will use this to create and checkout the branch that you'll work in: ```{r} gert::git_branch_create(paste0("pkgdown-v", ver), paste0("v", ver)) @@ -55,14 +56,14 @@ Run this R code to generate the git code to pull changes for the most common loc ```{r} files <- c( - # overall site config + # overall site config "_pkgdown.yml", # the workflow that builds the site ".github/workflows/pkgdown.yaml", # readme and vignettes "README.md", "vignettes", # logo and favicon - "man/figures/", "pkgdown/", + "man/figures/", "pkgdown/", # Author metadata and Config/Needs/Website "DESCRIPTION" ) @@ -76,7 +77,7 @@ If you backport `DESCRIPTION`, you'll also need undo the change to the `Version` desc::desc_set_version(ver) ``` -Now build the site locally and check that it looks as you expect: +Now build the site locally and check that it looks as expected: ```{r} pkgdown::build_site() @@ -123,7 +124,7 @@ This directs pkgdown to "generate different sites for the development and releas The readr package demonstrates what happens in automatic development mode: -[readr.tidyverse.org](https://readr.tidyverse.org) documents the released version, i.e. what `install.packages()` would deliver.\ +[readr.tidyverse.org](https://readr.tidyverse.org) documents the released version, i.e. what `install.packages()` will deliver.\ [readr.tidyverse.org/dev/](https://readr.tidyverse.org/dev/) documents the dev version, i.e. what you'd get by installing from GitHub. In this mode, `pkgdown::build_site()`, consults DESCRIPTION to learn the package's version number. @@ -131,13 +132,13 @@ For a development version number, the rendered site is written to `docs/dev/`. For a released version number, the site is written to `docs/`. (There are also other signals to alert users that they are reading documentation for a dev version vs. a released version.) -Automatic development mode is recommended for packages with a broad user base, because it maximizes the chance that a user will read web-based documentation that reflects the package version that is locally installed. +Automatic development mode is recommended for packages with a broad user base because it maximizes the chance that a user will read web-based documentation which reflects the package version that is locally installed. ### Publishing Now that we've established the meaning of a released (vs dev) site, we have to consider how the site is built (i.e. how the HTML is generated) and deployed (i.e. how the HTML is published to a website so people can see it.). -We recommend `usethis::use_pkgdown_github_pages()` to do basic pkgdown setup and configure a GitHub Actions (GHA) workflow to automatically render and publish the site to GitHub Pages. This function is bascially a shortcut for calling the following functions individually: +We recommend `usethis::use_pkgdown_github_pages()` to do basic pkgdown setup and configure a GitHub Actions (GHA) workflow to automatically render and publish the site to GitHub Pages. This function is basically a shortcut for calling the following functions individually: * `use_pkgdown()` * `use_github_pages()` @@ -159,16 +160,16 @@ on: release: types: [published] workflow_dispatch: - + <snip, snip> - name: Build site run: Rscript -e 'pkgdown::build_site_github_pages(...)' - + - name: Deploy to GitHub pages 🚀 if: github.event_name != 'pull_request' uses: JamesIves/github-pages-deploy-action@4.1.4 - + <snip, snip> ``` @@ -178,7 +179,7 @@ Altogether this means that we: * Build, but don't deploy, for pull requests against `main`. This reveals any pkgdown errors, but ensures the live site isn't - updated until the pull request is merged (because the code is + updated until the pull request is merged (because the code is pushed to `main`). * Build and deploy when we publish a GitHub release. @@ -203,13 +204,13 @@ The overall goal is to create a branch that combines some features of the releas For example, if readr's latest release is 2.1.1: -``` +``` git checkout -b update-pkgdown-2-1-1 v2.1.1 ``` And here is the general pattern: -``` +``` git checkout -b NEW-BRANCH-NAME NAME-OF-RELEASE-TAG ``` @@ -231,21 +232,21 @@ Here are some tips on backporting specific changes into this branch. If you are lucky, there are specific commits in your default branch that contain all the necessary changes. In that case, we can cherry pick such a commit by its SHA: -``` +``` git cherry-pick SHA ``` -If that doesn't cover everything, for each file you want to update, identify a Git reference (meaning: a SHA, tag, or branch) where the file is in the desired state. +If that doesn't cover everything for each file you want to update, identify a Git reference (meaning: a SHA, tag, or branch) where the file is in the desired state. Checkout that specific file path from that specific ref: -``` +``` git checkout main -- path/to/the/file ``` For example, readr recently gained a new vignette that applies to the released version of readr, i.e. it does not document any dev-only features or functions. We can bring that into the current branch with: -``` +``` git checkout main -- vignettes/column-types.Rmd ``` diff --git a/vignettes/linking.Rmd b/vignettes/linking.Rmd index 75bda28e7..2c5d54479 100644 --- a/vignettes/linking.Rmd +++ b/vignettes/linking.Rmd @@ -51,7 +51,7 @@ If pkgdown can find a pkgdown site for the remote package, it will link to it; o url: https://dplyr.tidyverse.org ``` - When this field is defined, pkgdown generate a public facing + When this field is defined, pkgdown generates a public facing [`pkgdown.yml` file](https://dplyr.tidyverse.org/pkgdown.yml) that provides metadata about the site: diff --git a/vignettes/metadata.Rmd b/vignettes/metadata.Rmd index f7e81338d..9f26f43e3 100644 --- a/vignettes/metadata.Rmd +++ b/vignettes/metadata.Rmd @@ -20,9 +20,9 @@ Package authors can customize the metadata used by Twitter and the [Open Graph p You can preview and validate the appearance of the social media cards with online tools: -* [Google Rich Results Test][ogp-validator]; -* Drafting a tweet to yourself; -* Sending yourself a Slack message. +* [Google Rich Results Test][ogp-validator] +* Drafting a tweet to yourself +* Sending yourself a Slack message ## Necessary configuration @@ -40,7 +40,7 @@ Metadata for the entire pkgdown website can be specified in the site's `_pkgdown home: title: An R package for pool-noodle discovery description: Discover and add pool-noodles to your growing collection. - + template: opengraph: image: @@ -56,33 +56,33 @@ The `home: title` and `home: description` fields override the `Title` and `Descr The `template: opengraph` section allows you to further customize the social media card. -* `image`: By default, pkgdown uses the package's logo for the card image - (if one exists). Use `image` to specify an alternative image for the social +* `image`: By default, pkgdown uses the package's logo for the card image + (if one exists). Use `image` to specify an alternative image for the social media cards of pages in your pkgdown site. - * `src`: A fully qualified URL to a media card image e.g. `src: https://avatars.githubusercontent.com/u/22618716?v=4`; + * `src`: A fully qualified URL to a media card image e.g. `src: https://avatars.githubusercontent.com/u/22618716?v=4`; or a relative path to an image in the rendered website e.g. `src: articles/test/image.jpg`; or a relative path to an image stored in `man/figures` in the package e.g. `src: man/figures/cards.png`. The `src` field is required if `image` is specified. - - * `alt`: Alternative text describing the image for screen readers and + + * `alt`: Alternative text describing the image for screen readers and other situations where your social media card image cannot be displayed. * `twitter`: You can specify the Twitter accounts associated with your package - and the [style of social media card][twitter-card] that Twitter will + and the [style of social media card][twitter-card] that Twitter will display. - - * `creator`: Typically, the Twitter handle of the author of the package or + + * `creator`: Typically, the Twitter handle of the author of the package or article. - + * `site`: The Twitter handle of the organization affiliated with the - package author or sponsoring the package development. - - * If only one of `creator` or `site` is included, the provided value will + package author or sponsoring the package development. + + * If only one of either `creator` or `site` is included, the provided value will be used for both fields. - - * `card`: The [style of social media card][twitter-card] that Twitter will - display. For pkgdown sites, the most relevant options are + + * `card`: The [style of social media card][twitter-card] that Twitter will + display. For pkgdown sites, the most relevant options are `summary_large_image`, featuring a large image over the page title and description, or `summary`, featuring a small square image inline and to the left of the page title and description. @@ -96,7 +96,7 @@ title: "Introduction to poolnoodlr" description: "A brief introduction to pool noodles in R." author: "Mara Averick" opengraph: - image: + image: src: "https://example.com/pkg/batpig.png" twitter: card: summary @@ -113,8 +113,8 @@ Use the `title`, `description`, and `author` fields to specify the title, descri * The `title` field is used as the title of your article in your pkgdown site and should always be included. -* Both `title` and `description` are used by pkgdown for the page's social - media card. If `description` is not included in the article's YAML front +* Both `title` and `description` are used by pkgdown for the page's social + media card. If `description` is not included in the article's YAML front matter, then the name of the package is used instead. The `description` is also displayed on the articles index. @@ -125,4 +125,4 @@ In articles, the `opengraph` section works in the same way as the site-wide `tem [ogp]: https://ogp.me/ [ogp-validator]: https://search.google.com/test/rich-results -[twitter-card]: https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/abouts-cards +[twitter-card]: https://developer.x.com/en/docs/x-for-websites/cards/overview/abouts-cards diff --git a/vignettes/pkgdown.Rmd b/vignettes/pkgdown.Rmd index 643dda46f..22af5467d 100644 --- a/vignettes/pkgdown.Rmd +++ b/vignettes/pkgdown.Rmd @@ -64,8 +64,8 @@ pkgdown's defaults work to ensure that your site is accessible to as many people ## Home page The contents of the home page are automatically generated from `index.md` or `README.md`. -pkgdown tries them in order, so it's possible to have a different display on GitHub and pkgdown by providing both files. -The homepage also includes a sidebar full of useful links; see `?build_home` for how these are generated and how you can customise them. +pkgdown tries to put them in order, so it's possible to have a different display on GitHub and pkgdown by providing both files. +The homepage also includes a sidebar full of useful links (see `?build_home` for how these are generated and how you can customise them). ## Reference @@ -116,7 +116,7 @@ It just re-builds the index page, making it faster to quickly change `_pkgdown.y ## Articles pkgdown will automatically build all vignettes found in `vignettes/`, translating them to HTML files in `articles/`. -It is recommended to name your intro article with your package name to generate a Get Started page automatically. +It is recommended to name your intro article with your package name to generate a "Get Started" page automatically. Due to the way that pkgdown has to integrate R Markdown generated HTML with its own HTML, relatively little control is available over the output format. You can see the details in `?build_articles`. diff --git a/vignettes/quarto.qmd b/vignettes/quarto.qmd index 5f64cf341..dd95085dd 100644 --- a/vignettes/quarto.qmd +++ b/vignettes/quarto.qmd @@ -24,18 +24,10 @@ project: render: ['*.qmd'] ``` -### GitHub actions +### GitHub Actions -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: +The `setup-r-dependencies` action will [automatically](https://github.com/r-lib/actions/tree/v2-branch/setup-r-dependencies#usage) install Quarto in your GitHub Actions if a .qmd file is present in your repository (see the `install-quarto` parameter for more details). -```yaml - - name: Set up Quarto - uses: quarto-dev/quarto-actions/setup@v2 - with: - version: pre-release - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} -``` ## Limitations diff --git a/vignettes/translations.Rmd b/vignettes/translations.Rmd index 394825b3f..ee39f62de 100644 --- a/vignettes/translations.Rmd +++ b/vignettes/translations.Rmd @@ -46,7 +46,7 @@ Translations are contributed by community members so if your language is not cur To get started, first check the [pkgdown issues](https://github.com/r-lib/pkgdown/issues) to see if anyone has filed an existing issue. If so, the person who filed the issue might make for a great collaborator 😀. -Next, install [potools](https://michaelchirico.github.io/potools) and [usethis](https://usethis.r-lib.org): +Next, install [potools](https://michaelchirico.github.io/potools/) and [usethis](https://usethis.r-lib.org): ```{r} #| eval: false