diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 36d8e6f064a..42911e3de06 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,44 +1,119 @@ name: Build the website + on: workflow_dispatch: + push: pull_request: merge_group: +permissions: + contents: read + +concurrency: + group: build-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + GO_VERSION: "1.27.1" + HUGO_VERSION: "0.166.0" + NODE_VERSION: "24.18.0" + jobs: pre-commit: - name: pre-commit checks + name: Pre-commit checks runs-on: ubuntu-latest + timeout-minutes: 15 + steps: - - uses: actions/checkout@v6 - - name: Setup python - uses: actions/setup-python@v6 + - name: Checkout repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + + - name: Set up Python + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6 with: - python-version: '3.x' + python-version: "3.14" + + - name: Cache pre-commit environments + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 + with: + path: ~/.cache/pre-commit + key: pre-commit-${{ runner.os }}-${{ hashFiles('.pre-commit-config.yaml') }} + + - name: Install pre-commit + run: python -m pip install "pre-commit==4.6.1" + - name: Run pre-commit - uses: pre-commit/action@v3.0.1 + run: pre-commit run --all-files --show-diff-on-failure --color=always build: + name: Hugo build and validation needs: pre-commit runs-on: ubuntu-latest + timeout-minutes: 30 + steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: - submodules: true + fetch-depth: 0 + submodules: false lfs: false - path: website - - uses: ruby/setup-ruby@v1 + + - name: Set up Go + uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 with: - bundler-cache: true - working-directory: website - - name: Build site - working-directory: website - env: - JEKYLL_ENV: production - run: bundle exec jekyll build - - name: Upload site - uses: actions/upload-artifact@v7 + go-version: ${{ env.GO_VERSION }} + cache-dependency-path: go.sum + + - name: Set up Hugo + uses: peaceiris/actions-hugo@2752ce1d29631191ea3f27c23495fa06139a5b78 # v3 + with: + hugo-version: ${{ env.HUGO_VERSION }} + extended: true + + - name: Set up Node.js + uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6 + with: + node-version: ${{ env.NODE_VERSION }} + cache: npm + cache-dependency-path: tools/package-lock.json + + - name: Install Node.js dependencies + run: npm ci + working-directory: tools + + - name: Test Algolia indexing + run: npm run test:algolia + working-directory: tools + + - name: Verify Hugo modules + run: hugo mod verify + + - name: Build Hugo site + run: hugo --gc --minify --cleanDestinationDir --environment production + + - name: Validate Algolia records + run: npm run algolia:index -- --dry-run + working-directory: tools + + - name: Install XML validation tools + run: sudo apt-get update && sudo apt-get install --yes libxml2-utils + + - name: Validate generated output + run: | + test "$(cat public/CNAME)" = "precice.org" + test -s public/feed.xml + test -s public/sitemap.xml + test -s public/robots.txt + grep -Fx 'Sitemap: https://precice.org/sitemap.xml' public/robots.txt + xmllint --noout \ + public/feed.xml \ + public/sitemap.xml + + - name: Upload Hugo site + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7 with: - name: site - path: website/_site + name: hugo-site + path: public if-no-files-found: error + retention-days: 7 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index db4300a1b38..888f882bb4b 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -1,110 +1,125 @@ name: Build and deploy the website + on: workflow_dispatch: - workflow_call: push: branches: - master +permissions: + contents: read + concurrency: - group: website-deploy - cancel-in-progress: false # wait + group: production-pages + cancel-in-progress: false + +env: + BASE_URL: "https://precice.org/" + GO_VERSION: "1.27.1" + HUGO_VERSION: "0.166.0" jobs: pre-commit: - name: pre-commit checks + name: Pre-commit checks runs-on: ubuntu-latest + timeout-minutes: 15 + steps: - - uses: actions/checkout@v6 - - name: Setup python - uses: actions/setup-python@v6 + - name: Checkout repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 + + - name: Set up Python + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6 with: - python-version: '3.x' + python-version: "3.14" + + - name: Cache pre-commit environments + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6 + with: + path: ~/.cache/pre-commit + key: pre-commit-${{ runner.os }}-${{ hashFiles('.pre-commit-config.yaml') }} + + - name: Install pre-commit + run: python -m pip install "pre-commit==4.6.1" + - name: Run pre-commit - uses: pre-commit/action@v3.0.1 + run: pre-commit run --all-files --show-diff-on-failure --color=always - build-deploy: + build: + name: Build production site needs: pre-commit runs-on: ubuntu-latest + timeout-minutes: 45 + steps: - name: Checkout website - uses: actions/checkout@v6 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: - submodules: true - lfs: false path: website fetch-depth: 0 # full history required to determine last edit + submodules: false + lfs: false - - name: Fetch - precice develop - uses: actions/checkout@v6 + - name: Set up Go + uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 with: - repository: precice/precice - ref: develop - path: develop + go-version: ${{ env.GO_VERSION }} + cache-dependency-path: website/go.sum - - name: Fetch - precice main - uses: actions/checkout@v6 + - name: Set up Hugo + uses: peaceiris/actions-hugo@2752ce1d29631191ea3f27c23495fa06139a5b78 # v3 with: - repository: precice/precice - ref: main - path: main - fetch-tags: true + hugo-version: ${{ env.HUGO_VERSION }} + extended: true - - name: Patch doxyfiles - run: website/doxygen/patch.sh + - name: Install XML validation tools + run: sudo apt-get update && sudo apt-get install --yes libxml2-utils - - name: Install dependencies + - name: Log tool versions run: | - sudo apt-get -yyq update - sudo apt-get -yyq install graphviz plantuml - - # Install latest doxygen binary - mkdir doxygen - curl -sL https://github.com/doxygen/doxygen/releases/download/Release_1_14_0/doxygen-1.14.0.linux.bin.tar.gz | tar -xz --strip-components=1 -C doxygen - readlink -f doxygen/bin >> $GITHUB_PATH - - - name: Check doxygen version - run: doxygen --version - - - name: Setup ruby - uses: ruby/setup-ruby@v1 - with: - bundler-cache: true - working-directory: website + go version + hugo version - - name: Fetch full history for submodules + - name: Verify Hugo modules working-directory: website - run: git submodule foreach --recursive "git fetch --unshallow --all 2>/dev/null || git fetch --all" + run: hugo mod verify - - name: Build website + - name: Build Hugo site working-directory: website - env: - JEKYLL_ENV: production - run: bundle exec jekyll build - - - name: Build doxygen - develop - working-directory: develop - run: doxygen - env: - PLANTUML_JAR_PATH: /usr/share/plantuml/plantuml.jar - - - name: Build doxygen - main - working-directory: main - run: doxygen - env: - PLANTUML_JAR_PATH: /usr/share/plantuml/plantuml.jar - - - name: Assemble website + run: hugo --gc --minify --cleanDestinationDir --environment production --baseURL "${BASE_URL}" + + - name: Validate assembled site run: | - mv website/_site public - mv develop/docs/source-code-documentation/html public/doxygen/develop - mv main/docs/source-code-documentation/html public/doxygen/main + test -s website/public/index.html + test "$(cat website/public/CNAME)" = "precice.org" + test -s website/public/feed.xml + test -s website/public/sitemap.xml + test -s website/public/robots.txt + grep -Fx 'Sitemap: https://precice.org/sitemap.xml' website/public/robots.txt + xmllint --noout \ + website/public/feed.xml \ + website/public/sitemap.xml + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5 + with: + path: website/public - - name: List website files - run: find public + deploy: + name: Deploy production site + if: github.ref == 'refs/heads/master' + needs: build + runs-on: ubuntu-latest + timeout-minutes: 10 + permissions: + contents: read + pages: write + id-token: write + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} - - name: Deploy - uses: peaceiris/actions-gh-pages@v4 - with: - github_token: ${{ secrets.JEKYLL_PAT }} - publish_dir: ./public + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5 diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml deleted file mode 100644 index 5136759fc41..00000000000 --- a/.github/workflows/testing.yml +++ /dev/null @@ -1,81 +0,0 @@ -name: Build and deploy the testing website -on: - workflow_dispatch: - push: - branches: - - precice-v3 - -jobs: - build-deploy: - runs-on: ubuntu-latest - steps: - - name: Checkout website - uses: actions/checkout@v6 - with: - submodules: true - lfs: false - path: website - - - name: Fetch - precice develop - uses: actions/checkout@v6 - with: - repository: precice/precice - ref: develop - path: develop - - - name: Fetch - precice main - uses: actions/checkout@v6 - with: - repository: precice/precice - ref: main - path: main - - - name: Patch doxyfiles - working-directory: website - run: doxygen/patch.sh - - - name: Install dependencies - run: | - sudo apt-get -yyq update - sudo apt-get -yyq install doxygen graphviz plantuml - - - name: Setup ruby - uses: ruby/setup-ruby@v1 - with: - bundler-cache: true - working-directory: website - - - name: Build website - working-directory: website - env: - JEKYLL_ENV: production - run: bundle exec jekyll build - - - name: Build doxygen - develop - working-directory: develop - run: doxygen - env: - PLANTUML_JAR_PATH: /usr/share/plantuml/plantuml.jar - - - name: Build doxygen - main - working-directory: main - run: doxygen - env: - PLANTUML_JAR_PATH: /usr/share/plantuml/plantuml.jar - - - name: Assemble website - run: | - mv website/_site public - mv develop/docs/source-code-documentation/html public/doxygen/develop - mv main/docs/source-code-documentation/html public/doxygen/main - - - name: List website files - run: find public - - - name: Deploy to testing - uses: peaceiris/actions-gh-pages@v4 - with: - personal_token: ${{ secrets.WEB_TESTING_TOKEN }} - publish_dir: ./public - external_repository: precice/website-testing - publish_branch: main diff --git a/.github/workflows/update-algolia.yml b/.github/workflows/update-algolia.yml index 2521d09ff04..4d94af399bb 100644 --- a/.github/workflows/update-algolia.yml +++ b/.github/workflows/update-algolia.yml @@ -1,39 +1,79 @@ name: Update the Algolia search index + on: workflow_dispatch: schedule: - cron: "0 2 * * *" +permissions: + contents: read + +concurrency: + group: update-algolia + cancel-in-progress: false + +env: + GO_VERSION: "1.27.1" + HUGO_VERSION: "0.166.0" + NODE_VERSION: "24.18.0" + ALGOLIA_APP_ID: "LIT6P0EW26" + ALGOLIA_INDEX_NAME: "hugo" + jobs: - build: + index: + name: Build and publish index runs-on: ubuntu-latest + timeout-minutes: 30 + steps: - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: - submodules: true + fetch-depth: 0 + submodules: false lfs: false - path: website - - uses: ruby/setup-ruby@v1 + + - name: Set up Go + uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 + with: + go-version: ${{ env.GO_VERSION }} + cache-dependency-path: go.sum + + - name: Set up Hugo + uses: peaceiris/actions-hugo@2752ce1d29631191ea3f27c23495fa06139a5b78 # v3 with: - bundler-cache: true - working-directory: website - - name: Check recent commit - id: checkcommit - working-directory: website - run: | - LATEST_COMMIT=$(git log -1 --format=%ct) - CURRENT_TIME=$(date +%s) - TIME_DIFF=$((CURRENT_TIME - LATEST_COMMIT)) - if [ $TIME_DIFF -gt 86400 ]; then - echo "No commit within 24 hours." - echo "recent_commit=false" >> "$GITHUB_OUTPUT" - else - echo "recent_commit=true" >> "$GITHUB_OUTPUT" - fi - - name: Build website and update Algolia index - if: ${{ github.event_name == 'workflow_dispatch' || steps.checkcommit.outputs.recent_commit == 'true' }} - working-directory: website + hugo-version: ${{ env.HUGO_VERSION }} + extended: true + + - name: Set up Node.js + uses: actions/setup-node@249970729cb0ef3589644e2896645e5dc5ba9c38 # v6 + with: + node-version: ${{ env.NODE_VERSION }} + cache: npm + cache-dependency-path: tools/package-lock.json + + - name: Install Node.js dependencies + run: npm ci + working-directory: tools + + - name: Test Algolia indexing + run: npm run test:algolia + working-directory: tools + + - name: Verify Hugo modules + run: hugo mod verify + + - name: Build Hugo Algolia export + run: hugo --gc --minify --cleanDestinationDir --environment production + + - name: Validate generated Algolia records + run: npm run algolia:index -- --dry-run + working-directory: tools + + - name: Replace Algolia records env: - JEKYLL_ENV: production - run: ALGOLIA_API_KEY=${{ secrets.ALGOLIA_API_KEY }} bundle exec jekyll algolia + ALGOLIA_APP_ID: ${{ env.ALGOLIA_APP_ID }} + ALGOLIA_WRITE_API_KEY: ${{ secrets.ALGOLIA_API_KEY }} + ALGOLIA_INDEX_NAME: ${{ env.ALGOLIA_INDEX_NAME }} + run: npm run algolia:index + working-directory: tools diff --git a/.github/workflows/update-discourse-data.yml b/.github/workflows/update-discourse-data.yml index 45a500139c6..3d437c817d5 100644 --- a/.github/workflows/update-discourse-data.yml +++ b/.github/workflows/update-discourse-data.yml @@ -5,26 +5,25 @@ on: schedule: - cron: "0 6 * * *" +concurrency: + group: update-discourse-data + cancel-in-progress: false + jobs: update-discourse-data: runs-on: ubuntu-latest + timeout-minutes: 15 permissions: contents: write steps: - - uses: actions/create-github-app-token@v3 - id: app-token - with: - client-id: ${{ vars.WEBSITE_UPDATER_CLIENT_ID }} - private-key: ${{ secrets.WEBSITE_UPDATER_KEY }} - - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: - token: ${{ steps.app-token.outputs.token }} + fetch-depth: 0 - name: Set up Python - uses: actions/setup-python@v6 + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6 with: python-version: "3.14" @@ -33,19 +32,15 @@ jobs: python tools/fetch-news.py python tools/fetch-faq.py - - name: Configure Git author + - name: Commit and push changes run: | + git add static/assets/data/news.json static/assets/data/faq.json + if git diff --cached --quiet; then + echo "Discourse data is already up to date." + exit 0 + fi + git config --local user.name "precice-bot" git config --local user.email "info@precice.org" - - - name: Commit changes (if any) - run: | - git add assets/data/news.json - git add assets/data/faq.json - git commit -m "Update Discourse data data [skip ci]" || echo "No changes to commit" - - - name: Push commit - uses: ad-m/github-push-action@master - with: - github_token: ${{ steps.app-token.outputs.token }} - branch: ${{ github.ref }} + git commit --message "Update Discourse data [skip ci]" + git push origin "HEAD:${GITHUB_REF_NAME}" diff --git a/.github/workflows/update-submodules.yml b/.github/workflows/update-submodules.yml index cdb39006d77..c0f72fd547c 100644 --- a/.github/workflows/update-submodules.yml +++ b/.github/workflows/update-submodules.yml @@ -1,39 +1,67 @@ -name: Update submodules +name: Update Hugo modules + on: workflow_dispatch: schedule: - - cron: "0 0 * * *" + - cron: "5 0 * * *" + +concurrency: + group: update-hugo-modules + cancel-in-progress: false + +env: + GO_VERSION: "1.27.1" + HUGO_VERSION: "0.166.0" + PYTHON_VERSION: "3.14" jobs: update: runs-on: ubuntu-latest + timeout-minutes: 30 permissions: - contents: 'write' - outputs: - success: ${{ steps.commit.outputs.outcome == 'success' }} + contents: write + steps: - - uses: actions/create-github-app-token@v3 - id: app-token - with: - client-id: ${{ vars.WEBSITE_UPDATER_CLIENT_ID }} - private-key: ${{ secrets.WEBSITE_UPDATER_KEY }} - name: Checkout repository - uses: actions/checkout@v6 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 with: + fetch-depth: 0 submodules: false - lfs: true - token: ${{ steps.app-token.outputs.token }} - - name: Update submodules - run: git submodule update --init --remote --force - - name: Commit update - id: commit - continue-on-error: true + lfs: false + token: ${{ secrets.WORKFLOW_DISPATCH_TOKEN }} + + - name: Set up Go + uses: actions/setup-go@924ae3a1cded613372ab5595356fb5720e22ba16 # v6 + with: + go-version: ${{ env.GO_VERSION }} + cache-dependency-path: go.sum + + - name: Set up Hugo + uses: peaceiris/actions-hugo@2752ce1d29631191ea3f27c23495fa06139a5b78 # v3 + with: + hugo-version: ${{ env.HUGO_VERSION }} + extended: true + + - name: Set up Python + uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6 + with: + python-version: ${{ env.PYTHON_VERSION }} + + - name: Synchronize Hugo module revisions + run: python3 tools/sync_hugo_modules.py + + - name: Verify updated modules + run: hugo mod verify + + - name: Commit and push update run: | + if git diff --quiet -- go.mod go.sum; then + echo "Hugo modules are already up to date." + exit 0 + fi + git config --local user.name "precice-bot" git config --local user.email "info@precice.org" - git commit -m "Update submodules" -a - - name: Push commit - uses: ad-m/github-push-action@master - with: - github_token: ${{ steps.app-token.outputs.token }} - branch: ${{ github.ref }} + git add go.mod go.sum + git commit --message "Update Hugo modules" + git push origin "HEAD:${GITHUB_REF_NAME}" diff --git a/.gitignore b/.gitignore index d87a59686ac..9fc93985579 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,8 @@ -_site/ -.sass-cache/ -.jekyll-metadata -.jekyll-cache -_pdf .DS_Store -.idea -vendor/ -.bundle/ -Gemfile.lock \ No newline at end of file +.idea/ +.hugo_build.lock +/public/ +/public-pdf/ +/pdf/docs.pdf +/resources/ +node_modules/ diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index e43310a50bb..00000000000 --- a/.gitmodules +++ /dev/null @@ -1,54 +0,0 @@ -[submodule "tutorials"] - path = imported/tutorials - url = https://github.com/precice/tutorials.git - branch = develop -[submodule "openfoam-adapter"] - path = imported/openfoam-adapter - url = https://github.com/precice/openfoam-adapter.git - branch = develop -[submodule "imported/aste"] - path = imported/aste - url = https://github.com/precice/aste.git - branch = develop -[submodule "imported/micro-manager"] - path = imported/micro-manager - url = https://github.com/precice/micro-manager.git - branch = develop -[submodule "imported/fmi-runner"] - path = imported/fmi-runner - url = https://github.com/precice/fmi-runner - branch = main -[submodule "imported/su2-adapter"] - path = imported/su2-adapter - url = https://github.com/precice/su2-adapter - branch = develop -[submodule "imported/dune-adapter"] - path = imported/dune-adapter - url = https://github.com/precice/dune-adapter - branch = main -[submodule "imported/dumux-adapter"] - path = imported/dumux-adapter - url = https://github.com/precice/dumux-adapter - branch = develop -[submodule "imported/preeco-orga"] - path = imported/preeco-orga - url = https://github.com/precice/preeco-orga -[submodule "imported/fenicsx-adapter"] - path = imported/fenicsx-adapter - url = https://github.com/precice/fenicsx-adapter - branch = develop -[submodule "imported/code_aster-adapter"] - path = imported/code_aster-adapter - url = https://github.com/precice/code_aster-adapter - branch = develop -[submodule "imported/calculix-adapter"] - path = imported/calculix-adapter - url = https://github.com/precice/calculix-adapter - branch = develop -[submodule "imported/fenics-adapter"] - path = imported/fenics-adapter - url = https://github.com/precice/fenics-adapter - branch = develop -[submodule "imported/dealii-adapter"] - path = imported/dealii-adapter - url = https://github.com/precice/dealii-adapter \ No newline at end of file diff --git a/.ruby-version b/.ruby-version deleted file mode 100644 index 15a27998172..00000000000 --- a/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -3.3.0 diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 5af001d5591..00000000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -// Place your settings in this file to overwrite default and user settings. -{ - "files.associations": { - "*.html": "liquid" - } -} diff --git a/Gemfile b/Gemfile deleted file mode 100644 index cacff13c4b0..00000000000 --- a/Gemfile +++ /dev/null @@ -1,30 +0,0 @@ -source "https://rubygems.org" - -gem 'jekyll', ">= 4.1.1" - -gem "posix-spawn", github: "https://github.com/rtomayko/posix-spawn/pull/93" -# sass-embeded in 3.0.0 pulls google-protobuf which fails to compile -gem "jekyll-sass-converter", "< 3" - -group :jekyll_plugins do - gem 'jekyll-algolia' - gem 'jekyll-relative-links' - gem 'jekyll-seo-tag' - gem 'jekyll-sitemap' - gem 'jekyll-redirect-from' - gem 'jekyll-mermaid' -end - -gem 'jemoji' - -group :dev do - gem 'jekyll-watch' -end - -# Maybe in the future -# https://rubygems.org/gems/jekyll-assets -# https://rubygems.org/gems/jekyll-minifier - -# For current Ruby installations (3+?) -gem "webrick" - diff --git a/LICENSE-MIT-documentation-theme-jekyll.txt b/LICENSE-MIT-documentation-theme-jekyll.txt deleted file mode 100644 index e04b3d02e32..00000000000 --- a/LICENSE-MIT-documentation-theme-jekyll.txt +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 Tom Johnson - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/LICENSE.hugo.txt b/LICENSE.hugo.txt new file mode 100644 index 00000000000..261eeb9e9f8 --- /dev/null +++ b/LICENSE.hugo.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 11faf5a7486..5dafdea6d62 100644 --- a/README.md +++ b/README.md @@ -1,114 +1,99 @@ -# preCICE Webpage - [precice.org](https://precice.org/) +# preCICE website - [precice.org](https://precice.org/) -## Local development +## Building the website locally -First install [`pre-commit`](https://repology.org/project/python:pre-commit/versions) to keep your commits clean. +The website uses the [Hugo](https://gohugo.io/) static site generator and [GitHub Pages](https://pages.github.com/). +Install Hugo Extended and Go using the versions configured in the GitHub Actions workflows. +Follow Hugo's [installation guide](https://gohugo.io/installation/) and Go's [installation guide](https://go.dev/doc/install); Hugo Extended is required for the site's asset pipeline. +Hugo Modules require Git and Go, as described in the [Hugo Modules documentation](https://gohugo.io/hugo-modules/use-modules/). +Node.js is only needed when working on Algolia search. -The website is using [Jekyll](https://jekyllrb.com/) static website generator and [Github pages](https://pages.github.com/). -To run and develop it locally you need to install [`rbenv`](rbenv.org) using `apt install rbenv ruby-build`. -Then use `rbenv init` and follow the instructions to set it up. -With `rbenv` installed and activated in your shell: +After installation, check the tools before building: ```bash -git clone --recurse-submodules https://github.com/precice/precice.github.io && cd precice.github.io -pre-commit install -rbenv install -bundle install -bundle exec jekyll serve -l +hugo version +go version ``` -You can now view website locally in your browser at `localhost:4000`. - -## Update submodules - -Submodules do not yet get updated automatically. This means if you change something in the OpenFOAM adapter documentation or the description of the tutorials, you need to explicitly trigger an update here: +Clone the repository and start the local development server: ```bash -git submodule update --remote --merge +git clone https://github.com/precice/precice.github.io.git +cd precice.github.io +hugo server ``` -This updates **all** submodules. You can call it from everywhere (you do not need to `cd` into the submodule). -Afterwards, commit and push. - -Do not directly edit the content of the submodules from within the website repository. This might give ugly merge conflicts. - -## Pull with submodules - -To pull changes including submodules - -```bash -git pull --recurse-submodules -``` +You can now view the website locally at . +On the first build, Hugo automatically downloads the module versions recorded in `go.mod`. ## Build inside a Docker container -Instead of building on your system (which requires some setup the first time), you can directly serve the website from a Docker container (using the community image [`jekyll/jekyll`](https://hub.docker.com/r/jekyll/jekyll)). In this directory, after you initialize and update the git submodules, run the following: +Instead of building on your system (which requires some setup the first time), you can directly serve the website from a Docker container (using the [official Hugo image](https://github.com/gohugoio/hugo/pkgs/container/hugo) - [Dockerfile](https://github.com/gohugoio/hugo/blob/master/Dockerfile)). +In this directory, run the following: ```shell -docker run --rm --volume="$PWD:/srv/jekyll:Z" --publish 127.0.0.1:4000:4000 -it jekyll/jekyll jekyll serve +docker run --rm --volume="$PWD:/project:Z" -p 1313:1313 -it ghcr.io/gohugoio/hugo:latest serve --bind 0.0.0.0 ``` Arguments: -* `docker run`: The Docker command to run a container from an existing image -* `--rm`: Automatically remove (or not) the container when it exists -* `--volume`: Mount the current directory (`$PWD`) to a directory in the container (`/srv/jekyll`), so that only the current container can see the content (`:Z`) -* `--publish`: Publish the container's port 4000 (where Jekyll serves the website) to the host port 4000. Note that `127.0.0.1` is the localhost in IPv4. For IPv6, you can replace that with `[::1]`. -* `-it`: Interactive container, capturing signals (such as `Ctrl-C`). -* `jekyll/jekyll`: The image -* `jekyll serve`: The command to run. Somehow, the current default `make` target does not work in this context. +- `docker run`: The Docker command to run a container from an existing image +- `--rm`: Automatically remove (or not) the container when it exists +- `--volume`: Mount the current directory (`$PWD`) to a directory in the container (`/project/`), so that only the current container can see the content (`:Z`) +- `--publish`: Publish the container's port 1313 (where Hugo serves the website) to the host port 1313 +- `-it`: Interactive container, capturing signals (such as `Ctrl-C`) +- `ghcr.io/gohugoio/hugo:latest`: The image. If `latest` fails, v0.166.0 is known to work. +- `serve`: The Hugo command to run +- `--bind 0.0.0.0`: Bind all network addresses to the 0.0.0.0 interface (important to access the website from the host). -## Further information +## Contributing -If you would like to learn more about the preCICE documentation, a good start are the [documentation of the documentation pages](https://precice.org/docs-meta-overview.html). +First install [pre-commit](https://pre-commit.com/) using its [installation instructions](https://pre-commit.com/#install) to keep commits clean: -## Changing the news banner +```bash +pre-commit install +``` + +Before opening a pull request, run the production build and verify that all checks pass: -Edit [`_includes/news_banner.html`](_includes/news_banner.html). - -A good starting point is the following: - -```html - +```bash +hugo mod verify +hugo --gc --minify --cleanDestinationDir --environment production +pre-commit run --all-files ``` -Use the following to selectively change appearance. +## Update imported documentation + +Adapter, tutorial, and tooling documentation is included through Hugo Modules. +The `Update Hugo modules` workflow checks the upstream repositories daily and records the selected revisions in `go.mod` and `go.sum`. + +To update the imported documentation locally, run: -```html -{% if include.landing %} - Displayed on the landing page. -{% else %} - Displayed on other pages. -{% endif %} +```bash +python3 tools/sync_hugo_modules.py ``` -## Common issues while building the site +Review and commit the resulting `go.mod` and `go.sum` changes. +Do not edit downloaded module files from this repository; make documentation changes in the repository that owns them. -* If you get permission issues to install gems, resist the impulse of `sudo`: you can install the dependencies locally by running `bundle config set --local path 'vendor/bundle'` before `bundle install`. +Adding a new imported project requires an import and mounts in `config/_default/module.toml`, an edit-link mapping in `config/_default/params.toml`, and a navigation entry where appropriate. +Adding a tutorial currently also requires an entry in `data/sidebars/tutorials_sidebar.yml`. -* If you get errors like `Gem::Ext::BuildError: ERROR: Failed to build gem native extension.` or `mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h`, then (as the error message suggests), you may need to install a Ruby development environment (e.g., `ruby-dev`). +## Further information -* If you are a poor soul that is stuck developing on Windows, the `-l` flag is known to crash, so best try without. +The [documentation of the documentation pages](content/docs/docs-meta/overview.md) (or on the [website](https://precice.org/docs-meta-overview.html)) explains the website structure, navigation, front matter, and imported content. +See the [search documentation](content/docs/docs-meta/search.md) for details on Algolia search indexing and configuration. -* Should you get the warning +## Changing the news banner - ```bash - Fetching citation data failed with OpenURI::HTTPError - ``` +Edit [`layouts/partials/news_banner.html`](layouts/partials/news_banner.html). +The partial explains how to enable or disable the banner, change its text and link, and choose whether it appears on the landing page or on other pages. - while building the site locally, then you have been rate limited by Google Scholar. The citation database won't be up to date. Alternatively open [http://scholar.google.com/](http://scholar.google.com/) in a browser and complete the Captcha. +## Common issues while building the site -For further information see the [documentation page on common issues](https://precice.org/docs-meta-common-issues.html). +If Hugo cannot download a module, first check that Git and Go are installed, then run `hugo mod verify`. +A fresh clone needs network access to download the hugo modules. +For further information, see [common issues](content/docs/docs-meta/common-issues.md). ## Licenses @@ -117,19 +102,17 @@ It is based on the following dependencies (as licensed), with modifications or a Dependencies: -* [Jekyll](https://jekyllrb.com/), which is [available on GitHub](https://github.com/jekyll/jekyll) under an [MIT license](https://github.com/jekyll/jekyll/blob/master/LICENSE). -* Theme: [documentation-theme-jekyll](https://idratherbewriting.com/documentation-theme-jekyll/), which is [available on GitHub](https://github.com/tomjoht/documentation-theme-jekyll) under an [MIT license](https://github.com/tomjoht/documentation-theme-jekyll/blob/gh-pages/LICENSE). -* Linked JavaScript libraries: - * [Algolia instantsearch.js](https://www.algolia.com/doc/guides/building-search-ui/what-is-instantsearch/js), which is [available on GitHub](https://github.com/algolia/instantsearch) under an [MIT license](https://github.com/algolia/instantsearch/blob/master/LICENSE). - * [anchorjs](https://www.bryanbraun.com/anchorjs/), which is [available on GitHub](https://github.com/bryanbraun/anchorjs) under an [MIT license](https://github.com/bryanbraun/anchorjs/blob/main/LICENSE). - * [asciinema-player](https://docs.asciinema.org/manual/player/), which is [available on GitHub](https://github.com/asciinema/asciinema-player) under an [Apache 2.0 license](https://github.com/asciinema/asciinema-player/blob/develop/LICENSE). - * [Boostrap](https://getbootstrap.com/), which is [available on GitHub](https://github.com/twbs/bootstrap) under an [MIT license](https://github.com/twbs/bootstrap/blob/main/LICENSE). - * [FontAwesome free](https://fontawesome.com/license/free), which is [available on GitHub](https://github.com/FortAwesome/Font-Awesome) and [licensed](https://github.com/FortAwesome/Font-Awesome/blob/6.x/LICENSE.txt) as follows: Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License. - * [jQuery](https://jquery.com/), which is [available on GitHub](https://github.com/jquery/jquery) under an [MIT license](https://jquery.com/license/). - * [KaTeX](https://katex.org/), which is [available on GitHub](https://github.com/KaTeX/KaTeX) under an [MIT license](https://github.com/KaTeX/KaTeX/blob/main/LICENSE). - * [Moment.js](https://momentjs.com/), which is [available on GitHub](https://github.com/moment/moment/) under an [MIT license](https://github.com/moment/moment/blob/develop/LICENSE). - * [qrcode-generator](https://kazuhikoarase.github.io/qrcode-generator/js/demo/), which is [available on GitHub](https://github.com/kazuhikoarase/qrcode-generator/) under an [MIT license](https://github.com/kazuhikoarase/qrcode-generator/blob/master/LICENSE). - -The content of the documentation pages included in this repository is licensed under a [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/deed.en). - -Note that the preCICE core library itself has a software license, [LGPL v3](https://www.gnu.org/licenses/lgpl-3.0.en.html), and is maintained in a [different repository](https://github.com/precice/precice). +- [Hugo](https://gohugo.io/), which is [available on GitHub](https://github.com/gohugoio/hugo) under an [Apache 2.0 license](https://github.com/gohugoio/hugo/blob/master/LICENSE). +- Previous versions of this website were based on [Jekyll](https://jekyllrb.com/), which is [available on GitHub](https://github.com/jekyll/jekyll) under an [MIT license](https://github.com/jekyll/jekyll/blob/master/LICENSE). +- The theme is based on [documentation-theme-jekyll](https://idratherbewriting.com/documentation-theme-jekyll/), which is [available on GitHub](https://github.com/tomjoht/documentation-theme-jekyll) under an [MIT license](https://github.com/tomjoht/documentation-theme-jekyll/blob/gh-pages/LICENSE). +- The table of contents is generated using a modified version of [jekyll-table-of-contents](https://github.com/ghiculescu/jekyll-table-of-contents). +- Linked JavaScript libraries: + - [Algolia instantsearch.js](https://www.algolia.com/doc/guides/building-search-ui/what-is-instantsearch/js), which is [available on GitHub](https://github.com/algolia/instantsearch) under an [MIT license](https://github.com/algolia/instantsearch/blob/master/LICENSE). + - [anchorjs](https://www.bryanbraun.com/anchorjs/), which is [available on GitHub](https://github.com/bryanbraun/anchorjs) under an [MIT license](https://github.com/bryanbraun/anchorjs/blob/main/LICENSE). + - [asciinema-player](https://docs.asciinema.org/manual/player/), which is [available on GitHub](https://github.com/asciinema/asciinema-player) under an [Apache 2.0 license](https://github.com/asciinema/asciinema-player/blob/develop/LICENSE). + - [Boostrap](https://getbootstrap.com/), which is [available on GitHub](https://github.com/twbs/bootstrap) under an [MIT license](https://github.com/twbs/bootstrap/blob/main/LICENSE). + - [FontAwesome free](https://fontawesome.com/license/free), which is [available on GitHub](https://github.com/FortAwesome/Font-Awesome) and [licensed](https://github.com/FortAwesome/Font-Awesome/blob/6.x/LICENSE.txt) as follows: Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License. + - [jQuery](https://jquery.com/), which is [available on GitHub](https://github.com/jquery/jquery) under an [MIT license](https://jquery.com/license/). + - [KaTeX](https://katex.org/), which is [available on GitHub](https://github.com/KaTeX/KaTeX) under an [MIT license](https://github.com/KaTeX/KaTeX/blob/main/LICENSE). + - [Moment.js](https://momentjs.com/), which is [available on GitHub](https://github.com/moment/moment/) under an [MIT license](https://github.com/moment/moment/blob/develop/LICENSE). + - [qrcode-generator](https://kazuhikoarase.github.io/qrcode-generator/js/demo/), which is [available on GitHub](https://github.com/kazuhikoarase/qrcode-generator/) under an [MIT license](https://github.com/kazuhikoarase/qrcode-generator/blob/master/LICENSE). diff --git a/_config.yml b/_config.yml deleted file mode 100644 index 681d7e6d58d..00000000000 --- a/_config.yml +++ /dev/null @@ -1,383 +0,0 @@ -repository: precice/precice.github.io - -output: web -# this property is useful for conditional filtering of content that is separate from the PDF. - -topnav_title: preCICE -# this appears on the top navigation bar next to the home button - -site_title: preCICE - The Coupling Library -# this appears in the html browser tab for the site title (seen mostly by search engines, not users) - -company_name: preCICE -# this appears in the footer - -github_editme_path: https://github.com/precice/precice.github.io/edit/master/ -# if you're using Github, provide the basepath to the branch you've created for reviews, following the sample here. if not, leave this value blank. Ends in trailing slash. - -google_analytics: -# if you have google-analytics ID, put it in. if not, edit this value to blank. - -host: 127.0.0.1 -# the preview server used. Leave as is. - -port: 4000 -# the port where the preview is rendered. You can leave this as is unless you have other Jekyll builds using this same port that might cause conflicts. in that case, use another port such as 4006. - -exclude: - - .idea/ - - .gitignore - - vendor/ - - vendor/bundle/ - - imported - - README.md - - var/ - - pdf/ - - pdf-docs.sh - - doxygen/ - - tools/ - - content/**/_index.md -# these are the files and directories that jekyll will exclude from the build - -highlighter: rouge -# library used for syntax highlighting - -markdown: kramdown -kramdown: - input: GFM - auto_ids: true - hard_wrap: false - syntax_highlighter: rouge - # math_engine: katex - # math_engine_opts: {} -# filter used to process markdown. note that kramdown differs from github-flavored markdown in some subtle ways - - -collections_dir: collections -collections: - - testimonials - - publications - # tooltips: - # output: false -# collections are declared here. this renders the content in _tooltips and processes it, but doesn't output it as actual files in the output unless you change output to true - -defaults: - - - scope: - path: "content" - type: "pages" - values: - layout: "page" - comments: false - # if you don't want to use Commento.io and just hide comments, change true to false wherever you see the comments property - search: true - sidebar: home_sidebar - topnav: topnav - - - scope: - path: "content/docs" - type: "pages" - values: - layout: "page" - comments: false - # if you don't want to use Commento.io and just hide comments, change true to false wherever you see the comments property - search: true - sidebar: docs_sidebar - topnav: topnav - toc: true - - - scope: - path: "content/tutorials" - type: "pages" - values: - layout: "page" - comments: false - # if you don't want to use Commento.io and just hide comments, change true to false wherever you see the comments property - search: true - sidebar: tutorial_sidebar - topnav: topnav - toc: true - - - scope: - path: "imported/tutorials/" - type: "pages" - values: - layout: "page" - comments: false - # if you don't want to use Commento.io and just hide comments, change true to false wherever you see the comments property - search: true - sidebar: tutorial_sidebar - topnav: topnav - toc: true - github_editme_path: https://github.com/precice/tutorials/edit/develop/ # ends in / - - - scope: - path: "imported/openfoam-adapter/" - type: "pages" - values: - layout: "page" - comments: false - search: true - sidebar: docs_sidebar - topnav: topnav - toc: true - github_editme_path: https://github.com/precice/openfoam-adapter/edit/develop/ # ends in / - - - scope: - path: "imported/aste/" - type: "pages" - values: - layout: "page" - comments: false - search: true - sidebar: docs_sidebar - topnav: topnav - toc: true - github_editme_path: https://github.com/precice/aste/edit/develop/ # ends in / - - - scope: - path: "imported/micro-manager/" - type: "pages" - values: - layout: "page" - comments: false - search: true - sidebar: docs_sidebar - topnav: topnav - toc: true - github_editme_path: https://github.com/precice/micro-manager/edit/develop/ # ends in / - - - scope: - path: "imported/fmi-runner/" - type: "pages" - values: - layout: "page" - comments: false - search: true - sidebar: docs_sidebar - topnav: topnav - toc: true - github_editme_path: https://github.com/precice/fmi-runner/edit/main/ # ends in / - - - scope: - path: "imported/su2-adapter/" - type: "pages" - values: - layout: "page" - comments: false - search: true - sidebar: docs_sidebar - topnav: topnav - toc: true - github_editme_path: https://github.com/precice/su2-adapter/edit/develop/ # ends in / - - - scope: - path: "imported/dune-adapter/" - type: "pages" - values: - layout: "page" - comments: false - search: true - sidebar: docs_sidebar - topnav: topnav - toc: true - github_editme_path: https://github.com/precice/dune-adapter/edit/main/ # ends in / - - - scope: - path: "imported/dumux-adapter/" - type: "pages" - values: - layout: "page" - comments: false - search: true - sidebar: docs_sidebar - topnav: topnav - toc: true - github_editme_path: https://github.com/precice/dumux-adapter/edit/develop/ # ends in / - - - scope: - path: "imported/fenicsx-adapter/" - type: "pages" - values: - layout: "page" - comments: false - search: true - sidebar: docs_sidebar - topnav: topnav - toc: true - github_editme_path: https://github.com/precice/fenicsx-adapter/edit/develop/ # ends in / - - - scope: - path: "imported/code_aster-adapter/" - type: "pages" - values: - layout: "page" - comments: false - search: true - sidebar: docs_sidebar - topnav: topnav - toc: true - github_editme_path: https://github.com/precice/code_aster-adapter/edit/develop/ # ends in / - - - scope: - path: "imported/calculix-adapter/" - type: "pages" - values: - layout: "page" - comments: false - search: true - sidebar: docs_sidebar - topnav: topnav - toc: true - github_editme_path: https://github.com/precice/calculix-adapter/edit/develop/ # ends in / - - - scope: - path: "imported/fenics-adapter/" - type: "pages" - values: - layout: "page" - comments: false - search: true - sidebar: docs_sidebar - topnav: topnav - toc: true - github_editme_path: https://github.com/precice/fenics-adapter/edit/develop/ # ends in / - - - scope: - path: "imported/dealii-adapter/" - type: "pages" - values: - layout: "page" - comments: false - search: true - sidebar: docs_sidebar - topnav: topnav - toc: true - github_editme_path: https://github.com/precice/dealii-adapter/edit/develop/ # ends in / - - - scope: - path: "imported/preeco-orga/" - type: "pages" - values: - layout: "page" - comments: false - search: true - sidebar: community_sidebar - topnav: topnav - toc: true - github_editme_path: https://github.com/precice/preeco-orga/edit/main/ # ends in / - - - scope: - path: "content/community" - type: "pages" - values: - layout: "page" - comments: false - search: true - sidebar: community_sidebar - topnav: topnav - toc: true - -# these are defaults used for the frontmatter for these file types - -sidebars: -- home_sidebar -- docs_sidebar -- tutorial_sidebar -- community_sidebar - -description: "preCICE is an open-source coupling library and ecosystem for general partitioned multi-physics and multi-scale simulations, including surface and volume coupling." - -# the description is used in the feed.xml file - -# needed for sitemap.xml file only -url: https://precice.org -# baseurl: /documentation-theme-jekyll - -github: [metadata] - -algolia: - application_id: LIT6P0EW26 - index_name: jekyll - search_only_api_key: 760ed6be3e165d08b4a798ac4aa82fe4 - nodes_to_index: 'p,code,table' # html tags to include in search index - max_record_size: 20000 - -mermaid: - src: 'https://cdn.jsdelivr.net/npm/mermaid@11.12.3/dist/mermaid.min.js' - -plugins: - - jekyll-redirect-from - - jekyll-sitemap - -subprojects: - - imported/aste/docs - - imported/dumux-adapter/docs - - imported/dune-adapter/docs - - imported/fmi-runner/docs - - imported/micro-manager/docs - - imported/openfoam-adapter/docs - - imported/preeco-orga/guidelines - - imported/su2-adapter/docs - - imported/fenicsx-adapter/docs - - imported/code_aster-adapter/docs - - imported/calculix-adapter/docs - - imported/fenics-adapter/docs - - imported/dealii-adapter/docs - - imported/tutorials/aste-turbine - - imported/tutorials/breaking-dam-2d - - imported/tutorials/channel-transport - - imported/tutorials/channel-transport-reaction - - imported/tutorials/channel-transport-particles - - imported/tutorials/elastic-tube-1d - - imported/tutorials/elastic-tube-3d - - imported/tutorials/flow-around-controlled-moving-cylinder - - imported/tutorials/flow-over-heated-plate - - imported/tutorials/flow-over-heated-plate-nearest-projection - - imported/tutorials/flow-over-heated-plate-partitioned-flow - - imported/tutorials/flow-over-heated-plate-steady-state - - imported/tutorials/flow-over-heated-plate-two-meshes - - imported/tutorials/free-flow-over-porous-media - - imported/tutorials/heat-exchanger - - imported/tutorials/heat-exchanger-simplified - - imported/tutorials/multiple-perpendicular-flaps - - imported/tutorials/oscillator - - imported/tutorials/oscillator-overlap - - imported/tutorials/partitioned-backwards-facing-step - - imported/tutorials/partitioned-burgers-1d - - imported/tutorials/partitioned-elastic-beam - - imported/tutorials/partitioned-heat-conduction - - imported/tutorials/partitioned-heat-conduction-complex - - imported/tutorials/partitioned-heat-conduction-direct - - imported/tutorials/partitioned-heat-conduction-overlap - - imported/tutorials/partitioned-heat-conduction-3d - - imported/tutorials/partitioned-pipe - - imported/tutorials/partitioned-pipe-multiscale - - imported/tutorials/partitioned-pipe-two-phase - - imported/tutorials/perpendicular-flap - - imported/tutorials/perpendicular-flap-stress - - imported/tutorials/quickstart - - imported/tutorials/resonant-circuit - - imported/tutorials/tests - - imported/tutorials/turek-hron-fsi3 - - imported/tutorials/two-scale-heat-conduction - - imported/tutorials/volume-coupled-diffusion - - imported/tutorials/volume-coupled-flow - - imported/tutorials/water-hammer - - imported/tutorials/wolf-sheep-soil-creep - -# We use these versions to centrally update links -# and other version-specific information. -# Note that Jekyll cuts off trailing zeros: https://stackoverflow.com/questions/37862167/trailing-zeros-in-jekyll-liquid -precice_version: 3.4.1 - -# This url is so bugprone that we keep it centrally here -matrix_url: "https://matrix.to/#/#precice_lobby:gitter.im?web-instance[element.io]=app.gitter.im" - -# Latest known number of Google scholar citations, manually updated -# Automation is tricky: https://github.com/precice/precice.github.io/issues/522 -# Date: 24.05.2026 -precice_v1_citations: 451 -precice_v1_citations_url: https://scholar.google.com/scholar?cites=5053469347483527186&as_sdt=2005&sciodt=0,5&hl=en -precice_v2_citations: 233 -precice_v2_citations_url: https://scholar.google.com/scholar?oi=bibs&hl=en&cites=17974677460269868025,12004404035922881061 diff --git a/_includes/algolia.html b/_includes/algolia.html deleted file mode 100644 index 6f0cb541181..00000000000 --- a/_includes/algolia.html +++ /dev/null @@ -1,155 +0,0 @@ - \ No newline at end of file diff --git a/_includes/archive.html b/_includes/archive.html deleted file mode 100644 index 275850c9cb3..00000000000 --- a/_includes/archive.html +++ /dev/null @@ -1,15 +0,0 @@ ---- -layout: default -type: archive ---- - -
-

