unaltraweb 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +20 -0
- data/Makefile +412 -0
- data/README.md +226 -0
- data/_config.yml +842 -0
- data/_data/i18n/ca.yml +278 -0
- data/_data/i18n/en.yml +278 -0
- data/_data/i18n/es.yml +278 -0
- data/_includes/audio.liquid +30 -0
- data/_includes/bib_search.liquid +5 -0
- data/_includes/blog-list.liquid +66 -0
- data/_includes/book-citation.liquid +33 -0
- data/_includes/citation.liquid +26 -0
- data/_includes/custom_head.liquid +3 -0
- data/_includes/custom_scripts.liquid +5 -0
- data/_includes/cv/list.liquid +5 -0
- data/_includes/cv/list_groups.liquid +51 -0
- data/_includes/cv/map.liquid +29 -0
- data/_includes/cv/nested_list.liquid +16 -0
- data/_includes/cv/time_table.liquid +118 -0
- data/_includes/cv-download-card.liquid +26 -0
- data/_includes/developer-mode-switcher.liquid +24 -0
- data/_includes/disqus.liquid +13 -0
- data/_includes/distill_scripts.liquid +298 -0
- data/_includes/documentation-download-detail.liquid +76 -0
- data/_includes/documentation-downloads.liquid +71 -0
- data/_includes/documentation-profile-attributes.liquid +4 -0
- data/_includes/documentation-section-toc.liquid +9 -0
- data/_includes/documentation-sidebar.liquid +112 -0
- data/_includes/figure.liquid +87 -0
- data/_includes/footer.liquid +66 -0
- data/_includes/giscus.liquid +25 -0
- data/_includes/head.liquid +220 -0
- data/_includes/header.liquid +544 -0
- data/_includes/latest_posts.liquid +61 -0
- data/_includes/localized-date.liquid +5 -0
- data/_includes/manual-bibliography.liquid +2 -0
- data/_includes/manual-featured-readings.liquid +12 -0
- data/_includes/manual-other-readings.liquid +12 -0
- data/_includes/manual-page-toc.liquid +11 -0
- data/_includes/manual-sidebar.liquid +58 -0
- data/_includes/manual-teachers.liquid +74 -0
- data/_includes/metadata.liquid +278 -0
- data/_includes/news.liquid +48 -0
- data/_includes/newsletter.liquid +68 -0
- data/_includes/page-hero.liquid +96 -0
- data/_includes/page-link.liquid +8 -0
- data/_includes/pagination.liquid +22 -0
- data/_includes/post-reading-time.liquid +29 -0
- data/_includes/previous-next.liquid +37 -0
- data/_includes/profile-card.liquid +49 -0
- data/_includes/profile-feature-matrix.liquid +75 -0
- data/_includes/profile-highlights.liquid +122 -0
- data/_includes/project-grid.liquid +26 -0
- data/_includes/project-resource-link.liquid +45 -0
- data/_includes/project-resources.liquid +21 -0
- data/_includes/projects.liquid +38 -0
- data/_includes/projects_horizontal.liquid +37 -0
- data/_includes/publications-metrics-summary.liquid +69 -0
- data/_includes/publications-summary.liquid +127 -0
- data/_includes/reading-biblio-controls.liquid +65 -0
- data/_includes/reading-cover-card.liquid +93 -0
- data/_includes/reading-rating.liquid +11 -0
- data/_includes/recommended-readings.liquid +30 -0
- data/_includes/related_posts.liquid +39 -0
- data/_includes/repository/repo.liquid +48 -0
- data/_includes/repository/repo_trophies.liquid +44 -0
- data/_includes/repository/repo_user.liquid +35 -0
- data/_includes/resume/awards.liquid +19 -0
- data/_includes/resume/basics.liquid +28 -0
- data/_includes/resume/certificates.liquid +35 -0
- data/_includes/resume/education.liquid +54 -0
- data/_includes/resume/interests.liquid +34 -0
- data/_includes/resume/languages.liquid +31 -0
- data/_includes/resume/projects.liquid +32 -0
- data/_includes/resume/publications.liquid +28 -0
- data/_includes/resume/references.liquid +31 -0
- data/_includes/resume/skills.liquid +33 -0
- data/_includes/resume/volunteer.liquid +52 -0
- data/_includes/resume/work.liquid +52 -0
- data/_includes/scripts.liquid +364 -0
- data/_includes/search-data.js.liquid +341 -0
- data/_includes/selected_papers.liquid +3 -0
- data/_includes/t.liquid +31 -0
- data/_includes/team-grid.liquid +172 -0
- data/_includes/video.liquid +97 -0
- data/_layouts/about.liquid +93 -0
- data/_layouts/archive.liquid +45 -0
- data/_layouts/bib.liquid +677 -0
- data/_layouts/book-review.liquid +225 -0
- data/_layouts/book-shelf.liquid +66 -0
- data/_layouts/cv.liquid +127 -0
- data/_layouts/default.liquid +70 -0
- data/_layouts/distill.liquid +132 -0
- data/_layouts/documentation-download-detail.liquid +5 -0
- data/_layouts/documentation-home.liquid +100 -0
- data/_layouts/documentation-page.liquid +45 -0
- data/_layouts/manual-bib.liquid +73 -0
- data/_layouts/manual-chapter.liquid +99 -0
- data/_layouts/manual-featured-bib.liquid +100 -0
- data/_layouts/manual-home.liquid +120 -0
- data/_layouts/none.liquid +1 -0
- data/_layouts/outputs.liquid +29 -0
- data/_layouts/page.liquid +52 -0
- data/_layouts/post.liquid +95 -0
- data/_layouts/profile.liquid +36 -0
- data/_layouts/profiles.liquid +36 -0
- data/_layouts/project.liquid +7 -0
- data/_layouts/repositories.liquid +58 -0
- data/_layouts/theses.liquid +126 -0
- data/_plugins/bibliography_profiles.rb +164 -0
- data/_plugins/callouts.rb +104 -0
- data/_plugins/code_blocks.rb +277 -0
- data/_plugins/computation_figure_images.rb +266 -0
- data/_plugins/computation_sources.rb +42 -0
- data/_plugins/content_search_index.rb +210 -0
- data/_plugins/details.rb +23 -0
- data/_plugins/external-posts.rb +124 -0
- data/_plugins/figure_captions.rb +800 -0
- data/_plugins/file-exists.rb +22 -0
- data/_plugins/google-scholar-citations.rb +86 -0
- data/_plugins/hide-custom-bibtex.rb +18 -0
- data/_plugins/inspirehep-citations.rb +57 -0
- data/_plugins/localized_visual_sources.rb +145 -0
- data/_plugins/manual_release_metadata.rb +47 -0
- data/_plugins/mermaid_mmd_images.rb +233 -0
- data/_plugins/profile-pages.rb +28 -0
- data/_plugins/remove-accents.rb +32 -0
- data/_plugins/reproducible_build_time.rb +55 -0
- data/_plugins/search-data.rb +83 -0
- data/_plugins/theme-cache-bust.rb +56 -0
- data/_plugins/vega_visual_images.rb +290 -0
- data/_plugins/web_capture_images.rb +154 -0
- data/_sass/_base.scss +2133 -0
- data/_sass/_blog.scss +67 -0
- data/_sass/_callouts.scss +100 -0
- data/_sass/_custom.scss +437 -0
- data/_sass/_cv.scss +274 -0
- data/_sass/_developer.scss +97 -0
- data/_sass/_distill.scss +185 -0
- data/_sass/_documentation.scss +2220 -0
- data/_sass/_layout.scss +218 -0
- data/_sass/_manual.scss +2691 -0
- data/_sass/_profile.scss +323 -0
- data/_sass/_projects.scss +163 -0
- data/_sass/_reading.scss +465 -0
- data/_sass/_site-custom.scss +3 -0
- data/_sass/_tabs.scss +48 -0
- data/_sass/_team.scss +230 -0
- data/_sass/_themes.scss +254 -0
- data/_sass/_typograms.scss +132 -0
- data/_sass/_variables.scss +52 -0
- data/_sass/font-awesome/_animated.scss +152 -0
- data/_sass/font-awesome/_bordered-pulled.scss +20 -0
- data/_sass/font-awesome/_core.scss +49 -0
- data/_sass/font-awesome/_fixed-width.scss +7 -0
- data/_sass/font-awesome/_functions.scss +57 -0
- data/_sass/font-awesome/_icons.scss +13 -0
- data/_sass/font-awesome/_list.scss +18 -0
- data/_sass/font-awesome/_mixins.scss +65 -0
- data/_sass/font-awesome/_rotated-flipped.scss +31 -0
- data/_sass/font-awesome/_screen-reader.scss +14 -0
- data/_sass/font-awesome/_shims.scss +1578 -0
- data/_sass/font-awesome/_sizing.scss +16 -0
- data/_sass/font-awesome/_stacked.scss +32 -0
- data/_sass/font-awesome/_variables.scss +5044 -0
- data/_sass/font-awesome/brands.scss +30 -0
- data/_sass/font-awesome/fontawesome.scss +21 -0
- data/_sass/font-awesome/regular.scss +27 -0
- data/_sass/font-awesome/solid.scss +27 -0
- data/_sass/font-awesome/v4-shims.scss +11 -0
- data/_sass/tabler-icons/tabler-icons-filled.scss +1646 -0
- data/_sass/tabler-icons/tabler-icons-outline.scss +9859 -0
- data/_sass/tabler-icons/tabler-icons.scss +11463 -0
- data/_scripts/cronitor-analytics-setup.js +9 -0
- data/_scripts/giscus-setup.js +48 -0
- data/_scripts/google-analytics-setup.js +9 -0
- data/_scripts/open-panel-analytics-setup.js +14 -0
- data/_scripts/photoswipe-setup.js +11 -0
- data/assets/audio/epicaly-short-113909.mp3 +0 -0
- data/assets/bibliography/2018-12-22-distill.bib +7 -0
- data/assets/css/academicons.min.css +1 -0
- data/assets/css/bootstrap-toc.min.css +4 -0
- data/assets/css/bootstrap.min.css +7 -0
- data/assets/css/bootstrap.min.css.map +1 -0
- data/assets/css/jekyll-pygments-themes-github.css +209 -0
- data/assets/css/jekyll-pygments-themes-native.css +232 -0
- data/assets/css/jupyter-grade3.css +3758 -0
- data/assets/css/jupyter-monokai.css +3758 -0
- data/assets/css/jupyter.css +383 -0
- data/assets/css/main.scss +36 -0
- data/assets/css/mdb.min.css +48 -0
- data/assets/css/mdb.min.css.map +1 -0
- data/assets/css/scholar-icons.css +386 -0
- data/assets/fonts/academicons.ttf +0 -0
- data/assets/fonts/academicons.woff +0 -0
- data/assets/fonts/scholar-icons.ttf +0 -0
- data/assets/fonts/scholar-icons.woff +0 -0
- data/assets/fonts/tabler-icons-filled.ttf +0 -0
- data/assets/fonts/tabler-icons-filled.woff +0 -0
- data/assets/fonts/tabler-icons-filled.woff2 +0 -0
- data/assets/fonts/tabler-icons-outline.ttf +0 -0
- data/assets/fonts/tabler-icons-outline.woff +0 -0
- data/assets/fonts/tabler-icons-outline.woff2 +0 -0
- data/assets/fonts/tabler-icons.ttf +0 -0
- data/assets/fonts/tabler-icons.woff +0 -0
- data/assets/fonts/tabler-icons.woff2 +0 -0
- data/assets/html/relativity.html +15 -0
- data/assets/img/1.jpg +0 -0
- data/assets/img/10.jpg +0 -0
- data/assets/img/11.jpg +0 -0
- data/assets/img/12.jpg +0 -0
- data/assets/img/2.jpg +0 -0
- data/assets/img/3.jpg +0 -0
- data/assets/img/4.jpg +0 -0
- data/assets/img/5.jpg +0 -0
- data/assets/img/6.jpg +0 -0
- data/assets/img/7.jpg +0 -0
- data/assets/img/8.jpg +0 -0
- data/assets/img/9.jpg +0 -0
- data/assets/img/book_covers/the_godfather.jpg +0 -0
- data/assets/img/brand/dosquartsdedocs-logo-cafe.svg +31 -0
- data/assets/img/brand/dosquartsdedocs-logo-footer-cafe.svg +31 -0
- data/assets/img/brand/dosquartsdedocs-logo-white.svg +31 -0
- data/assets/img/brand/dosquartsdedocs-logo.svg +31 -0
- data/assets/img/prof_pic.jpg +0 -0
- data/assets/img/prof_pic_color.png +0 -0
- data/assets/img/profile-placeholder.svg +8 -0
- data/assets/img/publication_preview/brownian-motion.gif +0 -0
- data/assets/img/publication_preview/goodchild1992-gis-cover.jpg +0 -0
- data/assets/img/publication_preview/gutierrez2020-jtrg-preview.jpg +0 -0
- data/assets/img/publication_preview/harvey1989-postmodernity-cover.jpg +0 -0
- data/assets/img/publication_preview/tobler1970-economic-geography-cover.jpg +0 -0
- data/assets/img/publication_preview/tuan1977-space-place-cover.jpg +0 -0
- data/assets/img/publication_preview/wave-mechanics.gif +0 -0
- data/assets/img/publication_preview/zaragozi2025-rooftop-pv-preview.jpg +0 -0
- data/assets/img/rhino.png +0 -0
- data/assets/img/team/aaron-gutierrez.png +0 -0
- data/assets/img/team/alba-font.png +0 -0
- data/assets/img/team/alba-viana.png +0 -0
- data/assets/img/team/alejandro-gonzalez.png +0 -0
- data/assets/img/team/ana-pastor.png +0 -0
- data/assets/img/team/antoni-domenech.png +0 -0
- data/assets/img/team/benito-zaragozi.png +0 -0
- data/assets/img/team/cinta-sanz.png +0 -0
- data/assets/img/team/daniel-miravet.png +0 -0
- data/assets/img/team/eugenia-altamirano.png +0 -0
- data/assets/img/team/fiammetta-brandajs.png +0 -0
- data/assets/img/team/francesc-gonzalez.png +0 -0
- data/assets/img/team/isabel-paulino.png +0 -0
- data/assets/img/team/joan-borras.png +0 -0
- data/assets/img/team/julie-wilson.png +0 -0
- data/assets/img/team/liliana-sole.png +0 -0
- data/assets/img/team/maria-casado.png +0 -0
- data/assets/img/team/maria-medina.png +0 -0
- data/assets/img/team/marta-nello.png +0 -0
- data/assets/img/team/mogrify +1 -0
- data/assets/img/team/oscar-saladie.png +0 -0
- data/assets/img/team/paolo-russo.png +0 -0
- data/assets/img/team/raquel-santos.png +0 -0
- data/assets/img/team/salvador-anton.png +0 -0
- data/assets/img/team/sunsi-huertas.png +0 -0
- data/assets/img/team/user-placeholder.png +0 -0
- data/assets/img/team/wilbert-den-hoed.png +0 -0
- data/assets/img/team/xavier-delclos.png +0 -0
- data/assets/img/template_error.png +0 -0
- data/assets/js/bibsearch.js +70 -0
- data/assets/js/bootstrap-toc.min.js +5 -0
- data/assets/js/bootstrap.bundle.min.js +7 -0
- data/assets/js/bootstrap.bundle.min.js.map +1 -0
- data/assets/js/callouts.js +115 -0
- data/assets/js/chartjs-setup.js +14 -0
- data/assets/js/common.js +117 -0
- data/assets/js/content-search-match.js +159 -0
- data/assets/js/content-search.js +441 -0
- data/assets/js/copy_code.js +60 -0
- data/assets/js/custom.js +6 -0
- data/assets/js/developer-mode.js +103 -0
- data/assets/js/diff2html-setup.js +20 -0
- data/assets/js/distillpub/overrides.js +27 -0
- data/assets/js/distillpub/template.v2.js +9616 -0
- data/assets/js/distillpub/template.v2.js.map +1 -0
- data/assets/js/distillpub/transforms.v2.js +14557 -0
- data/assets/js/distillpub/transforms.v2.js.map +1 -0
- data/assets/js/documentation.js +435 -0
- data/assets/js/echarts-setup.js +29 -0
- data/assets/js/highlight-search-term.js +110 -0
- data/assets/js/jupyter_new_tab.js +18 -0
- data/assets/js/leaflet-setup.js +22 -0
- data/assets/js/manual.js +308 -0
- data/assets/js/masonry.js +12 -0
- data/assets/js/mathjax-setup.js +46 -0
- data/assets/js/mermaid-setup.js +37 -0
- data/assets/js/newsletter.js +105 -0
- data/assets/js/no_defer.js +24 -0
- data/assets/js/plotly-setup.js +52 -0
- data/assets/js/profile-nav.js +92 -0
- data/assets/js/progress-bar.js +73 -0
- data/assets/js/pseudocode-setup.js +18 -0
- data/assets/js/search/base-styles.min.js +286 -0
- data/assets/js/search/command-score.min.js +7 -0
- data/assets/js/search/hotkeys-js/hotkeys.esm.min.js +18 -0
- data/assets/js/search/lit/decorators.min.js +7 -0
- data/assets/js/search/lit/directives/class-map.min.js +7 -0
- data/assets/js/search/lit/directives/join.min.js +7 -0
- data/assets/js/search/lit/directives/live.min.js +7 -0
- data/assets/js/search/lit/directives/ref.min.js +7 -0
- data/assets/js/search/lit/directives/repeat.min.js +7 -0
- data/assets/js/search/lit/directives/unsafe-html.min.js +7 -0
- data/assets/js/search/lit/index.min.js +7 -0
- data/assets/js/search/lit-element/lit-element.min.js +12 -0
- data/assets/js/search/lit-html/directives/class-map.min.js +22 -0
- data/assets/js/search/lit-html/directives/join.min.js +12 -0
- data/assets/js/search/lit-html/directives/live.min.js +28 -0
- data/assets/js/search/lit-html/directives/ref.min.js +32 -0
- data/assets/js/search/lit-html/directives/repeat.min.js +27 -0
- data/assets/js/search/lit-html/directives/unsafe-html.min.js +22 -0
- data/assets/js/search/lit-html/is-server.min.js +12 -0
- data/assets/js/search/lit-html/lit-html.min.js +12 -0
- data/assets/js/search/ninja-action.min.js +101 -0
- data/assets/js/search/ninja-footer.min.js +62 -0
- data/assets/js/search/ninja-header.min.js +78 -0
- data/assets/js/search/ninja-keys.min.js +39 -0
- data/assets/js/search/reactive-element/decorators/custom-element.min.js +12 -0
- data/assets/js/search/reactive-element/decorators/event-options.min.js +12 -0
- data/assets/js/search/reactive-element/decorators/property.min.js +22 -0
- data/assets/js/search/reactive-element/decorators/query-all.min.js +17 -0
- data/assets/js/search/reactive-element/decorators/query-assigned-elements.min.js +17 -0
- data/assets/js/search/reactive-element/decorators/query-assigned-nodes.min.js +17 -0
- data/assets/js/search/reactive-element/decorators/query-async.min.js +17 -0
- data/assets/js/search/reactive-element/decorators/query.min.js +17 -0
- data/assets/js/search/reactive-element/decorators/state.min.js +27 -0
- data/assets/js/search/reactive-element/reactive-element.min.js +17 -0
- data/assets/js/search-setup.js +17 -0
- data/assets/js/shortcut-key.js +11 -0
- data/assets/js/tabs.min.js +5 -0
- data/assets/js/theme.js +314 -0
- data/assets/js/tooltips-setup.js +3 -0
- data/assets/js/typograms.js +1341 -0
- data/assets/js/vanilla-back-to-top.min.js +1 -0
- data/assets/js/vega-setup.js +24 -0
- data/assets/js/venobox-setup.js +5 -0
- data/assets/js/wechat.js +14 -0
- data/assets/js/zoom.js +15 -0
- data/assets/json/resume.json +98 -0
- data/assets/json/table_data.json +128 -0
- data/assets/jupyter/blog.ipynb +48 -0
- data/assets/pdf/example_pdf.pdf +0 -0
- data/assets/plotly/demo.html +72 -0
- data/assets/video/pexels-engin-akyurt-6069112-960x540-30fps.mp4 +0 -0
- data/assets/webfonts/fa-brands-400.ttf +0 -0
- data/assets/webfonts/fa-brands-400.woff2 +0 -0
- data/assets/webfonts/fa-regular-400.ttf +0 -0
- data/assets/webfonts/fa-regular-400.woff2 +0 -0
- data/assets/webfonts/fa-solid-900.ttf +0 -0
- data/assets/webfonts/fa-solid-900.woff2 +0 -0
- data/assets/webfonts/fa-v4compatibility.ttf +0 -0
- data/assets/webfonts/fa-v4compatibility.woff2 +0 -0
- data/docs/Gemfile +5 -0
- data/docs/_config.yml +83 -0
- data/docs/_documentation/en/01-quick-start.md +115 -0
- data/docs/_documentation/en/02-tools.md +146 -0
- data/docs/_documentation/en/03-usage.md +107 -0
- data/docs/_documentation/en/04-jekyll-basics.md +51 -0
- data/docs/_documentation/en/05-pages-collections.md +68 -0
- data/docs/_documentation/en/06-github-web-editing.md +92 -0
- data/docs/_documentation/en/10-profiles.md +125 -0
- data/docs/_documentation/en/11-unaltreselfie.md +39 -0
- data/docs/_documentation/en/12-unaltreprojecte.md +38 -0
- data/docs/_documentation/en/13-unaltremanual.md +237 -0
- data/docs/_documentation/en/14-unaltredocs.md +92 -0
- data/docs/_documentation/en/15-profile-checklist.md +39 -0
- data/docs/_documentation/en/20-syntax.md +353 -0
- data/docs/_documentation/en/21-themes.md +103 -0
- data/docs/_documentation/en/22-feature-reference.md +56 -0
- data/docs/_documentation/en/23-front-matter.md +51 -0
- data/docs/_documentation/en/24-data-files.md +28 -0
- data/docs/_documentation/en/30-customization.md +448 -0
- data/docs/_documentation/en/31-template.md +55 -0
- data/docs/_documentation/en/32-development.md +108 -0
- data/docs/_documentation/en/33-reusable-workflows.md +136 -0
- data/docs/_documentation/en/40-distribution.md +164 -0
- data/docs/_documentation/en/41-bibliometrics.md +137 -0
- data/docs/_documentation/en/42-docker-image.md +185 -0
- data/docs/_documentation/en/50-faq.md +33 -0
- data/docs/_pages/ca/index.md +35 -0
- data/docs/_pages/en/index.md +35 -0
- data/docs/_pages/es/index.md +35 -0
- data/docs/agents/action-prompts/00-start-site-session.txt +10 -0
- data/docs/agents/action-prompts/05-create-new-web.txt +5 -0
- data/docs/agents/action-prompts/10-content-update.txt +9 -0
- data/docs/agents/action-prompts/15-edit-default-content.txt +8 -0
- data/docs/agents/action-prompts/20-manual-teaching-materials.txt +18 -0
- data/docs/agents/action-prompts/22-manual-style-audit.txt +14 -0
- data/docs/agents/action-prompts/23-manual-structure-audit.txt +17 -0
- data/docs/agents/action-prompts/25-translation-prepublish.txt +8 -0
- data/docs/agents/action-prompts/30-project-site-update.txt +7 -0
- data/docs/agents/action-prompts/40-documentation-update.txt +7 -0
- data/docs/agents/action-prompts/50-bibliography-entry.txt +7 -0
- data/docs/agents/action-prompts/60-bibliometrics-refresh.txt +7 -0
- data/docs/agents/action-prompts/70-build-and-review.txt +12 -0
- data/docs/agents/manual-authoring-components.md +255 -0
- data/docs/agents/mcp-contract.md +162 -0
- data/docs/agents/quarto-computation-adoption.md +102 -0
- data/docs/assets/img/unaltraweb-docs-hero.svg +36 -0
- data/lib/unaltraweb/version.rb +8 -0
- data/lib/unaltraweb.rb +31 -0
- data/requirements.txt +5 -0
- data/scripts/biblio/fetch_scimago_csv.sh +126 -0
- data/scripts/biblio/metrics_common.py +154 -0
- data/scripts/biblio/metrics_merge_meta.py +73 -0
- data/scripts/biblio/metrics_update.py +826 -0
- data/scripts/computations/python/Dockerfile +37 -0
- data/scripts/computations/r/Dockerfile +31 -0
- data/scripts/computations/render.py +1267 -0
- data/scripts/cv/render_pdf_preview.sh +36 -0
- data/scripts/deploy/publish_branch.sh +80 -0
- data/scripts/generate_logo_variants.py +47 -0
- data/scripts/manual/Dockerfile +31 -0
- data/scripts/manual/build_pdf.py +1780 -0
- data/scripts/manual/filters/bibliography.lua +164 -0
- data/scripts/manual/filters/code-blocks.lua +102 -0
- data/scripts/manual/filters/figure-captions.lua +35 -0
- data/scripts/manual/publish_release.sh +281 -0
- data/scripts/manual/templates/manual.tex +494 -0
- data/scripts/manual/verify_release_assets.py +650 -0
- data/scripts/test_gem_build.py +128 -0
- data/scripts/test_reproducible_jekyll_build.py +191 -0
- data/scripts/test_wheel_install.py +282 -0
- data/scripts/unaltraweb-docker-mount.sh +36 -0
- data/scripts/unaltraweb-mcp-bootstrap.sh +105 -0
- data/scripts/unaltraweb-mcp-cleanup.sh +73 -0
- data/scripts/unaltraweb-mcp-project-id.sh +34 -0
- data/scripts/validate_distribution.py +563 -0
- data/scripts/validate_workflows.py +1285 -0
- data/scripts/web_captures/Dockerfile +31 -0
- data/scripts/web_captures/capture.mjs +157 -0
- data/scripts/web_captures/package-lock.json +56 -0
- data/scripts/web_captures/package.json +9 -0
- data/scripts/web_captures/render.py +867 -0
- data/src/unaltraweb_mcp/component-contract.json +153 -0
- data/src/unaltraweb_mcp/component-contract.schema.json +87 -0
- data/src/unaltraweb_mcp/docker_mount.py +19 -0
- metadata +861 -0
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Customize A Child Site
|
|
3
|
+
description: Local customization points for unaltraweb child sites.
|
|
4
|
+
lang: en
|
|
5
|
+
ref: customization
|
|
6
|
+
profiles:
|
|
7
|
+
- unaltredocs
|
|
8
|
+
documentation_profiles:
|
|
9
|
+
- local-authors
|
|
10
|
+
- site-designers
|
|
11
|
+
- contributors
|
|
12
|
+
- core-developers
|
|
13
|
+
section: Design And Customize
|
|
14
|
+
weight: 330
|
|
15
|
+
permalink: "/customization/"
|
|
16
|
+
nav_title: Customization
|
|
17
|
+
---
|
|
18
|
+
`unaltraweb` is intended to be customized from the site repository, not by editing the core theme files.
|
|
19
|
+
|
|
20
|
+
## Local Styles
|
|
21
|
+
|
|
22
|
+
Create `_sass/_site-custom.scss` in your site repository. It is imported after the core styles, so local rules can override CSS custom properties or add small components while still receiving upstream `unaltraweb` updates.
|
|
23
|
+
|
|
24
|
+
```scss
|
|
25
|
+
:root {
|
|
26
|
+
--global-theme-color: #2f6f5e;
|
|
27
|
+
--global-hover-color: #2f6f5e;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
html[data-theme="cafe"] {
|
|
31
|
+
--global-theme-color: #6f4e1f;
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
The built-in coffee mode uses `data-theme="cafe"`. Override CSS custom properties in that selector when you want a different brown palette without changing light or dark mode.
|
|
36
|
+
|
|
37
|
+
For larger local style changes, keep selectors scoped by profile or theme:
|
|
38
|
+
|
|
39
|
+
```scss
|
|
40
|
+
html[data-site-profile="unaltredocs"] .documentation-sidebar {
|
|
41
|
+
--documentation-toc-line: color-mix(in srgb, var(--global-theme-color) 42%, var(--global-divider-color));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
html[data-theme="dark"] .my-local-card {
|
|
45
|
+
background: #1f2935;
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Do not copy `_sass/` files from `unaltraweb` into a child site. Override tokens and small selectors locally so future gem updates still apply.
|
|
50
|
+
|
|
51
|
+
## Multilingual Hyphenation
|
|
52
|
+
|
|
53
|
+
Text hyphenation is enabled globally in the main content area. Browsers use the page language from `lang` (`en`, `es`, `ca`, or another configured language) to choose the hyphenation dictionary.
|
|
54
|
+
|
|
55
|
+
Use `.no-hyphenate` when a specific word, brand, code-like label or compact block should not be split:
|
|
56
|
+
|
|
57
|
+
```html
|
|
58
|
+
<span class="no-hyphenate">dosquartsdedocs</span>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
For mixed-language passages, set the appropriate `lang` attribute on the local element so the browser can switch dictionaries.
|
|
62
|
+
|
|
63
|
+
## Local Layouts
|
|
64
|
+
|
|
65
|
+
Create a layout in `_layouts/` inside the site repository and reference it from page front matter.
|
|
66
|
+
|
|
67
|
+
```liquid
|
|
68
|
+
---
|
|
69
|
+
layout: page
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
<div class="my-local-layout">
|
|
73
|
+
{{ content }}
|
|
74
|
+
</div>
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
```yaml
|
|
78
|
+
---
|
|
79
|
+
layout: my-local-layout
|
|
80
|
+
title: Custom Page
|
|
81
|
+
---
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Jekyll resolves site files before theme files, so local layouts can extend or override core layouts without forking `unaltraweb`.
|
|
85
|
+
|
|
86
|
+
## Site Profiles And Features
|
|
87
|
+
|
|
88
|
+
Use `site.unaltraweb.site_profile` to select the prepared website profile and `site.unaltraweb.features` to enable or hide standard sections. A site profile is a high-level preset for the kind of website being built; it is not a Jekyll layout or include.
|
|
89
|
+
|
|
90
|
+
```yaml
|
|
91
|
+
unaltraweb:
|
|
92
|
+
site_profile: unaltreselfie
|
|
93
|
+
features:
|
|
94
|
+
blog: true
|
|
95
|
+
cv: true
|
|
96
|
+
projects: true
|
|
97
|
+
publications: true
|
|
98
|
+
metrics: true
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Navigation pages can opt into a feature gate with front matter:
|
|
102
|
+
|
|
103
|
+
```yaml
|
|
104
|
+
---
|
|
105
|
+
title: Projects
|
|
106
|
+
ref: projects
|
|
107
|
+
feature: projects
|
|
108
|
+
nav: true
|
|
109
|
+
---
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
If `unaltraweb.features.projects` is `false`, that page is hidden from the navigation. The page still exists if it is published, so users can keep drafts or direct links while changing presets.
|
|
113
|
+
|
|
114
|
+
## Standard Section Layouts
|
|
115
|
+
|
|
116
|
+
Several reusable sections are layouts. Child sites should prefer these layouts over copying Liquid loops into their pages:
|
|
117
|
+
|
|
118
|
+
```yaml
|
|
119
|
+
---
|
|
120
|
+
layout: outputs
|
|
121
|
+
title: Outputs
|
|
122
|
+
ref: outputs
|
|
123
|
+
permalink: /en/outputs/
|
|
124
|
+
---
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
```yaml
|
|
128
|
+
---
|
|
129
|
+
layout: repositories
|
|
130
|
+
title: Repositories
|
|
131
|
+
ref: repositories
|
|
132
|
+
permalink: /en/repositories/
|
|
133
|
+
---
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
```yaml
|
|
137
|
+
---
|
|
138
|
+
layout: theses
|
|
139
|
+
title: Theses
|
|
140
|
+
ref: theses
|
|
141
|
+
permalink: /en/theses/
|
|
142
|
+
---
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
```yaml
|
|
146
|
+
---
|
|
147
|
+
layout: book-shelf
|
|
148
|
+
title: Readings
|
|
149
|
+
ref: books
|
|
150
|
+
collection: books
|
|
151
|
+
permalink: /en/readings/
|
|
152
|
+
---
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
The content lives in the site repository: `_outputs/` for output cards, `_data/repositories.yml` for repository cards, `_theses/` for thesis records, and `_books/` for reading notes. The rendering logic stays in `unaltraweb`.
|
|
156
|
+
|
|
157
|
+
## Callout Shorthand
|
|
158
|
+
|
|
159
|
+
Use nested Markdown blockquotes for lightweight teaching callouts. A single `>` remains a normal quotation; deeper levels become callouts:
|
|
160
|
+
|
|
161
|
+
```markdown
|
|
162
|
+
>> A note or tip.
|
|
163
|
+
|
|
164
|
+
>>> A worked example.
|
|
165
|
+
|
|
166
|
+
>>>> A warning.
|
|
167
|
+
|
|
168
|
+
>>>>> Learning objectives.
|
|
169
|
+
|
|
170
|
+
>>>>>> A caution or danger note.
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
The labels are localized through `_data/i18n/*.yml` under `callouts`, and the colors follow the active light, coffee, or dark theme.
|
|
174
|
+
|
|
175
|
+
## Manual Profile
|
|
176
|
+
|
|
177
|
+
Use the `unaltremanual` site profile for academic handbooks, course manuals and book-like teaching material. The core profile provides a cover page, a sticky contents sidebar, a right-hand chapter table of contents, multilingual chapter routing, teacher blocks, automatic figure captions for chapters, a full-text manual search index, navbar reader font-size controls and a bibliography section without bibliometric badges.
|
|
178
|
+
|
|
179
|
+
```yaml
|
|
180
|
+
unaltraweb:
|
|
181
|
+
site_profile: unaltremanual
|
|
182
|
+
manual:
|
|
183
|
+
collection: chapters
|
|
184
|
+
cover_image: /assets/img/manual-cover.svg
|
|
185
|
+
logo: /assets/img/brand/dosquartsdedocs-logo.svg
|
|
186
|
+
logo_inverse: /assets/img/brand/dosquartsdedocs-logo-white.svg
|
|
187
|
+
figure_captions:
|
|
188
|
+
enabled: true
|
|
189
|
+
collections: [chapters]
|
|
190
|
+
|
|
191
|
+
scholar:
|
|
192
|
+
# Optional formatting override; profile ordering remains alphabetical.
|
|
193
|
+
style: apa
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
`unaltremanual` uses `_bibliography/manual.bib` by default. Web reference cards suppress the trailing DOI/URL text while preserving DOI/LINK buttons and citation/BibTeX panels; the PDF retains printable access links. Personal and project profiles instead keep curriculum-style reverse chronological ordering.
|
|
197
|
+
|
|
198
|
+
Create one localized home page per language with `layout: manual-home` and `ref: home`, then add chapters to `_chapters/<lang>/`:
|
|
199
|
+
|
|
200
|
+
```yaml
|
|
201
|
+
---
|
|
202
|
+
layout: manual-chapter
|
|
203
|
+
title: Reading Spatial Data
|
|
204
|
+
lang: en
|
|
205
|
+
ref: reading-spatial-data
|
|
206
|
+
weight: 20
|
|
207
|
+
permalink: /en/chapters/reading-spatial-data/
|
|
208
|
+
manual_references: true
|
|
209
|
+
mermaid:
|
|
210
|
+
enabled: true
|
|
211
|
+
zoomable: true
|
|
212
|
+
---
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Markdown images inside configured chapter collections are wrapped in `<figure>` elements and get localized labels. Use the optional image title as the caption:
|
|
216
|
+
|
|
217
|
+
```markdown
|
|
218
|
+

|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
For multi-panel teaching figures, use a compact subfigure block. The layout string uses `/` for rows and `+` for columns, inspired by patchwork-style composition:
|
|
222
|
+
|
|
223
|
+
```markdown
|
|
224
|
+
::: subfigures a+b/c "Three views of the same exercise"
|
|
225
|
+

|
|
226
|
+

|
|
227
|
+

|
|
228
|
+
:::
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
This renders one numbered figure with panel labels `a`, `b`, `c`; the contained images remain ordinary Markdown image declarations.
|
|
232
|
+
Multi-panel figures work best for direct before/after comparisons, controlled alternatives, short sequences, or complementary views. Prefer compact layouts such as `a+b` and `a+b/c`, keep panel captions specific, and use the device selectively rather than grouping every set of related images.
|
|
233
|
+
|
|
234
|
+
Manual chapters can also number teaching tables with the same localized counter style. Wrap a regular Markdown table in a table block and put the caption in the opening line:
|
|
235
|
+
|
|
236
|
+
```markdown
|
|
237
|
+
::: table "Weekly work rhythm"
|
|
238
|
+
| Week | Focus | Output |
|
|
239
|
+
| --- | --- | --- |
|
|
240
|
+
| 1 | Orientation | Reading notes |
|
|
241
|
+
| 2 | Data setup | Working project folder |
|
|
242
|
+
:::
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
This renders a numbered table with localized labels such as `Table 1.`, `Taula 1.` or `Tabla 1.`. Tables and figures keep separate counters.
|
|
246
|
+
|
|
247
|
+
Use a listing block to give one fenced code block a numbered caption on the web and in the PDF:
|
|
248
|
+
|
|
249
|
+
````markdown
|
|
250
|
+
::: listing "Inspect the roads layer"
|
|
251
|
+
```bash
|
|
252
|
+
ogrinfo data/raw/roads.gpkg -so roads
|
|
253
|
+
```
|
|
254
|
+
:::
|
|
255
|
+
````
|
|
256
|
+
|
|
257
|
+
The wrapper requires one non-empty double-quoted caption and exactly one fence. Captioned code examples use a counter separate from figures and tables and appear in the PDF list of code examples. Unwrapped fences remain valid and unindexed.
|
|
258
|
+
|
|
259
|
+
Use fenced code blocks for programming examples and semantic technical notation. Recognized languages show a language header, line numbers, syntax highlighting, and alternating line backgrounds. The web uses Rouge for common TIG languages; the PDF guarantees the complete treatment for Bash/Linux shell, SQL/PostGIS, Python, R, URLs (`url`), spreadsheet formulas (`spreadsheet`), and file listings (`filetree`). The three semantic fences use localized headers. Use `text` or omit the language for unnumbered verbatim without a header. A language unsupported by one renderer also falls back to that plain presentation:
|
|
260
|
+
|
|
261
|
+
````markdown
|
|
262
|
+
Inline code like `ST_Transform` stays inside the paragraph.
|
|
263
|
+
|
|
264
|
+
```sql
|
|
265
|
+
SELECT ST_Area(geom::geography) AS area_m2
|
|
266
|
+
FROM protected_areas;
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
```bash
|
|
270
|
+
ogrinfo data/raw/roads.gpkg -so roads
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
```powershell
|
|
274
|
+
ogrinfo data\raw\roads.gpkg -so roads
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
```python
|
|
278
|
+
import geopandas as gpd
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
```r
|
|
282
|
+
library(sf)
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
```haskell
|
|
286
|
+
manhattan :: Int -> Int -> Int
|
|
287
|
+
```
|
|
288
|
+
````
|
|
289
|
+
|
|
290
|
+
Every site profile writes `assets/js/content-search-index.json` during the build. Content search returns repeated whole-word occurrences separately, ignores diacritics when matching, and adds previous/next occurrence navigation to the destination page. Set `search_exclude: true` in a page or document's front matter when published content should remain outside that public index. The `search_enabled` setting only controls the separate Ninja Keys navigation and metadata palette.
|
|
291
|
+
|
|
292
|
+
Mermaid and PlantUML source references are rewritten to SVG outputs. When a
|
|
293
|
+
matching `*.edited.svg` exists it wins; otherwise the build targets the generated
|
|
294
|
+
`*.svg` file and asks `diavisuals` to render it when the shared renderer is
|
|
295
|
+
available. Manual diagram figures also receive diagram surfaces tuned for light,
|
|
296
|
+
dark and coffee themes. This keeps generated diagrams and hand-edited diagrams
|
|
297
|
+
readable in the same Markdown:
|
|
298
|
+
|
|
299
|
+
```markdown
|
|
300
|
+

|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
SVG is the first-choice output so authors can edit the figure after generation.
|
|
304
|
+
If an agent is asked to change a diagram source while `*.edited.svg` exists, it
|
|
305
|
+
should ask whether to preserve that edited SVG or replace it with a new generated
|
|
306
|
+
SVG.
|
|
307
|
+
|
|
308
|
+
## Page Hero Images
|
|
309
|
+
|
|
310
|
+
Any page that uses `layout: page` or `layout: about` can define a hero image in front matter. The compact form keeps compatibility with older pages:
|
|
311
|
+
|
|
312
|
+
```yaml
|
|
313
|
+
---
|
|
314
|
+
layout: page
|
|
315
|
+
title: Example Page
|
|
316
|
+
hero_image: /assets/img/example-hero.jpg
|
|
317
|
+
hero_image_alt: Short accessible description
|
|
318
|
+
hero_caption: Optional caption
|
|
319
|
+
hero_source: Optional source name
|
|
320
|
+
hero_source_url: https://example.org/source
|
|
321
|
+
---
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
For new pages, use the grouped `hero` form:
|
|
325
|
+
|
|
326
|
+
```yaml
|
|
327
|
+
---
|
|
328
|
+
layout: page
|
|
329
|
+
title: Example Page
|
|
330
|
+
hero:
|
|
331
|
+
image: /assets/img/example-hero.jpg
|
|
332
|
+
alt: Short accessible description
|
|
333
|
+
caption: Optional caption
|
|
334
|
+
source: Optional source name
|
|
335
|
+
source_url: https://example.org/source
|
|
336
|
+
position: center
|
|
337
|
+
---
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
## Blog Pagination
|
|
341
|
+
|
|
342
|
+
Child sites can enable blog pagination without changing the core defaults. Set pagination in the site config and enable it on the blog page that includes `blog-list.liquid`.
|
|
343
|
+
|
|
344
|
+
```yaml
|
|
345
|
+
pagination:
|
|
346
|
+
enabled: true
|
|
347
|
+
collection: posts
|
|
348
|
+
per_page: 4
|
|
349
|
+
permalink: /page/:num/
|
|
350
|
+
title: ":title"
|
|
351
|
+
sort_field: date
|
|
352
|
+
sort_reverse: true
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
```yaml
|
|
356
|
+
---
|
|
357
|
+
title: Blog
|
|
358
|
+
pagination:
|
|
359
|
+
enabled: true
|
|
360
|
+
locale: en
|
|
361
|
+
---
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
`blog-list.liquid` uses `paginator.posts` when Jekyll generates paginated pages and falls back to the localized post archive otherwise. For multilingual sites, set the page-level `pagination.locale` and the same `locale` value in each post front matter.
|
|
365
|
+
|
|
366
|
+
## Project Card Images
|
|
367
|
+
|
|
368
|
+
Project entries can define a main image with `hero`. In project cards, that image is used as a very light degraded background for the card.
|
|
369
|
+
|
|
370
|
+
```yaml
|
|
371
|
+
---
|
|
372
|
+
title: Example Project
|
|
373
|
+
description: Short project summary.
|
|
374
|
+
hero: /assets/img/projects/example.jpg
|
|
375
|
+
---
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
## Project Resources
|
|
379
|
+
|
|
380
|
+
Project entries can also define `resources`. These links are rendered as icon badges on the project card and in a resources panel inside pages that use `layout: project`.
|
|
381
|
+
|
|
382
|
+
```yaml
|
|
383
|
+
---
|
|
384
|
+
layout: project
|
|
385
|
+
title: Example Project
|
|
386
|
+
resources:
|
|
387
|
+
- type: zenodo
|
|
388
|
+
label: Zenodo dataset
|
|
389
|
+
url: https://zenodo.org/records/1000001
|
|
390
|
+
doi: 10.5281/zenodo.1000001
|
|
391
|
+
- type: dataset
|
|
392
|
+
label: Harmonized data layers
|
|
393
|
+
url: https://example.org/datasets/example
|
|
394
|
+
- type: documentation
|
|
395
|
+
label: Technical notes
|
|
396
|
+
url: https://example.org/docs/example
|
|
397
|
+
---
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
Supported built-in icon types include `zenodo`, `doi`, `dataset`, `data`, `code`, `github`, `repository`, `documentation`, `docs`, `unaltremanual`, `map`, `publication`, `paper`, `report`, `website`, and `link`. A resource can override the icon with an explicit class, for example `icon: fa-solid fa-chart-line`.
|
|
401
|
+
|
|
402
|
+
## CV Preview Cards
|
|
403
|
+
|
|
404
|
+
Use `cv-download-card.liquid` on CV pages when the PDF is the source of truth and the page should show a first-page preview plus a download button.
|
|
405
|
+
|
|
406
|
+
```yaml
|
|
407
|
+
---
|
|
408
|
+
cv_pdf: /assets/pdf/cv.pdf
|
|
409
|
+
cv_preview: /assets/img/cv-preview.jpg
|
|
410
|
+
---
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
```liquid
|
|
414
|
+
{% raw %}{% include cv-download-card.liquid pdf=page.cv_pdf preview=page.cv_preview title="CV" %}{% endraw %}
|
|
415
|
+
```
|
|
416
|
+
|
|
417
|
+
Child sites can generate the preview with their template `Makefile` target:
|
|
418
|
+
|
|
419
|
+
```bash
|
|
420
|
+
make cv-preview CV_PDF=assets/pdf/cv.pdf CV_PREVIEW=assets/img/cv-preview.jpg
|
|
421
|
+
```
|
|
422
|
+
|
|
423
|
+
## Theme Modes
|
|
424
|
+
|
|
425
|
+
The built-in theme switch supports `system`, `light`, `cafe`, and `dark` settings. `system` follows the browser preference and resolves to light or dark; `cafe` is an explicit coffee reading mode for warm long-form pages.
|
|
426
|
+
|
|
427
|
+
Theme changes are observable from JavaScript through the `unaltraweb:themechange` event:
|
|
428
|
+
|
|
429
|
+
```js
|
|
430
|
+
document.addEventListener("unaltraweb:themechange", (event) => {
|
|
431
|
+
console.log(event.detail.theme, event.detail.themeSetting);
|
|
432
|
+
});
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
The active values are also available on `<html>` as `data-theme`, `data-theme-setting`, `data-theme-integration`, and `data-site-profile`. These attributes are stable enough for local styles and automated browser tests.
|
|
436
|
+
|
|
437
|
+
## Developer Mode
|
|
438
|
+
|
|
439
|
+
`unaltraweb-template` can enable `unaltraweb.developer_mode` in a development-only config file. When `JEKYLL_ENV` is not `production`, this displays a floating indicator showing the real profile used by the current build.
|
|
440
|
+
|
|
441
|
+
```yaml
|
|
442
|
+
unaltraweb:
|
|
443
|
+
developer_mode: true
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
Keep this setting out of production builds. The template `Makefile` writes it to `tmp/_config.development.yml` for `make serve` only when working directly in the `unaltraweb-template` checkout, while child sites keep it disabled unless `DEVELOPER_MODE=true` is passed explicitly. `make build` uses the normal production config.
|
|
447
|
+
|
|
448
|
+
Do not rely on client-side preview shells for alternate profiles. Jekyll renders one real configuration per build, so profiles should be tested by rebuilding with a config overlay, for example `make serve SITE_PROFILE=unaltreprojecte` in the template. Pages can declare `profiles: [unaltreselfie]` or `profiles: [unaltreprojecte]`; the core filters non-matching pages before writing the site.
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Understand Core And Template Roles
|
|
3
|
+
description: Why unaltraweb-template is the primary integration demo.
|
|
4
|
+
lang: en
|
|
5
|
+
ref: template_role
|
|
6
|
+
profiles:
|
|
7
|
+
- unaltredocs
|
|
8
|
+
documentation_profiles:
|
|
9
|
+
- local-authors
|
|
10
|
+
- contributors
|
|
11
|
+
- core-developers
|
|
12
|
+
section: Contribute
|
|
13
|
+
weight: 510
|
|
14
|
+
permalink: "/template/"
|
|
15
|
+
nav_title: Core And Template
|
|
16
|
+
---
|
|
17
|
+
<p class="lede"><code>unaltraweb-template</code> is the full-profile demo and integration fixture. It should stay thin, but it is the best place to prove that the gem works for real child sites. Clean sites come from the package-owned <code>new_web</code> scaffolds.</p>
|
|
18
|
+
|
|
19
|
+
## Why The Template Matters
|
|
20
|
+
|
|
21
|
+
- It consumes `unaltraweb` as an external dependency.
|
|
22
|
+
- It contains realistic demo content for `unaltreselfie`, `unaltreprojecte`, `unaltremanual` and `unaltredocs` profiles.
|
|
23
|
+
- It exercises richer local Docker and browser-test orchestration than the clean package scaffolds.
|
|
24
|
+
- It uses the selected `ghcr.io/dosquartsdedocs/unaltraweb:0.3.0` runtime image by default; mutable `main` is reserved for maintainer testing.
|
|
25
|
+
- It runs Playwright smoke tests and screenshots across profiles, themes and responsive layouts.
|
|
26
|
+
- It keeps rich demo content out of clean profile scaffolds.
|
|
27
|
+
|
|
28
|
+
The core `docs/` site is different: it is an `unaltredocs`-style documentation site for explaining `unaltraweb` itself. The template is the place where richer examples of all four profiles are shown together.
|
|
29
|
+
|
|
30
|
+
## What Should Stay In The Core
|
|
31
|
+
|
|
32
|
+
- Shared layouts and includes.
|
|
33
|
+
- Sass and static assets that every child site can reuse.
|
|
34
|
+
- Jekyll plugins and Liquid helpers.
|
|
35
|
+
- Bibliometric, CV and documentation tooling.
|
|
36
|
+
- Reusable GitHub Actions workflows.
|
|
37
|
+
- The `unaltraweb` reference site under `docs/`.
|
|
38
|
+
|
|
39
|
+
## What Should Stay In The Template
|
|
40
|
+
|
|
41
|
+
- Editable `_config.yml` defaults.
|
|
42
|
+
- Demo pages, posts, projects, chapters and bibliography records.
|
|
43
|
+
- Local `_sass/_site-custom.scss` examples.
|
|
44
|
+
- Local Makefile and Docker wrapper for child-site workflows.
|
|
45
|
+
- Render smoke tests and screenshots.
|
|
46
|
+
|
|
47
|
+
## Local Core Validation
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
cd ../unaltraweb-template
|
|
51
|
+
make build LOCAL_CORE=../unaltraweb
|
|
52
|
+
make test LOCAL_CORE=../unaltraweb SITE_PROFILE=unaltreprojecte
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
On constrained machines, prefer `make build` first and run only the profile-specific browser test needed for the change.
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Develop The Core
|
|
3
|
+
description: Safe development and verification workflow for unaltraweb.
|
|
4
|
+
lang: en
|
|
5
|
+
ref: development_workflow
|
|
6
|
+
profiles:
|
|
7
|
+
- unaltredocs
|
|
8
|
+
documentation_profiles:
|
|
9
|
+
- contributors
|
|
10
|
+
- core-developers
|
|
11
|
+
section: Core Development
|
|
12
|
+
weight: 610
|
|
13
|
+
permalink: "/development/"
|
|
14
|
+
nav_title: Core Development
|
|
15
|
+
---
|
|
16
|
+
<p class="lede">Validate core changes in layers. Use lightweight checks while editing, then run heavier Docker or Playwright checks only when the machine can handle them.</p>
|
|
17
|
+
|
|
18
|
+
## Lightweight Checks
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
git status --short --branch
|
|
22
|
+
git diff --check
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Use these for documentation-only changes or before deciding whether a heavier build is worth running.
|
|
26
|
+
|
|
27
|
+
## Docs Deploy
|
|
28
|
+
|
|
29
|
+
The core repository can publish the `unaltraweb` reference site from `docs/` with the manual `.github/workflows/deploy.yml` workflow and GitHub Pages Actions. This workflow does not need Node/npm and does not build the full inherited core demo site.
|
|
30
|
+
|
|
31
|
+
The reference site is a real child site of the local `unaltraweb` gem. It uses `theme: unaltraweb`, the shared layouts/includes/Sass, and `unaltraweb.site_profile: unaltredocs`.
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
make docs-serve DOCKER_IMAGE=unaltraweb:dev
|
|
35
|
+
make docs-build DOCKER_IMAGE=unaltraweb:dev
|
|
36
|
+
make docs-publish DOCKER_IMAGE=unaltraweb:dev
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
After the selected versioned Docker image is available, omit `DOCKER_IMAGE=unaltraweb:dev`.
|
|
40
|
+
|
|
41
|
+
Docs deploys, link checks, publication metrics and all publication workflows remain manual. CodeQL and the repository CI workflow run automatically; neither deploys or publishes anything.
|
|
42
|
+
|
|
43
|
+
## Automatic CI
|
|
44
|
+
|
|
45
|
+
`.github/workflows/ci.yml` runs on pull requests and pushes. Its bounded jobs cover Python 3.10/3.13 compile and unit checks, `git diff --check`, workflow policy, structural `distribution-check`, clean wheel and gem checks, and cached Docker builds followed by MCP smoke and docs builds. CodeQL analyzes JavaScript/TypeScript, Python and Ruby for pull requests, default-branch pushes and its weekly schedule.
|
|
46
|
+
|
|
47
|
+
Automatic CI deliberately uses the structural gate. It verifies that pending component releases are represented truthfully but does not require them to be published, so normal feature work can remain green before a coordinated release.
|
|
48
|
+
|
|
49
|
+
`make distribution-release-check` is stricter: it exits nonzero while any selected component is `pending` or `unavailable`. After the final source and release intent are reviewed, mark the selected components `ready` and commit that state. Core artifact workflows use credential-free preflights. For runtime, MCP, and manual PDF, a signing/package-write job builds each SHA-only candidate once without running it; a read-only job verifies its GitHub-signed, registry-stored provenance and revision, removes GHCR credentials, and tests only exact digests; and a final package-write job that executes no candidate assigns and verifies `sha-*`, `main`, and `latest`. The registry absence check is best-effort because GHCR tag writes are not compare-and-swap operations, so signed and tested digests remain the trust anchor. Record those image digests and package checksums in `release-candidates.json`; its commit must be an immediate child that changes no other path. The strict gate validates that receipt before the release tag is created on the receipt commit. Tag workflows require the SHA tag, signed attestation, and revision label to bind the recorded digest to the receipt's `source_commit`, promote only those manifests to semver aliases, and never rebuild or execute them. Components already published elsewhere may be `released`; released containers other than the self-describing MCP must be digest-pinned. Starting any manual workflow is still an explicit approval, and package preparation does not publish to RubyGems/PyPI or create a GitHub release.
|
|
50
|
+
|
|
51
|
+
## Core Build
|
|
52
|
+
|
|
53
|
+
The local port convention for working with both repositories is:
|
|
54
|
+
|
|
55
|
+
- `unaltraweb` core/docs: `http://localhost:4000/unaltraweb/`.
|
|
56
|
+
- `unaltreselfie`: `http://localhost:4001/unaltraweb-template/en/`.
|
|
57
|
+
- `unaltreprojecte`: `http://localhost:4002/unaltraweb-template/en/`.
|
|
58
|
+
- `unaltremanual`: `http://localhost:4003/unaltraweb-template/en/`.
|
|
59
|
+
- `unaltredocs`: `http://localhost:4004/unaltraweb-template/en/`.
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
docker compose -f docker-compose.yml run --rm --entrypoint "bash -lc '(bundle check || bundle install) && bundle exec jekyll build --trace'" jekyll
|
|
63
|
+
docker compose -f docker-compose.yml down --remove-orphans
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
This can be resource-heavy because the inherited demo build minifies JavaScript and can generate many responsive WebP images.
|
|
67
|
+
|
|
68
|
+
The same Dockerfile is published manually. Consumers select `ghcr.io/dosquartsdedocs/unaltraweb:0.3.0`; the mutable `ghcr.io/dosquartsdedocs/unaltraweb:main` channel and local `unaltraweb:dev` name are explicit maintainer paths. The `unaltraweb` gem remains the source of theme files and plugins.
|
|
69
|
+
|
|
70
|
+
The root core build excludes `docs/`. The reference site is published from the `docs/` folder through a dedicated workflow so its root-relative permalinks do not collide with the inherited core demo build.
|
|
71
|
+
|
|
72
|
+
## Template Consumer Checks
|
|
73
|
+
|
|
74
|
+
```bash
|
|
75
|
+
cd ../unaltraweb-template
|
|
76
|
+
make build LOCAL_CORE=../unaltraweb
|
|
77
|
+
make test LOCAL_CORE=../unaltraweb SITE_PROFILE=unaltreselfie PORT=4018
|
|
78
|
+
make test LOCAL_CORE=../unaltraweb SITE_PROFILE=unaltreprojecte PORT=4019
|
|
79
|
+
make test LOCAL_CORE=../unaltraweb SITE_PROFILE=unaltremanual PORT=4020
|
|
80
|
+
make down
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Run the smallest relevant profile when resources are limited.
|
|
84
|
+
|
|
85
|
+
## Static Builds
|
|
86
|
+
|
|
87
|
+
Normal Jekyll builds must not fetch external services. Metrics updates are explicit pre-build tasks that write local data files.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
make metrics-scimago-fetch
|
|
91
|
+
make metrics-update
|
|
92
|
+
make metrics-check
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Local metrics commands accept the same safety checks used in CI:
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
make metrics-update METRICS_ARGS="--strict-external --require-scimago"
|
|
99
|
+
make metrics-scimago-fetch SCIMAGO_INPUT=path/to/scimagojr.csv
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Publication metrics can also run through the manual/reusable `.github/workflows/metrics-update.yml` workflow. By default it uploads diagnostics and does not open a pull request. Set `create_pull_request: true` when you want GitHub to propose generated metrics changes. Generated Scimago caches and diagnostics stay out of PRs; `_bibliography/**/*.bib` and `_data/metrics.yml` are the versionable outputs.
|
|
103
|
+
|
|
104
|
+
## Formatting Lockfile
|
|
105
|
+
|
|
106
|
+
`package.json` declares Prettier and the Liquid plugin. Regenerate `package-lock.json` with `npm install` on a machine with Node/npm available. Do not hand-edit dependency integrity data.
|
|
107
|
+
|
|
108
|
+
`npm` is development tooling rather than Jekyll runtime. If containerized npm commands become necessary, use a small dedicated Node tooling image or a GitHub Action instead of adding npm to every Jekyll build path.
|