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,435 @@
|
|
|
1
|
+
(function () {
|
|
2
|
+
var MIN_SCALE = 0.85;
|
|
3
|
+
var MAX_SCALE = 1.25;
|
|
4
|
+
var STEP = 0.1;
|
|
5
|
+
var STORAGE_KEY = "unaltrawebDocumentationFontScale";
|
|
6
|
+
var PROFILE_STORAGE_KEY = "unaltrawebDocumentationProfile";
|
|
7
|
+
var PROFILE_PARAM = "doc_profile";
|
|
8
|
+
|
|
9
|
+
function readScale() {
|
|
10
|
+
var stored = parseFloat(localStorage.getItem(STORAGE_KEY) || "1");
|
|
11
|
+
return Number.isFinite(stored) ? stored : 1;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function applyStoredFontScale() {
|
|
15
|
+
var scale = readScale();
|
|
16
|
+
document.documentElement.style.setProperty("--documentation-font-scale", String(scale));
|
|
17
|
+
document.documentElement.style.setProperty("--documentation-content-font-size", (1.02 * scale).toFixed(3) + "rem");
|
|
18
|
+
document.documentElement.style.setProperty("--documentation-h2-font-size", (1.45 * scale).toFixed(3) + "rem");
|
|
19
|
+
document.documentElement.style.setProperty("--documentation-h3-font-size", (1.18 * scale).toFixed(3) + "rem");
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function setupFontControls() {
|
|
23
|
+
applyStoredFontScale();
|
|
24
|
+
document.querySelectorAll(".documentation-font-menu").forEach(function (menu) {
|
|
25
|
+
if (menu.dataset.documentationFontMenuReady) return;
|
|
26
|
+
menu.dataset.documentationFontMenuReady = "true";
|
|
27
|
+
menu.addEventListener("click", function (event) {
|
|
28
|
+
event.stopPropagation();
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
document.querySelectorAll("[data-documentation-font]").forEach(function (button) {
|
|
32
|
+
if (button.dataset.documentationFontReady) return;
|
|
33
|
+
button.dataset.documentationFontReady = "true";
|
|
34
|
+
button.addEventListener("click", function () {
|
|
35
|
+
var scale = readScale();
|
|
36
|
+
if (button.dataset.documentationFont === "increase") scale = Math.min(MAX_SCALE, scale + STEP);
|
|
37
|
+
if (button.dataset.documentationFont === "decrease") scale = Math.max(MIN_SCALE, scale - STEP);
|
|
38
|
+
if (button.dataset.documentationFont === "reset") scale = 1;
|
|
39
|
+
scale = Math.round(scale * 100) / 100;
|
|
40
|
+
localStorage.setItem(STORAGE_KEY, String(scale));
|
|
41
|
+
applyStoredFontScale();
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function setupSidebarToggle() {
|
|
47
|
+
var layout = document.querySelector(".documentation-layout");
|
|
48
|
+
if (!layout) return;
|
|
49
|
+
var storageKey = "unaltrawebDocumentationTocCollapsed";
|
|
50
|
+
var mobileQuery = window.matchMedia("(max-width: 960px)");
|
|
51
|
+
var stored = localStorage.getItem(storageKey);
|
|
52
|
+
var collapsed = stored === null ? mobileQuery.matches : stored === "true";
|
|
53
|
+
|
|
54
|
+
function toggleButtons() {
|
|
55
|
+
return Array.prototype.slice.call(document.querySelectorAll("[data-documentation-sidebar-toggle]"));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function updateToggleState(isCollapsed) {
|
|
59
|
+
layout.classList.toggle("documentation-toc-collapsed", isCollapsed);
|
|
60
|
+
toggleButtons().forEach(function (button) {
|
|
61
|
+
button.classList.toggle("is-collapsed", isCollapsed);
|
|
62
|
+
button.classList.toggle("collapsed", isCollapsed && button.classList.contains("navbar-toggler"));
|
|
63
|
+
button.setAttribute("aria-expanded", isCollapsed ? "false" : "true");
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
updateToggleState(collapsed);
|
|
68
|
+
toggleButtons().forEach(function (button) {
|
|
69
|
+
if (button.dataset.documentationToggleReady) return;
|
|
70
|
+
button.dataset.documentationToggleReady = "true";
|
|
71
|
+
button.addEventListener("click", function (event) {
|
|
72
|
+
event.preventDefault();
|
|
73
|
+
var nowCollapsed = !layout.classList.contains("documentation-toc-collapsed");
|
|
74
|
+
localStorage.setItem(storageKey, nowCollapsed ? "true" : "false");
|
|
75
|
+
updateToggleState(nowCollapsed);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
if (layout.dataset.documentationOutsideClickReady) return;
|
|
80
|
+
layout.dataset.documentationOutsideClickReady = "true";
|
|
81
|
+
document.addEventListener("click", function (event) {
|
|
82
|
+
if (!mobileQuery.matches || layout.classList.contains("documentation-toc-collapsed")) return;
|
|
83
|
+
var sidebar = layout.querySelector(".documentation-sidebar");
|
|
84
|
+
var clickedToggle = toggleButtons().some(function (button) {
|
|
85
|
+
return button.contains(event.target);
|
|
86
|
+
});
|
|
87
|
+
if ((sidebar && sidebar.contains(event.target)) || clickedToggle) return;
|
|
88
|
+
localStorage.setItem(storageKey, "true");
|
|
89
|
+
updateToggleState(true);
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function themeSetting() {
|
|
94
|
+
return document.documentElement.getAttribute("data-theme-setting") || localStorage.getItem("theme") || "system";
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function updateThemeLabels() {
|
|
98
|
+
document.querySelectorAll("[data-documentation-theme-label]").forEach(function (label) {
|
|
99
|
+
var button = label.closest("[data-theme-label-system]");
|
|
100
|
+
if (!button) return;
|
|
101
|
+
var setting = themeSetting();
|
|
102
|
+
var attr = "themeLabel" + setting.charAt(0).toUpperCase() + setting.slice(1);
|
|
103
|
+
label.textContent = button.dataset[attr] || setting;
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
function normalizeProfileToken(value) {
|
|
108
|
+
return (value || "").toString().trim().toLowerCase();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function profileTokens(value) {
|
|
112
|
+
return (value || "").toString().split(/[\s,]+/).map(normalizeProfileToken).filter(Boolean);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function readProfileFromUrl() {
|
|
116
|
+
var params = new URLSearchParams(window.location.search);
|
|
117
|
+
return params.has(PROFILE_PARAM) ? normalizeProfileToken(params.get(PROFILE_PARAM)) : null;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function readStoredProfile() {
|
|
121
|
+
return normalizeProfileToken(localStorage.getItem(PROFILE_STORAGE_KEY));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function writeStoredProfile(profile) {
|
|
125
|
+
if (profile) {
|
|
126
|
+
localStorage.setItem(PROFILE_STORAGE_KEY, profile);
|
|
127
|
+
} else {
|
|
128
|
+
localStorage.removeItem(PROFILE_STORAGE_KEY);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function readActiveProfile() {
|
|
133
|
+
var urlProfile = readProfileFromUrl();
|
|
134
|
+
if (urlProfile !== null) {
|
|
135
|
+
writeStoredProfile(urlProfile);
|
|
136
|
+
return urlProfile;
|
|
137
|
+
}
|
|
138
|
+
return readStoredProfile();
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
function updateProfileUrl(profile) {
|
|
142
|
+
if (!window.history || !window.history.replaceState) return;
|
|
143
|
+
var params = new URLSearchParams(window.location.search);
|
|
144
|
+
if (profile) params.set(PROFILE_PARAM, profile);
|
|
145
|
+
if (!profile) params.delete(PROFILE_PARAM);
|
|
146
|
+
var query = params.toString();
|
|
147
|
+
var nextUrl = window.location.pathname + (query ? "?" + query : "") + window.location.hash;
|
|
148
|
+
window.history.replaceState({}, "", nextUrl);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
function syncProfileControls(container, activeProfile) {
|
|
152
|
+
if (!container) return;
|
|
153
|
+
container.classList.toggle("has-active-profile", Boolean(activeProfile));
|
|
154
|
+
container.querySelectorAll("[data-documentation-profile-select]").forEach(function (select) {
|
|
155
|
+
select.value = activeProfile;
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function profileExists(container, profile) {
|
|
160
|
+
if (!container || !profile) return false;
|
|
161
|
+
return Array.prototype.slice.call(container.querySelectorAll("[data-documentation-profile-select] option")).some(function (option) {
|
|
162
|
+
return normalizeProfileToken(option.value) === profile;
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function validActiveProfile(container) {
|
|
167
|
+
var profile = readActiveProfile();
|
|
168
|
+
if (!profile) return "";
|
|
169
|
+
if (profileExists(container, profile)) return profile;
|
|
170
|
+
writeStoredProfile("");
|
|
171
|
+
updateProfileUrl("");
|
|
172
|
+
return "";
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function itemMatchesProfile(item, activeProfile) {
|
|
176
|
+
if (!activeProfile) return true;
|
|
177
|
+
var profiles = profileTokens(item && item.dataset ? item.dataset.documentationProfiles : "");
|
|
178
|
+
return profiles.length === 0 || profiles.indexOf(activeProfile) !== -1;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
function visibleElements(nodes) {
|
|
182
|
+
return Array.prototype.slice.call(nodes).filter(function (node) { return !node.hidden; });
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function syncDocumentationTreeLine(tree) {
|
|
186
|
+
if (!tree) return;
|
|
187
|
+
var sections = Array.prototype.slice.call(tree.querySelectorAll("[data-documentation-tree-id]"));
|
|
188
|
+
sections.forEach(function (section) {
|
|
189
|
+
delete section.dataset.documentationVisibleSection;
|
|
190
|
+
delete section.dataset.documentationFirstVisibleSection;
|
|
191
|
+
delete section.dataset.documentationLastVisibleSection;
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
var visibleSections = visibleElements(sections);
|
|
195
|
+
tree.hidden = tree.dataset.documentationProfileEmpty === "true";
|
|
196
|
+
var hasVisibleBranch = visibleSections.some(function (section) {
|
|
197
|
+
return section.open && visibleElements(section.querySelectorAll("[data-documentation-profile-item]")).length > 0;
|
|
198
|
+
});
|
|
199
|
+
tree.classList.toggle("has-visible-documentation-sections", visibleSections.length > 0);
|
|
200
|
+
tree.classList.toggle("has-multiple-visible-documentation-sections", visibleSections.length > 1);
|
|
201
|
+
tree.classList.toggle("has-visible-documentation-branches", hasVisibleBranch);
|
|
202
|
+
|
|
203
|
+
if (!visibleSections.length) return;
|
|
204
|
+
visibleSections.forEach(function (section) { section.dataset.documentationVisibleSection = "true"; });
|
|
205
|
+
visibleSections[0].dataset.documentationFirstVisibleSection = "true";
|
|
206
|
+
visibleSections[visibleSections.length - 1].dataset.documentationLastVisibleSection = "true";
|
|
207
|
+
|
|
208
|
+
if (visibleSections.length < 2 && !hasVisibleBranch) return;
|
|
209
|
+
var treeRect = tree.getBoundingClientRect();
|
|
210
|
+
var firstSection = visibleSections[0];
|
|
211
|
+
var lastSection = visibleSections[visibleSections.length - 1];
|
|
212
|
+
var firstMark = firstSection.querySelector(".documentation-accordion-mark") || firstSection.querySelector("summary") || firstSection;
|
|
213
|
+
var lastMark = lastSection.querySelector(".documentation-accordion-mark") || lastSection.querySelector("summary") || lastSection;
|
|
214
|
+
if (lastSection.open) {
|
|
215
|
+
var lastSectionItems = visibleElements(lastSection.querySelectorAll("[data-documentation-profile-item]"));
|
|
216
|
+
if (lastSectionItems.length) lastMark = lastSectionItems[lastSectionItems.length - 1];
|
|
217
|
+
}
|
|
218
|
+
var firstRect = firstMark.getBoundingClientRect();
|
|
219
|
+
var lastRect = lastMark.getBoundingClientRect();
|
|
220
|
+
var firstCenter = firstRect.top + firstRect.height / 2 - treeRect.top;
|
|
221
|
+
var lastCenter = lastRect.top + lastRect.height / 2 - treeRect.top;
|
|
222
|
+
tree.style.setProperty("--documentation-tree-line-top", firstCenter.toFixed(2) + "px");
|
|
223
|
+
tree.style.setProperty("--documentation-tree-line-bottom", Math.max(0, treeRect.height - lastCenter).toFixed(2) + "px");
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function syncDocumentationTrees() {
|
|
227
|
+
document.querySelectorAll("[data-documentation-tree]").forEach(syncDocumentationTreeLine);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
function scheduleDocumentationTreeSync() {
|
|
231
|
+
window.requestAnimationFrame(syncDocumentationTrees);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function setupDocumentationTreeLineSync() {
|
|
235
|
+
if (document.documentElement.dataset.documentationTreeLineSyncReady) return;
|
|
236
|
+
document.documentElement.dataset.documentationTreeLineSyncReady = "true";
|
|
237
|
+
window.addEventListener("resize", scheduleDocumentationTreeSync, { passive: true });
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function updateProfileSections(activeProfile) {
|
|
241
|
+
document.querySelectorAll("[data-documentation-tree-id]").forEach(function (section) {
|
|
242
|
+
var items = Array.prototype.slice.call(section.querySelectorAll("[data-documentation-profile-item]"));
|
|
243
|
+
var hasVisibleItem = items.some(function (item) { return !item.hidden; });
|
|
244
|
+
section.hidden = Boolean(activeProfile) && items.length > 0 && !hasVisibleItem;
|
|
245
|
+
});
|
|
246
|
+
document.querySelectorAll("[data-documentation-tree]").forEach(function (tree) {
|
|
247
|
+
var sections = Array.prototype.slice.call(tree.querySelectorAll("[data-documentation-tree-id]"));
|
|
248
|
+
var hasVisibleSection = sections.some(function (section) { return !section.hidden; });
|
|
249
|
+
tree.dataset.documentationProfileEmpty = Boolean(activeProfile) && sections.length > 0 && !hasVisibleSection ? "true" : "false";
|
|
250
|
+
});
|
|
251
|
+
document.querySelectorAll(".documentation-index-section").forEach(function (section) {
|
|
252
|
+
var cards = Array.prototype.slice.call(section.querySelectorAll(".documentation-card[data-documentation-profile-item]"));
|
|
253
|
+
var hasVisibleCard = cards.some(function (card) { return !card.hidden; });
|
|
254
|
+
section.hidden = Boolean(activeProfile) && cards.length > 0 && !hasVisibleCard;
|
|
255
|
+
});
|
|
256
|
+
document.querySelectorAll(".documentation-index").forEach(function (index) {
|
|
257
|
+
var sections = Array.prototype.slice.call(index.querySelectorAll(".documentation-index-section"));
|
|
258
|
+
var hasVisibleSection = sections.some(function (section) { return !section.hidden; });
|
|
259
|
+
index.hidden = Boolean(activeProfile) && sections.length > 0 && !hasVisibleSection;
|
|
260
|
+
});
|
|
261
|
+
scheduleDocumentationTreeSync();
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function updateCurrentPageProfileNotice(activeProfile) {
|
|
265
|
+
var currentPage = document.querySelector("[data-documentation-current-page]");
|
|
266
|
+
var notice = document.querySelector("[data-documentation-profile-notice]");
|
|
267
|
+
if (!currentPage || !notice) return;
|
|
268
|
+
notice.hidden = !activeProfile || itemMatchesProfile(currentPage, activeProfile);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
function applyDocumentationProfile(activeProfile) {
|
|
272
|
+
document.body.classList.toggle("documentation-profile-active", Boolean(activeProfile));
|
|
273
|
+
document.querySelectorAll("[data-documentation-profile-item]").forEach(function (item) {
|
|
274
|
+
var visible = itemMatchesProfile(item, activeProfile);
|
|
275
|
+
item.hidden = !visible;
|
|
276
|
+
item.classList.toggle("documentation-profile-hidden", !visible);
|
|
277
|
+
});
|
|
278
|
+
updateProfileSections(activeProfile);
|
|
279
|
+
updateCurrentPageProfileNotice(activeProfile);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
function emitProfileChange(activeProfile) {
|
|
283
|
+
document.dispatchEvent(new CustomEvent("unaltraweb:documentationprofilechange", { detail: { profile: activeProfile } }));
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
function setupDocumentationProfiles() {
|
|
287
|
+
var container = document.querySelector("[data-documentation-profile-switcher]");
|
|
288
|
+
if (!container) {
|
|
289
|
+
applyDocumentationProfile("");
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
var activeProfile = validActiveProfile(container);
|
|
293
|
+
syncProfileControls(container, activeProfile);
|
|
294
|
+
applyDocumentationProfile(activeProfile);
|
|
295
|
+
|
|
296
|
+
if (container.dataset.documentationProfilesReady) return;
|
|
297
|
+
container.dataset.documentationProfilesReady = "true";
|
|
298
|
+
container.addEventListener("change", function (event) {
|
|
299
|
+
var select = event.target.closest("[data-documentation-profile-select]");
|
|
300
|
+
if (!select) return;
|
|
301
|
+
activeProfile = normalizeProfileToken(select.value);
|
|
302
|
+
writeStoredProfile(activeProfile);
|
|
303
|
+
updateProfileUrl(activeProfile);
|
|
304
|
+
syncProfileControls(container, activeProfile);
|
|
305
|
+
applyDocumentationProfile(activeProfile);
|
|
306
|
+
emitProfileChange(activeProfile);
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
function setupDocumentationTree() {
|
|
311
|
+
document.querySelectorAll("[data-documentation-tree]").forEach(function (tree) {
|
|
312
|
+
if (tree.dataset.documentationTreeReady) return;
|
|
313
|
+
tree.dataset.documentationTreeReady = "true";
|
|
314
|
+
var docsPath = window.location.pathname;
|
|
315
|
+
var docsLink = tree.querySelector("a[href*='/docs/']");
|
|
316
|
+
if (docsLink) {
|
|
317
|
+
try {
|
|
318
|
+
docsPath = new URL(docsLink.href, window.location.href).pathname;
|
|
319
|
+
} catch (error) {
|
|
320
|
+
docsPath = window.location.pathname;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
var docsIndex = docsPath.indexOf("/docs/");
|
|
324
|
+
var docsRoot = docsIndex === -1 ? docsPath.split("/").slice(0, -1).join("/") : docsPath.slice(0, docsIndex + "/docs".length);
|
|
325
|
+
var storageKey = "unaltrawebDocumentationTree:" + docsRoot;
|
|
326
|
+
var stored = {};
|
|
327
|
+
try {
|
|
328
|
+
stored = JSON.parse(localStorage.getItem(storageKey) || "{}");
|
|
329
|
+
} catch (error) {
|
|
330
|
+
stored = {};
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
tree.querySelectorAll("details[data-documentation-tree-id]").forEach(function (details) {
|
|
334
|
+
var id = details.dataset.documentationTreeId;
|
|
335
|
+
var hasActive = details.querySelector(".active") !== null;
|
|
336
|
+
if (Object.prototype.hasOwnProperty.call(stored, id)) {
|
|
337
|
+
details.open = stored[id];
|
|
338
|
+
} else if (hasActive) {
|
|
339
|
+
details.open = true;
|
|
340
|
+
}
|
|
341
|
+
if (hasActive) details.dataset.documentationActiveSection = "true";
|
|
342
|
+
details.addEventListener("toggle", function () {
|
|
343
|
+
stored[id] = details.open;
|
|
344
|
+
localStorage.setItem(storageKey, JSON.stringify(stored));
|
|
345
|
+
scheduleDocumentationTreeSync();
|
|
346
|
+
});
|
|
347
|
+
});
|
|
348
|
+
scheduleDocumentationTreeSync();
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
function setupPageToc() {
|
|
353
|
+
var container = document.querySelector("[data-documentation-page-toc-container]");
|
|
354
|
+
var list = document.querySelector("[data-documentation-page-toc]");
|
|
355
|
+
var content = document.querySelector(".documentation-content");
|
|
356
|
+
if (!container || !list || !content) return;
|
|
357
|
+
|
|
358
|
+
var headings = Array.prototype.slice.call(content.querySelectorAll("h2[id], h3[id]"));
|
|
359
|
+
if (!headings.length) {
|
|
360
|
+
container.hidden = true;
|
|
361
|
+
list.innerHTML = "";
|
|
362
|
+
return;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
list.innerHTML = "";
|
|
366
|
+
headings.forEach(function (heading) {
|
|
367
|
+
var item = document.createElement("li");
|
|
368
|
+
var link = document.createElement("a");
|
|
369
|
+
var level = heading.tagName && heading.tagName.toLowerCase() === "h3" ? "level-3" : "level-2";
|
|
370
|
+
|
|
371
|
+
item.className = "documentation-section-toc-item";
|
|
372
|
+
link.className = "documentation-nav-link documentation-section-toc-link " + level;
|
|
373
|
+
link.href = "#" + heading.id;
|
|
374
|
+
link.textContent = heading.textContent || heading.id;
|
|
375
|
+
item.appendChild(link);
|
|
376
|
+
list.appendChild(item);
|
|
377
|
+
});
|
|
378
|
+
container.hidden = false;
|
|
379
|
+
|
|
380
|
+
var links = Array.prototype.slice.call(list.querySelectorAll("a[href^='#']"));
|
|
381
|
+
|
|
382
|
+
function updateActivePageTocLink() {
|
|
383
|
+
var activeIndex = 0;
|
|
384
|
+
headings.forEach(function (heading, index) {
|
|
385
|
+
if (heading.getBoundingClientRect().top <= 120) activeIndex = index;
|
|
386
|
+
});
|
|
387
|
+
links.forEach(function (link, index) {
|
|
388
|
+
var active = index === activeIndex;
|
|
389
|
+
link.classList.toggle("active", active);
|
|
390
|
+
if (active) {
|
|
391
|
+
link.setAttribute("aria-current", "location");
|
|
392
|
+
} else {
|
|
393
|
+
link.removeAttribute("aria-current");
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
if (!container.dataset.documentationPageTocScrollReady) {
|
|
399
|
+
container.dataset.documentationPageTocScrollReady = "true";
|
|
400
|
+
var ticking = false;
|
|
401
|
+
window.addEventListener(
|
|
402
|
+
"scroll",
|
|
403
|
+
function () {
|
|
404
|
+
if (ticking) return;
|
|
405
|
+
ticking = true;
|
|
406
|
+
window.requestAnimationFrame(function () {
|
|
407
|
+
updateActivePageTocLink();
|
|
408
|
+
ticking = false;
|
|
409
|
+
});
|
|
410
|
+
},
|
|
411
|
+
{ passive: true }
|
|
412
|
+
);
|
|
413
|
+
window.addEventListener("hashchange", updateActivePageTocLink);
|
|
414
|
+
}
|
|
415
|
+
updateActivePageTocLink();
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
function enhanceDocumentation() {
|
|
419
|
+
setupSidebarToggle();
|
|
420
|
+
setupFontControls();
|
|
421
|
+
updateThemeLabels();
|
|
422
|
+
setupDocumentationProfiles();
|
|
423
|
+
setupDocumentationTreeLineSync();
|
|
424
|
+
setupDocumentationTree();
|
|
425
|
+
setupPageToc();
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
if (document.readyState === "loading") {
|
|
429
|
+
document.addEventListener("DOMContentLoaded", enhanceDocumentation);
|
|
430
|
+
} else {
|
|
431
|
+
enhanceDocumentation();
|
|
432
|
+
}
|
|
433
|
+
document.addEventListener("unaltraweb:contentchange", enhanceDocumentation);
|
|
434
|
+
document.addEventListener("unaltraweb:themechange", updateThemeLabels);
|
|
435
|
+
})();
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
let echartsTheme = determineComputedTheme();
|
|
2
|
+
|
|
3
|
+
/* Create echarts chart as another node and hide the code block, appending the echarts node after it
|
|
4
|
+
this is done to enable retrieving the code again when changing theme between light/dark */
|
|
5
|
+
document.addEventListener("readystatechange", () => {
|
|
6
|
+
if (document.readyState === "complete") {
|
|
7
|
+
document.querySelectorAll("pre>code.language-echarts").forEach((elem) => {
|
|
8
|
+
const jsonData = elem.textContent;
|
|
9
|
+
const backup = elem.parentElement;
|
|
10
|
+
backup.classList.add("unloaded");
|
|
11
|
+
/* create echarts node */
|
|
12
|
+
let chartElement = document.createElement("div");
|
|
13
|
+
chartElement.classList.add("echarts");
|
|
14
|
+
backup.after(chartElement);
|
|
15
|
+
|
|
16
|
+
/* create echarts */
|
|
17
|
+
if (echartsTheme === "dark") {
|
|
18
|
+
var chart = echarts.init(chartElement, "dark-fresh-cut");
|
|
19
|
+
} else {
|
|
20
|
+
var chart = echarts.init(chartElement);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
chart.setOption(JSON.parse(jsonData));
|
|
24
|
+
window.addEventListener("resize", function () {
|
|
25
|
+
chart.resize();
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
});
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is a modified version of:
|
|
3
|
+
* https://github.com/marmelab/highlight-search-term/blob/main/src/index.js
|
|
4
|
+
* - We return the `nonMatchingElements`
|
|
5
|
+
* - We fixed a bug: `getRangesForSearchTermInElement` got the `node.parentElement`, which is not working if there are multiple text nodes in one element.
|
|
6
|
+
*
|
|
7
|
+
* highlight-search-term is published under MIT License.
|
|
8
|
+
*
|
|
9
|
+
* MIT License
|
|
10
|
+
*
|
|
11
|
+
* Copyright (c) 2024 marmelab
|
|
12
|
+
*
|
|
13
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
14
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
15
|
+
* in the Software without restriction, including without limitation the rights
|
|
16
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
17
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
18
|
+
* furnished to do so, subject to the following conditions:
|
|
19
|
+
*
|
|
20
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
21
|
+
* copies or substantial portions of the Software.
|
|
22
|
+
*
|
|
23
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
24
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
25
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
26
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
27
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
28
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
29
|
+
* SOFTWARE.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Highlight search term in the selected elements
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* import { highlightSearchTerm } from "highlight-search-term";
|
|
37
|
+
* const search = document.getElementById("search");
|
|
38
|
+
* search.addEventListener("input", () => {
|
|
39
|
+
* highlightSearchTerm({ search: search.value, selector: ".content" });
|
|
40
|
+
* });
|
|
41
|
+
*/
|
|
42
|
+
const highlightSearchTerm = ({ search, selector, customHighlightName = "search" }) => {
|
|
43
|
+
if (!selector) {
|
|
44
|
+
throw new Error("The selector argument is required");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
if (!CSS.highlights) return; // disable feature on Firefox as it does not support CSS Custom Highlight API
|
|
48
|
+
|
|
49
|
+
// remove previous highlight
|
|
50
|
+
CSS.highlights.delete(customHighlightName);
|
|
51
|
+
if (!search) {
|
|
52
|
+
// nothing to highlight
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
// find all text nodes containing the search term
|
|
56
|
+
const ranges = [];
|
|
57
|
+
const nonMatchingElements = [];
|
|
58
|
+
const elements = document.querySelectorAll(selector);
|
|
59
|
+
Array.from(elements).map((element) => {
|
|
60
|
+
let match = false;
|
|
61
|
+
getTextNodesInElementContainingText(element, search).forEach((node) => {
|
|
62
|
+
// Modified variant of highlight-search-term
|
|
63
|
+
// We return the non-matching elements in addition.
|
|
64
|
+
const rangesForSearch = getRangesForSearchTermInNode(node, search);
|
|
65
|
+
ranges.push(...rangesForSearch);
|
|
66
|
+
if (rangesForSearch.length > 0) {
|
|
67
|
+
match = true;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
if (!match) {
|
|
71
|
+
nonMatchingElements.push(element);
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
if (ranges.length === 0) return nonMatchingElements; // modified: return `nonMatchingElements`
|
|
75
|
+
// create a CSS highlight that can be styled with the ::highlight(search) pseudo-element
|
|
76
|
+
const highlight = new Highlight(...ranges);
|
|
77
|
+
CSS.highlights.set(customHighlightName, highlight);
|
|
78
|
+
return nonMatchingElements; // modified: return `nonMatchingElements`
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
const getTextNodesInElementContainingText = (element, text) => {
|
|
82
|
+
const nodes = [];
|
|
83
|
+
const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT);
|
|
84
|
+
let node;
|
|
85
|
+
while ((node = walker.nextNode())) {
|
|
86
|
+
if (node.textContent && node.textContent.toLowerCase().includes(text)) {
|
|
87
|
+
nodes.push(node);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return nodes;
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
// Fix: We changed this function to work on the node directly, rather than on its parent element.
|
|
94
|
+
const getRangesForSearchTermInNode = (node, search) => {
|
|
95
|
+
const ranges = [];
|
|
96
|
+
const text = (node.textContent ? node.textContent.toLowerCase() : "") || "";
|
|
97
|
+
|
|
98
|
+
let start = 0;
|
|
99
|
+
let index;
|
|
100
|
+
while ((index = text.indexOf(search, start)) >= 0) {
|
|
101
|
+
const range = new Range();
|
|
102
|
+
range.setStart(node, index);
|
|
103
|
+
range.setEnd(node, index + search.length);
|
|
104
|
+
ranges.push(range);
|
|
105
|
+
start = index + search.length;
|
|
106
|
+
}
|
|
107
|
+
return ranges;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
export { highlightSearchTerm };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
$(document).ready(function () {
|
|
2
|
+
// Let external links in jupyter notebooks open in new tab
|
|
3
|
+
let jupyterNotebooks = $(".jupyter-notebook-iframe-container");
|
|
4
|
+
jupyterNotebooks.each(function () {
|
|
5
|
+
let iframeBody = $(this).find("iframe").get(0).contentWindow.document.body;
|
|
6
|
+
// Get all <a> elements in the bodyElement
|
|
7
|
+
let links = $(iframeBody).find("a");
|
|
8
|
+
|
|
9
|
+
// Loop through each <a> element
|
|
10
|
+
links.each(function () {
|
|
11
|
+
// Check if the <a> element has an 'href' attribute
|
|
12
|
+
if ($(this).attr("href")) {
|
|
13
|
+
// Set the 'target' attribute to '_blank' to open the link in a new tab/window
|
|
14
|
+
$(this).attr("target", "_blank");
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/* Create leaflet map as another node and hide the code block, appending the leaflet node after it */
|
|
2
|
+
document.addEventListener("readystatechange", () => {
|
|
3
|
+
if (document.readyState === "complete") {
|
|
4
|
+
document.querySelectorAll("pre>code.language-geojson").forEach((elem) => {
|
|
5
|
+
const jsonData = elem.textContent;
|
|
6
|
+
const backup = elem.parentElement;
|
|
7
|
+
backup.classList.add("unloaded");
|
|
8
|
+
/* create leaflet node */
|
|
9
|
+
let mapElement = document.createElement("div");
|
|
10
|
+
mapElement.classList.add("map");
|
|
11
|
+
backup.after(mapElement);
|
|
12
|
+
|
|
13
|
+
var map = L.map(mapElement);
|
|
14
|
+
L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
|
|
15
|
+
maxZoom: 19,
|
|
16
|
+
attribution: '© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a>',
|
|
17
|
+
}).addTo(map);
|
|
18
|
+
let geoJSON = L.geoJSON(JSON.parse(jsonData)).addTo(map);
|
|
19
|
+
map.fitBounds(geoJSON.getBounds());
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
});
|