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,92 @@
1
+ ---
2
+ title: Edit Safely In GitHub Web
3
+ description: A browser-only content workflow that prevents overlapping edits and lost work.
4
+ lang: en
5
+ ref: github_web_editing
6
+ profiles:
7
+ - unaltredocs
8
+ documentation_profiles:
9
+ - github-publishers
10
+ - local-authors
11
+ - site-designers
12
+ - contributors
13
+ section: Start Here
14
+ weight: 20
15
+ permalink: "/github-web-editing/"
16
+ nav_title: GitHub Web Editing
17
+ ---
18
+ <p class="lede">GitHub Web is a supported path for small content updates. Editors coordinate through issues, one-task branches, and Draft pull requests; maintainers own local rendering, merge decisions, and manual deployment.</p>
19
+
20
+ ## Before Editing
21
+
22
+ 1. Open or choose an issue describing one focused task.
23
+ 2. Be assigned to it, or post an explicit reservation naming every file you intend to edit and wait for maintainer acceptance.
24
+ 3. Check the issue and open pull requests before starting. There must be only one active editor per file.
25
+ 4. Create one branch for the task. Never edit or commit directly to `main`.
26
+ 5. Open a Draft pull request early, link the issue, and list the reserved files.
27
+
28
+ An issue without an assignee or accepted reservation is not a claim on files. A broad reservation such as "all chapters" should be split into smaller tasks before editing begins.
29
+
30
+ ## While Editing
31
+
32
+ - Change only reserved files and keep the pull request small enough to review as one task.
33
+ - Use a separate issue and branch for unrelated corrections, reorganizations, or formatting.
34
+ - Recheck the pull request's **Files changed** tab before requesting review.
35
+ - Keep the pull request in Draft while files or content are incomplete.
36
+ - If GitHub reports a conflict or another editor needs the same file, stop. Do not choose "accept ours/theirs", recreate the file, or overwrite their work. Ask the maintainer to sequence or reconcile the tasks.
37
+
38
+ This protocol makes overlap visible before work is lost. Chat messages may help coordination, but the issue or reservation and Draft pull request are the repository record.
39
+
40
+ ## Choose The Right Content Paths
41
+
42
+ The generated site's `README.md` identifies its selected profile and gives the authoritative editor list. Typical paths are:
43
+
44
+ | Profile | Purpose | Typical editable content |
45
+ |---|---|---|
46
+ | `unaltreselfie` | Personal academic or professional site | `_pages/<lang>/`, `_posts/`, `_news/`, `_projects/`, `_books/`, `_bibliography/`, approved profile images and CV files |
47
+ | `unaltreprojecte` | Research project, group, infrastructure, or output site | `_pages/<lang>/`, `_news/`, `_projects/`, `_outputs/`, `_books/`, `_data/team.yml`, `_data/repositories.yml`, `_bibliography/`, approved project images |
48
+ | `unaltremanual` | Manual, course, handbook, or book-like publication | `_pages/<lang>/`, `_chapters/<lang>/`, `_bibliography/`, `context/writing-profile.md`, approved source images |
49
+ | `unaltredocs` | Technical or operational documentation | `_pages/<lang>/`, `_documentation/<lang>/`, public `_data/` files, approved screenshots |
50
+
51
+ A small change to public title, URL, languages, or profile options in `_config.yml` requires maintainer agreement. Do not restructure configuration in a content pull request.
52
+
53
+ ## Upload Images Safely
54
+
55
+ 1. Reserve the new filename and upload it on the task branch, not on `main`.
56
+ 2. Put it in `assets/img/` or an established editorial image subfolder. Never upload into `assets/img/generated/`.
57
+ 3. Use a descriptive lowercase filename and prefer a reasonably sized PNG, JPEG, or WebP. Only use SVG from a reviewed, trusted source.
58
+ 4. Confirm publication rights and check that the file contains no confidential information, unintended personal data, or sensitive metadata.
59
+ 5. Prefer a new filename. Replace an existing file only when that exact replacement was reserved.
60
+ 6. Reference the image in the same pull request and add meaningful alternative text. The maintainer must inspect the rendered page.
61
+
62
+ ## Never Edit These In GitHub Web
63
+
64
+ - `.github/`, `.unaltraweb/`, `.gitignore`, `Gemfile`, `Gemfile.lock`, and `Makefile` control repository or runtime behaviour.
65
+ - `_layouts/`, `_includes/`, `_plugins/`, and `_sass/` are technical theme overrides.
66
+ - `_site/`, `tmp/`, `.jekyll-cache/`, `.bundle/`, and `vendor/` are build products or caches.
67
+ - `assets/img/generated/`, `.unaltraweb/computations.lock.json`, `.vegavisuals.lock.json`, rendered diagrams/captures, and files marked as generated belong to local renderers.
68
+ - A generated `.md` owned by a `.qmd`, `.Rmd`, `.R`, `.py`, or `.ipynb` source must not be hand-edited. A maintainer edits and renders the source locally.
69
+ - The default manual outputs `assets/pdf/manual-<lang>.pdf` and `assets/img/manual-cover-<lang>.png` are deployment products, not versioned source files.
70
+
71
+ Never put passwords, access tokens, API keys, private keys, credentials, or `.env` files in issues, commits, branches, or pull requests. Ask the maintainer about any path not explicitly listed as editable.
72
+
73
+ ## Maintainer Handoff
74
+
75
+ After the editor requests review, the maintainer:
76
+
77
+ 1. Verifies the issue assignment or reservation, task branch, and changed-file scope.
78
+ 2. Checks out the branch locally and runs the site checks plus every required computation, diagram, visualization, capture, and PDF render.
79
+ 3. Reviews the rendered web output and, for a manual, the PDF and cover.
80
+ 4. Resolves any overlap or conflict with the affected editors, then approves and merges the small pull request.
81
+ 5. Starts deployment manually only after the reviewed change is on `main` and publication is intended.
82
+
83
+ Pushing a branch or merging to `main` does not publish a generated site. Local checks and renders do not deploy it either.
84
+
85
+ ## unaltremanual Publishing
86
+
87
+ - `latest` is a manual-only deployment from the reviewed `main` branch.
88
+ - A push or merge to `main` does not deploy it. The maintainer runs local checks/renders and then starts the deploy workflow manually.
89
+ - When PDF output is enabled, `assets/pdf/manual-<lang>.pdf` and `assets/img/manual-cover-<lang>.png` are generated during deployment and are not versioned. Existing tracked copies need one reviewed `git rm --cached` migration by a maintainer.
90
+ - Stable editions use `vYYYY.MM(.N)`: `vYYYY.MM` for the first edition in a month and `vYYYY.MM.N` for an additional edition. They are deferred to explicit releases, and deploying `latest` does not create one.
91
+ - The release selector and channel are visible in the generated manual home, `manual-release.json`, and PDF editorial metadata.
92
+ - Release checks reject `legacy/` or `sandbox/` material if it appears in the generated site. Keep it outside current manual content paths.
@@ -0,0 +1,125 @@
1
+ ---
2
+ title: Choose A Site Profile
3
+ description: Prepared website families supported by unaltraweb.
4
+ lang: en
5
+ ref: site_profiles
6
+ profiles:
7
+ - unaltredocs
8
+ documentation_profiles:
9
+ - github-publishers
10
+ - local-authors
11
+ - site-designers
12
+ - contributors
13
+ - core-developers
14
+ section: Build A Site
15
+ weight: 220
16
+ permalink: "/profiles/"
17
+ nav_title: Site Profiles
18
+ ---
19
+ <p class="lede">A site profile is a high-level prepared website family. It is not a Jekyll layout or include. Profiles select the real build shape before Jekyll writes the site.</p>
20
+
21
+ ```yaml
22
+ unaltraweb:
23
+ site_profile: unaltreselfie
24
+ features:
25
+ blog: true
26
+ cv: true
27
+ projects: true
28
+ publications: true
29
+ metrics: true
30
+ ```
31
+
32
+ ## Current Profiles
33
+
34
+ - **unaltreselfie**: academic or professional personal sites with profile home, optional blog, CV, projects, publications, readings, social links and content search.
35
+ - **unaltreprojecte**: research project sites with home pages, team, outputs, publications, resources, repositories, news and content search.
36
+ - **unaltremanual**: book-like manuals with localized chapters, sidebar navigation, right-hand table of contents, manual search and teaching blocks.
37
+ - **unaltredocs**: technical documentation sites with left-hand index, search, reusable examples and operational pages.
38
+
39
+ ## Screenshots
40
+
41
+ These screenshots come from the companion template render smoke tests and are generated from working profile builds.
42
+
43
+ <div class="row g-4">
44
+ <div class="col-md-6">
45
+ <figure class="figure">
46
+ <img class="figure-img img-fluid rounded border" src="https://raw.githubusercontent.com/dosquartsdedocs/unaltraweb-template/main/assets/img/screenshots/home-light-chromium.png" alt="unaltreselfie profile home page screenshot" loading="lazy">
47
+ <figcaption class="figure-caption"><strong>unaltreselfie.</strong> Personal academic homepage with profile card, highlights, posts, publications and projects.</figcaption>
48
+ </figure>
49
+ </div>
50
+ <div class="col-md-6">
51
+ <figure class="figure">
52
+ <img class="figure-img img-fluid rounded border" src="https://raw.githubusercontent.com/dosquartsdedocs/unaltraweb-template/main/assets/img/screenshots/project-home-chromium.png" alt="unaltreprojecte profile home page screenshot" loading="lazy">
53
+ <figcaption class="figure-caption"><strong>unaltreprojecte.</strong> Research project homepage with project navigation, team, outputs and resources.</figcaption>
54
+ </figure>
55
+ </div>
56
+ <div class="col-md-6">
57
+ <figure class="figure">
58
+ <img class="figure-img img-fluid rounded border" src="https://raw.githubusercontent.com/dosquartsdedocs/unaltraweb-template/main/assets/img/screenshots/manual-home-chromium.png" alt="unaltremanual profile home page screenshot" loading="lazy">
59
+ <figcaption class="figure-caption"><strong>unaltremanual.</strong> Course/manual home with chapters, teaching affordances and reader-oriented layout.</figcaption>
60
+ </figure>
61
+ </div>
62
+ <div class="col-md-6">
63
+ <figure class="figure">
64
+ <img class="figure-img img-fluid rounded border" src="https://raw.githubusercontent.com/dosquartsdedocs/unaltraweb-template/main/assets/img/screenshots/unaltredocs-home-chromium.png" alt="unaltredocs profile home page screenshot" loading="lazy">
65
+ <figcaption class="figure-caption"><strong>unaltredocs.</strong> Documentation profile with sectioned content and documentation navigation.</figcaption>
66
+ </figure>
67
+ </div>
68
+ </div>
69
+
70
+ ## Choosing A Profile
71
+
72
+ | Profile | Use it for | Main content |
73
+ |---|---|---|
74
+ | `unaltreselfie` | A person, researcher, lab member or professional portfolio | `author` config, `_posts/`, `_news/`, `_projects/`, `_bibliography/`, CV PDF |
75
+ | `unaltreprojecte` | A research project, funded initiative or group output site | project pages, team data, outputs, repositories, readings, publications and news |
76
+ | `unaltremanual` | A manual, course, handbook or book-like learning resource | `_chapters/`, manual bibliography, callouts, figures, tables, Mermaid diagrams and search index |
77
+ | `unaltredocs` | Technical or operational documentation | `_documentation/` pages with `section`, `subsection` and `weight` front matter |
78
+
79
+ All four profiles emit `assets/js/content-search-index.json`. The header search returns each whole-word occurrence separately, folds diacritics for matching, and adds previous/next occurrence navigation after a result is opened. Set `search_exclude: true` in front matter for a public page or document that should not enter this index. `search_enabled` controls the separate Ninja Keys title/navigation palette and does not disable content search.
80
+
81
+ ## Local Profile Review
82
+
83
+ Preview one profile without changing `_config.yml`:
84
+
85
+ ```bash
86
+ make serve SITE_PROFILE=unaltreprojecte
87
+ ```
88
+
89
+ Run all template profile demos together:
90
+
91
+ ```bash
92
+ make serve-allprofiles
93
+ ```
94
+
95
+ The local port convention is:
96
+
97
+ - `4001`: `unaltreselfie`.
98
+ - `4002`: `unaltreprojecte`.
99
+ - `4003`: `unaltremanual`.
100
+ - `4004`: `unaltredocs`.
101
+
102
+ ## Filtering Content
103
+
104
+ Pages and documents can opt into profiles:
105
+
106
+ ```yaml
107
+ profiles: [unaltreselfie, unaltreprojecte]
108
+ ```
109
+
110
+ The core filters non-matching pages before writing the site. Alternate profiles should be tested by rebuilding with a config overlay, not by client-side preview switches.
111
+
112
+ ## Feature Flags
113
+
114
+ Navigation pages can use a feature key:
115
+
116
+ ```yaml
117
+ feature: projects
118
+ nav: true
119
+ ```
120
+
121
+ If `unaltraweb.features.projects` is `false`, the page is hidden from navigation while the content can remain in the repository.
122
+
123
+ ## Documentation Site Name
124
+
125
+ The public documentation site for this project is called `unaltraweb`. It may use documentation-oriented layouts and examples, but it should present the whole platform rather than brand itself as `unaltredocs`.
@@ -0,0 +1,39 @@
1
+ ---
2
+ title: Build A Personal Site With unaltreselfie
3
+ description: Personal academic and professional sites.
4
+ lang: en
5
+ ref: profile_unaltreselfie
6
+ profiles:
7
+ - unaltredocs
8
+ documentation_profiles:
9
+ - github-publishers
10
+ - local-authors
11
+ - site-designers
12
+ - contributors
13
+ section: Build A Site
14
+ weight: 230
15
+ permalink: "/profiles/unaltreselfie/"
16
+ nav_title: Personal Site
17
+ ---
18
+ Use `unaltreselfie` for a personal academic, researcher or professional website.
19
+
20
+ ```yaml
21
+ unaltraweb:
22
+ site_profile: unaltreselfie
23
+ features:
24
+ news: true
25
+ blog: true
26
+ cv: true
27
+ projects: true
28
+ publications: true
29
+ readings: true
30
+ ```
31
+
32
+ Typical content:
33
+
34
+ - `author` block in `_config.yml`.
35
+ - Localized home pages using `layout: profile`.
36
+ - `_posts/`, `_news/`, `_projects/`, `_bibliography/` and CV assets.
37
+
38
+ The profile card, social links, highlights and publication summaries come from the core theme.
39
+ Bibliographies use curriculum order: year and month descending, with author and title as stable tie-breakers inside the same date.
@@ -0,0 +1,38 @@
1
+ ---
2
+ title: Build A Project Site With unaltreprojecte
3
+ description: Research project and infrastructure sites.
4
+ lang: en
5
+ ref: profile_unaltreprojecte
6
+ profiles:
7
+ - unaltredocs
8
+ documentation_profiles:
9
+ - github-publishers
10
+ - local-authors
11
+ - site-designers
12
+ - contributors
13
+ section: Build A Site
14
+ weight: 240
15
+ permalink: "/profiles/unaltreprojecte/"
16
+ nav_title: Project Site
17
+ ---
18
+ Use `unaltreprojecte` for a funded project, lab infrastructure, consortium or research output site.
19
+
20
+ ```yaml
21
+ unaltraweb:
22
+ site_profile: unaltreprojecte
23
+ features:
24
+ publications: true
25
+ readings: true
26
+ news: true
27
+ ```
28
+
29
+ Typical content:
30
+
31
+ - Project landing pages in `_pages/`.
32
+ - Team data in `_data/`.
33
+ - `_outputs/` for reports, datasets, maps and policy briefs.
34
+ - `_projects/` for related or previous projects.
35
+ - Repository and resource pages.
36
+
37
+ Project cards can use `hero` images and `resources` badges for DOI, GitHub, documentation and datasets.
38
+ Project bibliographies place the newest outputs first by year and month, then use author and title to keep equal-date records deterministic.
@@ -0,0 +1,237 @@
1
+ ---
2
+ title: Build A Manual With unaltremanual
3
+ description: Manuals, courses and book-like teaching sites.
4
+ lang: en
5
+ ref: profile_unaltremanual
6
+ profiles:
7
+ - unaltredocs
8
+ documentation_profiles:
9
+ - github-publishers
10
+ - local-authors
11
+ - site-designers
12
+ - contributors
13
+ - core-developers
14
+ section: Build A Site
15
+ weight: 250
16
+ permalink: "/profiles/unaltremanual/"
17
+ nav_title: Manual Site
18
+ ---
19
+ Use `unaltremanual` for long-form teaching material, course manuals and book-like documentation.
20
+
21
+ ```yaml
22
+ unaltraweb:
23
+ site_profile: unaltremanual
24
+ manual:
25
+ collection: chapters
26
+ cover_image: /assets/img/manual-cover.png
27
+ show_chapter_index: true
28
+ figure_captions:
29
+ enabled: true
30
+ collections: [chapters]
31
+ ```
32
+
33
+ Typical content:
34
+
35
+ - Localized manual home pages with `layout: manual-home`.
36
+ - Chapters under `_chapters/<lang>/`.
37
+ - Callouts, figures, subfigures, captioned code listings, numbered tables and Mermaid diagrams.
38
+ - Optional manual bibliography.
39
+ - A local `context/writing-profile.md` for audience, voice, terminology, evidence, language, and review rules.
40
+
41
+ The package scaffold provides a usable default writing profile and a computation configuration that selects the distribution's R and Python workers. It accepts executable chapters under `_chapters` and figure-only sources under `assets/quarto` without copying worker implementation into the site. Revise the writing profile before substantial drafting when the manual has project-specific editorial requirements. The site profile also includes a sticky chapter sidebar, right-hand table of contents, reader font controls and the shared occurrence-level content search.
42
+
43
+ The scaffold stores manual references in `_bibliography/manual.bib`. Manual bibliographies are alphabetical by contributor name, then year and title. This applies to the general bibliography and to the cited references emitted by a chapter with `manual_references: true`. On the web, the visible reference omits its trailing DOI or URL because the adjacent DOI/LINK buttons and expandable citation panel already expose that access information. The printable PDF keeps DOI and URL text, sorts the general bibliography alphabetically, and inserts an alphabetical references section in each chapter that requests one.
44
+
45
+ Figures can use independent display constraints for each support. `data-figure-width-web` and `data-figure-height-web` control the browser presentation; `data-figure-width-pdf` and `data-figure-height-pdf` become print constraints while preserving the intrinsic aspect ratio. The older `data-figure-width` remains a shared fallback. Run `manual_source_quality_check` after adding a text-bearing SVG so the MCP can compare its effective text with body text and suggest separate web/PDF widths.
46
+
47
+ In multilingual manuals, keep the default-language visual unsuffixed and insert `.<lang>` before the complete suffix for translated variants, such as `map.ca.svg`, `plot.ca.qmd`, `bars.ca.vl.json`, or `flow.ca.puml`. The requested language falls back to the unsuffixed source when its variant is absent; an existing localized source with a broken generated output remains a build error.
48
+
49
+ The manual home lists chapter cards by default. Set `unaltraweb.manual.show_chapter_index: false` globally, or `show_chapter_index: false` in a manual home page's front matter, when the sidebar is sufficient and the home should contain only introductory material.
50
+
51
+ Unlike `unaltredocs`, `unaltremanual` keeps linear reading affordances such as previous/next chapter navigation. Use it when the primary path through the content is sequential.
52
+
53
+ ## Publishing Current And Stable Editions
54
+
55
+ The current publishing contract separates an up-to-date reading site from durable editions:
56
+
57
+ - `latest` is a manual-only deployment built from the reviewed `main` branch.
58
+ - Pushing or merging to `main` does not deploy it. After local checks, required renders, and human review, a maintainer starts deployment manually.
59
+ - When PDF output is enabled, the default `assets/pdf/manual-<lang>.pdf` and `assets/img/manual-cover-<lang>.png` outputs are generated during deployment and are not versioned.
60
+ - The generated home, `manual-release.json`, and PDF editorial metadata identify the selected channel and version.
61
+ - Stable editions use `vYYYY.MM(.N)`: `vYYYY.MM` for the first edition in a month and `vYYYY.MM.N` for an additional edition. They are deferred until a maintainer creates an explicit release, and an ordinary `latest` deployment never creates one.
62
+ - Release checks reject generated `legacy/` or `sandbox/` trees. Keep them outside the current manual content roots.
63
+
64
+ The generated site README and pull request template require one assigned issue or explicit file reservation, one task branch, one active editor per file, and a small Draft pull request. If edits overlap or conflict, stop and ask the maintainer rather than choosing a side or recreating files.
65
+
66
+ ## Executable Chapters
67
+
68
+ An executable chapter has an authoritative Quarto, R, Python, or notebook source and a versioned same-stem Markdown result. Ordinary Jekyll and PDF builds consume the committed Markdown and figures; they never execute the analysis automatically.
69
+
70
+ Supported sources are `.qmd`, `.Rmd`, `.R`, `.py`, and `.ipynb`. Keep sources under a configured source root such as `_chapters/`. A default render publishes:
71
+
72
+ - `chapter.qmd` as `chapter.md` beside its source.
73
+ - Figures under `assets/img/generated/<lang>/<ref>/`.
74
+ - Provenance and artifact signatures in `.unaltraweb/computations.lock.json`.
75
+
76
+ Commit the executable source, generated Markdown, generated figures, and lock together. When an executable source exists, edit it rather than the generated `.md`.
77
+
78
+ ### Chapter Metadata
79
+
80
+ Every executable chapter requires `title`, `lang`, and `ref`. A `.qmd` must also select exactly one engine:
81
+
82
+ ```yaml
83
+ ---
84
+ layout: manual-chapter
85
+ title: Computed chapter
86
+ lang: en
87
+ ref: computed-chapter
88
+ weight: 60
89
+ unaltraweb_compute:
90
+ engine: python
91
+ inputs:
92
+ - data/source.csv
93
+ ---
94
+ ```
95
+
96
+ `.Rmd` and `.R` infer R; `.py` and `.ipynb` infer Python. Use normal YAML front matter in `.qmd` and `.Rmd`, a `#' ---` roxygen block in `.R`, and a commented `# ---` block in `.py`. A notebook can store the mapping in `metadata.unaltraweb_front_matter` or in the first raw or Markdown cell.
97
+
98
+ Optional `unaltraweb_compute` fields are `inputs`, `output`, `figures`, and `enabled`. Paths must be project-relative and cannot escape the repository. Generated Markdown must remain under one configured `source_roots` directory; figures must use a strict subdirectory of `generated_assets_root`. Source roots cannot be the project root, cannot overlap each other, and cannot overlap the generated assets root. A custom source root is both a discovery root and a Jekyll source-exclusion root, so keep executable sources and their same-tree Markdown outputs together. `enabled: false` excludes one source. Computation-private metadata is removed from the generated Markdown while public chapter metadata is preserved.
99
+
100
+ ### Project Configuration
101
+
102
+ The scaffold creates a consumer-owned `.unaltraweb/computations.yml` with both release-selected engines. Extend it to define additional discovery roots and project-specific environment dependencies:
103
+
104
+ ```yaml
105
+ version: 1
106
+ enabled: true
107
+ source_roots:
108
+ - _chapters
109
+ generated_assets_root: assets/img/generated
110
+ engines:
111
+ python:
112
+ image: ghcr.io/dosquartsdedocs/unaltraweb-compute-python@sha256:18cb269811bd4005800382da25a480ec2bca7eac8d0501ad1ef36bad1c0f8cd9
113
+ lockfiles:
114
+ - requirements-compute.txt
115
+ fingerprint_paths:
116
+ - analysis/helpers
117
+ r:
118
+ image: ghcr.io/dosquartsdedocs/unaltraweb-compute-r@sha256:928ffb93f221e09e8b929157dee473b838e061915a2eb67224e4124b85f81837
119
+ lockfiles:
120
+ - renv.lock
121
+ ```
122
+
123
+ `unaltraweb_compute.inputs` declares source-specific non-code inputs. Engine `lockfiles` and `fingerprint_paths` describe shared environment dependencies. Files and directories are fingerprinted recursively. Changing a source, declared input, Dockerfile, lockfile, fingerprint path, configuration, or available selected-image identity makes its results stale.
124
+
125
+ Use `unaltraweb_compute.mode: figure` for executable sources that only generate reusable figures, such as an SVG chart referenced from a hand-written chapter. In that mode, declare every versioned output under `unaltraweb_compute.outputs`; the renderer checks the declared files and records their signatures without creating a generated Markdown chapter.
126
+
127
+ ```yaml
128
+ unaltraweb_compute:
129
+ engine: python
130
+ mode: figure
131
+ outputs:
132
+ - assets/img/generated/en/palette-reference.svg
133
+ ```
134
+
135
+ The execution container has no network, a read-only root filesystem, dropped capabilities, and resource limits, but the entire project is mounted read-write so Quarto can stage results. Declared inputs provide provenance and freshness checks; they are not a filesystem access policy. Run only trusted chapter code and review the working tree after rendering.
136
+
137
+ ### Render And Check
138
+
139
+ The MCP exposes the stable workflow without copying implementation targets into the consumer Makefile:
140
+
141
+ ```text
142
+ manual_computation_status
143
+ manual_computation_check
144
+ manual_computation_render
145
+ manual_computation_render_figures
146
+ manual_computation_render(source="_chapters/en/chapter.qmd")
147
+ ```
148
+
149
+ `status` prints JSON and remains informational even when `ok` is false. `check` exits nonzero for missing, stale, modified, or orphaned results. `render` executes explicitly, reuses an available selected worker or pulls it on first use, stages output, serializes publication per project, and replaces managed Markdown and figures with rollback on ordinary errors. `manual_computation_render_figures` renders only stale `mode: figure` sources and never executes chapter-mode sources. Source execution runs without network access and with Quarto caches disabled; image preparation occurs before the network-disabled worker starts.
150
+
151
+ The shared PDF template keeps normal paragraph spacing instead of stretching sparse pages to the bottom margin, avoids widow and orphan lines, and reserves body text after section headings. Callouts and figures that fit on one page move as a unit to the next page when necessary. Captioned tables reserve their estimated height; genuinely long tables start on a fresh page and may continue only between rows when they exceed one page. Figure and table captions appear above their content and use a smaller sans-serif hierarchy, muted body text, restrained blue numbering, hanging alignment with language-aware hyphenation, and deliberate vertical spacing. Subfigure captions are quieter, a thin rule separates a multi-panel caption from its panels, and the same blue identifies only the numeric prefixes of headings while title text remains neutral.
152
+
153
+ The first render refuses to overwrite an existing same-stem Markdown file or figure directory that is not recorded in the computation lock. Review the collision before an intentional takeover:
154
+
155
+ ```text
156
+ manual_computation_render(confirm_overwrite=true)
157
+ ```
158
+
159
+ Do not use that confirmation as a permanent default. Do not edit `.unaltraweb/computations.lock.json` manually; review it as generated provenance.
160
+
161
+ Deleting or disabling a source leaves its lock record and generated artifacts as an orphan, so publication remains blocked. Review and remove the old generated Markdown and figure directory, then run a full `manual_computation_render`; the renderer removes an orphan lock record only after both managed paths are absent.
162
+
163
+ `make serve`, `make build`, `make test`, profile previews, Playwright checks, PDF operations, and the reusable Pages workflow reject stale results. The internal capture-only preview is the deliberate exception because it must render the artefact that is currently stale. CI checks committed artifacts without recalculating them. Equivalent MCP tools are `manual_computation_status`, `manual_computation_check`, `manual_computation_render`, and `manual_computation_render_figures`.
164
+
165
+ ### Static Vega Figures
166
+
167
+ Static Vega-Lite and Vega figures use `*.vl.json` and `*.vg.json` sources declared in `.vegavisuals.yml`. A chapter references the specification as a captioned Markdown image; Jekyll and the PDF builder resolve it to the same single manifest output without changing the caption or figure attributes. Prefer SVG when the figure must work identically on the web and in print.
168
+
169
+ Use the required companion `vegavisuals` MCP and its `initialize_project`, `visualization_status`, `render_visualizations`, and `visualization_check` tools for the source-to-output lifecycle. ContExt registers the companion separately rather than copying it into the site. Run `visualization_check` before PDF status, build, or publication when a manifest exists; the unaltraweb PDF tool does not proxy the separate MCP. Commit the manifest, lock, provider receipt, source data, and generated outputs together.
170
+
171
+ ## PDF Edition
172
+
173
+ The optional PDF builder runs in a dedicated Docker image containing Pandoc, XeLaTeX, multilingual TeX packages, SVG conversion and Poppler. It reads the same localized manual home and chapter sources as Jekyll, orders chapters by `weight`, resolves rendered Mermaid, PlantUML and manifest-backed Vega outputs, converts Jekyll Scholar citations, alphabetizes Citeproc output from structured contributor metadata, restores printable access links omitted by a CSL, and extracts the first PDF page as the web cover.
174
+
175
+ ```yaml
176
+ unaltraweb:
177
+ manual:
178
+ bibliography: true
179
+ bibliography_file: manual.bib
180
+ metadata:
181
+ short_title: COURSE
182
+ series: Course materials
183
+ series_subtitle: Learning resources
184
+ publisher: Example Press
185
+ edition: First digital edition
186
+ publication_date:
187
+ en: August 22, 2026
188
+ identifier: "urn:isbn:9780000000000"
189
+ license: CC BY 4.0
190
+ source: https://example.edu/manual/
191
+ rights: © The authors
192
+ subject: Full course name
193
+ teaching_guides:
194
+ - degree: First degree name
195
+ subject_code: "COURSE-01"
196
+ - degree: Second degree name
197
+ subject_code: "COURSE-02"
198
+ institution: University name
199
+ academic_year: 2026/2027
200
+ revision_date:
201
+ en: August 11, 2026
202
+ instructors:
203
+ - name: First Teacher
204
+ pdf:
205
+ enabled: true
206
+ languages: [en]
207
+ output: assets/pdf/manual-{lang}.pdf
208
+ cover_output: assets/img/manual-cover-{lang}.png
209
+ cover:
210
+ image: assets/img/manual-cover-background.jpg
211
+ institution_logo: assets/img/institution-logo.pdf
212
+ band_color: "990000"
213
+ ```
214
+
215
+ The cover deliberately contains only structural publication elements: series, title, instructors, main image, institutional logo, and bands. Bibliographic fields, course context, authorship, rights, any declared source or license, and the build's publication channel/selector are rendered on a compact localized editorial-credits page inside the PDF. The same selector appears on the manual home and in generated `manual-release.json`. `publisher`, `edition`, `publication_date`, `identifier`, `license`, and `source` are optional and accept either a scalar or a language map. The builder does not infer them from the institution, revision date, site URL, or other fields; omit values that are not authoritative.
216
+
217
+ The default template is a two-sided, open-right book: inner and outer margins mirror, folios sit at the outer edge, numbered and unnumbered chapters begin on recto pages, and inserted blank versos carry no headers or folios. Main matter starts at chapter 0, and each chapter opens as a single `number. title` heading. The secondary cover color is shared by complete headings and figure or table labels. PDF syntax highlighting, language headers, and line numbers are guaranteed for Bash, SQL, Python, R, and the semantic `url`, `spreadsheet`, and `filetree` fences. The semantic headers are localized from the document language. Plain, unlabelled, and unsupported fences use an unnumbered verbatim panel without a header. Both panel variants alternate line backgrounds, and long lines wrap inside the printable page.
218
+
219
+ The PDF workflow checks executable chapters before reading their generated Markdown. Normal site work uses the MCP tools; the additional check/sync targets remain factory-maintainer operations:
220
+
221
+ ```text
222
+ manual_pdf_status
223
+ manual_pdf_build(release_selector="latest")
224
+ manual_pdf_publish # dry-run by default
225
+ manual_pdf_publish(dry_run=false, confirm_publish=true)
226
+ build_site(site_profile="unaltremanual", release_selector="latest")
227
+ manual_release_status(selector="latest")
228
+ manual_release_prepare(selector="latest") # dry-run
229
+ manual_release_prepare(selector="latest", dry_run=false, confirm_prepare=true)
230
+ manual_release_check(selector="latest")
231
+ factory: MCP_CONSUMER_WORKSPACE=/path/to/site make manual-pdf-sync
232
+ factory: MCP_CONSUMER_WORKSPACE=/path/to/site make manual-pdf-check
233
+ ```
234
+
235
+ Builds remain under `tmp/manual-pdf/<lang>/`. Each language build creates both the PDF and a PNG extracted from its first page. The release selector is part of the PDF fingerprint, so every PDF build, site build, and candidate operation in one sequence must use the same selector. The default template derives XeTeX's trailer ID from that fingerprint, and the builder canonicalizes the lossless PDF streams with qpdf, so identical inputs and selector produce byte-identical PDFs. A custom template must put `\special{pdf:trailerid [<$trailer-id$><$trailer-id$>]}` on its first output page to preserve that property. Local publication can copy those artefacts to the configured project-relative public paths for review, but it does not commit, push, deploy, or write outside the site. The default public PDF and cover paths are ignored and remain unversioned; the manual deployment rebuilds them from reviewed source. The download button appears when the generated PDF exists among the built site's static files. Chapters can opt out with `pdf: false`.
236
+
237
+ `manual_release_status` and `manual_release_check` are offline and read-only. `manual_release_prepare` writes only a local evidence bundle below `tmp/manual-release/<selector>/`; it never tags, pushes, deploys, or creates a GitHub release. Stable local candidates are no-clobber while their selector directory exists, but the durable object is the published GitHub tag/release after immutable releases are enabled for the repository, not the disposable `tmp/` directory. A stable sequence must start at the consumer repository root on the exact clean Git commit that will be reviewed on `main`; nested repositories, submodules, Git clean/smudge filters, and versioned PDF outputs are rejected. Start the MCP with the reviewed `ghcr.io/dosquartsdedocs/unaltraweb-mcp@sha256:<digest>` image rather than a mutable tag. The commit timestamp fixes Jekyll's build time, source and site fingerprints use canonical modes, and the version-2 release manifest records the commit, epoch, and site-build image. Use the same `vYYYY.MM(.N)` selector for PDF build, site build, and candidate preparation, and additionally require approved default-language content, no draft PDF, and a clean editorial quality check. Record the reviewed candidate with `sha256sum tmp/manual-release/<selector>/release-manifest.json`; the stable workflow must reproduce that digest before publication can proceed.
@@ -0,0 +1,92 @@
1
+ ---
2
+ title: Build A Documentation Portal With unaltredocs
3
+ description: Technical documentation portals.
4
+ lang: en
5
+ ref: profile_unaltredocs
6
+ profiles:
7
+ - unaltredocs
8
+ documentation_profiles:
9
+ - github-publishers
10
+ - local-authors
11
+ - site-designers
12
+ - contributors
13
+ - core-developers
14
+ section: Build A Site
15
+ weight: 260
16
+ permalink: "/profiles/unaltredocs/"
17
+ nav_title: Documentation Portal
18
+ ---
19
+ Use `unaltredocs` for documentation portals with a left index, search, section cards and operational references.
20
+
21
+ ```yaml
22
+ unaltraweb:
23
+ site_profile: unaltredocs
24
+ documentation:
25
+ collection: documentation
26
+ ```
27
+
28
+ Typical content:
29
+
30
+ - A documentation home document with `layout: documentation-home`.
31
+ - Documents under `_documentation/<lang>/`.
32
+ - `section`, `subsection` and `weight` front matter to build the documentation navigation.
33
+ - Optional documentation profile metadata with `documentation_profiles`.
34
+ - Optional multilingual home pages and documents.
35
+
36
+ This `unaltraweb` site is itself built with the `unaltredocs` profile.
37
+
38
+ ## Documentation Profiles
39
+
40
+ `unaltredocs` can expose a small set of reader profiles as a dropdown at the top of the table of contents. Define the profile choices in site config:
41
+
42
+ ```yaml
43
+ unaltraweb:
44
+ documentation:
45
+ profiles:
46
+ - id: local-authors
47
+ label: Local authors
48
+ - id: core-developers
49
+ label: Core developers
50
+ ```
51
+
52
+ Then tag pages that belong mainly to one of those profiles:
53
+
54
+ ```yaml
55
+ ---
56
+ title: Installation
57
+ section: User guide
58
+ weight: 20
59
+ documentation_profiles: [local-authors]
60
+ ---
61
+ ```
62
+
63
+ The selected profile is stored in `localStorage` and mirrored to the `doc_profile` query parameter, so profile views can be shared. The first dropdown option shows all documentation. Pages without `documentation_profiles` remain visible for every profile.
64
+
65
+ Direct page links remain available even if the active profile would normally hide that page from navigation. In that case the page shows a short notice instead of hiding the content.
66
+
67
+ Content search follows the active documentation profile and returns each matching occurrence separately. Matching is whole-word and diacritic-insensitive; opening a result highlights every occurrence on that page and provides previous/next navigation across the filtered result set.
68
+
69
+ ## Reading Model
70
+
71
+ `unaltredocs` is not a book. Previous/next links are disabled by default because operational documentation is usually task, reference and troubleshooting oriented. If a documentation site needs a linear path, set:
72
+
73
+ ```yaml
74
+ unaltraweb:
75
+ documentation:
76
+ previous_next: true
77
+ ```
78
+
79
+ For full manuals, courses or books, prefer `unaltremanual`.
80
+
81
+ ## Version Metadata
82
+
83
+ Version labels can be recorded in front matter before a site needs full versioned builds:
84
+
85
+ ```yaml
86
+ introduced_in: "0.4"
87
+ changed_in: "0.6"
88
+ deprecated_in:
89
+ removed_in:
90
+ ```
91
+
92
+ Use these keys to annotate when a page or feature changed. Separate `/latest/`, `/stable/` or `/v1.0/` documentation trees should only be added when a project needs complete historical documentation.