scriptorium 0.6.1 → 0.7.2

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 (358) hide show
  1. checksums.yaml +4 -4
  2. data/assets/icons/social/reddit.png +0 -0
  3. data/assets/icons/social/x-logo.png +0 -0
  4. data/assets/imagenotfound.jpg +0 -0
  5. data/bin/sblog +84 -5
  6. data/bin/scriptorium +1 -0
  7. data/doc/anti-amnesia/20250727-054000-scriptorium-overview.md +0 -1
  8. data/doc/anti-amnesia/20250727-123000-anti-amnesia-conventions.md +0 -29
  9. data/doc/anti-amnesia/20250727-172600-cursor-rbenv-ruby-version-mystery.md +0 -19
  10. data/doc/anti-amnesia/20250727-172900-ai-cognitive-assessment-capabilities.md +1 -1
  11. data/doc/anti-amnesia/20250728-124243-aaa-syntax-clarification.md +1 -1
  12. data/doc/anti-amnesia/20250729-210000-reddit-autopost-integration-complete.md +1 -1
  13. data/doc/anti-amnesia/20250804-190500-cognitive-loop-bug.md +0 -10
  14. data/doc/anti-amnesia/20250804-190700-anti-amnesia-timestamping-fix.md +1 -4
  15. data/doc/anti-amnesia/20250901-211714-codemirror-integration-and-web-tests.md +172 -0
  16. data/doc/anti-amnesia/20250902-002402-backup-restore-system.md +126 -0
  17. data/doc/anti-amnesia/20250907-203339-backup-metadata-implementation.md +66 -0
  18. data/doc/imported/0001-elixir-conf-2014/metadata.txt +7 -0
  19. data/doc/imported/0001-elixir-conf-2014/post.html +37 -0
  20. data/doc/imported/0001-elixir-conf-2014/source.lt3 +22 -0
  21. data/doc/imported/0002-programmers-and-word-processing/metadata.txt +7 -0
  22. data/doc/imported/0002-programmers-and-word-processing/post.html +192 -0
  23. data/doc/imported/0002-programmers-and-word-processing/source.lt3 +146 -0
  24. data/doc/imported/0003-how-to-turn-your-brain-sideways/metadata.txt +7 -0
  25. data/doc/imported/0003-how-to-turn-your-brain-sideways/post.html +60 -0
  26. data/doc/imported/0003-how-to-turn-your-brain-sideways/source.lt3 +40 -0
  27. data/doc/imported/0004-upcoming-lone-star-ruby-conference/metadata.txt +7 -0
  28. data/doc/imported/0004-upcoming-lone-star-ruby-conference/post.html +42 -0
  29. data/doc/imported/0004-upcoming-lone-star-ruby-conference/source.lt3 +24 -0
  30. data/doc/imported/0005-elixir-conf-2015-announced/metadata.txt +7 -0
  31. data/doc/imported/0005-elixir-conf-2015-announced/post.html +30 -0
  32. data/doc/imported/0005-elixir-conf-2015-announced/source.lt3 +16 -0
  33. data/doc/imported/0006-ruby-for-dinosaurs/metadata.txt +7 -0
  34. data/doc/imported/0006-ruby-for-dinosaurs/post.html +43 -0
  35. data/doc/imported/0006-ruby-for-dinosaurs/source.lt3 +27 -0
  36. data/doc/imported/0007-phoenix-isnt-rails/metadata.txt +7 -0
  37. data/doc/imported/0007-phoenix-isnt-rails/post.html +116 -0
  38. data/doc/imported/0007-phoenix-isnt-rails/source.lt3 +87 -0
  39. data/doc/imported/0008-concerning-the-term-monkeypatching/metadata.txt +7 -0
  40. data/doc/imported/0008-concerning-the-term-monkeypatching/post.html +129 -0
  41. data/doc/imported/0008-concerning-the-term-monkeypatching/source.lt3 +92 -0
  42. data/doc/imported/0009-announcement-coming-soon/metadata.txt +7 -0
  43. data/doc/imported/0009-announcement-coming-soon/post.html +33 -0
  44. data/doc/imported/0009-announcement-coming-soon/source.lt3 +19 -0
  45. data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/metadata.txt +7 -0
  46. data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/post.html +175 -0
  47. data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/source.lt3 +139 -0
  48. data/doc/imported/0011-computer-science-as-a-lost-art/metadata.txt +7 -0
  49. data/doc/imported/0011-computer-science-as-a-lost-art/post.html +139 -0
  50. data/doc/imported/0011-computer-science-as-a-lost-art/source.lt3 +104 -0
  51. data/doc/imported/0012-ruby-day-in-turin-italy/metadata.txt +7 -0
  52. data/doc/imported/0012-ruby-day-in-turin-italy/post.html +42 -0
  53. data/doc/imported/0012-ruby-day-in-turin-italy/source.lt3 +24 -0
  54. data/doc/imported/0013-rubyday-was-a-success/metadata.txt +7 -0
  55. data/doc/imported/0013-rubyday-was-a-success/post.html +44 -0
  56. data/doc/imported/0013-rubyday-was-a-success/source.lt3 +27 -0
  57. data/doc/imported/0014-working-on-the-blogging-software/metadata.txt +7 -0
  58. data/doc/imported/0014-working-on-the-blogging-software/post.html +63 -0
  59. data/doc/imported/0014-working-on-the-blogging-software/source.lt3 +41 -0
  60. data/doc/imported/0015-ok-its-not-really-a-lost-art/metadata.txt +7 -0
  61. data/doc/imported/0015-ok-its-not-really-a-lost-art/post.html +172 -0
  62. data/doc/imported/0015-ok-its-not-really-a-lost-art/source.lt3 +134 -0
  63. data/doc/imported/0016-an-in-operator-for-ruby/metadata.txt +7 -0
  64. data/doc/imported/0016-an-in-operator-for-ruby/post.html +155 -0
  65. data/doc/imported/0016-an-in-operator-for-ruby/source.lt3 +106 -0
  66. data/doc/imported/0017-the-forgotten-mathematician/metadata.txt +7 -0
  67. data/doc/imported/0017-the-forgotten-mathematician/post.html +161 -0
  68. data/doc/imported/0017-the-forgotten-mathematician/source.lt3 +119 -0
  69. data/doc/imported/0018-ruby-puns/metadata.txt +7 -0
  70. data/doc/imported/0018-ruby-puns/post.html +46 -0
  71. data/doc/imported/0018-ruby-puns/source.lt3 +28 -0
  72. data/doc/imported/0019-custom-exceptions-via-metaprogramming/metadata.txt +7 -0
  73. data/doc/imported/0019-custom-exceptions-via-metaprogramming/post.html +138 -0
  74. data/doc/imported/0019-custom-exceptions-via-metaprogramming/source.lt3 +101 -0
  75. data/doc/imported/0020-fffff/metadata.txt +7 -0
  76. data/doc/imported/0020-fffff/post.html +24 -0
  77. data/doc/imported/0020-fffff/source.lt3 +12 -0
  78. data/doc/imported/0021-trying-ror-yet-again/metadata.txt +7 -0
  79. data/doc/imported/0021-trying-ror-yet-again/post.html +26 -0
  80. data/doc/imported/0021-trying-ror-yet-again/source.lt3 +12 -0
  81. data/doc/imported/0023-doctor-sleep/metadata.txt +7 -0
  82. data/doc/imported/0023-doctor-sleep/post.html +63 -0
  83. data/doc/imported/0023-doctor-sleep/source.lt3 +44 -0
  84. data/doc/imported/0024-just-a-test/metadata.txt +7 -0
  85. data/doc/imported/0024-just-a-test/post.html +24 -0
  86. data/doc/imported/0024-just-a-test/source.lt3 +12 -0
  87. data/doc/imported/import_summary.txt +98 -0
  88. data/doc/livetext-informal-spec.txt +65 -0
  89. data/doc/myuserdoc/ch-0.lt3 +31 -0
  90. data/doc/myuserdoc/ch-1.lt3 +37 -0
  91. data/doc/myuserdoc/ch-10.lt3 +22 -0
  92. data/doc/myuserdoc/ch-2.lt3 +37 -0
  93. data/doc/myuserdoc/ch-3.lt3 +19 -0
  94. data/doc/myuserdoc/ch-4.lt3 +43 -0
  95. data/doc/myuserdoc/ch-5.lt3 +22 -0
  96. data/doc/myuserdoc/ch-6.lt3 +19 -0
  97. data/doc/myuserdoc/ch-7.lt3 +16 -0
  98. data/doc/myuserdoc/ch-8.lt3 +13 -0
  99. data/doc/myuserdoc/ch-9.lt3 +19 -0
  100. data/doc/myuserdoc/tweak.rb +18 -0
  101. data/doc/{userdoc-toc.txt → myuserdoc/userdoc-toc.txt} +27 -27
  102. data/doc/old-posts/0001-elixir-conf-2014.lt3 +24 -0
  103. data/doc/old-posts/0002-programmers-and-word-processing.lt3 +150 -0
  104. data/doc/old-posts/0003-how-to-turn-your-brain-sideways.lt3 +43 -0
  105. data/doc/old-posts/0004-upcoming-lone-star-ruby-conference.lt3 +26 -0
  106. data/doc/old-posts/0005-elixir-conf-2015-announced.lt3 +17 -0
  107. data/doc/old-posts/0006-ruby-for-dinosaurs.lt3 +30 -0
  108. data/doc/old-posts/0007-phoenix-isnt-rails.lt3 +90 -0
  109. data/doc/old-posts/0008-concerning-the-term-monkeypatching.lt3 +105 -0
  110. data/doc/old-posts/0009-announcement-coming-soon.lt3 +20 -0
  111. data/doc/old-posts/0010-immutable-data-ditching-the-wax-tablet.lt3 +142 -0
  112. data/doc/old-posts/0011-computer-science-as-a-lost-art.lt3 +117 -0
  113. data/doc/old-posts/0012-ruby-day-in-turin-italy.lt3 +26 -0
  114. data/doc/old-posts/0013-rubyday-was-a-success.lt3 +28 -0
  115. data/doc/old-posts/0014-working-on-the-blogging-software.lt3 +42 -0
  116. data/doc/old-posts/0015-ok-its-not-really-a-lost-art.lt3 +137 -0
  117. data/doc/old-posts/0016-an-in-operator-for-ruby.lt3 +142 -0
  118. data/doc/old-posts/0017-the-forgotten-mathematician.lt3 +129 -0
  119. data/doc/old-posts/0018-ruby-puns.lt3 +31 -0
  120. data/doc/old-posts/0019-custom-exceptions-via-metaprogramming.lt3 +116 -0
  121. data/doc/old-posts/0021-trying-ror-yet-again.lt3 +35 -0
  122. data/doc/old-posts/0023-doctor-sleep.lt3 +43 -0
  123. data/doc/old-posts/0024-just-a-test.lt3 +12 -0
  124. data/doc/old-posts/0025-trying-another-post.lt3 +12 -0
  125. data/doc/old-repo +1 -0
  126. data/doc/reddit_integration.md +2 -2
  127. data/doc/user.lt3 +0 -3
  128. data/lib/scriptorium/api.rb +1811 -78
  129. data/lib/scriptorium/banner_svg.rb +55 -68
  130. data/lib/scriptorium/contract.rb +3 -2
  131. data/lib/scriptorium/exceptions.rb +133 -102
  132. data/lib/scriptorium/helpers.rb +282 -82
  133. data/lib/scriptorium/post.rb +81 -17
  134. data/lib/scriptorium/reddit.rb +1 -1
  135. data/lib/scriptorium/repo.rb +478 -164
  136. data/lib/scriptorium/standard_files.rb +30 -396
  137. data/lib/scriptorium/support/common_js/clipboard.js +35 -0
  138. data/lib/scriptorium/support/common_js/content-loader.js +187 -0
  139. data/lib/scriptorium/support/common_js/navigation.js +52 -0
  140. data/lib/scriptorium/support/common_js/syntax-highlighting.js +27 -0
  141. data/lib/scriptorium/support/config/reddit_template.txt +17 -0
  142. data/{test/scriptorium-TEST-1754622690-146/views/sample → lib/scriptorium/support}/config/social.txt +1 -0
  143. data/lib/scriptorium/support/highlight/css.txt +2 -0
  144. data/lib/scriptorium/support/highlight/custom.css +119 -0
  145. data/lib/scriptorium/support/highlight/js.txt +1 -0
  146. data/lib/scriptorium/support/post_index/config.txt +15 -0
  147. data/lib/scriptorium/support/post_index/style.css +55 -0
  148. data/lib/scriptorium/support/templates/index_entry.lt3 +16 -0
  149. data/{test/scriptorium-TEST-1754622690-146/themes/standard/initial/post.lt3 → lib/scriptorium/support/templates/initial_post.lt3} +5 -5
  150. data/lib/scriptorium/support/templates/post.lt3 +104 -0
  151. data/{test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/header.txt → lib/scriptorium/support/theme/header.lt3} +1 -1
  152. data/lib/scriptorium/theme.rb +83 -70
  153. data/lib/scriptorium/version.rb +2 -2
  154. data/lib/scriptorium/view.rb +194 -149
  155. data/lib/scriptorium.rb +24 -1
  156. data/lib/skeleton.rb +4 -1
  157. data/scriptorium.gemspec +2 -1
  158. data/test/WEB_INTEGRATION_README.md +196 -0
  159. data/test/all +40 -0
  160. data/test/banner_svg/unit.rb +267 -35
  161. data/test/config/deployment.txt +5 -0
  162. data/test/integration/integration_test.rb +7 -7
  163. data/test/integration/preview_flow_test.rb +94 -0
  164. data/test/livetext_plugin_test.rb +453 -182
  165. data/test/manual/banner-tests/test01.html +82 -18
  166. data/test/manual/banner-tests/test02.html +82 -18
  167. data/test/manual/banner-tests/test03.html +82 -18
  168. data/test/manual/banner-tests/test04.html +89 -25
  169. data/test/manual/banner-tests/test05.html +89 -25
  170. data/test/manual/banner-tests/test06.html +89 -25
  171. data/test/manual/banner-tests/test07.html +89 -25
  172. data/test/manual/banner-tests/test08.html +82 -18
  173. data/test/manual/banner-tests/test09.html +82 -18
  174. data/test/manual/banner-tests/test10.html +82 -18
  175. data/test/manual/banner-tests/test11.html +82 -18
  176. data/test/manual/banner-tests/test12.html +82 -18
  177. data/test/manual/banner-tests/test13.html +82 -18
  178. data/test/manual/banner-tests/test14.html +82 -18
  179. data/test/manual/banner-tests/test15.html +82 -18
  180. data/test/manual/banner-tests/test16.html +82 -18
  181. data/test/manual/banner-tests/test17.html +82 -18
  182. data/test/manual/banner-tests/test18.html +90 -26
  183. data/test/manual/banner-tests/test19.html +90 -26
  184. data/test/manual/banner-tests/test20.html +90 -26
  185. data/test/manual/banner-tests/test21.html +90 -26
  186. data/test/manual/banner-tests/test22.html +90 -26
  187. data/test/manual/banner-tests/test23.html +90 -26
  188. data/test/manual/banner-tests/test24.html +90 -26
  189. data/test/manual/banner-tests/test25.html +89 -25
  190. data/test/manual/banner_environment.rb +15 -2
  191. data/test/manual/codemirror_demo.html +773 -0
  192. data/test/manual/create_posts_for_web.rb +114 -0
  193. data/test/manual/preview_manual_test.rb +129 -0
  194. data/test/manual/test_banner_features.rb +14 -14
  195. data/test/manual/test_banner_integration.rb +115 -0
  196. data/test/manual/test_banner_radial.rb +87 -0
  197. data/test/manual/test_syntax_highlighting.rb +60 -40
  198. data/test/support/preview_utils.rb +88 -0
  199. data/test/test_gem_assets.rb +48 -0
  200. data/test/test_helpers.rb +10 -0
  201. data/test/tui_editor_integration_test.rb +15 -15
  202. data/test/tui_integration_test.rb +687 -441
  203. data/test/unit/api.rb +757 -37
  204. data/test/unit/asset_management.rb +195 -221
  205. data/test/unit/backup_test.rb +451 -0
  206. data/test/unit/contract_test.rb +1 -23
  207. data/test/unit/core.rb +415 -61
  208. data/test/unit/deploy_config_test.rb +248 -0
  209. data/test/unit/deploy_test.rb +312 -21
  210. data/test/unit/edit_post_test.rb +168 -0
  211. data/test/unit/gem_asset_management.rb +36 -42
  212. data/test/unit/livetext_basic.rb +23 -35
  213. data/test/unit/livetext_compatibility.rb +7 -14
  214. data/test/unit/parse_cmd_test.rb +260 -0
  215. data/test/unit/{symlink_test.rb → permalink_copy_test.rb} +47 -49
  216. data/test/unit/post.rb +91 -26
  217. data/test/unit/post_index_config_test.rb +258 -0
  218. data/test/unit/post_state_helpers_test.rb +137 -0
  219. data/test/unit/read_commented_file_test.rb +8 -6
  220. data/test/unit/repo.rb +75 -54
  221. data/test/unit/social_test.rb +41 -44
  222. data/test/unit/syntax_highlighting.rb +70 -0
  223. data/test/unit/theme_management_test.rb +91 -0
  224. data/test/unit/view.rb +79 -12
  225. data/test/unit/widgets.rb +8 -8
  226. data/test/web_integration_test.rb +231 -0
  227. data/test/web_test_helper.rb +218 -0
  228. data/test/web_workflow_test.rb +527 -0
  229. data/ui/tui/bin/scriptorium +885 -415
  230. data/ui/web/app/app.rb +1398 -176
  231. data/ui/web/app/assets/livetext_mode.js +244 -0
  232. data/ui/web/app/error_helpers.rb +16 -16
  233. data/ui/web/app/views/advanced_config.erb +8 -2
  234. data/ui/web/app/views/asset_management.erb +56 -0
  235. data/ui/web/app/views/backup_management.erb +238 -0
  236. data/ui/web/app/views/config_widget.erb +232 -0
  237. data/ui/web/app/views/dashboard.erb +64 -72
  238. data/ui/web/app/views/deploy_config.erb +3 -0
  239. data/ui/web/app/views/edit_pages.erb +170 -2
  240. data/ui/web/app/views/edit_post.erb +130 -9
  241. data/ui/web/app/views/edit_theme.erb +73 -0
  242. data/ui/web/app/views/edit_theme_file.erb +74 -0
  243. data/ui/web/app/views/theme_management.erb +130 -0
  244. data/ui/web/app/views/view_dashboard.erb +666 -25
  245. data/ui/web/app/views/widgets.erb +249 -0
  246. data/ui/web/bin/scriptorium-web +35 -24
  247. data/ui/web/tmp/timing.log +17 -0
  248. data/ui/web/tmp/web_server.log +0 -5
  249. metadata +190 -116
  250. data/assets/back-icon.png +0 -0
  251. data/assets/icons/facebook.svg +0 -1
  252. data/assets/icons/github.svg +0 -1
  253. data/assets/icons/instagram.svg +0 -1
  254. data/assets/icons/reddit.svg +0 -1
  255. data/assets/icons/x.svg +0 -1
  256. data/assets/icons/youtube.svg +0 -1
  257. data/bin/scriptorium +0 -1511
  258. data/doc/anti-amnesia/20250727-060000-api-design-tui-planning.md +0 -34
  259. data/doc/anti-amnesia/20250727-061000-runeblog-tui-analysis.md +0 -50
  260. data/doc/anti-amnesia/20250727-154000-livetext-plugin-file-stats.md +0 -73
  261. data/doc/anti-amnesia/20250727-172600-unified-minitest-framework.md +0 -70
  262. data/doc/anti-amnesia/20250727-173000-widget-testing-achievement.md +0 -110
  263. data/doc/anti-amnesia/20250727-180000-post-id-num-refactoring.md +0 -73
  264. data/doc/anti-amnesia/20250728-124421-conversation-summary-concise.md +0 -124
  265. data/doc/anti-amnesia/20250729-190000-scriptorium-tui-testing-complete.md +0 -46
  266. data/doc/anti-amnesia/20250729-200000-scriptorium-tui-testing-edit-file-workflow.md +0 -97
  267. data/doc/anti-amnesia/20250729-211500-dependency-management-system.md +0 -211
  268. data/doc/anti-amnesia/20250729-213000-python-virtual-environment-setup.md +0 -141
  269. data/doc/anti-amnesia/20250729-214500-theme-management-commands.md +0 -211
  270. data/doc/anti-amnesia/20250729-215000-version-update-to-0.6.0.md +0 -134
  271. data/doc/anti-amnesia/20250729-220000-user-guide-complete.md +0 -41
  272. data/doc/anti-amnesia/20250804-213700-publishing-test-fix.md +0 -49
  273. data/doc/anti-amnesia/20250804-214400-additional-test-fixes.md +0 -46
  274. data/doc/anti-amnesia/20250804-220000-asset-function-logic-clarification.md +0 -41
  275. data/doc/anti-amnesia/20250806-202032-asset-function-logic-clarification.md +0 -41
  276. data/doc/anti-amnesia/20250813-082428-syntax-highlighting-and-navigation-improvements.md +0 -256
  277. data/lib/scriptorium/syntax_highlighter.rb +0 -234
  278. data/test/manual/deploy_symlink_demo.rb +0 -142
  279. data/test/manual/symlink_demo.rb +0 -117
  280. data/test/manual/test2.rb +0 -12
  281. data/test/manual/test_banner_from_file.rb +0 -150
  282. data/test/manual/test_banner_in_header.rb +0 -35
  283. data/test/manual/test_code_highlighting.rb +0 -68
  284. data/test/manual/test_complex_header.rb +0 -74
  285. data/test/manual/test_empty_header.rb +0 -32
  286. data/test/manual/test_radial_custom.rb +0 -58
  287. data/test/manual/test_radial_large_radius.rb +0 -52
  288. data/test/manual/test_svg_debug.rb +0 -47
  289. data/test/pages-demo/config/currentview.txt +0 -1
  290. data/test/pages-demo/views/demo/config/common.js +0 -57
  291. data/test/pages-demo/views/demo/config/footer.txt +0 -1
  292. data/test/pages-demo/views/demo/config/global-head.txt +0 -8
  293. data/test/pages-demo/views/demo/config/header.txt +0 -1
  294. data/test/pages-demo/views/demo/config/layout.txt +0 -1
  295. data/test/pages-demo/views/demo/config/left.txt +0 -1
  296. data/test/pages-demo/views/demo/config/main.txt +0 -1
  297. data/test/pages-demo/views/demo/config/right.txt +0 -1
  298. data/test/pages-demo/views/demo/config.txt +0 -3
  299. data/test/pages-demo/views/demo/output/panes/footer.html +0 -1
  300. data/test/pages-demo/views/demo/output/panes/header.html +0 -1
  301. data/test/pages-demo/views/demo/output/panes/left.html +0 -1
  302. data/test/pages-demo/views/demo/output/panes/main.html +0 -1
  303. data/test/pages-demo/views/demo/output/panes/right.html +0 -1
  304. data/test/scriptorium-TEST-1754622690-146/config/bootstrap_css.txt +0 -5
  305. data/test/scriptorium-TEST-1754622690-146/config/bootstrap_js.txt +0 -4
  306. data/test/scriptorium-TEST-1754622690-146/config/common.js +0 -57
  307. data/test/scriptorium-TEST-1754622690-146/config/currentview.txt +0 -1
  308. data/test/scriptorium-TEST-1754622690-146/config/global-head.txt +0 -9
  309. data/test/scriptorium-TEST-1754622690-146/config/last_post_num.txt +0 -1
  310. data/test/scriptorium-TEST-1754622690-146/config/os_helpers.rb +0 -4
  311. data/test/scriptorium-TEST-1754622690-146/config/widgets.txt +0 -3
  312. data/test/scriptorium-TEST-1754622690-146/posts/0001/meta.txt +0 -8
  313. data/test/scriptorium-TEST-1754622690-146/posts/0001/source.lt3 +0 -6
  314. data/test/scriptorium-TEST-1754622690-146/themes/standard/README.txt +0 -1
  315. data/test/scriptorium-TEST-1754622690-146/themes/standard/config.txt +0 -1
  316. data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/gen/text.css +0 -1
  317. data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/index.lt3 +0 -1
  318. data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/index_entry.lt3 +0 -14
  319. data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/post.lt3 +0 -13
  320. data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/widget.lt3 +0 -1
  321. data/test/scriptorium-TEST-1754622690-146/views/sample/config/bootstrap_css.txt +0 -5
  322. data/test/scriptorium-TEST-1754622690-146/views/sample/config/bootstrap_js.txt +0 -4
  323. data/test/scriptorium-TEST-1754622690-146/views/sample/config/common.js +0 -57
  324. data/test/scriptorium-TEST-1754622690-146/views/sample/config/deploy.txt +0 -5
  325. data/test/scriptorium-TEST-1754622690-146/views/sample/config/footer.txt +0 -2
  326. data/test/scriptorium-TEST-1754622690-146/views/sample/config/global-head.txt +0 -9
  327. data/test/scriptorium-TEST-1754622690-146/views/sample/config/header.txt +0 -4
  328. data/test/scriptorium-TEST-1754622690-146/views/sample/config/layout.txt +0 -5
  329. data/test/scriptorium-TEST-1754622690-146/views/sample/config/left.txt +0 -3
  330. data/test/scriptorium-TEST-1754622690-146/views/sample/config/main.txt +0 -5
  331. data/test/scriptorium-TEST-1754622690-146/views/sample/config/right.txt +0 -3
  332. data/test/scriptorium-TEST-1754622690-146/views/sample/config/status.txt +0 -7
  333. data/test/scriptorium-TEST-1754622690-146/views/sample/config.txt +0 -3
  334. data/test/scriptorium-TEST-1754622690-146/views/sample/layout/footer.html +0 -3
  335. data/test/scriptorium-TEST-1754622690-146/views/sample/layout/header.html +0 -3
  336. data/test/scriptorium-TEST-1754622690-146/views/sample/layout/left.html +0 -3
  337. data/test/scriptorium-TEST-1754622690-146/views/sample/layout/main.html +0 -3
  338. data/test/scriptorium-TEST-1754622690-146/views/sample/layout/right.html +0 -3
  339. data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/footer.html +0 -1
  340. data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/header.html +0 -1
  341. data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/left.html +0 -1
  342. data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/main.html +0 -1
  343. data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/right.html +0 -1
  344. data/ui/web/tmp/web_server.pid +0 -1
  345. /data/{test/pages-demo/views/demo/config/bootstrap_css.txt → lib/scriptorium/support/bootstrap/css.txt} +0 -0
  346. /data/{test/pages-demo/views/demo/config/bootstrap_js.txt → lib/scriptorium/support/bootstrap/js.txt} +0 -0
  347. /data/{test/scriptorium-TEST-1754622690-146/views/sample → lib/scriptorium/support}/config/reddit.txt +0 -0
  348. /data/{test/scriptorium-TEST-1754622690-146/themes/standard/layout → lib/scriptorium/support/templates}/layout.txt +0 -0
  349. /data/{test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/footer.txt → lib/scriptorium/support/theme/footer.lt3} +0 -0
  350. /data/{test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/left.txt → lib/scriptorium/support/theme/left.lt3} +0 -0
  351. /data/{test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/main.txt → lib/scriptorium/support/theme/main.lt3} +0 -0
  352. /data/{test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/right.txt → lib/scriptorium/support/theme/right.lt3} +0 -0
  353. /data/test/manual/banner-tests/{config.txt → svg.txt} +0 -0
  354. /data/test/manual/{test6.rb → test_advanced_widgets.rb} +0 -0
  355. /data/test/manual/{test1.rb → test_basic_posts.rb} +0 -0
  356. /data/test/manual/{test4.rb → test_layout_widgets.rb} +0 -0
  357. /data/test/manual/{test5.rb → test_pagination.rb} +0 -0
  358. /data/test/manual/{test3.rb → test_random_posts.rb} +0 -0
