diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..f408a20 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,9 @@ +.agent/ +.git/ +.hugo_build.lock +.hugo_cache/ +data/publications.json +assets/data/models.csv +node_modules/ +public/ +resources/_gen/ diff --git a/.github/dependabot.yml b/.github/dependabot.yml index a8b86b4..6c00494 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,19 +1,16 @@ -# To get started with Dependabot version updates, you'll need to specify which -# package ecosystems to update and where the package manifests are located. -# Please see the documentation for all configuration options: -# https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file - version: 2 updates: - - package-ecosystem: "npm" # See documentation for possible values - directory: "/" # Location of package manifests + - package-ecosystem: "npm" + directory: "/" schedule: interval: "weekly" -# Enable version updates for Docker - package-ecosystem: "docker" - # Look for a `Dockerfile` in the `root` directory directory: "/" - # Check for updates once a week + schedule: + interval: "weekly" + + - package-ecosystem: "github-actions" + directory: "/" schedule: interval: "weekly" diff --git a/.github/scripts/bibtex-to-json.mjs b/.github/scripts/bibtex-to-json.mjs new file mode 100644 index 0000000..bc7b206 --- /dev/null +++ b/.github/scripts/bibtex-to-json.mjs @@ -0,0 +1,56 @@ +import { mkdir, readFile, writeFile } from "node:fs/promises"; +import { dirname } from "node:path"; + +import { parse } from "@retorquere/bibtex-parser"; + +const inputPath = process.argv[2] ?? "assets/bibliographies/publications.bib"; +const outputPath = process.argv[3] ?? "data/publications.json"; + +const formatName = (name) => + [name.firstName, name.prefix, name.lastName, name.suffix] + .filter(Boolean) + .join(" "); + +const formatValue = (value) => { + if (!Array.isArray(value)) return String(value); + if (value.every((item) => typeof item === "string")) return value.join(", "); + return value.map(formatName).join(" and "); +}; + +const source = await readFile(inputPath, "utf8"); +const result = parse(source); + +if (result.errors.length > 0) { + const errors = result.errors.map(({ error }) => error).join("\n"); + throw new Error(`Invalid BibTeX in ${inputPath}:\n${errors}`); +} + +const keys = new Set(); +const publications = result.entries.map((entry) => { + if (keys.has(entry.key)) throw new Error(`Duplicate BibTeX key: ${entry.key}`); + keys.add(entry.key); + + const fields = Object.entries(entry.fields).map(([name, value]) => ({ + name, + value: formatValue(value), + })); + const fieldMap = Object.fromEntries(fields.map(({ name, value }) => [name, value])); + + return { + key: entry.key, + type: entry.type, + sortYear: Number.parseInt(fieldMap.year, 10) || 0, + fields, + fieldMap, + authorList: (entry.fields.author ?? []).map(formatName), + }; +}); + +publications.sort( + (left, right) => right.sortYear - left.sortYear || left.key.localeCompare(right.key), +); + +await mkdir(dirname(outputPath), { recursive: true }); +await writeFile(outputPath, `${JSON.stringify(publications, null, 2)}\n`, "utf8"); + +console.log(`Generated ${outputPath} from ${publications.length} BibTeX entries.`); diff --git a/.github/scripts/build-site.sh b/.github/scripts/build-site.sh new file mode 100644 index 0000000..1dd0ffa --- /dev/null +++ b/.github/scripts/build-site.sh @@ -0,0 +1,44 @@ +#!/bin/sh + +set -eu + +export HUGO_ENV="${HUGO_ENV:-production}" + +HUGO_CACHEDIR="${HUGO_CACHEDIR:-/src/.hugo_cache}" +OUTPUT_DIR="${OUTPUT_DIR:-/src/public}" +BASE_URL="${BASE_URL:-}" + +require_absolute_path() { + value="$1" + name="$2" + case "$value" in + /*) ;; + *) + echo "ERROR: ${name} must be an absolute path, got: ${value}" >&2 + exit 1 + ;; + esac +} + +require_absolute_path "$HUGO_CACHEDIR" HUGO_CACHEDIR +require_absolute_path "$OUTPUT_DIR" OUTPUT_DIR + +npm run models:fetch +npm run bibliography:check +npm run bibliography + +mkdir -p "$HUGO_CACHEDIR" "$OUTPUT_DIR" + +set -- build \ + --gc \ + --minify \ + --cacheDir "$HUGO_CACHEDIR" \ + -d "$OUTPUT_DIR" + +if [ -n "$BASE_URL" ]; then + trimmed_base_url=${BASE_URL%/} + set -- "$@" --baseURL "${trimmed_base_url}/" +fi + +echo "Running: hugo $*" >&2 +exec hugo "$@" diff --git a/.github/scripts/check-bibliography-sync.mjs b/.github/scripts/check-bibliography-sync.mjs new file mode 100644 index 0000000..1c814e0 --- /dev/null +++ b/.github/scripts/check-bibliography-sync.mjs @@ -0,0 +1,185 @@ +import { readFile, rename, rm, writeFile } from "node:fs/promises"; + +import { parse } from "@retorquere/bibtex-parser"; + +const bibliographyPath = "assets/bibliographies/publications.bib"; +const modelsCsvPath = "assets/data/models.csv"; +const modelsJsonPath = "data/models.json"; +const expectedHeaders = [ + "publication_citation", + "domain", + "available_code", + "license", + "doi", + "documentation", + "clean_code", + "status", + "issue_link", + "name_short", + "article_doi", + "doi_link", + "citation_nodoi", +]; + +// models.csv currently reuses santos-etal-2006 for two different publications. +const keyOverrides = new Map([ + ["10.1098/rspb.2005.3272", "santos-rodrigues-pacheco-2006"], +]); +const allowedValues = { + domain: new Set(["Cooperation", "Crowd Dynamics", "Ecological Processes", "Land Use"]), + available_code: new Set(["N", "Y"]), + license: new Set(["N", "Y"]), + doi: new Set(["N", "Y"]), + documentation: new Set(["", "A", "B", "C", "D", "E"]), + clean_code: new Set(["", "A", "B", "C", "D", "E"]), + status: new Set([ + "Not yet started", + "Looking for collaborators", + "In progress", + "Meets FAIR criteria!", + ]), +}; + +const normalizeDoi = (value) => + value + .trim() + .replace(/^https?:\/\/(dx\.)?doi\.org\//i, "") + .toLowerCase(); + +const parseCsv = (source) => { + const rows = []; + let row = []; + let field = ""; + let quoted = false; + + for (let index = 0; index < source.length; index += 1) { + const character = source[index]; + if (quoted) { + if (character === '"' && source[index + 1] === '"') { + field += '"'; + index += 1; + } else if (character === '"') { + quoted = false; + } else { + field += character; + } + } else if (character === '"') { + quoted = true; + } else if (character === ",") { + row.push(field); + field = ""; + } else if (character === "\n") { + row.push(field.replace(/\r$/, "")); + rows.push(row); + row = []; + field = ""; + } else { + field += character; + } + } + + if (quoted) throw new Error(`${modelsCsvPath} contains an unterminated quoted field.`); + + if (field || row.length > 0) { + row.push(field); + rows.push(row); + } + + const headers = rows.shift() ?? []; + if (headers.length !== expectedHeaders.length || + headers.some((header, index) => header !== expectedHeaders[index])) { + throw new Error( + `${modelsCsvPath} schema changed. Expected headers:\n${expectedHeaders.join(",")}`, + ); + } + + return rows.filter((values) => values.some(Boolean)).map((values, rowIndex) => { + if (values.length !== headers.length) { + throw new Error( + `${modelsCsvPath} row ${rowIndex + 2} has ${values.length} fields; expected ${headers.length}.`, + ); + } + return Object.fromEntries(headers.map((header, index) => [header, values[index]])); + }); +}; + +const models = parseCsv(await readFile(modelsCsvPath, "utf8")); +const bibliography = parse(await readFile(bibliographyPath, "utf8")); +if (bibliography.errors.length > 0) { + throw new Error( + `Invalid BibTeX:\n${bibliography.errors.map(({ error }) => error).join("\n")}`, + ); +} + +const problems = []; +const modelsByDoi = new Map(); +const modelKeys = new Set(); +for (const model of models) { + const doi = normalizeDoi(model.article_doi); + const expectedKey = keyOverrides.get(doi) ?? model.name_short.trim(); + if (!model.publication_citation.trim()) { + problems.push(`models.csv row has no publication_citation: ${expectedKey || doi}`); + } + if (!model.domain.trim()) problems.push(`models.csv row has no domain: ${expectedKey || doi}`); + if (!doi) problems.push(`models.csv row has no article_doi: ${model.name_short}`); + if (!expectedKey) problems.push(`models.csv row has no name_short: ${doi}`); + for (const [field, allowed] of Object.entries(allowedValues)) { + if (!allowed.has(model[field])) { + problems.push(`models.csv ${expectedKey || doi} has invalid ${field}: ${model[field]}`); + } + } + if (model.issue_link && + !/^https:\/\/github\.com\/make-models-fair\/coordination\/issues\/\d+$/.test(model.issue_link)) { + problems.push(`models.csv ${expectedKey || doi} has invalid issue_link: ${model.issue_link}`); + } + if (modelsByDoi.has(doi)) problems.push(`models.csv contains duplicate DOI: ${doi}`); + if (modelKeys.has(expectedKey)) problems.push(`models.csv resolves to duplicate key: ${expectedKey}`); + modelKeys.add(expectedKey); + modelsByDoi.set(doi, { expectedKey }); +} + +const bibliographyByDoi = new Map(); +const bibliographyKeys = new Set(); +for (const entry of bibliography.entries) { + const doi = normalizeDoi(entry.fields.doi ?? ""); + for (const field of ["title", "author", "year", "doi"]) { + const value = entry.fields[field]; + if (!value || (Array.isArray(value) && value.length === 0)) { + problems.push(`BibTeX entry ${entry.key} has no ${field}`); + } + } + if (!doi) problems.push(`BibTeX entry has no DOI: ${entry.key}`); + if (bibliographyKeys.has(entry.key)) problems.push(`BibTeX contains duplicate key: ${entry.key}`); + if (bibliographyByDoi.has(doi)) problems.push(`BibTeX contains duplicate DOI: ${doi}`); + bibliographyKeys.add(entry.key); + bibliographyByDoi.set(doi, entry); +} + +for (const [doi, { expectedKey }] of modelsByDoi) { + const entry = bibliographyByDoi.get(doi); + if (!entry) { + problems.push(`Missing BibTeX entry for ${expectedKey} (${doi})`); + } else if (entry.key !== expectedKey) { + problems.push(`BibTeX key for ${doi} is ${entry.key}; expected ${expectedKey}`); + } +} + +for (const [doi, entry] of bibliographyByDoi) { + if (!modelsByDoi.has(doi)) problems.push(`BibTeX entry is not in models.csv: ${entry.key} (${doi})`); +} + +if (problems.length > 0) { + throw new Error(`Bibliography is out of sync:\n- ${problems.join("\n- ")}`); +} + +const temporaryModelsJsonPath = `${modelsJsonPath}.${process.pid}.tmp`; +try { + await writeFile(temporaryModelsJsonPath, `${JSON.stringify(models, null, 2)}\n`, "utf8"); + await rename(temporaryModelsJsonPath, modelsJsonPath); +} finally { + await rm(temporaryModelsJsonPath, { force: true }); +} + +console.log( + `Bibliography is synchronized: ${bibliography.entries.length} entries match ${models.length} models.`, +); diff --git a/.github/scripts/fetch-models.mjs b/.github/scripts/fetch-models.mjs new file mode 100644 index 0000000..ff88a3f --- /dev/null +++ b/.github/scripts/fetch-models.mjs @@ -0,0 +1,65 @@ +import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises"; +import { dirname } from "node:path"; +import { createHash } from "node:crypto"; + +const lockPath = "model-catalog.lock.json"; +const outputPath = "assets/data/models.csv"; +const lock = JSON.parse(await readFile(lockPath, "utf8")); + +if (!/^[\w.-]+\/[\w.-]+$/.test(lock.repository)) { + throw new Error(`${lockPath} repository must be an owner/repository name.`); +} +if (!lock.path || lock.path.startsWith("/") || lock.path.split("/").includes("..")) { + throw new Error(`${lockPath} path must be relative and cannot contain '..'.`); +} +if (!/^[0-9a-f]{40}$/.test(lock.commit)) { + throw new Error(`${lockPath} commit must be one full lowercase commit SHA.`); +} +if (!/^[0-9a-f]{64}$/.test(lock.sha256)) { + throw new Error(`${lockPath} sha256 must be one lowercase SHA-256 digest.`); +} + +const sourcePath = lock.path.split("/").map(encodeURIComponent).join("/"); +const sourceUrl = `https://raw.githubusercontent.com/${lock.repository}/${lock.commit}/${sourcePath}`; + +let sourceBytes; +for (let attempt = 1; attempt <= 3; attempt += 1) { + try { + const response = await fetch(sourceUrl, { + headers: { + "User-Agent": "make-models-fair.github.io model snapshot fetcher", + }, + signal: AbortSignal.timeout(15_000), + }); + if (!response.ok) { + throw new Error(`${response.status} ${response.statusText}`); + } + sourceBytes = Buffer.from(await response.arrayBuffer()); + if (sourceBytes.length === 0) throw new Error("response was empty"); + if (sourceBytes.length > 5_000_000) throw new Error("response exceeded 5 MB"); + break; + } catch (error) { + if (attempt === 3) { + throw new Error(`Could not fetch ${lock.path} at ${lock.commit}: ${error.message}`); + } + await new Promise((resolve) => setTimeout(resolve, attempt * 1_000)); + } +} + +const checksum = createHash("sha256").update(sourceBytes).digest("hex"); +if (checksum !== lock.sha256) { + throw new Error( + `${lock.path} checksum mismatch at ${lock.commit}: expected ${lock.sha256}, received ${checksum}`, + ); +} + +await mkdir(dirname(outputPath), { recursive: true }); +const temporaryPath = `${outputPath}.${process.pid}.tmp`; +try { + await writeFile(temporaryPath, sourceBytes); + await rename(temporaryPath, outputPath); +} finally { + await rm(temporaryPath, { force: true }); +} + +console.log(`Fetched ${lock.repository}/${lock.path} at ${lock.commit} (${checksum}).`); diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml index 2fcd3dd..cb2599e 100644 --- a/.github/workflows/gh-pages.yml +++ b/.github/workflows/gh-pages.yml @@ -5,50 +5,61 @@ on: branches: - main pull_request: - schedule: - - cron: '0 0 * * *' -# repository_dispatch: -# types: [trigger-deploy] + branches: + - main workflow_dispatch: -jobs: - deploy: - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v4 +permissions: {} - - name: Read hugo version from file - id: hugo-version - run: echo "HUGO_VERSION=$(cat HUGO_VERSION)" >> $GITHUB_OUTPUT +concurrency: + group: pages-${{ github.ref }} + cancel-in-progress: false - - name: Add hugo nodejs dependencies - uses: actions/setup-node@v4 - with: - node-version: "20" - cache: 'npm' +defaults: + run: + shell: bash - - name: Setup Hugo - uses: peaceiris/actions-hugo@v3 +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + env: + HUGO_CACHE_CONTAINER_DIR: /src/.hugo_cache + steps: + - name: Checkout + uses: actions/checkout@v6 with: - # sync versions with docker-compose .env ala - # https://github.com/marketplace/actions/hugo-setup#%EF%B8%8F-read-hugo-version-from-file - hugo-version: "${{ steps.hugo-version.outputs.HUGO_VERSION }}" - extended: true + fetch-depth: 0 - - name: Build Hugo site - env: - HUGO_ENV: "production" - run: | - npm install - hugo mod tidy - hugo --minify - - - name: Deploy - uses: peaceiris/actions-gh-pages@v4 + - name: Setup Pages + id: pages + uses: actions/configure-pages@v6 + + - name: Build in Docker Compose env: - HUGO_ENV: "production" - if: github.ref == 'refs/heads/main' + BASE_URL: ${{ steps.pages.outputs.base_url }} + run: >- + make render + HUGO_CACHE_CONTAINER_DIR="${HUGO_CACHE_CONTAINER_DIR}" + RENDER_BASE_URL="${BASE_URL}" + + - name: Upload artifact + uses: actions/upload-pages-artifact@v5 with: - github_token: ${{ secrets.GITHUB_TOKEN }} - publish_dir: ./public - publish_branch: gh-pages + path: ./public + + deploy: + if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request' + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + permissions: + pages: write + id-token: write + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v5 diff --git a/.github/workflows/update-model-catalog-lock.yml b/.github/workflows/update-model-catalog-lock.yml new file mode 100644 index 0000000..e842115 --- /dev/null +++ b/.github/workflows/update-model-catalog-lock.yml @@ -0,0 +1,94 @@ +name: Propose model catalog lock update + +on: + schedule: + - cron: "17 4 * * 1" + workflow_dispatch: + +permissions: {} + +concurrency: + group: update-model-catalog-lock + cancel-in-progress: false + +jobs: + update: + runs-on: ubuntu-latest + permissions: + actions: write + contents: write + pull-requests: write + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Resolve current model catalog revision + id: revision + env: + GH_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + repository="$(jq -r '.repository' model-catalog.lock.json)" + source_path="$(jq -r '.path' model-catalog.lock.json)" + latest="$(gh api "repos/$repository/commits?sha=main&path=$source_path&per_page=1" --jq '.[0].sha')" + current="$(jq -r '.commit' model-catalog.lock.json)" + current_sha256="$(jq -r '.sha256' model-catalog.lock.json)" + [[ "$latest" =~ ^[0-9a-f]{40}$ ]] + [[ "$current" =~ ^[0-9a-f]{40}$ ]] + [[ "$current_sha256" =~ ^[0-9a-f]{64}$ ]] + latest_sha256="$(curl --fail --location --retry 3 --silent --show-error "https://raw.githubusercontent.com/$repository/$latest/$source_path" | sha256sum | cut -d ' ' -f 1)" + [[ "$latest_sha256" =~ ^[0-9a-f]{64}$ ]] + echo "latest=$latest" >> "$GITHUB_OUTPUT" + echo "latest_sha256=$latest_sha256" >> "$GITHUB_OUTPUT" + if [[ "$latest" == "$current" && "$latest_sha256" == "$current_sha256" ]]; then + echo "changed=false" >> "$GITHUB_OUTPUT" + else + echo "changed=true" >> "$GITHUB_OUTPUT" + fi + + - name: Open update pull request + if: steps.revision.outputs.changed == 'true' + env: + GH_TOKEN: ${{ github.token }} + LATEST: ${{ steps.revision.outputs.latest }} + LATEST_SHA256: ${{ steps.revision.outputs.latest_sha256 }} + run: | + set -euo pipefail + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + pr_body="Locks the website catalog to [coordination@$LATEST](https://github.com/make-models-fair/coordination/commit/$LATEST) with SHA-256 \`$LATEST_SHA256\`. If publications were added, removed, or renamed, update \`assets/bibliographies/publications.bib\` in this pull request before merging." + existing_branch="$(gh pr list --state open --author app/github-actions --search 'Update model catalog lock in:title' --json headRefName --jq '.[0].headRefName // ""')" + if [[ -n "$existing_branch" ]]; then + git fetch origin "$existing_branch" + git switch -C "$existing_branch" "origin/$existing_branch" + jq --arg commit "$LATEST" --arg sha256 "$LATEST_SHA256" '.commit = $commit | .sha256 = $sha256' model-catalog.lock.json > model-catalog.lock.json.tmp + mv model-catalog.lock.json.tmp model-catalog.lock.json + if git diff --quiet -- model-catalog.lock.json; then + echo "The open update pull request already pins $LATEST." + exit 0 + fi + git add model-catalog.lock.json + git commit -m "Update model catalog lock" + git push + gh pr edit "$existing_branch" --body "$pr_body" + gh workflow run gh-pages.yml --ref "$existing_branch" + exit 0 + fi + + branch="automation/model-catalog-${LATEST:0:12}-${GITHUB_RUN_ID}" + jq --arg commit "$LATEST" --arg sha256 "$LATEST_SHA256" '.commit = $commit | .sha256 = $sha256' model-catalog.lock.json > model-catalog.lock.json.tmp + mv model-catalog.lock.json.tmp model-catalog.lock.json + git switch -c "$branch" + git add model-catalog.lock.json + git commit -m "Update model catalog lock" + git push --set-upstream origin "$branch" + + gh pr create \ + --base main \ + --head "$branch" \ + --title "Update model catalog lock" \ + --body "$pr_body" + + gh workflow run gh-pages.yml --ref "$branch" diff --git a/.gitignore b/.gitignore index 490d07c..b880e37 100644 --- a/.gitignore +++ b/.gitignore @@ -17,8 +17,12 @@ # Generated files by hugo /public/ /resources/_gen/ +/data/publications.json +/data/models.json +/assets/data/models.csv +/.hugo_cache/ /assets/jsconfig.json -hugo_stats.json +/hugo_stats.json # npm node_modules/ @@ -90,4 +94,3 @@ $RECYCLE.BIN/ *.lnk # End of https://www.toptal.com/developers/gitignore/api/hugo,macos,windows,linux - diff --git a/AGENTS.md b/AGENTS.md index 5913477..9eacc10 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -19,18 +19,24 @@ When instructions conflict: Authoritative: -- `hugo.yaml` — site config, routing, taxonomies, menus, module imports +- `hugo.yaml` — site config, routing, taxonomies, menus, and theme selection - `content/en/` — site content -- `go.mod` / `go.sum` — Hugo module dependencies, including Docsy -- `package.json` / `package-lock.json` — npm build dependencies +- `assets/bibliographies/publications.bib` — model publication bibliography +- `model-catalog.lock.json` — immutable coordination catalog source and checksum used by builds +- `data/model_domains.yaml` — model-domain labels and reviewed SKOS mappings +- `artifacts/fair/fair-management-plan.md` — canonical stewardship plan and research object inventory +- `package.json` / `package-lock.json` — Docsy and npm build dependencies - `HUGO_VERSION` — pinned Hugo version for Docker builds - `layouts/`, `static/`, `js/` — overrides and static assets -- `README.md`, `Makefile`, `Dockerfile`, `docker-compose.yml` — build process +- `README.md`, `Makefile`, `Dockerfile`, `docker-compose.yml` — build process and container interface Do not edit derived output directly: - `resources/_gen/` - `public/` +- `assets/data/models.csv` +- `data/models.json` +- `data/publications.json` - Rendered HTML or copied vendor files ## Invariants @@ -39,35 +45,42 @@ Do not edit derived output directly: - Make the smallest change that satisfies the request; do not fix unrelated issues unless asked. - Always modify authoritative source files rather than generated output. - Match existing formatting, style, and conventions; maintain internal consistency across related documents. +- Run builds and dependency commands inside the container using `make` targets. Prefer `make` over direct `docker compose` or host-local tooling. - Keep local customizations isolated from Docsy upstream; do not vendor or fork Docsy without clear justification. - Keep filenames and URLs stable unless required; update links and references when renaming. +- Preserve subpath deployment support by using Hugo references and URL functions for internal links. +- Treat the Docker image as a toolchain: site source is supplied by the Compose mount, not copied into the image. +- Fetch model data only from the source in `model-catalog.lock.json`, and verify its checksum; never render directly from the coordination repository's moving branch. - Record the rationale for non-obvious changes in commit messages or handoff notes. - Avoid broad rewrites, opportunistic refactors, speculative edits, and documentation duplication. ## Dependency Maintenance -Docsy is managed as a Hugo Module. Keep Hugo and Docsy pinned to intentional versions. Any upgrade must verify compatibility with local overrides before completion. +Docsy is installed from the npm registry as `@docsy/theme`. Keep Hugo and Docsy pinned to intentional versions. Any upgrade must verify compatibility with local overrides before completion. All npm commands must run inside the container. -1. Inspect: `hugo mod graph` -2. Update deliberately: `hugo mod get -u` or `hugo mod get github.com/google/docsy@vX.Y.Z` -3. Run `hugo mod tidy` -4. Run `hugo mod verify` -5. Sync npm dependencies if needed: `hugo mod npm pack` and `npm install` -6. Build per `README.md` -7. Review overrides, key pages, navigation, search, menus, and shortcodes -8. Document the change and any manual reconciliation +The Hugo toolchain is pinned by both `HUGO_VERSION` and the image digest in +`Dockerfile`; update and verify both together. + +1. Inspect: from `make shell`, run `npm outdated @docsy/theme` +2. Update deliberately: from `make shell`, run `npm install --save-dev --save-exact @docsy/theme@X.Y.Z` +3. Build the image with `make build`, then render the site with `make render` +4. Review overrides, key pages, navigation, search, menus, and shortcodes +5. Document the change and any manual reconciliation ## Layout and Override Discipline -Site-specific overrides belong in `layouts/`. Prefer targeted local overrides over editing the Docsy module cache. Do not copy large theme blocks into the repo. Reconcile overrides after theme updates without rewriting Docsy itself. +Site-specific overrides belong in `layouts/`. Prefer targeted local overrides over editing `node_modules`. Do not copy large theme blocks into the repo. Reconcile overrides after theme updates without rewriting Docsy itself. ## Validation -Validate only what could reasonably be affected by the change: +Validate only what could reasonably be affected by the change. Use `make` targets in preference to direct `docker compose` or host-local tooling: - Content edits: front matter, relative paths, internal links. -- Layout/shortcode changes: build and verify affected pages. -- Dependency/theme changes: build, verify module graph, review key pages, navigation, search, menus, shortcodes, and generated output. +- Layout/shortcode changes: `make render` and verify affected pages. +- Bibliography edits: `make bibliography-check`, then `make render` and verify the model bibliography page. +- Catalog pin edits: update the bibliography as needed, run `make bibliography-check`, then `make render`. +- Internal-link changes: render once with a subpath `RENDER_BASE_URL` and inspect affected links. +- Dependency/theme changes: `make render`, run `npm ls @docsy/theme` from `make shell`, and review key pages, navigation, search, menus, shortcodes, and generated output. Use the build process documented in `README.md`. @@ -84,6 +97,6 @@ Use the build process documented in `README.md`. If work is incomplete, leave: - What changed: files, versions, edits -- What was checked: build status, module graph, pages reviewed +- What was checked: build status, dependency versions, pages reviewed - What remains uncertain: open questions or blockers - Recommended next steps diff --git a/Dockerfile b/Dockerfile index 01cf895..23051c7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,19 @@ -ARG HUGO_VERSION=0.133.1 -ARG DIST_TAG=-ext-ubuntu -FROM floryn90/hugo:${HUGO_VERSION}${DIST_TAG} +# syntax=docker/dockerfile:1.7@sha256:a57df69d0ea827fb7266491f2813635de6f17269be881f696fbfdf2d83dda33e + +ARG HUGO_VERSION + +FROM ghcr.io/gohugoio/hugo:${HUGO_VERSION}@sha256:608a19e34f86de36773503adbaab174fc28a6e338dc7904e03c70320b003a153 LABEL maintainer="CoMSES Net " +USER root + WORKDIR /src -COPY . /src/ -RUN git config --global --add safe.directory /src +COPY package.json package-lock.json ./ +RUN --mount=type=cache,target=/root/.npm \ + npm ci -RUN hugo mod tidy -RUN npm install +USER hugo -CMD ["server"] +CMD ["version"] diff --git a/HUGO_VERSION b/HUGO_VERSION index 4402320..7ce2352 100644 --- a/HUGO_VERSION +++ b/HUGO_VERSION @@ -1 +1 @@ -0.133.1 \ No newline at end of file +v0.165.0 diff --git a/Makefile b/Makefile index c7e6cd6..65b4fb3 100644 --- a/Makefile +++ b/Makefile @@ -1,37 +1,56 @@ # Settings export HUGO_VERSION := $(shell cat HUGO_VERSION) -MAKEFILES=Makefile $(wildcard *.mk) +MAKEFILE_COMMANDS=Makefile $(wildcard *.mk) UID=$(shell id -u) GID=$(shell id -g) +DOCKER_COMPOSE=docker compose +HUGO_SERVICE=hugo +HUGO_RUN_SH=$(DOCKER_COMPOSE) run --rm --no-deps --entrypoint sh +HUGO_CACHE_CONTAINER_DIR ?= /src/.hugo_cache +RENDER_OUTPUT_DIR ?= /src/public +RENDER_BASE_URL ?= +HUGO_USER_ENV=--user "$(UID):$(GID)" -e HOME=/tmp # Controls -.PHONY : commands clean stop serve +.PHONY : all commands bibliography-check build clean stop serve render shell .NOTPARALLEL: all : commands ## commands : show all commands. commands : - @grep -h -E '^##' ${MAKEFILES} | sed -e 's/## //g' + @grep -h -E '^##' ${MAKEFILE_COMMANDS} | sed -e 's/## //g' -## build : build files but do not run a server. +## bibliography-check: verify publications.bib matches the coordination model list. +bibliography-check : build + $(HUGO_RUN_SH) $(HUGO_USER_ENV) $(HUGO_SERVICE) -c 'npm run models:fetch && npm run bibliography:check' + +## build : build the pinned Hugo/npm toolchain image. build : - docker compose build --pull + $(DOCKER_COMPOSE) build --pull $(HUGO_SERVICE) ## serve : start and run a local server. serve : build - docker compose up -d + @LOCAL_UID=$(UID) LOCAL_GID=$(GID) $(DOCKER_COMPOSE) up -d --renew-anon-volumes $(HUGO_SERVICE) @echo "\nhot-reloading site up at http://localhost:1313, \"make stop\" to stop the server.\n" +## render : run the production-style site render locally. +render : build + $(HUGO_RUN_SH) $(HUGO_USER_ENV) \ + -e HUGO_CACHEDIR="$(HUGO_CACHE_CONTAINER_DIR)" \ + -e OUTPUT_DIR="$(RENDER_OUTPUT_DIR)" \ + -e BASE_URL="$(RENDER_BASE_URL)" \ + $(HUGO_SERVICE) -c 'rm -f /src/.hugo_build.lock && rm -rf /src/public /src/resources/_gen && sh .github/scripts/build-site.sh' + ## shell : open a hugo shell shell : build - docker compose run --rm --user="${UID}:${GID}" hugo shell + $(HUGO_RUN_SH) $(HUGO_USER_ENV) -e HUGO_CACHEDIR="$(HUGO_CACHE_CONTAINER_DIR)" $(HUGO_SERVICE) -## stop : stop the docker server and clean up +## stop : stop Compose services and remove their volumes. stop : - docker compose down -v + $(DOCKER_COMPOSE) down -v -## clean : clean up junk files. +## clean : remove generated output, caches, and backup files. clean : - @rm -rf ./resources/_gen + @rm -rf ./public ./resources/_gen ./.hugo_cache ./.hugo_build.lock @find . -name .DS_Store -print -exec rm {} \; @find . -name '*~' -print -exec rm {} \; diff --git a/README.md b/README.md index 5ab35ef..b4a9275 100644 --- a/README.md +++ b/README.md @@ -4,35 +4,95 @@ This repository houses the code for the Making Models FAIR initiative [website]( ## About -This GitHub pages site is generated with [hugo](https://gohugo.io) using the [docsy](https://www.docsy.dev) theme and can be built locally by following these instructions: +This GitHub Pages site is generated with [Hugo](https://gohugo.io) using the [Docsy](https://www.docsy.dev) theme. ### Setup -To create a local setup of this site you can install `Docker` and `docker-compose` or `hugo` and `npm` on your local operating system. +Install Docker with the Compose plugin. The Make targets run Hugo and npm in the pinned container environment used by CI. +The image contains only the build toolchain and dependencies; Compose mounts the +working tree at `/src`. It is not a standalone website server image. -Clone this repository via `git clone https://github.com/make-models-fair/make-models-fair.github.io.git` +Clone this repository via: -#### Docker and docker-compose installed +```bash +git clone https://github.com/make-models-fair/make-models-fair.github.io.git +``` + +### Development -If you have Docker and docker-compose installed, you can use the Makefile in the repository to automatically serve a local copy of the site to test out any changes: +Build and start the hot-reloading development server at `http://localhost:1313`: + +```bash +make serve +``` -Build and start a docker container with a hot-reloading `hugo server` that you can visit in your browser at `http://localhost:1313` via +Build the production site into `public/` with the same container entrypoint used by CI: ```bash -% make serve +make render ``` -#### Install hugo and npm locally -If you don't have docker installed and don't mind installing things in your operating system, you can do the following: +Use `make stop` to stop the server. Run `make commands` to list all supported targets. + +The shared production entrypoint is `.github/scripts/build-site.sh`. + +#### Bibliography maintenance + +The model catalog has two coordinated sources of truth: + +- [`coordination/data/models.csv`](https://github.com/make-models-fair/coordination/blob/main/data/models.csv) + determines which publications appear in the model category tables and owns + their category, FAIR status, issue link, DOI, and `name_short` identifier. + Builds fetch and verify the immutable source recorded in + `model-catalog.lock.json`, not the moving `main` branch. +- `assets/bibliographies/publications.bib` owns the complete citation metadata + shown on the [model bibliography](https://tobefair.org/docs/models/publications/). -- Install the extended version of hugo from the [releases page](https://github.com/gohugoio/hugo/releases). -- Install npm via your operating system's package manager or from the [npm site](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm). -- Use hugo commands and npm to build/render the site. +The normalized DOI connects the two records. A publication must occur exactly +once in each source, and its BibTeX citation key must match `name_short`. The +existing `santos-etal-2006` collision is represented by the unique BibTeX key +`santos-rodrigues-pacheco-2006` and documented in the synchronization checker. + +To add, remove, or change a model publication: + +1. Update `data/models.csv` in the + [coordination repository](https://github.com/make-models-fair/coordination). +2. Add, remove, or update the corresponding complete record in + `assets/bibliographies/publications.bib`. Keep the DOI synchronized and use + `name_short` as the citation key. +3. Update the commit and SHA-256 checksum in `model-catalog.lock.json`. The + scheduled `update-model-catalog-lock.yml` workflow normally proposes this + change in a pull request and starts the site validation workflow. +4. Run `make bibliography-check` to fetch that revision, validate the exact CSV + schema, and compare every DOI and citation key. +5. Run `make render` to validate the BibTeX conversion and rendered site. + +Every render and development-server start fetches the pinned CSV once, checks +synchronization, converts the validated catalog and BibTeX source to ignored +Hugo data, and publishes the source bibliography at +`/bibliographies/publications.bib`. Do not edit `assets/data/models.csv`, +`data/models.json`, or `data/publications.json` directly. + +Use `make shell` for an interactive shell in the build container. npm dependency +maintenance must be performed there so local and CI environments remain consistent. + +### Deployment + +GitHub Pages must be configured with **GitHub Actions** as its build and deployment +source. Pushes to `main` then build and deploy through +`.github/workflows/gh-pages.yml`. +Pull requests run the same production render without deploying. + +Set `RENDER_BASE_URL` to verify deployment below a URL path, for example: ```bash -% hugo mod get -% npm install -% hugo serve # dev server without drafts -# OR -% hugo serve -D # dev server with drafts +RENDER_BASE_URL=https://example.org/making-models-fair/ make render ``` + +## FAIR stewardship + +`artifacts/fair/fair-management-plan.md` is the canonical living stewardship +plan. It inventories the managed research objects, records current metadata and +provenance controls, identifies unknowns, and defines the RO-Crate 1.3 roadmap +toward portable model aggregations. Update it when repositories, identifiers, +metadata standards, preservation plans, or stewardship responsibilities change. diff --git a/artifacts/fair/fair-management-plan.md b/artifacts/fair/fair-management-plan.md new file mode 100644 index 0000000..41f64f8 --- /dev/null +++ b/artifacts/fair/fair-management-plan.md @@ -0,0 +1,156 @@ +# FAIR Management Plan + +> Living stewardship plan for the Making Models FAIR website and its managed digital research objects. + +## Project Information + +| Field | Value | +|---|---| +| Project | Making Models FAIR | +| Acronym | MMF | +| Plan version | 0.1 | +| Date | 2026-08-15 | +| Principal investigator | Unknown | +| FAIR stewards | Repository maintainers; individual responsibilities are not yet recorded | +| Repository | | +| License | CC0-1.0 | + +## Executive Summary + +Making Models FAIR is a community initiative and website for improving the findability, accessibility, interoperability, and reusability of computational models. The repository manages the website software and documentation, a curated publication bibliography, a pinned snapshot of the model catalog maintained in the coordination repository, and a small vocabulary for the catalog's model domains. + +The current stewardship strategy uses version control, an exact container toolchain, a commit-pinned external catalog, validation before rendering, DOI-normalized bibliography records, Schema.org and SKOS metadata, and automated publication through GitHub Pages. The intended next packaging layer is an RO-Crate 1.3 research object that can aggregate model descriptions, publications, software, data, workflows, assessments, and provenance. This planned aggregation may support a future SciPod concept, but no nonstandard SciPod metadata type is asserted by this project. + +## Research Object Inventory + +Each managed research object appears once in this canonical inventory. + +| Research object | Type | Description | Repository or location | Identifier | Status | +|---|---|---|---|---|---| +| Website source | Research software | Hugo/Docsy source, layouts, assets, validation scripts, and containerized build workflow | This repository | Git commit; no release PID | Managed, active | +| Website content | Documentation | Initiative guidance, process documentation, model catalog pages, and news | `content/en/` in this repository | Git commit; page URLs after publication | Managed, active | +| Model publication bibliography | Dataset | Curated BibTeX metadata for publications represented in the model catalog | `assets/bibliographies/publications.bib` in this repository | DOI per record; Git commit for the collection | Managed, validated | +| Coordination model catalog | Dataset | Source CSV containing model publication, assessment, status, and repository fields | `make-models-fair/coordination:data/models.csv` | Source Git commit and SHA-256 recorded in `model-catalog.lock.json` | Externally maintained, locked locally | +| Model-domain vocabulary | Controlled vocabulary | Project labels and reviewed broad mappings for four model domains | `data/model_domains.yaml` in this repository | Git commit; term IRIs derived from the published model index | Initial version | +| Rendered website | Derived digital object | Static HTML, search index, machine-readable page metadata, assets, and bibliography download | GitHub Pages deployment; generated `public/` locally | Deployment URL and source Git commit | Rebuilt on accepted changes | + +Generated intermediates such as `assets/data/models.csv` and `data/publications.json` are transformations of inventoried objects, not independently managed research objects. + +## Findability + +### Persistent Identifiers + +- Publication records use DOI identifiers where available and required by the current validator. +- Website and catalog versions are identified by immutable Git commit hashes. +- The website source, rendered website, catalog collection, and vocabulary do not currently have archival PIDs or DOIs. +- Contributor ORCIDs, affiliations, and formal role assignments are unknown and must be collected before an archival release. + +### Metadata + +- BibTeX is canonical for publication citation metadata; generated JSON is a build derivative. +- The coordination CSV is canonical for model catalog status and assessment data; this repository pins a source commit rather than maintaining a second copy. +- Model-domain pages expose Schema.org `CollectionPage` and `DefinedTerm` JSON-LD. Broad external alignments use `skos:closeMatch`, not identity claims. +- A future aggregate package should use RO-Crate 1.3 JSON-LD. Software-level CodeMeta and citation metadata remain planned. +- DataCite metadata should be added if the website, bibliography collection, or aggregate package is deposited with a DOI. + +### Discovery + +The published website provides navigation, taxonomy pages, offline search, model tables, and a publication bibliography. GitHub provides repository discovery and version history. Search-engine indexing is enabled. Machine-readable metadata is currently page-scoped and does not yet describe a complete aggregate research object. + +## Accessibility + +### Repository Strategy + +- GitHub is the working repository for source, issues, reviews, and automation. +- GitHub Pages publishes the rendered website. +- The coordination repository is authoritative for the model catalog CSV. +- Zenodo, Software Heritage, CoMSES Net, or another preservation repository has not yet been selected for an archival release. + +### Access Conditions + +The repository and website are publicly accessible without authentication. GitHub authentication is required to propose changes through the hosted contribution workflow. No sensitive or controlled data are currently managed in this repository. + +### Preservation + +Git history and GitHub Pages provide operational versioning, but they are not a complete preservation strategy. Before a stable release, maintainers should archive a tagged source release and its RO-Crate in a repository that issues persistent identifiers, and record the resulting DOI or SWHID here. Retention period and named preservation responsibility are currently unknown. + +## Interoperability + +- Source content uses Markdown/HTML, configuration uses YAML, model data use CSV, publications use BibTeX and derived JSON, and metadata use JSON-LD. +- Page metadata uses Schema.org and SKOS. Future software and package metadata should use CodeMeta and RO-Crate 1.3; provenance should use W3C PROV-O or the RO-Crate provenance profile. +- Model domains use project-preferred labels with broad Wikidata links expressed as `skos:closeMatch`. These mappings require maintainer review when domain scope changes. +- The coordination CSV schema is validated exactly and normalized to named JSON records before rendering; templates do not access positional columns. +- The absence of an authoritative SciPod vocabulary is an explicit interoperability limitation. The project will model aggregate objects with established standards rather than inventing an incompatible type. + +## Reusability + +Build and maintenance workflows are documented in `README.md`, tool versions are exact, and rendering occurs in a Docker Compose toolchain. The model snapshot and bibliography are checked together before publication. Git records changes and review history. + +Known limitations are the lack of release citation metadata, archival identifiers, contributor role metadata, a formal preservation target, and an aggregate RO-Crate. Model publications and externally maintained repositories retain their own rights and licenses; this repository's CC0 dedication does not relicense them. + +## Provenance + +The model catalog snapshot is fetched from the repository, path, and commit in `model-catalog.lock.json`, then verified against its SHA-256 checksum. The build validates its schema and synchronizes its 94 publication DOIs against the canonical BibTeX bibliography. Bibliography JSON and the static website are generated only after validation. GitHub Actions records the source commit and build run for deployments. Scheduled automation proposes lock changes by pull request so bibliography and catalog changes can be reviewed together. + +Future RO-Crate packaging should record these relationships using W3C PROV-O or the RO-Crate provenance profile, including the source commit, toolchain versions, transformation commands, generated objects, and deployment. A machine-readable provenance manifest is not yet maintained. + +## Computational Environment + +- Hugo Extended is pinned in `HUGO_VERSION` and used through the official Hugo container image. +- Node dependencies, including Docsy, bibliography parsing, and Mermaid, are exact in `package.json` and `package-lock.json`. +- Docker Compose mounts the working tree into a toolchain-only image. `make build`, `make render`, `make serve`, and `make bibliography-check` are the supported interfaces. +- The build requires network access to fetch the commit-pinned coordination CSV. Runtime website rendering does not require that source service. + +## Licensing + +The website repository uses the CC0-1.0 public-domain dedication. Dependency licenses are represented by their packages and lockfile but have not been consolidated into a reviewed inventory. Publication metadata and model catalog facts may have different rights considerations from the surrounding software. Licenses for linked model implementations, input data, and workflows must be recorded by each model-level package; unknown rights must not be inferred from this repository's license. + +## Roles and Responsibilities + +Repository maintainers currently review content, metadata, software, catalog pins, and deployments through pull requests. Named responsibility for FAIR review, vocabulary stewardship, preservation, and archival deposits is unknown. These assignments, contributor identities, ORCIDs, affiliations, and credit roles should be added before an archival release. + +## Resources + +Current infrastructure uses GitHub repositories, Actions, and Pages plus public package and source hosting. Storage, identifier registration, curation effort, archival costs, and long-term preservation funding are unknown. The project should estimate these when selecting an archival repository and defining a release cadence. + +## Security and Ethics + +Automation has least-privilege defaults: the site build is read-only, while the scheduled updater receives scoped write access only to create a reviewable branch, pull request, and validation dispatch. External CSV content is treated as data, validated, and never executed. Dependencies and GitHub Actions remain supply-chain inputs and require periodic review. + +This repository does not currently manage personal or sensitive research data. FAIR packaging alone does not resolve consent, authority, collective benefit, or other ethical questions associated with models and their source data; those concerns require model-specific governance review. + +## FAIR Assessment + +| Principle | Status | Notes | +|---|---|---| +| Findable | Partial | DOI-backed publications, search, taxonomy pages, and JSON-LD exist; collection-level PIDs and complete metadata are missing. | +| Accessible | Partial | Source and site are public; preservation location and long-term access policy are not defined. | +| Interoperable | Partial | Open formats, Schema.org, SKOS, named catalog records, and exact schema validation are used; CodeMeta, RO-Crate, and richer model metadata remain planned. | +| Reusable | Partial | License, documentation, exact dependencies, and validation exist; citation metadata, role metadata, license inventory, archival releases, and complete provenance are missing. | + +## Planned Improvements + +1. Review domain mappings and publish the vocabulary as part of an RO-Crate 1.3 metadata graph. +2. Define a model-level crate profile connecting each publication, implementation, data dependency, workflow, assessment, and provenance record. +3. Add canonical `codemeta.json` and derive consistent `CITATION.cff` metadata for an identified release. +4. Select an archival repository, mint persistent identifiers, and record retention and preservation responsibility. +5. Capture named steward roles, ORCIDs, affiliations, contributor roles, and model-level rights information. +6. Add a machine-readable provenance manifest when the RO-Crate workflow is implemented. + +## Review History + +| Version | Date | Summary | +|---|---|---| +| 0.1 | 2026-08-15 | Initial inventory, current controls, metadata strategy, unknowns, and RO-Crate/SciPod roadmap. | + +## Derived Management Plans + +No funder-facing DMP or SMP is currently required. Any future plan must be derived from this FAIR Management Plan, and new stewardship decisions discovered during that process must first be recorded here. + +## Related Artifacts + +- `README.md` +- `LICENSE` +- `model-catalog.lock.json` +- `assets/bibliographies/publications.bib` +- `data/model_domains.yaml` diff --git a/assets/bibliographies/publications.bib b/assets/bibliographies/publications.bib new file mode 100644 index 0000000..a138ede --- /dev/null +++ b/assets/bibliographies/publications.bib @@ -0,0 +1,189 @@ +@string{Sept = "September"} + +@article{abramson-kuperman-2001, title={Social games in a social network}, volume={63}, ISSN={1095-3787}, url={http://dx.doi.org/10.1103/PhysRevE.63.030901}, DOI={10.1103/physreve.63.030901}, number={3}, journal={Physical Review E}, publisher={American Physical Society (APS)}, author={Abramson, Guillermo and Kuperman, Marcelo}, year={2001}, month=Feb } + +@article{alizadeh-2011, title={A dynamic cellular automaton model for evacuation process with obstacles}, volume={49}, ISSN={0925-7535}, url={http://dx.doi.org/10.1016/j.ssci.2010.09.006}, DOI={10.1016/j.ssci.2010.09.006}, number={2}, journal={Safety Science}, publisher={Elsevier BV}, author={Alizadeh, R.}, year={2011}, month=Feb, pages={315–323} } + +@article{almeida-etal-2003, title={Stochastic cellular automata modeling of urban land use dynamics: empirical development and estimation}, volume={27}, ISSN={0198-9715}, url={http://dx.doi.org/10.1016/S0198-9715(02)00042-X}, DOI={10.1016/s0198-9715(02)00042-x}, number={5}, journal={Computers, Environment and Urban Systems}, publisher={Elsevier BV}, author={Maria de Almeida, Cláudia and Batty, Michael and Vieira Monteiro, Antonio Miguel and Câmara, Gilberto and Soares-Filho, Britaldo Silveira and Cerqueira, Gustavo Coutinho and Pennachin, Cássio Lopes}, year={2003}, month=Sept, pages={481–509} } + +@article{almeida-etal-2008, title={Using neural networks and cellular automata for modelling intra‐urban land‐use dynamics}, volume={22}, ISSN={1362-3087}, url={http://dx.doi.org/10.1080/13658810701731168}, DOI={10.1080/13658810701731168}, number={9}, journal={International Journal of Geographical Information Science}, publisher={Informa UK Limited}, author={Almeida, C. M. and Gleriani, J. M. and Castejon, E. F. and Soares‐Filho, B. S.}, year={2008}, month=Sept, pages={943–963} } + +@article{alroy-2001, title={A Multispecies Overkill Simulation of the End-Pleistocene Megafaunal Mass Extinction}, volume={292}, ISSN={1095-9203}, url={http://dx.doi.org/10.1126/science.1059342}, DOI={10.1126/science.1059342}, number={5523}, journal={Science}, publisher={American Association for the Advancement of Science (AAAS)}, author={Alroy, John}, year={2001}, month=June, pages={1893–1896} } + +@article{arsanjani-etal-2013, title={Integration of logistic regression, Markov chain and cellular automata models to simulate urban expansion}, volume={21}, ISSN={1569-8432}, url={http://dx.doi.org/10.1016/j.jag.2011.12.014}, DOI={10.1016/j.jag.2011.12.014}, journal={International Journal of Applied Earth Observation and Geoinformation}, publisher={Elsevier BV}, author={Jokar Arsanjani, Jamal and Helbich, Marco and Kainz, Wolfgang and Darvishi Boloorani, Ali}, year={2013}, month=Apr, pages={265–275} } + +@article{axelrod-1986, title={An Evolutionary Approach to Norms}, volume={80}, ISSN={1537-5943}, url={http://dx.doi.org/10.2307/1960858}, DOI={10.2307/1960858}, number={4}, journal={American Political Science Review}, publisher={Cambridge University Press (CUP)}, author={Axelrod, Robert}, year={1986}, month=Dec, pages={1095–1111} } + +@article{balagadde-etal-2008, title={A synthetic Escherichia coli predator–prey ecosystem}, volume={4}, ISSN={1744-4292}, url={http://dx.doi.org/10.1038/msb.2008.24}, DOI={10.1038/msb.2008.24}, number={1}, journal={Molecular Systems Biology}, publisher={Springer Science and Business Media LLC}, author={Balagaddé, Frederick K and Song, Hao and Ozaki, Jun and Collins, Cynthia H and Barnet, Matthew and Arnold, Frances H and Quake, Stephen R and You, Lingchong}, year={2008}, month=Apr } + +@article{barredo-etal-2003, title={Modelling dynamic spatial processes: simulation of urban future scenarios through cellular automata}, volume={64}, ISSN={0169-2046}, url={http://dx.doi.org/10.1016/S0169-2046(02)00218-9}, DOI={10.1016/s0169-2046(02)00218-9}, number={3}, journal={Landscape and Urban Planning}, publisher={Elsevier BV}, author={Barredo, José I. and Kasanko, Marjo and McCormick, Niall and Lavalle, Carlo}, year={2003}, month=July, pages={145–160} } + +@article{bascompte-etal-2006, title={Asymmetric Coevolutionary Networks Facilitate Biodiversity Maintenance}, volume={312}, ISSN={1095-9203}, url={http://dx.doi.org/10.1126/science.1123412}, DOI={10.1126/science.1123412}, number={5772}, journal={Science}, publisher={American Association for the Advancement of Science (AAAS)}, author={Bascompte, Jordi and Jordano, Pedro and Olesen, Jens M.}, year={2006}, month=Apr, pages={431–433} } + +@article{batty-etal-1999, title={Modeling urban dynamics through GIS-based cellular automata}, volume={23}, ISSN={0198-9715}, url={http://dx.doi.org/10.1016/S0198-9715(99)00015-0}, DOI={10.1016/s0198-9715(99)00015-0}, number={3}, journal={Computers, Environment and Urban Systems}, publisher={Elsevier BV}, author={Batty, M. and Xie, Yichun and Sun, Zhanli}, year={1999}, month=May, pages={205–233} } + +@article{batty-etal-2003, title={The discrete dynamics of small-scale spatial events: agent-based models of mobility in carnivals and street parades}, volume={17}, ISSN={1362-3087}, url={http://dx.doi.org/10.1080/1365881031000135474}, DOI={10.1080/1365881031000135474}, number={7}, journal={International Journal of Geographical Information Science}, publisher={Informa UK Limited}, author={Batty, Michael and Desyllas, Jake and Duxbury, Elspeth}, year={2003}, month=Oct, pages={673–697} } + +@article{bever-etal-1997, title={Incorporating the Soil Community into Plant Population Dynamics: The Utility of the Feedback Approach}, volume={85}, ISSN={0022-0477}, url={http://dx.doi.org/10.2307/2960528}, DOI={10.2307/2960528}, number={5}, journal={The Journal of Ecology}, publisher={JSTOR}, author={Bever, James D. and Westover, Kristi M. and Antonovics, Janis}, year={1997}, month=Oct, pages={561} } + +@article{brose-etal-2006, title={Allometric scaling enhances stability in complex food webs}, volume={9}, ISSN={1461-0248}, url={http://dx.doi.org/10.1111/j.1461-0248.2006.00978.x}, DOI={10.1111/j.1461-0248.2006.00978.x}, number={11}, journal={Ecology Letters}, publisher={Wiley}, author={Brose, Ulrich and Williams, Richard J. and Martinez, Neo D.}, year={2006}, month=Oct, pages={1228–1236} } + +@article{castella-etal-2005, title={Participatory Simulation of Land-Use Changes in the Northern Mountains of Vietnam: the Combined Use of an Agent-Based Model, a Role-Playing Game, and a Geographic Information System}, volume={10}, ISSN={1708-3087}, url={http://dx.doi.org/10.5751/ES-01328-100127}, DOI={10.5751/es-01328-100127}, number={1}, journal={Ecology and Society}, publisher={Resilience Alliance, Inc.}, author={Castella, Jean-Christophe and Trung, Tran Ngoc and Boissau, Stanislas}, year={2005} } + +@article{castella-verburg-2007, title={Combination of process-oriented and pattern-oriented models of land-use change in a mountain area of Vietnam}, volume={202}, ISSN={0304-3800}, url={http://dx.doi.org/10.1016/j.ecolmodel.2006.11.011}, DOI={10.1016/j.ecolmodel.2006.11.011}, number={3-4}, journal={Ecological Modelling}, publisher={Elsevier BV}, author={Castella, Jean-Christophe and Verburg, Peter H.}, year={2007}, month=Apr, pages={410–420} } + +@article{chave-etal-2002, title={Comparing Classical Community Models: Theoretical Consequences for Patterns of Diversity}, volume={159}, ISSN={1537-5323}, url={http://dx.doi.org/10.1086/324112}, DOI={10.1086/324112}, number={1}, journal={The American Naturalist}, publisher={University of Chicago Press}, author={Chave, Jérôme and Muller‐Landau, Helene C. and Levin, Simon A.}, year={2002}, month=Jan, pages={1–23} } + +@article{choi-bowles-2007, title={The Coevolution of Parochial Altruism and War}, volume={318}, ISSN={1095-9203}, url={http://dx.doi.org/10.1126/science.1144237}, DOI={10.1126/science.1144237}, number={5850}, journal={Science}, publisher={American Association for the Advancement of Science (AAAS)}, author={Choi, Jung-Kyoo and Bowles, Samuel}, year={2007}, month=Oct, pages={636–640} } + +@article{cowen-etal-2000, title={Connectivity of Marine Populations: Open or Closed?}, volume={287}, ISSN={1095-9203}, url={http://dx.doi.org/10.1126/science.287.5454.857}, DOI={10.1126/science.287.5454.857}, number={5454}, journal={Science}, publisher={American Association for the Advancement of Science (AAAS)}, author={Cowen, Robert K. and Lwiza, Kamazima M. M. and Sponaugle, Su and Paris, Claire B. and Olson, Donald B.}, year={2000}, month=Feb, pages={857–859} } + +@article{coyte-etal-2015, title={The ecology of the microbiome: Networks, competition, and stability}, volume={350}, ISSN={1095-9203}, url={http://dx.doi.org/10.1126/science.aad2602}, DOI={10.1126/science.aad2602}, number={6261}, journal={Science}, publisher={American Association for the Advancement of Science (AAAS)}, author={Coyte, Katharine Z. and Schluter, Jonas and Foster, Kevin R.}, year={2015}, month=Nov, pages={663–666} } + +@article{deadman-etal-2004, title={Colonist Household Decisionmaking and Land-Use Change in the Amazon Rainforest: An Agent-Based Simulation}, volume={31}, ISSN={1472-3417}, url={http://dx.doi.org/10.1068/b3098}, DOI={10.1068/b3098}, number={5}, journal={Environment and Planning B: Planning and Design}, publisher={SAGE Publications}, author={Deadman, Peter and Robinson, Derek and Moran, Emilio and Brondizio, Eduardo}, year={2004}, month=Oct, pages={693–709} } + +@article{dieckmann-doebeli-1999, title={On the origin of species by sympatric speciation}, volume={400}, ISSN={1476-4687}, url={http://dx.doi.org/10.1038/22521}, DOI={10.1038/22521}, number={6742}, journal={Nature}, publisher={Springer Science and Business Media LLC}, author={Dieckmann, Ulf and Doebeli, Michael}, year={1999}, month=July, pages={354–357} } + +@article{enquist-niklas-2001, title={Invariant scaling relations across tree-dominated communities}, volume={410}, ISSN={1476-4687}, url={http://dx.doi.org/10.1038/35070500}, DOI={10.1038/35070500}, number={6829}, journal={Nature}, publisher={Springer Science and Business Media LLC}, author={Enquist, Brian J. and Niklas, Karl J.}, year={2001}, month=Apr, pages={655–660} } + +@article{evans-kelley-2004, title={Multi-scale analysis of a household level agent-based model of landcover change}, volume={72}, ISSN={0301-4797}, url={http://dx.doi.org/10.1016/j.jenvman.2004.02.008}, DOI={10.1016/j.jenvman.2004.02.008}, number={1-2}, journal={Journal of Environmental Management}, publisher={Elsevier BV}, author={Evans, Tom P. and Kelley, Hugh}, year={2004}, month=Aug, pages={57–72} } + +@article{fang-etal-2005, title={The impact of interactions in spatial simulation of the dynamics of urban sprawl}, volume={73}, ISSN={0169-2046}, url={http://dx.doi.org/10.1016/J.LANDURBPLAN.2004.08.006}, DOI={10.1016/j.landurbplan.2004.08.006}, number={4}, journal={Landscape and Urban Planning}, publisher={Elsevier BV}, author={Fang, Shoufan and Gertner, George Z. and Sun, Zhanli and Anderson, Alan A.}, year={2005}, month=Dec, pages={294–306} } + +@article{freilich-etal-2011, title={Competitive and cooperative metabolic interactions in bacterial communities}, volume={2}, ISSN={2041-1723}, url={http://dx.doi.org/10.1038/ncomms1597}, DOI={10.1038/ncomms1597}, number={1}, journal={Nature Communications}, publisher={Springer Science and Business Media LLC}, author={Freilich, Shiri and Zarecki, Raphy and Eilam, Omer and Segal, Ella Shtifman and Henry, Christopher S. and Kupiec, Martin and Gophna, Uri and Sharan, Roded and Ruppin, Eytan}, year={2011}, month=Dec } + +@article{goudet-etal-2002, title={Tests for sex‐biased dispersal using bi‐parentally inherited genetic markers}, volume={11}, ISSN={1365-294X}, url={http://dx.doi.org/10.1046/j.1365-294x.2002.01496.x}, DOI={10.1046/j.1365-294x.2002.01496.x}, number={6}, journal={Molecular Ecology}, publisher={Wiley}, author={Goudet, Jérôme and Perrin, Nicolas and Waser, Peter}, year={2002}, month=May, pages={1103–1114} } + +@article{guimera-etal-2005, title={Team Assembly Mechanisms Determine Collaboration Network Structure and Team Performance}, volume={308}, ISSN={1095-9203}, url={http://dx.doi.org/10.1126/science.1106340}, DOI={10.1126/science.1106340}, number={5722}, journal={Science}, publisher={American Association for the Advancement of Science (AAAS)}, author={Guimerà, Roger and Uzzi, Brian and Spiro, Jarrett and Amaral, Luís A. Nunes}, year={2005}, month=Apr, pages={697–702} } + +@article{gustafson-gardner-1996, title={The Effect of Landscape Heterogeneity on the Probability of Patch Colonization}, volume={77}, ISSN={1939-9170}, url={http://dx.doi.org/10.2307/2265659}, DOI={10.2307/2265659}, number={1}, journal={Ecology}, publisher={Wiley}, author={Gustafson, Eric J. and Gardner, Robert H.}, year={1996}, month=Jan, pages={94–107} } + +@article{hallet-etal-2004, title={Why large-scale climate indices seem to predict ecological processes better than local weather}, volume={430}, ISSN={1476-4687}, url={http://dx.doi.org/10.1038/nature02708}, DOI={10.1038/nature02708}, number={6995}, journal={Nature}, publisher={Springer Science and Business Media LLC}, author={Hallett, T. B. and Coulson, T. and Pilkington, J. G. and Clutton-Brock, T. H. and Pemberton, J. M. and Grenfell, B. T.}, year={2004}, month=July, pages={71–75} } + +@article{hammond-axelrod-2006, title={The Evolution of Ethnocentrism}, volume={50}, ISSN={1552-8766}, url={http://dx.doi.org/10.1177/0022002706293470}, DOI={10.1177/0022002706293470}, number={6}, journal={Journal of Conflict Resolution}, publisher={SAGE Publications}, author={Hammond, Ross A. and Axelrod, Robert}, year={2006}, month=Dec, pages={926–936} } + +@article{hauert-etal-2007, title={Via Freedom to Coercion: The Emergence of Costly Punishment}, volume={316}, ISSN={1095-9203}, url={http://dx.doi.org/10.1126/science.1141588}, DOI={10.1126/science.1141588}, number={5833}, journal={Science}, publisher={American Association for the Advancement of Science (AAAS)}, author={Hauert, Christoph and Traulsen, Arne and Brandt, Hannelore and Nowak, Martin A. and Sigmund, Karl}, year={2007}, month=June, pages={1905–1907} } + +@article{helbing-etal-2000, title={Simulating dynamical features of escape panic}, volume={407}, ISSN={1476-4687}, url={http://dx.doi.org/10.1038/35035023}, DOI={10.1038/35035023}, number={6803}, journal={Nature}, publisher={Springer Science and Business Media LLC}, author={Helbing, Dirk and Farkas, Illés and Vicsek, Tamás}, year={2000}, month=Sept, pages={487–490} } + +@article{helbing-etal-2005, title={Self-Organized Pedestrian Crowd Dynamics: Experiments, Simulations, and Design Solutions}, volume={39}, ISSN={1526-5447}, url={http://dx.doi.org/10.1287/trsc.1040.0108}, DOI={10.1287/trsc.1040.0108}, number={1}, journal={Transportation Science}, publisher={Institute for Operations Research and the Management Sciences (INFORMS)}, author={Helbing, Dirk and Buzna, Lubos and Johansson, Anders and Werner, Torsten}, year={2005}, month=Feb, pages={1–24} } + +@article{helbing-etal-2010, title={Evolutionary Establishment of Moral and Double Moral Standards through Spatial Interactions}, volume={6}, ISSN={1553-7358}, url={http://dx.doi.org/10.1371/journal.pcbi.1000758}, DOI={10.1371/journal.pcbi.1000758}, number={4}, journal={PLoS Computational Biology}, publisher={Public Library of Science (PLoS)}, author={Helbing, Dirk and Szolnoki, Attila and Perc, Matjaž and Szabó, György}, editor={Bergstrom, Carl T.}, year={2010}, month=Apr, pages={e1000758} } + +@article{helbing-molnar-1995, title={Social force model for pedestrian dynamics}, volume={51}, ISSN={1095-3787}, url={http://dx.doi.org/10.1103/physreve.51.4282}, DOI={10.1103/physreve.51.4282}, number={5}, journal={Physical Review E}, publisher={American Physical Society (APS)}, author={Helbing, Dirk and Molnár, Péter}, year={1995}, month=May, pages={4282–4286} } + +@article{helbing-yu-2009, title={The outbreak of cooperation among success-driven individuals under noisy conditions}, volume={106}, ISSN={1091-6490}, url={http://dx.doi.org/10.1073/pnas.0811503106}, DOI={10.1073/pnas.0811503106}, number={10}, journal={Proceedings of the National Academy of Sciences}, publisher={National Academy of Sciences}, author={Helbing, Dirk and Yu, Wenjian}, year={2009}, month=Mar, pages={3680–3685} } + +@article{henein-white-2007, title={Macroscopic effects of microscopic forces between agents in crowd models}, volume={373}, ISSN={0378-4371}, url={http://dx.doi.org/10.1016/j.physa.2006.06.023}, DOI={10.1016/j.physa.2006.06.023}, journal={Physica A: Statistical Mechanics and its Applications}, publisher={Elsevier BV}, author={Henein, Colin M. and White, Tony}, year={2007}, month=Jan, pages={694–712} } + +@article{higgins-etal-2000, title={Fire, resprouting and variability: a recipe for grass–tree coexistence in savanna}, volume={88}, ISSN={1365-2745}, url={http://dx.doi.org/10.1046/j.1365-2745.2000.00435.x}, DOI={10.1046/j.1365-2745.2000.00435.x}, number={2}, journal={Journal of Ecology}, publisher={Wiley}, author={Higgins, Steven I. and Bond, William J. and Trollope, Winston S. W.}, year={2000}, month=Apr, pages={213–229} } + +@article{kamusoko-etal-2009, title={Rural sustainability under threat in Zimbabwe – Simulation of future land use/cover changes in the Bindura district based on the Markov-cellular automata model}, volume={29}, ISSN={0143-6228}, url={http://dx.doi.org/10.1016/j.apgeog.2008.10.002}, DOI={10.1016/j.apgeog.2008.10.002}, number={3}, journal={Applied Geography}, publisher={Elsevier BV}, author={Kamusoko, Courage and Aniya, Masamu and Adi, Bongo and Manjoro, Munyaradzi}, year={2009}, month=July, pages={435–447} } + +@inbook{karamouzas-etal-2009, title={A Predictive Collision Avoidance Model for Pedestrian Simulation}, ISBN={9783642103476}, ISSN={1611-3349}, url={http://dx.doi.org/10.1007/978-3-642-10347-6_4}, DOI={10.1007/978-3-642-10347-6_4}, booktitle={Motion in Games}, publisher={Springer Berlin Heidelberg}, author={Karamouzas, Ioannis and Heil, Peter and van Beek, Pascal and Overmars, Mark H.}, year={2009}, pages={41–52} } + +@article{keeling-1999, title={The effects of local spatial structure on epidemiological invasions}, volume={266}, ISSN={1471-2954}, url={http://dx.doi.org/10.1098/rspb.1999.0716}, DOI={10.1098/rspb.1999.0716}, number={1421}, journal={Proceedings of the Royal Society of London. Series B: Biological Sciences}, publisher={The Royal Society}, author={Keeling, M. J.}, year={1999}, month=Apr, pages={859–867} } + +@article{kirchner-etal-2004, title={Discretization effects and the influence of walking speed in cellular automata models for pedestrian dynamics}, volume={2004}, ISSN={1742-5468}, url={http://dx.doi.org/10.1088/1742-5468/2004/10/P10011}, DOI={10.1088/1742-5468/2004/10/p10011}, number={10}, journal={Journal of Statistical Mechanics: Theory and Experiment}, publisher={IOP Publishing}, author={Kirchner, Ansgar and Klüpfel, Hubert and Nishinari, Katsuhiro and Schadschneider, Andreas and Schreckenberg, Michael}, year={2004}, month=Oct, pages={P10011} } + +@article{kreft-etal-1998, title={BacSim, a simulator for individual-based modelling of bacterial colony growth}, volume={144}, ISSN={1465-2080}, url={http://dx.doi.org/10.1099/00221287-144-12-3275}, DOI={10.1099/00221287-144-12-3275}, number={12}, journal={Microbiology}, publisher={Microbiology Society}, author={Kreft, Jan-Ulrich and Booth, Ginger and Wimpenny, Julian W. T.}, year={1998}, month=Dec, pages={3275–3287} } + +@article{lakoba-etal-2005, title={Modifications of the Helbing-Molnár-Farkas-Vicsek Social Force Model for Pedestrian Evolution}, volume={81}, ISSN={1741-3133}, url={http://dx.doi.org/10.1177/0037549705052772}, DOI={10.1177/0037549705052772}, number={5}, journal={SIMULATION}, publisher={SAGE Publications}, author={Lakoba, Taras I. and Kaup, D. J. and Finkelstein, Neal M.}, year={2005}, month=May, pages={339–352} } + +@article{leimar-hammerstein-2001, title={Evolution of cooperation through indirect reciprocity}, volume={268}, ISSN={1471-2954}, url={http://dx.doi.org/10.1098/rspb.2000.1573}, DOI={10.1098/rspb.2000.1573}, number={1468}, journal={Proceedings of the Royal Society of London. Series B: Biological Sciences}, publisher={The Royal Society}, author={Leimar, Olof and Hammerstein, Peter}, year={2001}, month=Apr, pages={745–753} } + +@article{ligtenberg-etal-2001, title={Multi-actor-based land use modelling: spatial planning using agents}, volume={56}, ISSN={0169-2046}, url={http://dx.doi.org/10.1016/S0169-2046(01)00162-1}, DOI={10.1016/s0169-2046(01)00162-1}, number={1-2}, journal={Landscape and Urban Planning}, publisher={Elsevier BV}, author={Ligtenberg, Arend and Bregt, Arnold K. and van Lammeren, Ron}, year={2001}, month=Sept, pages={21–33} } + +@article{ligtenberg-etal-2004, title={A design and application of a multi-agent system for simulation of multi-actor spatial planning}, volume={72}, ISSN={0301-4797}, url={http://dx.doi.org/10.1016/j.jenvman.2004.02.007}, DOI={10.1016/j.jenvman.2004.02.007}, number={1-2}, journal={Journal of Environmental Management}, publisher={Elsevier BV}, author={Ligtenberg, Arend and Wachowicz, Monica and Bregt, Arnold K and Beulens, Adrie and Kettenis, Dirk L}, year={2004}, month=Aug, pages={43–55} } + +@article{liu-passino-2004, title={Stable Social Foraging Swarms in a Noisy Environment}, volume={49}, ISSN={0018-9286}, url={http://dx.doi.org/10.1109/TAC.2003.821416}, DOI={10.1109/tac.2003.821416}, number={1}, journal={IEEE Transactions on Automatic Control}, publisher={Institute of Electrical and Electronics Engineers (IEEE)}, author={Liu, Y. and Passino, K.M.}, year={2004}, month=Jan, pages={30–44} } + +@article{macy-flache-2002, title={Learning dynamics in social dilemmas}, volume={99}, ISSN={1091-6490}, url={http://dx.doi.org/10.1073/pnas.092080099}, DOI={10.1073/pnas.092080099}, number={suppl_3}, journal={Proceedings of the National Academy of Sciences}, publisher={National Academy of Sciences}, author={Macy, Michael W. and Flache, Andreas}, year={2002}, month=May, pages={7229–7236} } + +@article{macy-skvoretz-1998, title={The Evolution of Trust and Cooperation between Strangers: A Computational Model}, volume={63}, ISSN={0003-1224}, url={http://dx.doi.org/10.2307/2657332}, DOI={10.2307/2657332}, number={5}, journal={American Sociological Review}, publisher={SAGE Publications}, author={Macy, Michael W. and Skvoretz, John}, year={1998}, month=Oct, pages={638} } + +@article{manson-2005, title={Agent-based modeling and genetic programming for modeling land change in the Southern Yucatán Peninsular Region of Mexico}, volume={111}, ISSN={0167-8809}, url={http://dx.doi.org/10.1016/j.agee.2005.04.024}, DOI={10.1016/j.agee.2005.04.024}, number={1-4}, journal={Agriculture, Ecosystems & Environment}, publisher={Elsevier BV}, author={Manson, Steven M.}, year={2005}, month=Dec, pages={47–62} } + +@article{moorcroft-etal-2001, title={A METHOD FOR SCALING VEGETATION DYNAMICS: THE ECOSYSTEM DEMOGRAPHY MODEL (ED)}, volume={71}, ISSN={0012-9615}, url={http://dx.doi.org/10.1890/0012-9615(2001)071[0557:AMFSVD]2.0.CO;2}, DOI={10.1890/0012-9615(2001)071[0557:amfsvd]2.0.co;2}, number={4}, journal={Ecological Monographs}, publisher={Wiley}, author={Moorcroft, P. R. and Hurtt, G. C. and Pacala, S. W.}, year={2001}, month=Nov, pages={557–586} } + +@article{morin-thuiller-2009, title={Comparing niche‐ and process‐based models to reduce prediction uncertainty in species range shifts under climate change}, volume={90}, ISSN={1939-9170}, url={http://dx.doi.org/10.1890/08-0134.1}, DOI={10.1890/08-0134.1}, number={5}, journal={Ecology}, publisher={Wiley}, author={Morin, Xavier and Thuiller, Wilfried}, year={2009}, month=May, pages={1301–1313} } + +@article{moussaid-etal-2011, title={How simple rules determine pedestrian behavior and crowd disasters}, volume={108}, ISSN={1091-6490}, url={http://dx.doi.org/10.1073/pnas.1016507108}, DOI={10.1073/pnas.1016507108}, number={17}, journal={Proceedings of the National Academy of Sciences}, publisher={National Academy of Sciences}, author={Moussaïd, Mehdi and Helbing, Dirk and Theraulaz, Guy}, year={2011}, month=Apr, pages={6884–6888} } + +@article{nakamaru-etal-1997, title={The Evolution of Cooperation in a Lattice-Structured Population}, volume={184}, ISSN={0022-5193}, url={http://dx.doi.org/10.1006/jtbi.1996.0243}, DOI={10.1006/jtbi.1996.0243}, number={1}, journal={Journal of Theoretical Biology}, publisher={Elsevier BV}, author={Nakamaru, M. and Matsuda, H. and Iwasa, Y.}, year={1997}, month=Jan, pages={65–81} } + +@article{nowak-sigmund-1993, title={A strategy of win-stay, lose-shift that outperforms tit-for-tat in the Prisoner’s Dilemma game}, volume={364}, ISSN={1476-4687}, url={http://dx.doi.org/10.1038/364056a0}, DOI={10.1038/364056a0}, number={6432}, journal={Nature}, publisher={Springer Science and Business Media LLC}, author={Nowak, Martin and Sigmund, Karl}, year={1993}, month=July, pages={56–58} } + +@article{nowak-sigmund-1998, title={Evolution of indirect reciprocity by image scoring}, volume={393}, ISSN={1476-4687}, url={http://dx.doi.org/10.1038/31225}, DOI={10.1038/31225}, number={6685}, journal={Nature}, publisher={Springer Science and Business Media LLC}, author={Nowak, Martin A. and Sigmund, Karl}, year={1998}, month=June, pages={573–577} } + +@article{olden-poff-2003, title={Toward a Mechanistic Understanding and Prediction of Biotic Homogenization}, volume={162}, ISSN={1537-5323}, url={http://dx.doi.org/10.1086/378212}, DOI={10.1086/378212}, number={4}, journal={The American Naturalist}, publisher={University of Chicago Press}, author={Olden, Julian D. and Poff, N. LeRoy}, year={2003}, month=Oct, pages={442–460} } + +@article{olfati-saber-2006, title={Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory}, volume={51}, ISSN={0018-9286}, url={http://dx.doi.org/10.1109/TAC.2005.864190}, DOI={10.1109/tac.2005.864190}, number={3}, journal={IEEE Transactions on Automatic Control}, publisher={Institute of Electrical and Electronics Engineers (IEEE)}, author={Olfati-Saber, R.}, year={2006}, month=Mar, pages={401–420} } + +@article{parker-meretsky-2004, title={Measuring pattern outcomes in an agent-based model of edge-effect externalities using spatial metrics}, volume={101}, ISSN={0167-8809}, url={http://dx.doi.org/10.1016/j.agee.2003.09.007}, DOI={10.1016/j.agee.2003.09.007}, number={2-3}, journal={Agriculture, Ecosystems & Environment}, publisher={Elsevier BV}, author={Parker, Dawn C. and Meretsky, Vicky}, year={2004}, month=Feb, pages={233–250} } + +@article{pelechano-badler-2006, title={Modeling Crowd and Trained Leader Behavior during Building Evacuation}, volume={26}, ISSN={0272-1716}, url={http://dx.doi.org/10.1109/mcg.2006.133}, DOI={10.1109/mcg.2006.133}, number={6}, journal={IEEE Computer Graphics and Applications}, publisher={Institute of Electrical and Electronics Engineers (IEEE)}, author={Pelechano, Nuria and Badler, Norman}, year={2006}, month=Nov, pages={80–86} } + +@article{perc-wang-2010, title={Heterogeneous Aspirations Promote Cooperation in the Prisoner’s Dilemma Game}, volume={5}, ISSN={1932-6203}, url={http://dx.doi.org/10.1371/journal.pone.0015117}, DOI={10.1371/journal.pone.0015117}, number={12}, journal={PLoS ONE}, publisher={Public Library of Science (PLoS)}, author={Perc, Matjaž and Wang, Zhen}, editor={Marshall, James A. R.}, year={2010}, month=Dec, pages={e15117} } + +@article{riolo-etal-2001, title={Evolution of cooperation without reciprocity}, volume={414}, ISSN={1476-4687}, url={http://dx.doi.org/10.1038/35106555}, DOI={10.1038/35106555}, number={6862}, journal={Nature}, publisher={Springer Science and Business Media LLC}, author={Riolo, Rick L. and Cohen, Michael D. and Axelrod, Robert}, year={2001}, month=Nov, pages={441–443} } + +@article{sang-etal-2011, title={Simulation of land use spatial pattern of towns and villages based on CA–Markov model}, volume={54}, ISSN={0895-7177}, url={http://dx.doi.org/10.1016/j.mcm.2010.11.019}, DOI={10.1016/j.mcm.2010.11.019}, number={3-4}, journal={Mathematical and Computer Modelling}, publisher={Elsevier BV}, author={Sang, Lingling and Zhang, Chao and Yang, Jianyu and Zhu, Dehai and Yun, Wenju}, year={2011}, month=Aug, pages={938–943} } + +@article{santos-etal-2006, title={Cooperation Prevails When Individuals Adjust Their Social Ties}, volume={2}, ISSN={1553-7358}, url={http://dx.doi.org/10.1371/journal.pcbi.0020140}, DOI={10.1371/journal.pcbi.0020140}, number={10}, journal={PLoS Computational Biology}, publisher={Public Library of Science (PLoS)}, author={Santos, Francisco C and Pacheco, Jorge M and Lenaerts, Tom}, editor={Amaral, Luis}, year={2006}, month=Oct, pages={e140} } + +@article{santos-pacheco-2005, title={Scale-Free Networks Provide a Unifying Framework for the Emergence of Cooperation}, volume={95}, ISSN={1079-7114}, url={http://dx.doi.org/10.1103/PhysRevLett.95.098104}, DOI={10.1103/physrevlett.95.098104}, number={9}, journal={Physical Review Letters}, publisher={American Physical Society (APS)}, author={Santos, F. C. and Pacheco, J. M.}, year={2005}, month=Aug } + +@article{santos-rodrigues-pacheco-2006, title={Graph topology plays a determinant role in the evolution of cooperation}, volume={273}, ISSN={1471-2954}, url={http://dx.doi.org/10.1098/rspb.2005.3272}, DOI={10.1098/rspb.2005.3272}, number={1582}, journal={Proceedings of the Royal Society B: Biological Sciences}, publisher={The Royal Society}, author={Santos, F.C and Rodrigues, J.F and Pacheco, J.M}, year={2005}, month=Oct, pages={51–55} } + +@article{schreinemachers-berger-2011, title={An agent-based simulation model of human–environment interactions in agricultural systems}, volume={26}, ISSN={1364-8152}, url={http://dx.doi.org/10.1016/j.envsoft.2011.02.004}, DOI={10.1016/j.envsoft.2011.02.004}, number={7}, journal={Environmental Modelling & Software}, publisher={Elsevier BV}, author={Schreinemachers, Pepijn and Berger, Thomas}, year={2011}, month=July, pages={845–859} } + +@article{shi-etal-2006, title={Virtual leader approach to coordinated control of multiple mobile agents with asymmetric interactions}, volume={213}, ISSN={0167-2789}, url={http://dx.doi.org/10.1016/j.physd.2005.10.012}, DOI={10.1016/j.physd.2005.10.012}, number={1}, journal={Physica D: Nonlinear Phenomena}, publisher={Elsevier BV}, author={Shi, Hong and Wang, Long and Chu, Tianguang}, year={2006}, month=Jan, pages={51–65} } + +@article{shi-etal-2009, title={Agent-based evacuation model of large public buildings under fire conditions}, volume={18}, ISSN={0926-5805}, url={http://dx.doi.org/10.1016/j.autcon.2008.09.009}, DOI={10.1016/j.autcon.2008.09.009}, number={3}, journal={Automation in Construction}, publisher={Elsevier BV}, author={Shi, Jianyong and Ren, Aizhu and Chen, Chi}, year={2009}, month=May, pages={338–347} } + +@article{smith-etal-2001, title={Representation of vegetation dynamics in the modelling of terrestrial ecosystems: comparing two contrasting approaches within European climate space}, volume={10}, ISSN={1466-8238}, url={http://dx.doi.org/10.1046/j.1466-822X.2001.t01-1-00256.x}, DOI={10.1046/j.1466-822x.2001.t01-1-00256.x}, number={6}, journal={Global Ecology and Biogeography}, publisher={Wiley}, author={Smith, Benjamin and Prentice, I. Colin and Sykes, Martin T.}, year={2001}, month=Nov, pages={621–637} } + +@article{smith-huston-1989, title={A theory of the spatial and temporal dynamics of plant communities}, volume={83}, ISSN={1573-5052}, url={http://dx.doi.org/10.1007/BF00031680}, DOI={10.1007/bf00031680}, number={1-2}, journal={Vegetatio}, publisher={Springer Science and Business Media LLC}, author={Smith, Thomas and Huston, Michael}, year={1989}, month=Oct, pages={49–69} } + +@article{soares-filho-etal-2006, title={Modelling conservation in the Amazon basin}, volume={440}, ISSN={1476-4687}, url={http://dx.doi.org/10.1038/nature04389}, DOI={10.1038/nature04389}, number={7083}, journal={Nature}, publisher={Springer Science and Business Media LLC}, author={Soares-Filho, Britaldo Silveira and Nepstad, Daniel Curtis and Curran, Lisa M. and Cerqueira, Gustavo Coutinho and Garcia, Ricardo Alexandrino and Ramos, Claudia Azevedo and Voll, Eliane and McDonald, Alice and Lefebvre, Paul and Schlesinger, Peter}, year={2006}, month=Mar, pages={520–523} } + +@article{szaba-hauert-2002, title={Phase Transitions and Volunteering in Spatial Public Goods Games}, volume={89}, ISSN={1079-7114}, url={http://dx.doi.org/10.1103/PhysRevLett.89.118101}, DOI={10.1103/physrevlett.89.118101}, number={11}, journal={Physical Review Letters}, publisher={American Physical Society (APS)}, author={Szabó, György and Hauert, Christoph}, year={2002}, month=Aug } + +@article{thompson-marchant-1995, title={A computer model for the evacuation of large building populations}, volume={24}, ISSN={0379-7112}, url={http://dx.doi.org/10.1016/0379-7112(95)00019-P}, DOI={10.1016/0379-7112(95)00019-p}, number={2}, journal={Fire Safety Journal}, publisher={Elsevier BV}, author={Thompson, Peter A. and Marchant, Eric W.}, year={1995}, month=Jan, pages={131–148} } + +@article{tilman-2004, title={Niche tradeoffs, neutrality, and community structure: A stochastic theory of resource competition, invasion, and community assembly}, volume={101}, ISSN={1091-6490}, url={http://dx.doi.org/10.1073/pnas.0403458101}, DOI={10.1073/pnas.0403458101}, number={30}, journal={Proceedings of the National Academy of Sciences}, publisher={National Academy of Sciences}, author={Tilman, David}, year={2004}, month=July, pages={10854–10861} } + +@article{traulsen-etal-2005, title={Coevolutionary Dynamics: From Finite to Infinite Populations}, volume={95}, ISSN={1079-7114}, url={http://dx.doi.org/10.1103/PhysRevLett.95.238701}, DOI={10.1103/physrevlett.95.238701}, number={23}, journal={Physical Review Letters}, publisher={American Physical Society (APS)}, author={Traulsen, Arne and Claussen, Jens Christian and Hauert, Christoph}, year={2005}, month=Dec } + +@article{van-asselen-verburg-2013, title={Land cover change or land‐use intensification: simulating land system change with a global‐scale land change model}, volume={19}, ISSN={1365-2486}, url={http://dx.doi.org/10.1111/gcb.12331}, DOI={10.1111/gcb.12331}, number={12}, journal={Global Change Biology}, publisher={Wiley}, author={van Asselen, Sanneke and Verburg, Peter H.}, year={2013}, month=Aug, pages={3648–3667} } + +@article{wagner-agrawal-2014, title={An agent-based simulation system for concert venue crowd evacuation modeling in the presence of a fire disaster}, volume={41}, ISSN={0957-4174}, url={http://dx.doi.org/10.1016/j.eswa.2013.10.013}, DOI={10.1016/j.eswa.2013.10.013}, number={6}, journal={Expert Systems with Applications}, publisher={Elsevier BV}, author={Wagner, Neal and Agrawal, Vikas}, year={2014}, month=May, pages={2807–2815} } + +@article{wang-etal-2013, title={Optimal interdependence between networks for the evolution of cooperation}, volume={3}, ISSN={2045-2322}, url={http://dx.doi.org/10.1038/srep02470}, DOI={10.1038/srep02470}, number={1}, journal={Scientific Reports}, publisher={Springer Science and Business Media LLC}, author={Wang, Zhen and Szolnoki, Attila and Perc, Matjaž}, year={2013}, month=Aug } + +@article{ward-etal-2000, title={A stochastically constrained cellular model of urban growth}, volume={24}, ISSN={0198-9715}, url={http://dx.doi.org/10.1016/S0198-9715(00)00008-9}, DOI={10.1016/s0198-9715(00)00008-9}, number={6}, journal={Computers, Environment and Urban Systems}, publisher={Elsevier BV}, author={Ward, D.P. and Murray, A.T. and Phinn, S.R.}, year={2000}, month=Nov, pages={539–558} } + +@article{ward-etal-2008, title={Quorum decision-making facilitates information transfer in fish shoals}, volume={105}, ISSN={1091-6490}, url={http://dx.doi.org/10.1073/pnas.0710344105}, DOI={10.1073/pnas.0710344105}, number={19}, journal={Proceedings of the National Academy of Sciences}, publisher={National Academy of Sciences}, author={Ward, Ashley J. W. and Sumpter, David J. T. and Couzin, Iain D. and Hart, Paul J. B. and Krause, Jens}, year={2008}, month=May, pages={6948–6953} } + +@article{white-engelen-2000, title={High-resolution integrated modelling of the spatial dynamics of urban and regional systems}, volume={24}, ISSN={0198-9715}, url={http://dx.doi.org/10.1016/S0198-9715(00)00012-0}, DOI={10.1016/s0198-9715(00)00012-0}, number={5}, journal={Computers, Environment and Urban Systems}, publisher={Elsevier BV}, author={White, R. and Engelen, G.}, year={2000}, month=Sept, pages={383–400} } + +@article{wijesekara-etal-2012, title={Assessing the impact of future land-use changes on hydrological processes in the Elbow River watershed in southern Alberta, Canada}, volume={412-413}, ISSN={0022-1694}, url={http://dx.doi.org/10.1016/j.jhydrol.2011.04.018}, DOI={10.1016/j.jhydrol.2011.04.018}, journal={Journal of Hydrology}, publisher={Elsevier BV}, author={Wijesekara, G.N. and Gupta, A. and Valeo, C. and Hasbani, J.-G. and Qiao, Y. and Delaney, P. and Marceau, D.J.}, year={2012}, month=Jan, pages={220–232} } + +@article{xavier-foster-2007, title={Cooperation and conflict in microbial biofilms}, volume={104}, ISSN={1091-6490}, url={http://dx.doi.org/10.1073/pnas.0607651104}, DOI={10.1073/pnas.0607651104}, number={3}, journal={Proceedings of the National Academy of Sciences}, publisher={National Academy of Sciences}, author={Xavier, Joao B. and Foster, Kevin R.}, year={2007}, month=Jan, pages={876–881} } + +@article{yamamoto-etal-2007, title={Simulation for pedestrian dynamics by real-coded cellular automata (RCA)}, volume={379}, ISSN={0378-4371}, url={http://dx.doi.org/10.1016/j.physa.2007.02.040}, DOI={10.1016/j.physa.2007.02.040}, number={2}, journal={Physica A: Statistical Mechanics and its Applications}, publisher={Elsevier BV}, author={Yamamoto, Kazuhiro and Kokubo, Satoshi and Nishinari, Katsuhiro}, year={2007}, month=June, pages={654–660} } + +@article{yang-etal-2005, title={Simulation of the kin behavior in building occupant evacuation based on Cellular Automaton}, volume={40}, ISSN={0360-1323}, url={http://dx.doi.org/10.1016/j.buildenv.2004.08.005}, DOI={10.1016/j.buildenv.2004.08.005}, number={3}, journal={Building and Environment}, publisher={Elsevier BV}, author={Yang, L.Z. and Zhao, D.L. and Li, J. and Fang, T.Y.}, year={2005}, month=Mar, pages={411–415} } + +@article{yang-etal-2008, title={Cellular automata for simulating land use changes based on support vector machines}, volume={34}, ISSN={0098-3004}, url={http://dx.doi.org/10.1016/j.cageo.2007.08.003}, DOI={10.1016/j.cageo.2007.08.003}, number={6}, journal={Computers & Geosciences}, publisher={Elsevier BV}, author={Yang, Qingsheng and Li, Xia and Shi, Xun}, year={2008}, month=June, pages={592–602} } + +@article{yates-etal-2009, title={Inherent noise can facilitate coherence in collective swarm motion}, volume={106}, ISSN={1091-6490}, url={http://dx.doi.org/10.1073/pnas.0811195106}, DOI={10.1073/pnas.0811195106}, number={14}, journal={Proceedings of the National Academy of Sciences}, publisher={National Academy of Sciences}, author={Yates, Christian A. and Erban, Radek and Escudero, Carlos and Couzin, Iain D. and Buhl, Camille and Kevrekidis, Ioannis G. and Maini, Philip K. and Sumpter, David J. T.}, year={2009}, month=Apr, pages={5464–5469} } + +@article{yu-etal-2005, title={Centrifugal force model for pedestrian dynamics}, volume={72}, ISSN={1550-2376}, url={http://dx.doi.org/10.1103/PhysRevE.72.026112}, DOI={10.1103/physreve.72.026112}, number={2}, journal={Physical Review E}, publisher={American Physical Society (APS)}, author={Yu, W. J. and Chen, R. and Dong, L. Y. and Dai, S. Q.}, year={2005}, month=Aug } + +@article{yu-johansson-2008, title={Modeling crowd turbulence by many-particle simulations}, volume={76}, ISSN={1550-2376}, url={http://dx.doi.org/10.1103/PhysRevE.76.046105}, DOI={10.1103/physreve.76.046105}, number={4}, journal={Physical Review E}, publisher={American Physical Society (APS)}, author={Yu, Wenjian and Johansson, Anders}, year={2007}, month=Oct } + +@article{zimmermann-etal-2004, title={Coevolution of dynamical states and interactions in dynamic networks}, volume={69}, ISSN={1550-2376}, url={http://dx.doi.org/10.1103/PhysRevE.69.065102}, DOI={10.1103/physreve.69.065102}, number={6}, journal={Physical Review E}, publisher={American Physical Society (APS)}, author={Zimmermann, Martín G. and Eguíluz, Víctor M. and San Miguel, Maxi}, year={2004}, month=June } + +@article{zollner-lima-1999, title={SEARCH STRATEGIES FOR LANDSCAPE-LEVEL INTERPATCH MOVEMENTS}, volume={80}, ISSN={0012-9658}, url={http://dx.doi.org/10.1890/0012-9658(1999)080[1019:SSFLLI]2.0.CO;2}, DOI={10.1890/0012-9658(1999)080[1019:ssflli]2.0.co;2}, number={3}, journal={Ecology}, publisher={Wiley}, author={Zollner, Patrick A. and Lima, Steven L.}, year={1999}, month=Apr, pages={1019–1030} } diff --git a/assets/icons/logo.svg b/assets/icons/logo.svg new file mode 100644 index 0000000..130a685 --- /dev/null +++ b/assets/icons/logo.svg @@ -0,0 +1,10 @@ + diff --git a/assets/js/accessibility.js b/assets/js/accessibility.js new file mode 100644 index 0000000..df958ea --- /dev/null +++ b/assets/js/accessibility.js @@ -0,0 +1,11 @@ +const main = document.querySelector("main"); + +if (main) { + main.id ||= "main-content"; + + const skipLink = document.createElement("a"); + skipLink.className = "skip-link"; + skipLink.href = `#${main.id}`; + skipLink.textContent = "Skip to main content"; + document.body.prepend(skipLink); +} diff --git a/assets/scss/_styles_project.scss b/assets/scss/_styles_project.scss index 1872784..46fea82 100644 --- a/assets/scss/_styles_project.scss +++ b/assets/scss/_styles_project.scss @@ -1,13 +1,838 @@ -// disable links to view/edit source fils -.td-page-meta__edit { display: none !important; } -.td-page-meta__view { display: none !important; } -.td-page-meta__child { display: none !important; } -.td-page-meta__issue { display: none !important; } -.td-page-meta__project-issue { display: none !important; } +:root { + --mmf-ink: #173447; + --mmf-blue: #28627c; + --mmf-teal: #2b8c82; + --mmf-amber: #d8952f; + --mmf-paper: #f4f8fa; + --mmf-graphite: #25343d; + --mmf-rule: #cfdae0; +} + +html { + scroll-behavior: smooth; +} + +body { + background-color: var(--mmf-paper); + background-image: + linear-gradient(rgba(40, 98, 124, 0.025) 1px, transparent 1px), + linear-gradient(90deg, rgba(40, 98, 124, 0.025) 1px, transparent 1px); + background-size: 32px 32px; +} + +.skip-link { + position: fixed; + z-index: 1100; + top: 0.75rem; + left: 0.75rem; + padding: 0.65rem 0.9rem; + transform: translateY(-200%); + border-radius: 0.3rem; + background: var(--mmf-ink); + color: $white; + font-weight: 700; +} + +.skip-link:focus { + transform: translateY(0); + color: $white; +} + +::selection { + background: rgba(120, 188, 196, 0.45); + color: var(--mmf-ink); +} + +a { + text-decoration-thickness: 0.08em; + text-underline-offset: 0.16em; +} + +a:focus-visible, +button:focus-visible, +input:focus-visible, +summary:focus-visible, +[tabindex]:focus-visible { + outline: 3px solid $white; + outline-offset: 2px; + box-shadow: 0 0 0 5px var(--mmf-ink) !important; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + text-wrap: balance; + scroll-margin-top: 5.5rem; +} + +.td-navbar { + background: rgba(23, 52, 71, 0.97) !important; + border-bottom: 1px solid rgba($white, 0.14); + box-shadow: 0 0.35rem 1.5rem rgba(23, 52, 71, 0.18); + backdrop-filter: blur(12px); + + .navbar-brand { + gap: 0.65rem; + font-weight: 750; + letter-spacing: -0.015em; + } + + .navbar-logo svg { + width: 2.2rem; + height: 2.2rem; + } + + .nav-link { + border-bottom: 2px solid transparent; + font-size: 0.92rem; + font-weight: 650; + letter-spacing: 0.015em; + } + + .nav-link:hover, + .nav-link:focus-visible, + .nav-link.active { + border-bottom-color: var(--mmf-amber); + color: $white; + } +} + +.td-main { + background: rgba($white, 0.86); +} + +.td-content { + max-width: 76rem; + + > h1:first-child { + position: relative; + margin-bottom: 1.6rem; + padding-bottom: 0.85rem; + font-size: unquote("clamp(2rem, 4vw, 3.1rem)"); + line-height: 1.08; + + &::after { + position: absolute; + bottom: 0; + left: 0; + width: 4.5rem; + height: 0.25rem; + border-radius: 999px; + background: linear-gradient(90deg, var(--mmf-teal), var(--mmf-amber)); + content: ""; + } + } + + > h2 { + margin-top: 2.75rem; + padding-top: 0.35rem; + border-top: 1px solid var(--mmf-rule); + font-size: unquote("clamp(1.45rem, 2.5vw, 2rem)"); + } + + > p, + > ul, + > ol { + max-width: 72ch; + } + + img { + height: auto; + } + + hr { + margin: 2.5rem 0; + border-color: var(--mmf-rule); + opacity: 1; + } +} + +.td-breadcrumbs { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 0.76rem; + letter-spacing: 0.02em; +} + +.td-sidebar { + border-right: 1px solid var(--mmf-rule); + background: rgba(244, 248, 250, 0.96); +} + +.td-sidebar-nav { + .td-sidebar-link { + border-radius: $border-radius-sm; + color: var(--mmf-graphite); + } + + .td-sidebar-link:hover, + .td-sidebar-link:focus-visible { + background: rgba(43, 140, 130, 0.1); + color: var(--mmf-ink); + } + + .td-sidebar-nav-active-item { + color: var(--mmf-blue); + font-weight: 700; + } +} + +.td-sidebar-toc { + border-left: 1px solid var(--mmf-rule); + + a { + color: #4d626d; + } +} + +.td-page-meta__edit, +.td-page-meta__view, +.td-page-meta__child, +.td-page-meta__issue, +.td-page-meta__project-issue { + display: none !important; +} + +.section-index .entry, +.td-blog-posts-list__item { + margin-bottom: 1rem; + padding: 1rem 1.1rem; + border: 1px solid var(--mmf-rule); + border-left: 4px solid var(--mmf-teal); + border-radius: $border-radius-lg; + background: var(--bs-body-bg); + box-shadow: 0 0.5rem 1.2rem rgba(23, 52, 71, 0.06); +} + +.taxonomy-terms { + gap: 0.35rem; + + .taxonomy-term { + border: 1px solid rgba(40, 98, 124, 0.18); + border-radius: 999px; + background: rgba(40, 98, 124, 0.08); + } +} + +.feedback--question { + margin-top: 3rem; + padding: 1rem; + border-top: 1px solid var(--mmf-rule); + color: #526872; +} + +.btn { + border-width: 2px; + font-weight: 750; + letter-spacing: 0.01em; +} + +.btn-contrast { + border-color: #f3b43f !important; + background: #f3b43f !important; + box-shadow: 0 0.7rem 1.5rem rgba(23, 52, 71, 0.24); + color: var(--mmf-ink) !important; + text-decoration: none !important; + + &:hover, + &:focus-visible { + border-color: $white !important; + background: $white !important; + color: var(--mmf-ink) !important; + } +} .td-cover-block { + background-color: var(--mmf-ink); + + &::before { + background: + radial-gradient(circle at 15% 25%, rgba(120, 188, 196, 0.32), transparent 30%), + radial-gradient(ellipse 70% 55% at 20% 35%, rgba(23, 52, 71, 0.9), transparent 70%), + linear-gradient(115deg, rgba(23, 52, 71, 0.98), rgba(40, 98, 124, 0.88)); + } + + .td-overlay__inner > .text-center { + text-align: left !important; + } + + h1 { + max-width: 12ch; + margin-right: auto; + margin-left: 0; + font-size: unquote("clamp(3rem, 6.5vw, 5.5rem)"); + font-weight: 780; + line-height: 0.94; + letter-spacing: -0.055em; + text-shadow: 0 2px 20px rgba(23, 52, 71, 0.85), 0 1px 3px rgba(23, 52, 71, 0.6); + } + + .lead { + max-width: 54ch; + margin-right: auto; + margin-left: 0; + font-size: unquote("clamp(1.05rem, 2vw, 1.3rem)"); + line-height: 1.55; + text-shadow: 0 1px 10px rgba(23, 52, 71, 0.8); + } +} + +.home-hero-content, +.about-hero-content { + max-width: 48rem; + + > .lead { + margin: 0; + } +} + +body.td-section #td-cover-block-0 { + &::after { + background: + linear-gradient(90deg, rgba(10, 18, 24, 0.98) 0%, rgba(10, 18, 24, 0.9) 34%, rgba(10, 18, 24, 0.62) 58%, rgba(10, 18, 24, 0.22) 100%), + linear-gradient(180deg, rgba(10, 18, 24, 0.72), rgba(10, 18, 24, 0.4)); + } + h1 { - font-weight: bold; - @extend .display-4; + max-width: 13ch; + } + + .about-hero-content { + max-width: 42rem; + } +} + +.home-actions { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; + gap: 0.75rem; + margin-top: 2rem; + + .btn { + margin: 0 !important; + } + + .btn-primary { + color: $white !important; + } + + .btn-outline-light { + color: $white !important; + + &:hover, + &:focus-visible, + &:active { + color: var(--mmf-ink) !important; + } + } +} + +.td-box.position-relative .h4 { + font-family: $font-family-sans-serif; + font-size: 1rem; + font-weight: 400; + line-height: 1.7; +} + +.lead-panel { + display: grid; + grid-template-columns: minmax(0, 0.9fr) minmax(0, 1.1fr); + gap: 1.5rem 4rem; + align-items: start; + max-width: 68rem; + margin-inline: auto; + padding: 2.5rem 0; + text-align: left; + + .section-kicker { + grid-column: 1 / -1; + } + + h2 { + margin: 0; + color: var(--mmf-ink); + font-size: unquote("clamp(2rem, 4vw, 3.35rem)"); + font-weight: 780; + line-height: 1.02; + letter-spacing: -0.045em; + } + + p { + max-width: 58ch; + margin: 0; + font-size: 1.08rem; + line-height: 1.75; + } +} + +.lead-panel--inverse { + color: $white; + + h2 { + color: $white; + } + + .section-kicker { + color: #ffd37a; + } +} + +.section-kicker { + color: #216e66; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 0.76rem; + font-weight: 750; + letter-spacing: 0.15em; + text-transform: uppercase; +} + +.lead-panel__action { + grid-column: 2; +} + +.section-heading { + width: 100%; + margin-bottom: 1.75rem; + text-align: center; + + h2 { + margin-bottom: 0.55rem; + } + + p { + max-width: 58ch; + margin-inline: auto; + } +} + +.td-box { + .fa, + .fas, + .fab { + color: var(--mmf-amber); + } +} + +.td-box--dark { + background: var(--mmf-ink); + + .col-lg-4 { + padding: 3.5rem 3rem; + border-right: 1px solid rgba($white, 0.12); + text-align: left !important; + + &:last-child { + border-right: 0; + } + + .fa, + .fas, + .fab { + font-size: 2.25rem; + } + + .h3, + .h4 { + margin-top: 1.5rem; + font-size: 1.45rem; + letter-spacing: -0.02em; + } + + p { + line-height: 1.7; + } + } +} + +.td-box--info { + background: #deeff1; + color: var(--mmf-graphite); +} + +.td-box--primary { + background: var(--mmf-blue); + color: $white; + + .text-info { + color: #ffd37a !important; + text-decoration: underline; + + &:hover, + &:focus-visible { + color: $white !important; + } + } +} + +.organization-grid { + display: flex; + width: 100%; + flex-wrap: wrap; + justify-content: center; + gap: 1rem; + + a { + display: grid; + min-width: 12rem; + min-height: 10rem; + place-items: center; + padding: 1rem; + border: 1px solid rgba(23, 52, 71, 0.12); + border-radius: $border-radius-lg; + background: rgba($white, 0.9); + box-shadow: 0 0.6rem 1.5rem rgba(23, 52, 71, 0.08); + color: inherit; + transition: transform 150ms ease, box-shadow 150ms ease; + } + + a:hover { + transform: translateY(-3px); + box-shadow: 0 1rem 2rem rgba(23, 52, 71, 0.14); + } + + figure { + margin: 0; + border: 0; + background: transparent; + box-shadow: none; + } +} + +.mermaid { + max-width: 100%; + overflow-x: auto; + + svg { + max-width: 100%; + height: auto; + } +} + +.td-post-card { + border-color: var(--mmf-rule); + background: var(--bs-body-bg); + box-shadow: 0 0.75rem 1.6rem rgba(23, 52, 71, 0.1); +} + +.model-table-tools { + display: flex; + align-items: end; + justify-content: space-between; + gap: 1rem; + margin: 1.5rem 0 0.75rem; + + label { + display: block; + margin-bottom: 0.3rem; + color: var(--mmf-ink); + font-size: 0.84rem; + font-weight: 750; + } + + .input-group { + max-width: 30rem; + } +} + +.model-table-count { + margin: 0 0 0.45rem; + color: #526872; + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 0.78rem; +} + +.model-table-scroll { + overflow-x: auto; + border: 1px solid var(--mmf-rule); + border-radius: $border-radius-lg; + background: var(--bs-body-bg); + box-shadow: 0 0.85rem 2rem rgba(23, 52, 71, 0.08); + + table { + min-width: 68rem; + margin: 0; + } + + th { + border-bottom-color: var(--mmf-blue); + background: #e7f0f3; + color: var(--mmf-ink); + font-size: 0.78rem; + letter-spacing: 0.02em; + vertical-align: middle; + } + + th:first-child, + td:first-child { + width: 37%; + } + + td { + vertical-align: middle; + } +} + +.status-badge { + border: 1px solid transparent; + border-radius: 999px; + font-weight: 700; + white-space: normal; +} + +.status-badge--yes, +.grade-a, +.grade-b { + background: #d7eee7; + color: #225b4a; +} + +.status-badge--no { + background: #e9eef0; + color: #52636b; +} + +.status-badge--neutral { + background: #e8e3f1; + color: #57466f; +} + +.status-badge--warning { + background: #fff1c7; + color: #745615; +} + +.status-badge--progress { + background: #dcecef; + color: #285d6b; +} + +.status-badge--complete { + background: #d7eee7; + color: #225b4a; +} + +.model-coordination-link { + display: flex; + align-items: center; + flex-wrap: wrap; + gap: 0.35rem; + text-decoration: none; + + &:hover, + &:focus-visible { + text-decoration: underline; + } +} + +.grade-c { + background: #fff1c7; + color: #745615; +} + +.grade-d, +.grade-e { + background: #f7dddd; + color: #843b3b; +} + +.publications-list { + display: grid; + gap: 1rem; + margin: 1.5rem 0 0; + padding: 0; + list-style: none; + + .publication-card { + padding: 1.1rem 1.2rem; + border: 1px solid var(--mmf-rule); + border-left: 4px solid var(--mmf-teal); + border-radius: $border-radius-lg; + background: var(--bs-body-bg); + box-shadow: 0 0.65rem 1.5rem rgba(23, 52, 71, 0.07); + } + + .publication-title { + margin: 0; + font-size: 1.2rem; + line-height: 1.35; + } + + .publication-authors, + .publication-links { + margin: 0.5rem 0 0; + } + + .publication-meta { + display: flex; + flex-wrap: wrap; + gap: 0.4rem; + margin: 0.6rem 0 0; + + span { + padding: 0.15rem 0.5rem; + border: 1px solid rgba(43, 140, 130, 0.2); + border-radius: 999px; + background: rgba(43, 140, 130, 0.1); + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 0.76rem; + } + } + + .publication-details { + margin-top: 0.7rem; + + summary { + cursor: pointer; + font-weight: 700; + } + + dl { + display: grid; + grid-template-columns: minmax(7rem, auto) 1fr; + gap: 0.25rem 0.75rem; + margin: 0.75rem 0 0; + } + + dt, + dd { + margin: 0; + overflow-wrap: anywhere; + } + + dt { + font-family: ui-monospace, SFMono-Regular, Menlo, monospace; + font-size: 0.78rem; + } + } +} + +.search-page { + min-height: 60vh; + padding: 4rem unquote("max(1.5rem, 8vw)"); + + > div { + max-width: 52rem; + margin-inline: auto; + } + + .td-search { + margin-top: 1.5rem; + } + + .td-search__input { + min-height: 3.4rem; + padding-left: 3rem; + border: 2px solid var(--mmf-blue); + border-radius: $border-radius-lg; + background: var(--bs-body-bg); + font-size: 1.05rem; + } +} + +footer { + border-top: 4px solid var(--mmf-teal); + background: var(--mmf-ink) !important; +} + +@include media-breakpoint-down(md) { + .td-content { + > h1:first-child { + font-size: 2.2rem; + } + } + + .model-table-tools { + align-items: stretch; + flex-direction: column; + } + + .lead-panel { + grid-template-columns: 1fr; + gap: 1.25rem; + padding: 1.5rem 0; + + .section-kicker, + .lead-panel__action { + grid-column: 1; + } + } + + .td-box--dark .col-lg-4 { + padding: 2.75rem 2rem; + border-right: 0; + border-bottom: 1px solid rgba($white, 0.12); + + &:last-child { + border-bottom: 0; + } + } + + .organization-grid a { + min-width: calc(50% - 0.5rem); + } +} + +@include media-breakpoint-down(sm) { + .td-cover-block h1 { + font-size: 2.85rem; + } + + .home-actions { + align-items: stretch; + flex-direction: column; + + .btn { + width: 100%; + } + } + + .organization-grid a { + width: 100%; + } + + .mermaid svg { + width: 46rem !important; + max-width: none; + } + + .publications-list .publication-details dl { + grid-template-columns: 1fr; + } +} + +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } + + *, + *::before, + *::after { + scroll-behavior: auto !important; + transition-duration: 0.01ms !important; + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + } +} + +@media print { + body, + .td-main { + background: $white !important; + } + + .td-navbar, + .td-sidebar, + .td-sidebar-toc, + footer, + .model-table-tools { + display: none !important; + } + + .td-main main { + max-width: none; } -} \ No newline at end of file +} diff --git a/assets/scss/_variables_project.scss b/assets/scss/_variables_project.scss new file mode 100644 index 0000000..c60b813 --- /dev/null +++ b/assets/scss/_variables_project.scss @@ -0,0 +1,24 @@ +$primary: #28627c; +$secondary: #2b8c82; +$success: #34785f; +$info: #78bcc4; +$warning: #d8952f; +$danger: #b84f4f; +$light: #f4f8fa; +$dark: #173447; + +$body-color: #25343d; +$body-bg: #f8fafb; +$link-color: #1f637f; +$link-hover-color: #174b61; +$border-color: #cfdae0; + +$font-family-sans-serif: system-ui, -apple-system, "Segoe UI", sans-serif; +$headings-font-family: system-ui, -apple-system, "Segoe UI", sans-serif; +$headings-font-weight: 750; +$line-height-base: 1.65; + +$border-radius: 0.45rem; +$border-radius-sm: 0.3rem; +$border-radius-lg: 0.7rem; +$box-shadow: 0 1rem 2.5rem rgba(23, 52, 71, 0.12); diff --git a/content/en/_index.html b/content/en/_index.html index 94e967c..c9a3176 100644 --- a/content/en/_index.html +++ b/content/en/_index.html @@ -4,53 +4,58 @@ +++ -{{< blocks/cover title="Welcome to Making Models FAIR!" image_anchor="top" height="full" >}} -
- - What is FAIR? - - }}"> - The Models - - }}"> - How to Get Involved - -

