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
@@ -27,32 +27,96 @@
27
27
  </style>
28
28
  </head>
29
29
  <body>
30
- <div class="banner">
31
- <svg xmlns='http://www.w3.org/2000/svg'
32
- width='100%' height='100'
33
- viewBox='0 0 800 100'
34
- preserveAspectRatio='xMidYMid meet'>
35
- <defs>
36
- <pattern id="bg-pattern" x="0" y="0" width="100%" height="100%" patternUnits="objectBoundingBox">
37
- <image href="very_wide.png" x="0" y="0" width="100%" height="100%"
38
- preserveAspectRatio="xMidYMid slice" />
39
- </pattern>
40
- </defs>
41
- <rect x='0' y='0' width='100%' height='100%' fill='url(#bg-pattern)' />
30
+ <div class="banner" id="header">
31
+ <script>
32
+ function insert_svg_header(container) {
33
+ const svg_text = ` <svg xmlns='http://www.w3.org/2000/svg'
34
+ width='100%' height='100'
35
+ viewBox='0 0 800 100'
36
+ preserveAspectRatio='xMidYMid meet'>
37
+ <defs>
38
+ <pattern id="bg-pattern" x="0" y="0" width="100%" height="100%" patternUnits="objectBoundingBox">
39
+ <image href="/assets/images/very_wide.png" x="0" y="0" width="100%" height="100%"
40
+ preserveAspectRatio="xMidYMid slice" />
41
+ </pattern>
42
+ </defs>
43
+ <rect x='0' y='0' width='100%' height='100%' fill='url(#bg-pattern)' />
44
+
45
+ <text x='5%'
46
+ y='52%'
47
+ text-anchor='start'
48
+ style='font-family: Verdana; font-size: 48.0px; font-weight: normal; font-style: normal'
49
+ fill='#374151'>Very Wide Image Background</text>
50
+
51
+ <text x='5%'
52
+ y='82%'
53
+ text-anchor='start'
54
+ style='font-family: Verdana; font-size: 24.0px; font-weight: normal; font-style: normal'
55
+ fill='#374151'>Image test (16:1 aspect)</text>
56
+
57
+ </svg>`;
58
+ const svgElement = document.createElement('div');
59
+ svgElement.innerHTML = svg_text;
60
+ const svg = svgElement.firstElementChild;
61
+
62
+ const svgWidth = window.innerWidth;
63
+ const aspectRatio = 8.0;
64
+ const svgHeight = svgWidth / aspectRatio;
65
+
66
+ svg.setAttribute('viewBox', `0 0 ${svgWidth} ${svgHeight}`);
67
+ svg.setAttribute('width', svgWidth);
68
+ svg.setAttribute('height', svgHeight);
69
+
70
+ const titleFontSize = 0.8 * 60;
71
+ const subtitleFontSize = 0.4 * 60;
72
+
73
+ const te1 = svg.querySelector('text:nth-of-type(1)')
74
+ const te2 = svg.querySelector('text:nth-of-type(2)')
75
+
76
+ // Don't override the styles - they're already set correctly in the SVG
77
+ // Just update the positioning and text-anchor
78
+
79
+ const titleXpct = "5%";
80
+ const titleYpct = "52%";
81
+ const subtitleXpct = "5%";
82
+ const subtitleYpct = "82%";
83
+
84
+ const tX = svgWidth * (parseFloat(titleXpct) / 100);
85
+ const tY = svgHeight * (parseFloat(titleYpct) / 100);
86
+ const sX = svgWidth * (parseFloat(subtitleXpct) / 100);
87
+ const sY = svgHeight * (parseFloat(subtitleYpct) / 100);
88
+
89
+ te1.setAttribute('x', tX);
90
+ te1.setAttribute('y', tY);
91
+ te2.setAttribute('x', sX);
92
+ te2.setAttribute('y', sY);
93
+
94
+ // Set text-anchor for proper positioning (use individual anchors if set)
95
+ te1.setAttribute('text-anchor', 'start');
96
+ te2.setAttribute('text-anchor', 'start');
97
+
98
+ // Apply calculated font sizes
99
+ te1.setAttribute('font-size', titleFontSize + 'px');
100
+ te2.setAttribute('font-size', subtitleFontSize + 'px');
101
+
102
+ const containerElement = document.getElementById(container);
103
+ if (containerElement) {
104
+ console.log('Container found, inserting SVG...');
105
+ containerElement.innerHTML = svg.outerHTML;
106
+ console.log('SVG inserted successfully');
107
+ } else {
108
+ console.error('Container not found:', container);
109
+ }
110
+ }
111
+
112
+ console.log('SVG script loaded');
42
113
 
