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,25 +27,89 @@
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
- <rect x='0' y='0' width='100%' height='100%' fill='#ff0000' />
36
- <text x='5%'
37
- y='52%'
38
- text-anchor='start'
39
- style='font-family: Verdana; font-size: 48px; font-weight: normal; font-style: normal'
40
- fill='#374151'>Red Background</text>
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
+ <rect x='0' y='0' width='100%' height='100%' fill='#ff0000' />
38
+ <text x='5%'
39
+ y='52%'
40
+ text-anchor='start'
41
+ style='font-family: Verdana; font-size: 48.0px; font-weight: normal; font-style: normal'
42
+ fill='#374151'>Red Background</text>
43
+
44
+ <text x='5%'
45
+ y='82%'
46
+ text-anchor='start'
47
+ style='font-family: Verdana; font-size: 24.0px; font-weight: normal; font-style: normal'
48
+ fill='#374151'>Solid color test</text>
49
+
50
+ </svg>`;
51
+ const svgElement = document.createElement('div');
52
+ svgElement.innerHTML = svg_text;
53
+ const svg = svgElement.firstElementChild;
54
+
55
+ const svgWidth = window.innerWidth;
56
+ const aspectRatio = 8.0;
57
+ const svgHeight = svgWidth / aspectRatio;
58
+
59
+ svg.setAttribute('viewBox', `0 0 ${svgWidth} ${svgHeight}`);
60
+ svg.setAttribute('width', svgWidth);
61
+ svg.setAttribute('height', svgHeight);
62
+
63
+ const titleFontSize = 0.8 * 60;
64
+ const subtitleFontSize = 0.4 * 60;
65
+
66
+ const te1 = svg.querySelector('text:nth-of-type(1)')
67
+ const te2 = svg.querySelector('text:nth-of-type(2)')
68
+
69
+ // Don't override the styles - they're already set correctly in the SVG
70
+ // Just update the positioning and text-anchor
71
+
72
+ const titleXpct = "5%";
73
+ const titleYpct = "52%";
74
+ const subtitleXpct = "5%";
75
+ const subtitleYpct = "82%";
76
+
77
+ const tX = svgWidth * (parseFloat(titleXpct) / 100);
78
+ const tY = svgHeight * (parseFloat(titleYpct) / 100);
79
+ const sX = svgWidth * (parseFloat(subtitleXpct) / 100);
80
+ const sY = svgHeight * (parseFloat(subtitleYpct) / 100);
81
+
82
+ te1.setAttribute('x', tX);
83
+ te1.setAttribute('y', tY);
84
+ te2.setAttribute('x', sX);
85
+ te2.setAttribute('y', sY);
86
+
87
+ // Set text-anchor for proper positioning (use individual anchors if set)
88
+ te1.setAttribute('text-anchor', 'start');
89
+ te2.setAttribute('text-anchor', 'start');
90
+
91
+ // Apply calculated font sizes
92
+ te1.setAttribute('font-size', titleFontSize + 'px');
93
+ te2.setAttribute('font-size', subtitleFontSize + 'px');
94
+
95
+ const containerElement = document.getElementById(container);
96
+ if (containerElement) {
97
+ console.log('Container found, inserting SVG...');
98
+ containerElement.innerHTML = svg.outerHTML;
99
+ console.log('SVG inserted successfully');
100
+ } else {
101
+ console.error('Container not found:', container);
102
+ }
103
+ }
104
+
105
+ console.log('SVG script loaded');
41
106
 
42
- <text x='5%'
43
- y='82%'
44
- text-anchor='start'
45
- style='font-family: Verdana; font-size: 24px; font-weight: normal; font-style: normal'
46
- fill='#374151'>Solid color test</text>
47
-
48
- </svg>
107
+ // Use DOMContentLoaded to avoid conflicts with main window.onload
108
+ document.addEventListener('DOMContentLoaded', function() {
109
+ console.log('DOM ready, trying SVG insertion...');
110
+ insert_svg_header('header');
111
+ });
112
+ </script>
49
113
 
50
114
  </div>
51
115
  <div class="content">
@@ -27,25 +27,89 @@
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
- <rect x='0' y='0' width='100%' height='100%' fill='#0000ff' />
36
- <text x='5%'
37
- y='52%'
38
- text-anchor='start'
39
- style='font-family: Verdana; font-size: 48px; font-weight: normal; font-style: normal'
40
- fill='#374151'>Blue Background</text>
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
+ <rect x='0' y='0' width='100%' height='100%' fill='#0000ff' />
38
+ <text x='5%'
39
+ y='52%'
40
+ text-anchor='start'
41
+ style='font-family: Verdana; font-size: 48.0px; font-weight: normal; font-style: normal'
42
+ fill='#374151'>Blue Background</text>
43
+
44
+ <text x='5%'
45
+ y='82%'
46
+ text-anchor='start'
47
+ style='font-family: Verdana; font-size: 24.0px; font-weight: normal; font-style: normal'
48
+ fill='#374151'>Solid color test</text>
49
+
50
+ </svg>`;
51
+ const svgElement = document.createElement('div');
52
+ svgElement.innerHTML = svg_text;
53
+ const svg = svgElement.firstElementChild;
54
+
55
+ const svgWidth = window.innerWidth;
56
+ const aspectRatio = 8.0;
57
+ const svgHeight = svgWidth / aspectRatio;
58
+
59
+ svg.setAttribute('viewBox', `0 0 ${svgWidth} ${svgHeight}`);
60
+ svg.setAttribute('width', svgWidth);
61
+ svg.setAttribute('height', svgHeight);
62
+
63
+ const titleFontSize = 0.8 * 60;
64
+ const subtitleFontSize = 0.4 * 60;
65
+
66
+ const te1 = svg.querySelector('text:nth-of-type(1)')
67
+ const te2 = svg.querySelector('text:nth-of-type(2)')
68
+
69
+ // Don't override the styles - they're already set correctly in the SVG
70
+ // Just update the positioning and text-anchor
71
+
72
+ const titleXpct = "5%";
73
+ const titleYpct = "52%";
74
+ const subtitleXpct = "5%";
75
+ const subtitleYpct = "82%";
76
+
77
+ const tX = svgWidth * (parseFloat(titleXpct) / 100);
78
+ const tY = svgHeight * (parseFloat(titleYpct) / 100);
79
+ const sX = svgWidth * (parseFloat(subtitleXpct) / 100);
80
+ const sY = svgHeight * (parseFloat(subtitleYpct) / 100);
81
+
82
+ te1.setAttribute('x', tX);
83
+ te1.setAttribute('y', tY);
84
+ te2.setAttribute('x', sX);
85
+ te2.setAttribute('y', sY);
86
+
87
+ // Set text-anchor for proper positioning (use individual anchors if set)
88
+ te1.setAttribute('text-anchor', 'start');
89
+ te2.setAttribute('text-anchor', 'start');
90
+
91
+ // Apply calculated font sizes
92
+ te1.setAttribute('font-size', titleFontSize + 'px');
93
+ te2.setAttribute('font-size', subtitleFontSize + 'px');
94
+
95
+ const containerElement = document.getElementById(container);
96
+ if (containerElement) {
97
+ console.log('Container found, inserting SVG...');
98
+ containerElement.innerHTML = svg.outerHTML;
99
+ console.log('SVG inserted successfully');
100
+ } else {
101
+ console.error('Container not found:', container);
102
+ }
103
+ }
104
+
105
+ console.log('SVG script loaded');
41
106
 