@@ -1,68 +0,0 @@
1
- require_relative "./environment"
2
-
3
- manual_setup
4
-
5
- @repo.create_view("testview", "Test View", "A test view for manual inspection")
6
-
7
- # Post with code highlighting
8
- draft_body = <<~BODY
9
- .blurb Testing code highlighting with Prism.
10
- This post tests the .code function and Prism syntax highlighting.
11
-
12
- Here's some Ruby code:
13
-
14
- .code ruby
15
- def hello_world
16
- puts "Hello, World!"
17
- @greeting = "Welcome to Scriptorium"
18
- return @greeting
19
- end
20
- .end
21
-
22
- And some JavaScript:
23
-
24
- .code javascript
25
- function greet(name) {
26
- console.log("Hello, " + name);
27
- return "Greeting sent";
28
- }
29
- .end
30
-
31
- And plain text:
32
-
33
- .code text
34
- This is just plain text
35
- No syntax highlighting needed
36
- But it should still be in a code block
37
- .end
38
-
39
- And some more Ruby:
40
-
41
- .code ruby
42
- class Example
43
- def initialize
44
- @data = []
45
- end
46
-
47
- def add_item(item)
48
- @data << item
49
- end
50
- end
51
- .end
52
- BODY
53
-
54
- name = @repo.create_draft(title: "Code Highlighting Test", views: ["testview"], body: draft_body)
55
- num = @repo.finish_draft(name)
56
- @repo.generate_post(num)
57
-
58
- @repo.generate_front_page("testview")
59
-
60
- instruct <<~EOS
61
- Front page should have one post with code highlighting.
62
- Ruby code should be highlighted with Ruby syntax.
63
- JavaScript code should be highlighted with JS syntax.
64
- Plain text should be in code blocks but not highlighted.
65
- Check that Prism CSS and JS are included in the generated HTML.
66
- EOS
67
-
68
- examine("testview")
@@ -1,74 +0,0 @@
1
- require_relative './environment'
2
-
3
- manual_setup
4
-
5
- # Create a view with a complex header
6
- view = @repo.create_view("complex-header", "My Awesome Blog", "Exploring the Power of SVG Banners")
7
-
8
- # Set up layout with header
9
- File.open(view.dir/:config/"layout.txt", "w") do |f|
10
- f.puts "header"
11
- f.puts "main"
12
- end
13
-
14
- # Generate the empty containers
15
- view.generate_empty_containers
16
-
17
- # Create a complex SVG banner configuration
18
- File.open(view.dir/:config/"header.txt", "w") do |f|
19
- f.puts "banner_svg"
20
- f.puts "title"
21
- f.puts "subtitle"
22
- end
23
-
24
- # Create a complex SVG banner config file
25
- File.open(view.dir/:config/"config.txt", "w") do |f|
26
- f.puts "# Complex SVG Banner Configuration"
27
- f.puts "# This exercises multiple features at once"
28
- f.puts ""
29
- f.puts "# Background: Radial gradient from purple to blue"
30
- f.puts "back.radial #8B5CF6 #3B82F6"
31
- f.puts ""
32
- f.puts "# Custom aspect ratio (wider banner)"
33
- f.puts "aspect 6.0"
34
- f.puts ""
35
- f.puts "# Custom font"
36
- f.puts "text.font Georgia serif"
37
- f.puts ""
38
- f.puts "# Title styling: Bold, larger scale, custom color"
39
- f.puts "title.scale 1.2"
40
- f.puts "title.style bold"
41
- f.puts "title.color #FFFFFF"
42
- f.puts "title.align center"
43
- f.puts ""
44
- f.puts "# Subtitle styling: Italic, smaller scale, different color"
45
- f.puts "subtitle.scale 0.6"
46
- f.puts "subtitle.style italic"
47
- f.puts "subtitle.color #E5E7EB"
48
- f.puts "subtitle.align center"
49
- f.puts ""
50
- f.puts "# Custom positioning for both title and subtitle"
51
- f.puts "title.xy 50% 45%"
52
- f.puts "subtitle.xy 50% 75%"
53
- end
54
-
55
- # Generate the front page
56
- view.generate_front_page
57
-
58
- instruct <<~EOS
59
- Complex Header Test - Multiple SVG Banner Features
60
-
61
- This header demonstrates:
62
- - Radial gradient background (purple to blue)
63
- - Custom aspect ratio (6:1 - wider banner)
64
- - Georgia serif font
65
- - Title: Bold, larger scale (1.2x), white color, centered
66
- - Subtitle: Italic, smaller scale (0.6x), light gray color, centered
67
- - Custom positioning for both title and subtitle
68
- - Responsive SVG that scales with window width
69
-
70
- The banner should look sophisticated with the gradient background
71
- and well-positioned, styled text elements.
72
- EOS
73
-
74
- examine view
@@ -1,32 +0,0 @@
1
- require_relative './environment'
2
-
3
- manual_setup
4
-
5
- # Create a view with an empty header
6
- view = @repo.create_view("empty-header-test", "Empty Header Test", "Testing placeholder text")
7
-
8
- # Set up layout with header
9
- File.open(view.dir/:config/"layout.txt", "w") do |f|
10
- f.puts "header"
11
- f.puts "main"
12
- end
13
-
14
- # Generate the empty containers
15
- view.generate_empty_containers
16
-
17
- # Leave header.txt empty (no content)
18
- File.open(view.dir/:config/"header.txt", "w") do |f|
19
- # Empty file - should trigger placeholder
20
- end
21
-
22
- # Generate the front page
23
- view.generate_front_page
24
-
25
- instruct <<~EOS
26
- This test verifies that placeholder text appears when header has no content.
27
-
28
- The header.txt is empty, so it should show "This is header..." as placeholder text.
29
- This confirms that our fix only removes placeholders when there's real content.
30
- EOS
31
-
32
- examine view
@@ -1,58 +0,0 @@
1
- require_relative './environment'
2
-
3
- manual_setup
4
-
5
- # Create a view with custom radial gradient
6
- view = @repo.create_view("radial-custom", "Custom Radial Test", "Testing custom radial gradient parameters")
7
-
8
- # Set up layout with header
9
- File.open(view.dir/:config/"layout.txt", "w") do |f|
10
- f.puts "header"
11
- end
12
-
13
- # Generate the empty containers
14
- view.generate_empty_containers
15
-
16
- # Configure the header to only have the SVG banner
17
- File.open(view.dir/:config/"header.txt", "w") do |f|
18
- f.puts "banner_svg"
19
- end
20
-
21
- # Create a custom radial gradient config
22
- File.open(view.dir/:config/"config.txt", "w") do |f|
23
- f.puts "# Custom Radial Gradient Test"
24
- f.puts "# Default: circular vignette (ar omitted, will use 1/aspect)"
25
- f.puts "aspect 5.0"
26
- f.puts "back.radial #FF6B6B #4ECDC4 75% 25% 60%"
27
- f.puts ""
28
- f.puts "# Custom: elliptical vignette (ar = 0.5, i.e. squished horizontally)"
29
- f.puts "# Uncomment to test:"
30
- f.puts "# back.radial #FF6B6B #4ECDC4 75% 25% 60% 0.5"
31
- f.puts ""
32
- f.puts "# Title styling"
33
- f.puts "title.color #FFFFFF"
34
- f.puts "title.style bold"
35
- f.puts "title.align center"
36
- f.puts ""
37
- f.puts "# Subtitle styling"
38
- f.puts "subtitle.color #FFFFFF"
39
- f.puts "subtitle.style italic"
40
- f.puts "subtitle.align center"
41
- end
42
-
43
- # Generate the front page
44
- view.generate_front_page
45
-
46
- instruct <<~EOS
47
- Custom Radial Gradient Test
48
-
49
- This test demonstrates the new aspect-ratio compensation for radial gradients:
50
- - aspect 5.0 (wide banner)
51
- - back.radial #FF6B6B #4ECDC4 75% 25% 60% # default: circular vignette
52
- - Uncomment the line with ar=0.5 for an elliptical vignette
53
-
54
- By default, the vignette should be circular even in a wide banner.
55
- If you set ar < 1/aspect, the vignette will be squished horizontally.
56
- EOS
57
-
58
- examine view
@@ -1,52 +0,0 @@
1
- require_relative './environment'
2
-
3
- manual_setup
4
-
5
- # Create a view with a large-radius radial gradient
6
- view = @repo.create_view("radial-large-radius", "Large Radius Radial Test", "Testing r > 100% for soft vignette")
7
-
8
- # Set up layout with header
9
- File.open(view.dir/:config/"layout.txt", "w") do |f|
10
- f.puts "header"
11
- end
12
-
13
- # Generate the empty containers
14
- view.generate_empty_containers
15
-
16
- # Configure the header to only have the SVG banner
17
- File.open(view.dir/:config/"header.txt", "w") do |f|
18
- f.puts "banner_svg"
19
- end
20
-
21
- # Create a config with a large radius
22
- File.open(view.dir/:config/"config.txt", "w") do |f|
23
- f.puts "# Large Radius Radial Gradient Test"
24
- f.puts "aspect 5.0"
25
- f.puts "# r = 150% (soft vignette, gradient extends beyond banner)"
26
- f.puts "back.radial #FF6B6B #4ECDC4 50% 50% 150%"
27
- f.puts ""
28
- f.puts "# Title styling"
29
- f.puts "title.color #FFFFFF"
30
- f.puts "title.style bold"
31
- f.puts "title.align center"
32
- f.puts ""
33
- f.puts "# Subtitle styling"
34
- f.puts "subtitle.color #FFFFFF"
35
- f.puts "subtitle.style italic"
36
- f.puts "subtitle.align center"
37
- end
38
-
39
- # Generate the front page
40
- view.generate_front_page
41
-
42
- instruct <<~EOS
43
- Large Radius Radial Gradient Test
44
-
45
- This test demonstrates a radial gradient with r > 100% (here, 150%).
46
- - aspect 5.0 (wide banner)
47
- - back.radial #FF6B6B #4ECDC4 50% 50% 150%
48
-
49
- The gradient should be very soft, with the color fading in from outside the banner.
50
- EOS
51
-
52
- examine view
@@ -1,47 +0,0 @@
1
- require_relative './environment'
2
-
3
- manual_setup
4
-
5
- # Create a simple view for debugging
6
- view = @repo.create_view("svg-debug", "SVG Debug Test", "Testing SVG insertion")
7
-
8
- # Set up layout with header only
9
- File.open(view.dir/:config/"layout.txt", "w") do |f|
10
- f.puts "header"
11
- end
12
-
13
- # Generate the empty containers
14
- view.generate_empty_containers
15
-
16
- # Configure the header to only have the SVG banner
17
- File.open(view.dir/:config/"header.txt", "w") do |f|
18
- f.puts "banner_svg"
19
- end
20
-
21
- # Create a simple SVG config
22
- File.open(view.dir/:config/"config.txt", "w") do |f|
23
- f.puts "# Simple debug config"
24
- f.puts "back.radial #FF0000 #0000FF"
25
- f.puts "title.color #FFFFFF"
26
- f.puts "subtitle.color #FFFF00"
27
- f.puts "title.style bold"
28
- f.puts "subtitle.style italic"
29
- end
30
-
31
- # Generate the front page
32
- view.generate_front_page
33
-
34
- instruct <<~EOS
35
- SVG Debug Test
36
-
37
- This test has:
38
- - Only the SVG banner (no title/subtitle HTML elements)
39
- - Red to blue radial gradient
40
- - White bold title
41
- - Yellow italic subtitle
42
- - No header background color
43
-
44
- Check if the SVG displays correctly now.
45
- EOS
46
-
47
- examine view
@@ -1 +0,0 @@
1
- demo
@@ -1,57 +0,0 @@
1
- // Handle the back button (or JavaScript history.go(-1))
2
- window.onpopstate = function(event) {
3
- console.log('onpopstate event:', event); // Log the event object
4
- if (event.state && event.state.slug) {
5
- console.log('Navigating to slug:', event.state.slug); // Log the slug
6
- load_main(event.state.slug); // Load the post for the previous history state
7
- }
8
- };
9
-
10
- // Initialize with the front page when navigating via the back button or similar
11
- window.onload = function() {
12
- // Check if the initial state exists, if not, set it
13
- if (!history.state) {
14
- // Don't try to load post_index.html if there are no posts
15
- // The "No posts yet!" message is already in the main container
16
- history.replaceState({ slug: "index.html" }, "", "index.html");
17
- }
18
- };
19
-
20
- // Load the main content and other page containers (header, footer, left, right)
21
- function load_main(slug) {
22
- // Get all container elements (header, footer, left, right, and main)
23
- const contentDiv = document.getElementById("main");
24
- const headerDiv = document.querySelector("header");
25
- const footerDiv = document.querySelector("footer");
26
- const leftDiv = document.querySelector(".left");
27
- const rightDiv = document.querySelector(".right");
28
- console.log('Loading main with slug:', slug); // Log the slug
29
-
30
- fetch(slug)
31
- .then(response => {
32
- if (response.ok) {
33
- console.log('Response is ok');
34
- return response.text();
35
- } else {
36
- console.error('Failed to load:', response.status); // Log the failed response
37
- }
38
- })
39
- .then(content => {
40
- console.log('Loaded content into div'); // Log successful content insertion
41
-
42
- // Now, reload the content into the respective containers:
43
- // Main section
44
- contentDiv.innerHTML = content;
45
-
46
- // Re-insert header, footer, left, and right (if necessary)
47
- // If you want the static layout to be kept, you can preserve these parts
48
- // with additional logic or predefined structure (here it's assumed
49
- // that header/footer/left/right are already statically included).
50
-
51
- // You can also replace the other parts (left, right, header, footer) if needed.
52
- history.pushState({slug: slug}, "", slug); // Update browser history
53
- })
54
- .catch(error => {
55
- console.log("Error loading content:", error); // Log any errors during fetch
56
- });
57
- }
@@ -1 +0,0 @@
1
- Empty file generated at 2025-07-28 14:13:03 -0500
@@ -1,8 +0,0 @@
1
- # This view-specific file supplies the default values for this view.
2
- # title is omitted - filled in at generation
3
- charset UTF-8
4
- desc A blog powered by Scriptorium. This is default text intended to be changed by the user.
5
- viewport width=device-width initial-scale=1.0
6
- robots index follow
7
- javascript # See common.js
8
- bootstrap # See bootstrap.txt
@@ -1 +0,0 @@
1
- Empty file generated at 2025-07-28 14:13:03 -0500
@@ -1 +0,0 @@
1
- Empty file generated at 2025-07-28 14:13:03 -0500
@@ -1 +0,0 @@
1
- Empty file generated at 2025-07-28 14:13:03 -0500
@@ -1 +0,0 @@
1
- Empty file generated at 2025-07-28 14:13:03 -0500
@@ -1 +0,0 @@
1
- Empty file generated at 2025-07-28 14:13:03 -0500
@@ -1,3 +0,0 @@
1
- title Demo View
2
- subtitle Testing Pages Widget
3
- theme standard
@@ -1 +0,0 @@
1
- Empty file generated at 2025-07-28 14:13:03 -0500
@@ -1 +0,0 @@
1
- Empty file generated at 2025-07-28 14:13:03 -0500
@@ -1 +0,0 @@
1
- Empty file generated at 2025-07-28 14:13:03 -0500
@@ -1 +0,0 @@
1
- Empty file generated at 2025-07-28 14:13:03 -0500
@@ -1 +0,0 @@
1
- Empty file generated at 2025-07-28 14:13:03 -0500
@@ -1,5 +0,0 @@
1
- href https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css
2
- rel stylesheet
3
- # integrity has a problem - compute instead?
4
- # integrity sha384-KyZXEJ04F5o1v7V5b7ZMjGhGjxA8yQmBfvZwzI1r+0gEv+9KnQIMJxWwzD0u8nZ7
5
- # crossorigin anonymous
@@ -1,4 +0,0 @@
1
- src https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js
2
- # integrity has a problem - compute instead?
3
- # integrity sha384-pzjw8f+ua7Kw1TIq0+v5+GZkR6P/6v03cI0myXcJU22Hc5p5BY5/X93HmaJXjm4C
4
- crossorigin anonymous
@@ -1,57 +0,0 @@
1
- // Handle the back button (or JavaScript history.go(-1))
2
- window.onpopstate = function(event) {
3
- console.log('onpopstate event:', event); // Log the event object
4
- if (event.state && event.state.slug) {
5
- console.log('Navigating to slug:', event.state.slug); // Log the slug
6
- load_main(event.state.slug); // Load the post for the previous history state
7
- }
8
- };
9
-
10
- // Initialize with the front page when navigating via the back button or similar
11
- window.onload = function() {
12
- // Check if the initial state exists, if not, set it
13
- if (!history.state) {
14
- // Don't try to load post_index.html if there are no posts
15
- // The "No posts yet!" message is already in the main container
16
- history.replaceState({ slug: "index.html" }, "", "index.html");
17
- }
18
- };
19
-
20
- // Load the main content and other page containers (header, footer, left, right)
21
- function load_main(slug) {
22
- // Get all container elements (header, footer, left, right, and main)
23
- const contentDiv = document.getElementById("main");
24
- const headerDiv = document.querySelector("header");
25
- const footerDiv = document.querySelector("footer");
26
- const leftDiv = document.querySelector(".left");
27
- const rightDiv = document.querySelector(".right");
28
- console.log('Loading main with slug:', slug); // Log the slug
29
-
30
- fetch(slug)
31
- .then(response => {
32
- if (response.ok) {
33
- console.log('Response is ok');
34
- return response.text();
35
- } else {
36
- console.error('Failed to load:', response.status); // Log the failed response
37
- }
38
- })
39
- .then(content => {
40
- console.log('Loaded content into div'); // Log successful content insertion
41
-
42
- // Now, reload the content into the respective containers:
43
- // Main section
44
- contentDiv.innerHTML = content;
45
-
46
- // Re-insert header, footer, left, and right (if necessary)
47
- // If you want the static layout to be kept, you can preserve these parts
48
- // with additional logic or predefined structure (here it's assumed
49
- // that header/footer/left/right are already statically included).
50
-
51
- // You can also replace the other parts (left, right, header, footer) if needed.
52
- history.pushState({slug: slug}, "", slug); // Update browser history
53
- })
54
- .catch(error => {
55
- console.log("Error loading content:", error); // Log any errors during fetch
56
- });
57
- }
@@ -1,9 +0,0 @@
1
- # This global file supplies the default values for all views.
2
- # title is omitted - filled in at generation
3
- charset UTF-8
4
- desc A blog powered by Scriptorium. This is default text intended to be changed by the user.
5
- viewport width=device-width initial-scale=1.0
6
- robots index follow
7
- javascript # See common.js
8
- bootstrap # See bootstrap.txt
9
- social # See social.txt for configuration
@@ -1,4 +0,0 @@
1
- # Generated at repo creation for macOS
2
- def open_file(file_path)
3
- system("open", file_path)
4
- end
@@ -1,3 +0,0 @@
1
- links
2
- pages
3
- featuredposts
@@ -1,8 +0,0 @@
1
- post.id 0001
2
- post.created 2025-08-07-22-11-30
3
- post.published no
4
- post.deployed no
5
- post.title Test Post
6
- post.blurb ADD BLURB HERE
7
- post.views sample
8
- post.tags
@@ -1,6 +0,0 @@
1
- .title Test Post
2
- .blurb ADD BLURB HERE
3
- .views sample
4
- .tags
5
-
6
- Test body
@@ -1 +0,0 @@
1
- Empty file generated at 2025-08-07 22:11:30 -0500
@@ -1 +0,0 @@
1
- Empty file generated at 2025-08-07 22:11:30 -0500
@@ -1 +0,0 @@
1
- Empty file generated at 2025-08-07 22:11:30 -0500
@@ -1 +0,0 @@
1
- Empty file generated at 2025-08-07 22:11:30 -0500
@@ -1,14 +0,0 @@
1
- <div class="index-entry" style="display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 20px;">
2
- <!-- Left Side: Date (right aligned) -->
3
- <div style="text-align: right; font-size: 0.7em; flex-basis: 10%%; padding-top: 3px;">
4
- <div>%{post.pubdate.month} %{post.pubdate.day}</div>
5
- <div>%{post.pubdate.year}</div>
6
- </div>
7
- <!-- Right Side: Title and Blurb (left aligned) -->
8
- <div style="font-size: 1.2em; margin-left: 10px; flex-grow: 1; padding-top: 0;">
9
- <div><a href="javascript:void(0)"
10
- style="text-decoration: none;"
11
- onclick="load_main('posts/%{post.slug}')">%{post.title}</a></div>
12
- <div style="font-size: 0.9em;">%{post.blurb}</div>
13
- </div>
14
- </div>
@@ -1,13 +0,0 @@
1
- <!-- theme: standard -->
2
-
3
- <div align='right'><a style="text-decoration: none" href="javascript:history.go(-1)">
4
- <img src="assets/back-icon.png" width=24 height=24 alt="Go back"></img></a>
5
- </div>
6
- <div style="display: flex; justify-content: space-between; align-items: baseline;">
7
- <span style="text-align: left; font-size: 1.5em;">%{post.title}</span>
8
- <span style="text-align: right; font-size: 0.9em;">%{reddit_button}%{post.pubdate}</span>
9
- </div>
10
- <hr>
11
- %{post.body}
12
- <hr>
13
- <div style="text-align: right; font-size: 0.8em;">%{post.tags}</div>
@@ -1 +0,0 @@
1
- Empty file generated at 2025-08-07 22:11:30 -0500
@@ -1,5 +0,0 @@
1
- href https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css
2
- rel stylesheet
3
- # integrity has a problem - compute instead?
4
- # integrity sha384-KyZXEJ04F5o1v7V5b7ZMjGhGjxA8yQmBfvZwzI1r+0gEv+9KnQIMJxWwzD0u8nZ7
5
- # crossorigin anonymous
@@ -1,4 +0,0 @@
1
- src https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js
2
- # integrity has a problem - compute instead?
3
- # integrity sha384-pzjw8f+ua7Kw1TIq0+v5+GZkR6P/6v03cI0myXcJU22Hc5p5BY5/X93HmaJXjm4C
4
- crossorigin anonymous