43
- <text x='5%'
44
- y='52%'
45
- text-anchor='start'
46
- style='font-family: Verdana; font-size: 48px; font-weight: normal; font-style: normal'
47
- fill='#374151'>Very Wide Image Background</text>
48
-
49
- <text x='5%'
50
- y='82%'
51
- text-anchor='start'
52
- style='font-family: Verdana; font-size: 24px; font-weight: normal; font-style: normal'
53
- fill='#374151'>Image test (16:1 aspect)</text>
54
-
55
- </svg>
114
+ // Use DOMContentLoaded to avoid conflicts with main window.onload
115
+ document.addEventListener('DOMContentLoaded', function() {
116
+ console.log('DOM ready, trying SVG insertion...');
117
+ insert_svg_header('header');
118
+ });
119
+ </script>
56
120
 
57
121
  </div>
58
122
  <div class="content">
@@ -60,7 +124,7 @@
60
124
  <div class="config">back.image ../../assets/images/very_wide.png</div>
61
125
  <div class='original-image'>
62
126
  <h3>Original Image (for comparison):</h3>
63
- <img src='very_wide.png' alt='Original image'>
127
+ <img src='/assets/images/very_wide.png' alt='Original image'>
64
128
  </div>
65
129
  <div class="navigation"><a href="index.html">Back to Index</a> <a href="test21.html">Previous</a> <a href="test23.html">Next</a></div>
66
130
  </div>
@@ -27,32 +27,96 @@
27
27
  </style>
28
28
  </head>
29
29
  <body>
