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,11 @@
|
|
|
1
|
+
{% if page.manual_numbered == false %}
|
|
2
|
+
{% capture manual_toc_text %}{% include t.liquid key='manual.on_this_page' default='On this page' %}{% endcapture %}
|
|
3
|
+
{% else %}
|
|
4
|
+
{% capture manual_toc_text %}{% include t.liquid key='manual.on_this_chapter' default='On this chapter' %}{% endcapture %}
|
|
5
|
+
{% endif %}
|
|
6
|
+
<aside id="manual-page-toc" class="manual-right-rail" data-manual-page-toc-container hidden aria-label="{{ manual_toc_text | strip }}">
|
|
7
|
+
<div class="manual-right-rail-inner">
|
|
8
|
+
<p class="manual-sidebar-heading">{{ manual_toc_text | strip }}</p>
|
|
9
|
+
<nav class="manual-page-toc" data-manual-page-toc aria-label="{{ manual_toc_text | strip }}"></nav>
|
|
10
|
+
</div>
|
|
11
|
+
</aside>
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{% assign current_lang = page.lang | default: site.default_lang | default: site.lang %}
|
|
2
|
+
{% assign current_profile = site.unaltraweb.site_profile | default: 'unaltreprojecte' | slugify %}
|
|
3
|
+
{% assign default_manual_home_url = '/' | append: current_lang | append: '/' %}
|
|
4
|
+
{% assign home_candidates = site.pages | where: 'ref', 'home' | where: 'lang', current_lang %}
|
|
5
|
+
{% assign manual_home = home_candidates | where_exp: 'candidate', 'candidate.profiles contains current_profile' | first %}
|
|
6
|
+
{% if manual_home == nil %}
|
|
7
|
+
{% assign manual_home = home_candidates | where_exp: 'candidate', 'candidate.profiles == nil' | first %}
|
|
8
|
+
{% endif %}
|
|
9
|
+
{% assign chapters = include.chapters %}
|
|
10
|
+
{% assign reference_pages = include.reference_pages %}
|
|
11
|
+
{% capture manual_contents_text %}{% include t.liquid key='manual.contents' default='Contents' %}{% endcapture %}
|
|
12
|
+
{% capture manual_cover_text %}{% include t.liquid key='manual.cover' default='Cover' %}{% endcapture %}
|
|
13
|
+
{% capture manual_toggle_text %}{% include t.liquid key='manual.toggle_sidebar' default='Toggle contents' %}{% endcapture %}
|
|
14
|
+
|
|
15
|
+
<aside id="manual-sidebar" class="manual-sidebar" aria-label="{{ manual_contents_text | strip }}">
|
|
16
|
+
<button class="manual-sidebar-toggle" type="button" data-manual-sidebar-toggle aria-expanded="true" aria-controls="manual-sidebar manual-page-toc" title="{{ manual_toggle_text | strip }}">
|
|
17
|
+
<i class="ti ti-chevrons-left" aria-hidden="true"></i>
|
|
18
|
+
<span class="sr-only">{{ manual_toggle_text | strip }}</span>
|
|
19
|
+
</button>
|
|
20
|
+
|
|
21
|
+
<div class="manual-sidebar-inner">
|
|
22
|
+
<nav class="manual-nav" aria-label="{{ manual_contents_text | strip }}">
|
|
23
|
+
<p class="manual-sidebar-heading manual-sidebar-heading--contents">{{ manual_contents_text | strip }}</p>
|
|
24
|
+
<ol class="manual-chapter-tree manual-cover-tree">
|
|
25
|
+
<li class="manual-sidebar-item manual-home-link{% if page.ref == 'home' %} active{% endif %}">
|
|
26
|
+
<a href="{{ manual_home.url | default: default_manual_home_url | relative_url }}">
|
|
27
|
+
<span class="manual-chapter-number">0</span>
|
|
28
|
+
<span class="manual-chapter-title">{{ manual_cover_text | strip }}</span>
|
|
29
|
+
</a>
|
|
30
|
+
</li>
|
|
31
|
+
</ol>
|
|
32
|
+
<ol class="manual-chapter-tree">
|
|
33
|
+
{% for chapter in chapters %}
|
|
34
|
+
<li class="manual-sidebar-item{% if page.url == chapter.url %} active{% endif %}" data-manual-title="{{ chapter.title | downcase | escape }}">
|
|
35
|
+
<a href="{{ chapter.url | relative_url }}">
|
|
36
|
+
<span class="manual-chapter-number">{{ forloop.index }}</span>
|
|
37
|
+
<span class="manual-chapter-title">{{ chapter.title }}</span>
|
|
38
|
+
</a>
|
|
39
|
+
</li>
|
|
40
|
+
{% endfor %}
|
|
41
|
+
{% for reference_page in reference_pages %}
|
|
42
|
+
{% assign reference_is_active = false %}
|
|
43
|
+
{% if page.url == reference_page.url %}
|
|
44
|
+
{% assign reference_is_active = true %}
|
|
45
|
+
{% elsif current_profile == 'unaltremanual' and page.layout == 'book-review' and reference_page.ref == 'manual-bibliography' %}
|
|
46
|
+
{% assign reference_is_active = true %}
|
|
47
|
+
{% endif %}
|
|
48
|
+
<li class="manual-sidebar-item manual-reference-link{% if reference_is_active %} active{% endif %}" data-manual-title="{{ reference_page.title | downcase | escape }}">
|
|
49
|
+
<a href="{{ reference_page.url | relative_url }}">
|
|
50
|
+
<span class="manual-chapter-number manual-chapter-number--blank" aria-hidden="true"></span>
|
|
51
|
+
<span class="manual-chapter-title">{{ reference_page.title }}</span>
|
|
52
|
+
</a>
|
|
53
|
+
</li>
|
|
54
|
+
{% endfor %}
|
|
55
|
+
</ol>
|
|
56
|
+
</nav>
|
|
57
|
+
</div>
|
|
58
|
+
</aside>
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{% assign teacher_items = include.teachers | default: page.teachers | default: page.professors | default: site.data.teachers %}
|
|
2
|
+
{% capture manual_teachers_text %}{% include t.liquid key='manual.teachers' default='Teaching team' %}{% endcapture %}
|
|
3
|
+
{% if teacher_items and teacher_items.size > 0 %}
|
|
4
|
+
<section class="manual-teachers" aria-labelledby="manual-teachers-title">
|
|
5
|
+
<h2 id="manual-teachers-title">{{ manual_teachers_text | strip }}</h2>
|
|
6
|
+
<ul class="manual-teacher-list">
|
|
7
|
+
{% for teacher in teacher_items %}
|
|
8
|
+
{% assign teacher_name = teacher.name | default: teacher %}
|
|
9
|
+
{% assign full_name = teacher_name %}
|
|
10
|
+
{% if teacher.lastname %}
|
|
11
|
+
{% assign full_name = teacher.name | append: ' ' | append: teacher.lastname %}
|
|
12
|
+
{% endif %}
|
|
13
|
+
{% assign teacher_photo = teacher.photo | default: teacher.pic | default: 'user-placeholder.png' %}
|
|
14
|
+
{% if teacher_photo contains '/' or teacher_photo contains '://' %}
|
|
15
|
+
{% assign teacher_photo_path = teacher_photo %}
|
|
16
|
+
{% else %}
|
|
17
|
+
{% assign teacher_photo_path = 'assets/img/team/' | append: teacher_photo %}
|
|
18
|
+
{% endif %}
|
|
19
|
+
{% assign teacher_role = teacher.position | default: teacher.role %}
|
|
20
|
+
{% assign teacher_affiliation = teacher.organization | default: teacher.affiliation %}
|
|
21
|
+
{% assign has_email = teacher.email %}
|
|
22
|
+
{% assign has_orcid = teacher.orcid %}
|
|
23
|
+
{% assign has_google_scholar = teacher.google_scholar | default: teacher.scholar_userid %}
|
|
24
|
+
{% assign has_social = teacher.social and teacher.social.size > 0 %}
|
|
25
|
+
{% assign has_url = teacher.url %}
|
|
26
|
+
<li class="manual-teacher">
|
|
27
|
+
<img class="manual-teacher-photo" src="{{ teacher_photo_path | relative_url }}" alt="{{ full_name | escape }}" loading="lazy">
|
|
28
|
+
<div class="manual-teacher-body">
|
|
29
|
+
<h3>{{ full_name }}</h3>
|
|
30
|
+
{% if teacher_role %}<p class="manual-teacher-role">{{ teacher_role }}</p>{% endif %}
|
|
31
|
+
{% if teacher_affiliation %}<p class="manual-teacher-affiliation">{{ teacher_affiliation }}</p>{% endif %}
|
|
32
|
+
{% if has_email or has_orcid or has_google_scholar or has_social or has_url %}
|
|
33
|
+
<ul class="manual-teacher-links" aria-label="{{ full_name | escape }} links">
|
|
34
|
+
{% if has_email %}
|
|
35
|
+
{% if teacher.email.first.url %}
|
|
36
|
+
{% for item in teacher.email %}
|
|
37
|
+
<li><a href="mailto:{{ item.url }}" title="{{ item.title | default: 'E-mail' }}" aria-label="{{ item.title | default: 'E-mail' }}"><i class="{{ item.class | default: 'fa-solid fa-envelope' }}" aria-hidden="true"></i></a></li>
|
|
38
|
+
{% endfor %}
|
|
39
|
+
{% else %}
|
|
40
|
+
<li><a href="mailto:{{ teacher.email }}" title="E-mail" aria-label="E-mail"><i class="fa-solid fa-envelope" aria-hidden="true"></i></a></li>
|
|
41
|
+
{% endif %}
|
|
42
|
+
{% endif %}
|
|
43
|
+
{% if has_url %}
|
|
44
|
+
<li><a href="{{ teacher.url }}" target="_blank" rel="noopener" title="{{ teacher.url_label | default: 'Web' }}" aria-label="{{ teacher.url_label | default: 'Web' }}"><i class="fa-solid fa-globe" aria-hidden="true"></i></a></li>
|
|
45
|
+
{% endif %}
|
|
46
|
+
{% if has_orcid %}
|
|
47
|
+
{% if has_orcid contains '://' %}
|
|
48
|
+
{% assign orcid_url = has_orcid %}
|
|
49
|
+
{% else %}
|
|
50
|
+
{% assign orcid_url = 'https://orcid.org/' | append: has_orcid %}
|
|
51
|
+
{% endif %}
|
|
52
|
+
<li><a href="{{ orcid_url }}" target="_blank" rel="noopener" title="ORCID" aria-label="ORCID"><i class="ai ai-orcid" aria-hidden="true"></i></a></li>
|
|
53
|
+
{% endif %}
|
|
54
|
+
{% if has_google_scholar %}
|
|
55
|
+
{% if has_google_scholar contains '://' %}
|
|
56
|
+
{% assign google_scholar_url = has_google_scholar %}
|
|
57
|
+
{% else %}
|
|
58
|
+
{% assign google_scholar_url = 'https://scholar.google.com/citations?user=' | append: has_google_scholar %}
|
|
59
|
+
{% endif %}
|
|
60
|
+
<li><a href="{{ google_scholar_url }}" target="_blank" rel="noopener" title="Google Scholar" aria-label="Google Scholar"><i class="ai ai-google-scholar" aria-hidden="true"></i></a></li>
|
|
61
|
+
{% endif %}
|
|
62
|
+
{% if has_social %}
|
|
63
|
+
{% for item in teacher.social %}
|
|
64
|
+
<li><a href="{{ item.url }}" target="_blank" rel="noopener" title="{{ item.title }}" aria-label="{{ item.title }}"><i class="{{ item.class }}" aria-hidden="true"></i></a></li>
|
|
65
|
+
{% endfor %}
|
|
66
|
+
{% endif %}
|
|
67
|
+
</ul>
|
|
68
|
+
{% endif %}
|
|
69
|
+
</div>
|
|
70
|
+
</li>
|
|
71
|
+
{% endfor %}
|
|
72
|
+
</ul>
|
|
73
|
+
</section>
|
|
74
|
+
{% endif %}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
{% if site.enable_google_verification or site.enable_bing_verification %}
|
|
2
|
+
<!-- Website verification -->
|
|
3
|
+
{% if site.enable_google_verification %}
|
|
4
|
+
<meta name="google-site-verification" content="{{ site.google_site_verification | escape }}">
|
|
5
|
+
{% endif %}
|
|
6
|
+
{% if site.enable_bing_verification %}
|
|
7
|
+
<meta name="msvalidate.01" content="{{ site.bing_site_verification | escape }}">
|
|
8
|
+
{% endif %}
|
|
9
|
+
<!--
|
|
10
|
+
Avoid warning on Google Chrome Error with Permissions-Policy header:
|
|
11
|
+
Origin trial controlled feature not enabled: 'interest-cohort'.
|
|
12
|
+
see https://stackoverflow.com/a/75119417
|
|
13
|
+
-->
|
|
14
|
+
<meta http-equiv="Permissions-Policy" content="interest-cohort=()">
|
|
15
|
+
{% endif %}
|
|
16
|
+
|
|
17
|
+
{% capture author_name %}{{ site.first_name }}{% if site.middle_name %} {{ site.middle_name }}{% endif %} {{ site.last_name }}{% endcapture %}
|
|
18
|
+
|
|
19
|
+
<!-- Standard metadata -->
|
|
20
|
+
<meta charset="utf-8">
|
|
21
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
|
22
|
+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
23
|
+
<title>
|
|
24
|
+
{% if site.title == 'blank' %}
|
|
25
|
+
{% capture title %}{{ author_name }}{% endcapture %}
|
|
26
|
+
{% else %}
|
|
27
|
+
{% capture title %}{{ site.title }}{% endcapture %}
|
|
28
|
+
{% endif %}
|
|
29
|
+
{% if page.url == '/blog/index.html' %}
|
|
30
|
+
{{ page.title | escape }} | {{ title | escape }}
|
|
31
|
+
{% elsif page.title != 'blank' and page.url != '/' %}
|
|
32
|
+
{% if page.title == null or page.title == '' %}
|
|
33
|
+
{{ page.date | date: '%Y' }} | {{ title | escape }}
|
|
34
|
+
{% else %}
|
|
35
|
+
{{ page.title | escape }} | {{ title | escape }}
|
|
36
|
+
{% endif %}
|
|
37
|
+
{% else %}
|
|
38
|
+
{{ title | escape }}
|
|
39
|
+
{% endif %}
|
|
40
|
+
</title>
|
|
41
|
+
<meta name="author" content="{{ author_name | escape }}">
|
|
42
|
+
<meta name="description" content="{% if page.description %}{{ page.description | escape }}{% else %}{{ site.description | escape }}{% endif %}">
|
|
43
|
+
{% if page.keywords or site.keywords %}
|
|
44
|
+
<meta name="keywords" content="{% if page.keywords %}{{ page.keywords | escape }}{% else %}{{ site.keywords | escape }}{% endif %}">
|
|
45
|
+
{% endif %}
|
|
46
|
+
|
|
47
|
+
{% assign current_lang = page.lang | default: site.default_lang | default: site.lang %}
|
|
48
|
+
|
|
49
|
+
{% if page.ref and site.languages %}
|
|
50
|
+
{% for lang_code in site.languages %}
|
|
51
|
+
{% assign localized_page = site.pages | where: 'ref', page.ref | where: 'lang', lang_code | first %}
|
|
52
|
+
{% if localized_page == nil %}
|
|
53
|
+
{% assign localized_page = site.documents | where: 'ref', page.ref | where: 'lang', lang_code | first %}
|
|
54
|
+
{% endif %}
|
|
55
|
+
{% if localized_page %}
|
|
56
|
+
<link rel="alternate" hreflang="{{ lang_code | escape }}" href="{{ localized_page.url | replace: 'index.html', '' | absolute_url | escape }}">
|
|
57
|
+
{% endif %}
|
|
58
|
+
{% endfor %}
|
|
59
|
+
{% assign default_page = site.pages | where: 'ref', page.ref | where: 'lang', site.default_lang | first %}
|
|
60
|
+
{% if default_page == nil %}
|
|
61
|
+
{% assign default_page = site.documents | where: 'ref', page.ref | where: 'lang', site.default_lang | first %}
|
|
62
|
+
{% endif %}
|
|
63
|
+
{% if default_page %}
|
|
64
|
+
<link rel="alternate" hreflang="x-default" href="{{ default_page.url | replace: 'index.html', '' | absolute_url | escape }}">
|
|
65
|
+
{% endif %}
|
|
66
|
+
{% endif %}
|
|
67
|
+
|
|
68
|
+
{% assign is_blog_post = false %}
|
|
69
|
+
{% if page.layout == 'post' and page.url contains '/blog/' %}
|
|
70
|
+
{% assign is_blog_post = true %}
|
|
71
|
+
{% endif %}
|
|
72
|
+
|
|
73
|
+
{% if site.serve_og_meta %}
|
|
74
|
+
{% capture og_title %}{% if page.title %}{{ title }} | {{ page.title }}{% else %}{{ title }}{% endif %}{% endcapture %}
|
|
75
|
+
{% assign social_title = page.title | default: title %}
|
|
76
|
+
{% assign social_description = page.description | default: site.description %}
|
|
77
|
+
{% assign social_image = page.og_image | default: site.og_image %}
|
|
78
|
+
<!-- OpenGraph -->
|
|
79
|
+
<meta property="og:site_name" content="{{ title | escape }}">
|
|
80
|
+
<meta property="og:type" content="{% if is_blog_post %}article{% else %}website{% endif %}">
|
|
81
|
+
<meta property="og:title" content="{{ og_title | strip | escape }}">
|
|
82
|
+
<meta property="og:url" content="{{ page.url | prepend: site.baseurl | prepend: site.url | remove_first: 'index.html' | escape }}">
|
|
83
|
+
<meta property="og:description" content="{{ social_description | escape }}">
|
|
84
|
+
{% if page.og_image or site.og_image %}
|
|
85
|
+
<meta property="og:image" content="{{ social_image | escape }}">
|
|
86
|
+
{% endif %}
|
|
87
|
+
<meta property="og:locale" content="{{ current_lang | escape }}">
|
|
88
|
+
|
|
89
|
+
<!-- Twitter card -->
|
|
90
|
+
<meta name="twitter:card" content="summary">
|
|
91
|
+
<meta name="twitter:title" content="{{ social_title | escape }}">
|
|
92
|
+
<meta name="twitter:description" content="{{ social_description | escape }}">
|
|
93
|
+
{% if page.og_image or site.og_image %}
|
|
94
|
+
<meta name="twitter:image" content="{{ social_image | escape }}">
|
|
95
|
+
{% endif %}
|
|
96
|
+
{% if site.x_username %}
|
|
97
|
+
<meta name="twitter:site" content="@{{ site.x_username | escape }}">
|
|
98
|
+
<meta name="twitter:creator" content="@{{ site.x_username | escape }}">
|
|
99
|
+
{% endif %}
|
|
100
|
+
{% endif %}
|
|
101
|
+
|
|
102
|
+
{% if site.serve_schema_org %}
|
|
103
|
+
{% assign schema_url = page.url | prepend: site.baseurl | prepend: site.url %}
|
|
104
|
+
{% assign schema_description = page.description | default: site.description %}
|
|
105
|
+
{% assign schema_headline = page.title | default: site.title %}
|
|
106
|
+
{% if is_blog_post %}
|
|
107
|
+
{% assign schema_type = 'BlogPosting' %}
|
|
108
|
+
{% else %}
|
|
109
|
+
{% assign schema_type = 'WebSite' %}
|
|
110
|
+
{% endif %}
|
|
111
|
+
<!-- Schema.org -->
|
|
112
|
+
{% comment %} Social links generator for "sameAs schema" {% endcomment %}
|
|
113
|
+
{% assign sameaslinks = '' | split: ',' %}
|
|
114
|
+
{% for social in site.data.socials %}
|
|
115
|
+
{% case social[0] %}
|
|
116
|
+
{% when 'acm_id' %}
|
|
117
|
+
{% capture link %}https://dl.acm.org/profile/{{ social[1] }}/{% endcapture %}
|
|
118
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
119
|
+
{% when 'arxiv_id' %}
|
|
120
|
+
{% capture link %}https://arxiv.org/a/{{ social[1] }}.html{% endcapture %}
|
|
121
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
122
|
+
{% when 'blogger_url' %}
|
|
123
|
+
{% capture link %}{{ social[1] }}{% endcapture %}
|
|
124
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
125
|
+
{% when 'bluesky_url' %}
|
|
126
|
+
{% capture link %}{{ social[1] }}{% endcapture %}
|
|
127
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
128
|
+
{% when 'dblp_url' %}
|
|
129
|
+
{% capture link %}{{ social[1] }}{% endcapture %}
|
|
130
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
131
|
+
{% when 'discord_id' %}
|
|
132
|
+
{% capture link %}https://discord.com/users/{{ social[1] }}{% endcapture %}
|
|
133
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
134
|
+
{% when 'email' %}
|
|
135
|
+
{% comment %}
|
|
136
|
+
{% capture link %}mailto:{{ social[1] | encode_email }}{% endcapture %}
|
|
137
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
138
|
+
{% endcomment %}
|
|
139
|
+
{% when 'facebook_id' %}
|
|
140
|
+
{% capture link %}https://facebook.com/{{ social[1] }}{% endcapture %}
|
|
141
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
142
|
+
{% when 'flickr_id' %}
|
|
143
|
+
{% capture link %}https://www.flickr.com/{{ social[1] }}{% endcapture %}
|
|
144
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
145
|
+
{% when 'github_username' %}
|
|
146
|
+
{% capture link %}https://github.com/{{ social[1] }}{% endcapture %}
|
|
147
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
148
|
+
{% when 'gitlab_username' %}
|
|
149
|
+
{% capture link %}https://gitlab.com/{{ social[1] }}{% endcapture %}
|
|
150
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
151
|
+
{% when 'hal_id' %}
|
|
152
|
+
{% capture link %}https://cv.hal.science/{{ social[1] }}/{% endcapture %}
|
|
153
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
154
|
+
{% when 'ieee_id' %}
|
|
155
|
+
{% capture link %}https://ieeexplore.ieee.org/author/{{ social[1] }}/{% endcapture %}
|
|
156
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
157
|
+
{% when 'inspirehep_id' %}
|
|
158
|
+
{% capture link %}https://inspirehep.net/authors/{{ social[1] }}{% endcapture %}
|
|
159
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
160
|
+
{% when 'instagram_id' %}
|
|
161
|
+
{% capture link %}https://instagram.com/{{ social[1] }}{% endcapture %}
|
|
162
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
163
|
+
{% when 'kaggle_id' %}
|
|
164
|
+
{% capture link %}https://www.kaggle.com/{{ social[1] }}{% endcapture %}
|
|
165
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
166
|
+
{% when 'keybase_username' %}
|
|
167
|
+
{% capture link %}https://keybase.io/{{ social[1] }}{% endcapture %}
|
|
168
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
169
|
+
{% when 'lastfm_id' %}
|
|
170
|
+
{% capture link %}https://www.last.fm/user/{{ social[1] }}{% endcapture %}
|
|
171
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
172
|
+
{% when 'lattes_id' %}
|
|
173
|
+
{% capture link %}http://lattes.cnpq.br/{{ social[1] }}{% endcapture %}
|
|
174
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
175
|
+
{% when 'leetcode_id' %}
|
|
176
|
+
{% capture link %}https://leetcode.com/u/{{ social[1] }}/{% endcapture %}
|
|
177
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
178
|
+
{% when 'linkedin_username' %}
|
|
179
|
+
{% capture link %}https://www.linkedin.com/in/{{ social[1] }}{% endcapture %}
|
|
180
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
181
|
+
{% when 'mastodon_username' %}
|
|
182
|
+
{% capture link %}https://{{ social[1] }}{% endcapture %}
|
|
183
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
184
|
+
{% when 'medium_username' %}
|
|
185
|
+
{% capture link %}https://medium.com/@{{ social[1] }}{% endcapture %}
|
|
186
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
187
|
+
{% when 'orcid_id' %}
|
|
188
|
+
{% capture link %}https://orcid.org/{{ social[1] }}{% endcapture %}
|
|
189
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
190
|
+
{% when 'osf_id' %}
|
|
191
|
+
{% capture link %}https://osf.io/{{ social[1] }}/{% endcapture %}
|
|
192
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
193
|
+
{% when 'pinterest_id' %}
|
|
194
|
+
{% capture link %}https://www.pinterest.com/{{ social[1] }}{% endcapture %}
|
|
195
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
196
|
+
{% when 'publons_id' %}
|
|
197
|
+
{% capture link %}https://publons.com/a/{{ social[1] }}/{% endcapture %}
|
|
198
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
199
|
+
{% when 'quora_username' %}
|
|
200
|
+
{% capture link %}https://www.quora.com/profile/{{ social[1] }}{% endcapture %}
|
|
201
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
202
|
+
{% when 'research_gate_profile' %}
|
|
203
|
+
{% capture link %}https://www.researchgate.net/profile/{{ social[1] }}/{% endcapture %}
|
|
204
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
205
|
+
{% when 'rss_icon' %}
|
|
206
|
+
{% comment %}
|
|
207
|
+
{% capture link %}{{ site.baseurl }}/feed.xml{% endcapture %}
|
|
208
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
209
|
+
{% endcomment %}
|
|
210
|
+
{% when 'scholar_userid' %}
|
|
211
|
+
{% capture link %}https://scholar.google.com/citations?user={{ social[1] }}{% endcapture %}
|
|
212
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
213
|
+
{% when 'scopus_id' %}
|
|
214
|
+
{% capture link %}https://www.scopus.com/authid/detail.uri?authorId={{ social[1] }}{% endcapture %}
|
|
215
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
216
|
+
{% when 'semanticscholar_id' %}
|
|
217
|
+
{% capture link %}https://www.semanticscholar.org/author/{{ social[1] }}{% endcapture %}
|
|
218
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
219
|
+
{% when 'spotify_id' %}
|
|
220
|
+
{% capture link %}https://open.spotify.com/user/{{ social[1] }}{% endcapture %}
|
|
221
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
222
|
+
{% when 'stackoverflow_id' %}
|
|
223
|
+
{% capture link %}https://stackoverflow.com/users/{{ social[1] }}{% endcapture %}
|
|
224
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
225
|
+
{% when 'strava_userid' %}
|
|
226
|
+
{% capture link %}https://www.strava.com/athletes/{{ social[1] }}{% endcapture %}
|
|
227
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
228
|
+
{% when 'telegram_username' %}
|
|
229
|
+
{% capture link %}https://telegram.me/{{ social[1] }}{% endcapture %}
|
|
230
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
231
|
+
{% when 'unsplash_id' %}
|
|
232
|
+
{% capture link %}https://unsplash.com/@{{ social[1] }}{% endcapture %}
|
|
233
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
234
|
+
{% when 'whatsapp_number' %}
|
|
235
|
+
{% capture link %}https://wa.me/{{ social[1] }}{% endcapture %}
|
|
236
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
237
|
+
{% when 'wikidata_id' %}
|
|
238
|
+
{% capture link %}https://www.wikidata.org/wiki/{{ social[1] }}{% endcapture %}
|
|
239
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
240
|
+
{% when 'wikipedia_id' %}
|
|
241
|
+
{% capture link %}https://wikipedia.org/wiki/User:{{ social[1] }}{% endcapture %}
|
|
242
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
243
|
+
{% when 'work_url' %}
|
|
244
|
+
{% capture link %}{{ social[1] }}{% endcapture %}
|
|
245
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
246
|
+
{% when 'x_username' %}
|
|
247
|
+
{% capture link %}https://twitter.com/{{ social[1] }}{% endcapture %}
|
|
248
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
249
|
+
{% when 'youtube_id' %}
|
|
250
|
+
{% capture link %}https://youtube.com/@{{ social[1] }}{% endcapture %}
|
|
251
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
252
|
+
{% when 'zotero_username' %}
|
|
253
|
+
{% capture link %}https://www.zotero.org/{{ social[1] }}{% endcapture %}
|
|
254
|
+
{% assign sameaslinks = sameaslinks | push: link %}
|
|
255
|
+
{% else %}
|
|
256
|
+
{% assign sameaslinks = sameaslinks | push: social[1].url %}
|
|
257
|
+
{% endcase %}
|
|
258
|
+
{% endfor %}
|
|
259
|
+
|
|
260
|
+
<script type="application/ld+json">
|
|
261
|
+
{
|
|
262
|
+
"author":
|
|
263
|
+
{
|
|
264
|
+
"@type": "Person",
|
|
265
|
+
"name": {{ author_name | jsonify | replace: '<', '\\u003c' | replace: '>', '\\u003e' | replace: '&', '\\u0026' }}
|
|
266
|
+
},
|
|
267
|
+
"url": {{ schema_url | jsonify | replace: '<', '\\u003c' | replace: '>', '\\u003e' | replace: '&', '\\u0026' }},
|
|
268
|
+
"@type": {{ schema_type | jsonify | replace: '<', '\\u003c' | replace: '>', '\\u003e' | replace: '&', '\\u0026' }},
|
|
269
|
+
"description": {{ schema_description | jsonify | replace: '<', '\\u003c' | replace: '>', '\\u003e' | replace: '&', '\\u0026' }},
|
|
270
|
+
"headline": {{ schema_headline | jsonify | replace: '<', '\\u003c' | replace: '>', '\\u003e' | replace: '&', '\\u0026' }},
|
|
271
|
+
{% if sameaslinks != blank %}
|
|
272
|
+
"sameAs": {{ sameaslinks | jsonify | replace: '<', '\\u003c' | replace: '>', '\\u003e' | replace: '&', '\\u0026' }},
|
|
273
|
+
{% endif %}
|
|
274
|
+
"name": {{ author_name | jsonify | replace: '<', '\\u003c' | replace: '>', '\\u003e' | replace: '&', '\\u0026' }},
|
|
275
|
+
"@context": "https://schema.org"
|
|
276
|
+
}
|
|
277
|
+
</script>
|
|
278
|
+
{% endif %}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{% assign current_lang = page.lang | default: site.default_lang | default: site.lang %}
|
|
2
|
+
{% assign default_lang = site.default_lang | default: site.lang %}
|
|
3
|
+
|
|
4
|
+
{% assign localized_news = site.news | where: 'lang', current_lang %}
|
|
5
|
+
{% if localized_news.size == 0 and current_lang != default_lang %}
|
|
6
|
+
{% assign localized_news = site.news | where: 'lang', default_lang %}
|
|
7
|
+
{% endif %}
|
|
8
|
+
{% if current_lang == default_lang %}
|
|
9
|
+
{% assign fallback_news = site.news | where_exp: 'item', 'item.lang == nil' %}
|
|
10
|
+
{% assign localized_news = localized_news | concat: fallback_news %}
|
|
11
|
+
{% endif %}
|
|
12
|
+
|
|
13
|
+
{% assign news = localized_news | sort: 'date' | reverse %}
|
|
14
|
+
{% assign news_size = news | size %}
|
|
15
|
+
|
|
16
|
+
<div class="news">
|
|
17
|
+
{% if news_size > 0 %}
|
|
18
|
+
<div
|
|
19
|
+
class="table-responsive"
|
|
20
|
+
{% if include.limit and page.announcements.scrollable and news_size > 3 %}
|
|
21
|
+
style="max-height: 60vw"
|
|
22
|
+
{% endif %}
|
|
23
|
+
>
|
|
24
|
+
<table class="table table-sm table-borderless">
|
|
25
|
+
{% if include.limit and page.announcements.limit %}
|
|
26
|
+
{% assign news_limit = page.announcements.limit %}
|
|
27
|
+
{% else %}
|
|
28
|
+
{% assign news_limit = news_size %}
|
|
29
|
+
{% endif %}
|
|
30
|
+
|
|
31
|
+
{% for item in news limit: news_limit %}
|
|
32
|
+
<tr>
|
|
33
|
+
<th scope="row" style="width: 20%">{% include localized-date.liquid date=item.date format_key='date.formats.short' default_format='%Y-%m-%d' %}</th>
|
|
34
|
+
<td>
|
|
35
|
+
{% if item.inline %}
|
|
36
|
+
{{ item.content | remove: '<p>' | remove: '</p>' | emojify }}
|
|
37
|
+
{% else %}
|
|
38
|
+
<a class="news-title" href="{{ item.url | relative_url }}">{{ item.title }}</a>
|
|
39
|
+
{% endif %}
|
|
40
|
+
</td>
|
|
41
|
+
</tr>
|
|
42
|
+
{% endfor %}
|
|
43
|
+
</table>
|
|
44
|
+
</div>
|
|
45
|
+
{% else %}
|
|
46
|
+
<p>{% include t.liquid key='news.empty' default='No news so far...' %}</p>
|
|
47
|
+
{% endif %}
|
|
48
|
+
</div>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
<div
|
|
2
|
+
class="newsletter-form-container"
|
|
3
|
+
{% if include.center %}
|
|
4
|
+
style="margin: 20px"
|
|
5
|
+
{% endif %}
|
|
6
|
+
>
|
|
7
|
+
<form
|
|
8
|
+
class="newsletter-form"
|
|
9
|
+
action="https://app.loops.so/api/newsletter-form/{{ site.newsletter.endpoint }}"
|
|
10
|
+
method="POST"
|
|
11
|
+
style="justify-content: {% if include.left %}flex-start{% elsif include.right %}flex-end{% else %}center{% endif %}"
|
|
12
|
+
>
|
|
13
|
+
<input
|
|
14
|
+
class="newsletter-form-input"
|
|
15
|
+
name="newsletter-form-input"
|
|
16
|
+
type="email"
|
|
17
|
+
placeholder="user@example.com"
|
|
18
|
+
required=""
|
|
19
|
+
>
|
|
20
|
+
|
|
21
|
+
<button
|
|
22
|
+
type="submit"
|
|
23
|
+
class="newsletter-form-button"
|
|
24
|
+
style="justify-content: {% if include.left %}flex-start{% elsif include.right %}flex-end{% else %}center{% endif %}"
|
|
25
|
+
>
|
|
26
|
+
subscribe
|
|
27
|
+
</button>
|
|
28
|
+
|
|
29
|
+
<button
|
|
30
|
+
type="button"
|
|
31
|
+
class="newsletter-loading-button"
|
|
32
|
+
style="justify-content: {% if include.left %}flex-start{% elsif include.right %}flex-end{% else %}center{% endif %}"
|
|
33
|
+
>
|
|
34
|
+
Please wait...
|
|
35
|
+
</button>
|
|
36
|
+
</form>
|
|
37
|
+
|
|
38
|
+
<div
|
|
39
|
+
class="newsletter-success"
|
|
40
|
+
style="justify-content: {% if include.left %}flex-start{% elsif include.right %}flex-end{% else %}center{% endif %}"
|
|
41
|
+
>
|
|
42
|
+
<p class="newsletter-success-message">You're subscribed!</p>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
<div
|
|
46
|
+
class="newsletter-error"
|
|
47
|
+
style="justify-content: {% if include.left %}flex-start{% elsif include.right %}flex-end{% else %}center{% endif %}"
|
|
48
|
+
>
|
|
49
|
+
<p class="newsletter-error-message">Oops! Something went wrong, please try again</p>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
<button
|
|
53
|
+
class="newsletter-back-button"
|
|
54
|
+
type="button"
|
|
55
|
+
onmouseout='this.style.textDecoration="none"'
|
|
56
|
+
onmouseover='this.style.textDecoration="underline"'
|
|
57
|
+
>
|
|
58
|
+
← Back
|
|
59
|
+
</button>
|
|
60
|
+
</div>
|
|
61
|
+
|
|
62
|
+
<noscript>
|
|
63
|
+
<style>
|
|
64
|
+
.newsletter-form-container {
|
|
65
|
+
display: none;
|
|
66
|
+
}
|
|
67
|
+
</style>
|
|
68
|
+
</noscript>
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{% assign hero_data = page.hero %}
|
|
2
|
+
{% assign hero_image = include.image | default: page.hero_image %}
|
|
3
|
+
{% if hero_data and hero_data.image %}
|
|
4
|
+
{% assign hero_image = hero_data.image %}
|
|
5
|
+
{% endif %}
|
|
6
|
+
|
|
7
|
+
{% if hero_image %}
|
|
8
|
+
{% assign hero_title = include.title | default: page.hero_title | default: page.title %}
|
|
9
|
+
{% if hero_data and hero_data.title %}
|
|
10
|
+
{% assign hero_title = hero_data.title %}
|
|
11
|
+
{% endif %}
|
|
12
|
+
{% assign hero_subtitle = include.subtitle | default: page.subtitle | default: page.description %}
|
|
13
|
+
{% if hero_data and hero_data.subtitle %}
|
|
14
|
+
{% assign hero_subtitle = hero_data.subtitle %}
|
|
15
|
+
{% endif %}
|
|
16
|
+
{% assign hero_alt = include.alt | default: page.hero_image_alt | default: page.title %}
|
|
17
|
+
{% if hero_data and hero_data.alt %}
|
|
18
|
+
{% assign hero_alt = hero_data.alt %}
|
|
19
|
+
{% endif %}
|
|
20
|
+
{% assign hero_caption = include.caption | default: page.hero_caption %}
|
|
21
|
+
{% if hero_data and hero_data.caption %}
|
|
22
|
+
{% assign hero_caption = hero_data.caption %}
|
|
23
|
+
{% endif %}
|
|
24
|
+
{% assign hero_source = include.source | default: page.hero_source %}
|
|
25
|
+
{% if hero_data and hero_data.source %}
|
|
26
|
+
{% assign hero_source = hero_data.source %}
|
|
27
|
+
{% endif %}
|
|
28
|
+
{% assign hero_source_url = include.source_url | default: page.hero_source_url %}
|
|
29
|
+
{% if hero_data and hero_data.source_url %}
|
|
30
|
+
{% assign hero_source_url = hero_data.source_url %}
|
|
31
|
+
{% endif %}
|
|
32
|
+
{% assign hero_position = include.position | default: page.hero_image_position %}
|
|
33
|
+
{% if hero_data and hero_data.position %}
|
|
34
|
+
{% assign hero_position = hero_data.position %}
|
|
35
|
+
{% endif %}
|
|
36
|
+
{% if hero_position == nil or hero_position == '' %}
|
|
37
|
+
{% assign hero_position = 'center' %}
|
|
38
|
+
{% endif %}
|
|
39
|
+
{% assign hero_class = include.class | default: page.hero_class %}
|
|
40
|
+
{% if hero_data and hero_data.class %}
|
|
41
|
+
{% assign hero_class = hero_data.class %}
|
|
42
|
+
{% endif %}
|
|
43
|
+
|
|
44
|
+
{% if hero_image contains '://' %}
|
|
45
|
+
{% assign hero_src = hero_image %}
|
|
46
|
+
{% else %}
|
|
47
|
+
{% assign hero_src = hero_image | relative_url %}
|
|
48
|
+
{% endif %}
|
|
49
|
+
|
|
50
|
+
{% assign hero_source_domain = nil %}
|
|
51
|
+
{% if hero_source_url %}
|
|
52
|
+
{% assign hero_source_domain = hero_source_url | replace: 'https://', '' | replace: 'http://', '' | split: '/' | first %}
|
|
53
|
+
{% endif %}
|
|
54
|
+
{% capture hero_source_label %}{% include t.liquid key='about.hero_source' default='Source' %}{% endcapture %}
|
|
55
|
+
|
|
56
|
+
<section class="page-hero home-hero home-hero-fullwidth{% if hero_class %} {{ hero_class }}{% endif %}">
|
|
57
|
+
<img
|
|
58
|
+
class="home-hero-image"
|
|
59
|
+
src="{{ hero_src }}"
|
|
60
|
+
alt="{{ hero_alt | escape }}"
|
|
61
|
+
loading="eager"
|
|
62
|
+
style="object-position: {{ hero_position | escape }};"
|
|
63
|
+
>
|
|
64
|
+
<div class="home-hero-overlay">
|
|
65
|
+
<div class="home-hero-content">
|
|
66
|
+
<h1 class="home-hero-title">{{ hero_title | strip }}</h1>
|
|
67
|
+
{% if hero_subtitle %}
|
|
68
|
+
<p class="home-hero-subtitle">{{ hero_subtitle }}</p>
|
|
69
|
+
{% endif %}
|
|
70
|
+
</div>
|
|
71
|
+
</div>
|
|
72
|
+
{% if hero_caption or hero_source %}
|
|
73
|
+
<div class="home-hero-caption">
|
|
74
|
+
{% if hero_caption %}
|
|
75
|
+
<span class="home-hero-caption-text">{{ hero_caption | escape }}</span>
|
|
76
|
+
{% endif %}
|
|
77
|
+
{% if hero_source %}
|
|
78
|
+
<span class="home-hero-caption-source">
|
|
79
|
+
<span class="home-hero-caption-source-label">{{ hero_source_label | strip }}:</span>
|
|
80
|
+
{% if hero_source_url %}
|
|
81
|
+
<a class="home-hero-caption-source-link" href="{{ hero_source_url }}" target="_blank" rel="noopener noreferrer">
|
|
82
|
+
{% if hero_source_domain and hero_source_domain != '' %}
|
|
83
|
+
{{ hero_source_domain }}
|
|
84
|
+
{% else %}
|
|
85
|
+
{{ hero_source | escape }}
|
|
86
|
+
{% endif %}
|
|
87
|
+
</a>
|
|
88
|
+
{% else %}
|
|
89
|
+
<span class="home-hero-caption-source-link">{{ hero_source | escape }}</span>
|
|
90
|
+
{% endif %}
|
|
91
|
+
</span>
|
|
92
|
+
{% endif %}
|
|
93
|
+
</div>
|
|
94
|
+
{% endif %}
|
|
95
|
+
</section>
|
|
96
|
+
{% endif %}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
{%- assign current_lang = include.lang | default: page.lang | default: site.default_lang | default: site.lang -%}
|
|
2
|
+
{%- assign linked_page = site.pages | where: 'ref', include.ref | where: 'lang', current_lang | first -%}
|
|
3
|
+
|
|
4
|
+
{%- if linked_page -%}
|
|
5
|
+
{{- linked_page.url | relative_url -}}
|
|
6
|
+
{%- else -%}
|
|
7
|
+
{{- '/' | append: current_lang | append: '/' | relative_url -}}
|
|
8
|
+
{%- endif -%}
|