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
@@ -0,0 +1,281 @@
1
+ # Scriptorium Dependencies & Requirements
2
+
3
+ This document lists the external dependencies and configuration requirements for different Scriptorium features.
4
+
5
+ ## Core Dependencies
6
+
7
+ ### Required for All Features
8
+ - **Ruby** (2.7+) - Core runtime
9
+ - **Git** - Version control (for repository management)
10
+
11
+ ## Feature-Specific Dependencies & Requirements
12
+
13
+ ### Reddit Integration
14
+ **Features**: Reddit autoposting, Reddit button generation
15
+
16
+ **Software Dependencies**:
17
+ - **Redd gem** - Ruby Reddit API Wrapper
18
+ ```bash
19
+ gem install redd
20
+ ```
21
+
22
+ **Configuration Requirements**:
23
+ - **Reddit App** - Create app at https://www.reddit.com/prefs/apps
24
+ - **API Credentials** - client_id, client_secret, username, password
25
+ - **Credentials File** - `config/reddit_credentials.json` with proper format
26
+ - **User Agent** - Descriptive user agent string (required by Reddit)
27
+
28
+ **Installation Notes**:
29
+ - On macOS: `brew install python3` (recommended)
30
+ - On Ubuntu/Debian: `sudo apt install python3 python3-pip`
31
+ - On Windows: Download from python.org or use Chocolatey
32
+
33
+ ### LiveText Integration
34
+ **Features**: LiveText plugin support, file statistics
35
+
36
+ **Dependencies**:
37
+ - **LiveText** - LiveText gem and runtime
38
+ ```bash
39
+ gem install livetext
40
+ ```
41
+
42
+ ### Web Development Features
43
+ **Features**: Web server, JavaScript serving, browser integration
44
+
45
+ **Dependencies**:
46
+ - **Webrick** - Ruby web server (usually included with Ruby)
47
+ - **Default browser** - System default web browser
48
+
49
+ ### File Operations
50
+ **Features**: File editing, directory operations
51
+
52
+ **Dependencies**:
53
+ - **Text editor** - One of:
54
+ - `ed` (Unix/Linux/macOS) - Minimal editor for automation
55
+ - `nano` - Simple text editor
56
+ - `vim` - Advanced text editor
57
+ - `emacs` - Advanced text editor
58
+ - System default editor
59
+
60
+ ### Image Processing
61
+ **Features**: Image optimization, thumbnail generation
62
+
63
+ **Dependencies**:
64
+ - **ImageMagick** - Image processing library
65
+ ```bash
66
+ # macOS
67
+ brew install imagemagick
68
+
69
+ # Ubuntu/Debian
70
+ sudo apt install imagemagick
71
+
72
+ # Windows
73
+ # Download from imagemagick.org
74
+ ```
75
+
76
+ ### Markdown Processing
77
+ **Features**: Markdown rendering, syntax highlighting
78
+
79
+ **Dependencies**:
80
+ - **Pygments** - Syntax highlighting (optional)
81
+ ```bash
82
+ pip3 install pygments
83
+ ```
84
+
85
+ ### RSS/Atom Feeds
86
+ **Features**: RSS feed generation, feed validation
87
+
88
+ **Software Dependencies**:
89
+ - **Feed validator** (optional) - For feed validation
90
+ ```bash
91
+ pip3 install feedvalidator
92
+ ```
93
+
94
+ ### Deployment
95
+ **Features**: Deploy blog to web server
96
+
97
+ **Software Dependencies**:
98
+ - **SSH client** - For server access (usually included with OS)
99
+ - **rsync** - For file synchronization (usually included with OS)
100
+
101
+ **Configuration Requirements**:
102
+ - **SSH Keys** - Set up SSH key authentication for server access
103
+ - **Server Access** - Valid server credentials and permissions
104
+ - **Deployment Config** - Server details in `config/deploy.txt`
105
+ - **Domain/DNS** - Domain name pointing to server (optional)
106
+ - **SSL Certificate** - HTTPS certificate for secure access (optional)
107
+
108
+ **Setup Steps**:
109
+ 1. Generate SSH key pair: `ssh-keygen -t rsa -b 4096`
110
+ 2. Add public key to server: `ssh-copy-id user@server`
111
+ 3. Test connection: `ssh user@server`
112
+ 4. Configure deployment settings in Scriptorium
113
+
114
+ ## Platform-Specific Dependencies
115
+
116
+ ### macOS
117
+ - **Homebrew** (recommended) - Package manager
118
+ ```bash
119
+ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
120
+ ```
121
+ - **Xcode Command Line Tools** - For compilation
122
+ ```bash
123
+ xcode-select --install
124
+ ```
125
+
126
+ ### Linux (Ubuntu/Debian)
127
+ - **Build essentials** - For compilation
128
+ ```bash
129
+ sudo apt update
130
+ sudo apt install build-essential
131
+ ```
132
+
133
+ ### Windows
134
+ - **RubyInstaller** - Ruby for Windows
135
+ - **Git for Windows** - Git integration
136
+ - **WSL** (optional) - Windows Subsystem for Linux
137
+
138
+ ## Installation Scripts
139
+
140
+ ### Quick Setup Scripts
141
+
142
+ #### macOS (with Homebrew)
143
+ ```bash
144
+ #!/bin/bash
145
+ # Install core dependencies
146
+ brew install ruby git python3
147
+
148
+ # Install Python packages
149
+ pip3 install praw pygments feedvalidator
150
+
151
+ # Install Ruby gems
152
+ gem install livetext
153
+
154
+ # Install ImageMagick (if needed)
155
+ brew install imagemagick
156
+ ```
157
+
158
+ #### Ubuntu/Debian
159
+ ```bash
160
+ #!/bin/bash
161
+ # Update package list
162
+ sudo apt update
163
+
164
+ # Install core dependencies
165
+ sudo apt install ruby ruby-dev git python3 python3-pip build-essential
166
+
167
+ # Install Python packages
168
+ pip3 install praw pygments feedvalidator
169
+
170
+ # Install Ruby gems
171
+ gem install livetext
172
+
173
+ # Install ImageMagick (if needed)
174
+ sudo apt install imagemagick
175
+ ```
176
+
177
+ ## Feature Dependency Matrix
178
+
179
+ ### Software Dependencies
180
+ | Feature | Ruby | Git | Python3 | PRAW | LiveText | ImageMagick | Editor |
181
+ |---------|------|-----|---------|------|----------|-------------|---------|
182
+ | Core Blogging | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
183
+ | Reddit Button | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
184
+ | Reddit Autopost | ✅ | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ |
185
+ | LiveText Plugins | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ |
186
+ | File Statistics | ✅ | ✅ | ❌ | ❌ | ✅ | ❌ | ❌ |
187
+ | Web Server | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
188
+ | Image Processing | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ |
189
+ | Markdown + Syntax | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
190
+ | RSS Feeds | ✅ | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
191
+ | File Editing | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ |
192
+ | Deployment | ✅ | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
193
+
194
+ ### Configuration Requirements
195
+ | Feature | Reddit Credentials | SSH Keys | Server Access | Domain/DNS | SSL Cert |
196
+ |---------|-------------------|----------|---------------|------------|----------|
197
+ | Core Blogging | ❌ | ❌ | ❌ | ❌ | ❌ |
198
+ | Reddit Button | ❌ | ❌ | ❌ | ❌ | ❌ |
199
+ | Reddit Autopost | ✅ | ❌ | ❌ | ❌ | ❌ |
200
+ | LiveText Plugins | ❌ | ❌ | ❌ | ❌ | ❌ |
201
+ | File Statistics | ❌ | ❌ | ❌ | ❌ | ❌ |
202
+ | Web Server | ❌ | ❌ | ❌ | ❌ | ❌ |
203
+ | Image Processing | ❌ | ❌ | ❌ | ❌ | ❌ |
204
+ | Markdown + Syntax | ❌ | ❌ | ❌ | ❌ | ❌ |
205
+ | RSS Feeds | ❌ | ❌ | ❌ | ❌ | ❌ |
206
+ | File Editing | ❌ | ❌ | ❌ | ❌ | ❌ |
207
+ | Deployment | ❌ | ✅ | ✅ | ⚠️ | ⚠️ |
208
+
209
+ ## Verification Commands
210
+
211
+ ### Check Core Dependencies
212
+ ```bash
213
+ # Check Ruby
214
+ ruby --version
215
+
216
+ # Check Git
217
+ git --version
218
+
219
+ # Check Python 3
220
+ python3 --version
221
+ ```
222
+
223
+ ### Check Feature Dependencies
224
+ ```bash
225
+ # Check PRAW (Reddit integration)
226
+ python3 -c "import praw; print('PRAW available')"
227
+
228
+ # Check LiveText
229
+ livetext --version
230
+
231
+ # Check ImageMagick
232
+ convert --version
233
+
234
+ # Check Pygments
235
+ python3 -c "import pygments; print('Pygments available')"
236
+ ```
237
+
238
+ ### Check Configuration Requirements
239
+ ```bash
240
+ # Check Reddit credentials
241
+ ls -la config/reddit_credentials.json
242
+
243
+ # Check SSH key setup
244
+ ls -la ~/.ssh/id_rsa.pub
245
+
246
+ # Test SSH connection (replace with your server)
247
+ ssh -T user@your-server.com
248
+
249
+ # Check deployment configuration
250
+ ls -la config/deploy.txt
251
+
252
+ # Check domain resolution (replace with your domain)
253
+ nslookup your-domain.com
254
+ ```
255
+
256
+ ## Troubleshooting
257
+
258
+ ### Common Issues
259
+
260
+ 1. **Python not found**
261
+ - Ensure Python 3 is installed and in PATH
262
+ - On macOS, use `brew install python3`
263
+
264
+ 2. **PRAW installation fails**
265
+ - Upgrade pip: `pip3 install --upgrade pip`
266
+ - Install with user flag: `pip3 install --user praw`
267
+
268
+ 3. **LiveText not found**
269
+ - Install via gem: `gem install livetext`
270
+ - Check Ruby version compatibility
271
+
272
+ 4. **ImageMagick not working**
273
+ - Verify installation: `convert --version`
274
+ - Check PATH and permissions
275
+
276
+ ### Getting Help
277
+
278
+ - Check the specific feature documentation
279
+ - Run the verification commands above
280
+ - Check system logs for error messages
281
+ - Ensure all dependencies are properly installed and in PATH
data/doc/hacker.lt3 ADDED
@@ -0,0 +1,5 @@
1
+ How to...
2
+ - add a dot command
3
+ - add a livetext function
4
+ - create a widget
5
+ - create a theme
@@ -0,0 +1,8 @@
1
+ {
2
+ "client_id": "YOUR_CLIENT_ID_HERE",
3
+ "client_secret": "YOUR_CLIENT_SECRET_HERE",
4
+ "username": "YOUR_REDDIT_USERNAME",
5
+ "password": "YOUR_REDDIT_PASSWORD",
6
+ "user_agent": "scriptorium:autopost:v1.0 (by /u/YOUR_USERNAME)",
7
+ "default_subreddit": "YOUR_DEFAULT_SUBREDDIT"
8
+ }
@@ -0,0 +1,207 @@
1
+ # Reddit Integration for Scriptorium
2
+
3
+ Scriptorium includes a Reddit autoposting feature that allows you to automatically submit blog posts to Reddit when they are published.
4
+
5
+ ## Overview
6
+
7
+ The Reddit integration uses a Ruby-to-Python bridge approach:
8
+ - **Ruby side**: Handles Scriptorium integration and data preparation
9
+ - **Python side**: Uses PRAW (Python Reddit API Wrapper) for actual Reddit API calls
10
+
11
+ This approach leverages the mature and well-tested PRAW library while keeping the integration clean and maintainable.
12
+
13
+ ## Setup
14
+
15
+ ### 1. Install Python Dependencies
16
+
17
+ **Recommended: Use a Virtual Environment**
18
+ ```bash
19
+ # Create a virtual environment for Scriptorium
20
+ python3 -m venv ~/.scriptorium-python
21
+
22
+ # Activate the virtual environment
23
+ source ~/.scriptorium-python/bin/activate
24
+
25
+ # Install PRAW
26
+ pip install praw
27
+ ```
28
+
29
+ **Alternative: Install with --user flag**
30
+ ```bash
31
+ pip3 install --user praw
32
+ ```
33
+
34
+ **Note**: Modern Python installations on macOS may require using a virtual environment or the `--user` flag to avoid "externally-managed-environment" errors.
35
+
36
+ ### 2. Create Reddit App
37
+
38
+ 1. Go to [Reddit App Preferences](https://www.reddit.com/prefs/apps)
39
+ 2. Click "create another app"
40
+ 3. Set type to "script"
41
+ 4. Note your credentials:
42
+ - `client_id` (the string under your app name)
43
+ - `client_secret` (the "secret" field)
44
+ - `username` (your Reddit username)
45
+ - `password` (your Reddit password)
46
+
47
+ ### 3. Configure Credentials
48
+
49
+ Create a `reddit_credentials.json` file in your Scriptorium config directory:
50
+
51
+ ```json
52
+ {
53
+ "client_id": "YOUR_CLIENT_ID_HERE",
54
+ "client_secret": "YOUR_CLIENT_SECRET_HERE",
55
+ "username": "YOUR_REDDIT_USERNAME",
56
+ "password": "YOUR_REDDIT_PASSWORD",
57
+ "user_agent": "scriptorium:autopost:v1.0 (by /u/YOUR_USERNAME)",
58
+ "default_subreddit": "YOUR_DEFAULT_SUBREDDIT"
59
+ }
60
+ ```
61
+
62
+ **Security Note**: Keep this file secure and never commit it to version control.
63
+
64
+ ## Usage
65
+
66
+ ### Basic Autoposting
67
+
68
+ ```ruby
69
+ # In your Scriptorium code
70
+ post_data = {
71
+ title: "My Blog Post Title",
72
+ url: "https://myblog.com/posts/my-post.html",
73
+ content: "Post content or excerpt",
74
+ subreddit: "programming" # Optional, uses default if not specified
75
+ }
76
+
77
+ # Autopost to Reddit
78
+ success = repo.autopost_to_reddit(post_data)
79
+ ```
80
+
81
+ ### Check Configuration
82
+
83
+ ```ruby
84
+ # Check if Reddit integration is configured
85
+ if repo.reddit_configured?
86
+ puts "Reddit integration is ready"
87
+ else
88
+ puts "Reddit integration not configured"
89
+ end
90
+ ```
91
+
92
+ ### Get Reddit Configuration
93
+
94
+ ```ruby
95
+ # Access Reddit configuration
96
+ config = repo.reddit.config
97
+ puts "Using Reddit account: #{config['username']}"
98
+ ```
99
+
100
+ ## API Reference
101
+
102
+ ### Scriptorium::Reddit
103
+
104
+ #### `new(repo)`
105
+ Creates a new Reddit integration instance.
106
+
107
+ #### `autopost(post_data, subreddit = nil)`
108
+ Autoposts content to Reddit.
109
+
110
+ **Parameters:**
111
+ - `post_data` (Hash): Post information
112
+ - `title` (String): Post title (required)
113
+ - `url` (String): Post URL (required)
114
+ - `content` (String): Post content or excerpt
115
+ - `subreddit` (String): Target subreddit
116
+ - `subreddit` (String): Override subreddit (optional)
117
+
118
+ **Returns:** `true` on success, `false` on failure
119
+
120
+ #### `configured?`
121
+ Checks if Reddit integration is properly configured.
122
+
123
+ **Returns:** `true` if credentials and Python script exist
124
+
125
+ #### `config`
126
+ Gets the parsed Reddit configuration.
127
+
128
+ **Returns:** Hash with credentials or `nil` if not configured
129
+
130
+ ### Scriptorium::Repo
131
+
132
+ #### `reddit`
133
+ Gets the Reddit integration instance (lazy-loaded).
134
+
135
+ #### `autopost_to_reddit(post_data, subreddit = nil)`
136
+ Convenience method for autoposting.
137
+
138
+ #### `reddit_configured?`
139
+ Convenience method to check Reddit configuration.
140
+
141
+ ## Error Handling
142
+
143
+ The integration includes comprehensive error handling:
144
+
145
+ - **Missing credentials**: Raises `FileNotFound` exception
146
+ - **Missing Python script**: Raises `FileNotFound` exception
147
+ - **Invalid JSON**: Returns `nil` for config, logs error
148
+ - **API failures**: Returns `false`, logs error details
149
+ - **Temporary file cleanup**: Automatic cleanup in all cases
150
+
151
+ ## Testing
152
+
153
+ Run the Reddit integration tests:
154
+
155
+ ```bash
156
+ ruby test/unit/reddit_test.rb
157
+ ```
158
+
159
+ The tests cover:
160
+ - Initialization and configuration
161
+ - Credentials management
162
+ - Error handling
163
+ - Temporary file cleanup
164
+ - Integration with Repo class
165
+
166
+ ## Security Considerations
167
+
168
+ 1. **Credentials Storage**: Store credentials securely and never commit to version control
169
+ 2. **User Agent**: Use a descriptive user agent string as required by Reddit
170
+ 3. **Rate Limiting**: PRAW handles Reddit's rate limiting automatically
171
+ 4. **Permissions**: Only request necessary permissions for your app
172
+
173
+ ## Troubleshooting
174
+
175
+ ### Common Issues
176
+
177
+ 1. **"Reddit credentials file not found"**
178
+ - Ensure `reddit_credentials.json` exists in your config directory
179
+ - Check file permissions
180
+
181
+ 2. **"Reddit autopost Python script not found"**
182
+ - Ensure `scripts/reddit_autopost.py` exists
183
+ - Check that Python 3 is installed
184
+
185
+ 3. **Authentication failures**
186
+ - Verify your Reddit credentials are correct
187
+ - Check that your Reddit app is properly configured
188
+ - Ensure your Reddit account has the necessary permissions
189
+
190
+ 4. **Subreddit posting failures**
191
+ - Verify the subreddit exists and is accessible
192
+ - Check subreddit posting rules and restrictions
193
+ - Ensure your account meets subreddit posting requirements
194
+
195
+ ### Debug Mode
196
+
197
+ Enable debug logging by setting the log level in your Scriptorium configuration.
198
+
199
+ ## Future Enhancements
200
+
201
+ Potential improvements for the Reddit integration:
202
+
203
+ 1. **Comment posting**: Support for posting comments on submissions
204
+ 2. **Crossposting**: Support for crossposting to multiple subreddits
205
+ 3. **Scheduling**: Delayed posting capabilities
206
+ 4. **Analytics**: Track post performance and engagement
207
+ 5. **Moderation**: Pre-posting content validation and filtering
data/doc/user.lt3 ADDED
@@ -0,0 +1,38 @@
1
+ Intro and overview
2
+ - Static files
3
+ - Stored locally, deployed remotely
4
+ - One repository, many views
5
+ - terminology
6
+ - Livetext support
7
+ - markdown?
8
+
9
+ Getting started (5-minute blog)
10
+
11
+ The UI(s)
12
+ - Views
13
+ - listing
14
+ - add a view
15
+ - edit view settings
16
+ - create a post
17
+ - preview
18
+ - deploy
19
+ - live browsing
20
+ - Posts
21
+ - List drafts/posts
22
+ - Create/finish draft
23
+ - Edit
24
+ - Delete/undelete
25
+ - Livetext in brief
26
+ - Themes
27
+ - the standard theme
28
+ - clone and edit
29
+ - Widgets
30
+ - Links
31
+ - Pages
32
+ - Featured posts
33
+
34
+ Livetext in more detail
35
+
36
+
37
+ -
38
+ -
@@ -0,0 +1,137 @@
1
+ # 1. Core Concepts
2
+
3
+ ## What is Scriptorium?
4
+
5
+ Scriptorium is a static site generator designed for creating and managing multiple blogs or content sites from a single installation. It combines the simplicity of static file generation with the power of a multi-view architecture, allowing you to maintain several distinct websites with shared infrastructure.
6
+
7
+ ### Static Files Philosophy
8
+
9
+ Scriptorium generates static HTML, CSS, and JavaScript files. This approach offers several key benefits:
10
+
11
+ - **Performance**: Static files load quickly and can be served efficiently by any web server
12
+ - **Reliability**: No server-side processing means fewer points of failure
13
+ - **Security**: No dynamic code execution reduces attack vectors
14
+ - **Scalability**: Static files can be served by CDNs and cached effectively
15
+ - **Simplicity**: No database setup, server configuration, or runtime dependencies
16
+
17
+ When you publish content with Scriptorium, it generates a complete set of static files that can be deployed to any web hosting service - from simple file hosting to sophisticated CDN networks.
18
+
19
+ ### Multi-View Architecture
20
+
21
+ Scriptorium's most distinctive feature is its **multi-view architecture**. Instead of managing separate installations for different blogs or websites, you can create multiple "views" within a single Scriptorium repository.
22
+
23
+ **What is a view?**
24
+ A view represents a complete, independent website or blog. Each view has its own:
25
+ - Configuration settings
26
+ - Theme and styling
27
+ - Content (posts, pages, widgets)
28
+ - Deployment settings
29
+ - URL structure
30
+
31
+ **Why use views?**
32
+ - **Efficiency**: Manage multiple sites from one installation
33
+ - **Consistency**: Share themes, templates, and infrastructure
34
+ - **Flexibility**: Each view can have completely different content and styling
35
+ - **Maintenance**: Update core functionality across all views at once
36
+
37
+ For example, you might have:
38
+ - A personal blog view
39
+ - A professional portfolio view
40
+ - A project documentation view
41
+ - A photo gallery view
42
+
43
+ All managed from the same Scriptorium installation, with shared themes and infrastructure but completely independent content.
44
+
45
+ ### Repository Structure
46
+
47
+ A Scriptorium repository is a directory that contains everything needed to manage your views and generate your websites. The repository structure follows a logical organization:
48
+
49
+ ```
50
+ scriptorium/
51
+ ├── config/ # Global configuration files
52
+ ├── views/ # Individual view directories
53
+ │ ├── personal/ # Personal blog view
54
+ │ ├── portfolio/ # Professional portfolio view
55
+ │ └── docs/ # Documentation view
56
+ ├── drafts/ # Draft posts (global)
57
+ ├── posts/ # Generated posts (global)
58
+ ├── assets/ # Shared images and files
59
+ ├── themes/ # Theme templates
60
+ └── scripts/ # Utility scripts
61
+ ```
62
+
63
+ **Key Repository Concepts:**
64
+ - **Global vs View-specific**: Some content (like posts) is global and can be shared across views, while other content (like view configuration) is specific to each view
65
+ - **Separation of concerns**: Content, presentation, and configuration are clearly separated
66
+ - **Version control friendly**: The entire repository can be managed with Git or similar tools
67
+
68
+ ### Deployment Overview
69
+
70
+ Scriptorium generates static files that can be deployed to virtually any web hosting service. The deployment process is straightforward:
71
+
72
+ 1. **Generate content**: Scriptorium processes your content and generates static HTML files
73
+ 2. **Upload files**: Transfer the generated files to your web server
74
+ 3. **Serve content**: Your web server serves the static files to visitors
75
+
76
+ **Deployment options include:**
77
+ - Traditional web hosting (shared hosting, VPS, dedicated servers)
78
+ - Static hosting services (Netlify, Vercel, GitHub Pages)
79
+ - Content delivery networks (CDN) for global performance
80
+ - Cloud storage with web serving capabilities
81
+
82
+ The static nature of Scriptorium's output means you have maximum flexibility in choosing where and how to host your content. [Detailed deployment instructions are covered in Section 9.]
83
+
84
+ ## What is LiveText?
85
+
86
+ LiveText is a templating and content processing system that powers Scriptorium's content generation. It provides a simple, powerful way to create dynamic content while maintaining the benefits of static file generation.
87
+
88
+ ### Why LiveText?
89
+
90
+ Scriptorium could have used any number of templating systems (Markdown, Liquid, ERB, etc.), but LiveText was chosen for several key reasons:
91
+
92
+ - **Simplicity**: LiveText syntax is straightforward and easy to learn
93
+ - **Power**: Despite its simplicity, LiveText is capable of complex content processing
94
+ - **Integration**: LiveText integrates seamlessly with Ruby, allowing for custom functions and logic
95
+ - **Flexibility**: LiveText can handle both simple content formatting and complex dynamic generation
96
+ - **Consistency**: LiveText provides a unified approach to content, templates, and configuration
97
+
98
+ LiveText bridges the gap between static content and dynamic generation, allowing you to create sophisticated websites while maintaining the performance and reliability benefits of static files.
99
+
100
+ ### LiveText Syntax in Brief
101
+
102
+ LiveText uses a simple but powerful syntax based on "dot commands" and inline formatting. Here's a quick overview:
103
+
104
+ **Inline formatting:**
105
+ ```
106
+ This is *bold and this is _italic text.
107
+ This is *[multiple words boldfaced].
108
+ ```
109
+
110
+ **Dot commands with parameters:**
111
+ ```
112
+ .title My Blog Post
113
+ .date 2025-07-29
114
+ .tags ruby, programming, blog
115
+
116
+ .link https://example.com Visit Example
117
+ .image /images/photo.jpg My Photo
118
+ ```
119
+
120
+ **Dot commands with body content:**
121
+ ```
122
+ .quote
123
+ This is an inset quote.
124
+ Wherever you go,
125
+ there you are.
126
+ .end
127
+ ```
128
+
129
+ **Variables and functions:**
130
+ ```
131
+ This file is called $File (predefined var).
132
+ The current time is: $$time
133
+ This post has $$word_count words.
134
+ ```
135
+
136
+ LiveText's syntax is designed to be readable and writable, making it easy to create content without getting bogged down in complex templating syntax. [Complete LiveText documentation is provided in Section 3.]
137
+