30
- <div class="banner">
31
- <svg xmlns='http://www.w3.org/2000/svg'
32
- width='100%' height='100'
33
- viewBox='0 0 800 100'
34
- preserveAspectRatio='xMidYMid meet'>
35
- <defs>
36
- <pattern id="bg-pattern" x="0" y="0" width="100%" height="100%" patternUnits="objectBoundingBox">
37
- <image href="small.png" x="0" y="0" width="100%" height="100%"
38
- preserveAspectRatio="xMidYMid slice" />
39
- </pattern>
40
- </defs>
41
- <rect x='0' y='0' width='100%' height='100%' fill='url(#bg-pattern)' />
30
+ <div class="banner" id="header">
31
+ <script>
32
+ function insert_svg_header(container) {
33
+ const svg_text = ` <svg xmlns='http://www.w3.org/2000/svg'
34
+ width='100%' height='100'
35
+ viewBox='0 0 800 100'
36
+ preserveAspectRatio='xMidYMid meet'>
37
+ <defs>
38
+ <pattern id="bg-pattern" x="0" y="0" width="100%" height="100%" patternUnits="objectBoundingBox">
39
+ <image href="/assets/images/small.png" x="0" y="0" width="100%" height="100%"
40
+ preserveAspectRatio="xMidYMid slice" />
41
+ </pattern>
42
+ </defs>
43
+ <rect x='0' y='0' width='100%' height='100%' fill='url(#bg-pattern)' />
44
+
45
+ <text x='5%'
46
+ y='52%'
47
+ text-anchor='start'
48
+ style='font-family: Verdana; font-size: 48.0px; font-weight: normal; font-style: normal'
49
+ fill='#374151'>Small Image Background</text>
50
+
51
+ <text x='5%'
52
+ y='82%'
53
+ text-anchor='start'
54
+ style='font-family: Verdana; font-size: 24.0px; font-weight: normal; font-style: normal'
55
+ fill='#374151'>Image test (low res, 8:1 aspect)</text>
56
+
57
+ </svg>`;
58
+ const svgElement = document.createElement('div');
59
+ svgElement.innerHTML = svg_text;
60
+ const svg = svgElement.firstElementChild;
61
+
62
+ const svgWidth = window.innerWidth;
63
+ const aspectRatio = 8.0;
64
+ const svgHeight = svgWidth / aspectRatio;
65
+
66
+ svg.setAttribute('viewBox', `0 0 ${svgWidth} ${svgHeight}`);
67
+ svg.setAttribute('width', svgWidth);
68
+ svg.setAttribute('height', svgHeight);
69
+
70
+ const titleFontSize = 0.8 * 60;
71
+ const subtitleFontSize = 0.4 * 60;
72
+
73
+ const te1 = svg.querySelector('text:nth-of-type(1)')
74
+ const te2 = svg.querySelector('text:nth-of-type(2)')
75
+
76
+ // Don't override the styles - they're already set correctly in the SVG
77
+ // Just update the positioning and text-anchor
78
+
79
+ const titleXpct = "5%";
80
+ const titleYpct = "52%";
81
+ const subtitleXpct = "5%";
82
+ const subtitleYpct = "82%";
83
+
84
+ const tX = svgWidth * (parseFloat(titleXpct) / 100);
85
+ const tY = svgHeight * (parseFloat(titleYpct) / 100);
86
+ const sX = svgWidth * (parseFloat(subtitleXpct) / 100);
87
+ const sY = svgHeight * (parseFloat(subtitleYpct) / 100);
88
+
89
+ te1.setAttribute('x', tX);
90
+ te1.setAttribute('y', tY);
91
+ te2.setAttribute('x', sX);
92
+ te2.setAttribute('y', sY);
93
+
94
+ // Set text-anchor for proper positioning (use individual anchors if set)
95
+ te1.setAttribute('text-anchor', 'start');
96
+ te2.setAttribute('text-anchor', 'start');
97
+
98
+ // Apply calculated font sizes
99
+ te1.setAttribute('font-size', titleFontSize + 'px');
100
+ te2.setAttribute('font-size', subtitleFontSize + 'px');
101
+
102
+ const containerElement = document.getElementById(container);
103
+ if (containerElement) {
104
+ console.log('Container found, inserting SVG...');
105
+ containerElement.innerHTML = svg.outerHTML;
106
+ console.log('SVG inserted successfully');
107
+ } else {
108
+ console.error('Container not found:', container);
109
+ }
110
+ }
111
+
112
+ console.log('SVG script loaded');
42
113
 
43
- <text x='5%'
44
- y='52%'
45
- text-anchor='start'
46
- style='font-family: Verdana; font-size: 48px; font-weight: normal; font-style: normal'
47
- fill='#374151'>Small Image Background</text>
48
-
49
- <text x='5%'
50
- y='82%'
51
- text-anchor='start'
52
- style='font-family: Verdana; font-size: 24px; font-weight: normal; font-style: normal'
53
- fill='#374151'>Image test (low res, 8:1 aspect)</text>
54
-
55
- </svg>
114
+ // Use DOMContentLoaded to avoid conflicts with main window.onload
115
+ document.addEventListener('DOMContentLoaded', function() {
116
+ console.log('DOM ready, trying SVG insertion...');
117
+ insert_svg_header('header');
118
+ });
119
+ </script>
56
120
 
57
121
  </div>
58
122
  <div class="content">
@@ -60,7 +124,7 @@
60
124
  <div class="config">back.image ../../assets/images/small.png</div>
61
125
  <div class='original-image'>
62
126
  <h3>Original Image (for comparison):</h3>
63
- <img src='small.png' alt='Original image'>
127
+ <img src='/assets/images/small.png' alt='Original image'>
64
128
  </div>
65
129
  <div class="navigation"><a href="index.html">Back to Index</a> <a href="test22.html">Previous</a> <a href="test24.html">Next</a></div>
66
130
  </div>
@@ -27,32 +27,96 @@
27
27
  </style>
28
28
  </head>
29
29
  <body>
