diff --git a/.github/ISSUE_TEMPLATE/course-content-add.md b/.github/ISSUE_TEMPLATE/course-content-add.md index 71213d8..1a5f795 100644 --- a/.github/ISSUE_TEMPLATE/course-content-add.md +++ b/.github/ISSUE_TEMPLATE/course-content-add.md @@ -3,15 +3,15 @@ name: New content idea about: Suggest an idea for the course title: '' labels: '' -assignees: cansavvy +assignees: --- -**Describe the your scope of your content idea** -What will this cover and how does it relate to the current course material? +## Describe the your scope of your content idea + -**Describe the learning objectives for your content idea** -What will users learn from this new content? +## Describe the learning objectives for your content idea + -**Additional context or resources** -Add any other context or related resources we should know about? +## Additional context or resources + diff --git a/.github/ISSUE_TEMPLATE/course-problem-report.md b/.github/ISSUE_TEMPLATE/course-problem-report.md index 7d5b83f..26f6f36 100644 --- a/.github/ISSUE_TEMPLATE/course-problem-report.md +++ b/.github/ISSUE_TEMPLATE/course-problem-report.md @@ -1,27 +1,28 @@ --- name: Course Problem Report about: Create a report to help improve the course -title: problem +title: [Problem] labels: bug -assignees: cansavvy +assignees: --- -**Describe what is not working with the course** -A clear and concise description of what the bug is. +## Describe what is not working with the course + -**To Reproduce** -Steps to reproduce the behavior: +## Steps to Reproduce + -**Expected behavior** -A clear and concise description of what you expected to happen. +## Expected behavior + -**Screenshots** -If applicable, add screenshots to help explain your problem. +## Screenshots + -**Additional context** -Add any other context about the problem here. +## Additional context + diff --git a/.github/ISSUE_TEMPLATE/url-error.md b/.github/ISSUE_TEMPLATE/url-error.md new file mode 100644 index 0000000..fe13196 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/url-error.md @@ -0,0 +1,8 @@ +--- +title: Broken URLs found in the course! +labels: url-error +--- +URL's in this course were just checked and some broken URLs were found. + +**Number of errors:** {{ env.ERROR_NUM }} +**File where errors are:** [url checks file here]({{ env.FILE_URL }}) diff --git a/.github/workflows/check-url.yml b/.github/workflows/check-url.yml new file mode 100644 index 0000000..a437049 --- /dev/null +++ b/.github/workflows/check-url.yml @@ -0,0 +1,107 @@ +name: Periodic URL Check + +on: + workflow_dispatch: + schedule: + - cron: '0 0 1 * *' + +jobs: + set-up: + name: Load user automation choices + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + # Use the yaml-env-action action. + - name: Load environment from YAML + uses: doughepi/yaml-env-action@v1.0.0 + with: + files: config_automation.yml # Pass a space-separated list of configuration files. Rightmost files take precedence. + outputs: + toggle_url_check_periodically: "${{ env.URL_CHECK_PERIODICALLY }}" + + url-check: + name: Check URLs + needs: set-up + if: ${{needs.set-up.outputs.toggle_url_check_periodically == 'yes'}} + runs-on: ubuntu-latest + container: + image: jhudsl/base_ottr:main + + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + # Delete the branch if this has been run before + - name: Delete branch locally and remotely + run: git push origin --delete preview-spell-error || echo "No branch to delete" + + # Make the branch fresh + - name: Make the branch fresh + 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' + + echo branch doesnt exist + git checkout -b preview-spell-error || echo branch exists + git push --set-upstream origin preview-spell-error || echo echo branch exists remotely + shell: bash + + - name: Run the check + uses: jhudsl/ottr-reports@main + id: check_results + continue-on-error: true + with: + check_type: urls + error_min: 1 + + - name: Declare file path and time + id: check-report + run: | + error_num=$(cat check_reports/url_checks.tsv | wc -l) + error_num="$((error_num-1))" + echo "error_num=$error_num" >> $GITHUB_OUTPUT + echo "error_url=https://github.com/${GITHUB_REPOSITORY}/blob/preview-spell-error/check_reports/url_checks.tsv" >> $GITHUB_OUTPUT + shell: bash + + - name: Stop if failure + if: steps.check_results.outcome == 'failure' + run: exit 1 + + - name: Print out error variables + run: | + echo ${{ steps.check-report.outputs.error_url }} + echo ${{ steps.check-report.outputs.error_num }} + + - name: Find issues + id: find-issue + env: + GH_PAT: ${{ secrets.GH_PAT }} + run: | + echo "$GITHUB_REPOSITORY" + curl -o find_issue.R https://raw.githubusercontent.com/jhudsl/ottr-reports/main/scripts/find_issue.R + issue_exists=$(Rscript --vanilla find_issue.R --repo $GITHUB_REPOSITORY --git_pat $GH_PAT) + echo URL issue exists: $issue_exists + echo "issue_existence=$issue_exists" >> $GITHUB_OUTPUT + + - name: If too many URL errors, then make an issue + if: ${{ steps.check-report.outputs.error_num >= 1 && steps.find-issue.outputs.issue_existence == 0}} + uses: JasonEtco/create-an-issue@v2 + with: + filename: .github/ISSUE_TEMPLATE/url-error.md + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + FILE_URL: ${{ steps.check-report.outputs.error_url }} + ERROR_NUM: ${{ steps.check-report.outputs.error_num }} + + - name: If no URL errors than delete the branch we made + if: ${{ steps.check-report.outputs.error_num < 1 }} + run: | + git config --system --add safe.directory "$GITHUB_WORKSPACE" + git push origin --delete preview-spell-error || echo "No branch to delete" diff --git a/.github/workflows/delete-preview.yml b/.github/workflows/delete-preview.yml index 419d2f4..faa83cc 100644 --- a/.github/workflows/delete-preview.yml +++ b/.github/workflows/delete-preview.yml @@ -7,17 +7,21 @@ on: types: [closed] jobs: - build-all: + delete-preview: runs-on: ubuntu-latest steps: + # This is because if a PR is closed before a render finishes it won't find it. - name: Sleep for 5 minutes run: sleep 300s shell: bash - # Delete the branch! - - name: Delete branch - uses: dawidd6/action-delete-branch@v3 + # Check out current repository + - name: checkout + uses: actions/checkout@v4 with: - github_token: ${{ secrets.GH_PAT }} - branches: preview-${{ github.event.pull_request.number }} + fetch-depth: 0 + + # Delete the branch! + - name: Delete branch locally and remotely + run: git push origin --delete preview-${{ github.event.pull_request.number }} || echo "No branch to delete" diff --git a/.github/workflows/docker-build-test.yml b/.github/workflows/docker-build-test.yml deleted file mode 100644 index 84fc0a1..0000000 --- a/.github/workflows/docker-build-test.yml +++ /dev/null @@ -1,97 +0,0 @@ -# This code was originally written by Josh Shapiro -# for the Childhood Cancer Data Lab, an initiative of Alexs Lemonade Stand Foundation. -# https://github.com/AlexsLemonade/refinebio-examples/blob/33cdeff66d57f9fe8ee4fcb5156aea4ac2dce07f/.github/workflows/style-and-sp-check.yml#L1 - -# Adapted for this jhudsl repository by Candace Savonen Apr 2021 - -name: Test build of Dockerfile - -# Controls when the action will run. Triggers the workflow for a pull request for -# master -on: - release: - types: - - created - pull_request: - branches: - - 'main' - paths: [ docker/Dockerfile, docker/github_package_list.tsv ] - workflow_dispatch: - inputs: - dockerhubpush: - description: 'Push to Dockerhub?' - required: true - default: 'false' - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "build" - build: - # The type of runner that the job will run on - runs-on: ubuntu-latest - - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v2 - - - name: Don't re-test if this is a sync branch - if: ${{ github.head_ref == 'repo-sync/DaSL_Course_Template_Bookdown/default' }} - run: | - echo This was tested on DaSL_Course_Template_Bookdown no need to re-run - exit 1 - - # Set up Docker build - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v1 - - # Setup layer cache - - name: Cache Docker layers - uses: actions/cache@v2 - with: - path: /tmp/.buildx-cache - key: ${{ runner.os }}-buildx-${{ github.sha }} - restore-keys: | - ${{ runner.os }}-buildx- - - # Set up Docker build - - name: Set up Docker Build - uses: docker/setup-buildx-action@v1 - - - name: Get token - run: echo ${{ secrets.GH_PAT }} > docker/git_token.txt - - # Build docker image - - name: Build Docker image - uses: docker/build-push-action@v2 - with: - push: false - load: true - context: docker - file: docker/Dockerfile - tags: jhudsl/course_template - - # Login to Dockerhub - - name: Login to DockerHub - if: ${{ github.event.inputs.dockerhubpush != 'false' }} - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - # Push the Docker image if set to true from a manual trigger - - name: Push Docker image if manual trigger set to true - if: ${{ github.event.inputs.dockerhubpush != 'false' }} - run: docker push jhudsl/course_template - - - name: Get the version - id: get_version - run: | - echo ::set-output name=version::$(echo $GITHUB_REF | cut -d / -f 3) - - # Push the Docker image if it is a release - - name: Push Docker image if release - if: ${{ github.event_name == 'release' }} - run: | - docker tag jhudsl/course_template jhudsl/course_template:${{ steps.get_version.outputs.version }} - docker push jhudsl/course_template:1.0 diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml new file mode 100644 index 0000000..5cd835e --- /dev/null +++ b/.github/workflows/pull_request.yml @@ -0,0 +1,238 @@ +# Candace Savonen 2021 +# Updated May 2024 + +name: Pull Request + +on: + pull_request: + branches: [ main, staging ] + +jobs: + + yaml-check: + name: Load user automation choices + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + token: ${{ secrets.GH_PAT }} + + # Use the yaml-env-action action. + - name: Load environment from YAML + uses: doughepi/yaml-env-action@v1.0.0 + with: + files: config_automation.yml # Pass a space-separated list of configuration files. Rightmost files take precedence. + + # Delete the branch if this has been run before + - name: Delete branch locally and remotely + run: git push origin --delete preview-${{ github.event.pull_request.number }} || echo "No branch to delete" + + # Make the branch fresh + - name: Make the branch fresh + 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' + + branch_name='preview-${{ github.event.pull_request.number }}' + echo branch doesnt exist + git checkout -b $branch_name || echo branch exists + git push --set-upstream origin $branch_name || echo branch exists remotely + shell: bash + + + outputs: + toggle_website: "${{ env.RENDER_WEBSITE }}" + toggle_spell_check: "${{ env.SPELL_CHECK }}" + toggle_style_code: "${{ env.STYLE_CODE }}" + toggle_url_check: "${{ env.URL_CHECKER }}" + toggle_quiz_check: "${{ env.CHECK_QUIZZES }}" + toggle_render_preview: "${{ env.RENDER_PREVIEW }}" + rendering_docker_image: "${{ env.RENDERING_DOCKER_IMAGE }}" + +########################## Make the error reports ############################## + spell-check: + name: Check spelling + needs: yaml-check + if: ${{needs.yaml-check.outputs.toggle_spell_check == 'yes'}} + uses: jhudsl/ottr-reports/.github/workflows/report-maker.yml@main + with: + check_type: spelling + error_min: 3 + gh_pat: secrets.GH_PAT + branch_name: ${GITHUB_HEAD_REF} + + url-check: + name: Check URLs + needs: yaml-check + if: ${{needs.yaml-check.outputs.toggle_url_check == 'yes'}} + uses: jhudsl/ottr-reports/.github/workflows/report-maker.yml@main + with: + check_type: urls + error_min: 0 + gh_pat: secrets.GH_PAT + branch_name: ${GITHUB_HEAD_REF} + + quiz-check: + name: Check quiz formatting + if: ${{needs.yaml-check.outputs.toggle_quiz_check == 'yes'}} + needs: yaml-check + uses: jhudsl/ottr-reports/.github/workflows/report-maker.yml@main + with: + check_type: quiz_format + error_min: 0 + gh_pat: secrets.GH_PAT + branch_name: ${GITHUB_HEAD_REF} + +############################# Style the code ################################### + style-code: + name: Style code + needs: yaml-check + runs-on: ubuntu-latest + if: ${{needs.yaml-check.outputs.toggle_style_code == 'yes'}} + container: + image: jhudsl/base_ottr:main + + steps: + - name: Checkout files + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Run styler + run: Rscript -e "styler::style_file(list.files(pattern = '(R|q)md$', recursive = FALSE, full.names = TRUE));warnings()" + + - name: Commit styled files + run: | + git config --system --add safe.directory "$GITHUB_WORKSPACE" + git add \*md + git commit -m 'Style *mds' || echo "No changes to commit" + git push origin || echo "No changes to commit" + +############################# Render Preview ################################### + + render-preview: + name: Render preview + needs: yaml-check + runs-on: ubuntu-latest + container: + image: ${{needs.yaml-check.outputs.rendering_docker_image}} + if: ${{needs.yaml-check.outputs.toggle_render_preview == 'yes'}} + + steps: + - name: Checkout files + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # Set up git checkout + - name: Set up git checkout + 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' + + branch_name='preview-${{ github.event.pull_request.number }}' + git fetch --all + git checkout $branch_name + git merge -s recursive --strategy-option=theirs origin/${{ github.head_ref }} --allow-unrelated-histories + shell: bash + + # Run bookdown rendering + - name: Run bookdown render + id: bookdown + if: ${{needs.yaml-check.outputs.toggle_website == 'rmd' }} + run: Rscript -e "bookdown::render_book('index.Rmd', output_format = 'all')" + + # Run quarto rendering + - name: Render quarto version + id: quarto + if: ${{needs.yaml-check.outputs.toggle_website == 'quarto' }} + run: Rscript -e "quarto::quarto_render('.')" + + # This checks on the steps before it and makes sure that they completed. + # If the renders didn't complete we don't want to commit the file changes + - name: Check on Rmd render steps + if: ${{needs.yaml-check.outputs.toggle_website == 'rmd' }} + run: | + echo Bookdown status ${{steps.bookdown.outcome}} + if [${{steps.bookdown.outcome}} != 'success']; then + exit 1 + fi + + - name: Check on quarto render steps + if: ${{needs.yaml-check.outputs.toggle_website == 'quarto' }} + run: | + echo Quarto status ${{steps.quarto.outcome}} + if [${{steps.quarto.outcome}} != 'success']; then + exit 1 + fi + + - name: Website preview for download + run: zip website-preview.zip docs/* -r + + # Commit the rendered bookdown files + - name: Commit rendered bookdown files to preview branch + id: commit + run: | + branch_name='preview-${{ github.event.pull_request.number }}' + git diff origin/main -- docs >/dev/null && changes=true || changes=false + echo "changes=$changes" >> $GITHUB_OUTPUT + git add . --force + git commit -m 'Render preview' || echo "No changes to commit" + git pull --rebase --set-upstream origin $branch_name --allow-unrelated-histories --strategy-option=ours + git push --force || echo "No changes to commit" + shell: bash + + - name: Find Comment + uses: peter-evans/find-comment@v2 + id: fc + with: + issue-number: ${{ github.event.pull_request.number }} + comment-author: 'github-actions[bot]' + body-includes: latest commit + + - name: Build components of the comment + id: build-components + run: | + course_name=$(head -n 1 _bookdown.yml | cut -d'"' -f 2| tr " " "-") + bookdown_link=$(echo "https://htmlpreview.github.io/?https://raw.githubusercontent.com/$GITHUB_REPOSITORY/preview-${{ github.event.pull_request.number }}/docs/index.html") + docx_link=$(echo "https://github.com/$GITHUB_REPOSITORY/raw/preview-${{ github.event.pull_request.number }}/docs/$course_name.docx") + zip_link=$(echo "https://github.com/$GITHUB_REPOSITORY/raw/preview-${{ github.event.pull_request.number }}/website-preview.zip") + echo "zip_link=$zip_link" >> $GITHUB_OUTPUT + echo "bookdown_link=$bookdown_link" >> $GITHUB_OUTPUT + echo "docx_link=$docx_link" >> $GITHUB_OUTPUT + echo "time=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT + echo "commit_id=$GITHUB_SHA" >> $GITHUB_OUTPUT + echo ${{steps.commit.outputs.changes}} + + - name: Create or update comment + if: steps.commit.outputs.changes == 'true' + uses: peter-evans/create-or-update-comment@v2 + with: + comment-id: ${{ steps.fc.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + body: | + Re-rendered previews from the latest commit: + - :eyes: Quick [preview of course website here](${{ steps.build-components.outputs.bookdown_link }}) \* + - :microscope: Comprehensive [download of the course website here](${{ steps.build-components.outputs.zip_link }}) + - Download the [.docx file](${{ steps.build-components.outputs.docx_link }}) + + \* note not all html features will be properly displayed in the "quick preview" but it will give you a rough idea. + + _Updated at ${{ steps.build-components.outputs.time }} with changes from the latest commit ${{ steps.build-components.outputs.commit_id }}_ + edit-mode: replace + + - name: Comment if no changes + if: steps.commit.outputs.changes == 'false' + uses: peter-evans/create-or-update-comment@v2 + with: + comment-id: ${{ steps.fc.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + body: | + The latest commit did not produce rendering changes. + + _Updated at ${{ steps.build-components.outputs.time }} with changes from ${{ steps.build-components.outputs.commit_id }}_ + edit-mode: replace diff --git a/.github/workflows/render-all.yml b/.github/workflows/render-all.yml new file mode 100644 index 0000000..b2e39b2 --- /dev/null +++ b/.github/workflows/render-all.yml @@ -0,0 +1,279 @@ +# Candace Savonen 2021 +# Updated May 2024 + +name: Render all output courses + +on: + workflow_dispatch: + push: + branches: [ main, staging ] + paths: + - '**md$' + - assets/* + - quizzes/* + +jobs: + + yaml-check: + name: Load user automation choices + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + # Use the yaml-env-action action. + - name: Load environment from YAML + uses: doughepi/yaml-env-action@v1.0.0 + with: + 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 }}" + + render-course: + name: Render course preview + needs: yaml-check + runs-on: ubuntu-latest + container: + image: ${{needs.yaml-check.outputs.rendering_docker_image}} + + 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' + + # We want a fresh run of the renders each time + - name: Delete old docs/* + run: | + 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 Rmd rendering + - name: Run bookdown render + id: bookdown + if: ${{needs.yaml-check.outputs.toggle_website == 'rmd' }} + run: | + rm -rf docs/* + Rscript -e "bookdown::render_book('index.Rmd', output_format = 'all'); + file.copy(from = 'assets', to = 'docs/assets', overwrite = TRUE)" + + - name: Render quarto version + id: quarto + if: ${{needs.yaml-check.outputs.toggle_website == 'quarto' }} + run: Rscript -e "quarto::quarto_render('.')" + + # This checks on the steps before it and makes sure that they completed. + # If the renders didn't complete we don't want to commit the file changes + - name: Check on Rmd render steps + if: ${{needs.yaml-check.outputs.toggle_website == 'rmd' }} + run: | + echo Bookdown status ${{steps.bookdown.outcome}} + if [${{steps.bookdown.outcome}} != 'success']; then + exit 1 + fi + + - name: Check on quarto render steps + if: ${{needs.yaml-check.outputs.toggle_website == 'quarto' }} + run: | + echo Quarto status ${{steps.quarto.outcome}} + if [${{steps.quarto.outcome}} != 'success']; then + exit 1 + fi + + # Commit the rendered course files + - name: Commit rendered course files + env: + GH_PAT: ${{ secrets.GH_PAT }} + run: | + git add --force docs/* + git commit -m 'Render course' || echo "No changes to commit" + git status docs/* + git push -u origin main || echo "No changes to push" + + render-tocless: + name: Render TOC-less version for Leanpub or Coursera + needs: [yaml-check, render-course] + runs-on: ubuntu-latest + container: + image: ${{needs.yaml-check.outputs.rendering_docker_image}} + if: ${{needs.yaml-check.outputs.toggle_coursera == 'yes' || needs.yaml-check.outputs.toggle_leanpub == 'yes'}} + + 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 -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/ottrpal + if: ${{needs.yaml-check.outputs.toggle_leanpub == 'yes'}} + + 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 + curl -o make_screenshots.R https://raw.githubusercontent.com/jhudsl/ottr-reports/main/scripts/make_screenshots.R + chapt_urls=$(Rscript --vanilla make_screenshots.R \ + --git_pat ${{ secrets.GH_PAT }} \ + --repo $GITHUB_REPOSITORY \ + --output_dir resources/chapt_screen_images) + + # 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 + if: ${{ needs.yaml-check.outputs.toggle_quiz_check == 'no'}} + run: | + echo needs.yaml-check.outputs.toggle_make_book_txt == 'yes' + echo needs.yaml-check.outputs.toggle_make_book_txt + Rscript -e "ottrpal::bookdown_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 == 'yes'}}'), \ + quiz_dir = NULL)" + + - name: Run ottrpal::bookdown_to_embed_leanpub + if: ${{ needs.yaml-check.outputs.toggle_quiz_check == 'yes'}} + run: | + Rscript -e "ottrpal::bookdown_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 == 'yes'}}'))" + + # Commit the rendered Leanpub files + - name: Commit rendered Leanpub files + env: + GH_PAT: ${{ secrets.GH_PAT }} + run: | + mkdir -p manuscript + git add --force manuscript/* + git add --force resources/* + git add --force docs/* + 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 == 'yes'}} + + 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 == 'yes' && needs.yaml-check.outputs.toggle_quiz_check == 'yes' + 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 manuscript/* + git add --force resources/* + git add --force docs/* + git commit -m 'Render Coursera quizzes' || echo "No changes to commit" + git status + git push -u origin main || echo "No changes to push" diff --git a/.github/workflows/render-bookdown.yml b/.github/workflows/render-bookdown.yml deleted file mode 100644 index 61dd531..0000000 --- a/.github/workflows/render-bookdown.yml +++ /dev/null @@ -1,97 +0,0 @@ - -# This code was originally written by Josh Shapiro and Candace Savonen -# for the Childhood Cancer Data Lab, an initiative of Alexs Lemonade Stand Foundation. -# https://github.com/AlexsLemonade/refinebio-examples/blob/33cdeff66d57f9fe8ee4fcb5156aea4ac2dce07f/.github/workflows/style-and-sp-check.yml#L1 - -# Adapted for this jhudsl repository by Candace Savonen Apr 2021 - -name: Render Bookdown and Coursera - -# Controls when the action will run. Triggers the workflow on push -# events only for the master branch -on: - workflow_dispatch: - push: - branches: [ main ] - paths: - - '**.Rmd' - - docker/Dockerfile - - assets/* -jobs: - # This workflow contains a single job called "build-all" - build-all: - # The type of runner that the job will run on - runs-on: ubuntu-latest - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - name: checkout - uses: actions/checkout@v2 - with: - # get the full repo - fetch-depth: 0 - # use github PAT - token: ${{ secrets.GH_PAT }} - -###### If you will be making changes to the Docker image to make specific to the -###### course, then highlight this chunk and uncomment it. ##################### -###### Recommend using short cut -- Command and / works for some editors.####### -###### START OF DOCKER UPDATE CHUNK - # # Login to Dockerhub - # - name: Login to DockerHub - # uses: docker/login-action@v1 - # with: - # username: ${{ secrets.DOCKERHUB_USERNAME }} - # password: ${{ secrets.DOCKERHUB_TOKEN }} - # - # # Set up Docker build - # - name: Set up Docker Build - # uses: docker/setup-buildx-action@v1 - # - # - name: Get Token - # run: echo ${{ secrets.GH_PAT }} > docker/git_token.txt - # - # # Build docker image - # - name: Build Docker image - # uses: docker/build-push-action@v2 - # with: - # push: false - # load: true - # context: docker - # file: docker/Dockerfile - # tags: jhudsl/course_template - # - # # Push the Docker image - # - name: Push Docker image - # run: docker push jhudsl/course_template - -###### END OF DOCKER UPDATE CHUNK ############################################## - - # Run bookdown rendering - - name: Run bookdown render - run: | - docker run \ - --mount type=bind,target=/home/rstudio,source=$PWD \ - jhudsl/course_template \ - Rscript -e "bookdown::render_book('index.Rmd')" - -##### If you do not wish to host your course on Coursera, you can delete this section ##### - # Run Coursera version - - name: Run Coursera version of render - run: | - docker run \ - --mount type=bind,target=/home/rstudio,source=$PWD \ - jhudsl/course_template \ - Rscript -e "leanbuild::render_coursera()" - -##### End of Coursera rendering section ######################################## - - # Commit the rendered bookdown files - - name: Commit rendered bookdown files - run: | - git config --local user.email "actions@github.com" - git config --local user.name "GitHub Actions" - git add -A - git add --force docs/* - git commit -m 'Render bookdown' || echo "No changes to commit" - git push origin main || echo "No changes to push" diff --git a/.github/workflows/render-preview.yml b/.github/workflows/render-preview.yml deleted file mode 100644 index bdd65fb..0000000 --- a/.github/workflows/render-preview.yml +++ /dev/null @@ -1,84 +0,0 @@ -# Candace Savonen Apr 2021 - -name: Render Preview - -# Controls when the action will run. Triggers the workflow on pull request to main branch -on: - pull_request: - branches: [ main ] - -jobs: - # This workflow contains a single job called "build-all" - build-all: - # The type of runner that the job will run on - runs-on: ubuntu-latest - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - name: checkout - uses: actions/checkout@v2 - with: - # get the full repo - fetch-depth: 0 - # use github PAT - token: ${{ secrets.GH_PAT }} - - # Run bookdown rendering - - name: Run bookdown render - run: | - docker run \ - --mount type=bind,target=/home/rstudio,source=$PWD \ - jhudsl/course_template \ - Rscript -e "bookdown::render_book('index.Rmd')" - -##### If you do not wish to host your course on Coursera, you can delete this section ##### - # Run Coursera version - - name: Run Coursera version of render - run: | - docker run \ - --mount type=bind,target=/home/rstudio,source=$PWD \ - jhudsl/course_template \ - Rscript -e "leanbuild::render_coursera()" - -##### End of Coursera rendering section ######################################## - - # Commit the rendered bookdown files - - name: Commit rendered bookdown files to development branch - run: | - git checkout -b "preview-${{ github.event.pull_request.number }}" - git config --local user.email "actions@github.com" - git config --local user.name "GitHub Actions" - git add -A - git commit -m 'Render bookdown preview' || echo "No changes to commit" - git push --force origin "preview-${{ github.event.pull_request.number }}" || echo "No changes to push" - - - name: Find Comment - uses: peter-evans/find-comment@v1 - id: fc - with: - issue-number: ${{ github.event.pull_request.number }} - comment-author: 'github-actions[bot]' - body-includes: Re-rendered - - - name: Build components of the comment - id: build-components - run: | - bookdown_link=$(echo "https://htmlpreview.github.io/?https://raw.githubusercontent.com/$GITHUB_REPOSITORY/preview-${{ github.event.pull_request.number }}/docs/index.html") - coursera_link=$(echo "https://htmlpreview.github.io/?https://raw.githubusercontent.com/$GITHUB_REPOSITORY/preview-${{ github.event.pull_request.number }}/docs/coursera/index.html") - echo ::set-output name=bookdown_link::$bookdown_link - echo ::set-output name=coursera_link::$coursera_link - echo ::set-output name=time::$(date +'%Y-%m-%d') - echo ::set-output name=commit_id::$GITHUB_SHA - - - name: Create or update comment - uses: peter-evans/create-or-update-comment@v1 - with: - comment-id: ${{ steps.fc.outputs.comment-id }} - issue-number: ${{ github.event.pull_request.number }} - body: | - Re-rendered previews from the latest commit: - - See [preview of Bookdown here](${{ steps.build-components.outputs.bookdown_link }}) - - See [preview of Coursera version here](${{ steps.build-components.outputs.coursera_link }}) - - _Updated at ${{ steps.build-components.outputs.time }} with changes from ${{ steps.build-components.outputs.commit_id }}_ - edit-mode: replace diff --git a/.github/workflows/style-and-sp-check.yml b/.github/workflows/style-and-sp-check.yml deleted file mode 100644 index 11ac002..0000000 --- a/.github/workflows/style-and-sp-check.yml +++ /dev/null @@ -1,62 +0,0 @@ - -# This code was originally written by Josh Shapiro and Candace Savonen -# for the Childhood Cancer Data Lab, an initiative of Alexs Lemonade Stand Foundation. -# https://github.com/AlexsLemonade/refinebio-examples/blob/33cdeff66d57f9fe8ee4fcb5156aea4ac2dce07f/.github/workflows/style-and-sp-check.yml#L1 - -# Adapted for this jhudsl repository by Candace Savonen Apr 2021 - -name: Style and spell check R markdowns - -# Controls when the action will run. Triggers the workflow on push or pull request -# events but only for the main branch -on: - workflow_dispatch: - pull_request: - branches: [ main ] - -# A workflow run is made up of one or more jobs that can run sequentially or in parallel -jobs: - # This workflow contains a single job called "style and check" - style-n-check: - runs-on: ubuntu-latest - container: - image: rocker/tidyverse:4.0.2 - - # Steps represent a sequence of tasks that will be executed as part of the job - steps: - - uses: actions/checkout@v2 - # What branch to commit to: the one from the pull request - with: - ref: ${{ github.event.pull_request.head.ref }} - - - name: Install packages - run: Rscript -e "install.packages(c('styler', 'spelling'))" - - - name: Run spell check - id: spell_check_run - run: | - results=$(Rscript "scripts/spell-check.R") - echo "::set-output name=sp_chk_results::$results" - cat spell_check_results.tsv - - - name: Archive spelling errors - uses: actions/upload-artifact@v2 - with: - name: spell-check-results - path: spell_check_results.tsv - - # If there are too many spelling errors, this will stop the workflow - - name: Check spell check results - fail if too many errors - if: ${{ steps.spell_check_run.outputs.sp_chk_results > 3 }} - run: exit 1 - - - name: Run styler - run: Rscript -e "styler::style_file(list.files(pattern = 'Rmd$', recursive = TRUE, full.names = TRUE));warnings()" - - - name: Commit - run: | - git config --local user.email "actions@github.com" - git config --local user.name "GitHub Actions" - git add \*.Rmd - git commit -m 'Style Rmds' || echo "No changes to commit" - git push origin || echo "No changes to commit" diff --git a/.github/workflows/transfer-rendered-files.yml b/.github/workflows/transfer-rendered-files.yml index 6557a1c..dae4141 100644 --- a/.github/workflows/transfer-rendered-files.yml +++ b/.github/workflows/transfer-rendered-files.yml @@ -4,52 +4,72 @@ # Adapted for this jhudsl repository by Candace Savonen Apr 2021 -name: Bookdown to Leanpub repo copy over -# Copy rendered notebooks to Leanpub repo +name: Copy over from main template to _Quizzes repo -# This workflow will run when there are changes to docs/ files in THIS repo on: workflow_dispatch: - # Only run after the render finishes running workflow_run: - workflows: [ "Build, Render, and Push" ] - branches: [ main ] + workflows: [ "Render all output courses" ] + branches: [ main, staging ] types: - completed jobs: - file-bookdown-pr: - # The type of runner that the job will run on + + yaml-check: + name: Load user automation choices runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + # Use the yaml-env-action action. + - name: Load environment from YAML + uses: doughepi/yaml-env-action@v1.0.0 + with: + files: config_automation.yml # Pass a space-separated list of configuration files. Rightmost files take precedence. + outputs: + toggle_coursera: "${{ env.RENDER_COURSERA }}" + toggle_leanpub: "${{ env.RENDER_LEANPUB }}" + + + file-quizzes-pr: + name: File _Quizzes Transfer PR + runs-on: ubuntu-latest + container: + image: jhudsl/ottrpal:main + needs: [yaml-check] + if: ${{needs.yaml-check.outputs.toggle_coursera == 'yes' || needs.yaml-check.outputs.toggle_leanpub == 'yes'}} - # Get repository name by dropping Bookdown if it exists but always append _Leanpub steps: + - name: Checkout from Bookdown Repo + uses: actions/checkout@v4 + with: + path: bookdown + token: ${{ secrets.GH_PAT }} + - name: Run git repo check id: git_repo_check env: GH_PAT: ${{ secrets.GH_PAT }} run: | - sudo apt-get install subversion - sudo Rscript -e "install.packages('optparse')" - - # What's the LEANPUB repository's name? - LEANPUB_REPO=$(echo ${GITHUB_REPOSITORY} | sed "s/_Bookdown/ /g" | awk '{print $1"_Leanpub"}') - echo $LEANPUB_REPO - - # Get repo check script - svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/scripts/git_repo_check.R git_repo_check.R + # What's the Quizzes repository's name? + QUIZ_REPO=$(echo ${GITHUB_REPOSITORY} | sed "s/_Bookdown/ /g" | sed "s/_Template/ /g" | awk '{print $1"_Quizzes"}') + echo $QUIZ_REPO # Run repo check script + curl -o git_repo_check.R https://raw.githubusercontent.com/jhudsl/ottr-reports/main/scripts/git_repo_check.R results=$(Rscript --vanilla git_repo_check.R --repo "$GITHUB_REPOSITORY" --git_pat "$GH_PAT") - echo $LEANPUB_REPO exists: $results + echo $QUIZ_REPO exists: $results - echo "::set-output name=git_results::$results" - echo "::set-output name=leanpub_repo::$LEANPUB_REPO" + echo "git_results=$results" >> $GITHUB_OUTPUT + echo "leanpub_repo=$QUIZ_REPO" >> $GITHUB_OUTPUT - name: Checkout code from Leanpub repo if: ${{ steps.git_repo_check.outputs.git_results == 'TRUE' }} - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: + path: quizzes repository: ${{ steps.git_repo_check.outputs.leanpub_repo }} token: ${{ secrets.GH_PAT }} @@ -59,74 +79,32 @@ jobs: env: GH_PAT: ${{ secrets.GH_PAT }} run: | - sudo apt install r-base - sudo Rscript -e "install.packages('yaml')" - - if [ -d "docs/" ] - then - # remove old docs/ files and folder - rm -r docs/* - fi - # Copy over docs folder - svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/docs - - if [ -d "docs/coursera" ] - then - rm -r docs/coursera/* - fi - - # Copy over book.bib file - svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/book.bib - - # Get assets folder - svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/assets - - # Copy over _bookdown.yml - svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/_bookdown.yml - - # Copy over _output.ymls - svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/_output.yml - - # Copy over images folder - svn export --force https://github.com/${GITHUB_REPOSITORY}.git/branches/${GITHUB_REF#refs/heads/}/resources/ resources/ - - # Get list of Rmds needing to copy - Rscript --vanilla scripts/get_rmd_filenames.R - - # the url from this repo where files will be downloaded from - base_url=https://${GH_PAT}@raw.githubusercontent.com/${GITHUB_REPOSITORY}/${GITHUB_REF#refs/heads/} - - # remove old Rmd files - rm $(find . -name '*.Rmd' | grep '.Rmd' ) + # Copy over images folder (from bookdown to quizzes repo) + mkdir -p quizzes/resources/chapt_screen_images + cp bookdown/resources/chapt_screen_images/* quizzes/resources/chapt_screen_images - input="resources/rmd_list.txt" - while IFS= read -r line - do - echo "$line" - curl --fail -s ${base_url}/${line} > ${line} - done < "$input" + # Copy over _bookdown.yml (from bookdown to quizzes repo) + cp bookdown/_bookdown.yml quizzes/_bookdown.yml - - name: Create PR with rendered docs files + - name: Create PR with resources files if: ${{ steps.git_repo_check.outputs.git_results == 'TRUE' }} uses: peter-evans/create-pull-request@v3 id: cpr with: + path: quizzes # Must create the PR in the Quizzes Repo token: ${{ secrets.GH_PAT }} commit-message: Copy files from Bookdown repository signoff: false branch: auto_copy_rendered_files delete-branch: true - title: 'GHA: Automated transfer of leanbuild-needed files from Bookdown repository' + title: 'GHA: Automated transfer of ottrpal-needed files from Bookdown repository' body: | ### Description: This PR was initiated by transfer-rendered.yml in the Bookdown repository. - It copies over the leanbuild-needed files from Bookdown repository: - - Rmds listed in the _bookdoown.yml + It copies over the ottrpal-needed folder (for the `bookdown_to_embed_leanpub(render = FALSE)` function + to run properly. + - resources/chapt_screen_images/* - _bookdown.yml - - docs/* - - book.bib - - resources/* - - _output.yml labels: | automated reviewers: $GITHUB_ACTOR diff --git a/.github/workflows/url-checker.yml b/.github/workflows/url-checker.yml deleted file mode 100644 index 2d03a40..0000000 --- a/.github/workflows/url-checker.yml +++ /dev/null @@ -1,36 +0,0 @@ -# Adapted from https://github.com/marketplace/actions/url-checker by Candace Savonen - -# This github actions tests URLs in the Rmd files, README, and CONTRIBUTING.md -name: Check URLs - -# This will be run upon PRs to main -on: - workflow_dispatch: - pull_request: - branches: [ main ] - -# Here's the main action of checking URLs -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - - name: URLs-checker - uses: urlstechie/urlchecker-action@master - with: - # Delete the cloned repository after running URLchecked (default is false) - cleanup: true - - # A comma-separated list of file types to cover in the URL checks - file_types: .Rmd - - # Choose whether to include file with no URLs in the prints. - print_all: false - - # A comma separated links to exclude during URL checks - exclude_urls: https://jhudatascience.org/{Course_Name}} - - # choose if the force pass or not - force_pass : true diff --git a/assets/box_images/dictionary.png b/assets/box_images/dictionary.png new file mode 100644 index 0000000..75ddac7 Binary files /dev/null and b/assets/box_images/dictionary.png differ diff --git a/assets/box_images/github.png b/assets/box_images/github.png new file mode 100644 index 0000000..a93acd3 Binary files /dev/null and b/assets/box_images/github.png differ diff --git a/assets/box_images/note.png b/assets/box_images/note.png new file mode 100644 index 0000000..72de3ae Binary files /dev/null and b/assets/box_images/note.png differ diff --git a/assets/box_images/thinking_face.png b/assets/box_images/thinking_face.png new file mode 100644 index 0000000..c2c279a Binary files /dev/null and b/assets/box_images/thinking_face.png differ diff --git a/assets/box_images/under_construction.png b/assets/box_images/under_construction.png new file mode 100644 index 0000000..a67bd5c Binary files /dev/null and b/assets/box_images/under_construction.png differ diff --git a/assets/box_images/warning.png b/assets/box_images/warning.png new file mode 100644 index 0000000..405fb61 Binary files /dev/null and b/assets/box_images/warning.png differ diff --git a/config_automation.yml b/config_automation.yml new file mode 100644 index 0000000..460f418 --- /dev/null +++ b/config_automation.yml @@ -0,0 +1,30 @@ + +##### Checks run at pull request ##### +# Check quiz formatting +check-quizzes: no +# Check that urls in the content are not broken +url-checker: yes +# Render preview of content with changes (Rmd's and md's are checked) +render-preview: yes +# Spell check Rmds and quizzes +spell-check: yes +# Style any R code +style-code: yes +# Test build the docker image if any docker-relevant files have been changed +docker-test: no +# Should URLs be tested periodically? +url-check-periodically: yes + +##### Renderings run upon merge to main branch ##### +# Rendering each platform's content +render-website: rmd +render-leanpub: yes +render-coursera: no + +## 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: yes + +# What docker image should be used for rendering? +# The default is jhudsl/base_ottr:main +rendering-docker-image: 'jhudsl/base_ottr:main' diff --git a/resources/exclude_files.txt b/resources/exclude_files.txt new file mode 100644 index 0000000..5525a40 --- /dev/null +++ b/resources/exclude_files.txt @@ -0,0 +1,8 @@ +About.Rmd +docs/* +style-sets/* +manuscript/* +CONTRIBUTING.md +LICENSE.md +code_of_conduct.md +README.md diff --git a/style-sets/data-trail/_output.yml b/style-sets/data-trail/_output.yml new file mode 100644 index 0000000..571771a --- /dev/null +++ b/style-sets/data-trail/_output.yml @@ -0,0 +1,18 @@ +bookdown::gitbook: + css: assets/style_DataTrail.css + includes: + before_body: assets/big-image-DataTrail.html + after_body: assets/footer.html + highlight: tango + config: + toc: + collapse: section + before: | + + after: | +