A community initiative for making 100+ highly cited models findable, accessible, interoperable, and reusable (FAIR).

+{{< blocks/cover title="Making computational models FAIR" image_anchor="top" height="full" >}} +
+

A community initiative making more than 100 highly cited models findable, accessible, interoperable, and reusable.

+ {{< blocks/link-down color="info" >}}
{{< /blocks/cover >}} {{% blocks/lead color="white" %}} -The goal of this initiative is to provide capacity-building opportunities to improve the skill, practices, and protocols to make computational models findable, accessible, interoperable, and reusable (FAIR). We have selected a list of highly cited papers in different domains and developed a protocol for making those models FAIR. Our aim is to make over 100 models FAIR, with the help of the modeling community. We will stimulate activities to advance model analysis of those FAIR models using high throughput computing. +
+The initiative +

Turn influential models into reusable research infrastructure.

+

The goal of this initiative is to build skills, practices, and protocols that make computational models findable, accessible, interoperable, and reusable. Together, the modeling community will improve more than 100 highly cited models and create new opportunities for replication and high-throughput analysis.

+
{{% /blocks/lead %}} {{< blocks/section color="dark" type="row" >}} -{{% blocks/feature icon="fa fa-lightbulb" title="Learn more!" url="https://comses.net/education/responsible-practices"%}} +{{% blocks/feature icon="fa fa-lightbulb" title="Understand FAIR" url="https://comses.net/education/responsible-practices"%}} What does it mean to be a FAIR model? Learn more from the Network for Computational Modeling in Social and Ecological Sciences. {{% /blocks/feature %}} -{{% blocks/feature icon="fab fa-github" title="Join us!" url="https://github.com/make-models-fair" %}} +{{% blocks/feature icon="fab fa-github" title="Work in the open" url="https://github.com/make-models-fair" %}} We have set up an organization page on GitHub for this initiative, to track community-made updates to various highly cited models. New users are always welcome! {{% /blocks/feature %}} -{{% blocks/feature icon="fa-envelope" title="Contact us!" %}} -Contact fair@comses.net for more information! +{{% blocks/feature icon="fa fa-envelope" title="Ask a question" %}} +Contact fair@comses.net for more information. {{% /blocks/feature %}} {{< /blocks/section >}} {{< blocks/section type="row" color="info">}} -
-