30
- <div class="banner">
31
- <svg xmlns='http://www.w3.org/2000/svg'
32
- width='100%' height='100'
33
- viewBox='0 0 800 100'
34
- preserveAspectRatio='xMidYMid meet'>
35
- <defs>
36
- <pattern id="bg-pattern" x="0" y="0" width="100%" height="100%" patternUnits="objectBoundingBox">
37
- <image href="odd_aspect.png" x="0" y="0" width="100%" height="100%"
38
- preserveAspectRatio="xMidYMid slice" />
39
- </pattern>
40
- </defs>
41
- <rect x='0' y='0' width='100%' height='100%' fill='url(#bg-pattern)' />
30
+ <div class="banner" id="header">
31
+ <script>
32
+ function insert_svg_header(container) {
33
+ const svg_text = ` <svg xmlns='http://www.w3.org/2000/svg'
34
+ width='100%' height='100'
35
+ viewBox='0 0 800 100'
36
+ preserveAspectRatio='xMidYMid meet'>
37
+ <defs>
38
+ <pattern id="bg-pattern" x="0" y="0" width="100%" height="100%" patternUnits="objectBoundingBox">
39
+ <image href="/assets/images/odd_aspect.png" x="0" y="0" width="100%" height="100%"
40
+ preserveAspectRatio="xMidYMid slice" />
41
+ </pattern>
42
+ </defs>
43
+ <rect x='0' y='0' width='100%' height='100%' fill='url(#bg-pattern)' />
44
+
45
+ <text x='5%'
46
+ y='52%'
47
+ text-anchor='start'
48
+ style='font-family: Verdana; font-size: 48.0px; font-weight: normal; font-style: normal'
49
+ fill='#374151'>Odd Aspect Image Background</text>
50
+
51
+ <text x='5%'
52
+ y='82%'
53
+ text-anchor='start'
54
+ style='font-family: Verdana; font-size: 24.0px; font-weight: normal; font-style: normal'
55
+ fill='#374151'>Image test (~4:1 aspect)</text>
56
+
57
+ </svg>`;
58
+ const svgElement = document.createElement('div');
59
+ svgElement.innerHTML = svg_text;
60
+ const svg = svgElement.firstElementChild;
61
+
62
+ const svgWidth = window.innerWidth;
63
+ const aspectRatio = 8.0;
64
+ const svgHeight = svgWidth / aspectRatio;
65
+
66
+ svg.setAttribute('viewBox', `0 0 ${svgWidth} ${svgHeight}`);
67
+ svg.setAttribute('width', svgWidth);
68
+ svg.setAttribute('height', svgHeight);
69
+
70
+ const titleFontSize = 0.8 * 60;
71
+ const subtitleFontSize = 0.4 * 60;
72
+
73
+ const te1 = svg.querySelector('text:nth-of-type(1)')
74
+ const te2 = svg.querySelector('text:nth-of-type(2)')
75
+
76
+ // Don't override the styles - they're already set correctly in the SVG
77
+ // Just update the positioning and text-anchor
78
+
79
+ const titleXpct = "5%";
80
+ const titleYpct = "52%";
81
+ const subtitleXpct = "5%";
82
+ const subtitleYpct = "82%";
83
+
84
+ const tX = svgWidth * (parseFloat(titleXpct) / 100);
85
+ const tY = svgHeight * (parseFloat(titleYpct) / 100);
86
+ const sX = svgWidth * (parseFloat(subtitleXpct) / 100);
87
+ const sY = svgHeight * (parseFloat(subtitleYpct) / 100);
88
+
89
+ te1.setAttribute('x', tX);
90
+ te1.setAttribute('y', tY);
91
+ te2.setAttribute('x', sX);
92
+ te2.setAttribute('y', sY);
93
+
94
+ // Set text-anchor for proper positioning (use individual anchors if set)
95
+ te1.setAttribute('text-anchor', 'start');
96
+ te2.setAttribute('text-anchor', 'start');
97
+
98
+ // Apply calculated font sizes
99
+ te1.setAttribute('font-size', titleFontSize + 'px');
100
+ te2.setAttribute('font-size', subtitleFontSize + 'px');
101
+
102
+ const containerElement = document.getElementById(container);
103
+ if (containerElement) {
104
+ console.log('Container found, inserting SVG...');
105
+ containerElement.innerHTML = svg.outerHTML;
106
+ console.log('SVG inserted successfully');
107
+ } else {
108
+ console.error('Container not found:', container);
109
+ }
110
+ }
111
+
112
+ console.log('SVG script loaded');
42
113
 
