scriptorium 0.0.2 → 0.6.1

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 (290) hide show
  1. checksums.yaml +4 -4
  2. data/README.lt3 +324 -0
  3. data/README.md +3155 -1
  4. data/assets/.DS_Store +0 -0
  5. data/assets/README.md +44 -0
  6. data/assets/back-icon.png +0 -0
  7. data/assets/icons/facebook.svg +1 -0
  8. data/assets/icons/github.svg +1 -0
  9. data/assets/icons/instagram.svg +1 -0
  10. data/assets/icons/reddit.svg +1 -0
  11. data/assets/icons/ui/.DS_Store +0 -0
  12. data/assets/icons/ui/back.png +0 -0
  13. data/assets/icons/ui/copy.png +0 -0
  14. data/assets/icons/ui/down.png +0 -0
  15. data/assets/icons/ui/end.png +0 -0
  16. data/assets/icons/ui/exit.png +0 -0
  17. data/assets/icons/ui/foo +10 -0
  18. data/assets/icons/ui/home.png +0 -0
  19. data/assets/icons/ui/left.png +0 -0
  20. data/assets/icons/ui/next.png +0 -0
  21. data/assets/icons/ui/right.png +0 -0
  22. data/assets/icons/ui/start.png +0 -0
  23. data/assets/icons/ui/up.png +0 -0
  24. data/assets/icons/x.svg +1 -0
  25. data/assets/icons/youtube.svg +1 -0
  26. data/assets/samples/placeholder.svg +9 -0
  27. data/assets/themes/standard/favicon.svg +6 -0
  28. data/bin/scriptorium +1511 -0
  29. data/doc/README.txt +6 -0
  30. data/doc/anti-amnesia/20250727-054000-scriptorium-overview.md +95 -0
  31. data/doc/anti-amnesia/20250727-060000-api-design-tui-planning.md +34 -0
  32. data/doc/anti-amnesia/20250727-061000-runeblog-tui-analysis.md +50 -0
  33. data/doc/anti-amnesia/20250727-123000-anti-amnesia-conventions.md +31 -0
  34. data/doc/anti-amnesia/20250727-154000-livetext-plugin-file-stats.md +73 -0
  35. data/doc/anti-amnesia/20250727-172600-cursor-rbenv-ruby-version-mystery.md +64 -0
  36. data/doc/anti-amnesia/20250727-172600-unified-minitest-framework.md +70 -0
  37. data/doc/anti-amnesia/20250727-172900-ai-cognitive-assessment-capabilities.md +40 -0
  38. data/doc/anti-amnesia/20250727-173000-widget-testing-achievement.md +110 -0
  39. data/doc/anti-amnesia/20250727-180000-post-id-num-refactoring.md +73 -0
  40. data/doc/anti-amnesia/20250728-124243-aaa-syntax-clarification.md +46 -0
  41. data/doc/anti-amnesia/20250728-124421-conversation-summary-concise.md +124 -0
  42. data/doc/anti-amnesia/20250729-190000-scriptorium-tui-testing-complete.md +46 -0
  43. data/doc/anti-amnesia/20250729-200000-scriptorium-tui-testing-edit-file-workflow.md +97 -0
  44. data/doc/anti-amnesia/20250729-210000-reddit-autopost-integration-complete.md +158 -0
  45. data/doc/anti-amnesia/20250729-211500-dependency-management-system.md +211 -0
  46. data/doc/anti-amnesia/20250729-213000-python-virtual-environment-setup.md +141 -0
  47. data/doc/anti-amnesia/20250729-214500-theme-management-commands.md +211 -0
  48. data/doc/anti-amnesia/20250729-215000-version-update-to-0.6.0.md +134 -0
  49. data/doc/anti-amnesia/20250729-220000-user-guide-complete.md +41 -0
  50. data/doc/anti-amnesia/20250804-190500-cognitive-loop-bug.md +45 -0
  51. data/doc/anti-amnesia/20250804-190700-anti-amnesia-timestamping-fix.md +30 -0
  52. data/doc/anti-amnesia/20250804-213700-publishing-test-fix.md +49 -0
  53. data/doc/anti-amnesia/20250804-214400-additional-test-fixes.md +46 -0
  54. data/doc/anti-amnesia/20250804-220000-asset-function-logic-clarification.md +41 -0
  55. data/doc/anti-amnesia/20250806-202032-asset-function-logic-clarification.md +41 -0
  56. data/doc/anti-amnesia/20250807-213025.md +116 -0
  57. data/doc/anti-amnesia/20250813-082428-syntax-highlighting-and-navigation-improvements.md +256 -0
  58. data/doc/banner_svg_config.md +114 -0
  59. data/doc/contrib.lt3 +8 -0
  60. data/doc/dependencies.md +281 -0
  61. data/doc/hacker.lt3 +5 -0
  62. data/doc/reddit_credentials_template.json +8 -0
  63. data/doc/reddit_integration.md +207 -0
  64. data/doc/user.lt3 +38 -0
  65. data/doc/user_guide_section_1.md +137 -0
  66. data/doc/user_guide_section_10.md +515 -0
  67. data/doc/user_guide_section_11.md +708 -0
  68. data/doc/user_guide_section_2.md +233 -0
  69. data/doc/user_guide_section_3.md +5 -0
  70. data/doc/user_guide_section_4.md +221 -0
  71. data/doc/user_guide_section_5.md +243 -0
  72. data/doc/user_guide_section_6.md +147 -0
  73. data/doc/user_guide_section_7.md +311 -0
  74. data/doc/user_guide_section_8.md +224 -0
  75. data/doc/user_guide_section_9.md +375 -0
  76. data/doc/userdoc-toc.txt +88 -0
  77. data/lib/rouge/lexers/livetext.rb +74 -0
  78. data/lib/scriptorium/api.rb +640 -0
  79. data/lib/scriptorium/banner_svg.rb +742 -0
  80. data/lib/scriptorium/contract.rb +33 -0
  81. data/lib/scriptorium/exceptions.rb +174 -0
  82. data/lib/scriptorium/helpers.rb +475 -0
  83. data/lib/scriptorium/post.rb +195 -0
  84. data/lib/scriptorium/reddit.rb +83 -0
  85. data/lib/scriptorium/repo.rb +624 -0
  86. data/lib/scriptorium/standard_files.rb +515 -0
  87. data/lib/scriptorium/syntax_highlighter.rb +234 -0
  88. data/lib/scriptorium/theme.rb +179 -0
  89. data/lib/scriptorium/version.rb +2 -2
  90. data/lib/scriptorium/view.rb +976 -0
  91. data/lib/scriptorium/widgets/featured_posts.rb +149 -0
  92. data/lib/scriptorium/widgets/links.rb +112 -0
  93. data/lib/scriptorium/widgets/pages.rb +133 -0
  94. data/lib/scriptorium/widgets/widget.rb +133 -0
  95. data/lib/scriptorium.rb +22 -9
  96. data/lib/skeleton.rb +11 -2
  97. data/scriptorium.gemspec +15 -4
  98. data/test/README.md +69 -0
  99. data/test/all +43 -0
  100. data/test/api_demo.rb +99 -0
  101. data/test/assets/imagenotfound.jpg +0 -0
  102. data/test/assets/images/.DS_Store +0 -0
  103. data/test/assets/images/README.md +27 -0
  104. data/test/assets/images/odd_aspect.png +0 -0
  105. data/test/assets/images/perfect.png +0 -0
  106. data/test/assets/images/small.png +0 -0
  107. data/test/assets/images/tall.png +0 -0
  108. data/test/assets/images/very_tall.png +0 -0
  109. data/test/assets/images/very_wide.png +0 -0
  110. data/test/assets/images/wide.png +0 -0
  111. data/test/assets/testbanner.jpg +0 -0
  112. data/test/banner_svg/simple_helpers.rb +13 -0
  113. data/test/banner_svg/unit.rb +768 -0
  114. data/test/ed_test.rb +204 -0
  115. data/test/integration/cursor_banner_combinations.rb +193 -0
  116. data/test/integration/cursor_banner_features.rb +374 -0
  117. data/test/integration/integration_test.rb +326 -0
  118. data/test/livetext_plugin_test.rb +229 -0
  119. data/test/manual/asset_mgmt.rb +67 -0
  120. data/test/manual/banner-tests/config.txt +3 -0
  121. data/test/manual/banner-tests/index.html +45 -0
  122. data/test/manual/banner-tests/test01.html +58 -0
  123. data/test/manual/banner-tests/test02.html +58 -0
  124. data/test/manual/banner-tests/test03.html +58 -0
  125. data/test/manual/banner-tests/test04.html +65 -0
  126. data/test/manual/banner-tests/test05.html +65 -0
  127. data/test/manual/banner-tests/test06.html +65 -0
  128. data/test/manual/banner-tests/test07.html +65 -0
  129. data/test/manual/banner-tests/test08.html +59 -0
  130. data/test/manual/banner-tests/test09.html +59 -0
  131. data/test/manual/banner-tests/test10.html +59 -0
  132. data/test/manual/banner-tests/test11.html +59 -0
  133. data/test/manual/banner-tests/test12.html +59 -0
  134. data/test/manual/banner-tests/test13.html +59 -0
  135. data/test/manual/banner-tests/test14.html +59 -0
  136. data/test/manual/banner-tests/test15.html +58 -0
  137. data/test/manual/banner-tests/test16.html +58 -0
  138. data/test/manual/banner-tests/test17.html +58 -0
  139. data/test/manual/banner-tests/test18.html +68 -0
  140. data/test/manual/banner-tests/test19.html +68 -0
  141. data/test/manual/banner-tests/test20.html +68 -0
  142. data/test/manual/banner-tests/test21.html +68 -0
  143. data/test/manual/banner-tests/test22.html +68 -0
  144. data/test/manual/banner-tests/test23.html +68 -0
  145. data/test/manual/banner-tests/test24.html +68 -0
  146. data/test/manual/banner-tests/test25.html +67 -0
  147. data/test/manual/banner_environment.rb +192 -0
  148. data/test/manual/deploy_symlink_demo.rb +142 -0
  149. data/test/manual/environment.rb +67 -0
  150. data/test/manual/make_banner.rb +153 -0
  151. data/test/manual/sample_banner_config.txt +12 -0
  152. data/test/manual/symlink_demo.rb +117 -0
  153. data/test/manual/test1.rb +47 -0
  154. data/test/manual/test2.rb +12 -0
  155. data/test/manual/test3.rb +38 -0
  156. data/test/manual/test4.rb +40 -0
  157. data/test/manual/test5.rb +24 -0
  158. data/test/manual/test6.rb +73 -0
  159. data/test/manual/test_banner_combinations.rb +120 -0
  160. data/test/manual/test_banner_features.rb +306 -0
  161. data/test/manual/test_banner_from_file.rb +150 -0
  162. data/test/manual/test_banner_in_header.rb +35 -0
  163. data/test/manual/test_code_highlighting.rb +68 -0
  164. data/test/manual/test_complex_header.rb +74 -0
  165. data/test/manual/test_empty_header.rb +32 -0
  166. data/test/manual/test_radial_custom.rb +58 -0
  167. data/test/manual/test_radial_large_radius.rb +52 -0
  168. data/test/manual/test_svg_debug.rb +47 -0
  169. data/test/manual/test_syntax_highlighting.rb +147 -0
  170. data/test/pages-demo/config/currentview.txt +1 -0
  171. data/test/pages-demo/views/demo/config/bootstrap_css.txt +5 -0
  172. data/test/pages-demo/views/demo/config/bootstrap_js.txt +4 -0
  173. data/test/pages-demo/views/demo/config/common.js +57 -0
  174. data/test/pages-demo/views/demo/config/footer.txt +1 -0
  175. data/test/pages-demo/views/demo/config/global-head.txt +8 -0
  176. data/test/pages-demo/views/demo/config/header.txt +1 -0
  177. data/test/pages-demo/views/demo/config/layout.txt +1 -0
  178. data/test/pages-demo/views/demo/config/left.txt +1 -0
  179. data/test/pages-demo/views/demo/config/main.txt +1 -0
  180. data/test/pages-demo/views/demo/config/right.txt +1 -0
  181. data/test/pages-demo/views/demo/config.txt +3 -0
  182. data/test/pages-demo/views/demo/output/panes/footer.html +1 -0
  183. data/test/pages-demo/views/demo/output/panes/header.html +1 -0
  184. data/test/pages-demo/views/demo/output/panes/left.html +1 -0
  185. data/test/pages-demo/views/demo/output/panes/main.html +1 -0
  186. data/test/pages-demo/views/demo/output/panes/right.html +1 -0
  187. data/test/rubytext/rubytext_comprehensive_test.rb +307 -0
  188. data/test/rubytext/rubytext_demo_test.rb +42 -0
  189. data/test/rubytext/rubytext_testing_guide.md +277 -0
  190. data/test/run_automated_tests.rb +45 -0
  191. data/test/scriptorium-TEST-1754622690-146/config/bootstrap_css.txt +5 -0
  192. data/test/scriptorium-TEST-1754622690-146/config/bootstrap_js.txt +4 -0
  193. data/test/scriptorium-TEST-1754622690-146/config/common.js +57 -0
  194. data/test/scriptorium-TEST-1754622690-146/config/currentview.txt +1 -0
  195. data/test/scriptorium-TEST-1754622690-146/config/global-head.txt +9 -0
  196. data/test/scriptorium-TEST-1754622690-146/config/last_post_num.txt +1 -0
  197. data/test/scriptorium-TEST-1754622690-146/config/os_helpers.rb +4 -0
  198. data/test/scriptorium-TEST-1754622690-146/config/widgets.txt +3 -0
  199. data/test/scriptorium-TEST-1754622690-146/posts/0001/meta.txt +8 -0
  200. data/test/scriptorium-TEST-1754622690-146/posts/0001/source.lt3 +6 -0
  201. data/test/scriptorium-TEST-1754622690-146/themes/standard/README.txt +1 -0
  202. data/test/scriptorium-TEST-1754622690-146/themes/standard/config.txt +1 -0
  203. data/test/scriptorium-TEST-1754622690-146/themes/standard/initial/post.lt3 +12 -0
  204. data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/footer.txt +2 -0
  205. data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/header.txt +4 -0
  206. data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/left.txt +3 -0
  207. data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/main.txt +5 -0
  208. data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/right.txt +3 -0
  209. data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/gen/text.css +1 -0
  210. data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/layout.txt +5 -0
  211. data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/index.lt3 +1 -0
  212. data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/index_entry.lt3 +14 -0
  213. data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/post.lt3 +13 -0
  214. data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/widget.lt3 +1 -0
  215. data/test/scriptorium-TEST-1754622690-146/views/sample/config/bootstrap_css.txt +5 -0
  216. data/test/scriptorium-TEST-1754622690-146/views/sample/config/bootstrap_js.txt +4 -0
  217. data/test/scriptorium-TEST-1754622690-146/views/sample/config/common.js +57 -0
  218. data/test/scriptorium-TEST-1754622690-146/views/sample/config/deploy.txt +5 -0
  219. data/test/scriptorium-TEST-1754622690-146/views/sample/config/footer.txt +2 -0
  220. data/test/scriptorium-TEST-1754622690-146/views/sample/config/global-head.txt +9 -0
  221. data/test/scriptorium-TEST-1754622690-146/views/sample/config/header.txt +4 -0
  222. data/test/scriptorium-TEST-1754622690-146/views/sample/config/layout.txt +5 -0
  223. data/test/scriptorium-TEST-1754622690-146/views/sample/config/left.txt +3 -0
  224. data/test/scriptorium-TEST-1754622690-146/views/sample/config/main.txt +5 -0
  225. data/test/scriptorium-TEST-1754622690-146/views/sample/config/reddit.txt +10 -0
  226. data/test/scriptorium-TEST-1754622690-146/views/sample/config/right.txt +3 -0
  227. data/test/scriptorium-TEST-1754622690-146/views/sample/config/social.txt +7 -0
  228. data/test/scriptorium-TEST-1754622690-146/views/sample/config/status.txt +7 -0
  229. data/test/scriptorium-TEST-1754622690-146/views/sample/config.txt +3 -0
  230. data/test/scriptorium-TEST-1754622690-146/views/sample/layout/footer.html +3 -0
  231. data/test/scriptorium-TEST-1754622690-146/views/sample/layout/header.html +3 -0
  232. data/test/scriptorium-TEST-1754622690-146/views/sample/layout/left.html +3 -0
  233. data/test/scriptorium-TEST-1754622690-146/views/sample/layout/main.html +3 -0
  234. data/test/scriptorium-TEST-1754622690-146/views/sample/layout/right.html +3 -0
  235. data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/footer.html +1 -0
  236. data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/header.html +1 -0
  237. data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/left.html +1 -0
  238. data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/main.html +1 -0
  239. data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/right.html +1 -0
  240. data/test/staging/.DS_Store +0 -0
  241. data/test/syntax_highlighting_test.lt3 +124 -0
  242. data/test/test_helpers.rb +230 -0
  243. data/test/tui_editor_integration_test.rb +296 -0
  244. data/test/tui_integration_test.rb +637 -0
  245. data/test/unit/api.rb +1056 -0
  246. data/test/unit/asset_management.rb +245 -0
  247. data/test/unit/clipboard_test.rb +60 -0
  248. data/test/unit/contract_test.rb +91 -0
  249. data/test/unit/core.rb +857 -0
  250. data/test/unit/deploy_test.rb +187 -0
  251. data/test/unit/gem_asset_management.rb +189 -0
  252. data/test/unit/livetext_basic.rb +69 -0
  253. data/test/unit/livetext_compatibility.rb +89 -0
  254. data/test/unit/post.rb +244 -0
  255. data/test/unit/read_commented_file_test.rb +276 -0
  256. data/test/unit/reddit_test.rb +235 -0
  257. data/test/unit/repo.rb +548 -0
  258. data/test/unit/social_test.rb +369 -0
  259. data/test/unit/symlink_test.rb +213 -0
  260. data/test/unit/view.rb +431 -0
  261. data/test/unit/widgets.rb +669 -0
  262. data/test/wizard_test.rb +123 -0
  263. data/ui/README.md +67 -0
  264. data/ui/common/lib/ui_common.rb +8 -0
  265. data/ui/rubytext/README.md +191 -0
  266. data/ui/rubytext/bin/scriptorium-rubytext +402 -0
  267. data/ui/rubytext/lib/rubytext_ui.rb +300 -0
  268. data/ui/tui/bin/scriptorium +1420 -0
  269. data/ui/tui/test/tui_test.rb +23 -0
  270. data/ui/web/app/app.rb +1378 -0
  271. data/ui/web/app/error_helpers.rb +150 -0
  272. data/ui/web/app/views/advanced_config.erb +190 -0
  273. data/ui/web/app/views/asset_management.erb +589 -0
  274. data/ui/web/app/views/banner_config.erb +200 -0
  275. data/ui/web/app/views/configure_view.erb +401 -0
  276. data/ui/web/app/views/dashboard.erb +162 -0
  277. data/ui/web/app/views/deploy_config.erb +146 -0
  278. data/ui/web/app/views/edit_pages.erb +195 -0
  279. data/ui/web/app/views/edit_post.erb +54 -0
  280. data/ui/web/app/views/error_page.erb +29 -0
  281. data/ui/web/app/views/header_config.erb +155 -0
  282. data/ui/web/app/views/layout_config.erb +147 -0
  283. data/ui/web/app/views/navbar_config.erb +411 -0
  284. data/ui/web/app/views/view_dashboard.erb +138 -0
  285. data/ui/web/bin/scriptorium-web +153 -0
  286. data/ui/web/test/web_basic_test.rb +38 -0
  287. data/ui/web/test_navbar.txt +7 -0
  288. data/ui/web/tmp/web_server.log +5 -0
  289. data/ui/web/tmp/web_server.pid +1 -0
  290. metadata +360 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fc85d4908abe528a86e9d7debab72ffe6db188bc14da0fe8a6a03ac4fa71e739
