diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 091012f..ffca466 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -36,7 +36,7 @@ jobs: rcmdcheck::rcmdcheck(args = c("--no-manual"), check_dir = "check") shell: Rscript {0} env: - GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + GH_PAT: ${{ secrets.GH_PAT }} - name: Check testthat id: check_check diff --git a/DESCRIPTION b/DESCRIPTION index efbdf96..6d0fe56 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -35,13 +35,15 @@ Imports: rprojroot, rvest, stringr, + webshot2, xml2, yaml Suggests: - remotes, testthat (>= 3.0.0), tibble, utils +Remotes: + jhudsl/cow VignetteBuilder: knitr ByteCompile: true diff --git a/NAMESPACE b/NAMESPACE index 9746629..aa7ad95 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -23,6 +23,7 @@ export(get_gs_pptx) export(get_image_from_slide) export(get_image_link_from_slide) export(get_object_id_notes) +export(get_pages_url) export(get_slide_id) export(get_slide_page) export(get_yaml_spec) @@ -32,6 +33,7 @@ export(gs_png_download) export(gs_png_url) export(include_slide) export(make_embed_markdown) +export(make_screenshots) export(output_destination) export(parse_q_tag) export(parse_quiz) @@ -46,6 +48,7 @@ export(set_up_leanpub) export(unzip_pptx) export(website_to_embed_leanpub) export(xml_notes) +import(dplyr) importFrom(httr,GET) importFrom(httr,accept_json) importFrom(httr,config) @@ -57,10 +60,13 @@ importFrom(jsonlite,fromJSON) importFrom(magrittr,"%>%") importFrom(openssl,aes_cbc_decrypt) importFrom(readr,write_tsv) +importFrom(rprojroot,find_root) +importFrom(rprojroot,has_dir) importFrom(utils,download.file) importFrom(utils,installed.packages) importFrom(utils,menu) importFrom(utils,unzip) +importFrom(webshot2,webshot) importFrom(xml2,read_xml) importFrom(xml2,xml_find_all) importFrom(xml2,xml_text) diff --git a/R/get_pages_url.R b/R/get_pages_url.R new file mode 100644 index 0000000..1447125 --- /dev/null +++ b/R/get_pages_url.R @@ -0,0 +1,81 @@ +#' Retrieve pages url for a repo +#' +#' Given an repository on GitHub, retrieve the pages URL for it. +#' +#' @param repo_name The full name of the repo to get bookdown chapters from. +#' e.g. "jhudsl/OTTR_Template" +#' @param git_pat If private repositories are to be retrieved, a github personal +#' access token needs to be supplied. If none is supplied, then this will attempt to +#' grab from a git pat set in the environment with usethis::create_github_token(). +#' Authorization handled by \link[cow]{get_git_auth} +#' @param verbose TRUE/FALSE do you want more progress messages? +#' @param keep_json verbose TRUE/FALSE keep the json file locally? +#' +#' @return a data frame with the repository with the following columns: +#' data_level, data_path, chapt_name, url, repository name +#' +#' @importFrom magrittr %>% +#' @import dplyr +#' +#' @export +#' +#' @examples \dontrun{ +#' +#' usethis::create_github_token() +#' +#' get_pages_url("jhudsl/Documentation_and_Usability") +#' } +get_pages_url <- function(repo_name, + git_pat = NULL, + verbose = FALSE, + keep_json = FALSE) { + page_url <- NA + + # Try to get credentials other way + auth_arg <- get_git_auth(git_pat = git_pat, quiet = !verbose) + + git_pat <- try(auth_arg$password, silent = TRUE) + + if (grepl("Error", git_pat[1])) { + warning("Cannot retrieve page info without GitHub credentials. Passing an NA.") + } + + # We can only retrieve pages if we have the credentials + if (!grepl("Error", git_pat[1])) { + exists <- check_git_repo( + repo_name = repo_name, + git_pat = git_pat, + verbose = FALSE + ) + + if (exists) { + # Get repo info + repo_info <- get_repo_info( + repo_name = repo_name, + git_pat = git_pat + ) + + # Declare URL + url <- paste0("https://api.github.com/repos/", repo_name, "/pages") + + # Github api get + response <- httr::GET( + url, + httr::add_headers(Authorization = paste0("token ", auth_arg$password)), + httr::accept_json() + ) + + if (httr::http_error(response)) { + if (verbose) { + warning(paste0("url: ", url, " failed")) + } + } else { + # Get content as JSON + page_info <- httr::content(response, as = "parsed") + + page_url <- page_info$html_url + } + } + } + return(page_url) +} diff --git a/R/screenshot.R b/R/screenshot.R new file mode 100644 index 0000000..50e3084 --- /dev/null +++ b/R/screenshot.R @@ -0,0 +1,74 @@ +#' A function to make screenshots from an OTTR bookdown website +#' @description This function creates screenshots of course chapters that are stored in a created output directory +#' +#' @param git_pat required argument; a Git secret -- see https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens for more info +#' @param repo required argument; GitHub repository name, e.g., jhudsl/OTTR_Template +#' @param output_dir default is "resources/chapt_screen_images"; Output directory where the chapter's screen images should be stored. For OTTR courses, don't change this unless you've changed the downstream functions accordingly. +#' @param base_url default is NULL; rendered bookdown URL where screenshots are taken from, if NULL, the function will use the repo_name and and git_pat to find the base_url +#' +#' @return the file path for file where chapter urls are saved +#' +#' @import dplyr +#' @importFrom webshot2 webshot +#' @importFrom magrittr %>% +#' @importFrom rprojroot find_root has_dir +#' +#' @author Candace Savonen +#' +#' @export +#' +#' @examples \dontrun{ +#' +#' make_screenshots(Sys.getenv("secrets.GH_PAT"), "jhudsl/OTTR_Template") +#' +#' } +make_screenshots <- function(git_pat, repo, output_dir = "resources/chapt_screen_images", base_url = NULL){ + + # Find .git root directory + root_dir <- find_root(has_dir(".git")) + + output_folder <- file.path(output_dir) + if (!dir.exists(output_folder)) { + dir.create(output_folder, recursive = TRUE) + } + + if (is.null(base_url)){ + base_url <- ottrpal::get_pages_url(repo_name = repo, git_pat = git_pat) #what if these arguments are still NULL/not supplied? + base_url <- gsub("/$", "", base_url) + } + + # Collect all the chapter pages for the url given + chapt_df <- ottrpal::get_chapters(html_page = file.path(root_dir, "docs", "index.html"), + base_url = base_url) + + # Now take screenshots for each + file_names <- lapply(chapt_df$url, function(url){ + file_name <- gsub(".html", + ".png", + file.path(output_folder, basename(url)) + ) + + # Get rid of special characters because leanpub no like + file_name <- gsub(":|?|!|\\'", + "", + file_name + ) + + # Take the screenshot + webshot(url, file = file_name) + + return(file_name) + }) + + # Save file of chapter urls and file_names + chapt_df <- chapt_df %>% + dplyr::mutate(img_path = unlist(file_names)) + + chapt_df %>% + readr::write_tsv(file.path(output_folder, "chapter_urls.tsv")) + + message(paste("Image Chapter key written to: ", file.path(output_folder, "chapter_urls.tsv"))) + + return(file.path(output_folder, "chapter_urls.tsv")) + +} \ No newline at end of file diff --git a/man/get_pages_url.Rd b/man/get_pages_url.Rd new file mode 100644 index 0000000..8f45fac --- /dev/null +++ b/man/get_pages_url.Rd @@ -0,0 +1,36 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/get_pages_url.R +\name{get_pages_url} +\alias{get_pages_url} +\title{Retrieve pages url for a repo} +\usage{ +get_pages_url(repo_name, git_pat = NULL, verbose = FALSE, keep_json = FALSE) +} +\arguments{ +\item{repo_name}{The full name of the repo to get bookdown chapters from. +e.g. "jhudsl/OTTR_Template"} + +\item{git_pat}{If private repositories are to be retrieved, a github personal +access token needs to be supplied. If none is supplied, then this will attempt to +grab from a git pat set in the environment with usethis::create_github_token(). +Authorization handled by \link[cow]{get_git_auth}} + +\item{verbose}{TRUE/FALSE do you want more progress messages?} + +\item{keep_json}{verbose TRUE/FALSE keep the json file locally?} +} +\value{ +a data frame with the repository with the following columns: +data_level, data_path, chapt_name, url, repository name +} +\description{ +Given an repository on GitHub, retrieve the pages URL for it. +} +\examples{ +\dontrun{ + +usethis::create_github_token() + +get_pages_url("jhudsl/Documentation_and_Usability") +} +} diff --git a/man/make_screenshots.Rd b/man/make_screenshots.Rd new file mode 100644 index 0000000..d3d4c9d --- /dev/null +++ b/man/make_screenshots.Rd @@ -0,0 +1,38 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/screenshot.R +\name{make_screenshots} +\alias{make_screenshots} +\title{A function to make screenshots from an OTTR bookdown website} +\usage{ +make_screenshots( + git_pat, + repo, + output_dir = "resources/chapt_screen_images", + base_url = NULL +) +} +\arguments{ +\item{git_pat}{required argument; a Git secret -- see https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens for more info} + +\item{repo}{required argument; GitHub repository name, e.g., jhudsl/OTTR_Template} + +\item{output_dir}{default is "resources/chapt_screen_images"; Output directory where the chapter's screen images should be stored. For OTTR courses, don't change this unless you've changed the downstream functions accordingly.} + +\item{base_url}{default is NULL; rendered bookdown URL where screenshots are taken from, if NULL, the function will use the repo_name and and git_pat to find the base_url} +} +\value{ +the file path for file where chapter urls are saved +} +\description{ +This function creates screenshots of course chapters that are stored in a created output directory +} +\examples{ +\dontrun{ + + make_screenshots(Sys.getenv("secrets.GH_PAT"), "jhudsl/OTTR_Template") + +} +} +\author{ +Candace Savonen +}