43
- <text x='5%'
44
- y='52%'
45
- text-anchor='start'
46
- style='font-family: Verdana; font-size: 48px; font-weight: normal; font-style: normal'
47
- fill='#374151'>Odd Aspect Image Background</text>
48
-
49
- <text x='5%'
50
- y='82%'
51
- text-anchor='start'
52
- style='font-family: Verdana; font-size: 24px; font-weight: normal; font-style: normal'
53
- fill='#374151'>Image test (~4:1 aspect)</text>
54
-
55
- </svg>
114
+ // Use DOMContentLoaded to avoid conflicts with main window.onload
115
+ document.addEventListener('DOMContentLoaded', function() {
116
+ console.log('DOM ready, trying SVG insertion...');
117
+ insert_svg_header('header');
118
+ });
119
+ </script>
56
120
 
57
121
  </div>
58
122
  <div class="content">
@@ -60,7 +124,7 @@
60
124
  <div class="config">back.image ../../assets/images/odd_aspect.png</div>
61
125
  <div class='original-image'>
62
126
  <h3>Original Image (for comparison):</h3>
63
- <img src='odd_aspect.png' alt='Original image'>
127
+ <img src='/assets/images/odd_aspect.png' alt='Original image'>
64
128
  </div>
65
129
  <div class="navigation"><a href="index.html">Back to Index</a> <a href="test23.html">Previous</a> <a href="test25.html">Next</a></div>
66
130
  </div>
@@ -27,32 +27,96 @@
27
27
  </style>
28
28
  </head>
29
29
  <body>
30
- <div class="banner">
31
- <svg xmlns='http://www.w3.org/2000/svg'
32
- width='100%' height='100'
33
- viewBox='0 0 800 100'
34
- preserveAspectRatio='xMidYMid meet'>
35
- <defs>
36
- <linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%">
37
- <stop offset="0%" style="stop-color:#0000ff;stop-opacity:1" />
38
- <stop offset="100%" style="stop-color:#000033;stop-opacity:1" />
39
- </linearGradient>
40
- </defs>
41
- <rect x='0' y='0' width='100%' height='100%' fill='url(#grad1)' />
30
+ <div class="banner" id="header">
31
+ <script>
32
+ function insert_svg_header(container) {
33
+ const svg_text = ` <svg xmlns='http://www.w3.org/2000/svg'
34
+ width='100%' height='100'
35
+ viewBox='0 0 800 100'
36
+ preserveAspectRatio='xMidYMid meet'>
37
+ <defs>
38
+ <linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="0%">
39
+ <stop offset="0%" style="stop-color:#0000ff;stop-opacity:1" />
40
+ <stop offset="100%" style="stop-color:#000033;stop-opacity:1" />
41
+ </linearGradient>
42
+ </defs>
43
+ <rect x='0' y='0' width='100%' height='100%' fill='url(#grad1)' />
44
+
45
+ <text x='5%'
46
+ y='52%'
47
+ text-anchor='start'
48
+ style='font-family: Verdana; font-size: 48.0px; font-weight: normal; font-style: normal'
49
+ fill='#fff'>Another gradient test</text>
50
+
51
+ <text x='5%'
52
+ y='82%'
53
+ text-anchor='start'
54
+ style='font-family: Verdana; font-size: 24.0px; font-weight: normal; font-style: normal'
55
+ fill='#fff'>Just one more, I swear</text>
56
+
57
+ </svg>`;
58
+ const svgElement = document.createElement('div');
59
+ svgElement.innerHTML = svg_text;
60
+ const svg = svgElement.firstElementChild;
61
+
62
+ const svgWidth = window.innerWidth;
63
+ const aspectRatio = 8.0;
64
+ const svgHeight = svgWidth / aspectRatio;
65
+
66
+ svg.setAttribute('viewBox', `0 0 ${svgWidth} ${svgHeight}`);
67
+ svg.setAttribute('width', svgWidth);
68
+ svg.setAttribute('height', svgHeight);
69
+
70
+ const titleFontSize = 0.8 * 60;
71
+ const subtitleFontSize = 0.4 * 60;
72
+
73
+ const te1 = svg.querySelector('text:nth-of-type(1)')
74
+ const te2 = svg.querySelector('text:nth-of-type(2)')
75
+
76
+ // Don't override the styles - they're already set correctly in the SVG
77
+ // Just update the positioning and text-anchor
78
+
79
+ const titleXpct = "5%";
80
+ const titleYpct = "52%";
81
+ const subtitleXpct = "5%";
82
+ const subtitleYpct = "82%";
83
+
84
+ const tX = svgWidth * (parseFloat(titleXpct) / 100);
85
+ const tY = svgHeight * (parseFloat(titleYpct) / 100);
86
+ const sX = svgWidth * (parseFloat(subtitleXpct) / 100);
87
+ const sY = svgHeight * (parseFloat(subtitleYpct) / 100);
88
+
89
+ te1.setAttribute('x', tX);
90
+ te1.setAttribute('y', tY);
91
+ te2.setAttribute('x', sX);
92
+ te2.setAttribute('y', sY);
93
+
94
+ // Set text-anchor for proper positioning (use individual anchors if set)
95
+ te1.setAttribute('text-anchor', 'start');
96
+ te2.setAttribute('text-anchor', 'start');
97
+
98
+ // Apply calculated font sizes
99
+ te1.setAttribute('font-size', titleFontSize + 'px');
100
+ te2.setAttribute('font-size', subtitleFontSize + 'px');
101
+
102
+ const containerElement = document.getElementById(container);
103
+ if (containerElement) {
104
+ console.log('Container found, inserting SVG...');
105
+ containerElement.innerHTML = svg.outerHTML;
106
+ console.log('SVG inserted successfully');
107
+ } else {
108
+ console.error('Container not found:', container);
109
+ }
110
+ }
111
+
112
+ console.log('SVG script loaded');
42
113
 