{{ page.title }}

-
-
- -{{ content }} -
- - - diff --git a/_includes/breadcrumb.html b/_includes/breadcrumb.html deleted file mode 100644 index 70f45f67ee0..00000000000 --- a/_includes/breadcrumb.html +++ /dev/null @@ -1,73 +0,0 @@ -{% comment %} -The following code generates breadcrumb metadata from the topnav and sidebar if available. -{% endcomment %} - diff --git a/_includes/callout.html b/_includes/callout.html deleted file mode 100644 index d492b1830d3..00000000000 --- a/_includes/callout.html +++ /dev/null @@ -1 +0,0 @@ -
{{include.content}}
diff --git a/_includes/commento.html b/_includes/commento.html deleted file mode 100644 index c38386b5104..00000000000 --- a/_includes/commento.html +++ /dev/null @@ -1,5 +0,0 @@ -{% unless page.comments == false %} -
- - -{% endunless %} diff --git a/_includes/community_spotlight.html b/_includes/community_spotlight.html deleted file mode 100644 index bd5011eb0f6..00000000000 --- a/_includes/community_spotlight.html +++ /dev/null @@ -1,24 +0,0 @@ - - -
- {% assign core_team = site.data.developer.leads | concat: site.data.developer.main | concat: site.data.developer['main-inactive'] | concat: site.data.developer.contributors %} - {% assign shown_githubs = '' %} - {% assign avatar_count = 0 %} - {% assign max_avatars = 99 %} - -
- {% for person in core_team %} - {% if avatar_count >= max_avatars %}{% break %}{% endif %} - - {% if person.github and shown_githubs contains person.github %}{% continue %}{% endif %} - - {% if person.github %} - - {{ person.fullname }} - - {% assign shown_githubs = shown_githubs | append: person.github | append: ',' %} - {% assign avatar_count = avatar_count | plus: 1 %} - {% endif %} - {% endfor %} -
-
diff --git a/_includes/disclaimer.html b/_includes/disclaimer.html deleted file mode 100644 index d97e38c8598..00000000000 --- a/_includes/disclaimer.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/_includes/feedback.html b/_includes/feedback.html deleted file mode 100644 index 6031797fc85..00000000000 --- a/_includes/feedback.html +++ /dev/null @@ -1,13 +0,0 @@ -
  • -{% if site.feedback_text %} - {% assign feedback_text = site.feedback_text %} -{% else %} - {% assign feedback_text = "Feedback" %} -{% endif %} - -{% if site.feedback_link %} - -{% else %} - -{% endif %} -
  • diff --git a/_includes/footer.html b/_includes/footer.html deleted file mode 100644 index ded314edc45..00000000000 --- a/_includes/footer.html +++ /dev/null @@ -1,69 +0,0 @@ - diff --git a/_includes/google_analytics.html b/_includes/google_analytics.html deleted file mode 100644 index 56b2ee88c5d..00000000000 --- a/_includes/google_analytics.html +++ /dev/null @@ -1,6 +0,0 @@ - - -{% if site.google_analytics %} - - -{% endif %} \ No newline at end of file diff --git a/_includes/head.html b/_includes/head.html deleted file mode 100644 index bd053e49011..00000000000 --- a/_includes/head.html +++ /dev/null @@ -1,123 +0,0 @@ - - -{% if page.summary %} - -{% endif %} - - - - -{{ page.title }} | {{ site.site_title }} - - - - - - - - -{% if page.summary -%} - -{%- elsif site.description -%} - -{%- endif %} - - - - -{% if page.summary -%} - -{%- elsif site.description -%} - -{%- endif %} - - - -{% if page.url == "/index.html" -%} - -{%- else -%} - -{%- endif %} - - - - - - - - - - - - - - - - - - - - -{% if page.url == "/index.html" %} - -{% endif %} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/_includes/head_print.html b/_includes/head_print.html deleted file mode 100644 index 653b69eae66..00000000000 --- a/_includes/head_print.html +++ /dev/null @@ -1,84 +0,0 @@ - - - - - -{% if page.homepage == true %} {{site.homepage_title}} {% elsif page.title %}{{ page.title }}{% endif %} | {{ site.site_title }} - - - - - - - - - - - - - - - - - - - - -{% if page.url == "/index.html" %} - -{% endif %} - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/_includes/image.html b/_includes/image.html deleted file mode 100644 index 10ddd3e2ed6..00000000000 --- a/_includes/image.html +++ /dev/null @@ -1 +0,0 @@ -
    {% if include.url %}{% endif %}{{include.alt}}{% if include.url %}{% endif %}{% if include.caption %}
    {{include.caption}}
    {% endif %}
    \ No newline at end of file diff --git a/_includes/important.html b/_includes/important.html deleted file mode 100644 index d7930ecf3d6..00000000000 --- a/_includes/important.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/_includes/initialize_shuffle.html b/_includes/initialize_shuffle.html deleted file mode 100644 index 9a0f048dd11..00000000000 --- a/_includes/initialize_shuffle.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - diff --git a/_includes/inline_image.html b/_includes/inline_image.html deleted file mode 100644 index 1e7fd187cb7..00000000000 --- a/_includes/inline_image.html +++ /dev/null @@ -1 +0,0 @@ -{{include.alt}} diff --git a/_includes/links.html b/_includes/links.html deleted file mode 100644 index 4f99e9422ef..00000000000 --- a/_includes/links.html +++ /dev/null @@ -1,44 +0,0 @@ -{% comment %}Get links from each sidebar, as listed in the _config.yml file under sidebars{% endcomment %} - -{% for sidebar in site.sidebars %} -{% for entry in site.data.sidebars[sidebar].entries %} -{% for folder in entry.folders %} -{% for folderitem in folder.folderitems %} -{% if folderitem.url contains "html#" %} -[{{folderitem.url | remove: "/" }}]: {{folderitem.url | remove: "/"}} -{% else %} -[{{folderitem.url | remove: "/" | remove: ".html"}}]: {{folderitem.url | remove: "/"}} -{% endif %} -{% for subfolders in folderitem.subfolders %} -{% for subfolderitem in subfolders.subfolderitems %} -[{{subfolderitem.url | remove: "/" | remove: ".html"}}]: {{subfolderitem.url | remove: "/"}} -{% endfor %} -{% endfor %} -{% endfor %} -{% endfor %} -{% endfor %} -{% endfor %} - - -{% comment %} Get links from topnav {% endcomment %} - -{% for entry in site.data.topnav.topnav %} -{% for item in entry.items %} -{% if item.external_url == null %} -[{{item.url | remove: "/" | remove: ".html"}}]: {{item.url | remove: "/"}} -{% endif %} -{% endfor %} -{% endfor %} - -{% comment %}Get links from topnav dropdowns {% endcomment %} - -{% for entry in site.data.topnav.topnav_dropdowns %} -{% for folder in entry.folders %} -{% for folderitem in folder.folderitems %} -{% if folderitem.external_url == null %} -[{{folderitem.url | remove: "/" | remove: ".html"}}]: {{folderitem.url | remove: "/"}} -{% endif %} -{% endfor %} -{% endfor %} -{% endfor %} - diff --git a/_includes/news_banner.html b/_includes/news_banner.html deleted file mode 100644 index 5db72e053aa..00000000000 --- a/_includes/news_banner.html +++ /dev/null @@ -1,19 +0,0 @@ -{% if include.onlanding %} -{% else %} -{% endif %} - -{% if include.onlanding %} - - - -{% endif %} diff --git a/_includes/note.html b/_includes/note.html deleted file mode 100644 index 2c1cfe967c1..00000000000 --- a/_includes/note.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/_includes/publication_panel.html b/_includes/publication_panel.html deleted file mode 100644 index f993be6584a..00000000000 --- a/_includes/publication_panel.html +++ /dev/null @@ -1,82 +0,0 @@ -{% comment %} - Renders a blue-bordered publication citation box (same as precice.org / landing page). - - Usage: - {% include publication_panel.html title="Exact publication title" %} - {% include publication_panel.html pub=pub %} - {% include publication_panel.html pub=pub flexible=true wrapper=false show_doi_in_body=true %} - - Parameters: - title / pub — lookup or pass publication from site.publications - flexible — optional journal fields (fenics related literature) - wrapper — wrap in row + col-md-10 offset-md-1 (default: true) - show_doi_in_body — append doi link in the citation line - require_pub_url — only show Publisher's site when pub-url is set -{% endcomment %} - -{% if include.pub %} - {% assign pub = include.pub %} -{% elsif include.title %} - {% assign pub = nil %} - {% for p in site.publications %} - {% if p.title == include.title %} - {% assign pub = p %} - {% break %} - {% endif %} - {% endfor %} -{% endif %} - -{% if pub %} - {% if pub.doi %} - {% assign publisher_url = pub.doi | prepend: 'https://www.doi.org/' %} - {% else %} - {% assign publisher_url = pub.pub-url %} - {% endif %} - - {% assign use_wrapper = true %} - {% if include.wrapper == false %} - {% assign use_wrapper = false %} - {% endif %} - - {% if use_wrapper %} -
    -
    - {% endif %} -
    -
    - {{ pub.title }} -
    -
    -

    - {% if include.flexible %} - {{ pub.authors }}{% if pub.journal.name %} {{ pub.journal.name }}, {% endif %}{% if pub.journal.volume %}Volume {{ pub.journal.volume }}, {% endif %}{% if pub.journal.publisher %}{{ pub.journal.publisher }}, {% endif %}{{ pub.year }}{% if include.show_doi_in_body and pub.doi %}, doi:{{ pub.doi }}{% endif %}. - {% elsif pub.journal.issue %} - {{ pub.authors }}, - {{ pub.journal.name }}, - {{ pub.year }}, - {{ pub.journal.volume }}:{{ pub.journal.issue }}{% if include.show_doi_in_body and pub.doi %}, doi:{{ pub.doi }}{% endif %}. - {% else %} - {{ pub.authors }}, - {{ pub.journal.name }}{% if pub.journal.volume %}, - Volume {{ pub.journal.volume }}{% endif %}{% if pub.journal.publisher %}, - {{ pub.journal.publisher }}{% endif %}, - {{ pub.year }}{% if include.show_doi_in_body and pub.doi %}, doi:{{ pub.doi }}{% endif %}. - {% endif %} -

    - {% if include.flexible and include.require_pub_url %} - {% if pub.pub-url %} - Publisher's site   - {% endif %} - {% elsif publisher_url %} - Publisher's site   - {% endif %} - {% if pub.bibtex %} - Download BibTeX   - {% endif %} -
    -
    - {% if use_wrapper %} -
    -
    - {% endif %} -{% endif %} diff --git a/_includes/scroll_to_top.html b/_includes/scroll_to_top.html deleted file mode 100644 index 47de57a88fd..00000000000 --- a/_includes/scroll_to_top.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - \ No newline at end of file diff --git a/_includes/sidebar.html b/_includes/sidebar.html deleted file mode 100644 index 3334ec8a057..00000000000 --- a/_includes/sidebar.html +++ /dev/null @@ -1,15 +0,0 @@ -{% assign sidebar = site.data.sidebars[page.sidebar].entries %} - - diff --git a/_includes/sidebar_recursive.html b/_includes/sidebar_recursive.html deleted file mode 100644 index 9a3870d487c..00000000000 --- a/_includes/sidebar_recursive.html +++ /dev/null @@ -1,122 +0,0 @@ -{% comment %} - Recursive sidebar: renders nested doc nav from _data/sidebars via folder.folderitems. - Parameters: item (folder node), level (1–4), parent_id (element id for data-bs-parent accordion group). - Branch rows use BS5 Collapse (data-bs-toggle, .collapse.show); leaves are plain nav-links. - Active state compares page.url (no leading slash) to each item url. -{% endcomment %} - -{% assign page_url_clean = page.url | remove_first: "/" %} - -{% assign item = include.item %} -{% assign title = item.title %} -{% assign url = item.url %} -{% assign folderitems = item.folderitems %} -{% assign subfolders = item.subfolders %} -{% assign subfolderitems = item.subfolderitems %} - -{% assign is_branch = false %} -{% if include.level == 1 %} - {% if folderitems.size > 0 %} - {% assign is_branch = true %} - {% endif %} -{% elsif include.level == 3 %} - {% assign is_branch = true %} -{% endif %} - -{% if is_branch == false %} - {% assign current_url_clean = url | remove_first: "/" %} - -{% else %} - {% capture current_uid %}{{ include.level }}-{{ title | slugify }}{% endcapture %} - {% assign current_id = current_uid | prepend: "sb-" %} - - {% assign any_active = false %} - {% assign current_url_clean = url | remove_first: "/" %} - {% if page_url_clean == current_url_clean and current_url_clean != "" %}{% assign any_active = true %}{% endif %} - - {% if any_active == false %} - {% for fi in folderitems %} - {% assign fi_url = fi.url | remove_first: "/" %} - {% if page_url_clean == fi_url and fi_url != "" %}{% assign any_active = true %}{% break %}{% endif %} - {% for sf in fi.subfolders %} - {% for sfi in sf.subfolderitems %} - {% assign sfi_url = sfi.url | remove_first: "/" %} - {% if page_url_clean == sfi_url and sfi_url != "" %}{% assign any_active = true %}{% break %}{% endif %} - {% endfor %} - {% if any_active %}{% break %}{% endif %} - {% endfor %} - {% if any_active %}{% break %}{% endif %} - {% endfor %} - {% endif %} - - {% if any_active == false %} - {% for sf in subfolders %} - {% for sfi in sf.subfolderitems %} - {% assign sfi_url = sfi.url | remove_first: "/" %} - {% if page_url_clean == sfi_url and sfi_url != "" %}{% assign any_active = true %}{% break %}{% endif %} - {% endfor %} - {% if any_active %}{% break %}{% endif %} - {% endfor %} - {% endif %} - - {% if any_active == false %} - {% for sfi in subfolderitems %} - {% assign sfi_url = sfi.url | remove_first: "/" %} - {% if page_url_clean == sfi_url and sfi_url != "" %}{% assign any_active = true %}{% break %}{% endif %} - {% endfor %} - {% endif %} - - -{% endif %} diff --git a/_includes/taglogic.html b/_includes/taglogic.html deleted file mode 100644 index 3bdbf6e902b..00000000000 --- a/_includes/taglogic.html +++ /dev/null @@ -1,31 +0,0 @@ -

    The following pages and posts are tagged with

    - - - {% assign thisTag = page.tagName %} - {% for page in site.pages %} - {% for tag in page.tags %} - {% if tag == thisTag %} - - - - - - {% endif %} - {% endfor %} - {% endfor %} - - {% assign thisTag = page.tagName %} - {% for post in site.posts %} - {% for tag in post.tags %} - {% if tag == thisTag %} - - - - - - {% endif %} - {% endfor %} - {% endfor %} - - -
    TitleTypeExcerpt
    {{page.title}}Page{% if page.summary %} {{ page.summary | strip_html | strip_newlines | truncate: 160 }} {% else %} {{ page.content | truncatewords: 50 | strip_html }} {% endif %}
    {{post.title}}Post{% if post.summary %} {{ post.summary | strip_html | strip_newlines | truncate: 160 }} {% else %} {{ post.content | truncatewords: 50 | strip_html }} {% endif %}
    diff --git a/_includes/tip.html b/_includes/tip.html deleted file mode 100644 index 01a6706f14a..00000000000 --- a/_includes/tip.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/_includes/toc.html b/_includes/toc.html deleted file mode 100644 index 0006ecc8d87..00000000000 --- a/_includes/toc.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - -
    diff --git a/_includes/topnav.html b/_includes/topnav.html deleted file mode 100644 index 13b4ef712d3..00000000000 --- a/_includes/topnav.html +++ /dev/null @@ -1,87 +0,0 @@ - - diff --git a/_includes/warning.html b/_includes/warning.html deleted file mode 100644 index fb48ecee3de..00000000000 --- a/_includes/warning.html +++ /dev/null @@ -1 +0,0 @@ - diff --git a/_layouts/default.html b/_layouts/default.html deleted file mode 100644 index 897b496b2b3..00000000000 --- a/_layouts/default.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - {% include head.html %} - - - - {% if page.datatable == true %} - - - - - - {% endif %} - - -
    - {% include topnav.html %} - - {% include news_banner.html onlanding=false %} -
    -
    - {% unless page.hide_sidebar %} -
    -
    - {% include sidebar.html %} -
    -
    - {{content}} -
    -
    - {% else %} -
    - {{content}} -
    - {% endunless %} -
    - {% include footer.html %} - {% include scroll_to_top.html %} - -{% if site.google_analytics %} -{% include google_analytics.html %} -{% endif %} - - - diff --git a/_layouts/default_print.html b/_layouts/default_print.html deleted file mode 100644 index a0dce8a5355..00000000000 --- a/_layouts/default_print.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - {% include head_print.html %} - - - - - - - - - - - - diff --git a/_layouts/landing_page.html b/_layouts/landing_page.html deleted file mode 100644 index e81737b4a2d..00000000000 --- a/_layouts/landing_page.html +++ /dev/null @@ -1,32 +0,0 @@ - - - - - {% include head.html %} - - - -
    - {% include topnav.html %} - - {% include news_banner.html onlanding=true %} -
    -
    - - {{content}} -
    - - {% include footer.html %} - {% include scroll_to_top.html %} - - - - - - - -{% if site.google_analytics %} -{% include google_analytics.html %} -{% endif %} - - \ No newline at end of file diff --git a/_layouts/none.html b/_layouts/none.html deleted file mode 100644 index 60887a9201d..00000000000 --- a/_layouts/none.html +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- -{{content}} \ No newline at end of file diff --git a/_layouts/page.html b/_layouts/page.html deleted file mode 100644 index 8b4a3236023..00000000000 --- a/_layouts/page.html +++ /dev/null @@ -1,106 +0,0 @@ ---- -layout: default ---- - -
    -

    {{ page.title }}

    -
    - -{% if page.simple_map == true %} - - - -{% include custom/{{page.map_name}}.html %} - -{% elsif page.complex_map == true %} - - - -{% include custom/{{page.map_name}}.html %} - -{% endif %} - -
    - - {% if page.summary %} -
    - - {{ page.summary | markdownify | remove: '

    ' | remove: '

    ' }} -
    - {% endif %} - -
    -
    - {% unless page.toc == false %} - - {% endunless %} -
    - -
    - {% unless page.editme == false %} - - {% endunless %} -
    -
    - - {{content}} - - {% if page.tags != null %} -
    - Tags: - {% assign projectTags = site.data.tags.allowed-tags %} - {% for tag in page.tags %} - {% if projectTags contains tag %} - {{page.tagName}}{{tag}} - {% endif %} - {% endfor %} -
    - {% endif %} - -{% comment %} -{% include commento.html %} -{% endcomment %} - - -{% include breadcrumb.html %} - -
    - diff --git a/_layouts/page_print.html b/_layouts/page_print.html deleted file mode 100644 index 48f68b952cd..00000000000 --- a/_layouts/page_print.html +++ /dev/null @@ -1,18 +0,0 @@ ---- -layout: default_print -comments: true ---- -
    -

    {{ page.title }}

    -
    - -
    - - {% if page.summary %} -
    - - {{ page.summary | markdownify | remove: '

    ' | remove: '

    ' }} -
    - {% endif %} - {{ content }} -
    diff --git a/_layouts/post.html b/_layouts/post.html deleted file mode 100644 index 773c953fafc..00000000000 --- a/_layouts/post.html +++ /dev/null @@ -1,39 +0,0 @@ ---- -layout: default ---- -
    - -
    -

    {{ page.title }}

    - - - -
    - -
    - - {% if page.summary %} -
    {{page.summary}}
    - {% endif %} - - {{ content }} -
    - - - -
    - -{% include commento.html %} - -{{site.data.alerts.hr_shaded}} - -{% include footer.html %} diff --git a/_plugins/customblocks.rb b/_plugins/customblocks.rb deleted file mode 100644 index ff823f215d0..00000000000 --- a/_plugins/customblocks.rb +++ /dev/null @@ -1,83 +0,0 @@ -# SPDX-FileCopyrightText: 2022-2026 The preCICE developers - precice.org -# -# SPDX-License-Identifier: MIT -module Jekyll - class TipBlock < Liquid::Block - def render(context) - text = super - '' - end - end - - class NoteBlock < Liquid::Block - def render(context) - text = super - '' - end - end - - class ImportantBlock < Liquid::Block - def render(context) - text = super - '' - end - end - - class ExperimentalBlock < Liquid::Block - def render(context) - text = super - '' - end - end - - class DisclaimerBlock < Liquid::Block - def render(context) - text = super - '' - end - end - - class VersionBlock < Liquid::Block - def initialize(tag_name, markup, parse_context) - super - @version = markup.strip - end - - def released?(context) - if @version.nil? || @version.empty? - # No version defined — treat as released (show content unconditionally) - return true - end - - current_version = context.registers[:site].config['precice_version'] - # Use the built-in Gem::Versions to compare versions - Gem::Version.new(current_version) >= Gem::Version.new(@version) - end - - def render(context) - text = super - message = if released?(context) - "Version" - else - "Upcoming version" - end - '" - end - end - - class WarningBlock < Liquid::Block - def render(context) - text = super - '' - end - end - -end - -Liquid::Template.register_tag('tip', Jekyll::TipBlock) -Liquid::Template.register_tag('note', Jekyll::NoteBlock) -Liquid::Template.register_tag('important', Jekyll::ImportantBlock) -Liquid::Template.register_tag('experimental', Jekyll::ExperimentalBlock) -Liquid::Template.register_tag('disclaimer', Jekyll::DisclaimerBlock) -Liquid::Template.register_tag('warning', Jekyll::WarningBlock) -Liquid::Template.register_tag('version', Jekyll::VersionBlock) diff --git a/_plugins/last_modified_at.rb b/_plugins/last_modified_at.rb deleted file mode 100644 index 3f92ce3fb15..00000000000 --- a/_plugins/last_modified_at.rb +++ /dev/null @@ -1,46 +0,0 @@ -# SPDX-FileCopyrightText: 2026 The preCICE developers - precice.org -# -# SPDX-License-Identifier: MIT -require 'open3' - -module Jekyll - class LastModifiedAtGenerator < Generator - safe true - priority :lowest - - def generate(site) - site.pages.each { |page| set_last_modified_at(page) } - if site.respond_to?(:docs_to_write) - site.docs_to_write.each { |doc| set_last_modified_at(doc) } - end - end - - private - - def set_last_modified_at(item) - # Skip if already specified in frontmatter - return if item.data['last_modified_at'] - - # Skip if there's no actual file path - file_path = item.path - return unless file_path && File.exist?(file_path) - - dir = File.dirname(file_path) - base = File.basename(file_path) - - # Get the timestamp from git log specifically from the file's directory. - # This naturally works for submodules because we run it inside the submodule dir. - stdout_str, status = Open3.capture2e("git", "-C", dir, "log", "-1", "--format=%ct", "--", base) - timestamp = status.success? ? stdout_str.strip : "" - - if timestamp.empty? - # Fallback to filesystem mtime if git history is not available - parsed_date = File.mtime(file_path) - else - parsed_date = Time.at(timestamp.to_i) - end - - item.data['last_modified_at'] = parsed_date - end - end -end diff --git a/_plugins/subprojects.rb b/_plugins/subprojects.rb deleted file mode 100644 index bb33b41735a..00000000000 --- a/_plugins/subprojects.rb +++ /dev/null @@ -1,82 +0,0 @@ -#SPDX-FileCopyrightText: 2020-2026 The preCICE developers - precice.org -# -#SPDX-License-Identifier: MIT - -require 'set' -module Jekyll - class SubprojectGenerator < Generator - safe true - priority :high # Subprojects need to be imported before other plugins run - - def generate(site) - - image_dest = "images" - - # Contains all static files required by tutorials - new_static_files = [] - # Contains the filenames of statics and which subproject they belong to - static_filenames = {} - - # Generate configured tutorials - (site.config['subprojects'] || []).each do |location| - Jekyll.logger.info("Subproject:", "#{location}") - - # Make sure the tutorial directory and README exist - unless File.directory?(site.in_source_dir(location)) - message ="No subproject found at #{location}" - Jekyll.logger.error("Tutorials:", message) - raise RuntimeError, message - end - - # Register the tutorial README as a page - pages = Dir.chdir(location) do - Dir.foreach(".").reject{ |f| File.directory?(f) || f.end_with?(".") }.select{ |f| Utils.has_yaml_header?(site.in_source_dir(File.join(location, f))) } - end - - unless pages.empty?() - Jekyll.logger.info("Adding pages:", pages.join(", ")) - pages.each do |file| - site.pages << Page.new(site, site.source, location, file) - end - end - - # Copy all images to images/ - images = File.join(location, 'images') - - next unless File.directory?(site.in_source_dir(images)) - - static_files = Dir.foreach(images).reject{ |f| File.directory?(File.join(images, f)) || f.end_with?(".")} - static_files.each do |image| - from = File.join(images, image) - to = File.join(image_dest, image) - Jekyll.logger.debug("Registering:", "#{from}") - - # Check for - if static_filenames.include?(image) - message = "#{image} was already added by subproject #{static_filenames[image]}!" - Jekyll.logger.error("Collision detected:", message) - raise message - else - static_filenames[image] = location - end - - # Skip the copy if the file already exists. This solves endless rebuild loops. - unless File.exist?(site.in_source_dir(to)) - Jekyll.logger.debug("Writing:", "#{to}") - FileUtils.cp(site.in_source_dir(from), site.in_source_dir(to)) - end - - # Save this static file for later - new_static_files << StaticFile.new(site, site.source, image_dest, image) - end - end - - # Reject all existing statics - existing_statics = site.static_files.map { |sf| sf.relative_path.delete_prefix('/') }.to_set - new_static_files.reject! { |static_file| existing_statics.include?(static_file.relative_path.delete_prefix('/')) } - - # Register all statics - site.static_files += new_static_files - end - end -end diff --git a/_includes/xmlreference.md b/assets/xmlreference.md similarity index 100% rename from _includes/xmlreference.md rename to assets/xmlreference.md diff --git a/config/_default/hugo.toml b/config/_default/hugo.toml new file mode 100644 index 00000000000..1a8cb141fcd --- /dev/null +++ b/config/_default/hugo.toml @@ -0,0 +1,68 @@ +# Hugo configuration for preCICE website +baseURL = "https://precice.org/" +locale = "en-us" +title = "preCICE - The Coupling Library" +enableGitInfo = true +enableRobotsTXT = true + +[module] +# Use the canonical Go module archive so its checksum matches go.sum. +proxy = "https://proxy.golang.org,direct" + +[params] +repository = "precice/precice.github.io" +output = "web" +topnav_title = "preCICE" +site_title = "preCICE - The Coupling Library" +company_name = "preCICE" +description = "preCICE is an open-source coupling library and ecosystem for general partitioned multi-physics and multi-scale simulations, including surface and volume coupling." +sidebars = ["home_sidebar", "docs_sidebar", "tutorials_sidebar", "community_sidebar"] +precice_version = "3.4.1" +precice_v1_citations = 481 +precice_v1_citations_url = "https://scholar.google.com/scholar?cites=5053469347483527186&as_sdt=2005&sciodt=0,5&hl=en" +precice_v2_citations = 280 +precice_v2_citations_url = "https://scholar.google.com/scholar?oi=bibs&hl=en&cites=17974677460269868025,12004404035922881061" + +[params.algolia] +application_id = "LIT6P0EW26" +index_name = "hugo" +search_only_api_key = "760ed6be3e165d08b4a798ac4aa82fe4" +nodes_to_index = "p,code,table" +max_record_size = 20000 + +[params.mermaid] +src = "https://cdn.jsdelivr.net/npm/mermaid@11.12.3/dist/mermaid.esm.min.mjs" + +[security] +allowContent = [".*"] + +[markup.goldmark.renderer] +unsafe = true + +[markup.goldmark.extensions.passthrough] +enable = true + +[markup.goldmark.extensions.passthrough.delimiters] +block = [["\\[", "\\]"]] +inline = [["$$", "$$"], ["$", "$"], ["\\(", "\\)"]] + +[markup.highlight] +noClasses = false + +[markup.tableOfContents] +startLevel = 2 +endLevel = 4 +ordered = false + +[outputs] +home = ["HTML", "RSS", "Algolia"] +section = ["HTML"] + +[outputFormats.RSS] +baseName = "feed" + +[outputFormats.Algolia] +mediaType = "application/json" +baseName = "algolia" +isPlainText = true +notAlternative = true diff --git a/config/_default/module.toml b/config/_default/module.toml new file mode 100644 index 00000000000..9c1682f9d68 --- /dev/null +++ b/config/_default/module.toml @@ -0,0 +1,479 @@ +# CalculiX adapter +[[imports]] +path = "github.com/precice/calculix-adapter" + + [[imports.mounts]] + source = "docs/adapter-calculix-overview.md" + target = "content/docs/adapters/calculix/_index.md" + + [[imports.mounts]] + source = "docs" + target = "content/docs/adapters/calculix" + files = ["! adapter-calculix-overview.md"] + +# code_aster adapter +[[imports]] +path = "github.com/precice/code_aster-adapter" + + [[imports.mounts]] + source = "docs/adapter-code_aster.md" + target = "content/docs/adapters/code_aster/_index.md" + + [[imports.mounts]] + source = "docs/images" + target = "content/docs/adapters/code_aster/images" + +# deal.II adapter +[[imports]] +path = "github.com/precice/dealii-adapter" + + [[imports.mounts]] + source = "docs/overview.md" + target = "content/docs/adapters/dealii/_index.md" + + [[imports.mounts]] + source = "docs" + target = "content/docs/adapters/dealii" + files = ["! overview.md"] + +# DuMuX adapter +[[imports]] +path = "github.com/precice/dumux-adapter" + + [[imports.mounts]] + source = "docs/overview.md" + target = "content/docs/adapters/dumux/_index.md" + + [[imports.mounts]] + source = "docs" + target = "content/docs/adapters/dumux" + files = ["! overview.md"] + +# DUNE adapter +[[imports]] +path = "github.com/precice/dune-adapter" + + [[imports.mounts]] + source = "docs/overview.md" + target = "content/docs/adapters/dune/_index.md" + +# FEniCS adapter +[[imports]] +path = "github.com/precice/fenics-adapter" + + [[imports.mounts]] + source = "docs/adapter-fenics.md" + target = "content/docs/adapters/fenics/_index.md" + + [[imports.mounts]] + source = "docs" + target = "content/docs/adapters/fenics" + files = ["! adapter-fenics.md", "! ReleaseGuide.md"] + +# FEniCSx adapter +[[imports]] +path = "github.com/precice/fenicsx-adapter" + + [[imports.mounts]] + source = "docs/README.md" + target = "content/docs/adapters/fenicsx/_index.md" + +# OpenFOAM adapter +[[imports]] +path = "github.com/precice/openfoam-adapter" + + [[imports.mounts]] + source = "docs/README.md" + target = "content/docs/adapters/openfoam/_index.md" + + [[imports.mounts]] + source = "docs" + target = "content/docs/adapters/openfoam" + files = ["! README.md", "! images/docs-adapter-openfoam-implicit-loop-src.md"] + +# SU2 adapter +[[imports]] +path = "github.com/precice/su2-adapter" + + [[imports.mounts]] + source = "docs/overview.md" + target = "content/docs/adapters/su2/_index.md" + + [[imports.mounts]] + source = "docs" + target = "content/docs/adapters/su2" + files = ["! overview.md"] + +# ASTE +[[imports]] +path = "github.com/precice/aste" + + [[imports.mounts]] + source = "docs/README.md" + target = "content/docs/tooling/aste/_index.md" + +# FMI runner +[[imports]] +path = "github.com/precice/fmi-runner" + + [[imports.mounts]] + source = "docs/README.md" + target = "content/docs/tooling/fmi-runner/_index.md" + + [[imports.mounts]] + source = "docs/images" + target = "content/docs/tooling/fmi-runner/images" + +# Micro Manager +[[imports]] +path = "github.com/precice/micro-manager" + + [[imports.mounts]] + source = "docs/README.md" + target = "content/docs/tooling/micro-manager/_index.md" + + [[imports.mounts]] + source = "docs" + target = "content/docs/tooling/micro-manager" + files = ["! README.md", "! ReleaseGuide.md"] + +# preECO guidelines +[[imports]] +path = "github.com/precice/preeco-orga" + + [[imports.mounts]] + source = "guidelines/guidelines-adapters.md" + target = "content/community/contribute/guidelines/_index.md" + + [[imports.mounts]] + source = "guidelines" + target = "content/community/contribute/guidelines" + files = ["! guidelines-adapters.md"] + +# This file is automatically generated by tools/sync_tutorials.py +[[imports]] +path = "github.com/precice/tutorials" + + [[imports.mounts]] + source = "aste-turbine/README.md" + target = "content/tutorials/aste-turbine/_index.md" + + [[imports.mounts]] + source = "aste-turbine/images" + target = "content/tutorials/aste-turbine/images" + + [[imports.mounts]] + source = "breaking-dam-2d/README.md" + target = "content/tutorials/breaking-dam-2d/_index.md" + + [[imports.mounts]] + source = "breaking-dam-2d/images" + target = "content/tutorials/breaking-dam-2d/images" + + [[imports.mounts]] + source = "channel-transport/README.md" + target = "content/tutorials/channel-transport/_index.md" + + [[imports.mounts]] + source = "channel-transport/images" + target = "content/tutorials/channel-transport/images" + + [[imports.mounts]] + source = "channel-transport-particles/README.md" + target = "content/tutorials/channel-transport-particles/_index.md" + + [[imports.mounts]] + source = "channel-transport-particles/images" + target = "content/tutorials/channel-transport-particles/images" + + [[imports.mounts]] + source = "channel-transport-reaction/README.md" + target = "content/tutorials/channel-transport-reaction/_index.md" + + [[imports.mounts]] + source = "channel-transport-reaction/images" + target = "content/tutorials/channel-transport-reaction/images" + + [[imports.mounts]] + source = "elastic-tube-1d/README.md" + target = "content/tutorials/elastic-tube-1d/_index.md" + + [[imports.mounts]] + source = "elastic-tube-1d/images" + target = "content/tutorials/elastic-tube-1d/images" + + [[imports.mounts]] + source = "elastic-tube-3d/README.md" + target = "content/tutorials/elastic-tube-3d/_index.md" + + [[imports.mounts]] + source = "elastic-tube-3d/images" + target = "content/tutorials/elastic-tube-3d/images" + + [[imports.mounts]] + source = "flow-around-controlled-moving-cylinder/README.md" + target = "content/tutorials/flow-around-controlled-moving-cylinder/_index.md" + + [[imports.mounts]] + source = "flow-around-controlled-moving-cylinder/images" + target = "content/tutorials/flow-around-controlled-moving-cylinder/images" + + [[imports.mounts]] + source = "flow-over-heated-plate/README.md" + target = "content/tutorials/flow-over-heated-plate/_index.md" + + [[imports.mounts]] + source = "flow-over-heated-plate/images" + target = "content/tutorials/flow-over-heated-plate/images" + + [[imports.mounts]] + source = "flow-over-heated-plate-nearest-projection/README.md" + target = "content/tutorials/flow-over-heated-plate-nearest-projection/_index.md" + + [[imports.mounts]] + source = "flow-over-heated-plate-nearest-projection/images" + target = "content/tutorials/flow-over-heated-plate-nearest-projection/images" + + [[imports.mounts]] + source = "flow-over-heated-plate-partitioned-flow/README.md" + target = "content/tutorials/flow-over-heated-plate-partitioned-flow/_index.md" + + [[imports.mounts]] + source = "flow-over-heated-plate-partitioned-flow/images" + target = "content/tutorials/flow-over-heated-plate-partitioned-flow/images" + + [[imports.mounts]] + source = "flow-over-heated-plate-steady-state/README.md" + target = "content/tutorials/flow-over-heated-plate-steady-state/_index.md" + + [[imports.mounts]] + source = "flow-over-heated-plate-steady-state/images" + target = "content/tutorials/flow-over-heated-plate-steady-state/images" + + [[imports.mounts]] + source = "flow-over-heated-plate-two-meshes/README.md" + target = "content/tutorials/flow-over-heated-plate-two-meshes/_index.md" + + [[imports.mounts]] + source = "flow-over-heated-plate-two-meshes/images" + target = "content/tutorials/flow-over-heated-plate-two-meshes/images" + + [[imports.mounts]] + source = "free-flow-over-porous-media/README.md" + target = "content/tutorials/free-flow-over-porous-media/_index.md" + + [[imports.mounts]] + source = "free-flow-over-porous-media/images" + target = "content/tutorials/free-flow-over-porous-media/images" + + [[imports.mounts]] + source = "heat-exchanger/README.md" + target = "content/tutorials/heat-exchanger/_index.md" + + [[imports.mounts]] + source = "heat-exchanger/images" + target = "content/tutorials/heat-exchanger/images" + + [[imports.mounts]] + source = "heat-exchanger-simplified/README.md" + target = "content/tutorials/heat-exchanger-simplified/_index.md" + + [[imports.mounts]] + source = "heat-exchanger-simplified/images" + target = "content/tutorials/heat-exchanger-simplified/images" + + [[imports.mounts]] + source = "multiple-perpendicular-flaps/README.md" + target = "content/tutorials/multiple-perpendicular-flaps/_index.md" + + [[imports.mounts]] + source = "multiple-perpendicular-flaps/images" + target = "content/tutorials/multiple-perpendicular-flaps/images" + + [[imports.mounts]] + source = "oscillator/README.md" + target = "content/tutorials/oscillator/_index.md" + + [[imports.mounts]] + source = "oscillator/images" + target = "content/tutorials/oscillator/images" + + [[imports.mounts]] + source = "oscillator-overlap/README.md" + target = "content/tutorials/oscillator-overlap/_index.md" + + [[imports.mounts]] + source = "oscillator-overlap/images" + target = "content/tutorials/oscillator-overlap/images" + + [[imports.mounts]] + source = "partitioned-backwards-facing-step/README.md" + target = "content/tutorials/partitioned-backwards-facing-step/_index.md" + + [[imports.mounts]] + source = "partitioned-backwards-facing-step/images" + target = "content/tutorials/partitioned-backwards-facing-step/images" + + [[imports.mounts]] + source = "partitioned-burgers-1d/README.md" + target = "content/tutorials/partitioned-burgers-1d/_index.md" + + [[imports.mounts]] + source = "partitioned-burgers-1d/images" + target = "content/tutorials/partitioned-burgers-1d/images" + + [[imports.mounts]] + source = "partitioned-elastic-beam/README.md" + target = "content/tutorials/partitioned-elastic-beam/_index.md" + + [[imports.mounts]] + source = "partitioned-elastic-beam/images" + target = "content/tutorials/partitioned-elastic-beam/images" + + [[imports.mounts]] + source = "partitioned-heat-conduction/README.md" + target = "content/tutorials/partitioned-heat-conduction/_index.md" + + [[imports.mounts]] + source = "partitioned-heat-conduction/images" + target = "content/tutorials/partitioned-heat-conduction/images" + + [[imports.mounts]] + source = "partitioned-heat-conduction-3d/README.md" + target = "content/tutorials/partitioned-heat-conduction-3d/_index.md" + + [[imports.mounts]] + source = "partitioned-heat-conduction-3d/images" + target = "content/tutorials/partitioned-heat-conduction-3d/images" + + [[imports.mounts]] + source = "partitioned-heat-conduction-complex/README.md" + target = "content/tutorials/partitioned-heat-conduction-complex/_index.md" + + [[imports.mounts]] + source = "partitioned-heat-conduction-complex/images" + target = "content/tutorials/partitioned-heat-conduction-complex/images" + + [[imports.mounts]] + source = "partitioned-heat-conduction-direct/README.md" + target = "content/tutorials/partitioned-heat-conduction-direct/_index.md" + + [[imports.mounts]] + source = "partitioned-heat-conduction-direct/images" + target = "content/tutorials/partitioned-heat-conduction-direct/images" + + [[imports.mounts]] + source = "partitioned-heat-conduction-overlap/README.md" + target = "content/tutorials/partitioned-heat-conduction-overlap/_index.md" + + [[imports.mounts]] + source = "partitioned-heat-conduction-overlap/images" + target = "content/tutorials/partitioned-heat-conduction-overlap/images" + + [[imports.mounts]] + source = "partitioned-pipe/README.md" + target = "content/tutorials/partitioned-pipe/_index.md" + + [[imports.mounts]] + source = "partitioned-pipe/images" + target = "content/tutorials/partitioned-pipe/images" + + [[imports.mounts]] + source = "partitioned-pipe-multiscale/README.md" + target = "content/tutorials/partitioned-pipe-multiscale/_index.md" + + [[imports.mounts]] + source = "partitioned-pipe-multiscale/images" + target = "content/tutorials/partitioned-pipe-multiscale/images" + + [[imports.mounts]] + source = "partitioned-pipe-two-phase/README.md" + target = "content/tutorials/partitioned-pipe-two-phase/_index.md" + + [[imports.mounts]] + source = "partitioned-pipe-two-phase/images" + target = "content/tutorials/partitioned-pipe-two-phase/images" + + [[imports.mounts]] + source = "perpendicular-flap/README.md" + target = "content/tutorials/perpendicular-flap/_index.md" + + [[imports.mounts]] + source = "perpendicular-flap/images" + target = "content/tutorials/perpendicular-flap/images" + + [[imports.mounts]] + source = "perpendicular-flap-stress/README.md" + target = "content/tutorials/perpendicular-flap-stress/_index.md" + + [[imports.mounts]] + source = "perpendicular-flap-stress/images" + target = "content/tutorials/perpendicular-flap-stress/images" + + [[imports.mounts]] + source = "quickstart/README.md" + target = "content/tutorials/quickstart/_index.md" + + [[imports.mounts]] + source = "quickstart/images" + target = "content/tutorials/quickstart/images" + + [[imports.mounts]] + source = "resonant-circuit/README.md" + target = "content/tutorials/resonant-circuit/_index.md" + + [[imports.mounts]] + source = "resonant-circuit/images" + target = "content/tutorials/resonant-circuit/images" + + [[imports.mounts]] + source = "turek-hron-fsi3/README.md" + target = "content/tutorials/turek-hron-fsi3/_index.md" + + [[imports.mounts]] + source = "turek-hron-fsi3/images" + target = "content/tutorials/turek-hron-fsi3/images" + + [[imports.mounts]] + source = "two-scale-heat-conduction/README.md" + target = "content/tutorials/two-scale-heat-conduction/_index.md" + + [[imports.mounts]] + source = "two-scale-heat-conduction/images" + target = "content/tutorials/two-scale-heat-conduction/images" + + [[imports.mounts]] + source = "volume-coupled-diffusion/README.md" + target = "content/tutorials/volume-coupled-diffusion/_index.md" + + [[imports.mounts]] + source = "volume-coupled-diffusion/images" + target = "content/tutorials/volume-coupled-diffusion/images" + + [[imports.mounts]] + source = "volume-coupled-flow/README.md" + target = "content/tutorials/volume-coupled-flow/_index.md" + + [[imports.mounts]] + source = "volume-coupled-flow/images" + target = "content/tutorials/volume-coupled-flow/images" + + [[imports.mounts]] + source = "water-hammer/README.md" + target = "content/tutorials/water-hammer/_index.md" + + [[imports.mounts]] + source = "water-hammer/images" + target = "content/tutorials/water-hammer/images" + + [[imports.mounts]] + source = "wolf-sheep-soil-creep/README.md" + target = "content/tutorials/wolf-sheep-soil-creep/_index.md" + + [[imports.mounts]] + source = "wolf-sheep-soil-creep/images" + target = "content/tutorials/wolf-sheep-soil-creep/images" + + [[imports.mounts]] + source = "tests/README.md" + target = "content/docs/dev-docs/system-tests/_index.md" diff --git a/config/_default/params.toml b/config/_default/params.toml new file mode 100644 index 00000000000..923387bf366 --- /dev/null +++ b/config/_default/params.toml @@ -0,0 +1,20 @@ +# Repository-specific edit links for local and mounted content. +github_editme_path = "https://github.com/precice/precice.github.io/edit/master/" +matrix_url = "https://matrix.to/#/#precice_lobby:gitter.im?web-instance[element.io]=app.gitter.im" + +[github_editme_paths] +"content" = "https://github.com/precice/precice.github.io/edit/master/" +"github.com/precice/aste" = "https://github.com/precice/aste/edit/develop/" +"github.com/precice/calculix-adapter" = "https://github.com/precice/calculix-adapter/edit/develop/" +"github.com/precice/code_aster-adapter" = "https://github.com/precice/code_aster-adapter/edit/develop/" +"github.com/precice/dealii-adapter" = "https://github.com/precice/dealii-adapter/edit/develop/" +"github.com/precice/dumux-adapter" = "https://github.com/precice/dumux-adapter/edit/develop/" +"github.com/precice/dune-adapter" = "https://github.com/precice/dune-adapter/edit/main/" +"github.com/precice/fenics-adapter" = "https://github.com/precice/fenics-adapter/edit/develop/" +"github.com/precice/fenicsx-adapter" = "https://github.com/precice/fenicsx-adapter/edit/develop/" +"github.com/precice/fmi-runner" = "https://github.com/precice/fmi-runner/edit/main/" +"github.com/precice/micro-manager" = "https://github.com/precice/micro-manager/edit/develop/" +"github.com/precice/openfoam-adapter" = "https://github.com/precice/openfoam-adapter/edit/develop/" +"github.com/precice/preeco-orga" = "https://github.com/precice/preeco-orga/edit/main/" +"github.com/precice/su2-adapter" = "https://github.com/precice/su2-adapter/edit/develop/" +"github.com/precice/tutorials" = "https://github.com/precice/tutorials/edit/master/" diff --git a/config/pdf/hugo.toml b/config/pdf/hugo.toml new file mode 100644 index 00000000000..b28f381a1b1 --- /dev/null +++ b/config/pdf/hugo.toml @@ -0,0 +1,59 @@ +[params] +output = "pdf" +print_title = "preCICE" +print_subtitle = "The coupling library for partitioned multi-physics simulations" + +[outputs] +home = ["PDFTitle", "PDFTOC", "PDFDocsPart", "PDFTutorialsPart", "PDFAppendixPart", "PrinceList"] +page = ["HTML"] +section = ["HTML"] + +[outputFormats.PDFTitle] +mediaType = "text/html" +baseName = "title" +path = "pdf" +isHTML = true +notAlternative = true + +[outputFormats.PDFTOC] +mediaType = "text/html" +baseName = "toc" +path = "pdf" +isHTML = true +notAlternative = true + +[outputFormats.PDFDocsPart] +mediaType = "text/html" +baseName = "docs-part" +path = "pdf" +isHTML = true +notAlternative = true + +[outputFormats.PDFTutorialsPart] +mediaType = "text/html" +baseName = "tutorials-part" +path = "pdf" +isHTML = true +notAlternative = true + +[outputFormats.PDFAppendixPart] +mediaType = "text/html" +baseName = "appendix-part" +path = "pdf" +isHTML = true +notAlternative = true + +[outputFormats.PrinceList] +mediaType = "text/plain" +baseName = "prince-list" +path = "pdf" +isPlainText = true +notAlternative = true + +[segments.pdf] + [[segments.pdf.includes]] + output = "{pdftitle,pdftoc,pdfdocspart,pdftutorialspart,pdfappendixpart,princelist}" + + [[segments.pdf.includes]] + output = "html" + path = "{/docs,/docs/**,/tutorials,/tutorials/**}" diff --git a/content/404.md b/content/404.md index c7a40e5b023..1564315ac71 100644 --- a/content/404.md +++ b/content/404.md @@ -3,12 +3,14 @@ title: "Page Not Found" search: exclude hide_sidebar: true permalink: /404.html +aliases: + - /404.html editme: false ---
    -![404 - page not found](images/404.png) +![404 - page not found](/images/404.png)
    diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 00000000000..109729a8088 --- /dev/null +++ b/content/_index.md @@ -0,0 +1,13 @@ +--- +title: preCICE - The Coupling Library +keywords: +toc: false +hide_sidebar: true +topnav: topnav +cascade: + layout: page + comments: false + search: true + sidebar: home_sidebar + topnav: topnav +--- diff --git a/content/about.md b/content/about.md new file mode 100644 index 00000000000..7bc7c0a8d0f --- /dev/null +++ b/content/about.md @@ -0,0 +1,59 @@ +--- +title: About the preCICE project +permalink: about.html +aliases: + - /about.html + - /timeline/ +keywords: about, project leaders, timeline, impressum, legal +summary: +hide_sidebar: true +toc: false +editme: false +redirect_from: + - /timeline/ +--- + +## Development + +preCICE is developed in the groups of [Benjamin Uekermann (Usability and Sustainability of Simulation Software)](https://www.ipvs.uni-stuttgart.de/departments/us3/) and [Miriam Schulte (Simulation of Large Systems)](https://www.ipvs.uni-stuttgart.de/departments/sgs/) at the University of Stuttgart and in the group of [Hans-Joachim Bungartz (Scientific Computing in Computer Science)](https://www.cs.cit.tum.de/en/sccs/home/) at the Technical University of Munich. [Support contracts](community-support-precice.html) are offered through [TTI GmbH](https://www.tti-stuttgart.de/). + +
    +preCICE contributors +
    + +For the full list of contributors to preCICE please see our [community page](community-contributors). + +The conceptual ideas of preCICE are not completely new. preCICE is an advancement of FSI*ce, developed by Markus Brenk. + +## Planning and development of precice.org + +The website was originally planned and implemented by [Christopher Lorenz](https://christopherlorenz.com) / CH Lorenz Research and Innovation Consulting together with the preCICE team in 2021. It was later ported from the Jekyll to the Hugo framework by [Muhammad Aashir Aslam](https://github.com/MuhammadAashirAslam) in 2026 as part of a [Google Summer of Code project](https://gist.github.com/MuhammadAashirAslam/a5c5929b962d0a0886a4f050279fcade). + +## Funding + +{{< funding >}} + +## Prince XML + +We use a non-commercial license of [Prince XML](http://www.princexml.com/) to generate the PDF version of the documentation. For more information see our [meta documentation page](docs-meta-publish-to-pdf.html). + +## Website analytics + +We use the open-source and privacy-friendly analytics service [Plausible](https://plausible.io/). Everyone can see the [analytics for this website](https://plausible.io/precice.org). + +## Impressum + +This website is maintained by + +Benjamin Uekermann - +Universität Stuttgart - +Universitätsstraße 38 - +70569 Stuttgart + +## Privacy + +You can find the preCICE [privacy policy here](privacy.html). + +![preCICE doughnuts](/images/doughnuts.jpg) + +preCICE is tasty because it is made with love by its contributors. diff --git a/content/about/_index.md b/content/about/_index.md deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/content/about/overview.md b/content/about/overview.md deleted file mode 100644 index ade1200f8a0..00000000000 --- a/content/about/overview.md +++ /dev/null @@ -1,113 +0,0 @@ ---- -title: About the preCICE project -permalink: about.html -keywords: about, project leaders, timeline, impressum, legal -summary: -hide_sidebar: true -toc: false -editme: false -redirect_from: - - /about/ - - /timeline/ ---- - -## Development - -preCICE is developed in the groups of [Benjamin Uekermann (Usability and Sustainability of Simulation Software)](https://www.ipvs.uni-stuttgart.de/departments/us3/) and [Miriam Schulte (Simulation of Large Systems)](https://www.ipvs.uni-stuttgart.de/departments/sgs/) at the University of Stuttgart and in the group of [Hans-Joachim Bungartz (Scientific Computing in Computer Science)](https://www.cs.cit.tum.de/en/sccs/home/) at the Technical University of Munich. [Support contracts](community-support-precice.html) are offered through [TTI GmbH](https://www.tti-stuttgart.de/). - -
    -preCICE contributors -
    - -For the full list of contributors to preCICE please see our [community page](community-contributors). - - - -The conceptual ideas of preCICE are not completely new. preCICE is an advancement of FSI*ce, developed by Markus Brenk. - -## Planning and development of precice.org - -The website in its current form was planned and implemented by CH Lorenz Research and Innovation Consulting together with the preCICE team. For more information contact [Christopher Lorenz](https://christopherlorenz.com) at christopher[dot]lorenz[at]chlorenz[dot]ug. - -## Funding - -
    -{% for item in site.data.funding %} -
    -
    -
    - - - {{ item.title }} - - -
    -
    - - Logo - -
    -
    - {% if item.description %}

    {{ item.description }}

    {% endif %} - {% if item.number %}

    Funding number: {{ item.number }}

    {% endif %} -

    Years running: {{ item.period }}

    -
    -
    -
    -
    -
    -{% endfor %} -
    - -## Prince XML - -We use a non-commercial license of [Prince XML](http://www.princexml.com/) to generate the PDF version of the documentation. For more information see our [meta documentation page](docs-meta-publish-to-pdf.html). - -## Website analytics - -We use the open-source and privacy-friendly analytics service [Plausible](https://plausible.io/). Everyone can see the [analytics for this website](https://plausible.io/precice.org). - -## Impressum - -This website is maintained by - -Benjamin Uekermann - -Universität Stuttgart - -Universitätsstraße 38 - -70569 Stuttgart - -## Privacy - -You can find the preCICE [privacy policy here](privacy.html). - -![preCICE doughnuts](images/doughnuts.jpg) - -preCICE is tasty because it is made with love by its contributors. diff --git a/content/community/_index.md b/content/community/_index.md index e69de29bb2d..94c753fc039 100644 --- a/content/community/_index.md +++ b/content/community/_index.md @@ -0,0 +1,11 @@ +--- +title: Community +redirect_to: /community/overview/ +cascade: + layout: page + comments: false + search: true + sidebar: community_sidebar + topnav: topnav + toc: true +--- diff --git a/content/community/channels.md b/content/community/channels.md index cab4f650f7e..dffbc17b185 100644 --- a/content/community/channels.md +++ b/content/community/channels.md @@ -1,6 +1,9 @@ --- title: Community channels permalink: community-channels.html +aliases: + - /community-channels.html + - /resources/ keywords: contact, follow, social, stay in touch, news, videos, YouTube, Gitter, newsletter, newsfeed, mailing list, mastodon, bluesky summary: toc: false @@ -15,7 +18,7 @@ We have all been there: you start using a new tool, only to find out that you do You can find us on our [preCICE forum on Discourse](https://precice.discourse.group/), which is great for structured discussions that help everyone. We try our best to help everyone, but this approach does not scale. We would be very happy if you also try to help others - only together way we can build a helping and welcoming online community! -For quick orientation questions, feel free to drop us a short message on the [preCICE Matrix chatroom]({{ site.matrix_url }}). +For quick orientation questions, feel free to drop us a short message on the [preCICE Matrix chatroom]({{< site_param "matrix_url" >}}). ## I want to stay up-to-date diff --git a/content/community/contribute/contribute-to-precice.md b/content/community/contribute/contribute-to-precice.md index e3146198d6d..6cb8282ab8a 100644 --- a/content/community/contribute/contribute-to-precice.md +++ b/content/community/contribute/contribute-to-precice.md @@ -1,6 +1,8 @@ --- title: Contribute to preCICE permalink: community-contribute-to-precice.html +aliases: + - /community-contribute-to-precice.html keywords: contribute, develop summary: toc: true @@ -72,9 +74,9 @@ or to demonstrate a new feature. We welcome contributions to our [tutorials repo and we will discuss it with you over a few [review](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/reviewing-proposed-changes-in-a-pull-request) iterations. If you roughly follow the guidelines in this section, your contribution could be merged very quickly. Since we aim to maintain and update all tutorials, it is important for us that every tutorial merged follows the same structure and conventions. -{% tip %} +{{< tip >}} Get in touch with us early and we will be very happy to help you with every step! Open a first draft Pull Request on GitHub and we can together bring it into a fitting shape. -{% endtip %} +{{< /tip >}} First time working with Git? Watch a [lecture on Git](https://missing.csail.mit.edu/2020/version-control/). @@ -147,9 +149,9 @@ In the `README.md` file, following the general structure of the existing tutoria - an example picture or video of the results. - Don't forget to adapt the `permalink:` field in the beginning of the file. -{% note %} -If you add a complete new tutorial case, the case also needs to be added to the [tutorials sidebar](https://github.com/precice/precice.github.io/blob/master/_data/sidebars/tutorial_sidebar.yml) on the [tutorials website section](tutorials.html). Please open a pull request to the [website repository](https://github.com/precice/precice.github.io). -{% endnote %} +{{< note >}} +If you add a complete new tutorial case, also add its Hugo module mounts to `config/_default/module.toml` and its permalink to the [tutorials sidebar](https://github.com/precice/precice.github.io/blob/master/data/sidebars/tutorials_sidebar.yml) in a pull request to the [website repository](https://github.com/precice/precice.github.io). +{{< /note >}} ### The metadata file @@ -191,7 +193,6 @@ After testing and merging, we will generate the reference results of the new tes - Mesh names start with the participant/domain name, e.g. `Fluid-Mesh`. - Mesh names of participants with multiple interfaces contain the interface in the mesh name, e.g. `Fluid-Upstream-Mesh`. For meshes on which it is important to distinguish between face centers and face nodes, the modifier comes at the end, e.g. `Fluid-Upstream-Mesh-Centers`. - Watchpoint names should be describing the point, not be a generic name. -- Images need to be named as `tutorials--.png` to be correctly displayed on the website. You can then refer to them as `![title](images/tutorials--.png)`. Subdirectories are not allowed. ### Open a pull request @@ -215,14 +216,20 @@ We automate many checks with [GitHub actions](https://github.com/features/action ### Adding a new tutorial to the website -The content of the tutorials is sourced from the develop branch of the tutorials repository, which is specified in the `.gitmodules` file of the website repository. Hence, in general, anything merged to develop in the tutorials appears on the website. Consider putting some `note` [alert box](docs-meta-cheatsheet.html#alerts) on top of your new tutorial page to describe any unreleased requirements. +Tutorial content is imported from the tutorials repository with Hugo Modules. +The `Update Hugo modules` workflow records the selected tutorial revision in +`go.mod` and `go.sum`. Consider putting a `note` +[alert box](docs-meta-cheatsheet.html#alerts) on top of your new tutorial page +to describe any unreleased requirements. -*New* tutorials will not directly appear on the website, but they need some additional steps. After merging to the tutorials develop, open a pull request with the following changes in the [website repository](https://github.com/precice/precice.github.io) ([example](https://github.com/precice/precice.github.io/pull/275)): +New tutorials will not directly appear on the website. After merging a new +tutorial, open a pull request with these changes in the +[website repository](https://github.com/precice/precice.github.io): -1. Trigger the [update submodules workflow](https://github.com/precice/precice.github.io/actions/workflows/update-submodules.yml) and, after it completes, create a new branch and pull request (this may also happen automatically, or someone from the preCICE team may have to do it for you). -2. Edit the [`_config.yml` file](https://github.com/precice/precice.github.io/blob/master/_config.yml) to append the directory name of your tutorial under `subprojects:`. -3. Edit the [tutorials sidebar](https://github.com/precice/precice.github.io/blob/master/_data/sidebars/tutorial_sidebar.yml) to add your tutorial permalink (defined in the heading of the `README.md` you created) to a fitting place, next to a similar tutorial. -4. Edit the [tutorials landing page](https://github.com/precice/precice.github.io/blob/master/content/tutorials/overview.md) to add your tutorial to the overview. +1. Add the tutorial's Hugo module mounts to `config/_default/module.toml`. +2. Add its permalink to a fitting place in the + [tutorials sidebar](https://github.com/precice/precice.github.io/blob/master/data/sidebars/tutorials_sidebar.yml), next to a similar tutorial. +3. Edit the [tutorials landing page](https://github.com/precice/precice.github.io/blob/master/content/tutorials/overview.md) to add the tutorial to the overview. After your PR gets reviewed, approved, and merged, the website will be built automatically, and your tutorial will appear online in a couple of minutes. @@ -236,13 +243,13 @@ You can pick up issues that you would like to work on from any repository you li Look for [contributing guidelines](https://github.com/precice/precice/blob/develop/docs/CONTRIBUTING.md) in each repository. The [developer documentation](dev-docs-overview.html) will also be useful. -{% tip %} +{{< tip >}} Read on our [Roadmap](fundamentals-roadmap.html) what is already in our to-do list before starting to write large parts of code. -{% endtip %} +{{< /tip >}} -{% tip %} +{{< tip >}} There are [guidelines for adapters](community-guidelines-adapters.html) and [guidelines for application cases](community-guidelines-application-cases.html). -{% endtip %} +{{< /tip >}} ## Helping other users diff --git a/content/community/contribute/open-projects.md b/content/community/contribute/open-projects.md index 6ceba073016..396af727c1e 100644 --- a/content/community/contribute/open-projects.md +++ b/content/community/contribute/open-projects.md @@ -4,6 +4,9 @@ keywords: contribute, GSoC, google summer of code, student summary: Open opportunities for contributing to preCICE toc: true permalink: community-contribute-open-projects.html +aliases: + - /community-contribute-open-projects.html + - /gsoc/ redirect_from: - /gsoc/ --- @@ -32,9 +35,9 @@ If you want to contribute with a student project (typically a thesis), see the [ This page highlights a few specific projects that are not directly suitable for a thesis ([thesis-suitable issues in the core library](https://github.com/precice/precice/issues?q=is%3Aissue%20state%3Aopen%20label%3Athesis)), but are also a bit more than a [good first issue](https://github.com/precice/precice/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22good%20first%20issue%22). Some of these projects we advertise publicly, in programs such as the Google Summer of Code. -{% tip %} +{{< tip >}} Are you looking for or offering a thesis / PhD / other related job? Have a look also at [our forum](https://precice.discourse.group/c/jobs/13). -{% endtip %} +{{< /tip >}} ## Google Summer of Code (GSoC) @@ -54,16 +57,16 @@ Additionally, show us what you have tried already (see "entry test" in each proj We will contact you via replies and/or private messages in the forum, to find out together if these topics are a good fit. You can alternatively ask quick questions in the [Matrix chat](https://matrix.to/#/#precice_lobby:gitter.im?web-instance[element.io]=app.gitter.im). Don't miss the [guidelines](#general-guidelines) at the bottom of this page. -{% important %} +{{< important >}} We are a small project, and we are experiencing a spike of activity, which is very difficult to review next to the usual work. Please do not ask whether you can work on an issue - not without details. If you find something interesting to you that you feel it is clear enough for you to contribute, go ahead and submit a PR. We value quality higher than quantity. If you find something interesting, take your time and focus on it. We expect to work with the accepted GSoC participants in the summer. Our capacity to review external contributions before that is very limited. -{% endimportant %} +{{< /important >}} -{% important %} +{{< important >}} We have already received too many pull requests in the period before proposals open. For this reason, we have now restricted interactions with the preCICE repositories to collaborators. If you have not reached out so far, chances for selection are very small. -{% endimportant %} +{{< /important >}} ### Submitting proposals diff --git a/content/community/contributors.md b/content/community/contributors.md index ecea076fa22..c87939de075 100644 --- a/content/community/contributors.md +++ b/content/community/contributors.md @@ -1,6 +1,8 @@ --- title: Contributors permalink: community-contributors.html +aliases: + - /community-contributors.html keywords: contributors, developers, maintainers summary: toc: true @@ -8,33 +10,7 @@ toc: true ## Maintainers -
    -{% assign dev_main = site.data.developer.main | sort: "name" %} -
    -
    -
      - {% for p in dev_main %} - -
      - {% if p.img %} - Portrait - {% endif %} -
      -
      -

      - {{ p.fullname }}
      - {{ p.institution }} -

      -
      -
        - {% if p.orcid %}
      • {% endif %} - {% if p.github %}
      • {% endif %} -
      - - {% endfor %} -
    -
    -
    +{{< developer_list group="main" >}} If you are interested in joining the team of preCICE maintainers, please [contact Benjamin Uekermann](https://www.ipvs.uni-stuttgart.de/departments/us3/). @@ -42,52 +18,10 @@ If you are interested in joining the team of preCICE maintainers, please [contac Previous maintainers and their affiliation at the time of their last significant contribution. -
    -{% assign dev_premain = site.data.developer.main-inactive | sort: "name" %} -
    -
    -
      - {% for p in dev_premain %} - -
      -

      - {{ p.fullname }}
      - {{ p.institution }} -

      -
      -
        - {% if p.orcid %}
      • {% endif %} - {% if p.github %}
      • {% endif %} -
      - - {% endfor %} -
    -
    -
    +{{< developer_list group="main-inactive" >}} ## Further contributors Previous contributors and their affiliation at the time of their last significant contribution. -
    -{% assign dev_contrib = site.data.developer.contributors | sort: "name" %} -
    -
    -
      - {% for p in dev_contrib %} - -
      -

      - {{ p.fullname }}
      - {{ p.institution }} -

      -
      -
        - {% if p.orcid %}
      • {% endif %} - {% if p.github %}
      • {% endif %} -
      - - {% endfor %} -
    -
    -
    +{{< developer_list group="contributors" >}} diff --git a/content/community/minisymposia/eccomas-congress-2022.md b/content/community/minisymposia/eccomas-congress-2022.md index d451f767d59..74d66236057 100644 --- a/content/community/minisymposia/eccomas-congress-2022.md +++ b/content/community/minisymposia/eccomas-congress-2022.md @@ -3,6 +3,8 @@ title: ECCOMAS Congress 2022 keywords: 2022, ECCOMAS, event, events, minisymposium summary: permalink: eccomas-congress-2022.html +aliases: + - /eccomas-congress-2022.html toc: false --- diff --git a/content/community/minisymposia/eccomas-coupled-2019.md b/content/community/minisymposia/eccomas-coupled-2019.md index 320c0bcaa7a..adafa1ec65a 100644 --- a/content/community/minisymposia/eccomas-coupled-2019.md +++ b/content/community/minisymposia/eccomas-coupled-2019.md @@ -3,6 +3,8 @@ title: ECCOMAS Coupled Problems 2019 keywords: 2019, ECCOMAS, COUPLED, event, events, minisymposium summary: permalink: eccomas-coupled-2019.html +aliases: + - /eccomas-coupled-2019.html toc: false --- diff --git a/content/community/minisymposia/eccomas-coupled-2021.md b/content/community/minisymposia/eccomas-coupled-2021.md index 405bed358db..8a06b1d3103 100644 --- a/content/community/minisymposia/eccomas-coupled-2021.md +++ b/content/community/minisymposia/eccomas-coupled-2021.md @@ -3,6 +3,8 @@ title: ECCOMAS Coupled Problems 2021 keywords: 2021, ECCOMAS, COUPLED, event, events, minisymposium summary: permalink: eccomas-coupled-2021.html +aliases: + - /eccomas-coupled-2021.html toc: false --- diff --git a/content/community/minisymposia/eccomas-coupled-2023.md b/content/community/minisymposia/eccomas-coupled-2023.md index 20598e20bac..5cd9413af4b 100644 --- a/content/community/minisymposia/eccomas-coupled-2023.md +++ b/content/community/minisymposia/eccomas-coupled-2023.md @@ -3,6 +3,8 @@ title: ECCOMAS Coupled Problems 2023 keywords: 2023, ECCOMAS, COUPLED, event, events, minisymposium summary: permalink: eccomas-coupled-2023.html +aliases: + - /eccomas-coupled-2023.html toc: false --- diff --git a/content/community/minisymposia/eccomas-coupled-2025.md b/content/community/minisymposia/eccomas-coupled-2025.md index 3c2af1fe02d..a42208e9cc8 100644 --- a/content/community/minisymposia/eccomas-coupled-2025.md +++ b/content/community/minisymposia/eccomas-coupled-2025.md @@ -3,6 +3,8 @@ title: ECCOMAS Coupled Problems 2025 keywords: 2025, ECCOMAS, COUPLED, event, events, minisymposium summary: permalink: eccomas-coupled-2025.html +aliases: + - /eccomas-coupled-2025.html toc: false --- diff --git a/content/community/minisymposia/eccomas-eccm-ecfd-2018.md b/content/community/minisymposia/eccomas-eccm-ecfd-2018.md index d400e778a56..99e92b546fd 100644 --- a/content/community/minisymposia/eccomas-eccm-ecfd-2018.md +++ b/content/community/minisymposia/eccomas-eccm-ecfd-2018.md @@ -3,6 +3,8 @@ title: ECCOMAS ECCM ECFD 2018 keywords: 2018, ECCOMAS, event, events, minisymposium summary: permalink: eccomas-eccm-ecfd-2018.html +aliases: + - /eccomas-eccm-ecfd-2018.html toc: false --- diff --git a/content/community/minisymposia/iacm-wccm-2024.md b/content/community/minisymposia/iacm-wccm-2024.md index a0acc671d92..fe35a79dc84 100644 --- a/content/community/minisymposia/iacm-wccm-2024.md +++ b/content/community/minisymposia/iacm-wccm-2024.md @@ -3,6 +3,8 @@ title: iacm WCCM 2024 keywords: 2024, IACM, ECCOMAS, WCCM, event, events, minisymposium summary: permalink: iacm-wccm-2024.html +aliases: + - /iacm-wccm-2024.html toc: false --- diff --git a/content/community/minisymposia/wccm-2021.md b/content/community/minisymposia/wccm-2021.md index 8f62ac72e68..5e844c64751 100644 --- a/content/community/minisymposia/wccm-2021.md +++ b/content/community/minisymposia/wccm-2021.md @@ -3,6 +3,8 @@ title: ECCOMAS WCCM 2020 keywords: 2020, WCCM, ECCOMAS, event, events, minisymposium summary: permalink: community-events-wccm-eccomas-2020.html +aliases: + - /community-events-wccm-eccomas-2020.html toc: false --- @@ -14,9 +16,9 @@ The [ECCOMAS WCCM 2020](https://web.archive.org/web/20201203110253/https://www.w Thanks to the WCCM organizers, authors were given access to their recorded talks to be shared with the public. The links of the titles below lead to the recordings on SlideLive. -{% note %} +{{< note >}} If you gave a talk at the minisymposium, please contact us and we will include it in the list! -{% endnote %} +{{< /note >}} - 2067 - [An Introduction to the preCICE Coupling Library](https://slideslive.com/38944676) by Gerasimos Chourdakis - 2340 - [Adaptive Dynamic Meshes for Fully-Parallel Partitioned Multi-Physics in preCICE](https://slideslive.com/38944678) by Frédéric Simonis diff --git a/content/community/minisymposia/wccomas-wccm-2026.md b/content/community/minisymposia/wccomas-wccm-2026.md index 3c49e68512d..d890e30a0fc 100644 --- a/content/community/minisymposia/wccomas-wccm-2026.md +++ b/content/community/minisymposia/wccomas-wccm-2026.md @@ -3,6 +3,8 @@ title: ECCOMAS WCCM 2026 keywords: 2026, ECCOMAS, WCCM, event, events, minisymposium summary: permalink: eccomas-wccm-2026.html +aliases: + - /eccomas-wccm-2026.html toc: false --- diff --git a/content/community/overview.md b/content/community/overview.md index 47116813b8c..eaf2de3144f 100644 --- a/content/community/overview.md +++ b/content/community/overview.md @@ -1,19 +1,21 @@ --- title: Become part of the preCICE community permalink: community.html +aliases: + - /community.html keywords: summary: toc: false editme: true --- -preCICE Workshop banner +preCICE Workshop banner ## preCICE workshops Do you want to meet the community and learn what is new in preCICE? There is no better way than to join [one of our workshops](precice-workshop.html) or [trainings](community-training.html)! -preCICE Workshop group picture +preCICE Workshop group picture ## The preCICE forum @@ -30,12 +32,7 @@ There are different ways how to support preCICE and get priority support from th We have compiled a community showcase with several of the most impressive preCICE implementations. The range of application fields is diverse, including e.g. simulating the [temperatures on the moon](community-projects.html#simulation-of-temperatures-on-the-moon-with-thermos), the [biomechanics of the heart valve](community-projects.html#evaluation-of-heart-valve-biomechanics), [modelling wind in urban areas](community-projects.html#hybrid-simulation-methods-for-wind-modelling-in-urban-areas), and simulating [high impact loads on structures](community-projects.html#fsi-simulations-of-high-impact-loads-on-structures). You can find many more use cases on the [community stories page](community-projects.html). -{% assign testimonials = site.testimonials | reverse %} -{%- for testimonial in testimonials -%} -{%- if testimonial.img -%} -Overview of preCICE user stories -{%- endif -%} -{% endfor %} +{{< testimonial_avatars >}} ## Contributions to preCICE @@ -43,4 +40,4 @@ Since its first commit in 2008, preCICE has been developed by three generations Some of the people that have significantly contributed to repositories of preCICE on GitHub (arbitrary order): -{% include community_spotlight.html %} +{{< community_spotlight >}} diff --git a/content/community/projects.md b/content/community/projects.md index 1e959e9f846..998d7dbc1c4 100644 --- a/content/community/projects.md +++ b/content/community/projects.md @@ -1,6 +1,9 @@ --- title: Community stories permalink: community-projects.html +aliases: + - /community-projects.html + - /testimonials/ keywords: summary: toc: true @@ -8,37 +11,15 @@ redirect_from: /testimonials/ editme: false --- -{{site.data.alerts.note}} +{{< note >}} Do you use preCICE? We are always happy to hear about interesting projects that use preCICE. To add your project here, just fill the form and we will take care of the rest. -If you prefer, you can directly create a pull request to the website repository on GitHub (it is easy also if you don't yet have any GitHub experience!). A copy of a previous testimonial is a great starting point. Adjust it to your liking, and add a picture. +If you prefer, you can directly create a pull request to the website repository on GitHub (it is easy also if you don't yet have any GitHub experience!). A copy of a previous testimonial is a great starting point. Adjust it to your liking, and add a picture. A good example is this pull request.
    -{{site.data.alerts.end}} +{{< /note >}}
    -{% assign testimonials = site.testimonials | reverse %} -{% for testimonial in testimonials %} - -

    {{ testimonial.title }}

    - -
    -
    - -{{ testimonial.content }} -—**[{{ testimonial.author }}]({{ testimonial.author_link }})** -{{ testimonial.organisation }} - -
    -
    - -
    -{{ testimonial.title }} -
    {{ testimonial.title }}
    -
    - -
    -
    -{% endfor %} +{{< testimonials >}}
    diff --git a/content/community/support-precice.md b/content/community/support-precice.md index 4e7e128778c..8a05c9de89d 100644 --- a/content/community/support-precice.md +++ b/content/community/support-precice.md @@ -1,6 +1,8 @@ --- title: You support preCICE – preCICE supports you permalink: community-support-precice.html +aliases: + - /community-support-precice.html keywords: support, priority support, private support, research project, industry, commercial, license, contracting, sub-contracting, service level agreement, NDA, price, on-site meeting, training summary: Support preCICE to help the software remain and grow. In return, the preCICE team supports your work. There are three different variants for such a collaboration. toc: true diff --git a/content/community/training.md b/content/community/training.md index eb762f12d80..511e25c8c2c 100644 --- a/content/community/training.md +++ b/content/community/training.md @@ -3,6 +3,8 @@ title: preCICE training keywords: workshop, teaching, support, api, implicit coupling, tools, data mapping, training summary: A hands-on introduction to preCICE, recommended for new users that want to learn how to couple their own codes and beyond. permalink: community-training.html +aliases: + - /community-training.html toc: true --- @@ -27,43 +29,43 @@ We regularly add new modules - don't hesitate to let us know if you would have a We couple two simple Python codes, discussing the basic methods of the preCICE API. -![Basics training: Configuration](images/training/training-basics.png) +![Basics training: Configuration](/images/training/training-basics.png) ### Tools We take a tour over available tools to configure, understand, and post-process preCICE simulations. More specifically, we have a look at the preCICE logger, config visualizer, mesh exports, and watchpoints of preCICE. We also discuss common tips for visualizing partitioned simulations in ParaView. -![Basics training: Tools](images/training/training-tools.png) +![Basics training: Tools](/images/training/training-tools.png) ### Implicit coupling We use a conjugate heat transfer scenario coupling OpenFOAM with Nutils to study implicit coupling, including acceleration methods. -![Basics training: Implicit coupling](images/training/training-implicit-coupling.png) +![Basics training: Implicit coupling](/images/training/training-implicit-coupling.png) ### Data mapping We explore aspects of accuracy and efficiency in data mapping, using [ASTE](tooling-aste.html). -![Basics training: Mapping](images/training/training-mapping.png) +![Basics training: Mapping](/images/training/training-mapping.png) ### Workflow for FSI simulations In this [community-contributed part of the course](https://github.com/precice/community-training/tree/main/fsi-workflow), we are going step by step through the process of creating a fluid-structure interaction simulation coupling CalculiX and OpenFOAM. We start by creating the meshes for both solvers, using FreeCAD and snappyHexMesh. We then setup and run single-physics simulations, before we couple them. -![Application training: FSI workflow](images/training/training-fsi.png) +![Application training: FSI workflow](/images/training/training-fsi.png) ### Parallelization and HPC workflows We parallelize the same Python codes used in the Basics module, we analyze the performance-related events, run partitioned simulations in parallel on SLURM-enabled systems, and look deeper into common performance-related pitfalls. -![HPC training: Tracing](images/training/training-hpc.png) +![HPC training: Tracing](/images/training/training-hpc.png) ### Macro-micro coupling We couple many micro simulations to a macro simulation: We use the [Micro Manager](tooling-micro-manager-overview.html) to set up Python and C++ micro simulations, learn how manage runtime using adaptivity, implement model adaptivity, and run the micro simulations in parallel with adaptivity and load balancing. -![Macro-Micro training: Adaptivity](images/training/training-mm.png) +![Macro-Micro training: Adaptivity](/images/training/training-mm.png) ## How to prepare? @@ -73,19 +75,19 @@ You can either (a) use a prepared system image that we provide (a virtual machin To reduce system-related friction during the training, we recommend starting with option (a). On virtual trainings, that is a VM image; on in-person trainings, that might be a bootable live USB. -{% important %} +{{< important >}} Before the training, verify your installation, and contact us as soon as possible regarding any issues. For example, try running the [elastic-tube-1d Python tutorial](tutorials-elastic-tube-1d.html) (check if it is already under `~/tutorials/`). -{% endimportant %} +{{< /important >}} ### Provided virtual machine image Close to the training start, you will receive instructions with a link to an up-to-date provided VM image, very similar to the [demo VM](installation-vm.html). We typically provide a [Vagrant](https://developer.hashicorp.com/vagrant) box made for [VirtualBox](https://www.virtualbox.org/). -{% note %} +{{< note >}} At the moment, this modified Ubuntu image is only available for Intel/AMD x86-64 CPUs. -{% endnote %} +{{< /note >}} System requirements: ideally 25GB of free storage, 8GB of RAM, and more than 4 CPU cores. By default, the VM is configured with 4GB of RAM and 4 CPU cores, both configurable. @@ -97,9 +99,9 @@ In our on-site trainings, some bootable USB sticks are provided, based on the Ub allowing you to work on a temporary live session, without installing anything on your system. These should work on any laptop with an x86-64 CPU, as long as you have the rights to boot from USB. In particular, these do not work on Apple Silicon systems. -{% important %} +{{< important >}} If you use a bootable USB, make sure to select trying a live session, and not installing (or take care that you do not remove your data). -{% endimportant %} +{{< /important >}} Notes: diff --git a/content/community/trainings/2026-10.md b/content/community/trainings/2026-10.md index a4a0b83216d..7189ad87666 100644 --- a/content/community/trainings/2026-10.md +++ b/content/community/trainings/2026-10.md @@ -3,10 +3,12 @@ title: preCICE online training 2026 keywords: precice training 2026, event, events, training summary: permalink: precice-online-training-2026-oct.html +aliases: + - /precice-online-training-2026-oct.html toc: false --- -preCICE training banner +preCICE training banner In October 5-9, 2026, we are organizing the first online preCICE training, mainly targeting participants in the US, Canada, and Latin America (time: 12–3 pm EDT (UTC-4)) that cannot easily travel to the [preCICE Workshop](precice-workshop.html) – with the [next workshop being in March 2027](precice-workshop-2027.html). Over the span of one week, the training will include elements of the longer [training course](community-training.html) of the preCICE Workshop, invited talks, and news from the preCICE developers. @@ -54,7 +56,7 @@ We are preparing an interactive online event with 3h slots over a week. Prelimin Feel free to use [this advertising material](https://ipvscloud.informatik.uni-stuttgart.de/s/5tMqRPek4MKq9F9). Did you know? Many past participants only discovered this workshop via a direct email. -preCICE online training advertising slide (png thumbnail) +preCICE online training advertising slide (png thumbnail) + + + + +

    Redirecting…

    + Click here if you are not redirected. + +{{- else }} +{{- if eq (site.Params.output | default "web") "pdf" }} + + {{ partial "head_print.html" . }} + + + + +{{- else }} + + {{ partial "head.html" . }} + + +
    + {{ partial "topnav.html" . }} + {{ partial "news_banner.html" (dict "page" . "onlanding" .IsHome) }} +
    + + {{- $isLanding := or .IsHome (eq .Layout "landing_page") -}} + {{- if $isLanding }} +
    + {{ block "main" . }}{{ end }} +
    + {{- else }} + {{- $hideSidebar := eq (.Param "hide_sidebar") true -}} +
    + {{ if $hideSidebar }} +
    + {{ block "main" . }}{{ end }} +
    + {{ else }} +
    + +
    + {{ block "main" . }}{{ end }} +
    +
    + {{ end }} +
    + {{- end }} + + {{ partial "footer.html" . }} + {{ partial "scroll_to_top.html" . }} + + + + {{ if .IsHome }} + + + {{ end }} + + +{{- end }} +{{- end }} + diff --git a/layouts/_default/default_print.html b/layouts/_default/default_print.html new file mode 100644 index 00000000000..ff6360f6c26 --- /dev/null +++ b/layouts/_default/default_print.html @@ -0,0 +1,13 @@ + + + + {{ partial "head_print.html" . }} + + + + + diff --git a/layouts/_default/list.html b/layouts/_default/list.html new file mode 100644 index 00000000000..cd3ace728ed --- /dev/null +++ b/layouts/_default/list.html @@ -0,0 +1,48 @@ +{{ define "main" }} +{{ if eq (site.Params.output | default "web") "pdf" }} +
    +
    +

    {{ .Title }}

    +
    + + {{ with .Params.summary }} +
    {{ . | markdownify }}
    + {{ end }} + + {{ partial "toc.html" . }} + + {{ partial "compat_content.html" . }} +
    +{{ else }} +
    +
    +

    {{ .Title }}

    +
    + + {{ with .Params.summary }} +
    {{ . | markdownify }}
    + {{ end }} + +
    +
    + {{ partial "toc.html" . }} +
    +
    + {{ partial "edit_button.html" . }} +
    +
    + + {{ partial "compat_content.html" . }} + + {{ with .Params.tags }} +
    + Tags: + {{ range . }} + {{ . }} + {{ end }} +
    + {{ end }} + {{ partial "breadcrumb.html" . }} +
    +{{ end }} +{{ end }} diff --git a/layouts/_default/none.html b/layouts/_default/none.html new file mode 100644 index 00000000000..28c1aa052bd --- /dev/null +++ b/layouts/_default/none.html @@ -0,0 +1 @@ +{{ partial "compat_content.html" . }} diff --git a/layouts/_default/page.html b/layouts/_default/page.html new file mode 100644 index 00000000000..451eb748a1c --- /dev/null +++ b/layouts/_default/page.html @@ -0,0 +1,48 @@ +{{ define "main" }} +{{ if eq (site.Params.output | default "web") "pdf" }} +
    +
    +

    {{ .Title }}

    +
    + + {{ with .Params.summary }} +
    {{ . | markdownify }}
    + {{ end }} + + {{ partial "toc.html" . }} + + {{ partial "compat_content.html" . }} +
    +{{ else }} +
    +
    +

    {{ .Title }}

    +
    + + {{ with .Params.summary }} +
    {{ . | markdownify }}
    + {{ end }} + +
    +
    + {{ partial "toc.html" . }} +
    +
    + {{ partial "edit_button.html" . }} +
    +
    + + {{ partial "compat_content.html" . }} + + {{ with .Params.tags }} +
    + Tags: + {{ range . }} + {{ . }} + {{ end }} +
    + {{ end }} + {{ partial "breadcrumb.html" . }} +
    +{{ end }} +{{ end }} diff --git a/layouts/_default/page_print.html b/layouts/_default/page_print.html new file mode 100644 index 00000000000..e4f50bd7e0d --- /dev/null +++ b/layouts/_default/page_print.html @@ -0,0 +1,22 @@ + + + + {{ partial "head_print.html" . }} + + + + + diff --git a/layouts/_default/single.html b/layouts/_default/single.html new file mode 100644 index 00000000000..451eb748a1c --- /dev/null +++ b/layouts/_default/single.html @@ -0,0 +1,48 @@ +{{ define "main" }} +{{ if eq (site.Params.output | default "web") "pdf" }} +
    +
    +

    {{ .Title }}

    +
    + + {{ with .Params.summary }} +
    {{ . | markdownify }}
    + {{ end }} + + {{ partial "toc.html" . }} + + {{ partial "compat_content.html" . }} +
    +{{ else }} +
    +
    +

    {{ .Title }}

    +
    + + {{ with .Params.summary }} +
    {{ . | markdownify }}
    + {{ end }} + +
    +
    + {{ partial "toc.html" . }} +
    +
    + {{ partial "edit_button.html" . }} +
    +
    + + {{ partial "compat_content.html" . }} + + {{ with .Params.tags }} +
    + Tags: + {{ range . }} + {{ . }} + {{ end }} +
    + {{ end }} + {{ partial "breadcrumb.html" . }} +
    +{{ end }} +{{ end }} diff --git a/layouts/_markup/render-image.html b/layouts/_markup/render-image.html new file mode 100644 index 00000000000..ef2279078a7 --- /dev/null +++ b/layouts/_markup/render-image.html @@ -0,0 +1,9 @@ +{{- $destination := .Destination -}} +{{- $resource := .Page.Resources.GetMatch .Destination -}} +{{- if not $resource -}} + {{- $resource = .Page.CurrentSection.Resources.GetMatch .Destination -}} +{{- end -}} +{{- with $resource -}} + {{- $destination = .RelPermalink -}} +{{- end -}} +{{ .Text }} diff --git a/layouts/_markup/render-link.html b/layouts/_markup/render-link.html new file mode 100644 index 00000000000..9a4ca821c57 --- /dev/null +++ b/layouts/_markup/render-link.html @@ -0,0 +1,44 @@ +{{- $destination := .Destination -}} +{{- $fragment := "" -}} +{{- if in $destination "#" -}} + {{- $parts := split $destination "#" -}} + {{- $destination = index $parts 0 -}} + {{- $fragment = index $parts 1 -}} +{{- end -}} + +{{- $isExternal := or (hasPrefix $destination "http://") (hasPrefix $destination "https://") (hasPrefix $destination "mailto:") (hasPrefix $destination "ftp://") -}} +{{- $isAnchorOnly := and (eq $destination "") (ne $fragment "") -}} + +{{- $href := .Destination -}} +{{- $isInternal := false -}} + +{{- if $isAnchorOnly -}} + {{- $href = printf "#%s" $fragment -}} + {{- $isInternal = true -}} +{{- else if not $isExternal -}} + {{- $targetPage := false -}} + {{- if ne $destination "" -}} + {{- $targetPage = .Page.GetPage $destination -}} + {{- if not $targetPage -}} + {{- $targetPage = partial "pdf/page-for-url.html" (dict "site" .Page.Site "url" $destination) -}} + {{- end -}} + {{- end -}} + {{- with $targetPage -}} + {{- $isInternal = true -}} + {{- if ne $fragment "" -}} + {{- $href = printf "%s#%s" .Permalink $fragment -}} + {{- else -}} + {{- $href = .Permalink -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- $classes := slice -}} +{{- if $isInternal -}} + {{- $classes = $classes | append "internal-link" -}} +{{- end -}} +{{- if or (strings.Contains .Text "{{ .Text | safeHTML }} diff --git a/layouts/index.algolia.json b/layouts/index.algolia.json new file mode 100644 index 00000000000..a292d4930e3 --- /dev/null +++ b/layouts/index.algolia.json @@ -0,0 +1,31 @@ +{{- $pages := slice -}} +{{- range site.Pages -}} + {{- if and (or (eq .Kind "page") (eq .Kind "section")) (ne (.Param "search") "exclude") -}} + {{- $pages = $pages | append . -}} + {{- end -}} +{{- end -}} +{{- $pages = sort $pages "RelPermalink" -}} +{ + "schemaVersion": 1, + "nodesToIndex": {{ site.Params.algolia.nodes_to_index | jsonify }}, + "maxRecordSize": {{ site.Params.algolia.max_record_size }}, + "pages": [ + {{- range $index, $page := $pages }} + {{- if $index }},{{ end }} + {{- /* Keep the search export on the same rendered-content path as page layouts. */ -}} + {{- $content := partial "compat_content.html" $page -}} + { + "title": {{ $page.Title | jsonify }}, + "url": {{ $page.RelPermalink | jsonify }}, + "html": {{ $content | jsonify }}, + "plain": {{ $content | plainify | jsonify }}, + "section": {{ $page.Section | jsonify }}, + "kind": {{ $page.Kind | jsonify }}, + "tags": {{ $page.Params.tags | jsonify }}, + "categories": {{ $page.Params.categories | jsonify }}, + "keywords": {{ $page.Params.keywords | jsonify }}, + "date": {{ if ne ($page.Lastmod.Format "2006") "0001" }}{{ $page.Lastmod.Unix }}{{ else }}null{{ end }} + } + {{- end }} + ] +} diff --git a/content/index.html b/layouts/index.html similarity index 86% rename from content/index.html rename to layouts/index.html index 439df6a8276..0243ecdc375 100644 --- a/content/index.html +++ b/layouts/index.html @@ -1,19 +1,14 @@ ---- -title: preCICE - The Coupling Library -permalink: index.html -keywords: -toc: false -hide_sidebar: true -layout: landing_page -topnav: topnav ---- +{{ define "main" }} +{{- $params := site.Params -}} +{{- $preciceVersion := $params.precice_version -}} +{{- $preciceReleaseURL := printf "https://github.com/precice/precice/releases/tag/v%s" $preciceVersion -}}
    -

    Welcome to preCICE

    +

    Welcome to preCICE

    The coupling library for partitioned multi-physics simulations.

    @@ -21,7 +16,7 @@

    The coupling library for partitioned multi-physic - Latest v{{ site.precice_version }}   + Latest v{{ $preciceVersion }}   Get started  

    @@ -39,7 +34,7 @@

    The coupling library for partitioned multi-physic

    - visualisation of how preCICE couples different solvers + visualisation of how preCICE couples different solvers
    @@ -78,7 +73,7 @@

    Prepared for the next generation of multi-physics sim
    - non-invasive integration + non-invasive integration
    @@ -95,7 +90,7 @@

    Prepared for the next generation of multi-physics sim

    - Coupling of programs + Coupling of programs
    @@ -112,7 +107,7 @@

    Prepared for the next generation of multi-physics sim

    - numerical methods + numerical methods
    @@ -129,7 +124,7 @@

    Prepared for the next generation of multi-physics sim

    - scalability + scalability
    @@ -163,7 +158,7 @@

    Ready-to-use with your favourite open-source solver
    - openFOAM logo + openFOAM logo

    OpenFOAM  

    @@ -173,7 +168,7 @@

    Ready-to-use with your favourite open-source solver
    - CalculiX logo + CalculiX logo

    CalculiX  

    @@ -183,7 +178,7 @@

    Ready-to-use with your favourite open-source solver
    - FEniCS logo + FEniCS logo

    FEniCS  

    @@ -193,7 +188,7 @@

    Ready-to-use with your favourite open-source solver
    - deal.II logo + deal.II logo

    deal.II  

    @@ -203,7 +198,7 @@

    Ready-to-use with your favourite open-source solver
    - Nutils logo + Nutils logo

    Nutils  

    @@ -236,7 +231,7 @@

    What our community is saying

    We are using preCICE as it can handle numerical simulations of large sizes with ease as opposed to previous in-house couplers.

    - simulation biomechanics + simulation biomechanics

    —Kyle Davis

    University of the Free State, Department of Cardiothoracic Surgery, South Africa

    @@ -248,7 +243,7 @@

    What our community is saying

    The large number of coupling functionalities in preCICE gives the user the opportunity to build advanced and scalable simulations with ease.

    - simulation aerodynamics + simulation aerodynamics

    —Derek Risseeuw

    Aerodynamics, Faculty of Aerospace Engineering, TU Delft, The Netherlands

    @@ -260,7 +255,7 @@

    What our community is saying

    @@ -366,7 +361,7 @@

    Join the community!

    The quarterly preCICE newsletter - {% include newsletter.html %} + {{ partial "newsletter.html" . }}
    @@ -395,7 +390,7 @@

    You support preCICE – preCICE supports you

    - precice support program logo + precice support program logo
    @@ -476,26 +471,8 @@

    Tried and tested by a global community

    - - {% assign logowall = site.data.logowall %} -
    - {% for row in logowall %} - {% for column in row.columns %} - {% for logo in column.logos %} - - {% endfor %} - {% endfor %} - {% endfor %} -
    + + {{ partial "logowall.html" . }}
    Explore the preCICE community   @@ -540,3 +517,4 @@

    How does it look like?

    +{{ end }} diff --git a/layouts/index.pdfappendixpart.html b/layouts/index.pdfappendixpart.html new file mode 100644 index 00000000000..758d6df3b57 --- /dev/null +++ b/layouts/index.pdfappendixpart.html @@ -0,0 +1 @@ +{{ partial "pdf/appendix-part.html" . }} diff --git a/layouts/index.pdfdocspart.html b/layouts/index.pdfdocspart.html new file mode 100644 index 00000000000..f37042654a9 --- /dev/null +++ b/layouts/index.pdfdocspart.html @@ -0,0 +1 @@ +{{ partial "pdf/docs-part.html" . }} diff --git a/layouts/index.pdftitle.html b/layouts/index.pdftitle.html new file mode 100644 index 00000000000..294dbba61fe --- /dev/null +++ b/layouts/index.pdftitle.html @@ -0,0 +1 @@ +{{ partial "pdf/title.html" . }} diff --git a/layouts/index.pdftoc.html b/layouts/index.pdftoc.html new file mode 100644 index 00000000000..64f164e166e --- /dev/null +++ b/layouts/index.pdftoc.html @@ -0,0 +1 @@ +{{ partial "pdf/toc.html" . }} diff --git a/layouts/index.pdftutorialspart.html b/layouts/index.pdftutorialspart.html new file mode 100644 index 00000000000..c0eeb57c2a9 --- /dev/null +++ b/layouts/index.pdftutorialspart.html @@ -0,0 +1 @@ +{{ partial "pdf/tutorials-part.html" . }} diff --git a/layouts/index.princelist.txt b/layouts/index.princelist.txt new file mode 100644 index 00000000000..e832c680d4d --- /dev/null +++ b/layouts/index.princelist.txt @@ -0,0 +1 @@ +{{ partial "pdf/prince-list.txt" . }} diff --git a/layouts/partials/alert.html b/layouts/partials/alert.html new file mode 100644 index 00000000000..3b1cdc3dd45 --- /dev/null +++ b/layouts/partials/alert.html @@ -0,0 +1,7 @@ +{{- $kind := .kind | default "note" -}} +{{- $content := .content | default "" -}} +{{- $page := .page | default page -}} +{{- $class := dict "note" "info" "warning" "danger" "tip" "success" "important" "warning" "experimental" "warning" "disclaimer" "info" "version" "info" -}} +{{- $icon := dict "note" "fa fa-info-circle" "warning" "fas fa-exclamation-circle" "tip" "fa fa-check-square" "important" "fas fa-exclamation-triangle" "experimental" "fas fa-flask" "disclaimer" "fa fa-hands-wash" "version" "fas fa-tag" -}} +{{- $label := dict "note" "Note" "warning" "Warning" "tip" "Tip" "important" "Important" "experimental" "Experimental" "disclaimer" "Disclaimer" "version" "Version" -}} + diff --git a/layouts/partials/algolia.html b/layouts/partials/algolia.html new file mode 100644 index 00000000000..d480aee9c62 --- /dev/null +++ b/layouts/partials/algolia.html @@ -0,0 +1,130 @@ +{{- $algolia := site.Params.algolia -}} +{{- if $algolia }} + +{{- end }} diff --git a/layouts/partials/breadcrumb.html b/layouts/partials/breadcrumb.html new file mode 100644 index 00000000000..7b0c5a4d91c --- /dev/null +++ b/layouts/partials/breadcrumb.html @@ -0,0 +1,35 @@ +{{- $topnavKey := .Param "topnav" | default "topnav" -}} +{{- $topnav := index hugo.Data $topnavKey | default hugo.Data.topnav -}} +{{- $sectionTitle := "" -}} +{{- $sectionURL := "" -}} +{{- range $entry := $topnav.topnav -}} + {{- range $item := $entry.items -}} + {{- $sectionSidebar := printf "%s_sidebar" ($item.section | default "") -}} + {{- if or (and $item.url (in $.RelPermalink $item.url)) (eq ($.Param "sidebar") $sectionSidebar) (and $item.section (eq $.Section $item.section)) -}} + {{- $sectionTitle = $item.title -}} + {{- $sectionURL = $item.url -}} + {{- end -}} + {{- end -}} +{{- end -}} + diff --git a/layouts/partials/callout.html b/layouts/partials/callout.html new file mode 100644 index 00000000000..58a97773940 --- /dev/null +++ b/layouts/partials/callout.html @@ -0,0 +1,4 @@ +{{- $type := .type | default "default" -}} +{{- $content := .content | default "" -}} +{{- $page := .page | default page -}} +
    {{ $page.RenderString $content }}
    diff --git a/layouts/partials/community_spotlight.html b/layouts/partials/community_spotlight.html new file mode 100644 index 00000000000..c3c297cc87d --- /dev/null +++ b/layouts/partials/community_spotlight.html @@ -0,0 +1,26 @@ + + +{{- $core := slice -}} +{{- with hugo.Data.developer.leads }}{{ $core = $core | append . }}{{ end -}} +{{- with hugo.Data.developer.main }}{{ $core = $core | append . }}{{ end -}} +{{- with (index hugo.Data.developer "main-inactive") }}{{ $core = $core | append . }}{{ end -}} +{{- with hugo.Data.developer.contributors }}{{ $core = $core | append . }}{{ end -}} +{{- $shown := "," -}} +{{- $avatarCount := 0 -}} +{{- $maxAvatars := 99 -}} + +
    +
    + {{ range $person := $core }} + {{- $github := $person.github | default "" -}} + {{- $needle := printf ",%s," $github -}} + {{- if and $github (lt $avatarCount $maxAvatars) (not (in $shown $needle)) -}} + + {{ $person.fullname }} + + {{- $shown = printf "%s%s," $shown $github -}} + {{- $avatarCount = add $avatarCount 1 -}} + {{- end -}} + {{ end }} +
    +
    diff --git a/layouts/partials/compat_content.html b/layouts/partials/compat_content.html new file mode 100644 index 00000000000..d4e7e1e7c24 --- /dev/null +++ b/layouts/partials/compat_content.html @@ -0,0 +1,32 @@ +{{/* +TODO: Remove this temporary compatibility layer once imported repositories use +Hugo shortcodes directly instead of legacy Jekyll/Liquid syntax. +*/}} +{{- $rendered := .Content -}} +{{- $raw := .RawContent -}} +{{- if or (strings.Contains $raw "{%") (strings.Contains $raw "{{ site.") (strings.Contains $raw "{{site.") (strings.Contains $raw "{:.") -}} + {{- $content := $raw -}} + {{- $blockTags := slice "disclaimer" "experimental" "important" "note" "tip" "version" "warning" -}} + + {{- /* Strip legacy Kramdown attribute lists such as {:.no-icon} */ -}} + {{- $content = replaceRE `\{:\.[^}]+\}` `` $content -}} + + {{- /* Translate the legacy Jekyll callouts into the existing Hugo shortcodes. */ -}} + {{- range $tag := $blockTags -}} + {{- $openPattern := printf `{%%[[:space:]]*%s[[:space:]]*%%}` $tag -}} + {{- $closePattern := printf `{%%[[:space:]]*end%s[[:space:]]*%%}` $tag -}} + {{- $content = replaceRE $openPattern (printf `{{< %s >}}` $tag) $content -}} + {{- $content = replaceRE $closePattern (printf `{{< /%s >}}` $tag) $content -}} + {{- end -}} + + {{- /* The imported documentation uses only note and warning inline includes. */ -}} + {{- $content = replaceRE `{%[[:space:]]*include[[:space:]]+(note|warning)\.html[[:space:]]+content="([^"]*)"[[:space:]]*%}` `{{< ${1} >}}${2}{{< /${1} >}}` $content -}} + {{- $content = replaceRE `{{[[:space:]]*site\.([A-Za-z_][A-Za-z0-9_]*)[[:space:]]*}}` `{{< site_param "${1}" >}}` $content -}} + + {{- if eq .RelPermalink "/docs/adapters/fenics/" -}} + {{- $content = replaceRE `(?s)## How to cite.*\z` `{{< fenics_publications >}}` $content -}} + {{- end -}} + + {{- $rendered = .RenderString (dict "display" "block") $content -}} +{{- end -}} +{{- $rendered -}} diff --git a/layouts/partials/developer_list.html b/layouts/partials/developer_list.html new file mode 100644 index 00000000000..d9e4ff14217 --- /dev/null +++ b/layouts/partials/developer_list.html @@ -0,0 +1,31 @@ +{{- $group := .group -}} +{{- $people := index hugo.Data.developer $group -}} +{{- with $people }} +
    +
    +
      + {{- range $index, $person := sort . "name" }} + + {{- if eq $group "main" }} + {{- with $person.img }} +
      + Portrait +
      + {{- end }} + {{- end }} +
      +

      + {{ $person.fullname }}
      + {{ $person.institution }} +

      +
      +
        + {{- with $person.orcid }}
      • {{ end }} + {{- with $person.github }}
      • {{ end }} +
      + + {{- end }} +
    +
    +
    +{{- end }} diff --git a/layouts/partials/disclaimer.html b/layouts/partials/disclaimer.html new file mode 100644 index 00000000000..8179e5b45cb --- /dev/null +++ b/layouts/partials/disclaimer.html @@ -0,0 +1 @@ +{{ partial "alert.html" (dict "kind" "disclaimer" "content" (.content | default "") "page" (.page | default .)) }} diff --git a/layouts/partials/edit_button.html b/layouts/partials/edit_button.html new file mode 100644 index 00000000000..59d2f51e457 --- /dev/null +++ b/layouts/partials/edit_button.html @@ -0,0 +1,44 @@ +{{- if ne (.Param "editme") false -}} + {{- $filePath := "" -}} + {{- $sourcePath := "" -}} + {{- with .File -}} + {{- $filePath = .Path -}} + {{- $filename := replace .Filename "\\" "/" -}} + {{- $sourcePath = replaceRE `^.*/(content|imported)/` `$1/` $filename -}} + {{- $sourcePath = replaceRE `^.*/pkg/mod/(github\.com/[^/]+/[^/@]+)(@[^/]+)?/(.*)$` `$1/$3` $sourcePath -}} + {{- if eq $sourcePath $filename -}} + {{- $sourcePath = replaceRE `^.*/([^/]+\.[^/.]+)$` `$1` $filename -}} + {{- end -}} + {{- if eq $sourcePath "" -}} + {{- $sourcePath = $filePath -}} + {{- end -}} + {{- end -}} + {{- $editBase := site.Params.github_editme_path -}} + {{- $editPath := $sourcePath -}} + + {{- range $prefix, $base := site.Params.github_editme_paths -}} + {{- if hasPrefix $sourcePath (printf "%s/" $prefix) -}} + {{- $editBase = $base -}} + {{- if ne $prefix "content" -}} + {{- $editPath = strings.TrimPrefix (printf "%s/" $prefix) $sourcePath -}} + {{- end -}} + {{- end -}} + {{- end -}} + + {{- with .Params.github_editme_path -}} + {{- $editBase = . -}} + {{- end -}} + + {{- if and $editBase $editPath -}} + + {{- end -}} +{{- end -}} diff --git a/layouts/partials/fenics_publications.html b/layouts/partials/fenics_publications.html new file mode 100644 index 00000000000..406a603e8a9 --- /dev/null +++ b/layouts/partials/fenics_publications.html @@ -0,0 +1,16 @@ +{{/* +TODO: Replace this adapter-specific compatibility partial with shared publication +rendering once imported repositories expose their publication sections in native +Hugo markup. It currently renders the legacy FEniCS publication loop. +*/}} +{{- $title := "FEniCS–preCICE: Coupling FEniCS to other simulation software" -}} +{{- $publications := where site.RegularPages "Section" "publications" -}} +{{- $citation := where $publications "Title" $title -}} + +

    How to cite

    +{{- with index $citation 0 -}} + {{- partial "publication_panel.html" (dict "pub" . "flexible" true) -}} +{{- end -}} + +

    Related literature

    +{{- partial "publications_by_tag.html" (dict "tag" "fenics") -}} diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html new file mode 100644 index 00000000000..be793a0cc36 --- /dev/null +++ b/layouts/partials/footer.html @@ -0,0 +1,50 @@ + diff --git a/layouts/partials/funding.html b/layouts/partials/funding.html new file mode 100644 index 00000000000..7ee143b956a --- /dev/null +++ b/layouts/partials/funding.html @@ -0,0 +1,25 @@ +
    + {{- range hugo.Data.funding }} +
    +
    +
    + + {{ .title }} + +
    +
    + + {{ .alt | default + +
    +
    + {{- with .description }}

    {{ . }}

    {{ end }} + {{- with .number }}

    Funding number: {{ . }}

    {{ end }} + {{- with .period }}

    Years running: {{ . }}

    {{ end }} +
    +
    +
    +
    +
    + {{- end }} +
    diff --git a/layouts/partials/head.html b/layouts/partials/head.html new file mode 100644 index 00000000000..1a9d11e7555 --- /dev/null +++ b/layouts/partials/head.html @@ -0,0 +1,120 @@ +{{- $siteTitle := site.Title -}} +{{- with site.Params.site_title }}{{ $siteTitle = . }}{{ end -}} +{{- $title := $siteTitle -}} +{{- if and .Title (not .IsHome) }}{{ $title = printf "%s | %s" .Title $siteTitle }}{{ end -}} +{{- $description := "" -}} +{{- with .Params.summary }}{{ $description = plainify . }}{{ else }}{{ with site.Params.description }}{{ $description = plainify . }}{{ end }}{{ end -}} + + +{{ with $description }}{{ end }} +{{ with .Params.tags }}{{ end }} + +{{ $title }} + + + + + + + + + +{{ with $description }}{{ end }} + + +{{ with $description }}{{ end }} + +{{ with site.Home.OutputFormats.Get "rss" }} + +{{ end }} + + + + + + + + +{{ if .IsHome }}{{ end }} + + + +{{ block "head_extra" . }}{{ end }} + + + + + +{{ with site.Params.mermaid.src }}{{ end }} + + + + + + + + + diff --git a/layouts/partials/head_print.html b/layouts/partials/head_print.html new file mode 100644 index 00000000000..7a4cd1f5ed8 --- /dev/null +++ b/layouts/partials/head_print.html @@ -0,0 +1,80 @@ +{{- $siteTitle := site.Title -}} +{{- with site.Params.site_title }}{{ $siteTitle = . }}{{ end -}} + + +{{ with .Params.summary }}{{ end }} +{{ with .Title }}{{ . }} | {{ end }}{{ $siteTitle }} + + + + + + + + + + + + + + + + + + + + diff --git a/layouts/partials/important.html b/layouts/partials/important.html new file mode 100644 index 00000000000..ac3020e0da2 --- /dev/null +++ b/layouts/partials/important.html @@ -0,0 +1 @@ +{{ partial "alert.html" (dict "kind" "important" "content" (.content | default "") "page" (.page | default .)) }} diff --git a/layouts/partials/logowall.html b/layouts/partials/logowall.html new file mode 100644 index 00000000000..8a49f3a547c --- /dev/null +++ b/layouts/partials/logowall.html @@ -0,0 +1,17 @@ +
    + {{- range hugo.Data.logowall }} + {{- range .columns }} + {{- range .logos }} + + {{- end }} + {{- end }} + {{- end }} +
    diff --git a/layouts/partials/news_banner.html b/layouts/partials/news_banner.html new file mode 100644 index 00000000000..87330bc42d5 --- /dev/null +++ b/layouts/partials/news_banner.html @@ -0,0 +1,21 @@ +{{/* +News banner template, disabled by default. To publish a banner, change `false` +below to `true` and edit only the announcement text and link below. The base +layout already calls this partial, and the existing classes should be kept for +consistent styling. To only show the banner on the front page, change the banner +block condition to `{{ if .onlanding }}`. +*/}} + +{{ if .onlanding }} + +{{ end }} diff --git a/_includes/newsletter.html b/layouts/partials/newsletter.html similarity index 100% rename from _includes/newsletter.html rename to layouts/partials/newsletter.html diff --git a/layouts/partials/note.html b/layouts/partials/note.html new file mode 100644 index 00000000000..827fe06c111 --- /dev/null +++ b/layouts/partials/note.html @@ -0,0 +1 @@ +{{ partial "alert.html" (dict "kind" "note" "content" (.content | default "") "page" (.page | default .)) }} diff --git a/layouts/partials/pdf/appendix-part.html b/layouts/partials/pdf/appendix-part.html new file mode 100644 index 00000000000..567c1673a83 --- /dev/null +++ b/layouts/partials/pdf/appendix-part.html @@ -0,0 +1 @@ +{{ partial "pdf/part-title.html" (dict "page" . "title" "Appendix") }} diff --git a/layouts/partials/pdf/docs-part.html b/layouts/partials/pdf/docs-part.html new file mode 100644 index 00000000000..2bf2b487e45 --- /dev/null +++ b/layouts/partials/pdf/docs-part.html @@ -0,0 +1 @@ +{{ partial "pdf/part-title.html" (dict "page" . "title" "Part I: Documentation") }} diff --git a/layouts/partials/pdf/page-for-url.html b/layouts/partials/pdf/page-for-url.html new file mode 100644 index 00000000000..b33c7490ce8 --- /dev/null +++ b/layouts/partials/pdf/page-for-url.html @@ -0,0 +1,63 @@ +{{- $raw := .url | default "" -}} +{{- $target := path.Clean $raw -}} +{{- $targetNoSlash := strings.Trim (strings.TrimPrefix "/pdf" $target) "/" -}} +{{- $targetNoHtml := strings.TrimSuffix ".html" $targetNoSlash -}} +{{- $resolvedPage := false -}} + +{{/* Pass 1: Exact alias or permalink match on content pages */}} +{{- range .site.Pages -}} + {{- if and (not $resolvedPage) (eq .Kind "page") -}} + {{- $page := . -}} + {{- $rel := path.Clean .RelPermalink -}} + {{- if or (eq $target $rel) (eq $targetNoSlash (strings.Trim (strings.TrimPrefix "/pdf" $rel) "/")) -}} + {{- $resolvedPage = $page -}} + {{- end -}} + {{- if not $resolvedPage -}} + {{- range .Params.aliases -}} + {{- $alias := path.Clean . -}} + {{- if or (eq $target $alias) (eq $targetNoSlash (strings.Trim (strings.TrimPrefix "/pdf" $alias) "/")) -}} + {{- $resolvedPage = $page -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- if not $resolvedPage -}} + {{- with .Params.permalink -}} + {{- $perm := path.Clean . -}} + {{- if or (eq $target $perm) (eq $targetNoSlash (strings.Trim (strings.TrimPrefix "/pdf" $perm) "/")) -}} + {{- $resolvedPage = $page -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{/* Pass 2: Generalized match across all pages and sections */}} +{{- if not $resolvedPage -}} + {{- range .site.Pages -}} + {{- if not $resolvedPage -}} + {{- $page := . -}} + {{- $relClean := strings.TrimSuffix ".html" (strings.Trim (strings.TrimPrefix "/pdf" (path.Clean .RelPermalink)) "/") -}} + {{- if eq $targetNoHtml $relClean -}} + {{- $resolvedPage = $page -}} + {{- end -}} + {{- if not $resolvedPage -}} + {{- range .Params.aliases -}} + {{- $aliasClean := strings.TrimSuffix ".html" (strings.Trim (strings.TrimPrefix "/pdf" (path.Clean .)) "/") -}} + {{- if eq $targetNoHtml $aliasClean -}} + {{- $resolvedPage = $page -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- if not $resolvedPage -}} + {{- with .File -}} + {{- $pathClean := strings.TrimSuffix ".md" .Path -}} + {{- if eq $targetNoHtml $pathClean -}} + {{- $resolvedPage = $page -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- return $resolvedPage -}} diff --git a/layouts/partials/pdf/part-title.html b/layouts/partials/pdf/part-title.html new file mode 100644 index 00000000000..d543cb9697c --- /dev/null +++ b/layouts/partials/pdf/part-title.html @@ -0,0 +1,15 @@ + + + + {{ partial "head_print.html" .page }} + + + + + diff --git a/layouts/partials/pdf/prince-list.txt b/layouts/partials/pdf/prince-list.txt new file mode 100644 index 00000000000..bcad29f4cd8 --- /dev/null +++ b/layouts/partials/pdf/prince-list.txt @@ -0,0 +1,31 @@ +{{- $title := site.Home.OutputFormats.Get "pdftitle" -}} +{{- $toc := site.Home.OutputFormats.Get "pdftoc" -}} +{{- $docsPart := site.Home.OutputFormats.Get "pdfdocspart" -}} +{{- $tutorialsPart := site.Home.OutputFormats.Get "pdftutorialspart" -}} +{{- $appendixPart := site.Home.OutputFormats.Get "pdfappendixpart" -}} +{{ $title.Permalink }} +{{ $toc.Permalink }} +{{ $docsPart.Permalink }} +{{- range hugo.Data.sidebars.docs_sidebar.entries }} + {{- with .folders }} + {{- range partial "pdf/sidebar-urls.html" (dict "site" site "nodes" .) }} +{{ . }} + {{- end }} + {{- end }} +{{- end }} +{{ $tutorialsPart.Permalink }} +{{- range hugo.Data.sidebars.tutorials_sidebar.entries }} + {{- with .folders }} + {{- range partial "pdf/sidebar-urls.html" (dict "site" site "nodes" .) }} +{{ . }} + {{- end }} + {{- end }} +{{- end }} +{{ $appendixPart.Permalink }} +{{- range hugo.Data.sidebars.pdf_appendix_sidebar.entries }} + {{- with .folders }} + {{- range partial "pdf/sidebar-urls.html" (dict "site" site "nodes" .) }} +{{ . }} + {{- end }} + {{- end }} +{{- end }} diff --git a/layouts/partials/pdf/sidebar-urls.html b/layouts/partials/pdf/sidebar-urls.html new file mode 100644 index 00000000000..13c674f953a --- /dev/null +++ b/layouts/partials/pdf/sidebar-urls.html @@ -0,0 +1,21 @@ +{{- $urls := slice -}} +{{- $site := .site -}} +{{- range .nodes -}} + {{- $node := . -}} + {{- $output := lower (printf "%v" ($node.output | default "")) -}} + {{- if in $output "pdf" -}} + {{- with $node.url -}} + {{- with partial "pdf/page-for-url.html" (dict "site" $site "url" .) -}} + {{- $urls = $urls | append .Permalink -}} + {{- end -}} + {{- end -}} + {{- range $key := slice "folders" "folderitems" "subfolders" "subfolderitems" -}} + {{- with index $node $key -}} + {{- range partial "pdf/sidebar-urls.html" (dict "site" $site "nodes" .) -}} + {{- $urls = $urls | append . -}} + {{- end -}} + {{- end -}} + {{- end -}} + {{- end -}} +{{- end -}} +{{- return $urls -}} diff --git a/layouts/partials/pdf/title.html b/layouts/partials/pdf/title.html new file mode 100644 index 00000000000..5426a16c884 --- /dev/null +++ b/layouts/partials/pdf/title.html @@ -0,0 +1,43 @@ + + + + {{ partial "head_print.html" . }} + + + + + diff --git a/layouts/partials/pdf/toc-nodes.html b/layouts/partials/pdf/toc-nodes.html new file mode 100644 index 00000000000..30694132a28 --- /dev/null +++ b/layouts/partials/pdf/toc-nodes.html @@ -0,0 +1,29 @@ +{{- $site := .site -}} +{{- $level := int (.level | default 0) -}} +{{- range .nodes -}} + {{- $node := . -}} + {{- $output := lower (printf "%v" ($node.output | default "")) -}} + {{- $type := lower (printf "%v" ($node.type | default "")) -}} + {{- $resolvedPage := false -}} + {{- with $node.url -}} + {{- $resolvedPage = partial "pdf/page-for-url.html" (dict "site" $site "url" .) -}} + {{- end -}} + {{- if and (in $output "pdf") (ne $type "frontmatter") (or (not $node.url) $resolvedPage) }} + + {{- with $resolvedPage -}} + {{ $node.title }} + {{- else -}} + {{- if eq $level 0 -}} + {{ $node.title }} + {{- else -}} + {{ $node.title }} + {{- end -}} + {{- end -}} + {{- range $key := slice "folders" "folderitems" "subfolders" "subfolderitems" -}} + {{- with index $node $key }} +
      {{ partial "pdf/toc-nodes.html" (dict "site" $site "nodes" . "level" (add $level 1)) }}
    + {{- end -}} + {{- end -}} + + {{- end -}} +{{- end -}} diff --git a/layouts/partials/pdf/toc.html b/layouts/partials/pdf/toc.html new file mode 100644 index 00000000000..42692221b81 --- /dev/null +++ b/layouts/partials/pdf/toc.html @@ -0,0 +1,30 @@ + + + + {{ partial "head_print.html" . }} + + + + + diff --git a/layouts/partials/pdf/tutorials-part.html b/layouts/partials/pdf/tutorials-part.html new file mode 100644 index 00000000000..630e8d5d19c --- /dev/null +++ b/layouts/partials/pdf/tutorials-part.html @@ -0,0 +1 @@ +{{ partial "pdf/part-title.html" (dict "page" . "title" "Part II: Tutorials") }} diff --git a/layouts/partials/publication_panel.html b/layouts/partials/publication_panel.html new file mode 100644 index 00000000000..01ed92ea88c --- /dev/null +++ b/layouts/partials/publication_panel.html @@ -0,0 +1,77 @@ +{{- $input := . -}} +{{- $pubPage := false -}} +{{- $pubParams := dict -}} +{{- $pubTitle := "" -}} +{{- $title := $input.title | default "" -}} + +{{- with $input.pub -}} + {{- if reflect.IsMap . -}} + {{- $pubParams = . -}} + {{- $pubTitle = index . "title" -}} + {{- else -}} + {{- $pubPage = . -}} + {{- end -}} +{{- end -}} + +{{- if and (not $pubPage) (not $pubTitle) $title -}} + {{- range where site.RegularPages "Section" "publications" -}} + {{- if and (not $pubPage) (eq .Title $title) -}} + {{- $pubPage = . -}} + {{- end -}} + {{- end -}} +{{- end -}} + +{{- with $pubPage -}} + {{- $pubParams = .Params -}} + {{- $pubTitle = .Title -}} +{{- end -}} + +{{- if $pubTitle -}} + {{- $authors := index $pubParams "authors" -}} + {{- $year := index $pubParams "year" -}} + {{- $journal := index $pubParams "journal" | default dict -}} + {{- $doi := index $pubParams "doi" -}} + {{- $publisherURL := index $pubParams "pub-url" -}} + {{- with $doi }}{{ $publisherURL = printf "https://www.doi.org/%s" . }}{{ end -}} + {{- $useWrapper := true -}} + {{- if eq $input.wrapper false }}{{ $useWrapper = false }}{{ end -}} + + {{ if $useWrapper }}
    {{ end }} +
    +
    + {{ $pubTitle }} +
    +
    +

    + {{ if $input.flexible }} + {{ $authors }}{{ with (index $journal "name") }} {{ . }},{{ end }}{{ with (index $journal "volume") }} Volume {{ . }},{{ end }}{{ with (index $journal "publisher") }} {{ . }},{{ end }} {{ $year }}{{ if and $input.show_doi_in_body $doi }}, doi:{{ $doi }}{{ end }}. + {{ else if (index $journal "issue") }} + {{ $authors }}, + {{ index $journal "name" }}, + {{ $year }}, + {{ index $journal "volume" }}:{{ index $journal "issue" }}{{ if and $input.show_doi_in_body $doi }}, doi:{{ $doi }}{{ end }}. + {{ else }} + {{ $authors }}, + {{ index $journal "name" }}{{ with (index $journal "volume") }}, + Volume {{ . }}{{ end }}{{ with (index $journal "publisher") }}, + {{ . }}{{ end }}, + {{ $year }}{{ if and $input.show_doi_in_body $doi }}, doi:{{ $doi }}{{ end }}. + {{ end }} +

    + {{ with $pubPage }} + {{ with .Content }} +
    + {{ . }} +
    + {{ end }} + {{ end }} + {{ if and $input.flexible $input.require_pub_url }} + {{ with (index $pubParams "pub-url") }}Publisher's site  {{ end }} + {{ else }} + {{ with $publisherURL }}Publisher's site  {{ end }} + {{ end }} + {{ with (index $pubParams "bibtex") }}Download BibTeX  {{ end }} +
    +
    + {{ if $useWrapper }}
    {{ end }} +{{- end -}} diff --git a/layouts/partials/publications_by_tag.html b/layouts/partials/publications_by_tag.html new file mode 100644 index 00000000000..a34040d645b --- /dev/null +++ b/layouts/partials/publications_by_tag.html @@ -0,0 +1,13 @@ +{{- $tag := .tag -}} +{{- $publications := where site.RegularPages "Section" "publications" -}} +{{- $publications = sort $publications "Params.year" "desc" -}} +
    + {{- range $publications }} + {{- $pubTags := printf "%v" (index .Params "tag") -}} + {{- if in $pubTags $tag }} +
    + {{ partial "publication_panel.html" (dict "pub" . "wrapper" false "flexible" true "require_pub_url" true) }} +
    + {{- end }} + {{- end }} +
    diff --git a/layouts/partials/scroll_to_top.html b/layouts/partials/scroll_to_top.html new file mode 100644 index 00000000000..aecb7e19272 --- /dev/null +++ b/layouts/partials/scroll_to_top.html @@ -0,0 +1,45 @@ + + + + + diff --git a/layouts/partials/sidebar.html b/layouts/partials/sidebar.html new file mode 100644 index 00000000000..c6743085b7f --- /dev/null +++ b/layouts/partials/sidebar.html @@ -0,0 +1,33 @@ +{{- /* Renders the sidebar navigation. Reads the sidebar key from page + params, looks up the matching data file in data/sidebars/, and + delegates tree rendering to sidebar_recursive.html. */ -}} +{{- $sidebarKey := .Param "sidebar" | default "home_sidebar" -}} +{{- $sidebarKeyText := strings.TrimSpace (printf "%v" $sidebarKey) -}} +{{- $hasNoSidebar := or (eq $sidebarKeyText "nil") (eq $sidebarKeyText "") (eq $sidebarKeyText "false") -}} +{{- if not $hasNoSidebar -}} +{{- $sidebarData := index hugo.Data.sidebars $sidebarKey -}} +{{- $entries := slice -}} +{{- with $sidebarData.entries }}{{ $entries = . }}{{ end -}} +{{- $firstEntry := index $entries 0 -}} + +{{- if $firstEntry -}} + {{- $product := $firstEntry.product | default $firstEntry.title | default "" -}} + {{- $version := $firstEntry.version | default "" -}} + +{{- else -}} + {{- with $sidebarKey }} + + {{- end }} +{{- end -}} +{{- end -}} diff --git a/layouts/partials/sidebar_is_web.html b/layouts/partials/sidebar_is_web.html new file mode 100644 index 00000000000..ddf592e6822 --- /dev/null +++ b/layouts/partials/sidebar_is_web.html @@ -0,0 +1,5 @@ +{{- /* Returns truthy if the item should appear in web output + (i.e. its "output" field contains "web", defaulting to yes). */ -}} +{{- $output := "web" -}} +{{- with .output }}{{ $output = printf "%v" . }}{{ end -}} +{{- if in $output "web" -}}true{{- end -}} diff --git a/layouts/partials/sidebar_item_active.html b/layouts/partials/sidebar_item_active.html new file mode 100644 index 00000000000..fc7e479c899 --- /dev/null +++ b/layouts/partials/sidebar_item_active.html @@ -0,0 +1,43 @@ +{{- /* Recursively checks if any item in the given subtree matches the + current page. Returns truthy when a match is found, used to + expand parent collapse sections. Params: item, current. */ -}} +{{- $item := .item -}} +{{- $current := .current -}} +{{- $active := false -}} + +{{- with $item.url }} + {{- if partial "sidebar_page_matches_url.html" (dict "page" $current "url" .) }} + {{- $active = true -}} + {{- end }} +{{- end -}} + +{{- if not $active }} + {{- range $child := $item.folderitems }} + {{- if partial "sidebar_item_active.html" (dict "item" $child "current" $current) }} + {{- $active = true -}} + {{- end }} + {{- range $subfolder := $child.subfolders }} + {{- if partial "sidebar_item_active.html" (dict "item" $subfolder "current" $current) }} + {{- $active = true -}} + {{- end }} + {{- end }} + {{- end }} +{{- end -}} + +{{- if not $active }} + {{- range $subfolder := $item.subfolders }} + {{- if partial "sidebar_item_active.html" (dict "item" $subfolder "current" $current) }} + {{- $active = true -}} + {{- end }} + {{- end }} +{{- end -}} + +{{- if not $active }} + {{- range $child := $item.subfolderitems }} + {{- if partial "sidebar_item_active.html" (dict "item" $child "current" $current) }} + {{- $active = true -}} + {{- end }} + {{- end }} +{{- end -}} + +{{- if $active -}}true{{- end -}} diff --git a/layouts/partials/sidebar_page_matches_url.html b/layouts/partials/sidebar_page_matches_url.html new file mode 100644 index 00000000000..7072fe3a4ae --- /dev/null +++ b/layouts/partials/sidebar_page_matches_url.html @@ -0,0 +1,20 @@ +{{- /* Checks if a page matches a target URL. Compares against the page's + RelPermalink, front-matter url, permalink, and aliases for a + reliable match regardless of how the URL was defined. */ -}} +{{- $page := .page -}} +{{- $target := partial "sidebar_url_clean.html" .url -}} +{{- $matches := false -}} +{{- if and $page $target }} + {{- $urls := slice -}} + {{- with $page.RelPermalink }}{{ $urls = $urls | append . }}{{ end -}} + {{- with $page.Params.url }}{{ $urls = $urls | append . }}{{ end -}} + {{- with $page.Params.permalink }}{{ $urls = $urls | append . }}{{ end -}} + {{- with $page.Params.aliases }} + {{- range . }}{{ $urls = $urls | append . }}{{ end -}} + {{- end -}} + {{- range $urls }} + {{- $clean := partial "sidebar_url_clean.html" . -}} + {{- if eq $clean $target }}{{ $matches = true }}{{ end -}} + {{- end }} +{{- end -}} +{{- if $matches -}}true{{- end -}} diff --git a/layouts/partials/sidebar_recursive.html b/layouts/partials/sidebar_recursive.html new file mode 100644 index 00000000000..ed0de138968 --- /dev/null +++ b/layouts/partials/sidebar_recursive.html @@ -0,0 +1,83 @@ +{{- /* Recursively renders a sidebar tree node. + Leaf items become plain nav-links; branch items become collapsible + sections (Bootstrap 5 collapse). Params: item, current (page context), + level (nesting depth, 1-based), parentID (BS collapse parent). */ -}} +{{- $item := .item -}} +{{- $current := .current -}} +{{- $level := .level | default 1 -}} +{{- $parentID := .parentID | default "mysidebar" -}} +{{- $title := $item.title | default "" -}} +{{- $url := $item.url | default "" -}} +{{- $folderitems := $item.folderitems | default (slice) -}} +{{- $subfolders := $item.subfolders | default (slice) -}} +{{- $subfolderitems := $item.subfolderitems | default (slice) -}} +{{- $isBranch := false -}} +{{- if eq $level 1 }} + {{- if gt (len $folderitems) 0 }}{{ $isBranch = true }}{{ end -}} +{{- else if eq $level 3 }} + {{- $isBranch = true -}} +{{- end -}} +{{- $isActive := partial "sidebar_item_active.html" (dict "item" $item "current" $current) -}} +{{- $isCurrent := false -}} +{{- if $url }} + {{- $isCurrent = partial "sidebar_page_matches_url.html" (dict "page" $current "url" $url) -}} +{{- end -}} + +{{- if not $isBranch -}} + {{- $href := partial "sidebar_resolve_url.html" (dict "url" $url) -}} + +{{- else -}} + {{- $currentID := printf "sb-%d-%s" $level ($title | anchorize) -}} + {{- $nextLevel := add $level 1 -}} + +{{- end -}} diff --git a/layouts/partials/sidebar_resolve_url.html b/layouts/partials/sidebar_resolve_url.html new file mode 100644 index 00000000000..7c3d5f7c954 --- /dev/null +++ b/layouts/partials/sidebar_resolve_url.html @@ -0,0 +1,11 @@ +{{- /* Resolves a sidebar URL for use in href attributes. External URLs + (http, https, mailto, #) are returned as-is; internal paths + are passed through relURL. */ -}} +{{- $rawURL := .url | default "" -}} +{{- $isExternal := or (hasPrefix $rawURL "http://") (or (hasPrefix $rawURL "https://") (or (hasPrefix $rawURL "mailto:") (hasPrefix $rawURL "#"))) -}} + +{{- if $isExternal -}} + {{- $rawURL -}} +{{- else -}} + {{- $rawURL | relURL -}} +{{- end -}} diff --git a/layouts/partials/sidebar_url_clean.html b/layouts/partials/sidebar_url_clean.html new file mode 100644 index 00000000000..a6cc3b3a4b9 --- /dev/null +++ b/layouts/partials/sidebar_url_clean.html @@ -0,0 +1,8 @@ +{{- /* Normalises a URL for comparison: trims whitespace and strips + leading/trailing slashes so "docs/foo/" matches "docs/foo". */ -}} +{{- $url := "" -}} +{{- with . }}{{ $url = printf "%v" . }}{{ end -}} +{{- $url = strings.TrimSpace $url -}} +{{- $url = strings.TrimPrefix "/" $url -}} +{{- $url = strings.TrimSuffix "/" $url -}} +{{- $url -}} diff --git a/layouts/partials/taglogic.html b/layouts/partials/taglogic.html new file mode 100644 index 00000000000..c0180714e1a --- /dev/null +++ b/layouts/partials/taglogic.html @@ -0,0 +1,16 @@ +{{- $tagName := .Params.tagName | default .Title -}} +

    The following pages and posts are tagged with

    + + + + {{ range site.RegularPages }} + {{ if in (.Params.tags | default slice) $tagName }} + + + + + + {{ end }} + {{ end }} + +
    TitleTypeExcerpt
    {{ .Title }}{{ .Type | title }}{{ with .Params.summary }}{{ . | plainify | truncate 160 }}{{ else }}{{ .Summary | plainify | truncate 160 }}{{ end }}
    diff --git a/layouts/partials/testimonial_avatars.html b/layouts/partials/testimonial_avatars.html new file mode 100644 index 00000000000..106f41147bb --- /dev/null +++ b/layouts/partials/testimonial_avatars.html @@ -0,0 +1,5 @@ +{{- range partial "testimonial_pages.html" . -}} + {{- with .Params.img -}} + Overview of preCICE user stories + {{- end -}} +{{- end -}} diff --git a/layouts/partials/testimonial_pages.html b/layouts/partials/testimonial_pages.html new file mode 100644 index 00000000000..631351585b7 --- /dev/null +++ b/layouts/partials/testimonial_pages.html @@ -0,0 +1 @@ +{{- return (sort (where site.RegularPages "Section" "testimonials") "File.LogicalName" "desc") -}} diff --git a/layouts/partials/testimonials.html b/layouts/partials/testimonials.html new file mode 100644 index 00000000000..667301a4334 --- /dev/null +++ b/layouts/partials/testimonials.html @@ -0,0 +1,30 @@ +{{- range partial "testimonial_pages.html" . }} + {{- $testimonial := . -}} +

    {{ .Title }}

    + +
    +
    + {{ .Content }} + {{- with .Params.author }} +

    + - + {{- with $testimonial.Params.author_link -}} + {{ $testimonial.Params.author }} + {{- else -}} + {{ $testimonial.Params.author }} + {{- end -}} +
    + {{ with $testimonial.Params.organisation_link }}{{ $testimonial.Params.organisation }}{{ else }}{{ $testimonial.Params.organisation }}{{ end }} +

    + {{- end }} +
    +
    + {{- with .Params.img }} +
    + {{ $testimonial.Title }} +
    {{ $testimonial.Title }}
    +
    + {{- end }} +
    +
    +{{- end }} diff --git a/layouts/partials/tip.html b/layouts/partials/tip.html new file mode 100644 index 00000000000..463b76c673a --- /dev/null +++ b/layouts/partials/tip.html @@ -0,0 +1 @@ +{{ partial "alert.html" (dict "kind" "tip" "content" (.content | default "") "page" (.page | default .)) }} diff --git a/layouts/partials/toc.html b/layouts/partials/toc.html new file mode 100644 index 00000000000..a611571d3e6 --- /dev/null +++ b/layouts/partials/toc.html @@ -0,0 +1,50 @@ +{{- if ne (.Param "toc") false -}} + {{- $rawToc := printf "%s" .TableOfContents -}} + {{- if in $rawToc "