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.
Files changed (444) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +20 -0
  3. data/Makefile +412 -0
  4. data/README.md +226 -0
  5. data/_config.yml +842 -0
  6. data/_data/i18n/ca.yml +278 -0
  7. data/_data/i18n/en.yml +278 -0
  8. data/_data/i18n/es.yml +278 -0
  9. data/_includes/audio.liquid +30 -0
  10. data/_includes/bib_search.liquid +5 -0
  11. data/_includes/blog-list.liquid +66 -0
  12. data/_includes/book-citation.liquid +33 -0
  13. data/_includes/citation.liquid +26 -0
  14. data/_includes/custom_head.liquid +3 -0
  15. data/_includes/custom_scripts.liquid +5 -0
  16. data/_includes/cv/list.liquid +5 -0
  17. data/_includes/cv/list_groups.liquid +51 -0
  18. data/_includes/cv/map.liquid +29 -0
  19. data/_includes/cv/nested_list.liquid +16 -0
  20. data/_includes/cv/time_table.liquid +118 -0
  21. data/_includes/cv-download-card.liquid +26 -0
  22. data/_includes/developer-mode-switcher.liquid +24 -0
  23. data/_includes/disqus.liquid +13 -0
  24. data/_includes/distill_scripts.liquid +298 -0
  25. data/_includes/documentation-download-detail.liquid +76 -0
  26. data/_includes/documentation-downloads.liquid +71 -0
  27. data/_includes/documentation-profile-attributes.liquid +4 -0
  28. data/_includes/documentation-section-toc.liquid +9 -0
  29. data/_includes/documentation-sidebar.liquid +112 -0
  30. data/_includes/figure.liquid +87 -0
  31. data/_includes/footer.liquid +66 -0
  32. data/_includes/giscus.liquid +25 -0
  33. data/_includes/head.liquid +220 -0
  34. data/_includes/header.liquid +544 -0
  35. data/_includes/latest_posts.liquid +61 -0
  36. data/_includes/localized-date.liquid +5 -0
  37. data/_includes/manual-bibliography.liquid +2 -0
  38. data/_includes/manual-featured-readings.liquid +12 -0
  39. data/_includes/manual-other-readings.liquid +12 -0
  40. data/_includes/manual-page-toc.liquid +11 -0
  41. data/_includes/manual-sidebar.liquid +58 -0
  42. data/_includes/manual-teachers.liquid +74 -0
  43. data/_includes/metadata.liquid +278 -0
  44. data/_includes/news.liquid +48 -0
  45. data/_includes/newsletter.liquid +68 -0
  46. data/_includes/page-hero.liquid +96 -0
  47. data/_includes/page-link.liquid +8 -0
  48. data/_includes/pagination.liquid +22 -0
  49. data/_includes/post-reading-time.liquid +29 -0
  50. data/_includes/previous-next.liquid +37 -0
  51. data/_includes/profile-card.liquid +49 -0
  52. data/_includes/profile-feature-matrix.liquid +75 -0
  53. data/_includes/profile-highlights.liquid +122 -0
  54. data/_includes/project-grid.liquid +26 -0
  55. data/_includes/project-resource-link.liquid +45 -0
  56. data/_includes/project-resources.liquid +21 -0
  57. data/_includes/projects.liquid +38 -0
  58. data/_includes/projects_horizontal.liquid +37 -0
  59. data/_includes/publications-metrics-summary.liquid +69 -0
  60. data/_includes/publications-summary.liquid +127 -0
  61. data/_includes/reading-biblio-controls.liquid +65 -0
  62. data/_includes/reading-cover-card.liquid +93 -0
  63. data/_includes/reading-rating.liquid +11 -0
  64. data/_includes/recommended-readings.liquid +30 -0
  65. data/_includes/related_posts.liquid +39 -0
  66. data/_includes/repository/repo.liquid +48 -0
  67. data/_includes/repository/repo_trophies.liquid +44 -0
  68. data/_includes/repository/repo_user.liquid +35 -0
  69. data/_includes/resume/awards.liquid +19 -0
  70. data/_includes/resume/basics.liquid +28 -0
  71. data/_includes/resume/certificates.liquid +35 -0
  72. data/_includes/resume/education.liquid +54 -0
  73. data/_includes/resume/interests.liquid +34 -0
  74. data/_includes/resume/languages.liquid +31 -0
  75. data/_includes/resume/projects.liquid +32 -0
  76. data/_includes/resume/publications.liquid +28 -0
  77. data/_includes/resume/references.liquid +31 -0
  78. data/_includes/resume/skills.liquid +33 -0
  79. data/_includes/resume/volunteer.liquid +52 -0
  80. data/_includes/resume/work.liquid +52 -0
  81. data/_includes/scripts.liquid +364 -0
  82. data/_includes/search-data.js.liquid +341 -0
  83. data/_includes/selected_papers.liquid +3 -0
  84. data/_includes/t.liquid +31 -0
  85. data/_includes/team-grid.liquid +172 -0
  86. data/_includes/video.liquid +97 -0
  87. data/_layouts/about.liquid +93 -0
  88. data/_layouts/archive.liquid +45 -0
  89. data/_layouts/bib.liquid +677 -0
  90. data/_layouts/book-review.liquid +225 -0
  91. data/_layouts/book-shelf.liquid +66 -0
  92. data/_layouts/cv.liquid +127 -0
  93. data/_layouts/default.liquid +70 -0
  94. data/_layouts/distill.liquid +132 -0
  95. data/_layouts/documentation-download-detail.liquid +5 -0
  96. data/_layouts/documentation-home.liquid +100 -0
  97. data/_layouts/documentation-page.liquid +45 -0
  98. data/_layouts/manual-bib.liquid +73 -0
  99. data/_layouts/manual-chapter.liquid +99 -0
  100. data/_layouts/manual-featured-bib.liquid +100 -0
  101. data/_layouts/manual-home.liquid +120 -0
  102. data/_layouts/none.liquid +1 -0
  103. data/_layouts/outputs.liquid +29 -0
  104. data/_layouts/page.liquid +52 -0
  105. data/_layouts/post.liquid +95 -0
  106. data/_layouts/profile.liquid +36 -0
  107. data/_layouts/profiles.liquid +36 -0
  108. data/_layouts/project.liquid +7 -0
  109. data/_layouts/repositories.liquid +58 -0
  110. data/_layouts/theses.liquid +126 -0
  111. data/_plugins/bibliography_profiles.rb +164 -0
  112. data/_plugins/callouts.rb +104 -0
  113. data/_plugins/code_blocks.rb +277 -0
  114. data/_plugins/computation_figure_images.rb +266 -0
  115. data/_plugins/computation_sources.rb +42 -0
  116. data/_plugins/content_search_index.rb +210 -0
  117. data/_plugins/details.rb +23 -0
  118. data/_plugins/external-posts.rb +124 -0
  119. data/_plugins/figure_captions.rb +800 -0
  120. data/_plugins/file-exists.rb +22 -0
  121. data/_plugins/google-scholar-citations.rb +86 -0
  122. data/_plugins/hide-custom-bibtex.rb +18 -0
  123. data/_plugins/inspirehep-citations.rb +57 -0
  124. data/_plugins/localized_visual_sources.rb +145 -0
  125. data/_plugins/manual_release_metadata.rb +47 -0
  126. data/_plugins/mermaid_mmd_images.rb +233 -0
  127. data/_plugins/profile-pages.rb +28 -0
  128. data/_plugins/remove-accents.rb +32 -0
  129. data/_plugins/reproducible_build_time.rb +55 -0
  130. data/_plugins/search-data.rb +83 -0
  131. data/_plugins/theme-cache-bust.rb +56 -0
  132. data/_plugins/vega_visual_images.rb +290 -0
  133. data/_plugins/web_capture_images.rb +154 -0
  134. data/_sass/_base.scss +2133 -0
  135. data/_sass/_blog.scss +67 -0
  136. data/_sass/_callouts.scss +100 -0
  137. data/_sass/_custom.scss +437 -0
  138. data/_sass/_cv.scss +274 -0
  139. data/_sass/_developer.scss +97 -0
  140. data/_sass/_distill.scss +185 -0
  141. data/_sass/_documentation.scss +2220 -0
  142. data/_sass/_layout.scss +218 -0
  143. data/_sass/_manual.scss +2691 -0
  144. data/_sass/_profile.scss +323 -0
  145. data/_sass/_projects.scss +163 -0
  146. data/_sass/_reading.scss +465 -0
  147. data/_sass/_site-custom.scss +3 -0
  148. data/_sass/_tabs.scss +48 -0
  149. data/_sass/_team.scss +230 -0
  150. data/_sass/_themes.scss +254 -0
  151. data/_sass/_typograms.scss +132 -0
  152. data/_sass/_variables.scss +52 -0
  153. data/_sass/font-awesome/_animated.scss +152 -0
  154. data/_sass/font-awesome/_bordered-pulled.scss +20 -0
  155. data/_sass/font-awesome/_core.scss +49 -0
  156. data/_sass/font-awesome/_fixed-width.scss +7 -0
  157. data/_sass/font-awesome/_functions.scss +57 -0
  158. data/_sass/font-awesome/_icons.scss +13 -0
  159. data/_sass/font-awesome/_list.scss +18 -0
  160. data/_sass/font-awesome/_mixins.scss +65 -0
  161. data/_sass/font-awesome/_rotated-flipped.scss +31 -0
  162. data/_sass/font-awesome/_screen-reader.scss +14 -0
  163. data/_sass/font-awesome/_shims.scss +1578 -0
  164. data/_sass/font-awesome/_sizing.scss +16 -0
  165. data/_sass/font-awesome/_stacked.scss +32 -0
  166. data/_sass/font-awesome/_variables.scss +5044 -0
  167. data/_sass/font-awesome/brands.scss +30 -0
  168. data/_sass/font-awesome/fontawesome.scss +21 -0
  169. data/_sass/font-awesome/regular.scss +27 -0
  170. data/_sass/font-awesome/solid.scss +27 -0
  171. data/_sass/font-awesome/v4-shims.scss +11 -0
  172. data/_sass/tabler-icons/tabler-icons-filled.scss +1646 -0
  173. data/_sass/tabler-icons/tabler-icons-outline.scss +9859 -0
  174. data/_sass/tabler-icons/tabler-icons.scss +11463 -0
  175. data/_scripts/cronitor-analytics-setup.js +9 -0
  176. data/_scripts/giscus-setup.js +48 -0
  177. data/_scripts/google-analytics-setup.js +9 -0
  178. data/_scripts/open-panel-analytics-setup.js +14 -0
  179. data/_scripts/photoswipe-setup.js +11 -0
  180. data/assets/audio/epicaly-short-113909.mp3 +0 -0
  181. data/assets/bibliography/2018-12-22-distill.bib +7 -0
  182. data/assets/css/academicons.min.css +1 -0
  183. data/assets/css/bootstrap-toc.min.css +4 -0
  184. data/assets/css/bootstrap.min.css +7 -0
  185. data/assets/css/bootstrap.min.css.map +1 -0
  186. data/assets/css/jekyll-pygments-themes-github.css +209 -0
  187. data/assets/css/jekyll-pygments-themes-native.css +232 -0
  188. data/assets/css/jupyter-grade3.css +3758 -0
  189. data/assets/css/jupyter-monokai.css +3758 -0
  190. data/assets/css/jupyter.css +383 -0
  191. data/assets/css/main.scss +36 -0
  192. data/assets/css/mdb.min.css +48 -0
  193. data/assets/css/mdb.min.css.map +1 -0
  194. data/assets/css/scholar-icons.css +386 -0
  195. data/assets/fonts/academicons.ttf +0 -0
  196. data/assets/fonts/academicons.woff +0 -0
  197. data/assets/fonts/scholar-icons.ttf +0 -0
  198. data/assets/fonts/scholar-icons.woff +0 -0
  199. data/assets/fonts/tabler-icons-filled.ttf +0 -0
  200. data/assets/fonts/tabler-icons-filled.woff +0 -0
  201. data/assets/fonts/tabler-icons-filled.woff2 +0 -0
  202. data/assets/fonts/tabler-icons-outline.ttf +0 -0
  203. data/assets/fonts/tabler-icons-outline.woff +0 -0
  204. data/assets/fonts/tabler-icons-outline.woff2 +0 -0
  205. data/assets/fonts/tabler-icons.ttf +0 -0
  206. data/assets/fonts/tabler-icons.woff +0 -0
  207. data/assets/fonts/tabler-icons.woff2 +0 -0
  208. data/assets/html/relativity.html +15 -0
  209. data/assets/img/1.jpg +0 -0
  210. data/assets/img/10.jpg +0 -0
  211. data/assets/img/11.jpg +0 -0
  212. data/assets/img/12.jpg +0 -0
  213. data/assets/img/2.jpg +0 -0
  214. data/assets/img/3.jpg +0 -0
  215. data/assets/img/4.jpg +0 -0
  216. data/assets/img/5.jpg +0 -0
  217. data/assets/img/6.jpg +0 -0
  218. data/assets/img/7.jpg +0 -0
  219. data/assets/img/8.jpg +0 -0
  220. data/assets/img/9.jpg +0 -0
  221. data/assets/img/book_covers/the_godfather.jpg +0 -0
  222. data/assets/img/brand/dosquartsdedocs-logo-cafe.svg +31 -0
  223. data/assets/img/brand/dosquartsdedocs-logo-footer-cafe.svg +31 -0
  224. data/assets/img/brand/dosquartsdedocs-logo-white.svg +31 -0
  225. data/assets/img/brand/dosquartsdedocs-logo.svg +31 -0
  226. data/assets/img/prof_pic.jpg +0 -0
  227. data/assets/img/prof_pic_color.png +0 -0
  228. data/assets/img/profile-placeholder.svg +8 -0
  229. data/assets/img/publication_preview/brownian-motion.gif +0 -0
  230. data/assets/img/publication_preview/goodchild1992-gis-cover.jpg +0 -0
  231. data/assets/img/publication_preview/gutierrez2020-jtrg-preview.jpg +0 -0
  232. data/assets/img/publication_preview/harvey1989-postmodernity-cover.jpg +0 -0
  233. data/assets/img/publication_preview/tobler1970-economic-geography-cover.jpg +0 -0
  234. data/assets/img/publication_preview/tuan1977-space-place-cover.jpg +0 -0
  235. data/assets/img/publication_preview/wave-mechanics.gif +0 -0
  236. data/assets/img/publication_preview/zaragozi2025-rooftop-pv-preview.jpg +0 -0
  237. data/assets/img/rhino.png +0 -0
  238. data/assets/img/team/aaron-gutierrez.png +0 -0
  239. data/assets/img/team/alba-font.png +0 -0
  240. data/assets/img/team/alba-viana.png +0 -0
  241. data/assets/img/team/alejandro-gonzalez.png +0 -0
  242. data/assets/img/team/ana-pastor.png +0 -0
  243. data/assets/img/team/antoni-domenech.png +0 -0
  244. data/assets/img/team/benito-zaragozi.png +0 -0
  245. data/assets/img/team/cinta-sanz.png +0 -0
  246. data/assets/img/team/daniel-miravet.png +0 -0
  247. data/assets/img/team/eugenia-altamirano.png +0 -0
  248. data/assets/img/team/fiammetta-brandajs.png +0 -0
  249. data/assets/img/team/francesc-gonzalez.png +0 -0
  250. data/assets/img/team/isabel-paulino.png +0 -0
  251. data/assets/img/team/joan-borras.png +0 -0
  252. data/assets/img/team/julie-wilson.png +0 -0
  253. data/assets/img/team/liliana-sole.png +0 -0
  254. data/assets/img/team/maria-casado.png +0 -0
  255. data/assets/img/team/maria-medina.png +0 -0
  256. data/assets/img/team/marta-nello.png +0 -0
  257. data/assets/img/team/mogrify +1 -0
  258. data/assets/img/team/oscar-saladie.png +0 -0
  259. data/assets/img/team/paolo-russo.png +0 -0
  260. data/assets/img/team/raquel-santos.png +0 -0
  261. data/assets/img/team/salvador-anton.png +0 -0
  262. data/assets/img/team/sunsi-huertas.png +0 -0
  263. data/assets/img/team/user-placeholder.png +0 -0
  264. data/assets/img/team/wilbert-den-hoed.png +0 -0
  265. data/assets/img/team/xavier-delclos.png +0 -0
  266. data/assets/img/template_error.png +0 -0
  267. data/assets/js/bibsearch.js +70 -0
  268. data/assets/js/bootstrap-toc.min.js +5 -0
  269. data/assets/js/bootstrap.bundle.min.js +7 -0
  270. data/assets/js/bootstrap.bundle.min.js.map +1 -0
  271. data/assets/js/callouts.js +115 -0
  272. data/assets/js/chartjs-setup.js +14 -0
  273. data/assets/js/common.js +117 -0
  274. data/assets/js/content-search-match.js +159 -0
  275. data/assets/js/content-search.js +441 -0
  276. data/assets/js/copy_code.js +60 -0
  277. data/assets/js/custom.js +6 -0
  278. data/assets/js/developer-mode.js +103 -0
  279. data/assets/js/diff2html-setup.js +20 -0
  280. data/assets/js/distillpub/overrides.js +27 -0
  281. data/assets/js/distillpub/template.v2.js +9616 -0
  282. data/assets/js/distillpub/template.v2.js.map +1 -0
  283. data/assets/js/distillpub/transforms.v2.js +14557 -0
  284. data/assets/js/distillpub/transforms.v2.js.map +1 -0
  285. data/assets/js/documentation.js +435 -0
  286. data/assets/js/echarts-setup.js +29 -0
  287. data/assets/js/highlight-search-term.js +110 -0
  288. data/assets/js/jupyter_new_tab.js +18 -0
  289. data/assets/js/leaflet-setup.js +22 -0
  290. data/assets/js/manual.js +308 -0
  291. data/assets/js/masonry.js +12 -0
  292. data/assets/js/mathjax-setup.js +46 -0
  293. data/assets/js/mermaid-setup.js +37 -0
  294. data/assets/js/newsletter.js +105 -0
  295. data/assets/js/no_defer.js +24 -0
  296. data/assets/js/plotly-setup.js +52 -0
  297. data/assets/js/profile-nav.js +92 -0
  298. data/assets/js/progress-bar.js +73 -0
  299. data/assets/js/pseudocode-setup.js +18 -0
  300. data/assets/js/search/base-styles.min.js +286 -0
  301. data/assets/js/search/command-score.min.js +7 -0
  302. data/assets/js/search/hotkeys-js/hotkeys.esm.min.js +18 -0
  303. data/assets/js/search/lit/decorators.min.js +7 -0
  304. data/assets/js/search/lit/directives/class-map.min.js +7 -0
  305. data/assets/js/search/lit/directives/join.min.js +7 -0
  306. data/assets/js/search/lit/directives/live.min.js +7 -0
  307. data/assets/js/search/lit/directives/ref.min.js +7 -0
  308. data/assets/js/search/lit/directives/repeat.min.js +7 -0
  309. data/assets/js/search/lit/directives/unsafe-html.min.js +7 -0
  310. data/assets/js/search/lit/index.min.js +7 -0
  311. data/assets/js/search/lit-element/lit-element.min.js +12 -0
  312. data/assets/js/search/lit-html/directives/class-map.min.js +22 -0
  313. data/assets/js/search/lit-html/directives/join.min.js +12 -0
  314. data/assets/js/search/lit-html/directives/live.min.js +28 -0
  315. data/assets/js/search/lit-html/directives/ref.min.js +32 -0
  316. data/assets/js/search/lit-html/directives/repeat.min.js +27 -0
  317. data/assets/js/search/lit-html/directives/unsafe-html.min.js +22 -0
  318. data/assets/js/search/lit-html/is-server.min.js +12 -0
  319. data/assets/js/search/lit-html/lit-html.min.js +12 -0
  320. data/assets/js/search/ninja-action.min.js +101 -0
  321. data/assets/js/search/ninja-footer.min.js +62 -0
  322. data/assets/js/search/ninja-header.min.js +78 -0
  323. data/assets/js/search/ninja-keys.min.js +39 -0
  324. data/assets/js/search/reactive-element/decorators/custom-element.min.js +12 -0
  325. data/assets/js/search/reactive-element/decorators/event-options.min.js +12 -0
  326. data/assets/js/search/reactive-element/decorators/property.min.js +22 -0
  327. data/assets/js/search/reactive-element/decorators/query-all.min.js +17 -0
  328. data/assets/js/search/reactive-element/decorators/query-assigned-elements.min.js +17 -0
  329. data/assets/js/search/reactive-element/decorators/query-assigned-nodes.min.js +17 -0
  330. data/assets/js/search/reactive-element/decorators/query-async.min.js +17 -0
  331. data/assets/js/search/reactive-element/decorators/query.min.js +17 -0
  332. data/assets/js/search/reactive-element/decorators/state.min.js +27 -0
  333. data/assets/js/search/reactive-element/reactive-element.min.js +17 -0
  334. data/assets/js/search-setup.js +17 -0
  335. data/assets/js/shortcut-key.js +11 -0
  336. data/assets/js/tabs.min.js +5 -0
  337. data/assets/js/theme.js +314 -0
  338. data/assets/js/tooltips-setup.js +3 -0
  339. data/assets/js/typograms.js +1341 -0
  340. data/assets/js/vanilla-back-to-top.min.js +1 -0
  341. data/assets/js/vega-setup.js +24 -0
  342. data/assets/js/venobox-setup.js +5 -0
  343. data/assets/js/wechat.js +14 -0
  344. data/assets/js/zoom.js +15 -0
  345. data/assets/json/resume.json +98 -0
  346. data/assets/json/table_data.json +128 -0
  347. data/assets/jupyter/blog.ipynb +48 -0
  348. data/assets/pdf/example_pdf.pdf +0 -0
  349. data/assets/plotly/demo.html +72 -0
  350. data/assets/video/pexels-engin-akyurt-6069112-960x540-30fps.mp4 +0 -0
  351. data/assets/webfonts/fa-brands-400.ttf +0 -0
  352. data/assets/webfonts/fa-brands-400.woff2 +0 -0
  353. data/assets/webfonts/fa-regular-400.ttf +0 -0
  354. data/assets/webfonts/fa-regular-400.woff2 +0 -0
  355. data/assets/webfonts/fa-solid-900.ttf +0 -0
  356. data/assets/webfonts/fa-solid-900.woff2 +0 -0
  357. data/assets/webfonts/fa-v4compatibility.ttf +0 -0
  358. data/assets/webfonts/fa-v4compatibility.woff2 +0 -0
  359. data/docs/Gemfile +5 -0
  360. data/docs/_config.yml +83 -0
  361. data/docs/_documentation/en/01-quick-start.md +115 -0
  362. data/docs/_documentation/en/02-tools.md +146 -0
  363. data/docs/_documentation/en/03-usage.md +107 -0
  364. data/docs/_documentation/en/04-jekyll-basics.md +51 -0
  365. data/docs/_documentation/en/05-pages-collections.md +68 -0
  366. data/docs/_documentation/en/06-github-web-editing.md +92 -0
  367. data/docs/_documentation/en/10-profiles.md +125 -0
  368. data/docs/_documentation/en/11-unaltreselfie.md +39 -0
  369. data/docs/_documentation/en/12-unaltreprojecte.md +38 -0
  370. data/docs/_documentation/en/13-unaltremanual.md +237 -0
  371. data/docs/_documentation/en/14-unaltredocs.md +92 -0
  372. data/docs/_documentation/en/15-profile-checklist.md +39 -0
  373. data/docs/_documentation/en/20-syntax.md +353 -0
  374. data/docs/_documentation/en/21-themes.md +103 -0
  375. data/docs/_documentation/en/22-feature-reference.md +56 -0
  376. data/docs/_documentation/en/23-front-matter.md +51 -0
  377. data/docs/_documentation/en/24-data-files.md +28 -0
  378. data/docs/_documentation/en/30-customization.md +448 -0
  379. data/docs/_documentation/en/31-template.md +55 -0
  380. data/docs/_documentation/en/32-development.md +108 -0
  381. data/docs/_documentation/en/33-reusable-workflows.md +136 -0
  382. data/docs/_documentation/en/40-distribution.md +164 -0
  383. data/docs/_documentation/en/41-bibliometrics.md +137 -0
  384. data/docs/_documentation/en/42-docker-image.md +185 -0
  385. data/docs/_documentation/en/50-faq.md +33 -0
  386. data/docs/_pages/ca/index.md +35 -0
  387. data/docs/_pages/en/index.md +35 -0
  388. data/docs/_pages/es/index.md +35 -0
  389. data/docs/agents/action-prompts/00-start-site-session.txt +10 -0
  390. data/docs/agents/action-prompts/05-create-new-web.txt +5 -0
  391. data/docs/agents/action-prompts/10-content-update.txt +9 -0
  392. data/docs/agents/action-prompts/15-edit-default-content.txt +8 -0
  393. data/docs/agents/action-prompts/20-manual-teaching-materials.txt +18 -0
  394. data/docs/agents/action-prompts/22-manual-style-audit.txt +14 -0
  395. data/docs/agents/action-prompts/23-manual-structure-audit.txt +17 -0
  396. data/docs/agents/action-prompts/25-translation-prepublish.txt +8 -0
  397. data/docs/agents/action-prompts/30-project-site-update.txt +7 -0
  398. data/docs/agents/action-prompts/40-documentation-update.txt +7 -0
  399. data/docs/agents/action-prompts/50-bibliography-entry.txt +7 -0
  400. data/docs/agents/action-prompts/60-bibliometrics-refresh.txt +7 -0
  401. data/docs/agents/action-prompts/70-build-and-review.txt +12 -0
  402. data/docs/agents/manual-authoring-components.md +255 -0
  403. data/docs/agents/mcp-contract.md +162 -0
  404. data/docs/agents/quarto-computation-adoption.md +102 -0
  405. data/docs/assets/img/unaltraweb-docs-hero.svg +36 -0
  406. data/lib/unaltraweb/version.rb +8 -0
  407. data/lib/unaltraweb.rb +31 -0
  408. data/requirements.txt +5 -0
  409. data/scripts/biblio/fetch_scimago_csv.sh +126 -0
  410. data/scripts/biblio/metrics_common.py +154 -0
  411. data/scripts/biblio/metrics_merge_meta.py +73 -0
  412. data/scripts/biblio/metrics_update.py +826 -0
  413. data/scripts/computations/python/Dockerfile +37 -0
  414. data/scripts/computations/r/Dockerfile +31 -0
  415. data/scripts/computations/render.py +1267 -0
  416. data/scripts/cv/render_pdf_preview.sh +36 -0
  417. data/scripts/deploy/publish_branch.sh +80 -0
  418. data/scripts/generate_logo_variants.py +47 -0
  419. data/scripts/manual/Dockerfile +31 -0
  420. data/scripts/manual/build_pdf.py +1780 -0
  421. data/scripts/manual/filters/bibliography.lua +164 -0
  422. data/scripts/manual/filters/code-blocks.lua +102 -0
  423. data/scripts/manual/filters/figure-captions.lua +35 -0
  424. data/scripts/manual/publish_release.sh +281 -0
  425. data/scripts/manual/templates/manual.tex +494 -0
  426. data/scripts/manual/verify_release_assets.py +650 -0
  427. data/scripts/test_gem_build.py +128 -0
  428. data/scripts/test_reproducible_jekyll_build.py +191 -0
  429. data/scripts/test_wheel_install.py +282 -0
  430. data/scripts/unaltraweb-docker-mount.sh +36 -0
  431. data/scripts/unaltraweb-mcp-bootstrap.sh +105 -0
  432. data/scripts/unaltraweb-mcp-cleanup.sh +73 -0
  433. data/scripts/unaltraweb-mcp-project-id.sh +34 -0
  434. data/scripts/validate_distribution.py +563 -0
  435. data/scripts/validate_workflows.py +1285 -0
  436. data/scripts/web_captures/Dockerfile +31 -0
  437. data/scripts/web_captures/capture.mjs +157 -0
  438. data/scripts/web_captures/package-lock.json +56 -0
  439. data/scripts/web_captures/package.json +9 -0
  440. data/scripts/web_captures/render.py +867 -0
  441. data/src/unaltraweb_mcp/component-contract.json +153 -0
  442. data/src/unaltraweb_mcp/component-contract.schema.json +87 -0
  443. data/src/unaltraweb_mcp/docker_mount.py +19 -0
  444. metadata +861 -0
