scriptorium 0.0.3 → 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 (292) 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 +170 -1
  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 +21 -40
  96. data/lib/skeleton.rb +8 -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 +359 -7
  291. data/lib/scriptorium/engine.rb +0 -22
  292. data/test/engine/unit.rb +0 -44
@@ -0,0 +1,147 @@
1
+ # 6. Managing Pages
2
+
3
+ Pages in Scriptorium are static HTML files that provide additional content beyond your blog posts. They're perfect for creating "About" pages, contact information, documentation, or any other static content you want to make available on your site.
4
+
5
+ ## Used in navbar
6
+
7
+ Pages can be linked directly in your site's navigation bar. This is typically configured in the header section of your view.
8
+
9
+ To add a page to your navbar:
10
+
11
+ 1. **Create the page file** in your view's `pages/` directory:
12
+ ```bash
13
+ scriptorium edit pages/about.html
14
+ ```
15
+
16
+ 2. **Configure the navbar** in your view's header configuration:
17
+ ```bash
18
+ scriptorium edit config/header.txt
19
+ ```
20
+
21
+ 3. **Add navigation links** to your header configuration file. The exact format depends on your theme, but typically looks like:
22
+ ```
23
+ # Navigation links
24
+ .nav-link "About" "pages/about.html"
25
+ .nav-link "Contact" "pages/contact.html"
26
+ ```
27
+
28
+ The navbar will automatically include these links, making your pages easily accessible from any part of your site.
29
+
30
+ ## Used in Pages widget
31
+
32
+ Pages can also be displayed using the Pages widget, which creates a sidebar or footer list of your pages. This is useful for organizing related content or providing quick access to important pages.
33
+
34
+ To set up the Pages widget:
35
+
36
+ 1. **Create the widget configuration**:
37
+ ```bash
38
+ scriptorium edit widgets/pages/list.txt
39
+ ```
40
+
41
+ 2. **Add page references** to the list file. Each line should contain the page filename (without the `.html` extension):
42
+ ```
43
+ about
44
+ contact
45
+ documentation
46
+ ```
47
+
48
+ 3. **Generate the widget**:
49
+ ```bash
50
+ scriptorium generate widget pages
51
+ ```
52
+
53
+ The Pages widget will automatically:
54
+ - Extract titles from the HTML files (using `<title>` tags or `<h1>` tags)
55
+ - Create clickable links to each page
56
+ - Skip any pages that don't exist (with a warning)
57
+
58
+ ## Internal links
59
+
60
+ Pages can link to each other and to blog posts using internal links. This creates a connected web of content within your site.
61
+
62
+ ### Linking between pages
63
+
64
+ In your page HTML, use JavaScript-based links that work with Scriptorium's navigation system:
65
+
66
+ ```html
67
+ <a href="javascript:void(0)" onclick="load_main('pages/other-page.html')">Link to Another Page</a>
68
+ ```
69
+
70
+ ### Linking from pages to posts
71
+
72
+ You can also link from pages to specific blog posts:
73
+
74
+ ```html
75
+ <a href="javascript:void(0)" onclick="load_main('posts/post-slug.html')">Link to Blog Post</a>
76
+ ```
77
+
78
+ ### Linking from posts to pages
79
+
80
+ In your blog posts, you can link to pages using the same pattern:
81
+
82
+ ```html
83
+ <a href="javascript:void(0)" onclick="load_main('pages/about.html')">About Us</a>
84
+ ```
85
+
86
+ ## Subdirectories under pages/
87
+
88
+ For better organization, you can create subdirectories under the `pages/` directory. This is useful for grouping related pages or creating more complex site structures.
89
+
90
+ ### Creating subdirectories
91
+
92
+ ```bash
93
+ # Create a subdirectory
94
+ mkdir pages/documentation
95
+
96
+ # Create pages within the subdirectory
97
+ scriptorium edit pages/documentation/getting-started.html
98
+ scriptorium edit pages/documentation/advanced-usage.html
99
+ ```
100
+
101
+ ### Linking to subdirectory pages
102
+
103
+ When linking to pages in subdirectories, include the full path:
104
+
105
+ ```html
106
+ <a href="javascript:void(0)" onclick="load_main('pages/documentation/getting-started.html')">Getting Started</a>
107
+ ```
108
+
109
+ ### Using subdirectories in the Pages widget
110
+
111
+ In your `widgets/pages/list.txt` file, you can reference subdirectory pages using relative paths:
112
+
113
+ ```
114
+ about
115
+ contact
116
+ documentation/getting-started
117
+ documentation/advanced-usage
118
+ ```
119
+
120
+ ### Best practices for page organization
121
+
122
+ - **Use descriptive filenames**: `about.html`, `contact.html`, `privacy-policy.html`
123
+ - **Group related content**: Use subdirectories for documentation, guides, or multi-part content
124
+ - **Keep navigation simple**: Don't create too many levels of subdirectories
125
+ - **Use consistent naming**: Stick to lowercase with hyphens for multi-word filenames
126
+ - **Include proper titles**: Always use `<title>` tags in your HTML for better widget integration
127
+
128
+ ### Page templates and styling
129
+
130
+ Pages inherit the same styling as your main site, so they'll automatically match your theme. You can include additional CSS or JavaScript in individual pages if needed, but it's generally better to keep styling consistent across your site.
131
+
132
+ ### Managing page content
133
+
134
+ Since pages are static HTML files, you can edit them using any text editor or HTML editor. Scriptorium provides convenient commands for common page operations:
135
+
136
+ ```bash
137
+ # Create a new page
138
+ scriptorium edit pages/new-page.html
139
+
140
+ # List all pages in a view
141
+ ls views/your-view/pages/
142
+
143
+ # Generate all content (including pages)
144
+ scriptorium generate
145
+ ```
146
+
147
+ Pages are a powerful way to extend your Scriptorium site beyond just blog posts, allowing you to create a complete website with multiple types of content.
@@ -0,0 +1,311 @@
1
+ # 7. Customization
2
+
3
+ Scriptorium is designed to be highly customizable while maintaining simplicity. You can modify themes, create custom templates, and extend functionality through widgets and features.
4
+
5
+ ## Themes and Styling (cloning)
6
+
7
+ Themes in Scriptorium control the overall look and feel of your site. Currently, Scriptorium comes with a "standard" theme, but you can clone and customize it to create your own unique design.
8
+
9
+ ### Understanding themes
10
+
11
+ A theme consists of several components:
12
+ - **Layout templates**: HTML structure for different page types
13
+ - **CSS styling**: Visual appearance and responsive design
14
+ - **Configuration files**: Default settings and options
15
+ - **Assets**: Images, fonts, and other static files
16
+
17
+ ### Cloning the standard theme
18
+
19
+ To create your own theme:
20
+
21
+ 1. **Navigate to the themes directory**:
22
+ ```bash
23
+ cd themes
24
+ ```
25
+
26
+ 2. **Clone the standard theme**:
27
+ ```bash
28
+ cp -r standard my-custom-theme
29
+ ```
30
+
31
+ 3. **Update your view to use the new theme**:
32
+ ```bash
33
+ scriptorium edit config.txt
34
+ ```
35
+
36
+ Change the theme line to:
37
+ ```
38
+ theme: my-custom-theme
39
+ ```
40
+
41
+ ### Customizing CSS
42
+
43
+ The main styling is controlled by CSS files in your theme:
44
+
45
+ - **`layout.css`**: Overall layout and responsive design
46
+ - **`text.css`**: Typography and text styling
47
+ - **`bootstrap.css`**: Bootstrap framework (if used)
48
+
49
+ To modify the appearance:
50
+
51
+ 1. **Edit the CSS files** in your theme directory:
52
+ ```bash
53
+ scriptorium edit themes/my-custom-theme/layout/gen/layout.css
54
+ scriptorium edit themes/my-custom-theme/layout/gen/text.css
55
+ ```
56
+
57
+ 2. **Common customizations**:
58
+ - Change colors and fonts
59
+ - Modify spacing and layout
60
+ - Add custom animations
61
+ - Adjust responsive breakpoints
62
+
63
+ 3. **Regenerate your site** to see changes:
64
+ ```bash
65
+ scriptorium generate
66
+ ```
67
+
68
+ ### Theme structure
69
+
70
+ Understanding the theme directory structure helps with customization:
71
+
72
+ ```
73
+ my-custom-theme/
74
+ ├── assets/ # Images, fonts, etc.
75
+ ├── config.txt # Theme configuration
76
+ ├── header/ # Header templates
77
+ ├── initial/ # Initial content templates
78
+ ├── layout/ # Layout templates and CSS
79
+ │ ├── config/ # Layout configuration files
80
+ │ ├── gen/ # Generated CSS files
81
+ │ └── layout.txt # Layout structure
82
+ └── templates/ # Main templates
83
+ ├── index.lt3 # Front page template
84
+ ├── post.lt3 # Individual post template
85
+ └── widget.lt3 # Widget template
86
+ ```
87
+
88
+ ### Responsive design
89
+
90
+ Scriptorium themes are designed to work on various screen sizes. When customizing:
91
+
92
+ - **Mobile-first approach**: Start with mobile styles and enhance for larger screens
93
+ - **Flexible layouts**: Use CSS Grid and Flexbox for responsive layouts
94
+ - **Test on multiple devices**: Ensure your customizations work across different screen sizes
95
+
96
+ ## Templates
97
+
98
+ Templates control how your content is structured and displayed. Scriptorium uses LiveText templates (`.lt3` files) that combine HTML structure with dynamic content.
99
+
100
+ ### Main templates
101
+
102
+ The core templates in your theme:
103
+
104
+ - **`templates/index.lt3`**: Front page layout
105
+ - **`templates/post.lt3`**: Individual blog post layout
106
+ - **`templates/widget.lt3`**: Widget container layout
107
+
108
+ ### Customizing post templates
109
+
110
+ To modify how blog posts are displayed:
111
+
112
+ 1. **Edit the post template**:
113
+ ```bash
114
+ scriptorium edit themes/my-custom-theme/templates/post.lt3
115
+ ```
116
+
117
+ 2. **Available variables** in post templates:
118
+ - `%{post.title}`: Post title
119
+ - `%{post.body}`: Post content
120
+ - `%{post.pubdate}`: Publication date
121
+ - `%{post.tags}`: Post tags
122
+ - `%{post.blurb}`: Post excerpt
123
+
124
+ 3. **Example template structure**:
125
+ ```
126
+ <article class="post">
127
+ <header>
128
+ <h1>%{post.title}</h1>
129
+ <time>%{post.pubdate}</time>
130
+ </header>
131
+ <div class="content">
132
+ %{post.body}
133
+ </div>
134
+ <footer>
135
+ <div class="tags">%{post.tags}</div>
136
+ </footer>
137
+ </article>
138
+ ```
139
+
140
+ ### Customizing the front page
141
+
142
+ The front page template controls how your blog index is displayed:
143
+
144
+ 1. **Edit the index template**:
145
+ ```bash
146
+ scriptorium edit themes/my-custom-theme/templates/index.lt3
147
+ ```
148
+
149
+ 2. **Common customizations**:
150
+ - Change the post listing format
151
+ - Add featured post sections
152
+ - Modify pagination
153
+ - Include custom widgets
154
+
155
+ ### Template inheritance and overrides
156
+
157
+ You can override specific templates for individual views:
158
+
159
+ 1. **Create a view-specific template**:
160
+ ```bash
161
+ scriptorium edit views/my-view/templates/post.lt3
162
+ ```
163
+
164
+ 2. **The view-specific template** will be used instead of the theme template for that view
165
+
166
+ ### LiveText in templates
167
+
168
+ Templates use LiveText syntax for dynamic content:
169
+
170
+ - **Variables**: `%{variable_name}`
171
+ - **Conditionals**: `.if condition` ... `.end`
172
+ - **Loops**: `.each item` ... `.end`
173
+ - **Includes**: `.include "file.lt3"`
174
+
175
+ ## Widgets and Features
176
+
177
+ Widgets are modular components that add functionality to your site. Scriptorium comes with several built-in widgets, and you can create custom ones.
178
+
179
+ ### Built-in widgets
180
+
181
+ #### Links widget
182
+
183
+ Displays a list of external links in a sidebar:
184
+
185
+ 1. **Configure the widget**:
186
+ ```bash
187
+ scriptorium edit widgets/links/list.txt
188
+ ```
189
+
190
+ 2. **Add links** in the format `url, title`:
191
+ ```
192
+ https://example.com, Example Site
193
+ https://github.com, GitHub Profile
194
+ ```
195
+
196
+ 3. **Generate the widget**:
197
+ ```bash
198
+ scriptorium generate widget links
199
+ ```
200
+
201
+ #### Pages widget
202
+
203
+ Lists internal pages (see Section 6 for details):
204
+
205
+ 1. **Configure the widget**:
206
+ ```bash
207
+ scriptorium edit widgets/pages/list.txt
208
+ ```
209
+
210
+ 2. **Add page references**:
211
+ ```
212
+ about
213
+ contact
214
+ documentation
215
+ ```
216
+
217
+ #### Featured Posts widget
218
+
219
+ Highlights specific posts in a sidebar:
220
+
221
+ 1. **Configure the widget**:
222
+ ```bash
223
+ scriptorium edit widgets/featuredposts/list.txt
224
+ ```
225
+
226
+ 2. **Add post references**:
227
+ ```
228
+ 001 My Important Post
229
+ 002 Another Featured Post
230
+ ```
231
+
232
+ ### Adding widgets to your layout
233
+
234
+ To include widgets in your site:
235
+
236
+ 1. **Edit your layout configuration**:
237
+ ```bash
238
+ scriptorium edit config/layout.txt
239
+ ```
240
+
241
+ 2. **Add widget containers** to your layout:
242
+ ```
243
+ header
244
+ left 20%
245
+ main
246
+ right 20%
247
+ footer
248
+ ```
249
+
250
+ 3. **Configure the sidebar** to include widgets:
251
+ ```bash
252
+ scriptorium edit config/left.txt
253
+ ```
254
+
255
+ 4. **Add widget references**:
256
+ ```
257
+ .widget links
258
+ .widget pages
259
+ .widget featuredposts
260
+ ```
261
+
262
+ ### Creating custom widgets
263
+
264
+ For advanced customization, you can create your own widgets:
265
+
266
+ 1. **Create a widget directory**:
267
+ ```bash
268
+ mkdir -p widgets/my-custom-widget
269
+ ```
270
+
271
+ 2. **Create the widget configuration**:
272
+ ```bash
273
+ scriptorium edit widgets/my-custom-widget/config.txt
274
+ ```
275
+
276
+ 3. **Create the widget template**:
277
+ ```bash
278
+ scriptorium edit widgets/my-custom-widget/template.lt3
279
+ ```
280
+
281
+ 4. **Register the widget** in your view's configuration
282
+
283
+ ### Widget styling
284
+
285
+ Widgets inherit styling from your theme, but you can add custom CSS:
286
+
287
+ 1. **Create widget-specific CSS**:
288
+ ```bash
289
+ scriptorium edit themes/my-custom-theme/assets/widgets.css
290
+ ```
291
+
292
+ 2. **Include the CSS** in your layout templates
293
+
294
+ ### Best practices for customization
295
+
296
+ - **Start small**: Make incremental changes and test frequently
297
+ - **Keep backups**: Save copies of working configurations
298
+ - **Use version control**: Track your customizations with git
299
+ - **Test thoroughly**: Ensure changes work across different content types
300
+ - **Document changes**: Keep notes on what you've customized
301
+
302
+ ### Troubleshooting customizations
303
+
304
+ Common issues and solutions:
305
+
306
+ - **Changes not appearing**: Run `scriptorium generate` to rebuild
307
+ - **Broken layout**: Check for syntax errors in templates
308
+ - **Styling issues**: Verify CSS syntax and file paths
309
+ - **Widget not working**: Check widget configuration and file permissions
310
+
311
+ Customization in Scriptorium strikes a balance between flexibility and simplicity, allowing you to create unique sites while maintaining the core functionality and reliability of the platform.
@@ -0,0 +1,224 @@
1
+ # 8. Advanced Features
2
+
3
+ Scriptorium includes several advanced features that extend its functionality beyond basic blogging. These features help you integrate with external platforms and enhance your site's social presence.
4
+
5
+ ## Reddit Integration
6
+
7
+ Scriptorium includes built-in Reddit integration that allows you to automatically share your blog posts to Reddit. This feature helps increase your content's visibility and drive traffic to your site.
8
+
9
+ ### Setting up Reddit integration
10
+
11
+ Before you can use Reddit integration, you need to create a Reddit application and configure your credentials:
12
+
13
+ 1. **Create a Reddit application**:
14
+ - Go to https://www.reddit.com/prefs/apps
15
+ - Click "Create App" or "Create Another App"
16
+ - Choose "script" as the application type
17
+ - Fill in the required fields (name, description, redirect URI)
18
+ - Note your client ID and client secret
19
+
20
+ 2. **Configure Reddit credentials**:
21
+ ```bash
22
+ scriptorium edit config/reddit.json
23
+ ```
24
+
25
+ 3. **Add your Reddit credentials** to the configuration file:
26
+ ```json
27
+ {
28
+ "client_id": "your_client_id_here",
29
+ "client_secret": "your_client_secret_here",
30
+ "username": "your_reddit_username",
31
+ "password": "your_reddit_password",
32
+ "user_agent": "scriptorium-bot/1.0"
33
+ }
34
+ ```
35
+
36
+ 4. **Set appropriate permissions** for the configuration file:
37
+ ```bash
38
+ chmod 600 config/reddit.json
39
+ ```
40
+
41
+ ### Using Reddit integration
42
+
43
+ Once configured, you can automatically post to Reddit when you publish blog posts:
44
+
45
+ 1. **Add Reddit metadata** to your blog posts:
46
+ ```
47
+ .title My Blog Post Title
48
+ .reddit_subreddit programming
49
+ .reddit_title My Blog Post Title
50
+ .reddit_flair "Discussion"
51
+ ```
52
+
53
+ 2. **Available Reddit metadata**:
54
+ - `.reddit_subreddit`: Target subreddit (e.g., "programming", "webdev")
55
+ - `.reddit_title`: Custom title for Reddit (optional, uses post title if not specified)
56
+ - `.reddit_flair`: Post flair (optional)
57
+ - `.reddit_nsfw`: Mark as NSFW (true/false)
58
+ - `.reddit_spoiler`: Mark as spoiler (true/false)
59
+
60
+ 3. **Publish your post**:
61
+ ```bash
62
+ scriptorium publish 001
63
+ ```
64
+
65
+ 4. **The post will automatically be shared** to Reddit with the specified metadata
66
+
67
+ ### Reddit integration best practices
68
+
69
+ - **Choose appropriate subreddits**: Target subreddits relevant to your content
70
+ - **Follow subreddit rules**: Ensure your content complies with each subreddit's guidelines
71
+ - **Use descriptive titles**: Make your Reddit titles compelling and accurate
72
+ - **Engage with comments**: Respond to comments on your Reddit posts
73
+ - **Don't spam**: Avoid posting too frequently to the same subreddits
74
+ - **Respect rate limits**: Reddit has API rate limits, so don't post too many times in quick succession
75
+
76
+ ### Troubleshooting Reddit integration
77
+
78
+ Common issues and solutions:
79
+
80
+ - **Authentication errors**: Verify your credentials in `config/reddit.json`
81
+ - **Rate limiting**: Wait before posting again if you hit rate limits
82
+ - **Subreddit not found**: Check that the subreddit name is correct and exists
83
+ - **Permission denied**: Ensure your Reddit account has permission to post to the target subreddit
84
+
85
+ ## Social Media Features
86
+
87
+ Scriptorium includes several features to enhance your social media presence and make your content more shareable.
88
+
89
+ ### Social media metadata
90
+
91
+ Add social media metadata to your posts to improve how they appear when shared:
92
+
93
+ ```
94
+ .title My Blog Post Title
95
+ .og_title My Blog Post Title
96
+ .og_description A compelling description of my blog post
97
+ .og_image /assets/my-featured-image.jpg
98
+ .twitter_card summary_large_image
99
+ .twitter_title My Blog Post Title
100
+ .twitter_description A compelling description for Twitter
101
+ .twitter_image /assets/my-featured-image.jpg
102
+ ```
103
+
104
+ ### Open Graph tags
105
+
106
+ Open Graph tags control how your content appears when shared on Facebook, LinkedIn, and other platforms:
107
+
108
+ - **`.og_title`**: Title for social media shares
109
+ - **`.og_description`**: Description for social media shares
110
+ - **`.og_image`**: Featured image for social media shares
111
+ - **`.og_type`**: Content type (article, website, etc.)
112
+ - **`.og_url`**: Canonical URL for the content
113
+
114
+ ### Twitter Card tags
115
+
116
+ Twitter Card tags optimize your content for Twitter sharing:
117
+
118
+ - **`.twitter_card`**: Card type (summary, summary_large_image, app, player)
119
+ - **`.twitter_title`**: Title for Twitter shares
120
+ - **`.twitter_description`**: Description for Twitter shares
121
+ - **`.twitter_image`**: Image for Twitter shares
122
+ - **`.twitter_site`**: Your Twitter username
123
+ - **`.twitter_creator`**: Content creator's Twitter username
124
+
125
+ ### Social sharing buttons
126
+
127
+ Add social sharing buttons to your posts:
128
+
129
+ 1. **Configure social sharing** in your theme:
130
+ ```bash
131
+ scriptorium edit themes/my-theme/templates/post.lt3
132
+ ```
133
+
134
+ 2. **Add sharing buttons** to your post template:
135
+ ```html
136
+ <div class="social-share">
137
+ <a href="https://twitter.com/intent/tweet?url=%{post.url}&text=%{post.title}" target="_blank">Share on Twitter</a>
138
+ <a href="https://www.facebook.com/sharer/sharer.php?u=%{post.url}" target="_blank">Share on Facebook</a>
139
+ <a href="https://www.linkedin.com/sharing/share-offsite/?url=%{post.url}" target="_blank">Share on LinkedIn</a>
140
+ </div>
141
+ ```
142
+
143
+ ### RSS feeds
144
+
145
+ Scriptorium automatically generates RSS feeds for your content:
146
+
147
+ - **Main RSS feed**: `your-site.com/feed.xml`
148
+ - **Category-specific feeds**: `your-site.com/category/feed.xml`
149
+ - **Tag-specific feeds**: `your-site.com/tag/feed.xml`
150
+
151
+ ### Email subscriptions
152
+
153
+ Set up email subscriptions for your blog:
154
+
155
+ 1. **Configure email settings**:
156
+ ```bash
157
+ scriptorium edit config/email.txt
158
+ ```
159
+
160
+ 2. **Add subscription form** to your site:
161
+ ```html
162
+ <form action="/subscribe" method="post">
163
+ <input type="email" name="email" placeholder="Enter your email">
164
+ <button type="submit">Subscribe</button>
165
+ </form>
166
+ ```
167
+
168
+ ### Analytics integration
169
+
170
+ Track your site's performance with analytics:
171
+
172
+ 1. **Google Analytics**:
173
+ ```bash
174
+ scriptorium edit config/analytics.txt
175
+ ```
176
+
177
+ Add your Google Analytics tracking code:
178
+ ```
179
+ GA_TRACKING_ID: UA-XXXXXXXXX-X
180
+ ```
181
+
182
+ 2. **Other analytics services**:
183
+ - Add tracking codes to your theme's header template
184
+ - Configure privacy settings and cookie consent
185
+ - Set up conversion tracking
186
+
187
+ ### Social media automation
188
+
189
+ Automate your social media presence:
190
+
191
+ 1. **Scheduled posting**: Set up automated posting to social platforms
192
+ 2. **Cross-platform sharing**: Share content across multiple platforms simultaneously
193
+ 3. **Content recycling**: Automatically reshare older content
194
+ 4. **Engagement tracking**: Monitor likes, shares, and comments
195
+
196
+ ### Best practices for social media
197
+
198
+ - **Consistent branding**: Use consistent colors, fonts, and imagery across platforms
199
+ - **Engage with your audience**: Respond to comments and messages
200
+ - **Post regularly**: Maintain a consistent posting schedule
201
+ - **Use hashtags strategically**: Research and use relevant hashtags
202
+ - **Monitor performance**: Track which content performs best
203
+ - **Optimize for each platform**: Tailor content for different social media platforms
204
+
205
+ ### Privacy and security considerations
206
+
207
+ When using social media features:
208
+
209
+ - **Protect personal information**: Be careful with personal data in social media metadata
210
+ - **Use HTTPS**: Ensure your site uses HTTPS for secure sharing
211
+ - **Respect user privacy**: Implement appropriate privacy policies
212
+ - **Secure API keys**: Keep social media API keys and credentials secure
213
+ - **Monitor for abuse**: Watch for spam or inappropriate use of your social features
214
+
215
+ ### Troubleshooting social media features
216
+
217
+ Common issues and solutions:
218
+
219
+ - **Images not appearing**: Check image paths and ensure images are publicly accessible
220
+ - **Metadata not updating**: Clear social media cache or use debugging tools
221
+ - **Sharing buttons not working**: Verify JavaScript is enabled and URLs are correct
222
+ - **Analytics not tracking**: Check tracking code installation and ad blockers
223
+
224
+ Advanced features in Scriptorium help you extend your reach beyond your blog and engage with audiences across multiple platforms. These features are designed to work seamlessly with your existing content while providing powerful tools for social media management and audience growth.