Contributors

-
+
+

Contributors

+
-
+
- -{{< imgproc comses Fit "200x200" >}} + +{{< imgproc comses Fit "200x200" "CoMSES Net logo" >}} {{< /imgproc >}} @@ -60,34 +65,30 @@

Contributors

{{< blocks/section type="row" color="info">}} -
-

Supporters

+
+

Supporters

Supporting organizations are those who endorse the initiative and stimulate participation.

-
+
-
+ diff --git a/content/en/about/_index.html b/content/en/about/_index.html index 195e5a3..4101f89 100644 --- a/content/en/about/_index.html +++ b/content/en/about/_index.html @@ -8,19 +8,21 @@ --- -{{< blocks/cover title="About Making Models FAIR" image_anchor="bottom" height="min" >}} - +{{< blocks/cover title="About Making Models FAIR" image_anchor="top" height="min" >}} +
+

A community-driven effort to build skills, practices, and protocols for transparent and reusable computational models.

+
{{< /blocks/cover >}} -{{% blocks/lead %}} -The goal of this initiative is to provide capacity-building opportunities to improve the skill, practices, and protocols to make computational models findable, accessible, interoperable, and reusable (FAIR). -
-
-We have selected a list of highly cited papers in different domains and developed a protocol for making those models FAIR. Our aim is to make over 100 models FAIR, with the help of the modeling community. We will stimulate activities to advance model analysis of those FAIR models using high throughput computing. -
-
-
-

