From 099bd8eaf89bda2faa6991aebf1c4f9999cbf158 Mon Sep 17 00:00:00 2001 From: avahoffman Date: Thu, 23 Apr 2026 12:03:23 -0400 Subject: [PATCH 1/4] =?UTF-8?q?=E2=96=B3=20to=20"Name"=20as=20header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/render_collection.R | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/scripts/render_collection.R b/scripts/render_collection.R index 34271dd4..2e7352b7 100644 --- a/scripts/render_collection.R +++ b/scripts/render_collection.R @@ -21,12 +21,12 @@ make_collection_table <- function(exclude = NULL, include = NULL, kable = FALSE) if(kable){ df <- df %>% - mutate(`Book Name` = paste0("[", name, "](", homepage, ") ([github](", html_url, "))")) + mutate(Name = paste0("[", name, "](", homepage, ") ([github](", html_url, "))")) } else { df <- df %>% - mutate(`Book Name` = paste0('', name, '')) - #mutate(`Book Name` = paste0('', name, ' (github)')) + mutate(Name = paste0('', name, '')) + #mutate(Name = paste0('', name, ' (github)')) #mutate(topics = str_replace_all(topics, pattern = ", ", replacement = "
")) } @@ -75,7 +75,7 @@ make_collection_table <- function(exclude = NULL, include = NULL, kable = FALSE) df <- df %>% rename(Description = description, Topics = topics, Funding = funding) %>% - select(`Book Name`, Funding, Description, Topics) + select(Name, Funding, Description, Topics) # Remove duplicates if necessary df <- distinct(df) @@ -95,7 +95,7 @@ make_collection_table <- function(exclude = NULL, include = NULL, kable = FALSE) # Will error out if file doesn't exist - provides a blank tibble instead error = function(e) { df <- - tibble(`Book Name` = "none", + tibble(Name = "none", Funding = "none", Description = "none", Topics = "none") From cc2109188eb202827861db298468f7d85605294a Mon Sep 17 00:00:00 2001 From: avahoffman Date: Thu, 23 Apr 2026 12:52:20 -0400 Subject: [PATCH 2/4] Add Category --- scripts/render_collection.R | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/scripts/render_collection.R b/scripts/render_collection.R index 2e7352b7..dc2b3ad5 100644 --- a/scripts/render_collection.R +++ b/scripts/render_collection.R @@ -80,6 +80,19 @@ make_collection_table <- function(exclude = NULL, include = NULL, kable = FALSE) # Remove duplicates if necessary df <- distinct(df) + # Create a "category" column + df <- + df %>% + mutate( + Category = + case_when( + stringr::str_detect(Topics, "course") & + !stringr::str_detect(Topics, "hutch-course") ~ "Course", + stringr::str_detect(Topics, "hutch-course") ~ "Hutch Course", + stringr::str_detect(Topics, "edtech-software") ~ "Software", + ) + ) + # Filter if desired if(!is.null(include)){ df <- @@ -98,7 +111,8 @@ make_collection_table <- function(exclude = NULL, include = NULL, kable = FALSE) tibble(Name = "none", Funding = "none", Description = "none", - Topics = "none") + Topics = "none", + Category = "none") return(df) } From fbd44102be869d80f4908e8a136e6420cb7152ef Mon Sep 17 00:00:00 2001 From: avahoffman Date: Thu, 23 Apr 2026 12:52:24 -0400 Subject: [PATCH 3/4] Add OTTR --- scripts/query_collection.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/query_collection.R b/scripts/query_collection.R index 1a3caabc..3a9fba2a 100644 --- a/scripts/query_collection.R +++ b/scripts/query_collection.R @@ -30,7 +30,7 @@ message(paste("Querying Github API...")) # Request search results specific to jhudsl + fhdsl + DataTrail organizations # Also allows us to pull in repos forked into these organizations -url <- "https://api.github.com/search/repositories?q=user:jhudsl+user:fhdsl+user:datatrail-jhu+fork:true&per_page=50" +url <- "https://api.github.com/search/repositories?q=user:jhudsl+user:fhdsl+user:ottrproject+user:datatrail-jhu+fork:true&per_page=50" # Provide the appropriate GH token & Make the request req <- GET(url = url, config = add_headers(Authorization = paste("token", git_pat))) @@ -49,7 +49,7 @@ last <- str_extract(req$headers$link, pattern = '.(?=>; rel=\"last\")') full_repo_df <- tibble() for (page in 1:last){ - url <- paste0("https://api.github.com/search/repositories?q=user:jhudsl+user:fhdsl+user:datatrail-jhu+fork:true&per_page=50&page=", page) + url <- paste0("https://api.github.com/search/repositories?q=user:jhudsl+user:fhdsl+user:ottrproject+user:datatrail-jhu+fork:true&per_page=50&page=", page) message(paste("Gathering results from:", url)) req <- GET(url = url, config = add_headers(Authorization = paste("token", git_pat))) repo_dat <- From ceb28d9658983d0f56cb346e938f458ab3aad587 Mon Sep 17 00:00:00 2001 From: avahoffman Date: Thu, 23 Apr 2026 12:57:32 -0400 Subject: [PATCH 4/4] Add in TOC-less ability --- .github/workflows/render-all.yml | 178 +++++++++++++++++++++++++++++++ config_automation.yml | 6 ++ 2 files changed, 184 insertions(+) diff --git a/.github/workflows/render-all.yml b/.github/workflows/render-all.yml index e15e18d3..845ad26d 100644 --- a/.github/workflows/render-all.yml +++ b/.github/workflows/render-all.yml @@ -41,7 +41,11 @@ jobs: files: config_automation.yml # Pass a space-separated list of configuration files. Rightmost files take precedence. outputs: toggle_website: "${{ env.RENDER_WEBSITE }}" + toggle_coursera: "${{ env.RENDER_COURSERA }}" + toggle_leanpub: "${{ env.RENDER_LEANPUB }}" + make_book_txt: "${{ env.MAKE_BOOK_TXT }}" rendering_docker_image: "${{ env.RENDERING_DOCKER_IMAGE }}" + toggle_quiz_check: "${{ env.CHECK_QUIZZES }}" ########################## Make the Collection ################################ @@ -79,3 +83,177 @@ jobs: preview: false token: ${{ secrets.GH_PAT }} docker_image: ${{needs.yaml-check.outputs.rendering_docker_image}} + +########################## Make TOC-less ####################################### + +render-tocless: + name: Render TOC-less version for Leanpub or Coursera + needs: [yaml-check, render-website] + runs-on: ubuntu-latest + container: + image: ${{needs.yaml-check.outputs.rendering_docker_image}} + if: ${{needs.yaml-check.outputs.toggle_coursera == 'true' || needs.yaml-check.outputs.toggle_leanpub == 'true'}} + + steps: + - name: checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GH_PAT }} + + - name: Login as github-actions bot + run: | + git config --global --add safe.directory $GITHUB_WORKSPACE + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' + git remote set-url origin https://${GH_PAT}@github.com/${GITHUB_REPOSITORY} + git fetch origin + git pull --rebase --allow-unrelated-histories --strategy-option=ours + + # Rendered content for Leanpub and Coursera is very similar. + # This job creates a shared scaffold for both. + - name: Run TOC-less version of render -- Rmd version + if: ${{needs.yaml-check.outputs.toggle_website == 'rmd' }} + id: tocless_rmd + run: Rscript -e "ottrpal::render_without_toc()" + + - name: Run TOC-less version of render -- quarto version + id: tocless_quarto + if: ${{needs.yaml-check.outputs.toggle_website == 'quarto' }} + run: | + Rscript -e "quarto::quarto_render('.', metadata = list(sidebar = F, toc = F), + quarto_args = c('--output-dir', 'docs/no_toc/'))" + + # Commit the TOC-less version files + - name: Commit tocless bookdown files + env: + GH_PAT: ${{ secrets.GH_PAT }} + run: | + git add --force docs/no_toc* + git commit -m 'Render toc-less' || echo "No changes to commit" + git status docs/no_toc* + git push --force -u origin main || echo "No changes to push" + + render-leanpub: + name: Finish Leanpub prep + needs: [yaml-check, render-tocless] + runs-on: ubuntu-latest + container: + image: jhudsl/base_ottr:dev + if: ${{needs.yaml-check.outputs.toggle_leanpub == 'true'}} + + steps: + - name: checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GH_PAT }} + + - name: Login as github actions bot + run: | + git config --global --add safe.directory $GITHUB_WORKSPACE + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' + git remote set-url origin https://${GH_PAT}@github.com/${GITHUB_REPOSITORY} + git fetch origin + git pull --rebase --allow-unrelated-histories --strategy-option=ours + ls docs/no_toc + + # Create screenshots + - name: Run the screenshot creation + run: | + # Remove old folder + rm -rf resources/chapt_screen_images + + # Make new screenshots + chapt_urls=$(Rscript -e " \ + Sys.setenv(CHROMOTE_CHROME = '/usr/bin/vivaldi'); \ + ottrpal::make_screenshots( \ + token = '${{ secrets.GH_PAT }}', \ + repo = '$GITHUB_REPOSITORY' )" \ + ) + + # We want a fresh run of the renders each time + - name: Delete manuscript/ + env: + GH_PAT: ${{ secrets.GH_PAT }} + run: | + rm -rf manuscript/ + git add . + git commit -m 'Delete manuscript folder' || echo "No changes to commit" + git push -u origin main || echo "No changes to push" + + - name: Run ottrpal::bookdown_to_embed_leanpub -- No Quiz + if: ${{ needs.yaml-check.outputs.toggle_quiz_check != 'true'}} + run: | + Rscript -e "ottrpal::website_to_embed_leanpub( + render = FALSE, \ + chapt_img_key = 'resources/chapt_screen_images/chapter_urls.tsv', \ + make_book_txt = as.logical('${{needs.yaml-check.outputs.make_book_txt == 'true'}}'), \ + quiz_dir = NULL)" + + - name: Run ottrpal::bookdown_to_embed_leanpub -- with Quiz + if: ${{ needs.yaml-check.outputs.toggle_quiz_check == 'true'}} + run: | + Rscript -e "ottrpal::website_to_embed_leanpub( + render = FALSE, \ + chapt_img_key = 'resources/chapt_screen_images/chapter_urls.tsv', \ + make_book_txt = as.logical('${{needs.yaml-check.outputs.make_book_txt == 'true'}}'))" + + # Commit the rendered Leanpub files + - name: Commit rendered Leanpub files + env: + GH_PAT: ${{ secrets.GH_PAT }} + run: | + git add --force manuscript/* || "No files to add" + git add --force resources/* || "No files to add" + git add --force docs/* || "No files to add" + git commit -m 'Render Leanpub' || echo "No changes to commit" + git status docs/* + git pull --rebase --allow-unrelated-histories --strategy-option=ours --autostash + git push --force --set-upstream origin main || echo "No changes to push" + + render-coursera: + name: Finish Coursera prep + needs: [yaml-check, render-tocless] + runs-on: ubuntu-latest + container: + image: ${{needs.yaml-check.outputs.rendering_docker_image}} + if: ${{needs.yaml-check.outputs.toggle_coursera == 'true'}} + + steps: + - name: checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GH_PAT }} + + - name: Login as github action + run: | + git config --global --add safe.directory $GITHUB_WORKSPACE + git config --global user.name 'github-actions[bot]' + git config --global user.email 'github-actions[bot]@users.noreply.github.com' + git remote set-url origin https://${GH_PAT}@github.com/${GITHUB_REPOSITORY} + git fetch origin + git pull --rebase --allow-unrelated-histories --strategy-option=ours + + # Run Coursera version + - name: Convert Leanpub quizzes to Coursera + if: needs.yaml-check.outputs.toggle_leanpub == 'true' && needs.yaml-check.outputs.toggle_quiz_check == 'true' + id: coursera + run: Rscript -e "ottrpal::convert_coursera_quizzes()" + + # Commit the rendered files + # Only commit coursera quizzes if the directory is present + - name: Commit rendered Coursera files + env: + GH_PAT: ${{ secrets.GH_PAT }} + run: | + if [ -d 'coursera_quizzes' ]; then + git add --force coursera_quizzes/* + fi + git add --force resources/* + git add --force docs/* + git commit -m 'Render Coursera quizzes' || echo "No changes to commit" + git status + git push --force -u origin main || echo "No changes to push" \ No newline at end of file diff --git a/config_automation.yml b/config_automation.yml index 3bf069a8..06e4dda1 100644 --- a/config_automation.yml +++ b/config_automation.yml @@ -28,6 +28,12 @@ url-check-periodically: true ##### Renderings run upon merge to main branch ##### # Rendering each platform's content render-website: rmd_web +render-leanpub: true +render-coursera: false + +## Automate the creation of Book.txt file? yes/no +## This is only relevant if render-leanpub is yes, otherwise it will be ignored +make-book-txt: true # What docker image should be used for rendering? # The default is jhudsl/base_ottr:main