Quarto est incroyable! Et ça bouffe le monde ! D’ACCORD. Peut-être pas le entier monde. Mais c’est encore étonnante!
Si vous parcourez le QG, vous trouverez de nombreux cahiers intéressants. Vous pouvez même en avoir quelques-uns vous-même ! Ne serait-ce pas formidable si vous pouviez simplement importer un bloc-notes Observable directement dans Quarto ? Eh bien, maintenant vous pouvez.
#' Transform an Observable Notebook into a Quarto project
#'
#' This will yank the cells from a live Observable notebook and turn it into a Quarto project,
#' downloading all the `FileAttachments` as well.
#'
#' @param ohq_ref either a short ref (e.g. `@@hrbrmstr/just-one-more-thing`) or a full
#' URL to a published Observable notebook
#' @param output_dir quarto project directory (will be created if not already present)
#' @param quarto_filename if `NULL` (the default) the name will be the slug (e.g. `just-one-more-thing`
#' as in the `ohq_ref` param eample) with `.qmd` suffix
#' @param echo set `echo` to `true` or `false` in the YAML
ohq_to_quarto <- function(ohq_ref, output_dir, quarto_filename = NULL, echo = FALSE) {
ohq_ref <- ohq_ref[1]
if (grepl("^@", ohq_ref)) ohq_ref <- sprintf("https://observablehq.com/%s", ohq_ref)
output_dir <- output_dir[1]
if (!dir.exists(output_dir)) dir.create(output_dir)
quarto_filename <- quarto_filename[1]
pg <- rvest::read_html(ohq_ref)
pg |>
html_nodes("script#__NEXT_DATA__") |>
html_text() |>
jsonlite::fromJSON() -> x
meta <- x$props$pageProps$initialNotebook
nodes <- x$props$pageProps$initialNotebook$nodes
if (is.null(quarto_filename)) quarto_filename <- sprintf("%.qmd", meta$slug)
c(
"---",
sprintf("title: '%s'", meta$title),
"format: html",
if (echo) "echo: true" else "echo: false",
"---",
"",
purrr::map2(nodes$value, nodes$mode, ~{
c(
"```{ojs}",
dplyr::case_when(
.y == "md" ~ sprintf("md`%s`", .x),
.y == "html" ~ sprintf("html`%s`", .x),
TRUE ~ .x
),
"```",
""
)
})
) |>
purrr::flatten_chr() |>
cat(
file = file.path(output_dir, quarto_filename),
sep = "\n"
)
if (length(meta$files)) {
if (nrow(meta$files) > 0) {
purrr::walk2(
meta$files$download_url,
meta$files$name, ~{
download.file(
url = .x,
destfile = file.path(output_dir, .y),
quiet = TRUE
)
}
)
}
}
}
Vous pouvez essayer cela avec mon Cahier Columbo:
ohq_to_quarto(
ohq_ref = "@hrbrmstr/just-one-more-thing",
output_dir = "~/Development/columbo",
quarto_filename = "columbo.qmd",
echo = FALSE
)
Cela téléchargera le fichier CSV dans le répertoire spécifié et convertira les cellules en un .qmd
. Tu peux télécharger ce fichier d’exemplemais vous aurez besoin des données pour l’exécuter (ou simplement exécuter le convertisseur).
Voici à quoi ressemble l’arborescence des répertoires après l’exécution du script et le rendu du document :
columbo/
├── columbo.html
├── columbo.qmd
├── columbo_data.csv
└── columbo_files
└── libs
├── bootstrap
│ ├── bootstrap-icons.css
│ ├── bootstrap-icons.woff
│ ├── bootstrap.min.css
│ └── bootstrap.min.js
├── clipboard
│ └── clipboard.min.js
├── quarto-html
│ ├── anchor.min.js
│ ├── popper.min.js
│ ├── quarto-syntax-highlighting.css
│ ├── quarto.js
│ ├── tippy.css
│ └── tippy.umd.min.js
└── quarto-ojs
├── quarto-ojs-runtime.js
└── quarto-ojs.css
La fonction n’a pas été testée au combat, et elle est limitée à la fonctionnalité actuelle, mais elle devrait faire ce qu’elle dit sur l’étain.
Je vais transformer cela en un binaire Rust afin qu’il soit plus utilisable en dehors de l’écosystème R.
*** Ceci est un blog syndiqué du Security Bloggers Network de rud.is Rédigé par hrbrmstr. Lire le message d’origine sur : https://rud.is/b/2022/08/19/bootstrapping-an-ojs-quarto-document-with-an-observable-notebook/