This content was published with bookdown using

+

The OTTR Template by:

+

The Johns Hopkins Data Science Lab

+ +

Style adapted from: rstudio4edu-book (CC-BY 2.0)

+

Click here to provide feedback

diff --git a/style-sets/data-trail/copy-to-assets/DataTrail.jpg b/style-sets/data-trail/copy-to-assets/DataTrail.jpg new file mode 100644 index 0000000..f1902a3 Binary files /dev/null and b/style-sets/data-trail/copy-to-assets/DataTrail.jpg differ diff --git a/style-sets/data-trail/copy-to-assets/DataTrail_favicon.ico b/style-sets/data-trail/copy-to-assets/DataTrail_favicon.ico new file mode 100755 index 0000000..7c0378e Binary files /dev/null and b/style-sets/data-trail/copy-to-assets/DataTrail_favicon.ico differ diff --git a/style-sets/data-trail/copy-to-assets/DataTrail_logo.jpg b/style-sets/data-trail/copy-to-assets/DataTrail_logo.jpg new file mode 100644 index 0000000..1f075b6 Binary files /dev/null and b/style-sets/data-trail/copy-to-assets/DataTrail_logo.jpg differ diff --git a/style-sets/data-trail/copy-to-assets/big-image-DataTrail.html b/style-sets/data-trail/copy-to-assets/big-image-DataTrail.html new file mode 100644 index 0000000..db08b7e --- /dev/null +++ b/style-sets/data-trail/copy-to-assets/big-image-DataTrail.html @@ -0,0 +1,12 @@ + + + + + + + + + +
+ +
\ No newline at end of file diff --git a/style-sets/data-trail/copy-to-assets/style_DataTrail.css b/style-sets/data-trail/copy-to-assets/style_DataTrail.css new file mode 100644 index 0000000..fb3aa51 --- /dev/null +++ b/style-sets/data-trail/copy-to-assets/style_DataTrail.css @@ -0,0 +1,546 @@ +@import url('https://fonts.googleapis.com/css?family=Abril+Fatface|Karla:400,400i,700,700i|Lora:400,400i,700,700i&display=swap'); + +p.caption { + color: #777; + margin-top: 10px; +} +p code { + white-space: inherit; +} +pre { + word-break: normal; + word-wrap: normal; +} +pre code { + white-space: inherit; +} + +/*---------------Hero Image------------------*/ + +/* next 3 rules are for setting large image at top of each page and pushing down the book content to appear beneath the image */ + + + +.hero-image-container { + position: absolute; + top: 0; + left: 0; + right: 0; + height: 200px; + background-color: #133454; +} + +.hero-image { + width: 100%; + height: 200px; + object-fit: cover; +} + +.page-inner { + padding-top: 210px !important; +} +/* ------------Links------------------ */ + +.book .book-body .page-wrapper .page-inner section.normal a { + color: #1a9bc0; +} + + +/*------------- Body and header text---------------- */ + +.book.font-family-1 { + font-family: 'Karla', arial, sans-serif; +} + +h1, h2, h3, h4 { + font-family: 'Lora', arial, sans-serif; +} + + +.book .book-body .page-wrapper .page-inner section.normal h1, +.book .book-body .page-wrapper .page-inner section.normal h2, +.book .book-body .page-wrapper .page-inner section.normal h3, +.book .book-body .page-wrapper .page-inner section.normal h4, +.book .book-body .page-wrapper .page-inner section.normal h5, +.book .book-body .page-wrapper .page-inner section.normal h6 { + margin-top: 2.275em; + margin-bottom: 1em; +} + +.title { + font-family: 'Lora'; + font-size: 4em !important; + color: #023e4c; + margin-top: 0.275em !important; + margin-bottom: 0.35em !important; +} + +.subtitle { + font-family: 'Lora'; + color: #0b8d96; +} + + +/*----------DROP CAPS--------------*/ + + +/*p:nth-child(2):first-letter { /* /* DROP-CAP FOR FIRST P BENEATH EACH H1 OR H2*/ /* + color: #3fb5bd; + float: left; + font-family: 'Abril Fatface', serif; + font-size: 7em; + line-height: 65px; + padding-top: 4px; + padding-right: 8px; + padding-left: 3px; + margin-bottom: 9px; +} +*/ + +.section.level1 > p:first-of-type:first-letter { /*drop cap for first p beneath level 1 headers only within class .section*/ + color: #023e4c; + float: left; + font-family: 'Abril Fatface', serif; + font-size: 7em; + line-height: 65px; + padding-top: 4px; + padding-right: 8px; + padding-left: 3px; + margin-bottom: 9px; +} + +/* add drop cap to first paragraph that follows the first 2nd level header*/ +/* +.section.level2:first-of-type > p:first-of-type:first-letter { + color: #3fb5bd; + float: left; + font-family: 'Abril Fatface', serif; + font-size: 7em; + line-height: 65px; + padding-top: 4px; + padding-right: 8px; + padding-left: 3px; + margin-bottom: 9px; +} +*/ + + + +/*------------ TOC --------------*/ + + +.book .book-summary { + background: white; + border-right: none; +} + +/*---color of links in TOC----*/ + +.book .book-summary a { +color: #023e4c +} + +.summary{ + font-family: 'Karla', sans-serif; +} + +/* all TOC list items, basically */ +.book .book-summary ul.summary li a, +.book .book-summary ul.summary li span { + padding-top: 8px; + padding-bottom: 8px; + padding-left: 15px; + padding-right: 15px; + color: #023e4c; +} + +.summary a:hover { + color: #1a9bc0 !important; +} + +.book .book-summary ul.summary li.active>a { /*active TOC links*/ + color: #1a9bc0 !important; + border-left: solid 4px; + border-color: #12af66; + padding-left: 11px !important; +} + +.trapezoid { + width: 130px; + text-align: center; + height: 15; + position: relative; + border-right: 50px solid #023e4c; + border-bottom: 50px solid #e6e762; + border-left: 50px solid #023e4c; + box-sizing: content-box; +} +.trapezoid span { + position: absolute; + top: 5px; + bottom: 5px; + left: 5%; + color: #e6e762; +} + +li.appendix span, li.part span { /* for TOC part names */ + margin-top: 1em; + color: #000000; + opacity: .9 !important; + text-transform: uppercase; +} + +.part + li[data-level=""] { /* grabs first .chapter immediately after .part...but only those ch without numbers */ + text-transform: uppercase; +} + + +/* The next two rules make the horizontal line go straight across in top navbar */ + +.summary > li:first-child { + height: 50px; + padding-top: 10px; + border-bottom: 1px solid rgba(0,0,0,.07); +} + +.book .book-summary ul.summary li.divider { + height: 0px; +} + + +/*--- LOGO ---*/ + +.toc-logo { + width: 200px !important; + object-fit: contain; + margin: 0 auto; +} + +.toc-logo img { + max-width: 100%; + margin-bottom: 10px; +} + +.summary > li:first-child { + height: auto !important; +} + +/* --------------Two columns--------------- */ + +.col2 { + columns: 2 200px; /* number of columns and width in pixels*/ + -webkit-columns: 2 200px; /* chrome, safari */ + -moz-columns: 2 200px; /* firefox */ +} + + +.side-by-side { + display: flex; +} + +.side1 { + width: 40%; +} + +.side2 { + width: 58%; + margin-left: 1rem; +} + +/* --------------Even split- two columns--------------- */ + +.split { + display: flex; +} + +.split1 { + width: 50%; + padding-right: 20px; +} + +.split2 { + width: 50%; +} + + +/* Sidebar formating --------------------------------------------*/ +/* from r-pkgs.org*/ + + +div.notice{ + border: 4px #023e4c; + border-style: solid; + padding: 1em; + margin: 1em 0; + padding-left: 100px; + background-size: 70px; + background-repeat: no-repeat; + background-position: 15px center; + min-height: 120px; + background-color: #e8ebee; +} + +div.notice{ + background-image: url("../assets/box_images/note.png"); +} + +div.warning{ + border: 4px #e0471c; + border-style: solid; + padding: 1em; + margin: 1em 0; + padding-left: 100px; + background-size: 70px; + background-repeat: no-repeat; + background-position: 15px center; + min-height: 120px; + background-color: #e8ebee; +} + +div.warning{ + background-image: url("../assets/box_images/warning.png"); +} + + + +div.github{ + border: 4px #000000; + border-style: solid; + padding: 1em; + margin: 1em 0; + padding-left: 100px; + background-size: 70px; + background-repeat: no-repeat; + background-position: 15px center; + min-height: 120px; + background-color: #e8ebee; +} + +div.github{ + background-image: url("../assets/box_images/github.png"); +} + +div.dictionary{ + border: 4px #023e4c; + border-style: solid; + padding: 1em; + margin: 1em 0; + padding-left: 100px; + background-size: 70px; + background-repeat: no-repeat; + background-position: 15px center; + min-height: 120px; + background-color: #e8ebee; +} + +div.dictionary{ + background-image: url("../assets/box_images/dictionary.png"); +} + +div.reflection{ + border: 4px #000000; + border-style: solid; + padding: 1em; + margin: 1em 0; + padding-left: 100px; + background-size: 90px; + background-repeat: no-repeat; + background-position: 15px center; + min-height: 120px; + background-color: #e8ebee; +} + +div.reflection{ + background-image: url("../assets/box_images/thinking_face.png"); +} + +div.rstudio-tip, div.tip, div.gotcha, div.design, div.hat{ + border: 4px #aed6d963; + border-style: dashed solid; + padding: 1em; + margin: 1em 0; + padding-left: 100px; + background-size: 70px; + background-repeat: no-repeat; + background-position: 15px center; + min-height: 120px; + color: #2ea8b3; + background-color: #fcfcfc; +} + + +div.rstudio-tip { + background-image: url("../images/divs/rstudio.png"); +} + +div.tip { + background-image: url("../images/divs/lightbulb.png"); +} + +div.gotcha { + background-image: url("../images/divs/gotcha_2.png"); +} + +div.design { + background-image: url("../images/divs/design.png"); +} + +div.hat { + background-image: url("../images/divs/hat.png"); +} + +/* for fancy bookdown cookbook */ + +div.puzzle, div.fyi, div.demo, div.note { + padding: 1em; + margin: 1em 0; + padding-left: 100px; + background-size: 70px; + background-repeat: no-repeat; + background-position: 15px center; + min-height: 120px; + color: #1f5386; + background-color: #bed3ec; + border: solid 5px #dfedff; +} + +div.puzzle { + background-image: url("../images/illos/Your-turn.png"); +} + +div.fyi { + background-image: url("../images/illos/fyi.png"); +} + +div.demo { + background-image: url("../images/illos/Live-code.png"); +} + +div.note { + background-image: url("../images/illos/lightbulb2.png"); +} + + +/* .book .book-body .page-wrapper .page-inner section.normal is needed + to override the styles produced by gitbook, which are ridiculously + overspecified. Goal of the selectors is to ensure internal "margins" + controlled only by padding of container */ + +.book .book-body .page-wrapper .page-inner section.normal div.rstudio-tip > :first-child, +.book .book-body .page-wrapper .page-inner section.normal div.tip > :first-child { + margin-top: 0; +} + +.book .book-body .page-wrapper .page-inner section.normal div.rstudio-tip > :last-child, +.book .book-body .page-wrapper .page-inner section.normal div.tip > :last-child { + margin-bottom: 0; +} + +iframe { + -moz-transform-origin: top left; + -webkit-transform-origin: top left; + -o-transform-origin: top left; + -ms-transform-origin: top left; + transform-origin: top left; +} + +.iframe-container { + overflow: auto; + -webkit-overflow-scrolling: touch; + border: #ddd 2px solid; + box-shadow: #888 0px 5px 8px; + margin-bottom: 1em; +} + +.iframe-container > iframe { + border: none; +} + + +/* -------Clipboard copy button --------- */ +.copy { + width: inherit; + background-color: #e2e2e2 ; + border: none; + border-radius: 2px; + float: right; + font-size: 60%; + padding: 4px 4px 4px 4px; +} + +/* for new copy button */ + +.hasCopyButton { + position: relative; +} + +.btn-copy-ex { + position: absolute; + right: 0; + top: 0; + visibility: hidden; +} + +.hasCopyButton:hover button.btn-copy-ex { + visibility: visible; +} + + + +/* -----------Section anchors -------------*/ + +.book .book-body .page-wrapper .page-inner section.normal { + overflow: visible !important; /*so anchor link doesn't get cut off */ +} + +a.anchor { + margin-left: -30px; + padding-right: 3px; + display:inline-block; + width: 30px; + height: 30px; + /*visibility: hidden;*/ + background-image: url(https://image.flaticon.com/icons/svg/34/34735.svg) !important; + background-repeat: no-repeat !important; + background-size: 20px 20px !important; + background-position: center bottom !important; + opacity: 0; +} + + +.hasAnchor:hover a.anchor, +a.anchor:hover { + /*visibility: visible;*/ + opacity: 0.6; +} + +/* disable anchors for headers with "no-anchor" class */ +.no-anchor .hasAnchor:hover a.anchor, +.no-anchor a.anchor:hover { + opacity: 0 !important; +} + +@media (max-width: 1144px) { /* don't show anchor link on small screens */ + .hasAnchor:hover a.anchor { + visibility: hidden; + } +} + + +/*____Code Chunks____*/ + +.sourceCode { + margin-bottom: 0.85em; /* adds same amount of margin as a

would */ +} + +.sourceCode pre { + margin: 0 !important; /* makes space above and below symmetrical*/ +} + +/* Footer */ + +.footer { + font-family: "Lora", serif; + font-size: .85em; + color: #193a5c; +} \ No newline at end of file diff --git a/style-sets/data-trail/index.Rmd b/style-sets/data-trail/index.Rmd new file mode 100644 index 0000000..34e0f3a --- /dev/null +++ b/style-sets/data-trail/index.Rmd @@ -0,0 +1,38 @@ +--- +title: " Course Name " +date: "`r format(Sys.time(), '%B, %Y')`" +site: bookdown::bookdown_site +documentclass: book +bibliography: [book.bib, packages.bib] +biblio-style: apalike +link-citations: yes +description: "Description about Course/Book." +favicon: assets/DataTrail_favicon.ico +--- + + +```{r include=FALSE} +# automatically create a bib database for R packages +knitr::write_bib(c( + .packages(), "bookdown", "knitr", "rmarkdown" +), "packages.bib") +``` + +# About this Course {-} + +This course is part of a series of courses for [DataTrail](https://www.datatrail.org/). DataTrail is a no-cost, paid 14-week educational initiative for young-adult, high school and GED-graduates. DataTrail aims to equip members of underserved communities with the necessary skills and support required to work in the booming field of data science. + +DataTrail is a fresh take on workforce development that focuses on training both Black, Indigenous, and other people of color (BIPOC) interested in the data science industry and their potential employers. + +Offered by the Johns Hopkins Bloomberg School of Public Health, in partnership with local non-profits and Leanpub, DataTrail combines a mutually-intensive learning experience (MILE) with a whole-person ecosystem of support to allow aspiring data scientists and their employers to succeed. + +DataTrail uses mutually-intensive learning +DataTrail joins aspiring data science scholars and expert-level data scientist mentors in a mutually-intensive learning experience (MILE). + +In the DataTrail MILE: + +Scholars engage in cutting-edge technical and soft skills training needed to enter the data science field. + +Mentors engage in anti-racism and mentorship training needed to be impactful mentors and informed colleagues on diverse data science teams. + +The social connections created along the way will fuel job opportunities for scholars and foster a more diverse, equitable, and inclusive climate at the mentors' institutions. diff --git a/style-sets/fhdasl/_output.yml b/style-sets/fhdasl/_output.yml new file mode 100644 index 0000000..0a86496 --- /dev/null +++ b/style-sets/fhdasl/_output.yml @@ -0,0 +1,18 @@ +bookdown::gitbook: + css: assets/style.css + includes: + before_body: assets/big-image_fhdasl.html + after_body: assets/footer.html + split_bib: false + highlight: tango + config: + toc: + collapse: section + before: | + + after: | +

This content was published with bookdown using

+

The OTTR Template by:

+

The Fred Hutch Data Science Lab

+

Style adapted from: rstudio4edu-book (CC-BY 2.0)

+

Click here to provide feedback

diff --git a/style-sets/fhdasl/copy_to_assets/big-dasl-stacked.png b/style-sets/fhdasl/copy_to_assets/big-dasl-stacked.png new file mode 100644 index 0000000..4bf74fc Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/big-dasl-stacked.png differ diff --git a/style-sets/fhdasl/copy_to_assets/big-dasl.png b/style-sets/fhdasl/copy_to_assets/big-dasl.png new file mode 100755 index 0000000..df1b20b Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/big-dasl.png differ diff --git a/style-sets/fhdasl/copy_to_assets/big-image.html b/style-sets/fhdasl/copy_to_assets/big-image.html new file mode 100755 index 0000000..1df3779 --- /dev/null +++ b/style-sets/fhdasl/copy_to_assets/big-image.html @@ -0,0 +1,12 @@ + + + + + + + + + +
+ +
diff --git a/style-sets/fhdasl/copy_to_assets/big-image_fhdasl.html b/style-sets/fhdasl/copy_to_assets/big-image_fhdasl.html new file mode 100644 index 0000000..0a7d7bc --- /dev/null +++ b/style-sets/fhdasl/copy_to_assets/big-image_fhdasl.html @@ -0,0 +1,12 @@ + + + + + + + + + +
+ +
diff --git a/style-sets/fhdasl/copy_to_assets/box_images/data.png b/style-sets/fhdasl/copy_to_assets/box_images/data.png new file mode 100644 index 0000000..8725b99 Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/box_images/data.png differ diff --git a/style-sets/fhdasl/copy_to_assets/box_images/dictionary.png b/style-sets/fhdasl/copy_to_assets/box_images/dictionary.png new file mode 100644 index 0000000..75ddac7 Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/box_images/dictionary.png differ diff --git a/style-sets/fhdasl/copy_to_assets/box_images/github.png b/style-sets/fhdasl/copy_to_assets/box_images/github.png new file mode 100644 index 0000000..a93acd3 Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/box_images/github.png differ diff --git a/style-sets/fhdasl/copy_to_assets/box_images/justice.png b/style-sets/fhdasl/copy_to_assets/box_images/justice.png new file mode 100644 index 0000000..7780e05 Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/box_images/justice.png differ diff --git a/style-sets/fhdasl/copy_to_assets/box_images/money.png b/style-sets/fhdasl/copy_to_assets/box_images/money.png new file mode 100644 index 0000000..5b1b7e9 Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/box_images/money.png differ diff --git a/style-sets/fhdasl/copy_to_assets/box_images/motivations.png b/style-sets/fhdasl/copy_to_assets/box_images/motivations.png new file mode 100644 index 0000000..6a3242a Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/box_images/motivations.png differ diff --git a/style-sets/fhdasl/copy_to_assets/box_images/note.png b/style-sets/fhdasl/copy_to_assets/box_images/note.png new file mode 100644 index 0000000..72de3ae Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/box_images/note.png differ diff --git a/style-sets/fhdasl/copy_to_assets/box_images/plan.png b/style-sets/fhdasl/copy_to_assets/box_images/plan.png new file mode 100644 index 0000000..24f4213 Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/box_images/plan.png differ diff --git a/style-sets/fhdasl/copy_to_assets/box_images/question.png b/style-sets/fhdasl/copy_to_assets/box_images/question.png new file mode 100644 index 0000000..19ad5be Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/box_images/question.png differ diff --git a/style-sets/fhdasl/copy_to_assets/box_images/question_box.png b/style-sets/fhdasl/copy_to_assets/box_images/question_box.png new file mode 100644 index 0000000..458281c Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/box_images/question_box.png differ diff --git a/style-sets/fhdasl/copy_to_assets/box_images/submit.png b/style-sets/fhdasl/copy_to_assets/box_images/submit.png new file mode 100644 index 0000000..8a343c3 Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/box_images/submit.png differ diff --git a/style-sets/fhdasl/copy_to_assets/box_images/thinking_face.png b/style-sets/fhdasl/copy_to_assets/box_images/thinking_face.png new file mode 100644 index 0000000..c2c279a Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/box_images/thinking_face.png differ diff --git a/style-sets/fhdasl/copy_to_assets/box_images/warning.png b/style-sets/fhdasl/copy_to_assets/box_images/warning.png new file mode 100644 index 0000000..405fb61 Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/box_images/warning.png differ diff --git a/style-sets/fhdasl/copy_to_assets/brothers.png b/style-sets/fhdasl/copy_to_assets/brothers.png new file mode 100644 index 0000000..93c565e Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/brothers.png differ diff --git a/style-sets/fhdasl/copy_to_assets/dasl_thin_main_image.png b/style-sets/fhdasl/copy_to_assets/dasl_thin_main_image.png new file mode 100644 index 0000000..6143f4f Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/dasl_thin_main_image.png differ diff --git a/style-sets/fhdasl/copy_to_assets/favicon.ico b/style-sets/fhdasl/copy_to_assets/favicon.ico new file mode 100644 index 0000000..f41ff9b Binary files /dev/null and b/style-sets/fhdasl/copy_to_assets/favicon.ico differ diff --git a/style-sets/fhdasl/copy_to_assets/footer.html b/style-sets/fhdasl/copy_to_assets/footer.html new file mode 100755 index 0000000..61e2071 --- /dev/null +++ b/style-sets/fhdasl/copy_to_assets/footer.html @@ -0,0 +1,9 @@ +
+
+ +
\ No newline at end of file diff --git a/style-sets/fhdasl/copy_to_assets/hideOutput.js b/style-sets/fhdasl/copy_to_assets/hideOutput.js new file mode 100755 index 0000000..245d55f --- /dev/null +++ b/style-sets/fhdasl/copy_to_assets/hideOutput.js @@ -0,0 +1,57 @@ +/*$(document).ready(function() { + + + // Copy Button + $chunks = $('pre.sourceCode > code.sourceCode'); + $chunks.each(function(i, val) { + $(this).prepend("").click(function() { + var $temp = $("