43
- <text x='5%'
44
- y='52%'
45
- text-anchor='start'
46
- style='font-family: Verdana; font-size: 48px; font-weight: normal; font-style: normal'
47
- fill='#fff'>Another gradient test</text>
48
-
49
- <text x='5%'
50
- y='82%'
51
- text-anchor='start'
52
- style='font-family: Verdana; font-size: 24px; font-weight: normal; font-style: normal'
53
- fill='#fff'>Just one more, I swear</text>
54
-
55
- </svg>
114
+ // Use DOMContentLoaded to avoid conflicts with main window.onload
115
+ document.addEventListener('DOMContentLoaded', function() {
116
+ console.log('DOM ready, trying SVG insertion...');
117
+ insert_svg_header('header');
118
+ });
119
+ </script>
56
120
 
57
121
  </div>
58
122
  <div class="content">
@@ -13,7 +13,7 @@ Dir.mkdir(test_dir)
13
13
  @pid = nil
14
14
  # Start server from the project root directory
15
15
  server_dir = File.expand_path("../..", __FILE__)
16
- Dir.chdir(server_dir) do
16
+ Dir.chdir("test") do
17
17
  Process.spawn ("ruby -run -e httpd . -p 8000 >/dev/null 2>&1")
18
18
  sleep 1
19
19
  end
@@ -189,4 +189,17 @@ def generate_front_page(view_name)
189
189
 
190
190
  FileUtils.mkdir_p("scriptorium-TEST/views/#{view_name}/output")
191
191
  File.write("scriptorium-TEST/views/#{view_name}/output/index.html", index_html)
192
- end
192
+ end
193
+
194
+ # Cleanup method to remove standalone directories
195
+ def cleanup_standalone_directories
196
+ if Dir.exist?("posts")
197
+ FileUtils.rm_rf("posts")
198
+ end
199
+ if Dir.exist?("banner-tests")
200
+ FileUtils.rm_rf("banner-tests")
201
+ end
202
+ end
203
+
204
+ # Ensure cleanup happens when script exits
205
+ at_exit { cleanup_standalone_directories }