Learn more about the initiative and process below!

+

Cover image: Network Visualization by Martin Grandjean, CC BY-SA 4.0

+ +{{% blocks/lead color="primary" %}} +
+Our mission +

Build capacity through shared, practical work.

+

We bring the modeling community together to improve the skills, practices, and protocols needed to make computational models FAIR. The initial catalog of highly cited models gives contributors a concrete place to learn, collaborate, replicate findings, and advance model analysis.

+

}}">Explore the process

+
{{% /blocks/lead %}} {{< blocks/section color="dark" type="row" >}} @@ -33,64 +35,23 @@

Learn more about the initiative and process below!

{{% /blocks/feature %}} {{% blocks/feature icon="fas fa-hands-helping" title="How to get started" %}} -Learn about the FAIR principles, review the }}" class="text-info">Making Models Fair Process, check out the }}" class="text-info">Models list, and contact us with any questions. Learn more about the steps to get involved on the }}" class="text-info">Getting Involved page. +Learn about the FAIR principles, review the }}" class="text-info">Making Models Fair Process, check out the }}" class="text-info">Models list, and contact us with any questions. Learn more about the steps to get involved on the }}" class="text-info">Getting Involved page. {{% /blocks/feature %}} {{< /blocks/section >}} -{{% markdown-section color="info" type="container" title="Process for making a model FAIR"%}} - -```mermaid -flowchart TD - List(Check out model publications list) --> Identify(Identify what you would like to work on) - Identify -- Choose from list --> Status(Check model status in making FAIR process) - Identify -- Suggest new model --> Assess(Assess FAIR criteria and assign a score) - Status -- Not yet started --> Create_repo(Create new GitHub issue, request repository) - Status -- In process --> Collab(Collaborate on GitHub, contribute to community discussions) - Create_repo --> Collab - Collab --> FAIR(Make model FAIR!) - Learn_GitHub([fab:fa-github Learn more about GitHub]) --- Collab - Learn_FAIR([fas:fa-lightbulb Learn more about FAIR principles]) ---- FAIR - Assess --> Create_repo - FAIR --> Analyze(Do model analysis, replication studies) - Analyze --> Paper(Write and publish paper or report) - Paper --> Credit(Get credit for your hard work!) - - click List href "https://tobefair.org/docs/getting-involved/checklist/#one" _blank - click Identify href "https://tobefair.org/docs/getting-involved/checklist/#two" _blank - click Assess href "https://tobefair.org/docs/process/assessment" _blank - click Status href "https://tobefair.org/docs/models/#selecting-a-model-and-getting-started" _blank - click Create_repo href "https://tobefair.org/docs/getting-involved/checklist/#four" _blank - click Collab href "https://github.com/orgs/make-models-fair/discussions" _blank - click Learn_GitHub href "https://comses.net/education/intro-to-git-github/" _blank - click Learn_FAIR href "https://comses.net/education/responsible-practices" _blank - click Credit href "https://tobefair.org/docs/process/#__get-your-fair-share__" _blank - - class Learn_GitHub,Learn_FAIR,GitHub_tutorial,GitHub_intro learn - class Analyze,Paper optional - - - classDef node font-weight:bold,stroke-width:3px,stroke:#30638E,color:#403F4C - classDef learn font-weight:bold,stroke-width:3px,stroke:orange,color:#403F4C - classDef optional stroke-dasharray: 5 5 - linkStyle default stroke:#403F4C,color:#403F4C -``` - -{{% /markdown-section %}} +{{< model-process >}} {{% blocks/section type="section" color="primary" %}} -
-

