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,308 @@
1
+ (function () {
2
+ var MIN_SCALE = 0.85;
3
+ var MAX_SCALE = 1.25;
4
+ var STEP = 0.1;
5
+ var pageTocCleanup = null;
6
+
7
+ function normalize(text) {
8
+ return (text || "")
9
+ .toString()
10
+ .toLowerCase()
11
+ .normalize("NFD")
12
+ .replace(/[\u0300-\u036f]/g, "")
13
+ .replace(/\s+/g, " ")
14
+ .trim();
15
+ }
16
+
17
+ function slugify(text) {
18
+ return normalize(text).replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "") || "section";
19
+ }
20
+
21
+ function uniqueId(base, seen) {
22
+ var id = base;
23
+ var index = 2;
24
+ while (document.getElementById(id) || seen[id]) {
25
+ id = base + "-" + index;
26
+ index += 1;
27
+ }
28
+ seen[id] = true;
29
+ return id;
30
+ }
31
+
32
+ function applyStoredFontScale() {
33
+ var stored = parseFloat(localStorage.getItem("unaltrawebManualFontScale") || "1");
34
+ if (!Number.isFinite(stored)) stored = 1;
35
+ document.documentElement.style.setProperty("--manual-font-scale", String(stored));
36
+ document.documentElement.style.setProperty("--manual-content-font-size", (1.02 * stored).toFixed(3) + "rem");
37
+ document.documentElement.style.setProperty("--manual-h2-font-size", (1.42 * stored).toFixed(3) + "rem");
38
+ document.documentElement.style.setProperty("--manual-h3-font-size", (1.16 * stored).toFixed(3) + "rem");
39
+ }
40
+
41
+ function setupFontControls() {
42
+ applyStoredFontScale();
43
+ document.querySelectorAll(".manual-font-menu").forEach(function (menu) {
44
+ if (menu.dataset.manualFontMenuReady) return;
45
+ menu.dataset.manualFontMenuReady = "true";
46
+ menu.addEventListener("click", function (event) {
47
+ event.stopPropagation();
48
+ });
49
+ });
50
+ document.querySelectorAll("[data-manual-font]").forEach(function (button) {
51
+ if (button.dataset.manualFontReady) return;
52
+ button.dataset.manualFontReady = "true";
53
+ button.addEventListener("click", function () {
54
+ var current = parseFloat(localStorage.getItem("unaltrawebManualFontScale") || "1");
55
+ if (!Number.isFinite(current)) current = 1;
56
+ if (button.dataset.manualFont === "increase") current = Math.min(MAX_SCALE, current + STEP);
57
+ if (button.dataset.manualFont === "decrease") current = Math.max(MIN_SCALE, current - STEP);
58
+ if (button.dataset.manualFont === "reset") current = 1;
59
+ current = Math.round(current * 100) / 100;
60
+ localStorage.setItem("unaltrawebManualFontScale", String(current));
61
+ applyStoredFontScale();
62
+ });
63
+ });
64
+ }
65
+
66
+ function addNumbering() {
67
+ var root = document.querySelector(".manual-main[data-chapter]");
68
+ if (!root) return;
69
+ root.querySelectorAll(".hd-num").forEach(function (node) { node.remove(); });
70
+ if (root.getAttribute("data-manual-numbered") === "false") return;
71
+
72
+ var chapter = parseInt(root.getAttribute("data-chapter"), 10);
73
+ if (!Number.isFinite(chapter) || chapter < 0) chapter = 1;
74
+ var section = 0;
75
+ var subsection = 0;
76
+ var subsubsection = 0;
77
+
78
+ function prefix(heading, value) {
79
+ var span = document.createElement("span");
80
+ span.className = "hd-num";
81
+ span.textContent = value;
82
+ heading.insertBefore(span, heading.firstChild);
83
+ }
84
+
85
+ var title = root.querySelector(".manual-chapter-header h1");
86
+ if (title) prefix(title, String(chapter));
87
+
88
+ root.querySelectorAll(".manual-content h2, .manual-content h3, .manual-content h4").forEach(function (heading) {
89
+ if (heading.tagName.toLowerCase() === "h2") {
90
+ section += 1;
91
+ subsection = 0;
92
+ subsubsection = 0;
93
+ prefix(heading, chapter + "." + section);
94
+ } else if (heading.tagName.toLowerCase() === "h3") {
95
+ if (section === 0) section = 1;
96
+ subsection += 1;
97
+ subsubsection = 0;
98
+ prefix(heading, chapter + "." + section + "." + subsection);
99
+ } else {
100
+ if (section === 0) section = 1;
101
+ if (subsection === 0) subsection = 1;
102
+ subsubsection += 1;
103
+ prefix(heading, chapter + "." + section + "." + subsection + "." + subsubsection);
104
+ }
105
+ });
106
+ }
107
+
108
+ function buildPageToc() {
109
+ var target = document.querySelector("[data-manual-page-toc]");
110
+ var container = document.querySelector("[data-manual-page-toc-container]");
111
+ var content = document.querySelector(".manual-content");
112
+ if (!target || !container || !content) return;
113
+
114
+ // Fourth-level headings are numbered in the text but intentionally omitted here.
115
+ var headings = Array.prototype.slice.call(content.querySelectorAll("h2, h3"));
116
+ target.innerHTML = "";
117
+ if (!headings.length) {
118
+ container.hidden = true;
119
+ return;
120
+ }
121
+
122
+ var seen = {};
123
+ var sections = [];
124
+ var current = null;
125
+
126
+ function appendLinkLabel(link, item) {
127
+ link.setAttribute("aria-label", item.number ? item.number + " " + item.text : item.text);
128
+ if (item.number) {
129
+ var number = document.createElement("span");
130
+ number.className = "manual-page-toc-number";
131
+ number.textContent = item.number;
132
+ link.appendChild(number);
133
+ }
134
+ var title = document.createElement("span");
135
+ title.className = "manual-page-toc-title";
136
+ title.textContent = item.text;
137
+ link.appendChild(title);
138
+ }
139
+
140
+ headings.forEach(function (heading) {
141
+ if (!heading.id) heading.id = uniqueId(slugify(heading.textContent), seen);
142
+ var cleanText = heading.textContent.replace(/^\s*\d+(?:\.\d+)*\s*/, "").trim();
143
+ var number = heading.querySelector(".hd-num") ? heading.querySelector(".hd-num").textContent : "";
144
+ var item = { heading: heading, number: number, text: cleanText };
145
+
146
+ if (heading.tagName.toLowerCase() === "h2" || !current) {
147
+ current = { parent: item, children: [] };
148
+ sections.push(current);
149
+ } else {
150
+ current.children.push(item);
151
+ }
152
+ });
153
+
154
+ sections.forEach(function (section) {
155
+ if (!section.children.length) {
156
+ var single = document.createElement("a");
157
+ single.className = "manual-page-toc-link";
158
+ single.href = "#" + section.parent.heading.id;
159
+ appendLinkLabel(single, section.parent);
160
+ target.appendChild(single);
161
+ return;
162
+ }
163
+
164
+ var details = document.createElement("details");
165
+ details.className = "manual-page-toc-section";
166
+ details.open = true;
167
+ var summary = document.createElement("summary");
168
+ var link = document.createElement("a");
169
+ link.href = "#" + section.parent.heading.id;
170
+ appendLinkLabel(link, section.parent);
171
+ summary.appendChild(link);
172
+ details.appendChild(summary);
173
+
174
+ var list = document.createElement("ol");
175
+ section.children.forEach(function (child) {
176
+ var item = document.createElement("li");
177
+ var sublink = document.createElement("a");
178
+ sublink.href = "#" + child.heading.id;
179
+ appendLinkLabel(sublink, child);
180
+ item.appendChild(sublink);
181
+ list.appendChild(item);
182
+ });
183
+ details.appendChild(list);
184
+ target.appendChild(details);
185
+ });
186
+
187
+ container.hidden = false;
188
+ setupPageTocActiveState(target, headings);
189
+ }
190
+
191
+ function setupPageTocActiveState(target, headings) {
192
+ if (pageTocCleanup) {
193
+ pageTocCleanup();
194
+ pageTocCleanup = null;
195
+ }
196
+
197
+ var links = Array.prototype.slice.call(target.querySelectorAll("a[href^='#']"));
198
+ if (!headings.length || !links.length) return;
199
+
200
+ var linkById = {};
201
+ links.forEach(function (link) {
202
+ var id = decodeURIComponent(link.getAttribute("href").slice(1));
203
+ linkById[id] = link;
204
+ });
205
+
206
+ function activate(id) {
207
+ links.forEach(function (link) {
208
+ link.classList.remove("active");
209
+ link.removeAttribute("aria-current");
210
+ });
211
+ var activeLink = linkById[id];
212
+ if (!activeLink) return;
213
+ activeLink.classList.add("active");
214
+ activeLink.setAttribute("aria-current", "location");
215
+ var parentSection = activeLink.closest("details");
216
+ if (parentSection) parentSection.open = true;
217
+ }
218
+
219
+ function currentHeadingId() {
220
+ var offset = Math.min(window.innerHeight * 0.28, 180);
221
+ var current = headings[0];
222
+ headings.forEach(function (heading) {
223
+ if (heading.getBoundingClientRect().top <= offset) current = heading;
224
+ });
225
+ return current.id;
226
+ }
227
+
228
+ var ticking = false;
229
+ function updateActive() {
230
+ ticking = false;
231
+ activate(currentHeadingId());
232
+ }
233
+ function scheduleUpdate() {
234
+ if (ticking) return;
235
+ ticking = true;
236
+ window.requestAnimationFrame(updateActive);
237
+ }
238
+
239
+ updateActive();
240
+ window.addEventListener("scroll", scheduleUpdate, { passive: true });
241
+ window.addEventListener("resize", scheduleUpdate);
242
+ pageTocCleanup = function () {
243
+ window.removeEventListener("scroll", scheduleUpdate);
244
+ window.removeEventListener("resize", scheduleUpdate);
245
+ };
246
+ }
247
+
248
+ function setupSidebarToggle() {
249
+ var layout = document.querySelector(".manual-layout");
250
+ if (!layout) return;
251
+ var storageKey = "unaltrawebManualSidebarCollapsed";
252
+ var mobileQuery = window.matchMedia("(max-width: 960px)");
253
+ var stored = localStorage.getItem(storageKey);
254
+ var collapsed = stored === null ? mobileQuery.matches : stored === "true";
255
+
256
+ function toggleButtons() {
257
+ return Array.prototype.slice.call(document.querySelectorAll("[data-manual-sidebar-toggle]"));
258
+ }
259
+
260
+ function updateToggleState(isCollapsed) {
261
+ layout.classList.toggle("manual-sidebar-collapsed", isCollapsed);
262
+ toggleButtons().forEach(function (button) {
263
+ button.classList.toggle("is-collapsed", isCollapsed);
264
+ button.classList.toggle("collapsed", isCollapsed && button.classList.contains("navbar-toggler"));
265
+ button.setAttribute("aria-expanded", isCollapsed ? "false" : "true");
266
+ });
267
+ }
268
+
269
+ updateToggleState(collapsed);
270
+ toggleButtons().forEach(function (button) {
271
+ if (button.dataset.manualToggleReady) return;
272
+ button.dataset.manualToggleReady = "true";
273
+ button.addEventListener("click", function (event) {
274
+ event.preventDefault();
275
+ var nowCollapsed = !layout.classList.contains("manual-sidebar-collapsed");
276
+ localStorage.setItem(storageKey, nowCollapsed ? "true" : "false");
277
+ updateToggleState(nowCollapsed);
278
+ });
279
+ });
280
+
281
+ if (layout.dataset.manualOutsideClickReady) return;
282
+ layout.dataset.manualOutsideClickReady = "true";
283
+ document.addEventListener("click", function (event) {
284
+ if (!mobileQuery.matches || layout.classList.contains("manual-sidebar-collapsed")) return;
285
+ var panel = layout.querySelector(".manual-toc-panel") || layout.querySelector(".manual-sidebar");
286
+ var clickedToggle = toggleButtons().some(function (button) {
287
+ return button.contains(event.target);
288
+ });
289
+ if ((panel && panel.contains(event.target)) || clickedToggle) return;
290
+ localStorage.setItem(storageKey, "true");
291
+ updateToggleState(true);
292
+ });
293
+ }
294
+
295
+ function enhanceManual() {
296
+ setupSidebarToggle();
297
+ setupFontControls();
298
+ addNumbering();
299
+ buildPageToc();
300
+ }
301
+
302
+ if (document.readyState === "loading") {
303
+ document.addEventListener("DOMContentLoaded", enhanceManual);
304
+ } else {
305
+ enhanceManual();
306
+ }
307
+ document.addEventListener("unaltraweb:contentchange", enhanceManual);
308
+ })();
@@ -0,0 +1,12 @@
1
+ $(document).ready(function () {
2
+ // Init Masonry
3
+ var $grid = $(".grid").masonry({
4
+ gutter: 10,
5
+ horizontalOrder: true,
6
+ itemSelector: ".grid-item",
7
+ });
8
+ // Layout Masonry after each image loads
9
+ $grid.imagesLoaded().progress(function () {
10
+ $grid.masonry("layout");
11
+ });
12
+ });
@@ -0,0 +1,46 @@
1
+ window.MathJax = {
2
+ loader: {
3
+ load: ["[tex]/cancel"],
4
+ },
5
+ tex: {
6
+ tags: window.unaltrawebMathJaxTags || "all",
7
+ packages: { "[+]": ["cancel"] },
8
+ inlineMath: [
9
+ ["$", "$"],
10
+ ["\\(", "\\)"],
11
+ ],
12
+ displayMath: [
13
+ ["$$", "$$"],
14
+ ["\\[", "\\]"],
15
+ ],
16
+ processEscapes: true,
17
+ processEnvironments: true,
18
+ macros: {
19
+ cm: "\\,\\mathrm{cm}",
20
+ mm: "\\,\\mathrm{mm}",
21
+ m: "\\,\\mathrm{m}",
22
+ km: "\\,\\mathrm{km}",
23
+ cms: "\\,\\mathrm{cm^2}",
24
+ squarekilometre: "\\,\\mathrm{km^2}",
25
+ hectare: "\\,\\mathrm{ha}",
26
+ ha: "\\,\\mathrm{ha}",
27
+ },
28
+ },
29
+ options: {
30
+ renderActions: {
31
+ addCss: [
32
+ 200,
33
+ function (doc) {
34
+ const style = document.createElement("style");
35
+ style.innerHTML = `
36
+ .mjx-container {
37
+ color: inherit;
38
+ }
39
+ `;
40
+ document.head.appendChild(style);
41
+ },
42
+ "",
43
+ ],
44
+ },
45
+ },
46
+ };
@@ -0,0 +1,37 @@
1
+ let mermaidTheme = determineComputedTheme() == "dark" ? "dark" : "default";
2
+
3
+ /* Create mermaid diagram as another node and hide the code block, appending the mermaid node after it
4
+ this is done to enable retrieving the code again when changing theme between light/dark */
5
+ document.addEventListener("readystatechange", () => {
6
+ if (document.readyState === "complete") {
7
+ document.querySelectorAll("pre>code.language-mermaid").forEach((elem) => {
8
+ const svgCode = elem.textContent;
9
+ const backup = elem.parentElement;
10
+ backup.classList.add("unloaded");
11
+ /* create mermaid node */
12
+ let mermaid = document.createElement("pre");
13
+ mermaid.classList.add("mermaid");
14
+ const text = document.createTextNode(svgCode);
15
+ mermaid.appendChild(text);
16
+ backup.after(mermaid);
17
+ });
18
+
19
+ mermaid.initialize({ theme: mermaidTheme });
20
+
21
+ /* Zoomable mermaid diagrams */
22
+ if (typeof d3 !== "undefined") {
23
+ window.addEventListener("load", function () {
24
+ var svgs = d3.selectAll(".mermaid svg");
25
+ svgs.each(function () {
26
+ var svg = d3.select(this);
27
+ svg.html("<g>" + svg.html() + "</g>");
28
+ var inner = svg.select("g");
29
+ var zoom = d3.zoom().on("zoom", function (event) {
30
+ inner.attr("transform", event.transform);
31
+ });
32
+ svg.call(zoom);
33
+ });
34
+ });
35
+ }
36
+ }
37
+ });
@@ -0,0 +1,105 @@
1
+ function submitHandler(event) {
2
+ event.preventDefault();
3
+ var container = event.target.parentNode;
4
+ var form = container.querySelector(".newsletter-form");
5
+ var formInput = container.querySelector(".newsletter-form-input");
6
+ var success = container.querySelector(".newsletter-success");
7
+ var errorContainer = container.querySelector(".newsletter-error");
8
+ var errorMessage = container.querySelector(".newsletter-error-message");
9
+ var backButton = container.querySelector(".newsletter-back-button");
10
+ var submitButton = container.querySelector(".newsletter-form-button");
11
+ var loadingButton = container.querySelector(".newsletter-loading-button");
12
+
13
+ const rateLimit = () => {
14
+ errorContainer.style.display = "flex";
15
+ errorMessage.innerText = "Too many signups, please try again in a little while";
16
+ submitButton.style.display = "none";
17
+ formInput.style.display = "none";
18
+ backButton.style.display = "block";
19
+ };
20
+
21
+ // Compare current time with time of previous sign up
22
+ var time = new Date();
23
+ var timestamp = time.valueOf();
24
+ var previousTimestamp = localStorage.getItem("loops-form-timestamp");
25
+
26
+ // If last sign up was less than a minute ago
27
+ // display error
28
+ if (previousTimestamp && Number(previousTimestamp) + 60000 > timestamp) {
29
+ rateLimit();
30
+ return;
31
+ }
32
+ localStorage.setItem("loops-form-timestamp", timestamp);
33
+
34
+ submitButton.style.display = "none";
35
+ loadingButton.style.display = "flex";
36
+
37
+ var formBody = "userGroup=&email=" + encodeURIComponent(formInput.value);
38
+ fetch(event.target.action, {
39
+ method: "POST",
40
+ body: formBody,
41
+ headers: {
42
+ "Content-Type": "application/x-www-form-urlencoded",
43
+ },
44
+ })
45
+ .then((res) => [res.ok, res.json(), res])
46
+ .then(([ok, dataPromise, res]) => {
47
+ if (ok) {
48
+ // If response successful
49
+ // display success
50
+ success.style.display = "flex";
51
+ form.reset();
52
+ } else {
53
+ // If response unsuccessful
54
+ // display error message or response status
55
+ dataPromise.then((data) => {
56
+ errorContainer.style.display = "flex";
57
+ errorMessage.innerText = data.message ? data.message : res.statusText;
58
+ });
59
+ }
60
+ })
61
+ .catch((error) => {
62
+ // check for cloudflare error
63
+ if (error.message === "Failed to fetch") {
64
+ rateLimit();
65
+ return;
66
+ }
67
+ // If error caught
68
+ // display error message if available
69
+ errorContainer.style.display = "flex";
70
+ if (error.message) errorMessage.innerText = error.message;
71
+ localStorage.setItem("loops-form-timestamp", "");
72
+ })
73
+ .finally(() => {
74
+ formInput.style.display = "none";
75
+ loadingButton.style.display = "none";
76
+ backButton.style.display = "block";
77
+ });
78
+ }
79
+ function resetFormHandler(event) {
80
+ var container = event.target.parentNode;
81
+ var formInput = container.querySelector(".newsletter-form-input");
82
+ var success = container.querySelector(".newsletter-success");
83
+ var errorContainer = container.querySelector(".newsletter-error");
84
+ var errorMessage = container.querySelector(".newsletter-error-message");
85
+ var backButton = container.querySelector(".newsletter-back-button");
86
+ var submitButton = container.querySelector(".newsletter-form-button");
87
+
88
+ success.style.display = "none";
89
+ errorContainer.style.display = "none";
90
+ errorMessage.innerText = "Oops! Something went wrong, please try again";
91
+ backButton.style.display = "none";
92
+ formInput.style.display = "flex";
93
+ submitButton.style.display = "flex";
94
+ }
95
+
96
+ var formContainers = document.getElementsByClassName("newsletter-form-container");
97
+
98
+ for (var i = 0; i < formContainers.length; i++) {
99
+ var formContainer = formContainers[i];
100
+ var handlersAdded = formContainer.classList.contains("newsletter-handlers-added");
101
+ if (handlersAdded) continue;
102
+ formContainer.querySelector(".newsletter-form").addEventListener("submit", submitHandler);
103
+ formContainer.querySelector(".newsletter-back-button").addEventListener("click", resetFormHandler);
104
+ formContainer.classList.add("newsletter-handlers-added");
105
+ }
@@ -0,0 +1,24 @@
1
+ // add bootstrap classes to tables
2
+ $(document).ready(function () {
3
+ $("table").each(function () {
4
+ if (determineComputedTheme() == "dark") {
5
+ $(this).addClass("table-dark");
6
+ } else {
7
+ $(this).removeClass("table-dark");
8
+ }
9
+
10
+ // only select tables that are not inside an element with "news" (about page) or "card" (cv page) class
11
+ if (
12
+ $(this).parents('[class*="news"]').length == 0 &&
13
+ $(this).parents('[class*="card"]').length == 0 &&
14
+ $(this).parents('[class*="archive"]').length == 0 &&
15
+ $(this).parents("code").length == 0
16
+ ) {
17
+ // make table use bootstrap-table
18
+ $(this).attr("data-toggle", "table");
19
+ // add some classes to make the table look better
20
+ // $(this).addClass('table-sm');
21
+ $(this).addClass("table-hover");
22
+ }
23
+ });
24
+ });
@@ -0,0 +1,52 @@
1
+ let plotlyTheme = determineComputedTheme();
2
+ /* Create plotly chart as another node and hide the code block, appending the plotly node after it
3
+ this is done to enable retrieving the code again when changing theme between light/dark */
4
+ document.addEventListener("readystatechange", () => {
5
+ if (document.readyState === "complete") {
6
+ document.querySelectorAll("pre>code.language-plotly").forEach((elem) => {
7
+ const jsonCode = elem.textContent;
8
+ const backup = elem.parentElement;
9
+ backup.classList.add("unloaded");
10
+ /* create plotly node */
11
+ let chartElement = document.createElement("div");
12
+ backup.after(chartElement);
13
+
14
+ /* create plotly */
15
+ var jsonData = JSON.parse(jsonCode);
16
+
17
+ if (plotlyTheme === "dark") {
18
+ // dark theme extracted from https://github.com/plotly/plotly.py/blob/main/plotly/package_data/templates/plotly_dark.json?raw=true
19
+ // prettier-ignore
20
+ const plotlyDarkLayout = {"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#f2f5fa"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"rgb(17,17,17)","plot_bgcolor":"rgb(17,17,17)","polar":{"bgcolor":"rgb(17,17,17)","angularaxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""},"radialaxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""}},"ternary":{"bgcolor":"rgb(17,17,17)","aaxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""},"baxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""},"caxis":{"gridcolor":"#506784","linecolor":"#506784","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"#283442","linecolor":"#506784","ticks":"","title":{"standoff":15},"zerolinecolor":"#283442","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"#283442","linecolor":"#506784","ticks":"","title":{"standoff":15},"zerolinecolor":"#283442","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"rgb(17,17,17)","gridcolor":"#506784","linecolor":"#506784","showbackground":true,"ticks":"","zerolinecolor":"#C8D4E3","gridwidth":2},"yaxis":{"backgroundcolor":"rgb(17,17,17)","gridcolor":"#506784","linecolor":"#506784","showbackground":true,"ticks":"","zerolinecolor":"#C8D4E3","gridwidth":2},"zaxis":{"backgroundcolor":"rgb(17,17,17)","gridcolor":"#506784","linecolor":"#506784","showbackground":true,"ticks":"","zerolinecolor":"#C8D4E3","gridwidth":2}},"shapedefaults":{"line":{"color":"#f2f5fa"}},"annotationdefaults":{"arrowcolor":"#f2f5fa","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"rgb(17,17,17)","landcolor":"rgb(17,17,17)","subunitcolor":"#506784","showland":true,"showlakes":true,"lakecolor":"rgb(17,17,17)"},"title":{"x":0.05},"updatemenudefaults":{"bgcolor":"#506784","borderwidth":0},"sliderdefaults":{"bgcolor":"#C8D4E3","borderwidth":1,"bordercolor":"rgb(17,17,17)","tickwidth":0},"mapbox":{"style":"dark"}},"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"marker":{"line":{"color":"#283442"}},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#f2f5fa"},"error_y":{"color":"#f2f5fa"},"marker":{"line":{"color":"rgb(17,17,17)","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"marker":{"line":{"color":"#283442"}},"type":"scattergl"}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermap":[{"type":"scattermap","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#A2B1C6","gridcolor":"#506784","linecolor":"#506784","minorgridcolor":"#506784","startlinecolor":"#A2B1C6"},"baxis":{"endlinecolor":"#A2B1C6","gridcolor":"#506784","linecolor":"#506784","minorgridcolor":"#506784","startlinecolor":"#A2B1C6"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#506784"},"line":{"color":"rgb(17,17,17)"}},"header":{"fill":{"color":"#2a3f5f"},"line":{"color":"rgb(17,17,17)"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"rgb(17,17,17)","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]}};
21
+
22
+ // if jsonData.layout exists, then update the theme
23
+ if (jsonData.layout) {
24
+ if (jsonData.layout.template) {
25
+ jsonData.layout.template = { ...plotlyDarkLayout, ...jsonData.layout.template };
26
+ } else {
27
+ jsonData.layout.template = plotlyDarkLayout;
28
+ }
29
+ } else {
30
+ jsonData.layout = { template: plotlyDarkLayout };
31
+ }
32
+ } else {
33
+ // light theme extracted from https://github.com/plotly/plotly.py/blob/main/plotly/package_data/templates/plotly_white.json?raw=true
34
+ // prettier-ignore
35
+ const plotlyLightLayout = {"layout":{"autotypenumbers":"strict","colorway":["#636efa","#EF553B","#00cc96","#ab63fa","#FFA15A","#19d3f3","#FF6692","#B6E880","#FF97FF","#FECB52"],"font":{"color":"#2a3f5f"},"hovermode":"closest","hoverlabel":{"align":"left"},"paper_bgcolor":"white","plot_bgcolor":"white","polar":{"bgcolor":"white","angularaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""},"radialaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":""}},"ternary":{"bgcolor":"white","aaxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"baxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""},"caxis":{"gridcolor":"#DFE8F3","linecolor":"#A2B1C6","ticks":""}},"coloraxis":{"colorbar":{"outlinewidth":0,"ticks":""}},"colorscale":{"sequential":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"sequentialminus":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]],"diverging":[[0,"#8e0152"],[0.1,"#c51b7d"],[0.2,"#de77ae"],[0.3,"#f1b6da"],[0.4,"#fde0ef"],[0.5,"#f7f7f7"],[0.6,"#e6f5d0"],[0.7,"#b8e186"],[0.8,"#7fbc41"],[0.9,"#4d9221"],[1,"#276419"]]},"xaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","automargin":true,"zerolinewidth":2},"yaxis":{"gridcolor":"#EBF0F8","linecolor":"#EBF0F8","ticks":"","title":{"standoff":15},"zerolinecolor":"#EBF0F8","automargin":true,"zerolinewidth":2},"scene":{"xaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8","gridwidth":2},"yaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8","gridwidth":2},"zaxis":{"backgroundcolor":"white","gridcolor":"#DFE8F3","linecolor":"#EBF0F8","showbackground":true,"ticks":"","zerolinecolor":"#EBF0F8","gridwidth":2}},"shapedefaults":{"line":{"color":"#2a3f5f"}},"annotationdefaults":{"arrowcolor":"#2a3f5f","arrowhead":0,"arrowwidth":1},"geo":{"bgcolor":"white","landcolor":"white","subunitcolor":"#C8D4E3","showland":true,"showlakes":true,"lakecolor":"white"},"title":{"x":0.05},"mapbox":{"style":"light"}},"data":{"histogram2dcontour":[{"type":"histogram2dcontour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"choropleth":[{"type":"choropleth","colorbar":{"outlinewidth":0,"ticks":""}}],"histogram2d":[{"type":"histogram2d","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"heatmap":[{"type":"heatmap","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"contourcarpet":[{"type":"contourcarpet","colorbar":{"outlinewidth":0,"ticks":""}}],"contour":[{"type":"contour","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"surface":[{"type":"surface","colorbar":{"outlinewidth":0,"ticks":""},"colorscale":[[0.0,"#0d0887"],[0.1111111111111111,"#46039f"],[0.2222222222222222,"#7201a8"],[0.3333333333333333,"#9c179e"],[0.4444444444444444,"#bd3786"],[0.5555555555555556,"#d8576b"],[0.6666666666666666,"#ed7953"],[0.7777777777777778,"#fb9f3a"],[0.8888888888888888,"#fdca26"],[1.0,"#f0f921"]]}],"mesh3d":[{"type":"mesh3d","colorbar":{"outlinewidth":0,"ticks":""}}],"scatter":[{"fillpattern":{"fillmode":"overlay","size":10,"solidity":0.2},"type":"scatter"}],"parcoords":[{"type":"parcoords","line":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolargl":[{"type":"scatterpolargl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"bar":[{"error_x":{"color":"#2a3f5f"},"error_y":{"color":"#2a3f5f"},"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"bar"}],"scattergeo":[{"type":"scattergeo","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterpolar":[{"type":"scatterpolar","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"histogram":[{"marker":{"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"histogram"}],"scattergl":[{"type":"scattergl","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatter3d":[{"type":"scatter3d","line":{"colorbar":{"outlinewidth":0,"ticks":""}},"marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermap":[{"type":"scattermap","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattermapbox":[{"type":"scattermapbox","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scatterternary":[{"type":"scatterternary","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"scattercarpet":[{"type":"scattercarpet","marker":{"colorbar":{"outlinewidth":0,"ticks":""}}}],"carpet":[{"aaxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"baxis":{"endlinecolor":"#2a3f5f","gridcolor":"#C8D4E3","linecolor":"#C8D4E3","minorgridcolor":"#C8D4E3","startlinecolor":"#2a3f5f"},"type":"carpet"}],"table":[{"cells":{"fill":{"color":"#EBF0F8"},"line":{"color":"white"}},"header":{"fill":{"color":"#C8D4E3"},"line":{"color":"white"}},"type":"table"}],"barpolar":[{"marker":{"line":{"color":"white","width":0.5},"pattern":{"fillmode":"overlay","size":10,"solidity":0.2}},"type":"barpolar"}],"pie":[{"automargin":true,"type":"pie"}]}};
36
+
37
+ // if jsonData.layout exists, then update the theme
38
+ if (jsonData.layout) {
39
+ if (jsonData.layout.template) {
40
+ jsonData.layout.template = { ...plotlyLightLayout, ...jsonData.layout.template };
41
+ } else {
42
+ jsonData.layout.template = plotlyLightLayout;
43
+ }
44
+ } else {
45
+ jsonData.layout = { template: plotlyLightLayout };
46
+ }
47
+ }
48
+
49
+ Plotly.react(chartElement, jsonData.data, jsonData.layout);
50
+ });
51
+ }
52
+ });