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,127 @@
|
|
|
1
|
+
{% capture n_total_raw %}{% bibliography_count -f papers %}{% endcapture %}
|
|
2
|
+
{% assign n_total = n_total_raw | strip | plus: 0 %}
|
|
3
|
+
|
|
4
|
+
{% capture n_article_raw %}{% bibliography_count -f papers --query @article %}{% endcapture %}
|
|
5
|
+
{% assign n_article = n_article_raw | strip | plus: 0 %}
|
|
6
|
+
|
|
7
|
+
{% capture n_inproceedings_raw %}{% bibliography_count -f papers --query @inproceedings %}{% endcapture %}
|
|
8
|
+
{% assign n_inproceedings = n_inproceedings_raw | strip | plus: 0 %}
|
|
9
|
+
|
|
10
|
+
{% capture n_incollection_raw %}{% bibliography_count -f papers --query @incollection %}{% endcapture %}
|
|
11
|
+
{% assign n_incollection = n_incollection_raw | strip | plus: 0 %}
|
|
12
|
+
|
|
13
|
+
{% capture n_book_raw %}{% bibliography_count -f papers --query @book %}{% endcapture %}
|
|
14
|
+
{% assign n_book = n_book_raw | strip | plus: 0 %}
|
|
15
|
+
|
|
16
|
+
{% capture n_inbook_raw %}{% bibliography_count -f papers --query @inbook %}{% endcapture %}
|
|
17
|
+
{% assign n_inbook = n_inbook_raw | strip | plus: 0 %}
|
|
18
|
+
|
|
19
|
+
{% capture n_techreport_raw %}{% bibliography_count -f papers --query @techreport %}{% endcapture %}
|
|
20
|
+
{% assign n_techreport = n_techreport_raw | strip | plus: 0 %}
|
|
21
|
+
|
|
22
|
+
{% capture n_phdthesis_raw %}{% bibliography_count -f papers --query @phdthesis %}{% endcapture %}
|
|
23
|
+
{% assign n_phdthesis = n_phdthesis_raw | strip | plus: 0 %}
|
|
24
|
+
|
|
25
|
+
{% capture n_mastersthesis_raw %}{% bibliography_count -f papers --query @mastersthesis %}{% endcapture %}
|
|
26
|
+
{% assign n_mastersthesis = n_mastersthesis_raw | strip | plus: 0 %}
|
|
27
|
+
|
|
28
|
+
{% capture n_misc_raw %}{% bibliography_count -f papers --query @misc %}{% endcapture %}
|
|
29
|
+
{% assign n_misc = n_misc_raw | strip | plus: 0 %}
|
|
30
|
+
|
|
31
|
+
{% if n_total > 0 %}
|
|
32
|
+
{% assign current_lang = page.lang | default: site.default_lang | default: site.lang %}
|
|
33
|
+
|
|
34
|
+
{% if current_lang == 'es' %}
|
|
35
|
+
{% assign intro = 'Esta página muestra' %}
|
|
36
|
+
{% assign publications_word = 'publicaciones' %}
|
|
37
|
+
{% assign article_s = 'artículo' %}
|
|
38
|
+
{% assign article_p = 'artículos' %}
|
|
39
|
+
{% assign conference_s = 'comunicación en congreso' %}
|
|
40
|
+
{% assign conference_p = 'comunicaciones en congresos' %}
|
|
41
|
+
{% assign chapter_s = 'capítulo de libro' %}
|
|
42
|
+
{% assign chapter_p = 'capítulos de libro' %}
|
|
43
|
+
{% assign book_s = 'libro' %}
|
|
44
|
+
{% assign book_p = 'libros' %}
|
|
45
|
+
{% assign report_s = 'informe técnico' %}
|
|
46
|
+
{% assign report_p = 'informes técnicos' %}
|
|
47
|
+
{% assign thesis_s = 'tesis' %}
|
|
48
|
+
{% assign thesis_p = 'tesis' %}
|
|
49
|
+
{% assign other_s = 'otro documento' %}
|
|
50
|
+
{% assign other_p = 'otros documentos' %}
|
|
51
|
+
{% elsif current_lang == 'ca' %}
|
|
52
|
+
{% assign intro = 'Aquesta pàgina mostra' %}
|
|
53
|
+
{% assign publications_word = 'publicacions' %}
|
|
54
|
+
{% assign article_s = 'article' %}
|
|
55
|
+
{% assign article_p = 'articles' %}
|
|
56
|
+
{% assign conference_s = 'comunicació en congrés' %}
|
|
57
|
+
{% assign conference_p = 'comunicacions en congressos' %}
|
|
58
|
+
{% assign chapter_s = 'capítol de llibre' %}
|
|
59
|
+
{% assign chapter_p = 'capítols de llibre' %}
|
|
60
|
+
{% assign book_s = 'llibre' %}
|
|
61
|
+
{% assign book_p = 'llibres' %}
|
|
62
|
+
{% assign report_s = 'informe tècnic' %}
|
|
63
|
+
{% assign report_p = 'informes tècnics' %}
|
|
64
|
+
{% assign thesis_s = 'tesi' %}
|
|
65
|
+
{% assign thesis_p = 'tesis' %}
|
|
66
|
+
{% assign other_s = 'altre document' %}
|
|
67
|
+
{% assign other_p = 'altres documents' %}
|
|
68
|
+
{% else %}
|
|
69
|
+
{% assign intro = 'This page currently lists' %}
|
|
70
|
+
{% assign publications_word = 'publications' %}
|
|
71
|
+
{% assign article_s = 'journal article' %}
|
|
72
|
+
{% assign article_p = 'journal articles' %}
|
|
73
|
+
{% assign conference_s = 'conference paper' %}
|
|
74
|
+
{% assign conference_p = 'conference papers' %}
|
|
75
|
+
{% assign chapter_s = 'book chapter' %}
|
|
76
|
+
{% assign chapter_p = 'book chapters' %}
|
|
77
|
+
{% assign book_s = 'book' %}
|
|
78
|
+
{% assign book_p = 'books' %}
|
|
79
|
+
{% assign report_s = 'technical report' %}
|
|
80
|
+
{% assign report_p = 'technical reports' %}
|
|
81
|
+
{% assign thesis_s = 'thesis' %}
|
|
82
|
+
{% assign thesis_p = 'theses' %}
|
|
83
|
+
{% assign other_s = 'other item' %}
|
|
84
|
+
{% assign other_p = 'other items' %}
|
|
85
|
+
{% endif %}
|
|
86
|
+
|
|
87
|
+
{% assign parts = '' | split: '|' %}
|
|
88
|
+
|
|
89
|
+
{% if n_article > 0 %}
|
|
90
|
+
{% capture s %}<strong>{{ n_article }}</strong> {% if n_article == 1 %}{{ article_s }}{% else %}{{ article_p }}{% endif %}{% endcapture %}
|
|
91
|
+
{% assign parts = parts | push: s %}
|
|
92
|
+
{% endif %}
|
|
93
|
+
|
|
94
|
+
{% assign n_books_total = n_book | plus: n_inbook %}
|
|
95
|
+
{% if n_books_total > 0 %}
|
|
96
|
+
{% capture s %}<strong>{{ n_books_total }}</strong> {% if n_books_total == 1 %}{{ book_s }}{% else %}{{ book_p }}{% endif %}{% endcapture %}
|
|
97
|
+
{% assign parts = parts | push: s %}
|
|
98
|
+
{% endif %}
|
|
99
|
+
|
|
100
|
+
{% if n_incollection > 0 %}
|
|
101
|
+
{% capture s %}<strong>{{ n_incollection }}</strong> {% if n_incollection == 1 %}{{ chapter_s }}{% else %}{{ chapter_p }}{% endif %}{% endcapture %}
|
|
102
|
+
{% assign parts = parts | push: s %}
|
|
103
|
+
{% endif %}
|
|
104
|
+
|
|
105
|
+
{% if n_inproceedings > 0 %}
|
|
106
|
+
{% capture s %}<strong>{{ n_inproceedings }}</strong> {% if n_inproceedings == 1 %}{{ conference_s }}{% else %}{{ conference_p }}{% endif %}{% endcapture %}
|
|
107
|
+
{% assign parts = parts | push: s %}
|
|
108
|
+
{% endif %}
|
|
109
|
+
|
|
110
|
+
{% if n_techreport > 0 %}
|
|
111
|
+
{% capture s %}<strong>{{ n_techreport }}</strong> {% if n_techreport == 1 %}{{ report_s }}{% else %}{{ report_p }}{% endif %}{% endcapture %}
|
|
112
|
+
{% assign parts = parts | push: s %}
|
|
113
|
+
{% endif %}
|
|
114
|
+
|
|
115
|
+
{% assign n_thesis_total = n_phdthesis | plus: n_mastersthesis %}
|
|
116
|
+
{% if n_thesis_total > 0 %}
|
|
117
|
+
{% capture s %}<strong>{{ n_thesis_total }}</strong> {% if n_thesis_total == 1 %}{{ thesis_s }}{% else %}{{ thesis_p }}{% endif %}{% endcapture %}
|
|
118
|
+
{% assign parts = parts | push: s %}
|
|
119
|
+
{% endif %}
|
|
120
|
+
|
|
121
|
+
{% if n_misc > 0 %}
|
|
122
|
+
{% capture s %}<strong>{{ n_misc }}</strong> {% if n_misc == 1 %}{{ other_s }}{% else %}{{ other_p }}{% endif %}{% endcapture %}
|
|
123
|
+
{% assign parts = parts | push: s %}
|
|
124
|
+
{% endif %}
|
|
125
|
+
|
|
126
|
+
<p class="pub-counts">{{ intro }} <strong>{{ n_total }}</strong> {{ publications_word }}: {{ parts | join: ', ' }}.</p>
|
|
127
|
+
{% endif %}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{% assign biblio_item = include.item | default: page %}
|
|
2
|
+
{% assign biblio_id_source = include.id | default: biblio_item.key | default: biblio_item.slug | default: biblio_item.title | slugify %}
|
|
3
|
+
{% assign biblio_id = 'biblio-' | append: biblio_id_source %}
|
|
4
|
+
{% assign biblio_wrap_class = include.wrap_class | default: 'reading-biblio-wrap' %}
|
|
5
|
+
{% assign biblio_actions_class = include.actions_class | default: 'reading-biblio-actions' %}
|
|
6
|
+
{% assign biblio_panel_class = include.panel_class | default: 'reading-biblio-panel' %}
|
|
7
|
+
{% assign biblio_citation = include.citation | replace: "\Textperiodcentered", "·" | strip %}
|
|
8
|
+
{% assign biblio_bibtex = include.bibtex | default: biblio_item.bibtex | strip %}
|
|
9
|
+
{% assign biblio_abstract = include.abstract | default: biblio_item.abstract | strip %}
|
|
10
|
+
{% assign biblio_url = include.url | default: biblio_item.manual_url | default: biblio_item.website | default: biblio_item.url_external %}
|
|
11
|
+
{% assign biblio_url_label = include.url_label | default: biblio_item.manual_url_label | default: 'LINK' %}
|
|
12
|
+
{% assign biblio_doi = include.doi | default: biblio_item.doi | strip %}
|
|
13
|
+
{% assign biblio_doi_url = include.doi_url %}
|
|
14
|
+
{% assign biblio_doi_http_prefix = biblio_doi_url | slice: 0, 7 | downcase %}
|
|
15
|
+
{% assign biblio_doi_https_prefix = biblio_doi_url | slice: 0, 8 | downcase %}
|
|
16
|
+
{% unless biblio_doi_http_prefix == 'http://' or biblio_doi_https_prefix == 'https://' %}
|
|
17
|
+
{% assign biblio_doi_url = nil %}
|
|
18
|
+
{% endunless %}
|
|
19
|
+
{% if biblio_doi_url == nil and biblio_doi != '' %}
|
|
20
|
+
{% assign biblio_doi_url = 'https://doi.org/' | append: biblio_doi %}
|
|
21
|
+
{% endif %}
|
|
22
|
+
{% assign biblio_url_http_prefix = biblio_url | slice: 0, 7 | downcase %}
|
|
23
|
+
{% assign biblio_url_https_prefix = biblio_url | slice: 0, 8 | downcase %}
|
|
24
|
+
{% unless biblio_url_http_prefix == 'http://' or biblio_url_https_prefix == 'https://' %}
|
|
25
|
+
{% assign biblio_url = nil %}
|
|
26
|
+
{% endunless %}
|
|
27
|
+
{% capture cite_button_text %}{% include t.liquid key='reading.cite' default='Cite' %}{% endcapture %}
|
|
28
|
+
{% capture bib_button_text %}{% include t.liquid key='bib.buttons.bib' default='Bib' %}{% endcapture %}
|
|
29
|
+
{% capture abstract_button_text %}{% include t.liquid key='bib.buttons.abstract' default='Abs' %}{% endcapture %}
|
|
30
|
+
{% capture copy_text %}{% include t.liquid key='reading.copy' default='Copy' %}{% endcapture %}
|
|
31
|
+
{% capture copied_text %}{% include t.liquid key='reading.copied' default='Copied' %}{% endcapture %}
|
|
32
|
+
{% capture doi_text %}{% include t.liquid key='reading.doi' default='DOI' %}{% endcapture %}
|
|
33
|
+
|
|
34
|
+
<div class="{{ biblio_wrap_class }}">
|
|
35
|
+
<div class="links {{ biblio_actions_class }}">
|
|
36
|
+
{% if biblio_citation != '' %}<a class="cite btn btn-sm z-depth-0" role="button" aria-expanded="false">{{ cite_button_text | strip | upcase }}</a>{% endif %}
|
|
37
|
+
{% if biblio_bibtex != '' %}<a class="bibtex btn btn-sm z-depth-0" role="button" aria-expanded="false">{{ bib_button_text | strip | upcase }}</a>{% endif %}
|
|
38
|
+
{% if biblio_doi_url %}<a href="{{ biblio_doi_url | escape }}" class="btn btn-sm z-depth-0" role="button" target="_blank" rel="noopener noreferrer">DOI</a>{% endif %}
|
|
39
|
+
{% if biblio_url %}<a href="{{ biblio_url | escape }}" class="btn btn-sm z-depth-0" role="button" target="_blank" rel="noopener noreferrer">{{ biblio_url_label | strip | default: 'LINK' | upcase | escape }}</a>{% endif %}
|
|
40
|
+
{% if biblio_abstract != '' %}<a class="abstract btn btn-sm z-depth-0" role="button" aria-expanded="false">{{ abstract_button_text | strip | upcase }}</a>{% endif %}
|
|
41
|
+
</div>
|
|
42
|
+
|
|
43
|
+
{% if biblio_citation != '' %}
|
|
44
|
+
<div class="cite hidden {{ biblio_panel_class }}">
|
|
45
|
+
<div class="reading-citation-header">
|
|
46
|
+
<h3>{{ cite_button_text | strip }}</h3>
|
|
47
|
+
<button class="reading-copy-button" type="button" data-copy-target="#{{ biblio_id }}-cite-copy" data-copy-label="{{ copy_text | strip | escape }}" data-copy-done="{{ copied_text | strip | escape }}">{{ copy_text | strip }}</button>
|
|
48
|
+
</div>
|
|
49
|
+
<div id="{{ biblio_id }}-cite-copy" class="reading-copy-source reading-citation-text">{{ biblio_citation }}</div>
|
|
50
|
+
{% if biblio_doi_url and include.hide_citation_access != true %}<p class="reading-citation-doi"><strong>{{ doi_text | strip }}:</strong> <a href="{{ biblio_doi_url | escape }}" target="_blank" rel="noopener noreferrer">{{ biblio_doi_url | escape }}</a></p>{% endif %}
|
|
51
|
+
</div>
|
|
52
|
+
{% endif %}
|
|
53
|
+
|
|
54
|
+
{% if biblio_abstract != '' %}<div class="abstract hidden {{ biblio_panel_class }}"><p>{{ biblio_abstract }}</p></div>{% endif %}
|
|
55
|
+
|
|
56
|
+
{% if biblio_bibtex != '' %}
|
|
57
|
+
<div class="bibtex hidden {{ biblio_panel_class }}">
|
|
58
|
+
<div class="reading-citation-header">
|
|
59
|
+
<h3>{{ bib_button_text | strip }}</h3>
|
|
60
|
+
<button class="reading-copy-button" type="button" data-copy-target="#{{ biblio_id }}-bib-copy" data-copy-label="{{ copy_text | strip | escape }}" data-copy-done="{{ copied_text | strip | escape }}">{{ copy_text | strip }}</button>
|
|
61
|
+
</div>
|
|
62
|
+
<pre id="{{ biblio_id }}-bib-copy" class="reading-copy-source"><code class="language-bibtex">{{ biblio_bibtex | hideCustomBibtex | escape | escapeLiquidMarkers }}</code></pre>
|
|
63
|
+
</div>
|
|
64
|
+
{% endif %}
|
|
65
|
+
</div>
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
{% assign current_lang = include.current_lang | default: page.lang | default: site.default_lang | default: site.lang %}
|
|
2
|
+
{% assign item = include.item %}
|
|
3
|
+
{% assign linked = include.linked %}
|
|
4
|
+
{% if linked == nil %}
|
|
5
|
+
{% assign linked = true %}
|
|
6
|
+
{% endif %}
|
|
7
|
+
{% capture uncategorized_text %}{% include t.liquid key='reading.uncategorized' default='Uncategorized' %}{% endcapture %}
|
|
8
|
+
{% capture not_dated_text %}{% include t.liquid key='reading.not_dated' default='n.d.' %}{% endcapture %}
|
|
9
|
+
{% assign title_key = 'title_' | append: current_lang %}
|
|
10
|
+
{% assign author_key = 'author_' | append: current_lang %}
|
|
11
|
+
{% assign status_key = 'status_' | append: current_lang %}
|
|
12
|
+
{% assign badge_label_key = 'badge_label_' | append: current_lang %}
|
|
13
|
+
{% assign ribbon_label_key = 'ribbon_label_' | append: current_lang %}
|
|
14
|
+
{% assign item_title = item[title_key] | default: item.title %}
|
|
15
|
+
{% assign item_author = item[author_key] | default: item.author %}
|
|
16
|
+
{% assign item_status_raw = item[status_key] | default: item.status %}
|
|
17
|
+
{% assign status_slug = item_status_raw | downcase | replace: ' ', '_' %}
|
|
18
|
+
{% assign status_i18n_key = 'reading.status_values.' | append: status_slug %}
|
|
19
|
+
{% capture status_label %}{% include t.liquid key=status_i18n_key default=item_status_raw %}{% endcapture %}
|
|
20
|
+
{% assign ribbon_key = item.badge | default: item.ribbon_key | default: item.badge_key | default: item.ribbon_class | default: item.ribbon_slug | default: status_slug %}
|
|
21
|
+
{% assign configured_badge = nil %}
|
|
22
|
+
{% if site.unaltraweb.readings and site.unaltraweb.readings.badges %}
|
|
23
|
+
{% assign configured_badge = site.unaltraweb.readings.badges[ribbon_key] | default: site.unaltraweb.readings.badges[status_slug] %}
|
|
24
|
+
{% endif %}
|
|
25
|
+
{% assign configured_badge_label_key = 'label_' | append: current_lang %}
|
|
26
|
+
{% assign configured_badge_label = configured_badge[configured_badge_label_key] | default: configured_badge.label %}
|
|
27
|
+
{% assign ribbon_label_raw = item[badge_label_key] | default: item[ribbon_label_key] | default: item.ribbon_label | default: item.shelf_label | default: item.badge_label | default: configured_badge_label %}
|
|
28
|
+
{% if ribbon_label_raw %}
|
|
29
|
+
{% assign ribbon_label = ribbon_label_raw | strip %}
|
|
30
|
+
{% assign ribbon_slug = item.ribbon_class | default: item.ribbon_slug | default: ribbon_key | default: ribbon_label | slugify %}
|
|
31
|
+
{% elsif item_status_raw %}
|
|
32
|
+
{% assign ribbon_label = status_label | strip | upcase %}
|
|
33
|
+
{% assign ribbon_slug = status_slug %}
|
|
34
|
+
{% else %}
|
|
35
|
+
{% assign ribbon_label = uncategorized_text | strip | upcase %}
|
|
36
|
+
{% assign ribbon_slug = 'uncategorized' %}
|
|
37
|
+
{% endif %}
|
|
38
|
+
{% assign ribbon_color = item.ribbon_color | default: item.badge_color | default: configured_badge.color %}
|
|
39
|
+
{% assign ribbon_text_color = item.ribbon_text_color | default: item.badge_text_color | default: configured_badge.text_color %}
|
|
40
|
+
{% capture ribbon_style %}{% if ribbon_color %}--reading-ribbon-bg: {{ ribbon_color }};{% endif %}{% if ribbon_text_color %} --reading-ribbon-color: {{ ribbon_text_color }};{% endif %}{% endcapture %}
|
|
41
|
+
{% assign ribbon_style = ribbon_style | strip %}
|
|
42
|
+
{% assign ribbon_is_custom = false %}
|
|
43
|
+
{% if ribbon_label_raw or configured_badge or ribbon_style != '' %}{% assign ribbon_is_custom = true %}{% endif %}
|
|
44
|
+
{% capture item_rating_html %}{% include reading-rating.liquid item=item %}{% endcapture %}
|
|
45
|
+
{% assign item_rating_html = item_rating_html | strip %}
|
|
46
|
+
{% assign item_year = item.review_year | default: item.year %}
|
|
47
|
+
{% if item_year == nil or item_year == '' %}
|
|
48
|
+
{% assign item_date = item.review_date | default: item.date | default: item.finished | default: item.started %}
|
|
49
|
+
{% if item_date %}
|
|
50
|
+
{% assign item_year = item_date | date: '%Y' %}
|
|
51
|
+
{% else %}
|
|
52
|
+
{% assign item_year = not_dated_text | strip %}
|
|
53
|
+
{% endif %}
|
|
54
|
+
{% endif %}
|
|
55
|
+
<figure class="cover reading-cover">
|
|
56
|
+
{% if linked %}
|
|
57
|
+
<a class="cover-link" href="{{ item.url | relative_url | escape }}">
|
|
58
|
+
{% else %}
|
|
59
|
+
<div class="cover-link reading-cover-static" aria-label="{{ item_title | escape }}">
|
|
60
|
+
{% endif %}
|
|
61
|
+
{% if item.cover %}
|
|
62
|
+
{% if item.cover contains '://' %}
|
|
63
|
+
{% assign item_cover = item.cover %}
|
|
64
|
+
{% else %}
|
|
65
|
+
{% assign item_cover = item.cover | relative_url %}
|
|
66
|
+
{% endif %}
|
|
67
|
+
<img alt="{{ item_title | escape }}" src="{{ item_cover | escape }}" style="height: 220px">
|
|
68
|
+
{% elsif item.olid %}
|
|
69
|
+
<img alt="{{ item_title | escape }}" src="https://covers.openlibrary.org/b/olid/{{ item.olid | escape }}-L.jpg?default=false" style="height: 220px">
|
|
70
|
+
{% elsif item.isbn %}
|
|
71
|
+
<img alt="{{ item_title | escape }}" src="https://covers.openlibrary.org/b/isbn/{{ item.isbn | escape }}-L.jpg?default=false" style="height: 220px">
|
|
72
|
+
{% else %}
|
|
73
|
+
<img alt="{{ item_title | escape }}" src="{{ '/assets/img/11.jpg' | relative_url }}" style="height: 220px">
|
|
74
|
+
{% endif %}
|
|
75
|
+
{% if ribbon_label %}
|
|
76
|
+
<figcaption class="reading-ribbon{% if ribbon_is_custom %} custom{% endif %} {{ ribbon_slug }}"{% if ribbon_style != '' %} style="{{ ribbon_style }}"{% endif %}>{{ ribbon_label | escape }}</figcaption>
|
|
77
|
+
{% endif %}
|
|
78
|
+
{% if linked %}
|
|
79
|
+
</a>
|
|
80
|
+
{% else %}
|
|
81
|
+
</div>
|
|
82
|
+
{% endif %}
|
|
83
|
+
<div class="reading-cover-meta">
|
|
84
|
+
{% if linked %}
|
|
85
|
+
<a href="{{ item.url | relative_url | escape }}" class="reading-cover-title">{{ item_title | escape }}</a>
|
|
86
|
+
{% else %}
|
|
87
|
+
<span class="reading-cover-title">{{ item_title | escape }}</span>
|
|
88
|
+
{% endif %}
|
|
89
|
+
{% if item_author %}<span class="reading-cover-author">{{ item_author | escape }}</span>{% endif %}
|
|
90
|
+
{% if item_year %}<span class="reading-cover-year">{{ item_year | escape }}</span>{% endif %}
|
|
91
|
+
{% if item_rating_html != '' %}{{ item_rating_html }}{% endif %}
|
|
92
|
+
</div>
|
|
93
|
+
</figure>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{% assign rating_item = include.item | default: page %}
|
|
2
|
+
{% assign rating_value = rating_item.rating | default: rating_item.stars | default: rating_item.book_rating %}
|
|
3
|
+
{% assign rating_scale = rating_item.rating_scale | default: 5 %}
|
|
4
|
+
{% if rating_value %}
|
|
5
|
+
{% capture rating_text %}{% include t.liquid key='reading.rating' default='Rating' %}{% endcapture %}
|
|
6
|
+
<span class="reading-rating" title="{{ rating_text | strip }}">
|
|
7
|
+
<i class="fa-solid fa-star fa-sm" aria-hidden="true"></i>
|
|
8
|
+
<span class="sr-only">{{ rating_text | strip }}:</span>
|
|
9
|
+
{{ rating_value }}/{{ rating_scale }}
|
|
10
|
+
</span>
|
|
11
|
+
{% endif %}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{% assign current_lang = page.lang | default: site.default_lang | default: site.lang %}
|
|
2
|
+
{% assign collection_name = include.collection | default: 'books' %}
|
|
3
|
+
{% assign linked = include.linked %}
|
|
4
|
+
{% if linked == nil %}
|
|
5
|
+
{% assign linked = true %}
|
|
6
|
+
{% endif %}
|
|
7
|
+
{% assign heading_level = include.heading_level | default: 2 %}
|
|
8
|
+
{% assign heading_tag = 'h' | append: heading_level %}
|
|
9
|
+
{% assign readings = site[collection_name] | where: 'manual_recommended', true | sort: 'date' | reverse %}
|
|
10
|
+
{% capture empty_shelf_text %}{% include t.liquid key='reading.empty_shelf' default='No reading notes available yet.' %}{% endcapture %}
|
|
11
|
+
{% capture uncategorized_text %}{% include t.liquid key='reading.uncategorized' default='Uncategorized' %}{% endcapture %}
|
|
12
|
+
|
|
13
|
+
{% if readings.size > 0 %}
|
|
14
|
+
{% assign collection_groups = readings | group_by_exp: 'item', 'item.collection_ref | default: item.collection_name | default: item.series | default: uncategorized_text' %}
|
|
15
|
+
{% for group in collection_groups %}
|
|
16
|
+
{% assign collection_label_key = 'collection_' | append: current_lang %}
|
|
17
|
+
{% assign collection_label_source = group.items | first %}
|
|
18
|
+
{% assign collection_label = collection_label_source[collection_label_key] | default: collection_label_source.collection_name | default: collection_label_source.series | default: group.name | default: uncategorized_text %}
|
|
19
|
+
<section class="reading-collection" aria-labelledby="recommended-reading-{{ group.name | slugify }}">
|
|
20
|
+
<{{ heading_tag }} id="recommended-reading-{{ group.name | slugify }}" class="reading-collection-title">{{ collection_label }}</{{ heading_tag }}>
|
|
21
|
+
<div class="reading-shelf">
|
|
22
|
+
{% for item in group.items %}
|
|
23
|
+
{% include reading-cover-card.liquid item=item current_lang=current_lang linked=linked %}
|
|
24
|
+
{% endfor %}
|
|
25
|
+
</div>
|
|
26
|
+
</section>
|
|
27
|
+
{% endfor %}
|
|
28
|
+
{% else %}
|
|
29
|
+
<p>{{ empty_shelf_text | strip }}</p>
|
|
30
|
+
{% endif %}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{% assign have_related_posts = false %}
|
|
2
|
+
{% capture related_title %}{% include t.liquid key='related_posts.title' default='Enjoy reading this article?' %}{% endcapture %}
|
|
3
|
+
{% capture related_intro %}{% include t.liquid key='related_posts.intro' default='Here are some more articles you might like to read next.' %}{% endcapture %}
|
|
4
|
+
{% capture related_subscribe %}{% include t.liquid key='related_posts.subscribe' default='Subscribe to be notified of future articles:' %}{% endcapture %}
|
|
5
|
+
{% for post in site.related_posts | limit: site.related_blog_posts.max_related %}
|
|
6
|
+
{% unless have_related_posts %}
|
|
7
|
+
{% assign have_related_posts = true %}
|
|
8
|
+
{% if page.layout == 'post' %}
|
|
9
|
+
<br>
|
|
10
|
+
<hr>
|
|
11
|
+
<br>
|
|
12
|
+
<ul class="list-disc pl-8"></ul>
|
|
13
|
+
|
|
14
|
+
<!-- Adds related posts to the end of an article -->
|
|
15
|
+
<h2 class="text-3xl font-semibold mb-4 mt-12">{{ related_title | strip }}</h2>
|
|
16
|
+
{% else %}
|
|
17
|
+
<h2 class="text-3xl font-semibold mb-4 mt-12">{{ related_title | strip }}</h2>
|
|
18
|
+
{% endif %}
|
|
19
|
+
|
|
20
|
+
<p class="mb-2">{{ related_intro | strip }}</p>
|
|
21
|
+
{% endunless %}
|
|
22
|
+
|
|
23
|
+
<li class="my-2">
|
|
24
|
+
{% if post.redirect == blank %}
|
|
25
|
+
<a class="text-pink-700 underline font-semibold hover:text-pink-800" href="{{ post.url | relative_url }}">{{ post.title }}</a>
|
|
26
|
+
{% elsif post.redirect contains '://' %}
|
|
27
|
+
<a class="text-pink-700 underline font-semibold hover:text-pink-800" href="{{ post.redirect }}" target="_blank">{{ post.title }}</a>
|
|
28
|
+
<svg width="1rem" height="1rem" viewBox="0 0 30 30" xmlns="http://www.w3.org/2000/svg">
|
|
29
|
+
<path d="M17 13.5v6H5v-12h6m3-3h6v6m0-6-9 9" class="icon_svg-stroke" stroke="#999" stroke-width="1.5" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path>
|
|
30
|
+
</svg>
|
|
31
|
+
{% else %}
|
|
32
|
+
<a class="text-pink-700 underline font-semibold hover:text-pink-800" href="{{ post.redirect | relative_url }}">{{ post.title }}</a>
|
|
33
|
+
{% endif %}
|
|
34
|
+
</li>
|
|
35
|
+
{% endfor %}
|
|
36
|
+
{% if site.newsletter.enabled and site.footer_fixed %}
|
|
37
|
+
<p class="mb-2" style="margin-top: 1.5rem !important">{{ related_subscribe | strip }}</p>
|
|
38
|
+
{% include newsletter.liquid left=true %}
|
|
39
|
+
{% endif %}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{% assign repo_url = include.repository | split: '/' %}
|
|
2
|
+
{% if site.data.repositories.github_users contains repo_url.first %}
|
|
3
|
+
{% assign show_owner = false %}
|
|
4
|
+
{% else %}
|
|
5
|
+
{% assign show_owner = true %}
|
|
6
|
+
{% endif %}
|
|
7
|
+
|
|
8
|
+
{% assign lang_source = page.lang | default: site.default_lang | default: site.lang %}
|
|
9
|
+
{% assign lang = lang_source | split: '-' | first %}
|
|
10
|
+
|
|
11
|
+
{% case lang %}
|
|
12
|
+
{% when 'pt' %}
|
|
13
|
+
{% assign lang = lang_source %}
|
|
14
|
+
|
|
15
|
+
{% when 'zh' %}
|
|
16
|
+
{% assign lang_last = lang_source | split: '-' | last %}
|
|
17
|
+
{% case lang_last %}
|
|
18
|
+
{% when 'cn', 'sg', 'my', 'hans' %}
|
|
19
|
+
{% assign lang = 'cn' %}
|
|
20
|
+
{% when 'tw', 'hk', 'mo', 'hant' %}
|
|
21
|
+
{% assign lang = 'zh-tw' %}
|
|
22
|
+
{% endcase %}
|
|
23
|
+
|
|
24
|
+
{% comment %} Add a new language using when... if needed {% endcomment %}
|
|
25
|
+
{% comment %} If you still encounter language-display issues, check the available locale codes in github-readme-stats (different from ISO-639 standard used in your website) {% endcomment %}
|
|
26
|
+
{% comment %} https://github.com/anuraghazra/github-readme-stats?tab=readme-ov-file#available-locales {% endcomment %}
|
|
27
|
+
{% endcase %}
|
|
28
|
+
|
|
29
|
+
{% if site.data.repositories.repo_description_lines_max %}
|
|
30
|
+
{% assign max_lines = site.data.repositories.repo_description_lines_max %}
|
|
31
|
+
{% else %}
|
|
32
|
+
{% assign max_lines = 2 %}
|
|
33
|
+
{% endif %}
|
|
34
|
+
|
|
35
|
+
<div class="repo p-2 text-center">
|
|
36
|
+
<a href="https://github.com/{{ include.repository }}">
|
|
37
|
+
<img
|
|
38
|
+
class="only-light w-100"
|
|
39
|
+
alt="{{ include.repository }}"
|
|
40
|
+
src="{{ site.external_services.github_readme_stats_url }}/api/pin/?username={{ repo_url[0] }}&repo={{ repo_url[1] }}&theme={{ site.repo_theme_light }}&locale={{ lang }}&show_owner={{ show_owner }}&description_lines_count={{ max_lines }}"
|
|
41
|
+
>
|
|
42
|
+
<img
|
|
43
|
+
class="only-dark w-100"
|
|
44
|
+
alt="{{ include.repository }}"
|
|
45
|
+
src="{{ site.external_services.github_readme_stats_url }}/api/pin/?username={{ repo_url[0] }}&repo={{ repo_url[1] }}&theme={{ site.repo_theme_dark }}&locale={{ lang }}&show_owner={{ show_owner }}&description_lines_count={{ max_lines }}"
|
|
46
|
+
>
|
|
47
|
+
</a>
|
|
48
|
+
</div>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{% assign lang = page.lang | default: site.default_lang | default: site.lang %}
|
|
2
|
+
|
|
3
|
+
<div class="repo p-2 text-center">
|
|
4
|
+
<a href="https://github.com/ryo-ma/github-profile-trophy">
|
|
5
|
+
<span class="d-none d-sm-none d-md-block">
|
|
6
|
+
<img
|
|
7
|
+
class="only-light"
|
|
8
|
+
alt="{{ include.username }}"
|
|
9
|
+
src="{{ site.external_services.github_profile_trophy_url }}/?username={{ include.username }}&theme={{ site.repo_trophies.theme_light }}&locale={{ lang }}&margin-w=15&margin-h=15&no-bg=true&rank=-C&column=6"
|
|
10
|
+
>
|
|
11
|
+
<img
|
|
12
|
+
class="only-dark"
|
|
13
|
+
alt="{{ include.username }}"
|
|
14
|
+
src="{{ site.external_services.github_profile_trophy_url }}/?username={{ include.username }}&theme={{ site.repo_trophies.theme_dark }}&locale={{ lang }}&margin-w=15&margin-h=15&no-bg=true&rank=-C&column=6"
|
|
15
|
+
>
|
|
16
|
+
</span>
|
|
17
|
+
|
|
18
|
+
<span class="d-none d-sm-block d-md-none">
|
|
19
|
+
<img
|
|
20
|
+
class="only-light"
|
|
21
|
+
alt="{{ include.username }}"
|
|
22
|
+
src="{{ site.external_services.github_profile_trophy_url }}/?username={{ include.username }}&theme={{ site.repo_trophies.theme_light }}&locale={{ lang }}&margin-w=15&margin-h=15&no-bg=true&rank=-C&column=4"
|
|
23
|
+
>
|
|
24
|
+
<img
|
|
25
|
+
class="only-dark"
|
|
26
|
+
alt="{{ include.username }}"
|
|
27
|
+
src="{{ site.external_services.github_profile_trophy_url }}/?username={{ include.username }}&theme={{ site.repo_trophies.theme_dark }}&locale={{ lang }}&margin-w=15&margin-h=15&no-bg=true&rank=-C&column=4"
|
|
28
|
+
>
|
|
29
|
+
</span>
|
|
30
|
+
|
|
31
|
+
<span class="d-block d-sm-none">
|
|
32
|
+
<img
|
|
33
|
+
class="only-light"
|
|
34
|
+
alt="{{ include.username }}"
|
|
35
|
+
src="{{ site.external_services.github_profile_trophy_url }}/?username={{ include.username }}&theme={{ site.repo_trophies.theme_light }}&locale={{ lang }}&margin-w=15&margin-h=15&no-bg=true&rank=-C&column=3"
|
|
36
|
+
>
|
|
37
|
+
<img
|
|
38
|
+
class="only-dark"
|
|
39
|
+
alt="{{ include.username }}"
|
|
40
|
+
src="{{ site.external_services.github_profile_trophy_url }}/?username={{ include.username }}&theme={{ site.repo_trophies.theme_dark }}&locale={{ lang }}&margin-w=15&margin-h=15&no-bg=true&rank=-C&column=3"
|
|
41
|
+
>
|
|
42
|
+
</span>
|
|
43
|
+
</a>
|
|
44
|
+
</div>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{% assign lang_source = page.lang | default: site.default_lang | default: site.lang %}
|
|
2
|
+
{% assign lang = lang_source | split: '-' | first %}
|
|
3
|
+
|
|
4
|
+
{% case lang %}
|
|
5
|
+
{% when 'pt' %}
|
|
6
|
+
{% assign lang = lang_source %}
|
|
7
|
+
|
|
8
|
+
{% when 'zh' %}
|
|
9
|
+
{% assign lang_last = lang_source | split: '-' | last %}
|
|
10
|
+
{% case lang_last %}
|
|
11
|
+
{% when 'cn', 'sg', 'my', 'hans' %}
|
|
12
|
+
{% assign lang = 'cn' %}
|
|
13
|
+
{% when 'tw', 'hk', 'mo', 'hant' %}
|
|
14
|
+
{% assign lang = 'zh-tw' %}
|
|
15
|
+
{% endcase %}
|
|
16
|
+
|
|
17
|
+
{% comment %} Add a new language using when... if needed {% endcomment %}
|
|
18
|
+
{% comment %} If you still encounter language-display issues, check the available locale codes in github-readme-stats (different from ISO-639 standard used in your website) {% endcomment %}
|
|
19
|
+
{% comment %} https://github.com/anuraghazra/github-readme-stats?tab=readme-ov-file#available-locales {% endcomment %}
|
|
20
|
+
{% endcase %}
|
|
21
|
+
|
|
22
|
+
<div class="repo p-2 text-center">
|
|
23
|
+
<a href="https://github.com/{{ include.username }}">
|
|
24
|
+
<img
|
|
25
|
+
class="only-light w-100"
|
|
26
|
+
alt="{{ include.username }}"
|
|
27
|
+
src="{{ site.external_services.github_readme_stats_url }}/api/?username={{ include.username }}&theme={{ site.repo_theme_light }}&locale={{ lang }}&show_icons=true"
|
|
28
|
+
>
|
|
29
|
+
<img
|
|
30
|
+
class="only-dark w-100"
|
|
31
|
+
alt="{{ include.username }}"
|
|
32
|
+
src="{{ site.external_services.github_readme_stats_url }}/api/?username={{ include.username }}&theme={{ site.repo_theme_dark }}&locale={{ lang }}&show_icons=true"
|
|
33
|
+
>
|
|
34
|
+
</a>
|
|
35
|
+
</div>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<ul class="card-text font-weight-light list-group list-group-flush">
|
|
2
|
+
{% for content in data[1] %}
|
|
3
|
+
<li class="list-group-item">
|
|
4
|
+
<div class="row">
|
|
5
|
+
<div class="col-xs-2 col-sm-2 col-md-2 text-center date-column">
|
|
6
|
+
{% if content.date %} {% assign date = content.date | split: '-' | join: '.' %} {% else %} {% assign date = '' %} {% endif %}
|
|
7
|
+
<span class="badge font-weight-bold danger-color-dark text-uppercase align-middle" style="min-width: 75px"> {{ date }} </span>
|
|
8
|
+
</div>
|
|
9
|
+
<div class="col-xs-10 col-sm-10 col-md-10 mt-2 mt-md-0">
|
|
10
|
+
<h6 class="title font-weight-bold ml-1 ml-md-4">
|
|
11
|
+
<a href="{{ content.url }}">{{ content.title }}</a>
|
|
12
|
+
</h6>
|
|
13
|
+
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem">{{ content.awarder }}</h6>
|
|
14
|
+
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem; font-style: italic">{{ content.summary }}</h6>
|
|
15
|
+
</div>
|
|
16
|
+
</div>
|
|
17
|
+
</li>
|
|
18
|
+
{% endfor %}
|
|
19
|
+
</ul>
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
<table class="table table-cv table-sm table-borderless table-responsive table-cv-map">
|
|
2
|
+
{% assign skip_basics = 'image,profiles,location' | split: ',' %}
|
|
3
|
+
{% for content in data[1] %}
|
|
4
|
+
{%
|
|
5
|
+
if (content[1] == "") or (skip_basics contains
|
|
6
|
+
content[0])
|
|
7
|
+
%}
|
|
8
|
+
{% continue %}
|
|
9
|
+
{% endif %}
|
|
10
|
+
|
|
11
|
+
<tr>
|
|
12
|
+
<td class="p-1 pr-2 font-weight-bold">
|
|
13
|
+
<b>{{ content[0] | capitalize }}</b>
|
|
14
|
+
</td>
|
|
15
|
+
<td class="p-1 pl-2 font-weight-light text">
|
|
16
|
+
{% if content[0] == 'url' %}
|
|
17
|
+
<a href="{{ content[1] }}" target="_blank" rel="noopener noreferrer">{{ content[1] }}</a>
|
|
18
|
+
{% elsif content[0] == 'email' %}
|
|
19
|
+
<a href="mailto:{{ content[1] }}" target="_blank">{{ content[1] }}</a>
|
|
20
|
+
{% elsif content[0] == 'phone' %}
|
|
21
|
+
<a href="tel:{{ content[1] }}">{{ content[1] }}</a>
|
|
22
|
+
{% else %}
|
|
23
|
+
{{ content[1] }}
|
|
24
|
+
{% endif %}
|
|
25
|
+
</td>
|
|
26
|
+
</tr>
|
|
27
|
+
{% endfor %}
|
|
28
|
+
</table>
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
<div class="list-groups">
|
|
2
|
+
{% assign certificates = data[1] | sort: 'date' | reverse %}
|
|
3
|
+
{% for content in certificates %}
|
|
4
|
+
<div class="list-group col-md-6">
|
|
5
|
+
<table class="table-cv list-group-table">
|
|
6
|
+
<tbody>
|
|
7
|
+
<tr>
|
|
8
|
+
{% if content.icon %}
|
|
9
|
+
<td class="list-group-category-icon">
|
|
10
|
+
<i class="{{ content.icon }}"></i>
|
|
11
|
+
</td>
|
|
12
|
+
{% else %}
|
|
13
|
+
<td class="list-group-category-icon"></td>
|
|
14
|
+
{% endif %}
|
|
15
|
+
<!-- Calculate colspan number for category title -->
|
|
16
|
+
{% assign i = 1 %}
|
|
17
|
+
{% for item in content.items %}
|
|
18
|
+
{% assign i = i | plus: 1 %}
|
|
19
|
+
{% endfor %}
|
|
20
|
+
<td colspan="{{ i }}" class="list-group-category">
|
|
21
|
+
<a href="{{ content.url | default: # }}">{{ content.name }}</a>
|
|
22
|
+
</td>
|
|
23
|
+
</tr>
|
|
24
|
+
<tr>
|
|
25
|
+
<td></td>
|
|
26
|
+
<td class="list-group-name">
|
|
27
|
+
<b>{{ content.issuer }}</b>
|
|
28
|
+
</td>
|
|
29
|
+
<td class="list-group-name">{{ content.date }}</td>
|
|
30
|
+
</tr>
|
|
31
|
+
</tbody>
|
|
32
|
+
</table>
|
|
33
|
+
</div>
|
|
34
|
+
{% endfor %}
|
|
35
|
+
</div>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<ul class="card-text font-weight-light list-group list-group-flush">
|
|
2
|
+
{% assign education = data[1] | sort: 'startDate' | reverse %}
|
|
3
|
+
{% for content in education %}
|
|
4
|
+
<li class="list-group-item">
|
|
5
|
+
<div class="row">
|
|
6
|
+
<div class="col-xs-2 col-sm-2 col-md-2 text-center date-column">
|
|
7
|
+
{% if content.startDate and content.startDate != '' %}
|
|
8
|
+
{% assign startDate = content.startDate | split: '-' | slice: 0, 2 | join: '.' %}
|
|
9
|
+
{% assign endDate = content.endDate | split: '-' | slice: 0, 2 | join: '.' | default: 'Present' %}
|
|
10
|
+
{% assign date = startDate | append: ' - ' %}
|
|
11
|
+
{% assign date = date | append: endDate %}
|
|
12
|
+
{% else %}
|
|
13
|
+
{% assign date = null %}
|
|
14
|
+
{% endif %}
|
|
15
|
+
<table class="table-cv">
|
|
16
|
+
<tbody>
|
|
17
|
+
<tr>
|
|
18
|
+
<td>
|
|
19
|
+
{% if date %}
|
|
20
|
+
<span class="badge font-weight-bold danger-color-dark text-uppercase align-middle" style="min-width: 75px"> {{ date }} </span>
|
|
21
|
+
{% endif %}
|
|
22
|
+
</td>
|
|
23
|
+
</tr>
|
|
24
|
+
{% if content.location %}
|
|
25
|
+
<tr>
|
|
26
|
+
<td>
|
|
27
|
+
<p class="location">
|
|
28
|
+
<i class="fa-solid fa-location-dot iconlocation"></i>
|
|
29
|
+
{{ content.location }}
|
|
30
|
+
</p>
|
|
31
|
+
</td>
|
|
32
|
+
</tr>
|
|
33
|
+
{% endif %}
|
|
34
|
+
</tbody>
|
|
35
|
+
</table>
|
|
36
|
+
</div>
|
|
37
|
+
<div class="col-xs-10 col-sm-10 col-md-10 mt-2 mt-md-0">
|
|
38
|
+
<h6 class="title font-weight-bold ml-1 ml-md-4">
|
|
39
|
+
<a href="{{ content.url }}">{{ content.studyType }}</a>
|
|
40
|
+
</h6>
|
|
41
|
+
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem">{{ content.institution }}</h6>
|
|
42
|
+
<h6 class="ml-1 ml-md-4" style="font-size: 0.95rem; font-style: italic">{{ content.area }}</h6>
|
|
43
|
+
<ul class="items">
|
|
44
|
+
{% for item in content.courses %}
|
|
45
|
+
<li>
|
|
46
|
+
<span class="item">{{ item }}</span>
|
|
47
|
+
</li>
|
|
48
|
+
{% endfor %}
|
|
49
|
+
</ul>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</li>
|
|
53
|
+
{% endfor %}
|
|
54
|
+
</ul>
|