-New to Git and GitHub? -
-

+
+

New to Git and GitHub?

Please refer to this step-by-step tutorial to get started with GitHub, and read this introduction from GitHub Docs to dig a bit deeper.

-
+
{{% /blocks/section %}} diff --git a/content/en/about/featured-background.jpg b/content/en/about/featured-background.jpg deleted file mode 100644 index 9a112ce..0000000 Binary files a/content/en/about/featured-background.jpg and /dev/null differ diff --git a/content/en/about/featured-background.png b/content/en/about/featured-background.png new file mode 100644 index 0000000..19c8dde Binary files /dev/null and b/content/en/about/featured-background.png differ diff --git a/content/en/blog/_index.md b/content/en/blog/_index.md index 2f0bfde..90237a5 100644 --- a/content/en/blog/_index.md +++ b/content/en/blog/_index.md @@ -2,5 +2,5 @@ title: News menu: main: - weight: 30 + weight: 50 --- diff --git a/content/en/blog/updates/first-post/index.md b/content/en/blog/updates/first-post/index.md index 6306abf..217320a 100644 --- a/content/en/blog/updates/first-post/index.md +++ b/content/en/blog/updates/first-post/index.md @@ -2,20 +2,20 @@ date: 2023-03-15 title: "Launching Making Models FAIR!" linkTitle: "Launching Making Models FAIR!" -description: +description: "Introducing the community initiative to improve the FAIRness of widely used computational models." --- Imagine a world where models are available to build upon. You do not have to build from scratch and painstakingly try to figure out how published papers are getting the published results. To achieve this utopian world, models have to be findable, accessible, interoperable, and reusable (FAIR). With the "Making Models FAIR" initiative, we seek to contribute to moving towards this world. -{{< imgproc earth-network Fill "700x250" >}} {{< /imgproc >}} +{{< imgproc earth-network Fill "700x250" "Globe connected by a network of digital links" >}} {{< /imgproc >}} The initiative aims to provide a platform to learn the skills needed to make models FAIR. We provided an initial list of widely cited agent-based models, and now we can see how far we can get as a community in making them all FAIR! We expect that this initiative will be an avenue to identify potential improvements that could be made into a master list of "best practices" in making models FAIR. We also offer educational material, which will help you learn: 1. [what FAIR is](https://comses.net/education/responsible-practices/) 2. [how to do robust model documentation](https://www.comses.net/resources/standards/) 3. [how to use GitHub](https://comses.net/education/intro-to-git-github/) -__So, are you ready to join the community, improve your skills and knowledge, and contribute to this public good? Check out the [initiative website](https://tobefair.org), learn the [proposed process](https://tobefair.org/about/), and [find a model](https://tobefair.org/docs/models/) to work on!__ +__So, are you ready to join the community, improve your skills and knowledge, and contribute to this public good? Check out the [initiative website]({{% relref "/" %}}), learn the [proposed process]({{% relref "/about" %}}), and [find a model]({{% relref "/docs/models" %}}) to work on!__

_Many thanks to those who have contributed to the development of the content, website, and GitHub architecture that will make this community initiative possible._ diff --git a/content/en/docs/Models/Cooperation/_index.md b/content/en/docs/Models/Cooperation/_index.md deleted file mode 100644 index bcb8cb8..0000000 --- a/content/en/docs/Models/Cooperation/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Cooperation" -linkTitle: "Cooperation" -weight: 3 ---- - -{{< model-table src="https://raw.githubusercontent.com/make-models-fair/coordination/main/data/models.csv" domain="Cooperation" >}} diff --git a/content/en/docs/Models/Crowd Dynamics/_index.md b/content/en/docs/Models/Crowd Dynamics/_index.md deleted file mode 100644 index f104440..0000000 --- a/content/en/docs/Models/Crowd Dynamics/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Crowd Dynamics" -linkTitle: "Crowd Dynamics" -weight: 4 ---- - -{{< model-table src="https://raw.githubusercontent.com/make-models-fair/coordination/main/data/models.csv" domain="Crowd Dynamics" >}} diff --git a/content/en/docs/Models/Ecological Processes/_index.md b/content/en/docs/Models/Ecological Processes/_index.md deleted file mode 100644 index 80ff913..0000000 --- a/content/en/docs/Models/Ecological Processes/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Ecological Processes" -linkTitle: "Ecological Processes" -weight: 1 ---- - -{{< model-table src="https://raw.githubusercontent.com/make-models-fair/coordination/main/data/models.csv" domain="Ecological Processes" >}} diff --git a/content/en/docs/Models/Land Use/_index.md b/content/en/docs/Models/Land Use/_index.md deleted file mode 100644 index a8f3c29..0000000 --- a/content/en/docs/Models/Land Use/_index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: "Land Use" -linkTitle: "Land Use" -weight: 2 ---- - -{{< model-table src="https://raw.githubusercontent.com/make-models-fair/coordination/main/data/models.csv" domain="Land Use" >}} diff --git a/content/en/docs/Process/_index.md b/content/en/docs/Process/_index.md deleted file mode 100644 index 2cbea49..0000000 --- a/content/en/docs/Process/_index.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -title: "Process for Making a Model FAIR" -linkTitle: "Process" -weight: 2 ---- - -Here, you will find guidance on how this initiative seeks to make models more FAIR (learn more about the FAIR principles [here](https://comses.net/education/responsible-practices/)). This effort will contribute a public good to the modeling community, increasing transparency and building trust in many of the highly cited models that are frequently used (and built upon) in new research. While __the initiative is primarily focused on the first two steps outlined below__, it will open the door for replication and robustness checks and other associated opportunities. - -Each publication (and associated model) originally selected for this initiative has been assessed based on the five FAIR criteria: (1) Publicly accessible code, (2) License for the code, (3) DOI for the code, (4) Good documentation, and (5) Clean code. - -### __Steps in the process:__ -1. ##### __Original assessment of the FAIR criteria__
_See [Assess a Model](/docs/process/assessment/) for more information_ - - This is done by the CoMSES team for the preliminary models for this initiative - - See the [Models](/docs/models/) page for each model's assessment score - -
-2. ##### __Make the model FAIR (across the five criteria)__
_See [How to Make FAIR](/docs/process/how-to/) for more information_ - - Periodically re-assess the five FAIR criteria of the model you're working on - - Contact fair@comses.net and/or comment on the model's issue within the [coordination repository](https://github.com/make-models-fair/coordination) when this process has been completed - -
-3. ##### __Replication check__ - - Can you reproduce the originally-published results? - -
-4. ##### __Robustness check__ - - Sensitivity tests, parameter sweeps - - Opportunities to utilize high throughput computing, etc. - -
-5. ##### __Get your FAIR share__ - - Once you have made a model FAIR, it would be useful to get credit for your hard work! How can you make this an item on your CV? There are different options, dependent on what was involved and the results of your efforts. - - _You will have the Github repository and the DOI of the model that you made FAIR._ These are items you can put on your CV as outputs of your academic activities. - - _You want to share your experience and lessons learned with a broader audience._ You could do this via a blog post in [RofASSS](https://rofasss.org/) (Review of Artificial Societies and Social Simulation). - - _You find something newsworthy that contributes to knowledge of the field._ For example, the insights of the original model cannot be replicated, or the results are not robust when you do a more elaborate model analysis than could be done when the original model was published. In those cases, you should consider writing up a manuscript for a peer-reviewed journal, such as the [Journal of Artificial Societies and Social Simulation](https://www.jasss.org/) or [Socio-Environmental Systems Modeling](https://sesmo.org/). Examples of such types of articles are [here](https://jasss.soc.surrey.ac.uk/6/4/11.html), [here](https://jasss.soc.surrey.ac.uk/8/3/2.html), and [here](https://jasss.soc.surrey.ac.uk/12/4/13.html). - -
-If you have any questions, please contact us at fair@comses.net. diff --git a/content/en/docs/_index.md b/content/en/docs/_index.md index 666fbed..0a101a1 100644 --- a/content/en/docs/_index.md +++ b/content/en/docs/_index.md @@ -3,23 +3,20 @@ title: "Details" linkTitle: "Details" weight: 20 -menu: - main: - weight: 20 --- -### __What is it?__ +## What is it? The goal of this initiative is to provide capacity-building opportunities to improve the skill, practices, and protocols to make computational models findable, accessible, interoperable, and reusable (FAIR). We have selected a list of highly cited papers in different domains and developed a protocol for making those models FAIR. Our aim is to make over 100 models FAIR, with the help of the modeling community. We will stimulate activities to advance model analysis of those FAIR models using high throughput computing. The initial development of this initiative has had contributors from the Network for Computational Modeling in Social and Ecological Sciences ([CoMSES Net](https://comses.net)). Many other modeling organizations endorse this initiative and seek to stimulate participation across the community. -### __Why should I get involved?__ +## Why should I get involved? The Making Models FAIR initiative may provide many opportunities for networking, paper publications, and training and learning. Community members may wish to collaborate on making a selection of highly-cited models FAIR in order to publish their work and share more widely with the scientific community. Or, they may seek to replicate findings or perform additional parameter sweeps and sensitivity tests for better understanding of some of the most classic models that are frequently re-used and referenced. This initiative seeks to offer a straightforward way to engage with modeling communities such as CoMSES, while allowing room for the community itself to build and grow the initiative in ways that most suit their needs. For instance, additional models may be added to the initial list of publications / models, or new experiments with high throughput computing could be performed on newly FAIR models, etc. -To learn more, please visit the [Getting Involved](/docs/getting-involved/) page, and feel free to contact us at fair@comses.net to share any additional ideas or interest. +To learn more, please visit the [Getting Involved]({{% relref "/docs/getting-involved" %}}) page, and feel free to contact us at fair@comses.net to share any additional ideas or interest. -### __Navigating the site__ -This website's documentation pages provide information on the [process](/docs/process/) involved in making a model FAIR, the currently-selected papers and their associated [models](/docs/models/), and the steps for [getting involved](/docs/getting-involved/) with this initiative. Additionally, be sure check out the [community discussion board](https://github.com/orgs/make-models-fair/discussions) on Github. +## Navigating the site +This website's documentation pages provide information on the [process]({{% relref "/docs/process" %}}) involved in making a model FAIR, the currently-selected papers and their associated [models]({{% relref "/docs/models" %}}), and the steps for [getting involved]({{% relref "/docs/getting-involved" %}}) with this initiative. Additionally, be sure check out the [community discussion board](https://github.com/orgs/make-models-fair/discussions) on Github. diff --git a/content/en/docs/Getting Involved/_index.md b/content/en/docs/getting-involved/_index.md similarity index 59% rename from content/en/docs/Getting Involved/_index.md rename to content/en/docs/getting-involved/_index.md index 4d87a32..3f5477b 100644 --- a/content/en/docs/Getting Involved/_index.md +++ b/content/en/docs/getting-involved/_index.md @@ -3,23 +3,25 @@ tags: ["collaborate","contact"] title: "Getting Involved" linkTitle: "Getting Involved" weight: 1 +menu: + main: + weight: 40 --- -## __How to get started__ +## How to get started Are you ready to contribute to increasing the findability, accessibility, interoperability, and reproducibility (FAIR) of one or more highly cited and well-known models in the social ecological sciences? Below is a checklist detailing the steps to getting started! -1. [Check out the models](/docs/getting-involved/checklist/#one) -2. [Identify what you'd like to work on](/docs/getting-involved/checklist/#two) -3. [Get set up on GitHub](/docs/getting-involved/checklist/#three) -4. [Create or contribute to a GitHub issue](/docs/getting-involved/checklist/#four) -5. [Update issue labels](/docs/getting-involved/checklist/#five) -6. [Get to work!](/docs/getting-involved/checklist/#six) +1. [Check out the models]({{% relref "/docs/getting-involved/checklist#one" %}}) +2. [Identify what you'd like to work on]({{% relref "/docs/getting-involved/checklist#two" %}}) +3. [Get set up on GitHub]({{% relref "/docs/getting-involved/checklist#three" %}}) +4. [Create or contribute to a GitHub issue]({{% relref "/docs/getting-involved/checklist#four" %}}) +5. [Update issue labels]({{% relref "/docs/getting-involved/checklist#five" %}}) +6. [Get to work!]({{% relref "/docs/getting-involved/checklist#six" %}}) -##### __Join the [community discussion on GitHub](https://github.com/orgs/make-models-fair/discussions)!__ -
+### Join the [community discussion on GitHub](https://github.com/orgs/make-models-fair/discussions) -## __Ways to get involved__ +## Ways to get involved This initiative is being built from the ground up, to support capacity-building efforts, foster networking opportunities, and involve the modeling community in the development of a public good. There are many ways that you may wish to join the initiative, such as: @@ -29,7 +31,5 @@ There are many ways that you may wish to join the initiative, such as: * Assessing the FAIR-ness of your own models * Utilizing high throughput computing resources for a selection of highly cited, newly FAIR models -
- -## __Contact__ +## Contact Contact us at fair@comses.net for more information or ideas! diff --git a/content/en/docs/Getting Involved/Checklist/_index.md b/content/en/docs/getting-involved/checklist/_index.md similarity index 66% rename from content/en/docs/Getting Involved/Checklist/_index.md rename to content/en/docs/getting-involved/checklist/_index.md index 505d4d4..fd41a66 100644 --- a/content/en/docs/Getting Involved/Checklist/_index.md +++ b/content/en/docs/getting-involved/checklist/_index.md @@ -5,59 +5,38 @@ weight: 1 --- -#### __1. Check out the models currently selected for inclusion in this initiative on the [Models](/docs/models/) page__ {#one} +## 1. Review the selected [models]({{% relref "/docs/models" %}}) {#one} * On the Models page, you will find links to the four categories of models that have been preliminarily selected for inclusion -- Ecological Processes, Land Use, Cooperation, and Crowd Dynamics. Each category has between 20-25 model publications associated with it. -
-
- * Each category has a sub-page with a table identifying the [initial assessments](/docs/process/assessment) of each model's "scores" on the five FAIR criteria, their current status in the making FAIR process (e.g., "Not yet started", "In progress"), and a link to an associated issue in the [GitHub coordination repository](https://github.com/make-models-fair/coordination/issues) if the model is "In progress". + * Each category has a sub-page with a table identifying the [initial assessments]({{% relref "/docs/process/assessment" %}}) of each model's "scores" on the five FAIR criteria, their current status in the making FAIR process (e.g., "Not yet started", "In progress"), and a link to an associated issue in the [GitHub coordination repository](https://github.com/make-models-fair/coordination/issues) if the model is "In progress". * Note: a small selection of "Not yet started" models already have Github issue trackers associated with them, to illustrate how the process will look. -
+## 2. Identify what you would like to work on {#two} + * Note: for any newly suggested model, you will need to first [assess the model publication]({{% relref "/docs/process/assessment" %}}) on the five FAIR criteria. + * To suggest a different model, review the guidance on [how to suggest a new model]({{% relref "/docs/models#new" %}}). -#### __2. Identify what you'd like to work on! If you'd prefer to suggest a different model, please refer to our guidance on [how to suggest a new model](/docs/models/#new)__ {#two} - * Note: for any newly suggested model, you will need to first [assess the model publication](/docs/process/assessment) on the five FAIR criteria. - -
- -#### __3. Learn more about how to collaborate using Git and GitHub__ {#three} +## 3. Learn how to collaborate using Git and GitHub {#three} * Git is a version control system, or VCS, that tracks the history of changes as people and teams collaborate on projects together. GitHub is an online code hosting platform for version control (using Git) that allows for collaboration on projects from anywhere. * You will need a GitHub account -- and to know some of the basic functionality and terminology of Git/GitHub -- to participate in this initiative. * Check out this [step-by-step tutorial](https://comses.net/education/intro-to-git-github/) to get started, and/or read this [introduction from GitHub Docs](https://docs.github.com/en/get-started/quickstart/hello-world) to dig a bit deeper. -
- -#### __4. For any model you are interested in, create or contribute to an associated issue in the [coordination repository](https://github.com/make-models-fair/coordination/issues)__ {#four} +## 4. Create or contribute to a coordination issue {#four} * If there is already an existing issue for the model you're interested in, there should be a link in the "GitHub Link" column of the table. This issue is where you will track and document progress and collaborate with others. - {{< imgproc example_issue_link Resize "600x" >}} {{< /imgproc >}} -
-
+ {{< imgproc example_issue_link Resize "600x" "Model table showing a link to an existing coordination issue" >}} {{< /imgproc >}} * If the model has not yet had any contributors, create a new issue by selecting the "Create Issue" button in the table row associated with the model, and a new tab will open with a pre-populated issue template in GitHub. - {{< imgproc example_create_issue Resize "600x" >}} {{< /imgproc >}} -
-
+ {{< imgproc example_create_issue Resize "600x" "Create Issue button in a model table row" >}} {{< /imgproc >}} * Here's an example issue for the following model citation: Nowak, M.A., & Sigmund, K. (1998). Evolution of indirect reciprocity by image scoring. Nature, 393(6685), 573-577. - {{< imgproc example_issue_screenshot Resize "800x" >}} {{< /imgproc >}} -
- -#### __5. Write a note in the issue & update the labels__ {#five} + {{< imgproc example_issue_screenshot Resize "800x" "Example GitHub coordination issue for a model publication" >}} {{< /imgproc >}} +## 5. Introduce yourself and update the labels {#five} * Write a note in the issue to indicate your intention to work on this model, and provide any other relevant details on your anticipated timeline or process for doing so. * Be sure that the yellow labels are up to date, indicating the status by selecting either (or both) the "In progress" or "Collaborators needed" labels for the issue. To request changes to the yellow labels, make a comment to the issue. * If you have just created an issue, two administrators will be automatically assigned to the issue so that they can create a new repository for this model. -
- Following from our previous example of the Nowak & Sigmund (1998) model publication, below is a screenshot showing the two labels this issue should have (once work has begun): - {{< imgproc example_labels_screenshot Resize "800x" >}} {{< /imgproc >}} - -
+ {{< imgproc example_labels_screenshot Resize "800x" "Status labels on an example model coordination issue" >}} {{< /imgproc >}} -#### __6. Get to work!__ {#six} - * You will get a notification on your associated issue that there is a new model repository ready for your use. In the meantime, use the documentation on the [Process](/docs/process/) and [How to Make FAIR](/docs/process/how-to) pages as a checklist. -
-
+## 6. Get to work {#six} + * You will get a notification on your associated issue that there is a new model repository ready for your use. In the meantime, use the documentation on the [Process]({{% relref "/docs/process" %}}) and [How to Make FAIR]({{% relref "/docs/process/how-to" %}}) pages as a checklist. * Once you have received notification of your new model repository, please follow the instructions and guidelines on the repository's README file for more information on using GitHub for collaboration (i.e., forking the repository, opening pull requests), the process for making models FAIR, suggestions for the repository file structure, and using the issue tracker for documentation of progress. - -
diff --git a/content/en/docs/Getting Involved/Checklist/example_create_issue.png b/content/en/docs/getting-involved/checklist/example_create_issue.png similarity index 100% rename from content/en/docs/Getting Involved/Checklist/example_create_issue.png rename to content/en/docs/getting-involved/checklist/example_create_issue.png diff --git a/content/en/docs/Getting Involved/Checklist/example_issue_link.png b/content/en/docs/getting-involved/checklist/example_issue_link.png similarity index 100% rename from content/en/docs/Getting Involved/Checklist/example_issue_link.png rename to content/en/docs/getting-involved/checklist/example_issue_link.png diff --git a/content/en/docs/Getting Involved/Checklist/example_issue_screenshot.png b/content/en/docs/getting-involved/checklist/example_issue_screenshot.png similarity index 100% rename from content/en/docs/Getting Involved/Checklist/example_issue_screenshot.png rename to content/en/docs/getting-involved/checklist/example_issue_screenshot.png diff --git a/content/en/docs/Getting Involved/Checklist/example_labels_screenshot.png b/content/en/docs/getting-involved/checklist/example_labels_screenshot.png similarity index 100% rename from content/en/docs/Getting Involved/Checklist/example_labels_screenshot.png rename to content/en/docs/getting-involved/checklist/example_labels_screenshot.png diff --git a/content/en/docs/Models/_index.md b/content/en/docs/models/_index.md similarity index 78% rename from content/en/docs/Models/_index.md rename to content/en/docs/models/_index.md index db5273c..f9e9c31 100644 --- a/content/en/docs/Models/_index.md +++ b/content/en/docs/models/_index.md @@ -3,37 +3,36 @@ title: "Models" linkTitle: "Models" weight: 3 date: 2022-11-06 +menu: + main: + weight: 20 --- -Our goal is to provide training opportunities of practical use of FAIR principles. We have selected and done the preliminary assessment of the FAIR criteria for a list of model publications that might resonate with different groups within the community. The list of initial models is a starting point, and we would like for other members of the community to suggest additional model publications. See below for more details on [how this preliminary list of model publications was selected](/docs/models/#how), and [how to suggest a new model](/docs/models/#new). +Our goal is to provide training opportunities of practical use of FAIR principles. We have selected and done the preliminary assessment of the FAIR criteria for a list of model publications that might resonate with different groups within the community. The list of initial models is a starting point, and we would like for other members of the community to suggest additional model publications. Browse the complete [model publication bibliography]({{% relref "/docs/models/publications" %}}), see below for more details on [how this preliminary list of model publications was selected]({{% relref "/docs/models#how" %}}), and learn [how to suggest a new model]({{% relref "/docs/models#new" %}}). If you do not have access to the publication you would like to work on, please send a request for access to fair@comses.net. -### Selecting a model and getting started +## Selecting a model and getting started -Each of the subpages is associated with one of the [four categories](/docs/models/#categories) of model publications preliminarily selected for this initiative. The subpage contains a table with each row corresponding to a model publication. The table lists: +Each of the subpages is associated with one of the [four categories]({{% relref "/docs/models#categories" %}}) of model publications preliminarily selected for this initiative. The subpage contains a table with each row corresponding to a model publication. The table lists: * Current status in this initiative. Options include: * Not yet started * Looking for collaborators * In progress * Meets FAIR criteria! -
-
* Link to a GitHub issue for the model (if work has begun on that model) * Note: a small selection of "Not yet started" models already have Github issue trackers associated with them, to illustrate how the process will look. -
-
-* Assessment scores of the five FAIR criteria [(see here for more information on scoring)](/docs/process/assessment) +* Assessment scores of the five FAIR criteria [(see here for more information on scoring)]({{% relref "/docs/process/assessment" %}}) * Yes/No for the first three criteria * A-E for the last two criteria * Note that the fifth criteria was not able to be assessed if the code was unavailable (i.e., the first criterion is scored N). -### How were the model publications selected? {#how} +## How were the model publications selected? {#how} Based on an [analysis of 7500 agent-based modeling publications](https://doi.org/10.1016/j.envsoft.2020.104873), we identified four areas of research in which there is substantial activity on agent-based modeling. -##### The four model categories are: {#categories} +### The four model categories are {#categories} * __Ecological systems and processes__ - theoretical and empirical models of ecosystems, from the gut to the global level. * __Land use__ - theoretical and empirical models of land use and land use change. Models may have a strong connection with GIS and cellular automata. * __Cooperation__ - largely theoretical models to stufy the evolution of cooperation and conflict among social biological actors. @@ -41,7 +40,7 @@ Based on an [analysis of 7500 agent-based modeling publications](https://doi.org We used the keywords "agent based model", "individual based model", "computer simulation", and "multi-agent" within each category to get a list of relevant papers in Scopus. We went through the list of most highly cited publications and selected the first 20 articles that meet the topic and present an agent-based model. -### Can I suggest a model outside of the four categories? {#new} +## Can I suggest a model outside of the four categories? {#new} We have a fifth "Open" category for which community members can submit model publications outside the four above categories. Since our focus is on model publications that have had some traction, we use an arbitrary threshold of >100 citations in Scopus to be considered for inclusion. diff --git a/content/en/docs/models/cooperation/_index.md b/content/en/docs/models/cooperation/_index.md new file mode 100644 index 0000000..2c1e6a7 --- /dev/null +++ b/content/en/docs/models/cooperation/_index.md @@ -0,0 +1,11 @@ +--- +title: "Cooperation" +linkTitle: "Cooperation" +description: "Model publications concerned with cooperative behavior and collective action." +categories: ["Model domains"] +tags: ["Cooperation"] +model_domain: cooperation +weight: 3 +--- + +{{< model-table domain="Cooperation" >}} diff --git a/content/en/docs/models/crowd-dynamics/_index.md b/content/en/docs/models/crowd-dynamics/_index.md new file mode 100644 index 0000000..7f29187 --- /dev/null +++ b/content/en/docs/models/crowd-dynamics/_index.md @@ -0,0 +1,11 @@ +--- +title: "Crowd Dynamics" +linkTitle: "Crowd Dynamics" +description: "Model publications concerned with the movement and behavior of crowds." +categories: ["Model domains"] +tags: ["Crowd dynamics"] +model_domain: crowd-dynamics +weight: 4 +--- + +{{< model-table domain="Crowd Dynamics" >}} diff --git a/content/en/docs/models/ecological-processes/_index.md b/content/en/docs/models/ecological-processes/_index.md new file mode 100644 index 0000000..2a40a06 --- /dev/null +++ b/content/en/docs/models/ecological-processes/_index.md @@ -0,0 +1,11 @@ +--- +title: "Ecological Processes" +linkTitle: "Ecological Processes" +description: "Model publications concerned with processes and interactions in ecological systems." +categories: ["Model domains"] +tags: ["Ecological processes"] +model_domain: ecological-processes +weight: 1 +--- + +{{< model-table domain="Ecological Processes" >}} diff --git a/content/en/docs/models/land-use/_index.md b/content/en/docs/models/land-use/_index.md new file mode 100644 index 0000000..bbfa621 --- /dev/null +++ b/content/en/docs/models/land-use/_index.md @@ -0,0 +1,11 @@ +--- +title: "Land Use" +linkTitle: "Land Use" +description: "Model publications concerned with land-use decisions and change." +categories: ["Model domains"] +tags: ["Land use"] +model_domain: land-use +weight: 2 +--- + +{{< model-table domain="Land Use" >}} diff --git a/content/en/docs/models/publications/_index.md b/content/en/docs/models/publications/_index.md new file mode 100644 index 0000000..79376fc --- /dev/null +++ b/content/en/docs/models/publications/_index.md @@ -0,0 +1,7 @@ +--- +title: "Model Publications" +linkTitle: "Bibliography" +description: "A growing bibliography of publications whose computational models are being assessed and made FAIR through this initiative." +layout: "publications" +weight: 5 +--- diff --git a/content/en/docs/process/_index.md b/content/en/docs/process/_index.md new file mode 100644 index 0000000..31e627e --- /dev/null +++ b/content/en/docs/process/_index.md @@ -0,0 +1,37 @@ +--- +title: "Process for Making a Model FAIR" +linkTitle: "Process" +weight: 2 +menu: + main: + weight: 30 +--- + +Here, you will find guidance on how this initiative seeks to make models more FAIR (learn more about the FAIR principles [here](https://comses.net/education/responsible-practices/)). This effort will contribute a public good to the modeling community, increasing transparency and building trust in many of the highly cited models that are frequently used (and built upon) in new research. While __the initiative is primarily focused on the first two steps outlined below__, it will open the door for replication and robustness checks and other associated opportunities. + +Each publication (and associated model) originally selected for this initiative has been assessed based on the five FAIR criteria: (1) Publicly accessible code, (2) License for the code, (3) DOI for the code, (4) Good documentation, and (5) Clean code. + +## Steps in the process + +1. **Original assessment of the FAIR criteria** + + See [Assess a Model]({{% relref "/docs/process/assessment" %}}) for more information. + - This is done by the CoMSES team for the preliminary models for this initiative. + - See the [Models]({{% relref "/docs/models" %}}) page for each model's assessment score. +2. **Make the model FAIR across the five criteria** + + See [How to Make FAIR]({{% relref "/docs/process/how-to" %}}) for more information. + - Periodically re-assess the five FAIR criteria of the model you're working on. + - Contact fair@comses.net or comment on the model's issue in the [coordination repository](https://github.com/make-models-fair/coordination) when this process is complete. +3. **Replication check** + - Can you reproduce the originally published results? +4. **Robustness check** + - Run sensitivity tests and parameter sweeps. + - Explore opportunities to use high-throughput computing. +5. **Get your FAIR share** + - Once you have made a model FAIR, get credit for your work. The appropriate output depends on what was involved and what you found. + - Add the model's GitHub repository and DOI to your CV as outputs of your academic activities. + - Share your experience and lessons learned through a blog post in [RofASSS](https://rofasss.org/) (Review of Artificial Societies and Social Simulation). + - If your replication or robustness analysis produces a research finding, consider a manuscript for the [Journal of Artificial Societies and Social Simulation](https://www.jasss.org/) or [Socio-Environmental Systems Modeling](https://sesmo.org/). Examples include articles published in [JASSS 6(4)](https://jasss.soc.surrey.ac.uk/6/4/11.html), [JASSS 8(3)](https://jasss.soc.surrey.ac.uk/8/3/2.html), and [JASSS 12(4)](https://jasss.soc.surrey.ac.uk/12/4/13.html). + +If you have any questions, please contact us at fair@comses.net. diff --git a/content/en/docs/Process/Assessment/_index.md b/content/en/docs/process/assessment/_index.md similarity index 87% rename from content/en/docs/Process/Assessment/_index.md rename to content/en/docs/process/assessment/_index.md index 0ffa4c4..c5252f5 100644 --- a/content/en/docs/Process/Assessment/_index.md +++ b/content/en/docs/process/assessment/_index.md @@ -4,14 +4,14 @@ linkTitle: "Assess a Model" weight: 1 --- -Each model has been initially assessed against the five FAIR criteria based on the information provided in the associated publication (see each model's assessment on the [Models](/docs/models/) page). In the process of making the model FAIR, additional information may need to be brought in beyond what was only provided in the publication. The accompanying GitHub repository for each model publication will serve to keep the score on the improvements of the FAIR components of the published model. +Each model has been initially assessed against the five FAIR criteria based on the information provided in the associated publication (see each model's assessment on the [Models]({{% relref "/docs/models" %}}) page). In the process of making the model FAIR, additional information may need to be brought in beyond what was only provided in the publication. The accompanying GitHub repository for each model publication will serve to keep the score on the improvements of the FAIR components of the published model. Each of the five FAIR criteria are outlined below, with their associated "scoring" options. For the sake of this initiative, __a model would be considered FAIR once it achieves the bolded option for each criterion.__ ---------------- -#### __Criterion 1.__ Available code +## Criterion 1: Available code _Is the model code available in a publicly accessible repository?_ * __Yes__ * No @@ -20,7 +20,7 @@ A link might be provided in a publication; but if the link is not working, we sc ---------------- -#### __Criterion 2.__ License +## Criterion 2: License _Does the model have a license?_ * __Yes__ * No @@ -29,7 +29,7 @@ Typically, license information is provided in the publicly accessible repository ---------------- -#### __Criterion 3.__ DOI +## Criterion 3: DOI _Does the model code repository have a DOI?_ * __Yes__ * No @@ -38,7 +38,7 @@ If the model code is publicly available, does the location have a DOI? ---------------- -#### __Criterion 4.__ Model Documentation +## Criterion 4: Model documentation _Does the model has detailed documentation?_ We provide a letter grade based on a casual reading of the model publication. Whether the model documentation is sufficient to understand the details of the model can only be found out in an actual replication exercise. @@ -56,7 +56,7 @@ We provide a letter grade based on a casual reading of the model publication. Wh ---------------- -#### __Criterion 5.__ Clean Model Code +## Criterion 5: Clean model code _Is the model code cleaned up and well commented?_ We provide a letter grade based on a causal evaluation of the provided code (if code was provided). This criterion is not able to be graded at all until there is available code. diff --git a/content/en/docs/Process/How To/_index.md b/content/en/docs/process/how-to/_index.md similarity index 90% rename from content/en/docs/Process/How To/_index.md rename to content/en/docs/process/how-to/_index.md index 09c1fdb..8446128 100644 --- a/content/en/docs/Process/How To/_index.md +++ b/content/en/docs/process/how-to/_index.md @@ -9,50 +9,36 @@ For each of the five FAIR criteria considered, we provide guidance on how to mee Please share your experiences or reflections on the [discussion page](https://github.com/make-models-fair/coordination/discussions) of our coordination repository so that we can all benefit from them! Additionally, you should create new issues in the associated GitHub repository for the model you are working on, to document the actions you are taking. -### __Potential Problems & Solutions__
(by criterion) +## Potential problems and solutions -#### __Criterion 1.__ Available code +### Criterion 1: Available code | Problem | Solution | |------------------------|------------------------| | Code is not available in a publicly accessible repository.| Contact the authors and inquire about the availability of the original code of the model.

_If they provide the code:_ Ask whether it is OK to make the code publicly available.

_If the code is not findable (or authors do not want to make their code publicly available):_ Try to replicate the code from the model description of the publication (using the GitHub repository associated with this model).| | The basic results published in the publication are not replicable.| While replication is not required to score the first criterion as "Yes" according to this initiative's assessment guidance, it does indicate that there may be issues with the code that would inhibit reproducibility. This may be an issue with differences in program or package versions, missing pieces of the code, or other bugs.| ----------------- -
- -#### __Criterion 2.__ License +### Criterion 2: License | Problem | Solution | |------------------------|------------------------| | The model code has no license.| Give it a license. If you received the code from the authors, consult with them on the selection of the license.| ----------------- -
- -#### __Criterion 3.__ DOI +### Criterion 3: DOI | Problem | Solution | |------------------------|------------------------| | The model code repository has no DOI.| Archive the model code in an archive that provides a DOI, such as [Zenodo](https://zenodo.org) or [CoMSES Net](https://comses.net).
* _[See here](https://docs.github.com/en/repositories/archiving-a-github-repository/referencing-and-citing-content) for more information on making code citable by linking GitHub with Zenodo._
* _Learn how to [archive](https://www.comses.net/codebases/add/) and [submit your model for peer review](https://www.comses.net/reviews/) on CoMSES Net._| ----------------- -
- -#### __Criterion 4.__ Model Documentation +### Criterion 4: Model documentation | Problem | Solution | |------------------------|------------------------| | Documentation quality can be improved.| Improve the model description. For example, describe purpose, use flow diagrams, use equations and pseudo code, describe submodels. Provide sources of datasets used by the model. In principle the model could be replicated from the model documentation.| ----------------- -
- -#### __Criterion 5.__ Clean Model Code +### Criterion 5: Clean model code | Problem | Solution | |------------------------|------------------------| | Code is not sufficiently cleaned up and commented.| Clean up the code by removing outcommenting code, provide clear variable names, comment on the meaning of each procedure, remove.| - ----------------- diff --git a/content/en/search.md b/content/en/search.md index e3690fd..061660d 100644 --- a/content/en/search.md +++ b/content/en/search.md @@ -1,6 +1,7 @@ --- -title: Search Results +title: Search layout: search - +menu: + main: + weight: 60 --- - diff --git a/data/model_domains.yaml b/data/model_domains.yaml new file mode 100644 index 0000000..f405e77 --- /dev/null +++ b/data/model_domains.yaml @@ -0,0 +1,20 @@ +scheme: + name: Making Models FAIR model domains + description: Broad topical groupings used to organize the initiative's model catalog. +concepts: + land-use: + preferredLabel: Land use + description: Models concerned with land-use decisions and change. + closeMatch: https://www.wikidata.org/entity/Q1165944 + cooperation: + preferredLabel: Cooperation + description: Models concerned with cooperative behavior and collective action. + closeMatch: https://www.wikidata.org/entity/Q380962 + ecological-processes: + preferredLabel: Ecological processes + description: Models concerned with processes and interactions in ecological systems. + closeMatch: https://www.wikidata.org/entity/Q111172292 + crowd-dynamics: + preferredLabel: Crowd dynamics + description: Models concerned with the movement and behavior of crowds. + closeMatch: https://www.wikidata.org/entity/Q465266 diff --git a/docker-compose.yml b/docker-compose.yml index 536b864..711807d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,9 +4,18 @@ services: build: context: . args: - HUGO_VERSION: ${HUGO_VERSION} + HUGO_VERSION: ${HUGO_VERSION:?Run Docker Compose through make} ports: - "127.0.0.1:1313:1313" + user: "${LOCAL_UID:-1000}:${LOCAL_GID:-1000}" + working_dir: /src + environment: + HOME: /tmp + HUGO_CACHEDIR: /tmp/hugo_cache + entrypoint: sh + command: + - -c + - npm run models:fetch && npm run bibliography:check && npm run bibliography && exec hugo server --bind 0.0.0.0 --renderToMemory --noHTTPCache volumes: - .:/src - /src/node_modules diff --git a/go.mod b/go.mod deleted file mode 100644 index 2b7aa8d..0000000 --- a/go.mod +++ /dev/null @@ -1,5 +0,0 @@ -module github.com/make-models-fair/make-models-fair.github.io - -go 1.18 - -require github.com/google/docsy v0.11.0 diff --git a/go.sum b/go.sum deleted file mode 100644 index 558b7c8..0000000 --- a/go.sum +++ /dev/null @@ -1,4 +0,0 @@ -github.com/FortAwesome/Font-Awesome v0.0.0-20240716171331-37eff7fa00de/go.mod h1:IUgezN/MFpCDIlFezw3L8j83oeiIuYoj28Miwr/KUYo= -github.com/google/docsy v0.11.0 h1:QnV40cc28QwS++kP9qINtrIv4hlASruhC/K3FqkHAmM= -github.com/google/docsy v0.11.0/go.mod h1:hGGW0OjNuG5ZbH5JRtALY3yvN8ybbEP/v2iaK4bwOUI= -github.com/twbs/bootstrap v5.3.3+incompatible/go.mod h1:fZTSrkpSf0/HkL0IIJzvVspTt1r9zuf7XlZau8kpcY0= diff --git a/hugo.yaml b/hugo.yaml index 41a277d..7d701e8 100644 --- a/hugo.yaml +++ b/hugo.yaml @@ -1,18 +1,19 @@ baseURL: / title: Making Models FAIR -contentDir: content/en +theme: '@docsy/theme' +themesDir: node_modules defaultContentLanguage: en defaultContentLanguageInSubdir: false +enableGitInfo: true enableMissingTranslationPlaceholders: true -staticDir: - - static - - js enableRobotsTXT: true +caches: + getresource: + maxAge: 1h taxonomies: tag: tags category: categories params: - disableContentEdit: true taxonomy: taxonomyCloud: - tags @@ -23,16 +24,13 @@ params: taxonomyPageHeader: - tags - categories - pygmentsCodeFences: true - pygmentsUseClasses: false - pygmentsUseClassic: false - pygmentsStyle: tango mermaid: - enable: true theme: neutral + version: 11.16.1 ui: breadcrumb_disable: false footer_about_enable: false + navbar_theme: dark navbar_logo: true navbar_translucent_over_cover_disable: false sidebar_menu_compact: false @@ -62,13 +60,9 @@ params: url: https://github.com/make-models-fair icon: fab fa-github desc: Development takes place here! - version_menu: Releases - archived_version: false - version: "0.1" - url_latest_version: https://tobefair.org - github_repo: https://github.com/make-models-fair/tobefair.org + github_repo: https://github.com/make-models-fair/make-models-fair.github.io github_project_repo: https://github.com/make-models-fair/.github - github_branch: master + github_branch: main # gcs_engine_id: d72aa9b2712488cc3 offlineSearch: true prism_syntax_highlighting: false @@ -93,6 +87,8 @@ markup: renderer: unsafe: true highlight: + codeFences: true + noClasses: true style: tango outputs: section: @@ -101,7 +97,22 @@ outputs: module: hugoVersion: extended: true - min: 0.110.0 - imports: - - path: github.com/google/docsy - disable: false + min: 0.165.0 + mounts: + - source: content/en + target: content + - source: static + target: static + - source: js + target: static + - source: node_modules/lunr/lunr.min.js + target: static/vendor/lunr.min.js + - source: assets/bibliographies + target: static/bibliographies +security: + allowContent: + - ^text/html$ + - ^text/markdown$ + funcs: + getenv: + - ^HUGO_ diff --git a/js/tablefilter.js b/js/tablefilter.js index 7d22f32..d25da02 100644 --- a/js/tablefilter.js +++ b/js/tablefilter.js @@ -1,19 +1,30 @@ -// filter table rows based on input +const initializeModelFilters = () => { + for (const input of document.querySelectorAll("[data-model-filter]")) { + const table = document.getElementById(input.dataset.tableId); + const status = document.getElementById(input.dataset.statusId); + if (!table || !status) continue; -const filterTable = (inputId, tableId) => { - const filter = document.getElementById(inputId).value.toUpperCase(); - const table = document.getElementById(tableId); - const rows = table.getElementsByTagName("tr"); + const rows = [...table.tBodies[0].rows]; + const update = () => { + const query = input.value.trim().toLocaleLowerCase(); + let visible = 0; - for (const row of rows) { - const cell = row.getElementsByTagName("td")[0]; - if (cell) { - const value = cell.textContent || cell.innerText; - if (value.toUpperCase().indexOf(filter) > -1) { - row.style.display = ""; - } else { - row.style.display = "none"; + for (const row of rows) { + const matches = row.textContent.toLocaleLowerCase().includes(query); + row.hidden = !matches; + if (matches) visible += 1; } - } + + status.textContent = `${visible} of ${rows.length} models shown`; + }; + + input.addEventListener("input", update); + update(); } +}; + +if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", initializeModelFilters, { once: true }); +} else { + initializeModelFilters(); } diff --git a/layouts/_partials/head.html b/layouts/_partials/head.html new file mode 100644 index 0000000..a850734 --- /dev/null +++ b/layouts/_partials/head.html @@ -0,0 +1,87 @@ +{{/* Reconciled with @docsy/theme 0.16.0; Lunr is served from the pinned npm package. */ -}} + + + +{{ $darkMode := partialCached "dark-mode-config.html" "dark-mode-global" -}} +{{ if $darkMode.enable -}} + + + + + +{{ end -}} + +{{ range .AlternativeOutputFormats -}} + +{{ end -}} + +{{ $outputFormat := partial "outputformat.html" . -}} +{{ if and hugo.IsProduction (ne $outputFormat "print") (ne .Site.Language.Name "xx") -}} + +{{ else -}} + +{{ end -}} + +{{ partialCached "favicons.html" . }} + + {{- if .IsHome -}} + {{ .Site.Title -}} + {{ else -}} + {{ with .Title }}{{ . }} | {{ end -}} + {{ .Site.Title -}} + {{ end -}} + + +{{ partial "opengraph.html" . -}} +{{ partial "schema.html" . -}} +{{ partial "twitter_cards.html" . -}} +{{ partialCached "head-css.html" . "head-css-cache-key" -}} + +{{ if .Site.Params.offlineSearch -}} + +{{ end -}} + +{{ if .Site.Params.prism_syntax_highlighting -}} + +{{ end -}} + +{{ template "algolia/head" . -}} +{{ partial "hooks/head-end.html" . -}} + +{{ if hugo.IsProduction -}} + {{ partial "google_analytics.html" . -}} +{{ end -}} + +{{ define "algolia/head" -}} +{{ if and .Site.Params.search (isset .Site.Params.search "algolia") -}} + +{{ end -}} + +{{ if ne .Site.Params.algolia_docsearch nil -}} +{{ warnf `Config 'params.algolia_docsearch' is deprecated: use 'params.search.algolia' + For details, see https://www.docsy.dev/docs/content/search/#algolia-docsearch.` -}} +{{ end -}} +{{ end -}} diff --git a/layouts/_partials/taxonomy_terms_cloud.html b/layouts/_partials/taxonomy_terms_cloud.html new file mode 100644 index 0000000..379fe9c --- /dev/null +++ b/layouts/_partials/taxonomy_terms_cloud.html @@ -0,0 +1,18 @@ +{{ $context := .context -}} +{{ $taxo := .taxo -}} +{{ $title := .title -}} +{{ if isset $context.Site.Taxonomies (lower $taxo) -}} + {{ $taxonomy := index $context.Site.Taxonomies (lower $taxo) -}} + {{ if gt (len $taxonomy) 0 -}} +
+ {{ with $title -}} +

{{ . }}

+ {{ end -}} + +
+ {{ end -}} +{{ end -}} diff --git a/layouts/_shortcodes/blocks/feature.html b/layouts/_shortcodes/blocks/feature.html new file mode 100644 index 0000000..0725195 --- /dev/null +++ b/layouts/_shortcodes/blocks/feature.html @@ -0,0 +1,13 @@ +{{ $icon := .Get "icon" | default "fa-lightbulb" -}} +
+
+ +
+

{{ .Get "title" | markdownify }}

+
+ {{ .Inner }} +
+ {{ with .Get "url" -}} +

{{ with $.Get "url_text" }}{{ . }}{{ else }}{{ T "ui_read_more" }}{{ end }}

+ {{ end -}} +
diff --git a/layouts/_shortcodes/imgproc.html b/layouts/_shortcodes/imgproc.html new file mode 100644 index 0000000..b5510fd --- /dev/null +++ b/layouts/_shortcodes/imgproc.html @@ -0,0 +1,27 @@ +{{ $original := .Page.Resources.GetMatch (printf "**%s*" (.Get 0)) -}} +{{ $command := .Get 1 -}} +{{ $options := .Get 2 -}} +{{ $alt := .Get 3 | default "" -}} +{{ if eq $command "Fit" -}} + {{ .Scratch.Set "image" ($original.Fit $options) -}} +{{ else if eq $command "Resize" -}} + {{ .Scratch.Set "image" ($original.Resize $options) -}} +{{ else if eq $command "Fill" -}} + {{ .Scratch.Set "image" ($original.Fill $options) -}} +{{ else if eq $command "Crop" -}} + {{ .Scratch.Set "image" ($original.Crop $options) -}} +{{ else -}} + {{ errorf "Invalid image processing command: Must be one of Fit, Fill, Crop or Resize." -}} +{{ end -}} +{{ $image := .Scratch.Get "image" -}} + +
+ {{ $alt }} + {{ with strings.TrimSpace .Inner -}} +
+

+ {{ . }}{{ with $image.Params.byline }}
{{ . }}
{{ end }} +

+
+ {{ end -}} +
diff --git a/layouts/docs/publications.html b/layouts/docs/publications.html new file mode 100644 index 0000000..65db228 --- /dev/null +++ b/layouts/docs/publications.html @@ -0,0 +1,11 @@ +{{ define "main" }} +
+

{{ .Title }}

+ {{ with .Description }}

{{ . }}

{{ end }} +

+ Download all references as + publications.bib. +

+ {{ partial "publications-list.html" . }} +
+{{ end }} diff --git a/layouts/partials/hooks/head-end.html b/layouts/partials/hooks/head-end.html new file mode 100644 index 0000000..f549c84 --- /dev/null +++ b/layouts/partials/hooks/head-end.html @@ -0,0 +1,28 @@ +{{- $accessibility := resources.Get "js/accessibility.js" | minify | fingerprint -}} + +{{- with .Params.model_domain -}} + {{- $concept := index hugo.Data.model_domains.concepts . -}} + {{- if not $concept -}} + {{- errorf "Unknown model_domain %q on %s" . $.File.Path -}} + {{- end -}} + {{- $models := site.GetPage "/docs/models" -}} + {{- $term := dict + "@type" "DefinedTerm" + "@id" (printf "%s#%s" $models.Permalink .) + "name" $concept.preferredLabel + "description" $concept.description + "inDefinedTermSet" (dict "@type" "DefinedTermSet" "name" hugo.Data.model_domains.scheme.name "url" $models.Permalink) + "skos:closeMatch" (dict "@id" $concept.closeMatch) + -}} + {{- $metadata := dict + "@context" (dict "@vocab" "https://schema.org/" "skos" "http://www.w3.org/2004/02/skos/core#") + "@type" "CollectionPage" + "@id" $.Permalink + "url" $.Permalink + "name" $.Title + "description" $.Description + "about" $term + "isPartOf" (dict "@type" "WebSite" "name" site.Title "url" site.Home.Permalink) + -}} + +{{- end -}} diff --git a/layouts/partials/model-table/binary-badge-cell.html b/layouts/partials/model-table/binary-badge-cell.html index 405b6c8..8cd4cd6 100644 --- a/layouts/partials/model-table/binary-badge-cell.html +++ b/layouts/partials/model-table/binary-badge-cell.html @@ -1,7 +1,7 @@ {{ if eq .data "Y" }} - {{ .yeslabel }} + {{ .yeslabel }} {{ else if eq .data "N" }} - {{ .nolabel }} + {{ .nolabel }} {{ end }} - \ No newline at end of file + diff --git a/layouts/partials/model-table/grade-badge-cell.html b/layouts/partials/model-table/grade-badge-cell.html index 0f07754..78b41d8 100644 --- a/layouts/partials/model-table/grade-badge-cell.html +++ b/layouts/partials/model-table/grade-badge-cell.html @@ -1,13 +1,7 @@ - {{ if eq .grade "A" }} - {{ .grade }} - {{ else if eq .grade "B" }} - {{ .grade }} - {{ else if eq .grade "C" }} - {{ .grade }} - {{ else if eq .grade "D" }} - {{ .grade }} - {{ else if eq .grade "E" }} - {{ .grade }} + {{ if .grade }} + + Grade {{ .grade }} + {{ end }} - \ No newline at end of file + diff --git a/layouts/partials/model-table/header.html b/layouts/partials/model-table/header.html index 05a820c..fef8c5e 100644 --- a/layouts/partials/model-table/header.html +++ b/layouts/partials/model-table/header.html @@ -1,34 +1,15 @@ - -
-
- - - -
- -
- - FAIR Criterion Assessment - - - Model Citation - GitHub Link - - + Model citation + Coordination + + - Code Available? - License? - DOI? - Docs? - Clean Code? + Code available? + License? + DOI? + Documentation + Clean code - \ No newline at end of file + diff --git a/layouts/partials/model-table/issue-link-cell.html b/layouts/partials/model-table/issue-link-cell.html index 45a1b82..e38da52 100644 --- a/layouts/partials/model-table/issue-link-cell.html +++ b/layouts/partials/model-table/issue-link-cell.html @@ -1,16 +1,16 @@ {{ if .url }} - - + + {{ .name }} {{ if eq .status "Not yet started" }} - {{ .status }} + {{ .status }} {{ else if eq .status "Looking for collaborators" }} - {{ .status }} + {{ .status }} {{ else if eq .status "In progress" }} - {{ .status }} + {{ .status }} {{ else if eq .status "Meets FAIR criteria!" }} - {{ .status }} + {{ .status }} {{ end }} {{ else }} @@ -28,9 +28,11 @@ class="btn btn-dark btn-sm py-0 text-nowrap" href="https://github.com/make-models-fair/coordination/issues/new?labels={{ $labels }}&template={{ $template }}&title={{ $title }}&body={{ $body }}" target="_blank" + rel="noopener" > - + Create Issue + (opens in a new tab) {{ end }} diff --git a/layouts/partials/publications-list.html b/layouts/partials/publications-list.html new file mode 100644 index 0000000..24f11df --- /dev/null +++ b/layouts/partials/publications-list.html @@ -0,0 +1,63 @@ +{{- $publications := hugo.Data.publications -}} + +{{- if not $publications -}} + +{{- else -}} +
    + {{- range $publications }} + {{- $title := or .fieldMap.title .key -}} + {{- $doi := .fieldMap.doi -}} + {{- $url := .fieldMap.url -}} +
  • +
    +

    {{ $title }}

    + {{- with .authorList }} + {{- $authors := . -}} + {{- if gt (len .) 5 }}{{ $authors = first 5 . | append "et al." }}{{ end -}} +

    {{ delimit $authors ", " }}

    + {{- end }} +

    + {{- with .fieldMap.year }}{{ . }}{{ end -}} + {{- with .fieldMap.journal }}{{ . }}{{ end -}} + {{- with .fieldMap.volume }}Vol. {{ . }}{{ end -}} + {{- with .fieldMap.pages }}pp. {{ replace . "--" "–" }}{{ end -}} +

    + {{- if $doi }} + + {{- else if $url }} + + {{- end }} +
    + Full record +
    +
    Citation key
    +
    {{ .key }}
    +
    Entry type
    +
    {{ .type }}
    + {{- range .fields }} + {{- $name := lower .name -}} + {{- if not (in (slice "title" "author" "year" "journal" "volume" "pages") $name) }} +
    {{ .name }}
    +
    + {{- if eq $name "doi" -}} + {{ .value }} + {{- else if eq $name "url" -}} + {{ .value }} + {{- else -}} + {{ .value }} + {{- end -}} +
    + {{- end }} + {{- end }} +
    +
    +
    +
  • + {{- end }} +
+{{- end -}} diff --git a/layouts/search.html b/layouts/search.html new file mode 100644 index 0000000..0a4d803 --- /dev/null +++ b/layouts/search.html @@ -0,0 +1,9 @@ +{{ define "main" }} +
+
+

{{ .Title }}

+

Search guidance, model pages, publications, and project updates.

+ {{ partial "search-input.html" . }} +
+
+{{ end }} diff --git a/layouts/shortcodes/markdown-section.html b/layouts/shortcodes/markdown-section.html deleted file mode 100644 index c103d8f..0000000 --- a/layouts/shortcodes/markdown-section.html +++ /dev/null @@ -1,12 +0,0 @@ -{{ $col_id := .Get "color" | default .Ordinal -}} -{{ $type := .Get "type" | default "container" -}} - -
-
-
-
-

{{ .Get "title" }}

- {{ .Inner | markdownify }} -
-
-
diff --git a/layouts/shortcodes/model-process.html b/layouts/shortcodes/model-process.html new file mode 100644 index 0000000..4900052 --- /dev/null +++ b/layouts/shortcodes/model-process.html @@ -0,0 +1,63 @@ +{{- $checklist := site.GetPage "/docs/getting-involved/checklist" -}} +{{- $assessment := site.GetPage "/docs/process/assessment" -}} +{{- $models := site.GetPage "/docs/models" -}} +{{- $process := site.GetPage "/docs/process" -}} +{{- $mermaidVersion := .Site.Params.mermaid.version | default "11.16.1" -}} +{{- $mermaidTheme := .Site.Params.mermaid.theme | default "default" -}} +
+
+
+
+

Process for making a model FAIR

+
+flowchart TD
+  List(Check out model publications list) --> Identify(Identify what you would like to work on)
+  Identify -- Choose from list --> Status(Check model status in making FAIR process)
+  Identify -- Suggest new model --> Assess(Assess FAIR criteria and assign a score)
+  Status -- Not yet started --> Create_repo(Create new GitHub issue, request repository)
+  Status -- In process --> Collab(Collaborate on GitHub, contribute to community discussions)
+  Create_repo --> Collab
+  Collab --> FAIR(Make model FAIR!)
+  Learn_GitHub([fab:fa-github Learn more about GitHub]) --- Collab
+  Learn_FAIR([fas:fa-lightbulb Learn more about FAIR principles]) ---- FAIR
+  Assess --> Create_repo
+  FAIR --> Analyze(Do model analysis, replication studies)
+  Analyze --> Paper(Write and publish paper or report)
+  Paper --> Credit(Get credit for your hard work!)
+
+  click List href "{{ $checklist.RelPermalink }}#one"
+  click Identify href "{{ $checklist.RelPermalink }}#two"
+  click Assess href "{{ $assessment.RelPermalink }}"
+  click Status href "{{ $models.RelPermalink }}#selecting-a-model-and-getting-started"
+  click Create_repo href "{{ $checklist.RelPermalink }}#four"
+  click Collab href "https://github.com/orgs/make-models-fair/discussions" _blank
+  click Learn_GitHub href "https://comses.net/education/intro-to-git-github/" _blank
+  click Learn_FAIR href "https://comses.net/education/responsible-practices" _blank
+  click Credit href "{{ $process.RelPermalink }}#get-your-fair-share"
+
+  class Learn_GitHub,Learn_FAIR,GitHub_tutorial,GitHub_intro learn
+  class Analyze,Paper optional
+
+  classDef node font-weight:bold,stroke-width:3px,stroke:#28627c,color:#25343d,text-wrap:wrap
+  classDef learn font-weight:bold,stroke-width:3px,stroke:#d8952f,color:#25343d,text-wrap:wrap
+  classDef optional stroke-dasharray: 5 5
+  linkStyle default stroke:#25343d,color:#25343d
+      
+
+
+
+ diff --git a/layouts/shortcodes/model-table.html b/layouts/shortcodes/model-table.html index 2316240..e3a4132 100644 --- a/layouts/shortcodes/model-table.html +++ b/layouts/shortcodes/model-table.html @@ -1,49 +1,65 @@ -{{/* Display a table grouped by domain from models.json */}} +{{/* Display a table grouped by domain from models.csv */}} -{{ $src := .Get "src" }} -{{ $delimiter := .Get "delimiter" | default "," }} -{{ $csv := getCSV $delimiter $src }} {{ $domain := .Get "domain" }} +{{ $slug := $domain | urlize }} +{{ $tableID := printf "model-table-%s" $slug }} +{{ $filterID := printf "model-filter-%s" $slug }} +{{ $statusID := printf "model-filter-status-%s" $slug }} - - {{ partial "model-table/header.html" }} - - {{ range $csv := after 1 $csv }} - {{if in (index . 1) $domain }} - {{/* FIXME: should probably be unmarshalled automatically */}} - {{ $citation := index $csv 0 }} - {{ $issue_link := index $csv 8 }} - {{ $short_name := index $csv 9 }} - {{ $status := index $csv 7 }} - {{ $available_code := index $csv 2 }} - {{ $license := index $csv 3 }} - {{ $doi := index $csv 4 }} - {{ $docs := index $csv 5 }} - {{ $clean_code := index $csv 6 }} - - - {{ partial "model-table/issue-link-cell.html" - (dict "url" $issue_link "domain" $domain "name" $short_name "citation" $citation "status" $status) }} - {{ partial "model-table/binary-badge-cell.html" - (dict "data" $available_code "yeslabel" "Has Code" "nolabel" "No Code") }} - {{ partial "model-table/binary-badge-cell.html" - (dict "data" $license "yeslabel" "Licensed" "nolabel" "No License") }} - {{ partial "model-table/binary-badge-cell.html" - (dict "data" $doi "yeslabel" "Has DOI" "nolabel" "No DOI") }} - {{ partial "model-table/grade-badge-cell.html" - (dict "grade" $docs) }} - {{ partial "model-table/grade-badge-cell.html" - (dict "grade" $clean_code) }} - - {{ end }} - {{ end }} - -
{{ index $csv 0 }}
+{{ with hugo.Data.models }} - +
+
+ +
+ + +
+
+

+
- +
+ + + {{ partial "model-table/header.html" }} + + {{ range where . "domain" "eq" $domain }} + + + {{ partial "model-table/issue-link-cell.html" + (dict "url" .issue_link "domain" $domain "name" .name_short "citation" .publication_citation "status" .status) }} + {{ partial "model-table/binary-badge-cell.html" + (dict "data" .available_code "yeslabel" "Has Code" "nolabel" "No Code") }} + {{ partial "model-table/binary-badge-cell.html" + (dict "data" .license "yeslabel" "Licensed" "nolabel" "No License") }} + {{ partial "model-table/binary-badge-cell.html" + (dict "data" .doi "yeslabel" "Has DOI" "nolabel" "No DOI") }} + {{ partial "model-table/grade-badge-cell.html" + (dict "grade" .documentation) }} + {{ partial "model-table/grade-badge-cell.html" + (dict "grade" .clean_code) }} + + {{ end }} + +
{{ $domain }} model publications and FAIR criterion assessments
{{ .publication_citation }}
+
+{{ else }} + {{ errorf "model-table: data/models.json is unavailable; run npm run bibliography:check" }} +{{ end }} + + diff --git a/layouts/taxonomy.html b/layouts/taxonomy.html new file mode 100644 index 0000000..caca4a1 --- /dev/null +++ b/layouts/taxonomy.html @@ -0,0 +1,8 @@ +{{ define "main" -}} +
+
+

{{ .Title }}

+ {{ partial "taxonomy_terms_cloud.html" (dict "context" . "taxo" (lower .Title)) -}} +
+
+{{- end }} diff --git a/layouts/term.html b/layouts/term.html new file mode 100644 index 0000000..b82acac --- /dev/null +++ b/layouts/term.html @@ -0,0 +1,27 @@ +{{ define "main" -}} +
+
+

{{ with .Data.Singular }}{{ . | humanize }}: {{ end }}{{ .Title }}

+
{{ .Content }}
+
+ {{ range .Pages }} + {{ $manualLink := cond (isset .Params "manuallink") .Params.manualLink (cond (isset .Params "manuallinkrelref") (relref . .Params.manualLinkRelref) .RelPermalink) }} + + {{ end }} +
+ {{ humanize (T "ui_all") }} {{ with .Data.Plural }}{{ . | humanize }}{{ end }} +
+
+{{- end }} diff --git a/model-catalog.lock.json b/model-catalog.lock.json new file mode 100644 index 0000000..79f9805 --- /dev/null +++ b/model-catalog.lock.json @@ -0,0 +1,6 @@ +{ + "repository": "make-models-fair/coordination", + "path": "data/models.csv", + "commit": "9e997526ef144534ea6ed86842232b8fe2c52918", + "sha256": "263ea9bc79d62bd9bd20fb841d4da3a1b5284a76ebef7345d413fda1ce537cf2" +} diff --git a/package-lock.json b/package-lock.json index b51fe82..e97b7ad 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,896 +8,462 @@ "name": "tbf-site", "version": "0.1.0", "license": "CC0-1.0", - "dependencies": { - "bootstrap": "^5.3.3", - "jquery": "^3.0", - "popper.js": "^1.16.0" - }, "devDependencies": { - "autoprefixer": "^10.2.5", - "postcss": "^8.5.3", - "postcss-cli": "^11.0.0" + "@docsy/theme": "0.16.0", + "@retorquere/bibtex-parser": "10.0.1", + "lunr": "2.3.9" } }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@docsy/theme": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@docsy/theme/-/theme-0.16.0.tgz", + "integrity": "sha512-Wp9hakLeAzkmN7kxiuYItShg3EMi3UHSYCybNK8TfT/R+FUzFKNPVwb6fN8ZcytXBOhOhTJCQ/d5Hf4Uidt8pw==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" + "@fortawesome/fontawesome-free": "6.7.2", + "bootstrap": "5.3.8" }, "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "gen-favicons": "scripts/gen-favicons/cli.mjs" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "node_modules/@fortawesome/fontawesome-free": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz", + "integrity": "sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==", "dev": true, + "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bootstrap": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.3.tgz", - "integrity": "sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/twbs" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/bootstrap" - } - ], - "peerDependencies": { - "@popperjs/core": "^2.11.8" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + "node": ">=6" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001703", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001703.tgz", - "integrity": "sha512-kRlAGTRWgPsOj7oARC9m1okJEXdL/8fekFVcxA8Hl7GH4r/sN4OJn/i6Flde373T50KS7Y37oFbMwlE8+F42kQ==", + "node_modules/@pomgui/deep": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@pomgui/deep/-/deep-3.0.4.tgz", + "integrity": "sha512-XCAbJPSP+Y6SZiuhRAxjX29mlMMB9j1BQ9lCuXUMsJpgjj8odN7VIiWqOcQdmDu6iYFgcylHv6F9ZbACmyIFyQ==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] + "license": "MIT" }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, + "peer": true, "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" + "type": "opencollective", + "url": "https://opencollective.com/popperjs" } }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/@retorquere/bibtex-parser": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@retorquere/bibtex-parser/-/bibtex-parser-10.0.1.tgz", + "integrity": "sha512-o18pUbuH1P5aw2Y/AggWe+7ocPQj6ZreimSK9viY/GKIHE2jX4qbmx9Z54+EQ1Q8zZSKiXmY5MHHpbdCtlD0Ig==", "dev": true, + "license": "ISC", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "@unified-latex/unified-latex-util-pegjs": "^1.8.4", + "@unified-latex/unified-latex-util-print-raw": "^1.8.4", + "@unified-latex/unified-latex-util-replace": "^1.8.4", + "@unified-latex/unified-latex-util-visit": "^1.8.4", + "i": "^0.3.7", + "lodash.merge": "^4.6.2", + "moo": "^0.5.3", + "nearley": "^2.20.1", + "unicode2latex": "^7.0.33", + "wink-eng-lite-web-model": "^1.8.1", + "wink-nlp": "^2.4.0" + } + }, + "node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@unified-latex/unified-latex-types": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-types/-/unified-latex-types-1.8.4.tgz", + "integrity": "sha512-nQ6YS4WYVOA89qdmxw57vl3KfmRGFHGTyLsw9LxCC7DSE6oma3rvXIGjBDUe7E3bgWocBqRITPcz25VqCRlFzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@unified-latex/unified-latex-util-match": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-match/-/unified-latex-util-match-1.8.4.tgz", + "integrity": "sha512-wYhTER8i3THQcTYjSufCr8IC0TxguN3dj3h0EFAVneZQ/FIqi/kbvvtPaI0u8mtQLuBDGfhftBy7PvuK9TSG3w==", + "dev": true, + "license": "MIT", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@unified-latex/unified-latex-types": "^1.8.4", + "@unified-latex/unified-latex-util-print-raw": "^1.8.4" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/dependency-graph": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-1.0.0.tgz", - "integrity": "sha512-cW3gggJ28HZ/LExwxP2B++aiKxhJXMSIt9K48FOXQkm+vuG5gyatXnLsONRJdzO/7VfjDIiaOOa/bs4l464Lwg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.115", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.115.tgz", - "integrity": "sha512-MN1nahVHAQMOz6dz6bNZ7apgqc9InZy7Ja4DBEVCTdeiUcegbyOYE9bi/f2Z/z6ZxLi0RxLpyJ3EGe+4h3w73A==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/@unified-latex/unified-latex-util-pegjs": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-pegjs/-/unified-latex-util-pegjs-1.8.4.tgz", + "integrity": "sha512-5PTvl2zTK25+Dy8SMpqq6Nf9k1gvr89fS7rR3hB8vi/KjA9AfXGQbiYOcwTfN8O5lpoKJeOuXw6hhaSlTpRaMQ==", "dev": true, + "license": "MIT", "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" + "@unified-latex/unified-latex-types": "^1.8.4", + "@unified-latex/unified-latex-util-match": "^1.8.4" } }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "node_modules/@unified-latex/unified-latex-util-print-raw": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-print-raw/-/unified-latex-util-print-raw-1.8.4.tgz", + "integrity": "sha512-35hce9A8frQvEp5cM5avPpLMCUs8OIzhR3OZr4TjMJI/Lsj4wu6Tv9h2XQpxDmg8ofOtxn2UEWB19Wld9fgRvw==", "dev": true, + "license": "MIT", "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" + "@unified-latex/unified-latex-types": "^1.8.4" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/@unified-latex/unified-latex-util-replace": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-replace/-/unified-latex-util-replace-1.8.4.tgz", + "integrity": "sha512-9T2U11L6gihcoCul+xxwQOQrG3b8y5EcXvNXAV5U4c9GkLesvEEQ7wgyVtYtEDHIzFFL6p0Bc60XyWTn8VD3Qw==", "dev": true, + "license": "MIT", "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" + "@unified-latex/unified-latex-types": "^1.8.4", + "@unified-latex/unified-latex-util-match": "^1.8.4", + "@unified-latex/unified-latex-util-split": "^1.8.4", + "@unified-latex/unified-latex-util-trim": "^1.8.4", + "@unified-latex/unified-latex-util-visit": "^1.8.4", + "unified": "^10.1.2" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "node_modules/@unified-latex/unified-latex-util-split": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-split/-/unified-latex-util-split-1.8.4.tgz", + "integrity": "sha512-EZm92GRiOLcJeH/HFfh1unH+BBBGHOlvgjzIvG5I5XofLWj/Y2lwX2aPbNfrT/nmjKrujcUqPVAQPS8U2ydnpg==", "dev": true, + "license": "MIT", "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" + "@unified-latex/unified-latex-types": "^1.8.4", + "@unified-latex/unified-latex-util-match": "^1.8.4" } }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "node_modules/@unified-latex/unified-latex-util-trim": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-trim/-/unified-latex-util-trim-1.8.4.tgz", + "integrity": "sha512-Da6vw1XyFxj1uk2p5cxOJXRMVhM/HEaf0SG8R+G1XUEJOmglicSoJOqRIAkpDrLOBZLebAiiXWmjbtIQzbhKkQ==", "dev": true, + "license": "MIT", "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" + "@unified-latex/unified-latex-types": "^1.8.4", + "@unified-latex/unified-latex-util-match": "^1.8.4", + "@unified-latex/unified-latex-util-visit": "^1.8.4", + "unified": "^10.1.2" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/jquery": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", - "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==" - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "node_modules/@unified-latex/unified-latex-util-visit": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@unified-latex/unified-latex-util-visit/-/unified-latex-util-visit-1.8.4.tgz", + "integrity": "sha512-m5O9evxr/kiX1awZAcwUQL+8slVvlWlkbZoKFDP1agrp3dpk7+69npqyoapKKJEK0B4uRYmv93Ho31oHgNoJrg==", "dev": true, + "license": "MIT", "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "@unified-latex/unified-latex-types": "^1.8.4", + "@unified-latex/unified-latex-util-match": "^1.8.4" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "dev": true, - "engines": { - "node": ">=14" - }, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/antonk52" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/nanoid": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.9.tgz", - "integrity": "sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==", + "node_modules/bootstrap": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", + "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", "dev": true, "funding": [ { "type": "github", - "url": "https://github.com/sponsors/ai" + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" } ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" } }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "MIT" }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "node_modules/discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==", "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true + "license": "MIT" }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } + "license": "MIT" }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "node_modules/i": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/i/-/i-0.3.7.tgz", + "integrity": "sha512-FYz4wlXgkQwIPqhzC5TdNMLSE5+GS1IIDJZY/1ZiEPCT2S3COUVZeT5OW4BmW4r5LHLQuOosSwsvnroG9GR59Q==", "dev": true, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/popper.js": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", - "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", - "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" + "node": ">=0.4" } }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", "dev": true, "funding": [ { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "type": "github", + "url": "https://github.com/sponsors/feross" }, { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" + "type": "patreon", + "url": "https://www.patreon.com/feross" }, { - "type": "github", - "url": "https://github.com/sponsors/ai" + "type": "consulting", + "url": "https://feross.org/support" } ], - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, + "license": "MIT", "engines": { - "node": "^10 || ^12 || >=14" + "node": ">=4" } }, - "node_modules/postcss-cli": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.1.tgz", - "integrity": "sha512-0UnkNPSayHKRe/tc2YGW6XnSqqOA9eqpiRMgRlV1S6HdGi16vwJBx7lviARzbV1HpQHqLLRH3o8vTcB0cLc+5g==", + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, - "dependencies": { - "chokidar": "^3.3.0", - "dependency-graph": "^1.0.0", - "fs-extra": "^11.0.0", - "picocolors": "^1.0.0", - "postcss-load-config": "^5.0.0", - "postcss-reporter": "^7.0.0", - "pretty-hrtime": "^1.0.3", - "read-cache": "^1.0.0", - "slash": "^5.0.0", - "tinyglobby": "^0.2.12", - "yargs": "^17.0.0" - }, - "bin": { - "postcss": "index.js" - }, + "license": "MIT", "engines": { - "node": ">=18" + "node": ">=12" }, - "peerDependencies": { - "postcss": "^8.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/postcss-load-config": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", - "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", + "node_modules/just-permutations": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/just-permutations/-/just-permutations-2.2.1.tgz", + "integrity": "sha512-J2W9djsAsl346A9H41H/S8VXfnPjxZSFfBbAsZRbtFUQTpfmGBGJLWNeZgoDtzBw+ZaN7WF/DOsAJ+V/e6P5cQ==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "lilconfig": "^3.1.1", - "yaml": "^2.4.2" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - } - } + "license": "MIT" }, - "node_modules/postcss-reporter": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.1.0.tgz", - "integrity": "sha512-/eoEylGWyy6/DOiMP5lmFRdmDKThqgn7D6hP2dXKJI/0rJSO1ADFNngZfDzxL0YAxFvws+Rtpuji1YIHj4mySA==", + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "picocolors": "^1.0.0", - "thenby": "^1.3.4" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } + "license": "MIT" }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true - }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "node_modules/lunr": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz", + "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true, - "engines": { - "node": ">= 0.8" - } + "license": "MIT" }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "node_modules/moo": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.3.tgz", + "integrity": "sha512-m2fmM2dDm7GZQsY7KK2cme8agi+AAljILjQnof7p1ZMDe6dQ4bdnSMx0cPppudoeNv5hEFQirN6u+O4fDE0IWA==", "dev": true, - "dependencies": { - "pify": "^2.3.0" - } + "license": "BSD-3-Clause" }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/nearley": { + "version": "2.20.1", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", + "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", "dev": true, + "license": "MIT", "dependencies": { - "picomatch": "^2.2.1" + "commander": "^2.19.0", + "moo": "^0.5.0", + "railroad-diagrams": "^1.0.0", + "randexp": "0.4.6" }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "engines": { - "node": ">=14.16" + "bin": { + "nearley-railroad": "bin/nearley-railroad.js", + "nearley-test": "bin/nearley-test.js", + "nearley-unparse": "bin/nearley-unparse.js", + "nearleyc": "bin/nearleyc.js" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "individual", + "url": "https://nearley.js.org/#give-to-nearley" } }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "node_modules/railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==", "dev": true, - "engines": { - "node": ">=0.10.0" - } + "license": "CC0-1.0" }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "discontinuous-range": "1.0.0", + "ret": "~0.1.10" }, "engines": { - "node": ">=8" + "node": ">=0.12" } }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=0.12" } }, - "node_modules/thenby": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/thenby/-/thenby-1.3.4.tgz", - "integrity": "sha512-89Gi5raiWA3QZ4b2ePcEwswC3me9JIg+ToSgtE0JWeCynLnLxNr/f9G+xfo9K+Oj4AFdom8YNJjibIARTJmapQ==", - "dev": true + "node_modules/tiny-merge-patch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tiny-merge-patch/-/tiny-merge-patch-1.0.0.tgz", + "integrity": "sha512-NR7dpqibfxA1uHaFJn5YXViH7REa0wPcZh8MLFrEn9OvDWyIY9YyyKHHmFBE66ER18CQwJ+VGknsQbgiBtL8Uw==", + "dev": true, + "license": "MIT" }, - "node_modules/tinyglobby": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", - "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "dev": true, - "dependencies": { - "fdir": "^6.4.3", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, + "license": "MIT", "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "node_modules/unicode2latex": { + "version": "7.0.33", + "resolved": "https://registry.npmjs.org/unicode2latex/-/unicode2latex-7.0.33.tgz", + "integrity": "sha512-Yk9tXwI/EVoLJzqAJfJpoUsY9ti5NV1aI2YpH4cg/n0q6Hj3Hnt/uT1nU27AqQFIgVpiT9SsNnAe56eTWuM/3g==", "dev": true, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } + "license": "ISC", + "dependencies": { + "@pomgui/deep": "^3.0.3", + "just-permutations": "^2.2.1", + "tiny-merge-patch": "^1.0.0" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "node_modules/unified": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-10.1.2.tgz", + "integrity": "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==", "dev": true, - "engines": { - "node": ">=12" + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "bail": "^2.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^5.0.0" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/unist-util-stringify-position": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", + "integrity": "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==", "dev": true, + "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "@types/unist": "^2.0.0" }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "engines": { - "node": ">= 10.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "node_modules/vfile": { + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-5.3.7.tgz", + "integrity": "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==", "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "license": "MIT", "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^3.0.0", + "vfile-message": "^3.0.0" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/vfile-message": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-3.1.4.tgz", + "integrity": "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^3.0.0" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/wink-eng-lite-web-model": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/wink-eng-lite-web-model/-/wink-eng-lite-web-model-1.8.1.tgz", + "integrity": "sha512-M2tSOU/rVNkDj8AS8IoKJaM7apJJjS0cN+hE8CPazfnB4A/ojyc9+7RMPk18UOiIdSyWk7MR6w8z9lWix2l5tA==", "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=16.0.0" } }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/wink-nlp": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/wink-nlp/-/wink-nlp-2.4.0.tgz", + "integrity": "sha512-d02inlNJL0LLNTLoYfkxZYGrqnYDSZV4HI4WpeuyIEfpu7UcUqUW1ZYWr+JTFm4ZR6dQdzOW/FtHEQRO+o/zzA==", "dev": true, - "engines": { - "node": ">=12" - } + "license": "MIT" } } } diff --git a/package.json b/package.json index 0d7f974..a132cc8 100644 --- a/package.json +++ b/package.json @@ -2,14 +2,14 @@ "name": "tbf-site", "version": "0.1.0", "license": "CC0-1.0", - "devDependencies": { - "autoprefixer": "^10.2.5", - "postcss": "^8.5.6", - "postcss-cli": "^11.0.0" + "scripts": { + "bibliography": "node .github/scripts/bibtex-to-json.mjs", + "bibliography:check": "node .github/scripts/check-bibliography-sync.mjs", + "models:fetch": "node .github/scripts/fetch-models.mjs" }, - "dependencies": { - "bootstrap": "^5.3.7", - "jquery": "^3.0", - "popper.js": "^1.16.0" + "devDependencies": { + "@docsy/theme": "0.16.0", + "@retorquere/bibtex-parser": "10.0.1", + "lunr": "2.3.9" } }