@@ -0,0 +1,341 @@
1
+ ---
2
+ permalink: /assets/js/search-data.js
3
+ ---
4
+ // get the ninja-keys element
5
+ const ninja = document.querySelector('ninja-keys');
6
+
7
+ // add the home and posts menu items
8
+ ninja.data = [
9
+ {%- assign default_home = site.pages | where: 'ref', 'home' | where: 'lang', site.default_lang | first -%}
10
+ {%- if default_home -%}
11
+ {
12
+ id: "nav-{{ default_home.title | slugify }}",
13
+ title: "{{ default_home.title | strip | truncatewords: 13 }}",
14
+ section: "Navigation",
15
+ handler: () => {
16
+ window.location.href = "{{ default_home.url | relative_url }}";
17
+ },
18
+ },
19
+ {%- endif -%}
20
+ {%- assign sorted_pages = site.pages | sort: "nav_order" -%}
21
+ {%- for p in sorted_pages -%}
22
+ {%- if p.nav and p.autogen == null -%}
23
+ {%- if p.dropdown -%}
24
+ {%- for child in p.children -%}
25
+ {%- unless child.title == 'divider' -%}
26
+ {
27
+ {%- assign title = child.title | escape | strip -%}
28
+ {%- assign url = child.permalink -%}
29
+ id: "dropdown-{{ title | slugify }}",
30
+ title: "{{ title | truncatewords: 13 }}",
31
+ description: "{{ child.description | strip_html | strip_newlines | escape | strip }}",
32
+ section: "Dropdown",
33
+ handler: () => {
34
+ window.location.href = "{{ url | relative_url }}";
35
+ },
36
+ },
37
+ {%- endunless -%}
38
+ {%- endfor -%}
39
+
40
+ {%- else -%}
41
+ {
42
+ {%- assign title = p.title | escape | strip -%}
43
+ {%- assign url = p.url -%}
44
+ id: "nav-{{ title | slugify }}",
45
+ title: "{{ title | truncatewords: 13 }}",
46
+ description: "{{ p.description | strip_html | strip_newlines | escape | strip }}",
47
+ section: "Navigation",
48
+ handler: () => {
49
+ window.location.href = "{{ url | relative_url }}";
50
+ },
51
+ },
52
+ {%- endif -%}
53
+ {%- endif -%}
54
+ {%- endfor -%}
55
+ {%- if site.posts_in_search -%}
56
+ {%- for post in site.posts -%}
57
+ {
58
+ {%- assign title = post.title | escape | strip -%}
59
+ id: "post-{{ title | slugify }}",
60
+ {% if post.redirect == blank %}
61
+ title: "{{ title | truncatewords: 13 }}",
62
+ {% elsif post.redirect contains '://' %}
63
+ title: '{{ title | truncatewords: 13 }} <svg width="1.2rem" height="1.2rem" top=".5rem" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg"><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></svg>',
64
+ {% else %}
65
+ title: "{{ title | truncatewords: 13 }}",
66
+ {% endif %}
67
+ description: "{{ post.description | strip_html | strip_newlines | escape | strip }}",
68
+ section: "Posts",
69
+ handler: () => {
70
+ {% if post.redirect == blank %}
71
+ window.location.href = "{{ post.url | relative_url }}";
72
+ {% elsif post.redirect contains '://' %}
73
+ window.open("{{ post.redirect }}", "_blank");
74
+ {% else %}
75
+ window.location.href = "{{ post.redirect | relative_url }}";
76
+ {% endif %}
77
+ },
78
+ },
79
+ {%- endfor -%}
80
+ {%- endif -%}
81
+ {%- for collection in site.collections -%}
82
+ {%- if collection.label != 'posts' -%}
83
+ {%- for item in collection.docs -%}
84
+ {
85
+ {%- if item.inline -%}
86
+ {%- assign title = item.content | newline_to_br | replace: "<br />", " " | replace: "<br/>", " " | strip_html | strip_newlines | escape | strip -%}
87
+ {%- else -%}
88
+ {%- assign title = item.title | newline_to_br | replace: "<br />", " " | replace: "<br/>", " " | strip_html | strip_newlines | escape | strip -%}
89
+ {%- endif -%}
90
+ id: "{{ collection.label }}-{{ title | slugify }}",
91
+ title: '{{ title | escape | emojify | truncatewords: 13 }}',
92
+ description: "{{ item.description | strip_html | strip_newlines | escape | strip }}",
93
+ section: "{{ collection.label | capitalize }}",
94
+ {%- unless item.inline -%}
95
+ handler: () => {
96
+ window.location.href = "{{ item.url | relative_url }}";
97
+ },
98
+ {%- endunless -%}
99
+ },
100
+ {%- endfor -%}
101
+ {%- endif -%}
102
+ {%- endfor -%}
103
+ {%- if site.socials_in_search -%}
104
+ {%- for social in site.data.socials -%}
105
+ {%- case social[0] -%}
106
+ {%- when "acm_id" -%}
107
+ {%- assign social_id = "social-acm" -%}
108
+ {%- assign social_title = "ACM DL" -%}
109
+ {%- capture social_url %}"https://dl.acm.org/profile/{{ social[1] }}/"{% endcapture -%}
110
+ {%- when "arxiv_id" -%}
111
+ {%- assign social_id = "social-arxiv" -%}
112
+ {%- assign social_title = "arXiv" -%}
113
+ {%- capture social_url %}"https://arxiv.org/a/{{ social[1] }}.html"{% endcapture -%}
114
+ {%- when "blogger_url" -%}
115
+ {%- assign social_id = "social-blogger" -%}
116
+ {%- assign social_title = "Blogger" -%}
117
+ {%- capture social_url %}"{{ social[1] }}"{% endcapture -%}
118
+ {%- when "bluesky_url" -%}
119
+ {%- assign social_id = "social-bluesky" -%}
120
+ {%- assign social_title = "Bluesky" -%}
121
+ {%- capture social_url %}"{{ social[1] }}"{% endcapture -%}
122
+ {%- when "cv_pdf" -%}
123
+ {%- assign social_id = "social-cv" -%}
124
+ {%- assign social_title = "CV" -%}
125
+ {%- capture social_url %}"{{ social[1] | relative_url }}"{% endcapture -%}
126
+ {%- when "dblp_url" -%}
127
+ {%- assign social_id = "social-dblp" -%}
128
+ {%- assign social_title = "DBLP" -%}
129
+ {%- capture social_url %}"{{ social[1] }}"{% endcapture -%}
130
+ {%- when "discord_id" -%}
131
+ {%- assign social_id = "social-discord" -%}
132
+ {%- assign social_title = "Discord" -%}
133
+ {%- capture social_url %}"https://discord.com/users/{{ social[1] }}"{% endcapture -%}
134
+ {%- when "email" -%}
135
+ {%- assign social_id = "social-email" -%}
136
+ {%- assign social_title = "email" -%}
137
+ {%- capture social_url %}"mailto:{{ social[1] | encode_email }}"{% endcapture -%}
138
+ {%- when "facebook_id" -%}
139
+ {%- assign social_id = "social-facebook" -%}
140
+ {%- assign social_title = "Facebook" -%}
141
+ {%- capture social_url %}"https://facebook.com/{{ social[1] }}"{% endcapture -%}
142
+ {%- when "flickr_id" -%}
143
+ {%- assign social_id = "social-flickr" -%}
144
+ {%- assign social_title = "Flickr" -%}
145
+ {%- capture social_url %}"https://www.flickr.com/{{ social[1] }}"{% endcapture -%}
146
+ {%- when "github_username" -%}
147
+ {%- assign social_id = "social-github" -%}
148
+ {%- assign social_title = "GitHub" -%}
149
+ {%- capture social_url %}"https://github.com/{{ social[1] }}"{% endcapture -%}
150
+ {%- when "gitlab_username" -%}
151
+ {%- assign social_id = "social-gitlab" -%}
152
+ {%- assign social_title = "GitLab" -%}
153
+ {%- capture social_url %}"https://gitlab.com/{{ social[1] }}"{% endcapture -%}
154
+ {%- when "hal_id" -%}
155
+ {%- assign social_id = "social-hal" -%}
156
+ {%- assign social_title = "HAL" -%}
157
+ {%- capture social_url %}"https://cv.hal.science/{{ social[1] }}"{% endcapture -%}
158
+ {%- when "ieee_id" -%}
159
+ {%- assign social_id = "social-ieee" -%}
160
+ {%- assign social_title = "IEEE Xplore" -%}
161
+ {%- capture social_url %}"https://ieeexplore.ieee.org/author/{{ social[1] }}/"{% endcapture -%}
162
+ {%- when "inspirehep_id" -%}
163
+ {%- assign social_id = "social-inspire" -%}
164
+ {%- assign social_title = "Inspire HEP" -%}
165
+ {%- capture social_url %}"https://inspirehep.net/authors/{{ social[1] }}"{% endcapture -%}
166
+ {%- when "instagram_id" -%}
167
+ {%- assign social_id = "social-instagram" -%}
168
+ {%- assign social_title = "Instagram" -%}
169
+ {%- capture social_url %}"https://instagram.com/{{ social[1] }}"{% endcapture -%}
170
+ {%- when "kaggle_id" -%}
171
+ {%- assign social_id = "social-kaggle" -%}
172
+ {%- assign social_title = "Kaggle" -%}
173
+ {%- capture social_url %}"https://www.kaggle.com/{{ social[1] }}"{% endcapture -%}
174
+ {%- when "keybase_username" -%}
175
+ {%- assign social_id = "social-keybase" -%}
176
+ {%- assign social_title = "Keybase" -%}
177
+ {%- capture social_url %}"https://keybase.io/{{ social[1] }}"{% endcapture -%}
178
+ {%- when "lastfm_id" -%}
179
+ {%- assign social_id = "social-lastfm" -%}
180
+ {%- assign social_title = "Last FM" -%}
181
+ {%- capture social_url %}"https://www.last.fm/user/{{ social[1] }}"{% endcapture -%}
182
+ {%- when "lattes_id" -%}
183
+ {%- assign social_id = "social-lattes" -%}
184
+ {%- assign social_title = "Lattes" -%}
185
+ {%- capture social_url %}"http://lattes.cnpq.br/{{ social[1] }}"{% endcapture -%}
186
+ {%- when "leetcode_id" -%}
187
+ {%- assign social_id = "social-leetcode" -%}
188
+ {%- assign social_title = "LeetCode" -%}
189
+ {%- capture social_url %}"https://leetcode.com/u/{{ social[1] }}/"{% endcapture -%}
190
+ {%- when "linkedin_username" -%}
191
+ {%- assign social_id = "social-linkedin" -%}
192
+ {%- assign social_title = "LinkedIn" -%}
193
+ {%- capture social_url %}"https://www.linkedin.com/in/{{ social[1] }}"{% endcapture -%}
194
+ {%- when "mastodon_username" -%}
195
+ {%- assign social_id = "social-mastodon" -%}
196
+ {%- assign social_title = "Mastodon" -%}
197
+ {%- capture social_url %}"https://{{ social[1] }}"{% endcapture -%}
198
+ {%- when "medium_username" -%}
199
+ {%- assign social_id = "social-medium" -%}
200
+ {%- assign social_title = "Medium" -%}
201
+ {%- capture social_url %}"https://medium.com/@{{ social[1] }}"{% endcapture -%}
202
+ {%- when "orcid_id" -%}
203
+ {%- assign social_id = "social-orcid" -%}
204
+ {%- assign social_title = "ORCID" -%}
205
+ {%- capture social_url %}"https://orcid.org/{{ social[1] }}"{% endcapture -%}
206
+ {%- when "osf_id" -%}
207
+ {%- assign social_id = "social-osf" -%}
208
+ {%- assign social_title = "Open Science Framework" -%}
209
+ {%- capture social_url %}"https://osf.io/{{ social[1] }}/"{% endcapture -%}
210
+ {%- when "pinterest_id" -%}
211
+ {%- assign social_id = "social-pinterest" -%}
212
+ {%- assign social_title = "Pinterest" -%}
213
+ {%- capture social_url %}"https://www.pinterest.com/{{ social[1] }}"{% endcapture -%}
214
+ {%- when "publons_id" -%}
215
+ {%- assign social_id = "social-publons" -%}
216
+ {%- assign social_title = "Publons" -%}
217
+ {%- capture social_url %}"https://publons.com/a/{{ social[1] }}/"{% endcapture -%}
218
+ {%- when "quora_username" -%}
219
+ {%- assign social_id = "social-quora" -%}
220
+ {%- assign social_title = "Quora" -%}
221
+ {%- capture social_url %}"https://www.quora.com/profile/{{ social[1] }}"{% endcapture -%}
222
+ {%- when "research_gate_profile" -%}
223
+ {%- assign social_id = "social-researchgate" -%}
224
+ {%- assign social_title = "ResearchGate" -%}
225
+ {%- capture social_url %}"https://www.researchgate.net/profile/{{ social[1] }}/"{% endcapture -%}
226
+ {%- when "rss_icon" -%}
227
+ {%- assign social_id = "social-rss" -%}
228
+ {%- assign social_title = "RSS Feed" -%}
229
+ {%- capture social_url %}"{{ site.baseurl }}/feed.xml"{% endcapture -%}
230
+ {%- when "scholar_userid" -%}
231
+ {%- assign social_id = "social-scholar" -%}
232
+ {%- assign social_title = "Google Scholar" -%}
233
+ {%- capture social_url %}"https://scholar.google.com/citations?user={{ social[1] }}"{% endcapture -%}
234
+ {%- when "scopus_id" -%}
235
+ {%- assign social_id = "social-scopus" -%}
236
+ {%- assign social_title = "Scopus" -%}
237
+ {%- capture social_url %}"https://www.scopus.com/authid/detail.uri?authorId={{ social[1] }}"{% endcapture -%}
238
+ {%- when "semanticscholar_id" -%}
239
+ {%- assign social_id = "social-semanticscholar" -%}
240
+ {%- assign social_title = "Semantic Scholar" -%}
241
+ {%- capture social_url %}"https://www.semanticscholar.org/author/{{ social[1] }}"{% endcapture -%}
242
+ {%- when "spotify_id" -%}
243
+ {%- assign social_id = "social-spotify" -%}
244
+ {%- assign social_title = "Spotify" -%}
245
+ {%- capture social_url %}"https://open.spotify.com/user/{{ social[1] }}"{% endcapture -%}
246
+ {%- when "stackoverflow_id" -%}
247
+ {%- assign social_id = "social-stackoverflow" -%}
248
+ {%- assign social_title = "Stackoverflow" -%}
249
+ {%- capture social_url %}"https://stackoverflow.com/users/{{ social[1] }}"{% endcapture -%}
250
+ {%- when "strava_userid" -%}
251
+ {%- assign social_id = "social-strava" -%}
252
+ {%- assign social_title = "Strava" -%}
253
+ {%- capture social_url %}"https://www.strava.com/athletes/{{ social[1] }}"{% endcapture -%}
254
+ {%- when "telegram_username" -%}
255
+ {%- assign social_id = "social-telegram" -%}
256
+ {%- assign social_title = "telegram" -%}
257
+ {%- capture social_url %}"https://telegram.me/{{ social[1] }}"{% endcapture -%}
258
+ {%- when "unsplash_id" -%}
259
+ {%- assign social_id = "social-unsplash" -%}
260
+ {%- assign social_title = "Unsplash" -%}
261
+ {%- capture social_url %}"https://unsplash.com/@{{ social[1] }}"{% endcapture -%}
262
+ {%- comment -%}
263
+ // check how to add wechat qr code
264
+ {%- when "wechat_qr" -%}
265
+ {%- assign social_id = "social-wechat" -%}
266
+ {%- assign social_title = "WeChat" -%}
267
+ {%- capture social_url %}"https://wechat.com/{{ social[1] }}"{% endcapture -%}
268
+ {%- endcomment -%}
269
+ {%- when "whatsapp_number" -%}
270
+ {%- assign social_id = "social-whatsapp" -%}
271
+ {%- assign social_title = "whatsapp" -%}
272
+ {%- capture social_url %}"https://wa.me/{{ social[1] }}"{% endcapture -%}
273
+ {%- when "wikidata_id" -%}
274
+ {%- assign social_id = "social-wikidata" -%}
275
+ {%- assign social_title = "Wikidata" -%}
276
+ {%- capture social_url %}"https://www.wikidata.org/wiki/{{ social[1] }}"{% endcapture -%}
277
+ {%- when "wikipedia_id" -%}
278
+ {%- assign social_id = "social-wikipedia" -%}
279
+ {%- assign social_title = "Wikipedia" -%}
280
+ {%- capture social_url %}"https://wikipedia.org/wiki/User:{{ social[1] }}"{% endcapture -%}
281
+ {%- when "work_url" -%}
282
+ {%- assign social_id = "social-work" -%}
283
+ {%- assign social_title = "Work" -%}
284
+ {%- capture social_url %}"{{ social[1] }}"{% endcapture -%}
285
+ {%- when "x_username" -%}
286
+ {%- assign social_id = "social-x" -%}
287
+ {%- assign social_title = "X" -%}
288
+ {%- capture social_url %}"https://twitter.com/{{ social[1] }}"{% endcapture -%}
289
+ {%- when "youtube_id" -%}
290
+ {%- assign social_id = "social-youtube" -%}
291
+ {%- assign social_title = "YouTube" -%}
292
+ {%- capture social_url %}"https://youtube.com/@{{ social[1] }}"{% endcapture -%}
293
+ {%- when "zotero_username" -%}
294
+ {%- assign social_id = "social-zotero" -%}
295
+ {%- assign social_title = "Zotero" -%}
296
+ {%- capture social_url %}"https://www.zotero.org/{{ social[1] }}"{% endcapture -%}
297
+ {%- else -%}
298
+ {%- assign social_id = "social-" | append: social[0] -%}
299
+ {%- assign social_title = social[0] | capitalize -%}
300
+ {%- capture social_url %}"{{ social[1].url }}"{% endcapture -%}
301
+ {%- endcase -%}
302
+ {
303
+ id: '{{ social_id }}',
304
+ title: '{{ social_title }}',
305
+ section: 'Socials',
306
+ handler: () => {
307
+ window.open({{ social_url }}, "_blank");
308
+ },
309
+ },
310
+ {%- endfor -%}
311
+ {%- endif -%}
312
+ {%- if site.enable_darkmode -%}
313
+ {
314
+ id: 'light-theme',
315
+ title: 'Change theme to light',
316
+ description: 'Change the theme of the site to Light',
317
+ section: 'Theme',
318
+ handler: () => {
319
+ setThemeSetting("light");
320
+ },
321
+ },
322
+ {
323
+ id: 'dark-theme',
324
+ title: 'Change theme to dark',
325
+ description: 'Change the theme of the site to Dark',
326
+ section: 'Theme',
327
+ handler: () => {
328
+ setThemeSetting("dark");
329
+ },
330
+ },
331
+ {
332
+ id: 'system-theme',
333
+ title: 'Use system default theme',
334
+ description: 'Change the theme of the site to System Default',
335
+ section: 'Theme',
336
+ handler: () => {
337
+ setThemeSetting("system");
338
+ },
339
+ },
340
+ {%- endif -%}
341
+ ];
@@ -0,0 +1,3 @@
1
+ <div class="publications">
2
+ {% bibliography --group_by none --query @*[selected=true]* %}
3
+ </div>
@@ -0,0 +1,31 @@
1
+ {%- assign current_lang = page.lang | default: site.default_lang | default: site.lang -%}
2
+ {%- assign default_lang = site.default_lang | default: site.lang -%}
3
+ {%- assign keys = include.key | split: '.' -%}
4
+
5
+ {%- assign value = site.data.i18n[current_lang] -%}
6
+ {%- for key in keys -%}
7
+ {%- if value and value[key] != nil -%}
8
+ {%- assign value = value[key] -%}
9
+ {%- else -%}
10
+ {%- assign value = nil -%}
11
+ {%- break -%}
12
+ {%- endif -%}
13
+ {%- endfor -%}
14
+
15
+ {%- if value == nil -%}
16
+ {%- assign value = site.data.i18n[default_lang] -%}
17
+ {%- for key in keys -%}
18
+ {%- if value and value[key] != nil -%}
19
+ {%- assign value = value[key] -%}
20
+ {%- else -%}
21
+ {%- assign value = nil -%}
22
+ {%- break -%}
23
+ {%- endif -%}
24
+ {%- endfor -%}
25
+ {%- endif -%}
26
+
27
+ {%- if value == nil -%}
28
+ {{- include.default | default: include.key -}}
29
+ {%- else -%}
30
+ {{- value -}}
31
+ {%- endif -%}
@@ -0,0 +1,172 @@
1
+ {%- comment -%}
2
+ CUSTOM: Team grid (Bootstrap cards), fed by _data/team.yml or include.members
3
+ {%- endcomment -%}
4
+
5
+ {%- assign team_members = include.members | default: site.data.team -%}
6
+
7
+ <div class="team-grid row row-cols-1 row-cols-sm-2 row-cols-lg-3 g-4{% if include.class %} {{ include.class }}{% endif %}">
8
+ {%- for member in team_members -%}
9
+ {%- assign member_name = member.name | default: member -%}
10
+ {%- assign full_name = member_name -%}
11
+ {%- if member.lastname -%}
12
+ {%- assign full_name = member.name | append: ' ' | append: member.lastname -%}
13
+ {%- endif -%}
14
+ {%- assign pic = member.photo | default: member.pic | default: 'user-placeholder.png' -%}
15
+ {%- if pic contains '/' or pic contains '://' -%}
16
+ {%- assign img_path = pic -%}
17
+ {%- else -%}
18
+ {%- assign img_path = 'assets/img/team/' | append: pic -%}
19
+ {%- endif -%}
20
+ {%- assign member_position = member.position | default: member.role -%}
21
+ {%- assign member_organization = member.organization | default: member.affiliation -%}
22
+ {%- assign member_department = member.department -%}
23
+
24
+ <div class="col">
25
+ <div class="card hoverable">
26
+ <div class="card-body text-center">
27
+
28
+ {%
29
+ include figure.liquid
30
+ path=img_path
31
+ alt=full_name
32
+ class="rounded-circle team-photo"
33
+ loading="lazy"
34
+ sizes="160px"
35
+ %}
36
+
37
+ <h5 class="card-title mt-3 mb-1">{{ full_name }}</h5>
38
+
39
+ {%- if member_position -%}
40
+ <div class="team-position">{{ member_position }}</div>
41
+ {%- endif -%}
42
+
43
+ {%- if member_organization -%}
44
+ <div class="team-org mt-2"><strong>{{ member_organization }}</strong></div>
45
+ {%- endif -%}
46
+
47
+ {%- if member_department -%}
48
+ <div class="team-dept"><em>{{ member_department }}</em></div>
49
+ {%- endif -%}
50
+
51
+ {%- comment -%}
52
+ {%- if member.keywords -%}
53
+ <div class="team-keywords mt-3">
54
+ <span class="team-keywords-label">Keywords:</span>
55
+ {%- for keyword in member.keywords -%}
56
+ <code class="team-keyword">{{ keyword | strip }}</code>
57
+ {%- endfor -%}
58
+ </div>
59
+ {%- endif -%}
60
+ {%- endcomment -%}
61
+
62
+
63
+ {%- assign has_email = member.email -%}
64
+ {%- assign has_social = member.social and member.social.size > 0 -%}
65
+ {%- assign has_url = member.url -%}
66
+ {%- assign has_orcid = member.orcid -%}
67
+ {%- assign has_google_scholar = member.google_scholar | default: member.scholar_userid -%}
68
+ {%- assign has_linkedin = member.linkedin -%}
69
+
70
+ {%- if has_email or has_url or has_orcid or has_google_scholar or has_linkedin or has_social -%}
71
+ <ul class="team-icons mt-3">
72
+ {%- if has_email -%}
73
+ {%- if member.email.first.url -%}
74
+ {%- for item in member.email -%}
75
+ <li>
76
+ <a href="mailto:{{ item.url }}" title="{{ item.title | default: 'E-mail' }}" aria-label="{{ item.title | default: 'E-mail' }}">
77
+ <i class="{{ item.class | default: 'fa-solid fa-envelope fa-2x' }}"></i>
78
+ </a>
79
+ </li>
80
+ {%- endfor -%}
81
+ {%- else -%}
82
+ <li>
83
+ <a href="mailto:{{ member.email }}" title="E-mail" aria-label="E-mail">
84
+ <i class="fa-solid fa-envelope fa-2x"></i>
85
+ </a>
86
+ </li>
87
+ {%- endif -%}
88
+ {%- endif -%}
89
+
90
+ {%- if has_url -%}
91
+ <li>
92
+ <a href="{{ member.url }}" target="_blank" rel="noopener" title="{{ member.url_label | default: 'Web' }}" aria-label="{{ member.url_label | default: 'Web' }}">
93
+ <i class="fa-solid fa-globe fa-2x"></i>
94
+ </a>
95
+ </li>
96
+ {%- endif -%}
97
+
98
+ {%- if has_orcid -%}
99
+ {%- if has_orcid contains '://' -%}
100
+ {%- assign orcid_url = has_orcid -%}
101
+ {%- else -%}
102
+ {%- assign orcid_url = 'https://orcid.org/' | append: has_orcid -%}
103
+ {%- endif -%}
104
+ <li>
105
+ <a href="{{ orcid_url }}" target="_blank" rel="noopener" title="ORCID" aria-label="ORCID">
106
+ <i class="ai ai-orcid ai-2x"></i>
107
+ </a>
108
+ </li>
109
+ {%- endif -%}
110
+
111
+ {%- if has_google_scholar -%}
112
+ {%- if has_google_scholar contains '://' -%}
113
+ {%- assign google_scholar_url = has_google_scholar -%}
114
+ {%- else -%}
115
+ {%- assign google_scholar_url = 'https://scholar.google.com/citations?user=' | append: has_google_scholar -%}
116
+ {%- endif -%}
117
+ <li>
118
+ <a href="{{ google_scholar_url }}" target="_blank" rel="noopener" title="Google Scholar" aria-label="Google Scholar">
119
+ <i class="ai ai-google-scholar ai-2x"></i>
120
+ </a>
121
+ </li>
122
+ {%- endif -%}
123
+
124
+ {%- if has_linkedin -%}
125
+ {%- if has_linkedin contains '://' -%}
126
+ {%- assign linkedin_url = has_linkedin -%}
127
+ {%- else -%}
128
+ {%- assign linkedin_url = 'https://www.linkedin.com/in/' | append: has_linkedin -%}
129
+ {%- endif -%}
130
+ <li>
131
+ <a href="{{ linkedin_url }}" target="_blank" rel="noopener" title="LinkedIn" aria-label="LinkedIn">
132
+ <i class="fa-brands fa-linkedin fa-2x"></i>
133
+ </a>
134
+ </li>
135
+ {%- endif -%}
136
+
137
+ {%- if has_social -%}
138
+ {%- unless has_orcid -%}
139
+ {%- for item in member.social -%}
140
+ {%- assign social_title = item.title | default: '' | downcase -%}
141
+ {%- if social_title contains 'orcid' -%}
142
+ <li>
143
+ <a href="{{ item.url }}" target="_blank" rel="noopener" title="{{ item.title }}" aria-label="{{ item.title }}">
144
+ <i class="{{ item.class }}"></i>
145
+ </a>
146
+ </li>
147
+ {%- endif -%}
148
+ {%- endfor -%}
149
+ {%- endunless -%}
150
+ {%- for item in member.social -%}
151
+ {%- assign social_title = item.title | default: '' | downcase -%}
152
+ {%- assign skip_social = false -%}
153
+ {%- if social_title contains 'orcid' -%}{%- assign skip_social = true -%}{%- endif -%}
154
+ {%- if has_google_scholar and social_title contains 'google scholar' -%}{%- assign skip_social = true -%}{%- endif -%}
155
+ {%- if has_linkedin and social_title contains 'linkedin' -%}{%- assign skip_social = true -%}{%- endif -%}
156
+ {%- unless skip_social -%}
157
+ <li>
158
+ <a href="{{ item.url }}" target="_blank" rel="noopener" title="{{ item.title }}" aria-label="{{ item.title }}">
159
+ <i class="{{ item.class }}"></i>
160
+ </a>
161
+ </li>
162
+ {%- endunless -%}
163
+ {%- endfor -%}
164
+ {%- endif -%}
165
+ </ul>
166
+ {%- endif -%}
167
+
168
+ </div>
169
+ </div>
170
+ </div>
171
+ {%- endfor -%}
172
+ </div>
@@ -0,0 +1,97 @@
1
+ {% assign extension = include.path | split: '.' | last %}
2
+
3
+ <figure>
4
+ {% if extension == 'mp4' or extension == 'webm' or extension == 'ogg' %}
5
+ <video
6
+ src="{% if include.cache_bust %}{{ include.path | relative_url | bust_file_cache }}{% else %}{{ include.path | relative_url }}{% endif %}"
7
+ {% if include.class %}
8
+ class="{{ include.class }}"
9
+ {% endif %}
10
+ {% if include.width %}
11
+ width="{{ include.width }}"
12
+ {% else %}
13
+ width="auto"
14
+ {% endif %}
15
+ {% if include.height %}
16
+ height="{{ include.height }}"
17
+ {% else %}
18
+ height="auto"
19
+ {% endif %}
20
+ {% if include['min-width'] %}
21
+ min-width="{{ include.min-width }}"
22
+ {% endif %}
23
+ {% if include['min-height'] %}
24
+ min-height="{{ include.min-height }}"
25
+ {% endif %}
26
+ {% if include['max-width'] %}
27
+ max-width="{{ include.max-width }}"
28
+ {% endif %}
29
+ {% if include['max-height'] %}
30
+ height="{{ include.max-height }}"
31
+ {% endif %}
32
+ {% if include.title %}
33
+ title="{{ include.title }}"
34
+ {% endif %}
35
+ {% if include.alt %}
36
+ alt="{{ include.alt }}"
37
+ {% endif %}
38
+ {% if include.autoplay %}
39
+ autoplay
40
+ {% endif %}
41
+ {% if include.controls %}
42
+ controls
43
+ {% endif %}
44
+ {% if include.loop %}
45
+ loop
46
+ {% endif %}
47
+ {% if include.muted %}
48
+ muted
49
+ {% endif %}
50
+ {% if include.poster %}
51
+ poster="{{ include.poster }}"
52
+ {% endif %}
53
+ />
54
+
55
+ {% else %}
56
+ <iframe
57
+ src="{{ include.path }}"
58
+ {% if include.class %}
59
+ class="{{ include.class }}"
60
+ {% endif %}
61
+ frameborder="0"
62
+ allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
63
+ allowfullscreen
64
+ {% if include.width %}
65
+ width="{{ include.width }}"
66
+ {% else %}
67
+ width="auto"
68
+ {% endif %}
69
+ {% if include.height %}
70
+ height="{{ include.height }}"
71
+ {% else %}
72
+ height="auto"
73
+ {% endif %}
74
+ {% if include['min-width'] %}
75
+ min-width="{{ include.min-width }}"
76
+ {% endif %}
77
+ {% if include['min-height'] %}
78
+ min-height="{{ include.min-height }}"
79
+ {% endif %}
80
+ {% if include['max-width'] %}
81
+ max-width="{{ include.max-width }}"
82
+ {% endif %}
83
+ {% if include['max-height'] %}
84
+ height="{{ include.max-height }}"
85
+ {% endif %}
86
+ {% if include.alt %}
87
+ alt="{{ include.alt }}"
88
+ {% endif %}
89
+ {% if include.title %}
90
+ title="{{ include.title }}"
91
+ {% endif %}
92
+ />
93
+ {% endif %}
94
+ {% if include.caption %}
95
+ <figcaption class="caption">{{ include.caption }}</figcaption>
96
+ {% endif %}
97
+ </figure>