4
- data.tar.gz: d83737681bac36cb0c48e378a401b137b6c9ecbbc4add3c2a9649cdd1ee856d4
3
+ metadata.gz: da71d5ae85fa244b22a3d7a1ab3868eed54e00c31251cc44eedd06a9763c435c
4
+ data.tar.gz: 2dd03471532a10fb6a770ac042df3c2ad773eab34dc5f7577ae485841764c802
5
5
  SHA512:
6
- metadata.gz: f66116f56620ea07e30fccb245f4d6134f256ed3c2b103b18bc00c8babc724a2a6e05bbf347a840fef751faf2778dfe233cf68371f59b9c33ded40c98fd28159
7
- data.tar.gz: 04ce8568e5df65eb61439544333ea0c15b751b529dd19ea3bec4fd19e730e8ab75ed4c3cc26f0cbed09e3c4d628d678a271d0d197a2ad0566206f104ff5bfed4
6
+ metadata.gz: 3f91b41df916bb566d83b231cefc24e3ca3a848b4dfa3111a84cfa8835ab5b59148a2ce2299cbba5889a13870c020211cdbd79b0de9f35c264ee260de643aed8
7
+ data.tar.gz: 9905b42d39ccf0841d29ab3aa9efe4183855147883e2cdce83346afa6b4db6b33c079fb0196578a701285eaacbb23305c401088c950350d566be6273cd5f4559
data/README.lt3 CHANGED
@@ -0,0 +1,324 @@
1
+ *Scriptorium is a major refactoring (rewrite) of Runeblog, which had an unwieldy and
2
+ fragile code base. The plan now is to develop with more of a test-first approach (and
3
+ with AI support from ChatGPT and Gemini).
4
+
5
+ <hr>
6
+
7
+
8
+ .h2 Scriptorium Project Summary
9
+ .h3 ChatGPT checkpoint - July 8, 2025
10
+ _[This file was a ChatGPT summary hand-edited and reuploaded to improve memory/response.]
11
+
12
+ .h4 1. Purpose, Assumptions, and Philosophy
13
+ .list
14
+ Scriptorium is a minimalist, Ruby-based blogging engine and static site generator, serving as a clean-slate rewrite of the older Runeblog project.
15
+ Avoids complexity, external dependencies, and hidden magic.
16
+ Designed for users who prefer plain text and transparent, hackable systems.
17
+ Useful first for the software author, then hackers who blog, then possibly others
18
+ .end
19
+
20
+ .h4 2. Technologies Used (or Avoided)
21
+ .list
22
+ Ruby is the primary language.
23
+ Minitest for testing.
24
+ Livetext for content and templating.
25
+ Avoids YAML, Liquid, databases, JS frameworks.
26
+ Filesystem used in lieu of a database
27
+ .end
28
+
29
+ .h4 3. Understanding Livetext
30
+ .list
31
+ Lightweight markup processor.
32
+ Supports variable injection, custom directives, and flexible transformation to HTML.
33
+ Also supports: include, raw copy, function definitions
34
+ There is a plan for a later rewrite
35
+ .end
36
+
37
+ .h4 4. General Terminology
38
+ .list
39
+ *containers Named layout parts of a view’s front page (e.g., header, main, right, footer), generated from corresponding config text files.
40
+ *post A finalized blog entry with metadata, body content, and a unique ID; stored in the posts/ directory.
41
+ *draft A Livetext (.lt3) source file in the drafts/ directory, created before a post is finished.
42
+ *repo A Scriptorium::Repo instance representing a blog workspace, with standard directory structure, config files, and one or more views.
43
+ *view A named subset of the repo that acts as a blog/blog-like publication; includes its own output/, config/, and staging/ directories.
44
+ *theme A named collection of templates (HTML and Livetext) that define the look and layout of posts and index pages for a view.
45
+ *slug A URL-safe, hyphenated version of a post’s title, prefixed with its 4-digit ID, e.g., 0001-my-title.html.
46
+ *output A view-local directory holding generated HTML files, including post HTML and containers like header.html and main.html.
47
+ *meta.txt A key-value file under posts/NNNN/ holding post metadata (title, slug, pubdate, views, etc.).
48
+ *post_index A generated file in output/ listing recent posts in a view; usually post_index.html, composed of index-entry templates.
49
+ .end
50
+
51
+ .h4 5. Git Repository Structure
52
+ <pre>
53
+ .
54
+ ├── README.md
55
+ ├── doc
56
+ ├── lib
57
+ │   ├── scriptorium
58
+ │   │   ├── exceptions.rb
59
+ │   │   ├── helpers.rb
60
+ │   │   ├── layout.rb
61
+ │   │   ├── post.rb
62
+ │   │   ├── repo.rb
63
+ │   │   ├── standard_files.rb
64
+ │   │   ├── theme.rb
65
+ │   │   ├── version.rb
66
+ │   │   └── view.rb
67
+ │   ├── scriptorium.rb
68
+ │   └── skeleton.rb
69
+ ├── scriptorium.gemspec
70
+ ├── test
71
+ │   ├── integration
72
+ │   │   └── integration_test.rb
73
+ │   ├── post
74
+ │   │   └── unit.rb
75
+ │   ├── repo
76
+ │   │   └── unit.rb
77
+ │   └── test_helpers.rb
78
+ └── themes
79
+    └── standard
80
+    ├── README.txt
81
+    ├── assets
82
+    ├── config.txt
83
+    ├── header
84
+    ├── initial
85
+    │   └── post.lt3
86
+    ├── layout
87
+    │   ├── config
88
+    │   │   ├── footer.txt
89
+    │   │   ├── header.txt
90
+    │   │   ├── left.txt
91
+    │   │   ├── main.txt
92
+    │   │   └── right.txt
93
+    │   ├── gen
94
+    │   │   ├── layout.css
95
+    │   │   ├── layout.html
96
+    │   │   └── text.css
97
+    │   └── layout.txt
98
+    └── templates
99
+    ├── index.lt3
100
+    ├── post.lt3
101
+    └── widget.lt3
102
+ </pre>
103
+
104
+
105
+ .h4 6. Blog Repository Structure
106
+ _[This is a snapshot of a test run.]
107
+ <pre>
108
+
109
+ ./scriptorium-TEST
110
+ ├── assets
111
+ ├── config
112
+ │   ├── currentview.txt
113
+ │   └── last_post_num.txt
114
+ ├── drafts
115
+ ├── posts
116
+ │   ├── 0001
117
+ │   │   ├── assets
118
+ │   │   ├── body.html
119
+ │   │   ├── draft.lt3
120
+ │   │   └── meta.txt
121
+ │   ├── 0002
122
+ │   │   ├── assets
123
+ │   │   ├── body.html
124
+ │   │   ├── draft.lt3
125
+ │   │   └── meta.txt
126
+ │   ├── 0003
127
+ │   │   ├── assets
128
+ │   │   ├── body.html
129
+ │   │   ├── draft.lt3
130
+ │   │   └── meta.txt
131
+ │   ├── 0004
132
+ │   │   ├── assets
133
+ │   │   ├── body.html
134
+ │   │   ├── draft.lt3
135
+ │   │   └── meta.txt
136
+ │   ├── 0005
137
+ │   │   ├── assets
138
+ │   │   ├── body.html
139
+ │   │   ├── draft.lt3
140
+ │   │   └── meta.txt
141
+ │   ├── 0006
142
+ │   │   ├── assets
143
+ │   │   ├── body.html
144
+ │   │   ├── draft.lt3
145
+ │   │   └── meta.txt
146
+ │   ├── 0007
147
+ │   │   ├── assets
148
+ │   │   ├── body.html
149
+ │   │   ├── draft.lt3
150
+ │   │   └── meta.txt
151
+ │   ├── 0008
152
+ │   │   ├── assets
153
+ │   │   ├── body.html
154
+ │   │   ├── draft.lt3
155
+ │   │   └── meta.txt
156
+ │   ├── 0009
157
+ │   │   ├── assets
158
+ │   │   ├── body.html
159
+ │   │   ├── draft.lt3
160
+ │   │   └── meta.txt
161
+ │   ├── 0010
162
+ │   │   ├── assets
163
+ │   │   ├── body.html
164
+ │   │   ├── draft.lt3
165
+ │   │   └── meta.txt
166
+ │   ├── 0011
167
+ │   │   ├── assets
168
+ │   │   ├── body.html
169
+ │   │   ├── draft.lt3
170
+ │   │   └── meta.txt
171
+ │   ├── 0012
172
+ │   │   ├── assets
173
+ │   │   ├── body.html
174
+ │   │   ├── draft.lt3
175
+ │   │   └── meta.txt
176
+ │   └── 0013
177
+ │   ├── assets
178
+ │   └── draft.lt3
179
+ ├── themes
180
+ │   └── standard
181
+ │   ├── README.txt
182
+ │   ├── assets
183
+ │   ├── config.txt
184
+ │   ├── header
185
+ │   ├── initial
186
+ │   │   └── post.lt3
187
+ │   ├── layout
188
+ │   │   ├── config
189
+ │   │   │   ├── footer.txt
190
+ │   │   │   ├── header.txt
191
+ │   │   │   ├── left.txt
192
+ │   │   │   ├── main.txt
193
+ │   │   │   └── right.txt
194
+ │   │   ├── gen
195
+ │   │   │   ├── layout.css
196
+ │   │   │   ├── layout.html
197
+ │   │   │   └── text.css
198
+ │   │   └── layout.txt
199
+ │   └── templates
200
+ │   ├── index.lt3
201
+ │   ├── index_entry.lt3
202
+ │   ├── post.lt3
203
+ │   └── widget.lt3
204
+ └── views
205
+ ├── blog1
206
+ │   ├── config
207
+ │   │   ├── footer.txt
208
+ │   │   ├── header.txt
209
+ │   │   ├── layout.txt
210
+ │   │   ├── left.txt
211
+ │   │   ├── main.txt
212
+ │   │   └── right.txt
213
+ │   ├── config.txt
214
+ │   ├── layout
215
+ │   │   ├── footer.html
216
+ │   │   ├── header.html
217
+ │   │   ├── left.html
218
+ │   │   ├── main.html
219
+ │   │   └── right.html
220
+ │   ├── output
221
+ │   │   ├── panes
222
+ │   │   │   ├── footer.html
223
+ │   │   │   ├── header.html
224
+ │   │   │   ├── left.html
225
+ │   │   │   ├── main.html
226
+ │   │   │   └── right.html
227
+ │   │   └── posts
228
+ │   │   ├── 0001-random-post-7270.html
229
+ │   │   ├── 0004-random-post-466.html
230
+ │   │   ├── 0006-random-post-1685.html
231
+ │   │   ├── 0007-random-post-6949.html
232
+ │   │   ├── 0008-random-post-5311.html
233
+ │   │   ├── 0009-random-post-6420.html
234
+ │   │   └── 0010-random-post-4555.html
235
+ │   └── staging
236
+ .
237
+ . (skipped blog2 and blog3 for brevity)
238
+ .
239
+ └── sample
240
+ ├── config
241
+ │   ├── footer.txt
242
+ │   ├── header.txt
243
+ │   ├── layout.txt
244
+ │   ├── left.txt
245
+ │   ├── main.txt
246
+ │   └── right.txt
247
+ ├── config.txt
248
+ ├── layout
249
+ │   ├── footer.html
250
+ │   ├── header.html
251
+ │   ├── left.html
252
+ │   ├── main.html
253
+ │   └── right.html
254
+ ├── output
255
+ │   ├── panes
256
+ │   │   ├── footer.html
257
+ │   │   ├── header.html
258
+ │   │   ├── left.html
259
+ │   │   ├── main.html
260
+ │   │   └── right.html
261
+ │   └── posts
262
+ └── staging
263
+ </pre>
264
+
265
+ .h4 7. State of Progress
266
+ .list
267
+ Basic classes in place: Repo, View, Post, Theme, etc.
268
+ Unit tests for Repo (22 assertions) and Post (70 assertions)
269
+ Integration tests (257 assertions)
270
+ Can create a blog repo, views, posts
271
+ Theme "standard" is honored
272
+ Can generate a rudimentary "front page"
273
+ Working on: &lt;head&gt; generation, Bootstrap integration, etc.
274
+ .end
275
+
276
+ .h4 8. Near-term high-level to-do list
277
+ _[This is planned by August 31, 2025.]
278
+ .list
279
+ Improved handling of blog header and &lt;head&gt; tag
280
+ Support for top-level menu
281
+ Improvements in Livetext blog plugin
282
+ Widget base class
283
+ Widgets: At least Featured, Links, and Pages
284
+ Isolate and codify all of API
285
+ Interactive (text) UI
286
+ Setup/config wizard(s)
287
+ Basic user docs
288
+ .end
289
+
290
+ .h4 9. Notes on future to-do items
291
+ .list
292
+ Improve the customized scriptorium plugin for Livetext
293
+ Define header far better (title, banner, navbar...)
294
+ Implement deployment, preview, and live view
295
+ Add concept of theme components (like mini-themes)
296
+ Support theme cloning
297
+ Support single-page post for viewing in isolation
298
+ Support permalinks
299
+ Support redirection (if needed) as posts change
300
+ Add user interfaces
301
+ - simple command line calls
302
+ - interactive text-oriented (TUI)
303
+ - curses-like TUI based on RubyText
304
+ - web-based (on localhost)
305
+ Add "wizards" for each UI: startup, add view, theming...
306
+ Add actual AI assistant
307
+ Codify a widget interface
308
+ Code widgets
309
+ - Highlights (list featured posts)
310
+ - Search (search within this blog/view)
311
+ - Tags (a tag cloud)
312
+ - Links (external links manager)
313
+ - Calendar (posts by year/month/day)
314
+ - Pages (local static pages unrelated to blog posts)
315
+ Add some level of support for Markdown (for others, not me)
316
+ Possibly add Atom/RSS support
317
+ Integrate Bootstrap calls as needed
318
+ Add support for reposting to Facebook, X (others?)
319
+ Add support for discussion threads on a subreddit
320
+ Create documentation:
321
+ - User level (incl. basic Livetext, usage, theme creation)
322
+ - Project contributor level
323
+ - Widget creator level
324
+ .end