42
- <text x='5%'
43
- y='82%'
44
- text-anchor='start'
45
- style='font-family: Verdana; font-size: 24px; font-weight: normal; font-style: normal'
46
- fill='#374151'>Solid color test</text>
47
-
48
- </svg>
107
+ // Use DOMContentLoaded to avoid conflicts with main window.onload
108
+ document.addEventListener('DOMContentLoaded', function() {
109
+ console.log('DOM ready, trying SVG insertion...');
110
+ insert_svg_header('header');
111
+ });
112
+ </script>
49
113
 
50
114
  </div>
51
115
  <div class="content">
@@ -27,25 +27,89 @@
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
- <rect x='0' y='0' width='100%' height='100%' fill='#00ff00' />
36
- <text x='5%'
37
- y='52%'
38
- text-anchor='start'
39
- style='font-family: Verdana; font-size: 48px; font-weight: normal; font-style: normal'
40
- fill='#374151'>Green Background</text>
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
+ <rect x='0' y='0' width='100%' height='100%' fill='#00ff00' />
38
+ <text x='5%'
39
+ y='52%'
40
+ text-anchor='start'
41
+ style='font-family: Verdana; font-size: 48.0px; font-weight: normal; font-style: normal'
42
+ fill='#374151'>Green Background</text>
43
+
44
+ <text x='5%'
45
+ y='82%'
46
+ text-anchor='start'
47
+ style='font-family: Verdana; font-size: 24.0px; font-weight: normal; font-style: normal'
48
+ fill='#374151'>Solid color test</text>
49
+
50
+ </svg>`;
51
+ const svgElement = document.createElement('div');
52
+ svgElement.innerHTML = svg_text;
53
+ const svg = svgElement.firstElementChild;
54
+
55
+ const svgWidth = window.innerWidth;
56
+ const aspectRatio = 8.0;
57
+ const svgHeight = svgWidth / aspectRatio;
58
+
59
+ svg.setAttribute('viewBox', `0 0 ${svgWidth} ${svgHeight}`);
60
+ svg.setAttribute('width', svgWidth);
61
+ svg.setAttribute('height', svgHeight);
62
+
63
+ const titleFontSize = 0.8 * 60;
64
+ const subtitleFontSize = 0.4 * 60;
65
+
66
+ const te1 = svg.querySelector('text:nth-of-type(1)')
67
+ const te2 = svg.querySelector('text:nth-of-type(2)')
68
+
69
+ // Don't override the styles - they're already set correctly in the SVG
70
+ // Just update the positioning and text-anchor
71
+
72
+ const titleXpct = "5%";
73
+ const titleYpct = "52%";
74
+ const subtitleXpct = "5%";
75
+ const subtitleYpct = "82%";
76
+
77
+ const tX = svgWidth * (parseFloat(titleXpct) / 100);
78
+ const tY = svgHeight * (parseFloat(titleYpct) / 100);
79
+ const sX = svgWidth * (parseFloat(subtitleXpct) / 100);
80
+ const sY = svgHeight * (parseFloat(subtitleYpct) / 100);
81
+
82
+ te1.setAttribute('x', tX);
83
+ te1.setAttribute('y', tY);
84
+ te2.setAttribute('x', sX);
85
+ te2.setAttribute('y', sY);
86
+
87
+ // Set text-anchor for proper positioning (use individual anchors if set)
88
+ te1.setAttribute('text-anchor', 'start');
89
+ te2.setAttribute('text-anchor', 'start');
90
+
91
+ // Apply calculated font sizes
92
+ te1.setAttribute('font-size', titleFontSize + 'px');
93
+ te2.setAttribute('font-size', subtitleFontSize + 'px');
94
+
95
+ const containerElement = document.getElementById(container);
96
+ if (containerElement) {
97
+ console.log('Container found, inserting SVG...');
98
+ containerElement.innerHTML = svg.outerHTML;
99
+ console.log('SVG inserted successfully');
100
+ } else {
101
+ console.error('Container not found:', container);
102
+ }
103
+ }
104
+
105
+ console.log('SVG script loaded');
41
106
 
42
- <text x='5%'
43
- y='82%'
44
- text-anchor='start'
45
- style='font-family: Verdana; font-size: 24px; font-weight: normal; font-style: normal'
46
- fill='#374151'>Solid color test</text>
47
-
48
- </svg>
107
+ // Use DOMContentLoaded to avoid conflicts with main window.onload
108
+ document.addEventListener('DOMContentLoaded', function() {
109
+ console.log('DOM ready, trying SVG insertion...');
110
+ insert_svg_header('header');
111
+ });
112
+ </script>
49
113
 
50
114
  </div>
51
115
  <div class="content">
@@ -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:red;stop-opacity:1" />
38
- <stop offset="100%" style="stop-color:blue;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:red;stop-opacity:1" />
40
+ <stop offset="100%" style="stop-color:blue;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='#374151'>Red to Blue Gradient</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'>Linear gradient test</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'>Red to Blue Gradient</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'>Linear gradient test</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">
@@ -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="0%" y2="100%">
37
- <stop offset="0%" style="stop-color:green;stop-opacity:1" />
38
- <stop offset="100%" style="stop-color:yellow;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="0%" y2="100%">
39
+ <stop offset="0%" style="stop-color:green;stop-opacity:1" />
40
+ <stop offset="100%" style="stop-color:yellow;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='#374151'>Green to Yellow Gradient</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'>Linear gradient test</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'>Green to Yellow Gradient</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'>Linear gradient test</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">