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
@@ -0,0 +1,142 @@
1
+ .mixin liveblog
2
+ . ^ get rid of this later
3
+
4
+ .post 16
5
+
6
+ .title An 'in' operator for Ruby
7
+ .pubdate 2019-11-13
8
+ .views computing
9
+ .tags
10
+
11
+ .pin computing
12
+
13
+ .teaser
14
+ I have had two fairly small changes I wanted to make in Ruby. The first
15
+ was realized years ago.
16
+ .end
17
+
18
+ Hashes now preserve insertion order and iterate in a predictable way.
19
+ That's fairly minor, but it did/does have some use cases, and it had no impact
20
+ on performance.
21
+
22
+ Here's another one. Personally, this is a bigger thing to me.
23
+
24
+ <b>I've always believed personally that Ruby should have an `in operator.</b>
25
+
26
+ I've mentioned this in speaking (including lightning talks) and in writing.
27
+ It's not a _giant big deal for me, but it is one of my personal favorite ideas.
28
+ Here are some details.
29
+
30
+ *[My proposal]
31
+
32
+ I propose to let `[ x in y] be syntax sugar for `[y.include? x]
33
+
34
+ *[You may ask: Why?]
35
+
36
+ <ul>
37
+ <li> `include? is backwards from common usage -- if the _item is our focus, we don't ask whether a group includes an item, but whether an item is in a group. The same is true of a container.</li>
38
+
39
+ <li>Ruby isn't English; and more generally, programming languages aren't human languages. But programming languages are <i>based<i></i></i> on human languages and on everyday experience. We do sometimes ask questions like "Does this container or group include this item?" We are asking a question <i>about the group</i>. <br><br> `[if barrel.include? rotten\_apple # Is barrel going bad?] <br><br></li>
40
+
41
+ <li>But we also -- perhaps more often? -- ask questions like "Is this item part of this group?" We are asking a question <i>about the item</i>. <br><br> `[if fruit in [:apple, :pear, :peach\] # Is this fruit something I like?] <br><br>
42
+
43
+ <li> `[include?] is backwards from mathematical usage -- we ask whether a member is in a set ("epsilon"-like notation), not whether a set contains a memeber.
44
+
45
+ <li>I ran across someone else a couple of years ago (I wish I could remember who it was!) who bemoaned the absence of this operator. His argument was that he would have a "conversation" with an object, for example, when he tested it repeatedly. Here's a contrived example I just made up.
46
+
47
+ .code
48
+ if foo == var1 ||
49
+ foo =~ var2 ||
50
+ foo < var3 ||
51
+ var4.include?(foo) || # <== This is the ugly part
52
+ foo > var5]
53
+ .end
54
+
55
+ To quote him as well as I remember: "I was having this perfectly nice conversation
56
+ with ``foo, and then `var4 interrupted it..."
57
+
58
+ Better:
59
+
60
+ .code
61
+ if foo == var1 ||
62
+ foo =~ var2 ||
63
+ foo < var3 ||
64
+ foo in var4 ||
65
+ foo > var5]
66
+ .end
67
+
68
+ <li>I prefer to put the tested entity earlier in the statement:</li>
69
+ .code
70
+ if [GA, VA, MS, TX, MD, NC].include? state # ehhhh
71
+ if state in [GA, VA, MS, TX, MD, NC] # better</tt>
72
+ .end
73
+
74
+ <li>Also a "variable/constant" issue -- I tend to put the variable data on the
75
+ left and the constant on right; this is unlike people who say `[if 5 == x].
76
+ (After all, `5 is only equal to `x very rarely; `5 is <i>always</i> equal to 5,
77
+ even for very large values of 5.)
78
+
79
+ <li>Also a question of focus: Whatever entity you are really dealing with,
80
+ name that one first.
81
+
82
+ <li>Many languages already have an `in operator -- notably Python, Pascal,
83
+ even SQL. It is familiar to users of those languages as well as those
84
+ who use mathematical notation.
85
+
86
+ <li> `in is already a reserved word in Ruby -- used in the `for loop (syntax
87
+ sugar for `[each]). Let's increase the justification for its presence.
88
+
89
+ <li>An `in operator would sometimes make parentheses unnecessary:</li>
90
+ .code
91
+ if (10..100).include? x # Need parens
92
+ if x in 10..100 # Don't need parens -- also prettier code
93
+ .end
94
+
95
+ <li>The newer language Elixir (which I'm happy to report occupies a lot of my
96
+ time lately) also sports this operator. This is yet another reason to
97
+ love that language.
98
+ </ul>
99
+
100
+ <b>Frequently Whined Whines</b>
101
+ <p>
102
+ <ul>
103
+ <li><b>I'd prefer a method.</b> I understand this, but I find it to be
104
+ needlessly ugly. I like less punctuation, more whitespace. And I
105
+ find this inappropriate for something that is conceptually an operator.
106
+
107
+ .code
108
+ if x.in mylist # ugly
109
+ if x.== 5 # also ugly
110
+ if c1.and c2 # ugly - if it worked
111
+ if x == 5 # better
112
+ if c1 and c2 # better
113
+ if x in mylist # better
114
+ .end
115
+
116
+ <li><b>I'd prefer a method with a</b> <tt>?</tt> <b>on it.</b> I understand
117
+ the concept, too, but I find it inappropriate for what is inherently a relational operator.
118
+
119
+ .code
120
+ if x.in? my\_set # very ugly
121
+ if x.==? 5 # very ugly - if it worked
122
+
123
+ if x in my\_set # natural
124
+ if x == 5 # natural
125
+ .end
126
+
127
+ <li><b>What about</b> `[for x in list] <b>? Would this evaluate as </b>
128
+ `[for true] <b> or </b> `[for false] <b>?</b> Certainly not. It's a matter
129
+ of parsing. The `for loop itself is just syntax sugar.
130
+
131
+ <li><b>I'll bet you like junctions, too.</b> No, in fact, I dislike junctions greatly. I don't even know Perl. Are junctions still a thing?
132
+
133
+ <li><b>If you like SQL's</b> <tt>in</tt> <b>, you must like</b> <tt>not in</tt> <b><b>also.</b></b> No, I don't condone its use of "not in":
134
+
135
+ <tt>if item not in collection # travesty!</tt> <tt>if ! (item in collection) # ok</tt>
136
+
137
+ <tt>if x not == y # horrible Ruby travesty - if it worked</tt> Yes, I say this even though <tt>! ( item in collection)</tt> requires parentheses. See the comment about parentheses on ranges.
138
+
139
+ <li><b>What about precedence?</b> I would place <tt>in</tt> at the same level of precedence as the (other) relational operators <tt>< > <= >=</tt> etc.</ul><b>Conclusion</b>
140
+ <p>
141
+ People have ignored me on this for at least ten years. They probably still will.
142
+ That, as they say, is life.
@@ -0,0 +1,129 @@
1
+ .post 17
2
+
3
+ .title The Forgotten Mathematician
4
+ .pubdate 2019-12-25
5
+ .views computing
6
+ .tags
7
+
8
+ .pin computing
9
+
10
+ .teaser
11
+ We all know his name... but many of us only "sort of" know it.
12
+ .end
13
+
14
+ .dropcap
15
+ We all remember Boole in our own way, if at all. His work comes up in discrete
16
+ math and in electrical engineering, among other places. But computer science students and
17
+ programmers in general remember him chiefly for the Boolean operators and the concept of the
18
+ Boolean data type.
19
+ .end
20
+
21
+ .set dash=&mdash;
22
+
23
+ I decided to Google for "who was Boole"... this was the result.
24
+
25
+ .image gooboo.png
26
+
27
+
28
+ Notice the top autocomplete. This seems to suggest that "Boolean" was the person's name. I
29
+ decided to make this blog post to set the record straight.
30
+
31
+ But that isn't the only reason I'm writing this. I want to speak up for this historical figure
32
+ just a little and correct what I perceive as a minor injustice.
33
+
34
+ Did anything look unusual in the previous sentences? Perhaps the capitalization of "Boolean"?
35
+ It's often lowercased in the computing community, and there are reasonable historical reasons
36
+ for this.
37
+
38
+ In the old days, it was often inconvenient or impossible to type or even to render lowercase
39
+ letters. As recently as the 1980s, I have seen terminals and printers that were strictly uppercase.
40
+ Take a look at a textbook or manual from that era, and you will often see the same thing.
41
+
42
+ On the other hand, people have always known that in English and similar languages, lowercase was
43
+ an essential part of reality. As it became practical to use computers for applications such as
44
+ typesetting and word processing, we started to take mixed case for granted.
45
+
46
+ Somewhere in this time frame (or a little earlier), UNIX came along. And yes, we did spell it
47
+ in all caps at the time. This was true of most computer language names and such, many of which
48
+ were some kind of acronym or abbreviation: FORTRAN, COBOL, BASIC. There was no particular reason
49
+ to put PASCAL in all caps... but people often did, out of a strange kind of habit.
50
+
51
+ But let's get back to UNIX. Have you ever wondered why we type ``ls, ``cp, and `mv rather than
52
+ ``list, ``copy, and `[move]? It's not just that old terminals could be slow to echo. One of the
53
+ UNIX creators basically _[hated to type]. (I remember it as Brian Kernighan, but it may have been
54
+ Thompson or Ritchie.) And I argue this laziness also extended to a reluctance to type capital letters.
55
+ Can you think of a command flag that is capitalized (such as `[-F]) _except where the lowercase
56
+ (such as `[-f]) was already used by something more fundamental? I can't think of one.
57
+
58
+ So as we made a transition from all-caps to mixed case, programming languages that were traditionally
59
+ written in upper case were now written in all lower case. In Pascal, we might once have written
60
+ `[FOR I:=1 TO 10], but a little later, we wrote `[for i:=1 to 10] instead.
61
+
62
+ Do you see where this is going? Where we once wrote ``BOOLEAN, we wrote `boolean instead. And
63
+ because we saw this so often in our programs, we started writing it that way when we wrote _about
64
+ our programs.
65
+
66
+ Sometimes this is necessary. If you are using a language where identifiers are case-sensitive (like
67
+ most or all modern languages), there may well be an actual data type named ``boolean, and it would
68
+ be an error to capitalize it (even outside our code).
69
+
70
+ So typography matters here. For many years we have tended to write code in some kind of monospaced
71
+ typeface, harking back to the days when we had no choice in the matter. So consider these three
72
+ sentences, which might appear in any manual or piece of documentation:
73
+
74
+ .nlist
75
+ This function takes a `boolean parameter.
76
+ This function takes a boolean parameter.
77
+ This function takes a Boolean parameter.
78
+ .end
79
+
80
+ It's reasonable to use lowercase in (1), because we're presumably referring to an actual identifier
81
+ or reserved word in some language. As for (2) $dash I think we see that all the time, but I'm arguing
82
+ here it's not appropriate. The usage in (3) is more appropriate.
83
+
84
+ Now, before I am misunderstood and/or flamed $dash here are the things I am _not saying:
85
+
86
+ .list
87
+ I'm not saying we should change the compilers or interpreters.
88
+ I'm not saying that all the books and manuals should be rewritten.
89
+ I'm not saying you're ignorant or a bad person if you don't capitalize "Boolean."
90
+ I'm not saying we should call out people who don't capitalize it.
91
+ .end
92
+
93
+ But for comparison, let's look at some other scientists and mathematicians whose names have been
94
+ converted to adjectives. So far I have searched for these: Einsteinian, Newtonian, Galilean,
95
+ Ptolemaic, Copernican, Wronskian, Laplacian, Lagrangian, Riemannian, Euclidean, Keplerian,
96
+ Gaussian, Hamiltonian, Archimedean, Diophantine, Pythagorean, Darwinian, Lamarckian, Eulerian,
97
+ Cartesian, Napierian, Bayesian, and Brownian.
98
+
99
+ These terms have this in common: They are _[always capitalized]. (Interestingly, _Abelian seems
100
+ to be an exception in many people's usage.) And yes, you may find places where these names are
101
+ _not given capital letters, but I contend they are very few in number.
102
+
103
+ Let's range further afield, into the realms of philosophers, religious figures, writers, and
104
+ artists. I have searched for these: Socratic, Aristotelian, Mosaic, Benedictine, Kafkaesque,
105
+ Epicurean, Shakespearean, Elizabethan, Edwardian, Spenserian, Petrarchan, Smithsonian, Botticellian,
106
+ Dickensian, Orwellian, Jungian, Freudian, and Adlerian. I've found very few uncapitalized
107
+ names. The lowercased _kafkaesque is not unheard of, and we may informally call someone an
108
+ _epicurean (though we refer specifically to the _Epicurean philosophers in uppercase).
109
+
110
+ It's worth noting that units of measure named after people are not capitalized:
111
+ newton, ampere, coulomb, gauss, fermi, kelvin, henry, hertz, pascal, and watt. I can't find an
112
+ exception to this. Sometimes, though, the person's name is tacked on as _part of the unit or
113
+ system of measure; we do capitalize the names when we refer to degrees Fahrenheit, degrees
114
+ Celsius, Richter scale, Mohs scale, and the Dobson unit.
115
+
116
+ Of course, in many cases, we just don't convert a name to a different form: Hilbert space,
117
+ Schwarzschild radius, Feynmann diagram, Bohr model, Fermi principle, Drake equation, Rohrschach
118
+ test, Hall effect, and so on. Why is this so common? I think it's because an adjective form
119
+ might often be hard to spell or pronounce, and overall we have less of a tendency for "fancy"
120
+ adjectives nowadays. But in any event, we'd never think of lowercasing these names.
121
+
122
+ And yet Boole is shortchanged so often in our world! Mathematicians talk about Boolean algebra,
123
+ and even electrical engineers talk of Boolean logic; but programmers talk of _boolean data and
124
+ _boolean operators.
125
+
126
+ Come on, guys. Give him his due. By the way, his first name was George.
127
+
128
+ So I am making a pledge: Where it's possible and practical, I will capitalize _Boolean whenever
129
+ I write an article, a book, or a piece of documentation. I encourage you to do the same.
@@ -0,0 +1,31 @@
1
+ .post 18
2
+
3
+ .title Ruby puns
4
+ .pubdate 2020-01-21
5
+ .views computing computing
6
+ .tags
7
+
8
+ .teaser
9
+ These are pretty bad. You've been warned.
10
+ .end
11
+
12
+
13
+ .mono
14
+ cheese = "" # String cheese
15
+ browns = {} # Hash browns
16
+ hiphip = [] # hiphip array
17
+ case; end # brief case
18
+ foods.freeze # frozen foods
19
+ love.taint # tainted love
20
+ attr_writer :irish # Irish setter
21
+ {"corned" => "beef"} # corned beef hash
22
+ raise "hell" # raising hell
23
+ $village # global village
24
+
25
+ usual_suspects = 1.99
26
+ usual_suspects.ceil # round up the usual suspects
27
+
28
+ class JesusChrist < God
29
+ super(*) # Jesus Christ Superstar
30
+ end
31
+ .end
@@ -0,0 +1,116 @@
1
+ .post 19
2
+
3
+ .mixin code_rouge
4
+
5
+ .title Custom exceptions via metaprogramming
6
+ .pubdate 2020-02-17
7
+ .views computing computing
8
+ .tags
9
+
10
+ .teaser
11
+ Suppose you want a large number of custom exceptions. And suppose you're not afraid of metaprogramming.
12
+ .end
13
+
14
+ A few months back, I found myself wanting to be "more specific" with the exceptions
15
+ I raised in my ongoing RuneBlog project (which is used to create this blog). I
16
+ wanted to raise specific exceptions with custom parameterized messages (without
17
+ repeating myself too much).
18
+
19
+ Here's an example of the "usual" way to do this:
20
+
21
+ .ruby
22
+ class MyException < StandardError
23
+
24
+ def initialize(file, dir)
25
+ msg = "Could not find #{file} under #{dir}"
26
+ super(msg)
27
+ end
28
+
29
+ end
30
+
31
+ raise MyException.new("stuff.txt", "/home/willard")
32
+
33
+ # Output:
34
+ # exc.rb:10:in `<main>': Could not find stuff.txt under /home/willard (MyException)
35
+ .end
36
+
37
+ Now there is nothing particularly wrong with that. But as it happens, I wanted a
38
+ large number of exceptions with fairly descriptive names. I didn't want to type
39
+ (or even paste) this stuff over and over.
40
+
41
+ Here comes the "not afraid of metaprogramming" part. This is what I did:
42
+
43
+ .ruby
44
+ def make_exception(sym, str, target_class = Object)
45
+ return if target_class.constants.include?(sym)
46
+ target_class.const_set(sym, StandardError.dup)
47
+ define_method(sym) do |*args|
48
+ msg = str.dup
49
+ args.each.with_index {|arg, i| msg.sub!("%#{i+1}", arg) }
50
+ target_class.class_eval(sym.to_s).new(msg)
51
+ end
52
+ end
53
+ .end
54
+
55
+ Now, what does this do? The method takes two parameters (or three if you count the
56
+ target class which defaults to `[Object]). You specify a symbol (for the
57
+ name of the exception) and a string (for the exception message). It then does
58
+ two things: It creates an exception class (named after the symbol); and it creates
59
+ a method of the same name.
60
+
61
+ Here are examples of calling `[make_exception]:
62
+
63
+ .ruby
64
+ make_exception(:NotImplemented, "Feature not yet implemented")
65
+ make_exception(:CantOpen, "Can't open '%1'")
66
+ make_exception(:InternalError, "Internal error: Method %1 got arg '%2'")
67
+ .end
68
+
69
+ And here are examples of raising these exceptions:
70
+
71
+ .ruby
72
+ raise NotImplemented
73
+ raise CantOpen(somefile)
74
+ raise InternalError(__method__, arg)
75
+ .end
76
+
77
+ You might ask: Why define a method returning an exception object? The answer
78
+ is that I don't want to write these this way:
79
+
80
+ .ruby
81
+ raise NotImplemented.new("Feature not yet implemented")
82
+ raise CantOpen.new("Can't open '#{somefile}'")
83
+ raise InternalError.new("Internal error: Method #{__method__} got arg '#{arg}'")
84
+ .end
85
+
86
+ I perceive four advantages doing it the first way: I don't have to specify the
87
+ message string each time; I still get to have a descriptive, unique class name
88
+ without the message making it seem redundantly; I don't have to interpolate
89
+ values into the message string explicitly; and I don't have to say `[.new]
90
+ every time.
91
+
92
+ Some of you may have two questions: Can you (or should you) really have a
93
+ capitalized method name? Can a method have the same name as a class without
94
+ confusing the interpreter?
95
+
96
+ I'll answer both those questions with an example from the Ruby core: There
97
+ is an `Integer class and an `Integer method (naturally related to each other).
98
+ Ruby distinguishes between these by context. It's not impossible, and I argue
99
+ it's not a bad practice.
100
+
101
+ As for the parameters, it's intuitive how they work. A `% sign signals a
102
+ numbered replaceable piece of text, and these are replaced with the parameters
103
+ specified when the method is called.
104
+
105
+ That part of the code is not really robust, by the way. As it is written now,
106
+ you could easily confuse it-- make it misbehave or crash. But you get the idea.
107
+
108
+ So far, I have defined 23 custom exceptions in this project. Each definition
109
+ occupies a single line. If I want to change the behavior of all of them in
110
+ some way, I will go and change the `make_exception method (which itself is
111
+ only 9 lines).
112
+
113
+ Like it, hate it? Comments welcome.
114
+
115
+
116
+
@@ -0,0 +1,35 @@
1
+ .post 21
2
+
3
+ .title Trying ROR yet again
4
+ .pubdate 2020-06-15
5
+ .views computing
6
+ .tags
7
+
8
+ .teaser
9
+ Those who know me know I'm not a Rails guy.
10
+ .end
11
+
12
+ I don't hate Rails, honestly. It's more that I hate web development
13
+ in general.
14
+
15
+ But here I am, trying once again to master the rudiments. Not because I
16
+ want jobs in that area, but because I want certain small projects built;
17
+ and I can't spend $100 an hour (or is it more?) to have someone else
18
+ do them.
19
+
20
+ To that end, last night I dived into _[Agile Web Development with Rails 6].
21
+ I covered about 156 pages and highighted passages in iBooks.
22
+
23
+ Admittedly, I skimmed over the "Ruby review" section pretty quickly, as I'm
24
+ supposed to know that stuff. But I still ran across something that made me
25
+ do a doubletake-- it was this line:
26
+
27
+ `[ class​ CreateProducts < ActiveRecord::Migration\[6.0\]]
28
+
29
+ The "versioned class" thing was new to me. I haven't looked it up yet, but
30
+ I assume `Migration is a hash of classes with version numbers as keys (faked
31
+ by `Float values). This is kind of an interesting concept, and it made my
32
+ mind go off in twelve different directions (as it often does at 3:15 in the
33
+ morning).
34
+
35
+
@@ -0,0 +1,43 @@
1
+ .post 23
2
+
3
+ .title Doctor Sleep
4
+ .pubdate 2020-11-07
5
+ .views chiller
6
+ .tags
7
+
8
+ .teaser
9
+ If you didn't know, this is the sequel to _[The Shining].
10
+
11
+ .end
12
+
13
+ I have to say: It was well done. It's not a Kubrick movie (and there will
14
+ never be another one), but in its own way, it's faithful enough to the
15
+ original.
16
+
17
+ What do you get with a Stephen King story? Well, let's be honest. He is a
18
+ little too good for the stuff he writes. He himself said, "I am the literary
19
+ equivalent of a burger and fries." And he isn't wrong.
20
+
21
+ But on the other hand, his characters are wonderfully three-dimensional.
22
+ (To be honest, I'm quoting someone who taught a writing seminar I was in
23
+ years ago. But it's spot on.) He is a master of characterization and dialogue,
24
+ of plotting and pacing, and his use of language sometimes rises to the realm
25
+ of the sublime.
26
+
27
+ Of course, even a well-written book doesn't always mean a good movie. I have
28
+ seen some movies apparently based on his works that made me think: As an
29
+ author, he must be crying and hiding his face... all the way to the bank.
30
+
31
+ And though I have seen more King movies than I have read King novels, I
32
+ thought I could see his work shining through here. (Pun totally not intended.)
33
+ Add to that a few wonderful and innovative bits of CG, some interesting
34
+ camera angles, and yes, some really decent acting here and there. What you
35
+ then get is not exactly a masterpiece, but something well worth watching.
36
+
37
+ There are arguably some downsides here. Some of the effects might be a little
38
+ cheesy, some of the tropes a little timeworn, some of the acting a little off.
39
+ But so what? It's better than 90% of the stuff I've streamed lately.
40
+
41
+ I don't like "stars" for reviews. I'm trying to figure out what other kind of
42
+ little icon or widget or thingy I can use. But until then: <i>Doctor Sleep</i>
43
+ gets five stars.
@@ -0,0 +1,12 @@
1
+ .post 24
2
+
3
+ .title just a test
4
+ .pubdate 2024-01-30
5
+ .views chiller chiller
6
+ .tags
7
+
8
+ .teaser
9
+ If you can read this...
10
+ .end
11
+
12
+ ...your IQ might be normal.
@@ -0,0 +1,12 @@
1
+ .post 25
2
+
3
+ .title Trying another post...
4
+ .pubdate 2024-01-30
5
+ .views computing computing
6
+ .tags
7
+
8
+ .teaser
9
+ Here we go.
10
+ .end
11
+
12
+ ...again?
data/doc/old-repo ADDED
@@ -0,0 +1 @@
1
+ /Users/Hal/.blogs/
@@ -142,8 +142,8 @@ Convenience method to check Reddit configuration.
142
142
 
143
143
  The integration includes comprehensive error handling:
144
144
 
145
- - **Missing credentials**: Raises `FileNotFound` exception
146
- - **Missing Python script**: Raises `FileNotFound` exception
145
+ - **Missing credentials**: Raises `FileNotFoundError` exception
146
+ - **Missing Python script**: Raises `FileNotFoundError` exception
147
147
  - **Invalid JSON**: Returns `nil` for config, logs error
148
148
  - **API failures**: Returns `false`, logs error details
149
149
  - **Temporary file cleanup**: Automatic cleanup in all cases
data/doc/user.lt3 CHANGED
@@ -33,6 +33,3 @@ The UI(s)
33
33
 
34
34
  Livetext in more detail
35
35
 
36
-
37
- -
38
- -