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,22 @@
1
+ {% if paginator.total_pages > 1 %}
2
+ {% capture blog_navigation_text %}{% include t.liquid key='pagination.blog_navigation' default='Blog page navigation' %}{% endcapture %}
3
+ <nav aria-label="{{ blog_navigation_text | strip }}">
4
+ <ul class="pagination pagination-lg justify-content-center">
5
+ <li class="page-item {% unless paginator.previous_page %}disabled{% endunless %}">
6
+ <a class="page-link" href="{{ paginator.previous_page_path | relative_url }}" tabindex="-1" aria-disabled="{{ paginator.previous_page }}"
7
+ >&lt;</a
8
+ >
9
+ </li>
10
+ {% if paginator.page_trail %}
11
+ {% for trail in paginator.page_trail %}
12
+ <li class="page-item {% if page.url == trail.path %}active{% endif %}">
13
+ <a class="page-link" href="{{ trail.path | relative_url | remove: 'index.html' }}" title="{{ trail.title }}">{{ trail.num }}</a>
14
+ </li>
15
+ {% endfor %}
16
+ {% endif %}
17
+ <li class="page-item {% unless paginator.next_page %}disabled{% endunless %}">
18
+ <a class="page-link" href="{{ paginator.next_page_path | relative_url }}">&gt;</a>
19
+ </li>
20
+ </ul>
21
+ </nav>
22
+ {% endif %}
@@ -0,0 +1,29 @@
1
+ {% assign reading_time_item = include.item | default: page %}
2
+ {% if reading_time_item.reading_time != false %}
3
+ {% assign configured_minutes = reading_time_item.reading_time_minutes | default: reading_time_item.reading_minutes %}
4
+ {% if configured_minutes %}
5
+ {% assign reading_minutes = configured_minutes | plus: 0 %}
6
+ {% else %}
7
+ {% assign reading_time_source = include.content | default: reading_time_item.content | default: content %}
8
+ {% assign reading_words = reading_time_source | strip_html | strip_newlines | number_of_words %}
9
+ {% assign words_per_minute = site.reading_time.words_per_minute | default: site.words_per_minute | default: 200 | plus: 0 %}
10
+ {% if words_per_minute <= 0 %}
11
+ {% assign words_per_minute = 200 %}
12
+ {% endif %}
13
+ {% assign reading_minutes = reading_words | divided_by: words_per_minute %}
14
+ {% assign reading_remainder = reading_words | modulo: words_per_minute %}
15
+ {% if reading_remainder > 0 %}
16
+ {% assign reading_minutes = reading_minutes | plus: 1 %}
17
+ {% endif %}
18
+ {% endif %}
19
+ {% if reading_minutes < 1 %}
20
+ {% assign reading_minutes = 1 %}
21
+ {% endif %}
22
+ {% capture reading_time_label %}{% include t.liquid key='post.reading_time' default='Reading time' %}{% endcapture %}
23
+ {% capture reading_time_unit %}{% include t.liquid key='post.reading_time_minutes' default='min read' %}{% endcapture %}
24
+ <span class="post-reading-time" title="{{ reading_time_label | strip }}">
25
+ <i class="fa-regular fa-clock fa-sm" aria-hidden="true"></i>
26
+ <span class="sr-only">{{ reading_time_label | strip }}:</span>
27
+ {{ reading_minutes }} {{ reading_time_unit | strip }}
28
+ </span>
29
+ {% endif %}
@@ -0,0 +1,37 @@
1
+ {% assign items = include.items %}
2
+ {% assign current_url = include.current_url | default: page.url %}
3
+ {% assign previous_item = nil %}
4
+ {% assign next_item = nil %}
5
+ {% assign current_seen = false %}
6
+ {% for item in items %}
7
+ {% if current_seen and next_item == nil %}
8
+ {% assign next_item = item %}
9
+ {% endif %}
10
+ {% if item.url == current_url %}
11
+ {% assign current_seen = true %}
12
+ {% elsif current_seen == false %}
13
+ {% assign previous_item = item %}
14
+ {% endif %}
15
+ {% endfor %}
16
+ {% capture previous_text %}{% include t.liquid key='navigation.previous' default='Previous' %}{% endcapture %}
17
+ {% capture next_text %}{% include t.liquid key='navigation.next' default='Next' %}{% endcapture %}
18
+ {% assign aria_label = include.aria_label | default: 'Page navigation' %}
19
+
20
+ {% if previous_item or next_item %}
21
+ <nav class="previous-next-nav{% if include.class %} {{ include.class }}{% endif %}" aria-label="{{ aria_label | escape }}">
22
+ {% if previous_item %}
23
+ <a class="previous-next-link previous" href="{{ previous_item.url | relative_url }}">
24
+ <span>{{ previous_text | strip }}</span>
25
+ <strong>{{ previous_item.nav_title | default: previous_item.title }}</strong>
26
+ </a>
27
+ {% else %}
28
+ <span></span>
29
+ {% endif %}
30
+ {% if next_item %}
31
+ <a class="previous-next-link next" href="{{ next_item.url | relative_url }}">
32
+ <span>{{ next_text | strip }}</span>
33
+ <strong>{{ next_item.nav_title | default: next_item.title }}</strong>
34
+ </a>
35
+ {% endif %}
36
+ </nav>
37
+ {% endif %}
@@ -0,0 +1,49 @@
1
+ {% assign author = include.author | default: site.author %}
2
+ {% assign current_lang = page.lang | default: site.default_lang | default: site.lang %}
3
+
4
+ {% if author %}
5
+ {% assign name_key = 'name_' | append: current_lang %}
6
+ {% assign bio_key = 'bio_' | append: current_lang %}
7
+ {% assign affiliation_key = 'affiliation_' | append: current_lang %}
8
+ {% assign location_key = 'location_' | append: current_lang %}
9
+ {% assign author_name = author[name_key] | default: author.name %}
10
+ {% assign author_bio = author[bio_key] | default: author.bio %}
11
+ {% assign author_affiliation = author[affiliation_key] | default: author.affiliation %}
12
+ {% assign author_location = author[location_key] | default: author.location %}
13
+ {% capture profile_email_text %}{% include t.liquid key='profile.email' default='Email' %}{% endcapture %}
14
+ {% capture profile_website_text %}{% include t.liquid key='profile.website' default='Website' %}{% endcapture %}
15
+ {% capture profile_location_text %}{% include t.liquid key='profile.location' default='Location' %}{% endcapture %}
16
+
17
+ <aside class="profile-card" itemscope itemtype="https://schema.org/Person">
18
+ {% assign profile_avatar = author.avatar | default: 'profile-placeholder.svg' %}
19
+ {% if profile_avatar contains '://' %}
20
+ {% assign avatar_src = profile_avatar %}
21
+ {% elsif profile_avatar contains '/' %}
22
+ {% assign avatar_src = profile_avatar | relative_url %}
23
+ {% else %}
24
+ {% assign avatar_src = profile_avatar | prepend: '/assets/img/' | relative_url %}
25
+ {% endif %}
26
+ <img class="profile-card-avatar" src="{{ avatar_src }}" alt="{{ author_name | default: site.title | escape }}" itemprop="image">
27
+
28
+ <div class="profile-card-body">
29
+ {% if author_name %}<h2 class="profile-card-name" itemprop="name">{{ author_name }}</h2>{% endif %}
30
+ {% if author_bio %}<p class="profile-card-bio" itemprop="description">{{ author_bio }}</p>{% endif %}
31
+ {% if author_affiliation %}<p class="profile-card-affiliation">{{ author_affiliation }}</p>{% endif %}
32
+ {% if author_location %}<p class="profile-card-meta"><i class="fa-solid fa-location-dot" aria-hidden="true"></i><span class="sr-only">{{ profile_location_text | strip }}:</span> {{ author_location }}</p>{% endif %}
33
+ </div>
34
+
35
+ <ul class="profile-card-links" aria-label="Profile links">
36
+ {% if author.email %}<li><a href="mailto:{{ author.email }}" aria-label="{{ profile_email_text | strip }}"><i class="fa-solid fa-envelope" aria-hidden="true"></i><span>{{ profile_email_text | strip }}</span></a></li>{% endif %}
37
+ {% if author.uri %}<li><a href="{{ author.uri }}" aria-label="{{ profile_website_text | strip }}"><i class="fa-solid fa-globe" aria-hidden="true"></i><span>{{ profile_website_text | strip }}</span></a></li>{% endif %}
38
+ {% if author.orcid %}<li><a href="https://orcid.org/{{ author.orcid }}" aria-label="ORCID"><i class="ai ai-orcid" aria-hidden="true"></i><span>ORCID</span></a></li>{% endif %}
39
+ {% if author.google_scholar %}<li><a href="https://scholar.google.com/citations?user={{ author.google_scholar }}" aria-label="Google Scholar"><i class="ai ai-google-scholar" aria-hidden="true"></i><span>Google Scholar</span></a></li>{% endif %}
40
+ {% if author.research_gate %}<li><a href="https://www.researchgate.net/profile/{{ author.research_gate }}" aria-label="ResearchGate"><i class="ai ai-researchgate" aria-hidden="true"></i><span>ResearchGate</span></a></li>{% endif %}
41
+ {% if author.researcherid %}<li><a href="https://www.webofscience.com/wos/author/record/{{ author.researcherid }}" aria-label="ResearcherID"><i class="fa-solid fa-id-badge" aria-hidden="true"></i><span>ResearcherID</span></a></li>{% endif %}
42
+ {% if author.github %}<li><a href="https://github.com/{{ author.github }}" aria-label="GitHub"><i class="fa-brands fa-github" aria-hidden="true"></i><span>GitHub</span></a></li>{% endif %}
43
+ {% if author.linkedin %}<li><a href="https://www.linkedin.com/in/{{ author.linkedin }}" aria-label="LinkedIn"><i class="fa-brands fa-linkedin" aria-hidden="true"></i><span>LinkedIn</span></a></li>{% endif %}
44
+ {% if author.bluesky %}<li><a href="{{ author.bluesky }}" aria-label="Bluesky"><i class="fa-brands fa-bluesky" aria-hidden="true"></i><span>Bluesky</span></a></li>{% endif %}
45
+ {% if author.mastodon %}<li><a href="{{ author.mastodon }}" aria-label="Mastodon"><i class="fa-brands fa-mastodon" aria-hidden="true"></i><span>Mastodon</span></a></li>{% endif %}
46
+ {% if author.x %}<li><a href="https://x.com/{{ author.x }}" aria-label="X"><i class="fa-brands fa-x-twitter" aria-hidden="true"></i><span>X</span></a></li>{% endif %}
47
+ </ul>
48
+ </aside>
49
+ {% endif %}
@@ -0,0 +1,75 @@
1
+ {% assign matrix = include.matrix | default: page.profile_feature_matrix %}
2
+ {% assign profiles = matrix.profiles %}
3
+ {% assign rows = matrix.rows %}
4
+ {% if matrix and profiles and rows %}
5
+ <div class="profile-feature-matrix-legend">
6
+ {% if matrix.legend %}
7
+ <p>{{ matrix.legend }}</p>
8
+ {% endif %}
9
+ {% assign legend_statuses = 'yes,config,no' | split: ',' %}
10
+ <ul class="profile-feature-matrix-key" aria-label="{{ matrix.legend_label | default: 'Legend' }}">
11
+ {% for status in legend_statuses %}
12
+ {% assign status_label = matrix.labels[status] | default: status %}
13
+ <li class="profile-feature-matrix-key-item">
14
+ <span class="profile-feature-status profile-feature-status-{{ status | slugify }}">
15
+ {% case status %}
16
+ {% when 'yes' %}
17
+ <span aria-hidden="true">&#10003;</span>
18
+ {% when 'config' %}
19
+ <span aria-hidden="true">&ndash;</span>
20
+ {% else %}
21
+ <span aria-hidden="true">&times;</span>
22
+ {% endcase %}
23
+ </span>
24
+ <span class="profile-feature-matrix-key-label">{{ status_label }}</span>
25
+ </li>
26
+ {% endfor %}
27
+ </ul>
28
+ </div>
29
+ <div class="profile-feature-matrix-wrapper">
30
+ <table class="profile-feature-matrix">
31
+ <thead>
32
+ <tr>
33
+ <th scope="col">{{ matrix.feature_label | default: 'Feature' }}</th>
34
+ {% for profile in profiles %}
35
+ <th scope="col">{{ profile.label }}</th>
36
+ {% endfor %}
37
+ </tr>
38
+ </thead>
39
+ <tbody>
40
+ {% for row in rows %}
41
+ <tr>
42
+ <th scope="row">
43
+ {% if row.url %}
44
+ <a href="{{ row.url | relative_url }}">{{ row.label }}</a>
45
+ {% else %}
46
+ {{ row.label }}
47
+ {% endif %}
48
+ </th>
49
+ {% for profile in profiles %}
50
+ {% assign raw_status = row[profile.key] | default: 'no' %}
51
+ {% if raw_status == true %}
52
+ {% assign status = 'yes' %}
53
+ {% elsif raw_status == false %}
54
+ {% assign status = 'no' %}
55
+ {% else %}
56
+ {% assign status = raw_status %}
57
+ {% endif %}
58
+ {% assign status_label = matrix.labels[status] | default: status %}
59
+ <td class="profile-feature-status profile-feature-status-{{ status | slugify }}">
60
+ {% case status %}
61
+ {% when 'yes' %}
62
+ <span aria-label="{{ status_label }}" title="{{ status_label }}">&#10003;</span>
63
+ {% when 'config' %}
64
+ <span aria-label="{{ status_label }}" title="{{ status_label }}">&ndash;</span>
65
+ {% else %}
66
+ <span aria-label="{{ status_label }}" title="{{ status_label }}">&times;</span>
67
+ {% endcase %}
68
+ </td>
69
+ {% endfor %}
70
+ </tr>
71
+ {% endfor %}
72
+ </tbody>
73
+ </table>
74
+ </div>
75
+ {% endif %}
@@ -0,0 +1,122 @@
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 news_limit = include.news_limit | default: 3 %}
4
+ {% assign posts_limit = include.posts_limit | default: 3 %}
5
+ {% assign projects_limit = include.projects_limit | default: 2 %}
6
+
7
+ {% capture recent_news_text %}{% include t.liquid key='profile.recent_news' default='Recent news' %}{% endcapture %}
8
+ {% capture selected_publications_text %}{% include t.liquid key='profile.selected_publications' default='Selected publications' %}{% endcapture %}
9
+ {% capture active_projects_text %}{% include t.liquid key='profile.active_projects' default='Active projects' %}{% endcapture %}
10
+ {% capture recent_posts_text %}{% include t.liquid key='profile.recent_posts' default='Recent posts' %}{% endcapture %}
11
+ {% capture view_all_news_text %}{% include t.liquid key='profile.view_all_news' default='All news' %}{% endcapture %}
12
+ {% capture view_all_publications_text %}{% include t.liquid key='profile.view_all_publications' default='All publications' %}{% endcapture %}
13
+ {% capture view_all_projects_text %}{% include t.liquid key='profile.view_all_projects' default='All projects' %}{% endcapture %}
14
+ {% capture view_all_posts_text %}{% include t.liquid key='profile.view_all_posts' default='All posts' %}{% endcapture %}
15
+
16
+ {% assign news_page = site.pages | where: 'ref', 'news' | where: 'lang', current_lang | first %}
17
+ {% assign publications_page = site.pages | where: 'ref', 'publications' | where: 'lang', current_lang | first %}
18
+ {% assign projects_page = site.pages | where: 'ref', 'projects' | where: 'lang', current_lang | first %}
19
+ {% assign blog_page = site.pages | where: 'ref', 'blog' | where: 'lang', current_lang | first %}
20
+
21
+ {% assign localized_news = site.news | where: 'lang', current_lang %}
22
+ {% if localized_news.size == 0 and current_lang != default_lang %}
23
+ {% assign localized_news = site.news | where: 'lang', default_lang %}
24
+ {% endif %}
25
+ {% if current_lang == default_lang %}
26
+ {% assign fallback_news = site.news | where_exp: 'item', 'item.lang == nil' %}
27
+ {% assign localized_news = localized_news | concat: fallback_news %}
28
+ {% endif %}
29
+ {% assign latest_news = localized_news | sort: 'date' | reverse %}
30
+
31
+ {% assign sorted_projects = site.projects | sort: 'importance' %}
32
+ {% assign localized_projects = sorted_projects | where: 'lang', current_lang %}
33
+ {% assign neutral_projects = sorted_projects | where_exp: 'item', 'item.lang == nil or item.lang == ""' %}
34
+ {% assign visible_projects = localized_projects | concat: neutral_projects %}
35
+ {% if current_lang != default_lang and visible_projects.size == neutral_projects.size %}
36
+ {% assign default_projects = sorted_projects | where: 'lang', default_lang %}
37
+ {% assign visible_projects = default_projects | concat: neutral_projects %}
38
+ {% endif %}
39
+ {% assign visible_projects = visible_projects | sort: 'importance' %}
40
+ {% assign visible_project_count = visible_projects | size %}
41
+ {% assign localized_posts = site.posts | where: 'lang', current_lang %}
42
+ {% assign fallback_posts = site.posts | where_exp: 'post', 'post.lang == nil' %}
43
+ {% assign localized_posts = localized_posts | concat: fallback_posts %}
44
+ {% if current_lang != default_lang and localized_posts.size == fallback_posts.size %}
45
+ {% assign default_lang_posts = site.posts | where: 'lang', default_lang %}
46
+ {% assign localized_posts = default_lang_posts | concat: fallback_posts %}
47
+ {% endif %}
48
+ {% assign latest_posts = localized_posts | sort: 'date' | reverse %}
49
+
50
+ <div class="profile-highlights">
51
+ {% unless site.unaltraweb.features.news == false %}
52
+ {% if latest_news.size > 0 %}
53
+ <section class="profile-highlight-section profile-highlight-news">
54
+ <div class="profile-highlight-heading">
55
+ <h2>{{ recent_news_text | strip }}</h2>
56
+ {% if news_page %}<a href="{{ news_page.url | relative_url }}">{{ view_all_news_text | strip }}</a>{% endif %}
57
+ </div>
58
+ <ul class="profile-post-list">
59
+ {% for item in latest_news limit: news_limit %}
60
+ <li>
61
+ <time datetime="{{ item.date | date_to_xmlschema }}">{% include localized-date.liquid date=item.date format_key='date.formats.short' default_format='%Y-%m-%d' %}</time>
62
+ {% if item.inline %}
63
+ <span>{{ item.content | remove: '<p>' | remove: '</p>' | emojify }}</span>
64
+ {% else %}
65
+ <a href="{{ item.url | relative_url }}">{{ item.title }}</a>
66
+ {% endif %}
67
+ </li>
68
+ {% endfor %}
69
+ </ul>
70
+ </section>
71
+ {% endif %}
72
+ {% endunless %}
73
+
74
+ {% unless site.unaltraweb.features.blog == false %}
75
+ {% if latest_posts.size > 0 %}
76
+ <section class="profile-highlight-section profile-highlight-posts">
77
+ <div class="profile-highlight-heading">
78
+ <h2>{{ recent_posts_text | strip }}</h2>
79
+ {% if blog_page %}<a href="{{ blog_page.url | relative_url }}">{{ view_all_posts_text | strip }}</a>{% endif %}
80
+ </div>
81
+ <ul class="profile-post-list">
82
+ {% for item in latest_posts limit: posts_limit %}
83
+ <li>
84
+ <time datetime="{{ item.date | date_to_xmlschema }}">{% include localized-date.liquid date=item.date format_key='date.formats.short' default_format='%Y-%m-%d' %}</time>
85
+ <a href="{{ item.url | relative_url }}">{{ item.title }}</a>
86
+ </li>
87
+ {% endfor %}
88
+ </ul>
89
+ </section>
90
+ {% endif %}
91
+ {% endunless %}
92
+
93
+ {% unless site.unaltraweb.features.publications == false %}
94
+ <section class="profile-highlight-section profile-highlight-publications">
95
+ <div class="profile-highlight-heading">
96
+ <h2>{{ selected_publications_text | strip }}</h2>
97
+ {% if publications_page %}<a href="{{ publications_page.url | relative_url }}">{{ view_all_publications_text | strip }}</a>{% endif %}
98
+ </div>
99
+ {% include selected_papers.liquid %}
100
+ </section>
101
+ {% endunless %}
102
+
103
+ {% unless site.unaltraweb.features.projects == false %}
104
+ {% if visible_project_count > 0 %}
105
+ <section class="profile-highlight-section profile-highlight-projects">
106
+ <div class="profile-highlight-heading">
107
+ <h2>{{ active_projects_text | strip }}</h2>
108
+ {% if projects_page %}<a href="{{ projects_page.url | relative_url }}">{{ view_all_projects_text | strip }}</a>{% endif %}
109
+ </div>
110
+ <div class="projects row row-cols-1 row-cols-lg-2 g-4">
111
+ {% assign rendered_projects = 0 %}
112
+ {% for highlight_project in visible_projects %}
113
+ {% if rendered_projects < projects_limit %}
114
+ {% include projects.liquid project=highlight_project %}
115
+ {% assign rendered_projects = rendered_projects | plus: 1 %}
116
+ {% endif %}
117
+ {% endfor %}
118
+ </div>
119
+ </section>
120
+ {% endif %}
121
+ {% endunless %}
122
+ </div>
@@ -0,0 +1,26 @@
1
+ {% assign current_lang = include.lang | default: page.lang | default: site.default_lang | default: site.lang %}
2
+ {% assign default_lang = site.default_lang | default: site.lang | default: 'en' %}
3
+ {% assign has_project_limit = false %}
4
+ {% if include.limit %}
5
+ {% assign has_project_limit = true %}
6
+ {% assign project_limit = include.limit | plus: 0 %}
7
+ {% endif %}
8
+ {% assign sorted_projects = site.projects | sort: 'importance' %}
9
+ {% assign localized_projects = sorted_projects | where: 'lang', current_lang %}
10
+ {% assign neutral_projects = sorted_projects | where_exp: 'item', 'item.lang == nil or item.lang == ""' %}
11
+ {% assign display_projects = localized_projects | concat: neutral_projects %}
12
+ {% if current_lang != default_lang and display_projects.size == neutral_projects.size %}
13
+ {% assign default_projects = sorted_projects | where: 'lang', default_lang %}
14
+ {% assign display_projects = default_projects | concat: neutral_projects %}
15
+ {% endif %}
16
+ {% assign display_projects = display_projects | sort: 'importance' %}
17
+ {% assign rendered_projects = 0 %}
18
+
19
+ <div class="projects row row-cols-1 row-cols-md-2 g-4">
20
+ {% for grid_project in display_projects %}
21
+ {% if has_project_limit == false or rendered_projects < project_limit %}
22
+ {% include projects.liquid project=grid_project %}
23
+ {% assign rendered_projects = rendered_projects | plus: 1 %}
24
+ {% endif %}
25
+ {% endfor %}
26
+ </div>
@@ -0,0 +1,45 @@
1
+ {% assign resource = include.resource %}
2
+ {% assign resource_type = resource.type | default: resource.kind | default: 'resource' | downcase %}
3
+ {% assign resource_label = resource.label | default: resource.title | default: resource_type | replace: '_', ' ' | capitalize %}
4
+ {% assign resource_url = resource.url | default: resource.href %}
5
+ {% if resource_url == nil and resource.doi %}
6
+ {% assign resource_url = 'https://doi.org/' | append: resource.doi %}
7
+ {% endif %}
8
+
9
+ {% assign resource_icon = resource.icon %}
10
+ {% if resource_icon == nil %}
11
+ {% case resource_type %}
12
+ {% when 'zenodo' %}
13
+ {% assign resource_icon = 'si si-zenodo' %}
14
+ {% when 'doi', 'datacite' %}
15
+ {% assign resource_icon = 'si si-doi' %}
16
+ {% when 'dataset', 'data' %}
17
+ {% assign resource_icon = 'fa-solid fa-database' %}
18
+ {% when 'code', 'github', 'repository' %}
19
+ {% assign resource_icon = 'fa-brands fa-github' %}
20
+ {% when 'documentation', 'docs', 'manual' %}
21
+ {% assign resource_icon = 'fa-solid fa-book' %}
22
+ {% when 'map', 'maps' %}
23
+ {% assign resource_icon = 'fa-solid fa-map-location-dot' %}
24
+ {% when 'publication', 'paper', 'report' %}
25
+ {% assign resource_icon = 'fa-solid fa-file-lines' %}
26
+ {% when 'website', 'link' %}
27
+ {% assign resource_icon = 'fa-solid fa-arrow-up-right-from-square' %}
28
+ {% else %}
29
+ {% assign resource_icon = 'fa-solid fa-link' %}
30
+ {% endcase %}
31
+ {% endif %}
32
+
33
+ {% assign resource_class = include.class | default: 'project-resource-pill' %}
34
+
35
+ {% if resource_url %}
36
+ <a class="{{ resource_class }}" href="{{ resource_url }}" target="_blank" rel="noopener" data-resource-type="{{ resource_type | escape }}">
37
+ <i class="{{ resource_icon }}" aria-hidden="true"></i>
38
+ <span>{{ resource_label }}</span>
39
+ </a>
40
+ {% else %}
41
+ <span class="{{ resource_class }}" data-resource-type="{{ resource_type | escape }}">
42
+ <i class="{{ resource_icon }}" aria-hidden="true"></i>
43
+ <span>{{ resource_label }}</span>
44
+ </span>
45
+ {% endif %}
@@ -0,0 +1,21 @@
1
+ {% assign resource_project = include.project | default: page %}
2
+ {% assign project_resources = resource_project.resources %}
3
+ {% assign resource_variant = include.variant | default: 'page' %}
4
+ {% assign resource_limit = include.limit | default: project_resources.size %}
5
+
6
+ {% if project_resources and project_resources.size > 0 %}
7
+ {% capture resources_title %}{% include t.liquid key='projects.resources' default='Resources' %}{% endcapture %}
8
+ <section class="project-resources project-resources-{{ resource_variant }}">
9
+ {% unless resource_variant == 'card' %}
10
+ <h2 class="project-resources-title">{{ resources_title | strip }}</h2>
11
+ {% endunless %}
12
+ <div class="project-resource-list">
13
+ {% for resource in project_resources limit: resource_limit %}
14
+ {% include project-resource-link.liquid resource=resource class='project-resource-pill' %}
15
+ {% endfor %}
16
+ {% if resource_variant == 'card' and project_resources.size > resource_limit %}
17
+ <span class="project-resource-pill project-resource-more">+{{ project_resources.size | minus: resource_limit }}</span>
18
+ {% endif %}
19
+ </div>
20
+ </section>
21
+ {% endif %}
@@ -0,0 +1,38 @@
1
+ {% capture code_repository_text %}{% include t.liquid key='projects.code_repository' default='Code repository' %}{% endcapture %}
2
+ {% capture github_stars_text %}{% include t.liquid key='projects.github_stars' default='GitHub stars' %}{% endcapture %}
3
+ {% capture view_project_text %}{% include t.liquid key='projects.view_project' default='View project' %}{% endcapture %}
4
+ {% assign card_project = include.project | default: project %}
5
+ {% assign project_hero = card_project.hero %}
6
+ {% capture project_hero_url %}{{ project_hero | relative_url }}{% endcapture %}
7
+ {% assign project_url = card_project.url | relative_url %}
8
+
9
+ <div class="col project-card-col">
10
+ <article
11
+ class="project-card card h-100 hoverable{% if project_hero %} has-project-hero{% endif %}"
12
+ {% if project_hero %}style="--project-card-hero: url('{{ project_hero_url | strip | escape }}');"{% endif %}
13
+ >
14
+ <a class="project-card-hit-area" href="{{ project_url }}" aria-label="{{ view_project_text | strip }}: {{ card_project.title | escape }}"></a>
15
+ <div class="card-body project-card-body">
16
+ <h2 class="card-title">{{ card_project.title }}</h2>
17
+ <p class="card-text project-card-description">{{ card_project.description }}</p>
18
+ {% include project-resources.liquid project=card_project variant='card' limit=3 %}
19
+ <div class="project-card-footer">
20
+ <span class="project-card-cta">{{ view_project_text | strip }}</span>
21
+ {% if card_project.github %}
22
+ <span class="project-card-links">
23
+ <a href="{{ card_project.github }}" target="_blank" rel="noopener" title="{{ code_repository_text | strip }}">
24
+ <i class="fa-brands fa-github gh-icon" aria-hidden="true"></i>
25
+ <span>{{ code_repository_text | strip }}</span>
26
+ </a>
27
+ {% if card_project.github_stars %}
28
+ <span class="stars" data-toggle="tooltip" title="{{ github_stars_text | strip }}">
29
+ <i class="fa-solid fa-star" aria-hidden="true"></i>
30
+ <span id="{{ card_project.github_stars }}-stars"></span>
31
+ </span>
32
+ {% endif %}
33
+ </span>
34
+ {% endif %}
35
+ </div>
36
+ </div>
37
+ </article>
38
+ </div>
@@ -0,0 +1,37 @@
1
+ {% capture code_repository_text %}{% include t.liquid key='projects.code_repository' default='Code repository' %}{% endcapture %}
2
+ {% capture github_stars_text %}{% include t.liquid key='projects.github_stars' default='GitHub stars' %}{% endcapture %}
3
+
4
+ <div class="col mb-4">
5
+ <a href="{% if project.redirect %}{{ project.redirect }}{% else %}{{ project.url | relative_url }}{% endif %}">
6
+ <div class="card h-100 hoverable">
7
+ <div class="row no-gutters">
8
+ {% if project.img %}
9
+ <div class="col-md-6">
10
+ {% include figure.liquid loading="eager" path=project.img sizes="(min-width: 768px) 156px, 50vw" alt="project thumbnail" class="card-img" %}
11
+ </div>
12
+ {% endif %}
13
+ <div class="{% if project.img %}col-md-6{% else %}col-md-12{% endif %}">
14
+ <div class="card-body">
15
+ <h3 class="card-title">{{ project.title }}</h3>
16
+ <p class="card-text">{{ project.description }}</p>
17
+ <div class="row ml-1 mr-1 p-0">
18
+ {% if project.github %}
19
+ <div class="github-icon">
20
+ <div class="icon" data-toggle="tooltip" title="{{ code_repository_text | strip }}">
21
+ <a href="{{ project.github }}"><i class="fa-brands fa-github gh-icon"></i></a>
22
+ </div>
23
+ {% if project.github_stars %}
24
+ <span class="stars" data-toggle="tooltip" title="{{ github_stars_text | strip }}">
25
+ <i class="fa-solid fa-star"></i>
26
+ <span id="{{ project.github_stars }}-stars"></span>
27
+ </span>
28
+ {% endif %}
29
+ </div>
30
+ {% endif %}
31
+ </div>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ </div>
36
+ </a>
37
+ </div>
@@ -0,0 +1,69 @@
1
+ {% assign metrics_root = site.data.metrics.metrics %}
2
+ {% if metrics_root and metrics_root.summary %}
3
+ {% assign m = metrics_root.summary %}
4
+ {% assign current_lang = page.lang | default: site.default_lang | default: site.lang | split: '-' | first %}
5
+ {% capture metrics_title %}{% include t.liquid key='publications.metrics.title' default='Bibliometric metrics' %}{% endcapture %}
6
+ {% capture metrics_indicators_calculated %}{% include t.liquid key='publications.metrics.indicators_calculated' default='Indicators calculated from' %}{% endcapture %}
7
+ {% capture metrics_articles_label %}{% include t.liquid key='publications.metrics.articles_label' default='articles' %}{% endcapture %}
8
+ {% capture metrics_updated_on %}{% include t.liquid key='publications.metrics.updated_on' default='Updated on' %}{% endcapture %}
9
+ {% capture metrics_scimago_meta %}{% include t.liquid key='publications.metrics.scimago_meta' default='Scimago matching meta' %}{% endcapture %}
10
+ {% capture metrics_coverage %}{% include t.liquid key='publications.metrics.coverage' default='coverage' %}{% endcapture %}
11
+ {% capture metrics_stale_rejected %}{% include t.liquid key='publications.metrics.stale_rejected' default='stale rejected' %}{% endcapture %}
12
+ {% capture metrics_max_year_gap %}{% include t.liquid key='publications.metrics.max_year_gap' default='max year gap' %}{% endcapture %}
13
+ {% capture metrics_na %}{% include t.liquid key='publications.metrics.not_available' default='n/a' %}{% endcapture %}
14
+ {% assign updated_day = metrics_root.updated_on | date: '%-d' %}
15
+ {% assign updated_month_num = metrics_root.updated_on | date: '%-m' | plus: 0 %}
16
+ {% assign updated_year = metrics_root.updated_on | date: '%Y' %}
17
+ {% case current_lang %}
18
+ {% when 'ca' %}
19
+ {% assign month_names = 'gener|febrer|març|abril|maig|juny|juliol|agost|setembre|octubre|novembre|desembre' | split: '|' %}
20
+ {% when 'es' %}
21
+ {% assign month_names = 'enero|febrero|marzo|abril|mayo|junio|julio|agosto|septiembre|octubre|noviembre|diciembre' | split: '|' %}
22
+ {% else %}
23
+ {% assign month_names = 'january|february|march|april|may|june|july|august|september|october|november|december' | split: '|' %}
24
+ {% endcase %}
25
+ {% assign month_index = updated_month_num | minus: 1 %}
26
+ {% assign updated_month_name = month_names[month_index] %}
27
+ {% if current_lang == 'en' %}
28
+ {% capture metrics_updated_date %}{{ updated_month_name | capitalize }} {{ updated_day }}, {{ updated_year }}{% endcapture %}
29
+ {% else %}
30
+ {% capture metrics_updated_date %}{{ updated_day }} de {{ updated_month_name }} de {{ updated_year }}{% endcapture %}
31
+ {% endif %}
32
+ <div class="pub-metrics-summary">
33
+ <h3>{{ metrics_title }}</h3>
34
+ <p class="pub-metrics-updated">
35
+ {{ metrics_indicators_calculated }} {{ m.articles_with_metrics | default: 0 }} {{ metrics_articles_label }}.
36
+ {{ metrics_updated_on }} {{ metrics_updated_date }}.
37
+ </p>
38
+
39
+ <div class="pub-summary-badges">
40
+ <span class="metrics-badge"><span class="metrics-badge-label">Google Scholar cites</span><span class="metrics-badge-value">{{ m.google_scholar_citations_total | default: 0 }}</span></span>
41
+ <span class="metrics-badge"><span class="metrics-badge-label">OpenAlex cites</span><span class="metrics-badge-value">{{ m.openalex_citations_total | default: 0 }}</span></span>
42
+ <span class="metrics-badge"><span class="metrics-badge-label">Crossref cites</span><span class="metrics-badge-value">{{ m.crossref_citations_total | default: 0 }}</span></span>
43
+ </div>
44
+
45
+ <div class="pub-summary-badges">
46
+ <span class="metrics-badge"><span class="metrics-badge-label">OA cites 2y</span><span class="metrics-badge-value">{{ m.openalex_citations_2y_total | default: 0 }}</span></span>
47
+ <span class="metrics-badge"><span class="metrics-badge-label">OA cites 5y</span><span class="metrics-badge-value">{{ m.openalex_citations_5y_total | default: 0 }}</span></span>
48
+ <span class="metrics-badge"><span class="metrics-badge-label">FWCI avg</span><span class="metrics-badge-value">{{ m.fwci_avg | default: 0 }}</span></span>
49
+ <span class="metrics-badge"><span class="metrics-badge-label">CNP avg</span><span class="metrics-badge-value">{{ m.cnp_avg | default: 0 }}</span></span>
50
+ </div>
51
+
52
+ <div class="pub-summary-badges">
53
+ <span class="metrics-badge"><span class="metrics-badge-label">Core journals</span><span class="metrics-badge-value">{{ m.journals_core_count | default: 0 }}</span></span>
54
+ <span class="metrics-badge"><span class="metrics-badge-label">DOAJ journals</span><span class="metrics-badge-value">{{ m.journals_doaj_count | default: 0 }}</span></span>
55
+ <span class="metrics-badge"><span class="metrics-badge-label">Scimago articles</span><span class="metrics-badge-value">{{ m.scimago_articles_count | default: 0 }}</span></span>
56
+ <span class="metrics-badge"><span class="metrics-badge-label">Q1</span><span class="metrics-badge-value">{{ m.scimago_q1_count | default: 0 }}</span></span>
57
+ <span class="metrics-badge"><span class="metrics-badge-label">Q2</span><span class="metrics-badge-value">{{ m.scimago_q2_count | default: 0 }}</span></span>
58
+ <span class="metrics-badge"><span class="metrics-badge-label">Q3</span><span class="metrics-badge-value">{{ m.scimago_q3_count | default: 0 }}</span></span>
59
+ <span class="metrics-badge"><span class="metrics-badge-label">Q4</span><span class="metrics-badge-value">{{ m.scimago_q4_count | default: 0 }}</span></span>
60
+ </div>
61
+
62
+ <p class="pub-metrics-meta">
63
+ {{ metrics_scimago_meta }}:
64
+ {{ metrics_coverage }} {% if m.scimago_year_min and m.scimago_year_max %}{{ m.scimago_year_min }}-{{ m.scimago_year_max }}{% else %}{{ metrics_na }}{% endif %};
65
+ {{ metrics_stale_rejected }} {{ m.scimago_stale_rejected | default: 0 }};
66
+ {{ metrics_max_year_gap }} {{ m.scimago_max_year_gap | default: 2 }}.
67
+ </p>
68
+ </div>
69
+ {% endif %}