scriptorium 0.0.3 → 0.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (353) 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/icons/social/reddit.png +0 -0
  7. data/assets/icons/social/x-logo.png +0 -0
  8. data/assets/icons/ui/.DS_Store +0 -0
  9. data/assets/icons/ui/back.png +0 -0
  10. data/assets/icons/ui/copy.png +0 -0
  11. data/assets/icons/ui/down.png +0 -0
  12. data/assets/icons/ui/end.png +0 -0
  13. data/assets/icons/ui/exit.png +0 -0
  14. data/assets/icons/ui/foo +10 -0
  15. data/assets/icons/ui/home.png +0 -0
  16. data/assets/icons/ui/left.png +0 -0
  17. data/assets/icons/ui/next.png +0 -0
  18. data/assets/icons/ui/right.png +0 -0
  19. data/assets/icons/ui/start.png +0 -0
  20. data/assets/icons/ui/up.png +0 -0
  21. data/assets/imagenotfound.jpg +0 -0
  22. data/assets/samples/placeholder.svg +9 -0
  23. data/assets/themes/standard/favicon.svg +6 -0
  24. data/bin/sblog +84 -5
  25. data/bin/scriptorium +1 -0
  26. data/doc/README.txt +6 -0
  27. data/doc/anti-amnesia/20250727-054000-scriptorium-overview.md +94 -0
  28. data/doc/anti-amnesia/20250727-123000-anti-amnesia-conventions.md +2 -0
  29. data/doc/anti-amnesia/20250727-172600-cursor-rbenv-ruby-version-mystery.md +45 -0
  30. data/doc/anti-amnesia/20250727-172900-ai-cognitive-assessment-capabilities.md +40 -0
  31. data/doc/anti-amnesia/20250728-124243-aaa-syntax-clarification.md +46 -0
  32. data/doc/anti-amnesia/20250729-210000-reddit-autopost-integration-complete.md +158 -0
  33. data/doc/anti-amnesia/20250804-190500-cognitive-loop-bug.md +35 -0
  34. data/doc/anti-amnesia/20250804-190700-anti-amnesia-timestamping-fix.md +27 -0
  35. data/doc/anti-amnesia/20250807-213025.md +116 -0
  36. data/doc/anti-amnesia/20250901-211714-codemirror-integration-and-web-tests.md +172 -0
  37. data/doc/anti-amnesia/20250902-002402-backup-restore-system.md +126 -0
  38. data/doc/anti-amnesia/20250907-203339-backup-metadata-implementation.md +66 -0
  39. data/doc/banner_svg_config.md +114 -0
  40. data/doc/contrib.lt3 +8 -0
  41. data/doc/dependencies.md +281 -0
  42. data/doc/hacker.lt3 +5 -0
  43. data/doc/imported/0001-elixir-conf-2014/metadata.txt +7 -0
  44. data/doc/imported/0001-elixir-conf-2014/post.html +37 -0
  45. data/doc/imported/0001-elixir-conf-2014/source.lt3 +22 -0
  46. data/doc/imported/0002-programmers-and-word-processing/metadata.txt +7 -0
  47. data/doc/imported/0002-programmers-and-word-processing/post.html +192 -0
  48. data/doc/imported/0002-programmers-and-word-processing/source.lt3 +146 -0
  49. data/doc/imported/0003-how-to-turn-your-brain-sideways/metadata.txt +7 -0
  50. data/doc/imported/0003-how-to-turn-your-brain-sideways/post.html +60 -0
  51. data/doc/imported/0003-how-to-turn-your-brain-sideways/source.lt3 +40 -0
  52. data/doc/imported/0004-upcoming-lone-star-ruby-conference/metadata.txt +7 -0
  53. data/doc/imported/0004-upcoming-lone-star-ruby-conference/post.html +42 -0
  54. data/doc/imported/0004-upcoming-lone-star-ruby-conference/source.lt3 +24 -0
  55. data/doc/imported/0005-elixir-conf-2015-announced/metadata.txt +7 -0
  56. data/doc/imported/0005-elixir-conf-2015-announced/post.html +30 -0
  57. data/doc/imported/0005-elixir-conf-2015-announced/source.lt3 +16 -0
  58. data/doc/imported/0006-ruby-for-dinosaurs/metadata.txt +7 -0
  59. data/doc/imported/0006-ruby-for-dinosaurs/post.html +43 -0
  60. data/doc/imported/0006-ruby-for-dinosaurs/source.lt3 +27 -0
  61. data/doc/imported/0007-phoenix-isnt-rails/metadata.txt +7 -0
  62. data/doc/imported/0007-phoenix-isnt-rails/post.html +116 -0
  63. data/doc/imported/0007-phoenix-isnt-rails/source.lt3 +87 -0
  64. data/doc/imported/0008-concerning-the-term-monkeypatching/metadata.txt +7 -0
  65. data/doc/imported/0008-concerning-the-term-monkeypatching/post.html +129 -0
  66. data/doc/imported/0008-concerning-the-term-monkeypatching/source.lt3 +92 -0
  67. data/doc/imported/0009-announcement-coming-soon/metadata.txt +7 -0
  68. data/doc/imported/0009-announcement-coming-soon/post.html +33 -0
  69. data/doc/imported/0009-announcement-coming-soon/source.lt3 +19 -0
  70. data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/metadata.txt +7 -0
  71. data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/post.html +175 -0
  72. data/doc/imported/0010-immutable-data-ditching-the-wax-tablet/source.lt3 +139 -0
  73. data/doc/imported/0011-computer-science-as-a-lost-art/metadata.txt +7 -0
  74. data/doc/imported/0011-computer-science-as-a-lost-art/post.html +139 -0
  75. data/doc/imported/0011-computer-science-as-a-lost-art/source.lt3 +104 -0
  76. data/doc/imported/0012-ruby-day-in-turin-italy/metadata.txt +7 -0
  77. data/doc/imported/0012-ruby-day-in-turin-italy/post.html +42 -0
  78. data/doc/imported/0012-ruby-day-in-turin-italy/source.lt3 +24 -0
  79. data/doc/imported/0013-rubyday-was-a-success/metadata.txt +7 -0
  80. data/doc/imported/0013-rubyday-was-a-success/post.html +44 -0
  81. data/doc/imported/0013-rubyday-was-a-success/source.lt3 +27 -0
  82. data/doc/imported/0014-working-on-the-blogging-software/metadata.txt +7 -0
  83. data/doc/imported/0014-working-on-the-blogging-software/post.html +63 -0
  84. data/doc/imported/0014-working-on-the-blogging-software/source.lt3 +41 -0
  85. data/doc/imported/0015-ok-its-not-really-a-lost-art/metadata.txt +7 -0
  86. data/doc/imported/0015-ok-its-not-really-a-lost-art/post.html +172 -0
  87. data/doc/imported/0015-ok-its-not-really-a-lost-art/source.lt3 +134 -0
  88. data/doc/imported/0016-an-in-operator-for-ruby/metadata.txt +7 -0
  89. data/doc/imported/0016-an-in-operator-for-ruby/post.html +155 -0
  90. data/doc/imported/0016-an-in-operator-for-ruby/source.lt3 +106 -0
  91. data/doc/imported/0017-the-forgotten-mathematician/metadata.txt +7 -0
  92. data/doc/imported/0017-the-forgotten-mathematician/post.html +161 -0
  93. data/doc/imported/0017-the-forgotten-mathematician/source.lt3 +119 -0
  94. data/doc/imported/0018-ruby-puns/metadata.txt +7 -0
  95. data/doc/imported/0018-ruby-puns/post.html +46 -0
  96. data/doc/imported/0018-ruby-puns/source.lt3 +28 -0
  97. data/doc/imported/0019-custom-exceptions-via-metaprogramming/metadata.txt +7 -0
  98. data/doc/imported/0019-custom-exceptions-via-metaprogramming/post.html +138 -0
  99. data/doc/imported/0019-custom-exceptions-via-metaprogramming/source.lt3 +101 -0
  100. data/doc/imported/0020-fffff/metadata.txt +7 -0
  101. data/doc/imported/0020-fffff/post.html +24 -0
  102. data/doc/imported/0020-fffff/source.lt3 +12 -0
  103. data/doc/imported/0021-trying-ror-yet-again/metadata.txt +7 -0
  104. data/doc/imported/0021-trying-ror-yet-again/post.html +26 -0
  105. data/doc/imported/0021-trying-ror-yet-again/source.lt3 +12 -0
  106. data/doc/imported/0023-doctor-sleep/metadata.txt +7 -0
  107. data/doc/imported/0023-doctor-sleep/post.html +63 -0
  108. data/doc/imported/0023-doctor-sleep/source.lt3 +44 -0
  109. data/doc/imported/0024-just-a-test/metadata.txt +7 -0
  110. data/doc/imported/0024-just-a-test/post.html +24 -0
  111. data/doc/imported/0024-just-a-test/source.lt3 +12 -0
  112. data/doc/imported/import_summary.txt +98 -0
  113. data/doc/livetext-informal-spec.txt +65 -0
  114. data/doc/myuserdoc/ch-0.lt3 +31 -0
  115. data/doc/myuserdoc/ch-1.lt3 +37 -0
  116. data/doc/myuserdoc/ch-10.lt3 +22 -0
  117. data/doc/myuserdoc/ch-2.lt3 +37 -0
  118. data/doc/myuserdoc/ch-3.lt3 +19 -0
  119. data/doc/myuserdoc/ch-4.lt3 +43 -0
  120. data/doc/myuserdoc/ch-5.lt3 +22 -0
  121. data/doc/myuserdoc/ch-6.lt3 +19 -0
  122. data/doc/myuserdoc/ch-7.lt3 +16 -0
  123. data/doc/myuserdoc/ch-8.lt3 +13 -0
  124. data/doc/myuserdoc/ch-9.lt3 +19 -0
  125. data/doc/myuserdoc/tweak.rb +18 -0
  126. data/doc/myuserdoc/userdoc-toc.txt +88 -0
  127. data/doc/old-posts/0001-elixir-conf-2014.lt3 +24 -0
  128. data/doc/old-posts/0002-programmers-and-word-processing.lt3 +150 -0
  129. data/doc/old-posts/0003-how-to-turn-your-brain-sideways.lt3 +43 -0
  130. data/doc/old-posts/0004-upcoming-lone-star-ruby-conference.lt3 +26 -0
  131. data/doc/old-posts/0005-elixir-conf-2015-announced.lt3 +17 -0
  132. data/doc/old-posts/0006-ruby-for-dinosaurs.lt3 +30 -0
  133. data/doc/old-posts/0007-phoenix-isnt-rails.lt3 +90 -0
  134. data/doc/old-posts/0008-concerning-the-term-monkeypatching.lt3 +105 -0
  135. data/doc/old-posts/0009-announcement-coming-soon.lt3 +20 -0
  136. data/doc/old-posts/0010-immutable-data-ditching-the-wax-tablet.lt3 +142 -0
  137. data/doc/old-posts/0011-computer-science-as-a-lost-art.lt3 +117 -0
  138. data/doc/old-posts/0012-ruby-day-in-turin-italy.lt3 +26 -0
  139. data/doc/old-posts/0013-rubyday-was-a-success.lt3 +28 -0
  140. data/doc/old-posts/0014-working-on-the-blogging-software.lt3 +42 -0
  141. data/doc/old-posts/0015-ok-its-not-really-a-lost-art.lt3 +137 -0
  142. data/doc/old-posts/0016-an-in-operator-for-ruby.lt3 +142 -0
  143. data/doc/old-posts/0017-the-forgotten-mathematician.lt3 +129 -0
  144. data/doc/old-posts/0018-ruby-puns.lt3 +31 -0
  145. data/doc/old-posts/0019-custom-exceptions-via-metaprogramming.lt3 +116 -0
  146. data/doc/old-posts/0021-trying-ror-yet-again.lt3 +35 -0
  147. data/doc/old-posts/0023-doctor-sleep.lt3 +43 -0
  148. data/doc/old-posts/0024-just-a-test.lt3 +12 -0
  149. data/doc/old-posts/0025-trying-another-post.lt3 +12 -0
  150. data/doc/old-repo +1 -0
  151. data/doc/reddit_credentials_template.json +8 -0
  152. data/doc/reddit_integration.md +207 -0
  153. data/doc/user.lt3 +35 -0
  154. data/doc/user_guide_section_1.md +137 -0
  155. data/doc/user_guide_section_10.md +515 -0
  156. data/doc/user_guide_section_11.md +708 -0
  157. data/doc/user_guide_section_2.md +233 -0
  158. data/doc/user_guide_section_3.md +5 -0
  159. data/doc/user_guide_section_4.md +221 -0
  160. data/doc/user_guide_section_5.md +243 -0
  161. data/doc/user_guide_section_6.md +147 -0
  162. data/doc/user_guide_section_7.md +311 -0
  163. data/doc/user_guide_section_8.md +224 -0
  164. data/doc/user_guide_section_9.md +375 -0
  165. data/lib/rouge/lexers/livetext.rb +74 -0
  166. data/lib/scriptorium/api.rb +2373 -0
  167. data/lib/scriptorium/banner_svg.rb +729 -0
  168. data/lib/scriptorium/contract.rb +34 -0
  169. data/lib/scriptorium/exceptions.rb +201 -1
  170. data/lib/scriptorium/helpers.rb +675 -0
  171. data/lib/scriptorium/post.rb +259 -0
  172. data/lib/scriptorium/reddit.rb +83 -0
  173. data/lib/scriptorium/repo.rb +938 -0
  174. data/lib/scriptorium/standard_files.rb +149 -0
  175. data/lib/scriptorium/support/bootstrap/css.txt +5 -0
  176. data/lib/scriptorium/support/bootstrap/js.txt +4 -0
  177. data/lib/scriptorium/support/common_js/clipboard.js +35 -0
  178. data/lib/scriptorium/support/common_js/content-loader.js +187 -0
  179. data/lib/scriptorium/support/common_js/navigation.js +52 -0
  180. data/lib/scriptorium/support/common_js/syntax-highlighting.js +27 -0
  181. data/lib/scriptorium/support/config/reddit.txt +10 -0
  182. data/lib/scriptorium/support/config/reddit_template.txt +17 -0
  183. data/lib/scriptorium/support/config/social.txt +8 -0
  184. data/lib/scriptorium/support/highlight/css.txt +2 -0
  185. data/lib/scriptorium/support/highlight/custom.css +119 -0
  186. data/lib/scriptorium/support/highlight/js.txt +1 -0
  187. data/lib/scriptorium/support/post_index/config.txt +15 -0
  188. data/lib/scriptorium/support/post_index/style.css +55 -0
  189. data/lib/scriptorium/support/templates/index_entry.lt3 +16 -0
  190. data/lib/scriptorium/support/templates/initial_post.lt3 +12 -0
  191. data/lib/scriptorium/support/templates/layout.txt +5 -0
  192. data/lib/scriptorium/support/templates/post.lt3 +104 -0
  193. data/lib/scriptorium/support/theme/footer.lt3 +2 -0
  194. data/lib/scriptorium/support/theme/header.lt3 +4 -0
  195. data/lib/scriptorium/support/theme/left.lt3 +3 -0
  196. data/lib/scriptorium/support/theme/main.lt3 +5 -0
  197. data/lib/scriptorium/support/theme/right.lt3 +3 -0
  198. data/lib/scriptorium/theme.rb +192 -0
  199. data/lib/scriptorium/version.rb +1 -1
  200. data/lib/scriptorium/view.rb +1021 -0
  201. data/lib/scriptorium/widgets/featured_posts.rb +149 -0
  202. data/lib/scriptorium/widgets/links.rb +112 -0
  203. data/lib/scriptorium/widgets/pages.rb +133 -0
  204. data/lib/scriptorium/widgets/widget.rb +133 -0
  205. data/lib/scriptorium.rb +38 -34
  206. data/lib/skeleton.rb +10 -1
  207. data/scriptorium.gemspec +17 -5
  208. data/test/README.md +69 -0
  209. data/test/WEB_INTEGRATION_README.md +196 -0
  210. data/test/all +83 -0
  211. data/test/api_demo.rb +99 -0
  212. data/test/assets/imagenotfound.jpg +0 -0
  213. data/test/assets/images/.DS_Store +0 -0
  214. data/test/assets/images/README.md +27 -0
  215. data/test/assets/images/odd_aspect.png +0 -0
  216. data/test/assets/images/perfect.png +0 -0
  217. data/test/assets/images/small.png +0 -0
  218. data/test/assets/images/tall.png +0 -0
  219. data/test/assets/images/very_tall.png +0 -0
  220. data/test/assets/images/very_wide.png +0 -0
  221. data/test/assets/images/wide.png +0 -0
  222. data/test/assets/testbanner.jpg +0 -0
  223. data/test/banner_svg/simple_helpers.rb +13 -0
  224. data/test/banner_svg/unit.rb +1000 -0
  225. data/test/config/deployment.txt +5 -0
  226. data/test/ed_test.rb +204 -0
  227. data/test/integration/cursor_banner_combinations.rb +193 -0
  228. data/test/integration/cursor_banner_features.rb +374 -0
  229. data/test/integration/integration_test.rb +326 -0
  230. data/test/integration/preview_flow_test.rb +94 -0
  231. data/test/livetext_plugin_test.rb +500 -0
  232. data/test/manual/asset_mgmt.rb +67 -0
  233. data/test/manual/banner-tests/index.html +45 -0
  234. data/test/manual/banner-tests/svg.txt +3 -0
  235. data/test/manual/banner-tests/test01.html +122 -0
  236. data/test/manual/banner-tests/test02.html +122 -0
  237. data/test/manual/banner-tests/test03.html +122 -0
  238. data/test/manual/banner-tests/test04.html +129 -0
  239. data/test/manual/banner-tests/test05.html +129 -0
  240. data/test/manual/banner-tests/test06.html +129 -0
  241. data/test/manual/banner-tests/test07.html +129 -0
  242. data/test/manual/banner-tests/test08.html +123 -0
  243. data/test/manual/banner-tests/test09.html +123 -0
  244. data/test/manual/banner-tests/test10.html +123 -0
  245. data/test/manual/banner-tests/test11.html +123 -0
  246. data/test/manual/banner-tests/test12.html +123 -0
  247. data/test/manual/banner-tests/test13.html +123 -0
  248. data/test/manual/banner-tests/test14.html +123 -0
  249. data/test/manual/banner-tests/test15.html +122 -0
  250. data/test/manual/banner-tests/test16.html +122 -0
  251. data/test/manual/banner-tests/test17.html +122 -0
  252. data/test/manual/banner-tests/test18.html +132 -0
  253. data/test/manual/banner-tests/test19.html +132 -0
  254. data/test/manual/banner-tests/test20.html +132 -0
  255. data/test/manual/banner-tests/test21.html +132 -0
  256. data/test/manual/banner-tests/test22.html +132 -0
  257. data/test/manual/banner-tests/test23.html +132 -0
  258. data/test/manual/banner-tests/test24.html +132 -0
  259. data/test/manual/banner-tests/test25.html +131 -0
  260. data/test/manual/banner_environment.rb +205 -0
  261. data/test/manual/codemirror_demo.html +773 -0
  262. data/test/manual/create_posts_for_web.rb +114 -0
  263. data/test/manual/environment.rb +67 -0
  264. data/test/manual/make_banner.rb +153 -0
  265. data/test/manual/preview_manual_test.rb +129 -0
  266. data/test/manual/sample_banner_config.txt +12 -0
  267. data/test/manual/test_advanced_widgets.rb +73 -0
  268. data/test/manual/test_banner_combinations.rb +120 -0
  269. data/test/manual/test_banner_features.rb +306 -0
  270. data/test/manual/test_banner_integration.rb +115 -0
  271. data/test/manual/test_banner_radial.rb +87 -0
  272. data/test/manual/test_basic_posts.rb +47 -0
  273. data/test/manual/test_layout_widgets.rb +40 -0
  274. data/test/manual/test_pagination.rb +24 -0
  275. data/test/manual/test_random_posts.rb +38 -0
  276. data/test/manual/test_syntax_highlighting.rb +167 -0
  277. data/test/rubytext/rubytext_comprehensive_test.rb +307 -0
  278. data/test/rubytext/rubytext_demo_test.rb +42 -0
  279. data/test/rubytext/rubytext_testing_guide.md +277 -0
  280. data/test/run_automated_tests.rb +45 -0
  281. data/test/staging/.DS_Store +0 -0
  282. data/test/support/preview_utils.rb +88 -0
  283. data/test/syntax_highlighting_test.lt3 +124 -0
  284. data/test/test_gem_assets.rb +48 -0
  285. data/test/test_helpers.rb +240 -0
  286. data/test/tui_editor_integration_test.rb +296 -0
  287. data/test/tui_integration_test.rb +883 -0
  288. data/test/unit/api.rb +1776 -0
  289. data/test/unit/asset_management.rb +219 -0
  290. data/test/unit/backup_test.rb +451 -0
  291. data/test/unit/clipboard_test.rb +60 -0
  292. data/test/unit/contract_test.rb +69 -0
  293. data/test/unit/core.rb +1211 -0
  294. data/test/unit/deploy_config_test.rb +248 -0
  295. data/test/unit/deploy_test.rb +478 -0
  296. data/test/unit/edit_post_test.rb +168 -0
  297. data/test/unit/gem_asset_management.rb +183 -0
  298. data/test/unit/livetext_basic.rb +57 -0
  299. data/test/unit/livetext_compatibility.rb +82 -0
  300. data/test/unit/parse_cmd_test.rb +260 -0
  301. data/test/unit/permalink_copy_test.rb +211 -0
  302. data/test/unit/post.rb +309 -0
  303. data/test/unit/post_index_config_test.rb +258 -0
  304. data/test/unit/post_state_helpers_test.rb +137 -0
  305. data/test/unit/read_commented_file_test.rb +278 -0
  306. data/test/unit/reddit_test.rb +235 -0
  307. data/test/unit/repo.rb +569 -0
  308. data/test/unit/social_test.rb +366 -0
  309. data/test/unit/syntax_highlighting.rb +70 -0
  310. data/test/unit/theme_management_test.rb +91 -0
  311. data/test/unit/view.rb +498 -0
  312. data/test/unit/widgets.rb +669 -0
  313. data/test/web_integration_test.rb +231 -0
  314. data/test/web_test_helper.rb +218 -0
  315. data/test/web_workflow_test.rb +527 -0
  316. data/test/wizard_test.rb +123 -0
  317. data/ui/README.md +67 -0
  318. data/ui/common/lib/ui_common.rb +8 -0
  319. data/ui/rubytext/README.md +191 -0
  320. data/ui/rubytext/bin/scriptorium-rubytext +402 -0
  321. data/ui/rubytext/lib/rubytext_ui.rb +300 -0
  322. data/ui/tui/bin/scriptorium +1890 -0
  323. data/ui/tui/test/tui_test.rb +23 -0
  324. data/ui/web/app/app.rb +2600 -0
  325. data/ui/web/app/assets/livetext_mode.js +244 -0
  326. data/ui/web/app/error_helpers.rb +150 -0
  327. data/ui/web/app/views/advanced_config.erb +196 -0
  328. data/ui/web/app/views/asset_management.erb +645 -0
  329. data/ui/web/app/views/backup_management.erb +238 -0
  330. data/ui/web/app/views/banner_config.erb +200 -0
  331. data/ui/web/app/views/config_widget.erb +232 -0
  332. data/ui/web/app/views/configure_view.erb +401 -0
  333. data/ui/web/app/views/dashboard.erb +154 -0
  334. data/ui/web/app/views/deploy_config.erb +149 -0
  335. data/ui/web/app/views/edit_pages.erb +363 -0
  336. data/ui/web/app/views/edit_post.erb +175 -0
  337. data/ui/web/app/views/edit_theme.erb +73 -0
  338. data/ui/web/app/views/edit_theme_file.erb +74 -0
  339. data/ui/web/app/views/error_page.erb +29 -0
  340. data/ui/web/app/views/header_config.erb +155 -0
  341. data/ui/web/app/views/layout_config.erb +147 -0
  342. data/ui/web/app/views/navbar_config.erb +411 -0
  343. data/ui/web/app/views/theme_management.erb +130 -0
  344. data/ui/web/app/views/view_dashboard.erb +779 -0
  345. data/ui/web/app/views/widgets.erb +249 -0
  346. data/ui/web/bin/scriptorium-web +164 -0
  347. data/ui/web/test/web_basic_test.rb +38 -0
  348. data/ui/web/test_navbar.txt +7 -0
  349. data/ui/web/tmp/timing.log +17 -0
  350. data/ui/web/tmp/web_server.log +0 -0
  351. metadata +434 -8
  352. data/lib/scriptorium/engine.rb +0 -22
  353. data/test/engine/unit.rb +0 -44
@@ -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,7 @@
1
+ num 0001
2
+ title Elixir Conf 2014
3
+ date 2014-07-29
4
+ pubdate 2014-07-29
5
+ views computing austin
6
+ tags
7
+ pinned
@@ -0,0 +1,37 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Elixir Conf 2014</title>
6
+ <meta name="generator" content="Scriptorium Import">
7
+ <meta property="og:title" content="Elixir Conf 2014">
8
+ <meta property="og:locale" content="en_US">
9
+ <meta property="og:type" content="article">
10
+ <meta property="article:published_time" content="2014-07-29">
11
+ </head>
12
+ <body>
13
+ <article>
14
+ <header>
15
+ <h1>Elixir Conf 2014</h1>
16
+ <time datetime="2014-07-29">July 29, 2014</time>
17
+ </header>
18
+
19
+ <div class="content">
20
+ <p>
21
+ Last week in Austin, I attended the world's first Elixir conference. It was very
22
+ energizing!
23
+ With only 105 people attending, the vibe was that of a Ruby conference 10 or more
24
+ years ago. Jose Valim, the language creator, was there; two Erlang heavyweights
25
+ were also in attendance -- Robert Virding and Francesco Cesarini.
26
+
27
+ <p>
28
+ There were many Rubyists there, of course, but I will only mention myself, Dave
29
+ Thomas, and Jim Freeze. The three of us were also at the first Ruby conference
30
+ in 2001.
31
+
32
+ <p>
33
+ This will be an exciting ride. I'll keep you informed.
34
+ </div>
35
+ </article>
36
+ </body>
37
+ </html>
@@ -0,0 +1,22 @@
1
+ .h1 Elixir Conf 2014
2
+
3
+ .set post.num = 0001
4
+ .set post.slug = elixir-conf-2014
5
+ .set post.date = 2014-07-29
6
+ .set post.title = Elixir Conf 2014
7
+ .set post.tags =
8
+ .set post.views = computing austin
9
+ .set post.published = yes
10
+ .set post.deployed = no
11
+
12
+ Last week in Austin, I attended the world's first Elixir conference. It was very
13
+ energizing!
14
+ With only 105 people attending, the vibe was that of a Ruby conference 10 or more
15
+ years ago. Jose Valim, the language creator, was there; two Erlang heavyweights
16
+ were also in attendance -- Robert Virding and Francesco Cesarini.
17
+
18
+ There were many Rubyists there, of course, but I will only mention myself, Dave
19
+ Thomas, and Jim Freeze. The three of us were also at the first Ruby conference
20
+ in 2001.
21
+
22
+ This will be an exciting ride. I'll keep you informed.
@@ -0,0 +1,7 @@
1
+ num 0002
2
+ title Programmers and word processing
3
+ date 2014-09-17
4
+ pubdate 2014-09-17
5
+ views computing writing
6
+ tags
7
+ pinned
@@ -0,0 +1,192 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Programmers and word processing</title>
6
+ <meta name="generator" content="Scriptorium Import">
7
+ <meta property="og:title" content="Programmers and word processing">
8
+ <meta property="og:locale" content="en_US">
9
+ <meta property="og:type" content="article">
10
+ <meta property="article:published_time" content="2014-09-17">
11
+ </head>
12
+ <body>
13
+ <article>
14
+ <header>
15
+ <h1>Programmers and word processing</h1>
16
+ <time datetime="2014-09-17">September 17, 2014</time>
17
+ </header>
18
+
19
+ <div class="content">
20
+ <p>
21
+ The other day, I was thinking about the mechanics of writing. Not grammar, spelling, and punctuation,
22
+ but the actual work flow involved.
23
+ Specifically, I was trying to gather my thoughts on why writing a software book using Microsoft Word
24
+ is so incredibly painful. (Granted, I have used Word or similar tools to write fiction and shorter pieces.)
25
+
26
+ <p>
27
+ It wouldn't seem so at first, would it? Isn't word processing software the savior of the writer? Wouldn't
28
+ we be using typewriters without it?
29
+
30
+ <p>
31
+ Well, yes and no. Several facts have to be considered here: 1. I'm a programmer (and a somewhat old-fashioned
32
+ one, who almost always goes straight to the command line). 2. When you write a programming book, there is
33
+ often a need to manipulate the text in various ways you otherwise wouldn't. This is even more true for a
34
+ "larger" document like a book of a few hundred pages. 3. Programmers by nature want the computer to do things
35
+ for them. It's natural to want to write code to manipulate your text.
36
+
37
+ <p>
38
+ the typewriter and the modern word processing suites. It's a forgotten generation of software -- forgotten
39
+ partly because computer guys were mostly the only ones who ever used it, and today even the younger software
40
+ professionals don't remember it.
41
+
42
+ <p>
43
+ I'm talking, of course, about what we commonly call a <i>text</i> formatter_. Many of you who read this will have
44
+ much more experience here than I do, but I'll share from my own limited knowledge and experience.
45
+
46
+ <p>
47
+ I'll assume some of my readers have no idea what I'm talking about. A text formatter is just a piece of software
48
+ that takes plain text (mixed with some metadata relating to formatting) and produces a formatted document. Think
49
+ of it as a little like HTML, but usually without nesting. Typically if a line of text started with a dot, it
50
+ would be interpreted as a formatting instruction rather than as raw text.
51
+
52
+ <p>
53
+ This was before there were laser printers (or at least I had never heard of them). Although I don't go back to
54
+ the early days of Unix utilities like troff and nroff, I did know about them and have touched them (in the early
55
+ to mid-1980s). I've even used a similar tool on an IBM mainframe (called Scripsit, as I recall). I'm certain
56
+ there were similar things on the DEC-10 and many other forgotten platforms. Even in the late 80s, when word
57
+ processing was coming into its own, many of the tools still were not fully "WYSIWYG."
58
+
59
+ <p>
60
+ Remember that term? "What You See Is What You Get"? It was coined because this was rather a new concept. With
61
+ text formatters, what you saw was <i>not</i> what you got.
62
+
63
+ <p>
64
+ Even back then, there were more sophisticated tools. TeX was around, though I didn't know it and never really
65
+ saw it. LaTeX I suppose came later. At that time, dot matrix printers were not uncommon -- and on the mainframes,
66
+ even line printers were still common (typically without even lowercase letters).
67
+
68
+ <p>
69
+ As for "really fancy" output such as TeX could produce, I don't know that our comp sci department <i>or</i> our
70
+ computer center could really print such material. If I used a printer that could print italics and boldface text,
71
+ I was ecstatic.
72
+
73
+ <p>
74
+ This is starting to sound like the stories about walking to school in the snow, right? And it was uphill both
75
+ ways? That's not my point. The hardware was primitive, yes, and the software was primitive, too.
76
+
77
+ <p>
78
+ When WYSIWYG came along, suddenly armies of "ordinary people" escaped their typewriters and learned the joys of
79
+ backspace and delete. Programmers benefited, too. And yet...
80
+
81
+ <p>
82
+ I won't even go into the disadvantages of the GUI in general. That could be a controversy in itself. Suffice to
83
+ say that I earned two degrees in computer science and hardly even <i>touched</i> a mouse. In fact, I don't think I
84
+ actually owned a mouse until four or five years later. I remember with fondness the online signature of one
85
+ Arno Schaefer: <b>(How</b> do I type) <font size=+1><tt>("for</tt></font> i in *.dvi do xdvi i done") <b>(in</b> a GUI?) But that is a little outside our
86
+ discussion here.
87
+
88
+ <p>
89
+ From a programmer's perspective, a primary failing of the word processor in general is that it stores documents
90
+ in a binary format rather than text. It is difficult or impossible to peer into those files from the outside.
91
+
92
+ <p>
93
+ That means that all of the traditional Unix utilities, so useful for text files, are useless for Word documents
94
+ and similar file types. Which utilities? That depends on how well you know Unix and how much time you have
95
+ spent at the command line.
96
+
97
+ <p>
98
+ The first utility, of course, is the text editor itself. If you want fancy formatting and WYSIWYG, the traditional
99
+ editors like vim and emacs won't seem that great to you. But if you want something "lean, mean, and easy" --
100
+ maybe these are pretty great after all. (Granted, nothing ever seems "cool" until you learn to use it effectively.)
101
+
102
+ <p>
103
+ Personally I use vim (although I freely admit that emacs is more powerful, just as I admit LISP is more powerful
104
+ than any of my favorite languages). It loads into memory very quickly, it loads files quickly, it saves them
105
+ quickly, and it never crashes. Navigation is fast and simple (again, if you know what you're doing). I've never
106
+ done real scripting in vim, but I have sometimes used macros and such.
107
+
108
+ <p>
109
+ But the editor is only the beginning. Some of the utilities I have used are: grep, wc, fold, cut, colrm,
110
+ diff, sdiff, csplit, expand, head, tail, less, more, cut, sort, split, strings, tee, tr, and uniq. Sometimes I have
111
+ even used awk, sed, and m4. I can combine files, split them, search them, and manipulate their contents at will.
112
+
113
+ <p>
114
+ I can redirect standard input, standard output, and standard error for these utilities. I can use pipes with them.
115
+ Many of these tools understand regular expressions. I can build scripts that perform multiple commands, even with
116
+ some simple branching and looping logic involved.
117
+
118
+ <p>
119
+ None of these things are possible in general with Word documents. None of these tools or techniques will work well
120
+ with such a file format.
121
+
122
+ <p>
123
+ But let's go a step farther... I'm a programmer, after all. I principally work in Ruby, which is good for text
124
+ processing (far more powerful and friendly than bash or awk, for instance).
125
+
126
+ <p>
127
+ I have written programs that could search and/or replace only in the body of the text, only in the source code,
128
+ or in both. I have written programs to extract code fragments from the text, to insert them, to syntax-check them,
129
+ and to format them. I've written programs to create test cases, to syntax-check code, and to reorder (and renumber)
130
+ sections and other items. I've written code that will honor the file format (and code fragments) and spell-check
131
+ the document, naturally honoring all the technical terms and abbreviations unique to my topic. I've written code
132
+ to extract a table of contents, lists of figures, and lists of code listings. I've written code to compare the
133
+ sizes of different sections, code to check cross-references, and code to suggest keywords for the index.
134
+
135
+ <p>
136
+ Is all this overkill? You could argue that. Some of these things are doable in MS Word, after all. But you have to
137
+ do everything <i>their_</i> way; you can't tweak or customize the functions; and you can't turn off all the features you
138
+ don't need or want. Furthermore, you can't automate it, you have to use the mouse, and sometimes it just crashes or
139
+ malfunctions for a reason you may or may not figure out.
140
+
141
+ <p>
142
+ There are many solutions, of course. If you know TeX, that is probably the ultimate tool; and there are add-ons
143
+ such as LaTeX and Lyx to make it easier. I've never learned any of this; for most of my purposes, it would be a
144
+ case of killing a mosquito with a hand grenade. On the other hand... if I were writing a calculus textbook, as I
145
+ never will, I would want something like that to handle all the mathematical notation.
146
+
147
+ <p>
148
+ As a side note, I've never used Lyx. But I've heard it is a nice compromise between the two paradigms -- a WYSIWYG
149
+ editor that also offers low-level access to the raw markup.
150
+
151
+ <p>
152
+ What's interesting is that people often "roll their own" solutions. I have done it myself (although I principally
153
+ worked with plain HTML), and I have seen it done by others more than once. It's natural, as programmers are always
154
+ looking for an easier or better way to do things.
155
+
156
+ <p>
157
+ Once in a while, a programmer will build a solution that is also intended to benefit others who think the same way.
158
+ An excellent example is the relatively new <i>Softcover_,</i> created by Michael Hartl (https://www.softcover.io/).
159
+ I've only begun to learn it myself, but my initial impression is that what troff was in the 70s, softcover will be
160
+ in only a year or two. It looks to me like a powerful text formatter for the 21st century -- a tool that will let
161
+ the author/programmer do what he wants without getting too much in the way.
162
+
163
+ <p>
164
+ Softcover was designed (in my opinion) the "right way" -- that is, it was first built for a specific purpose, and
165
+ during that process, ideas were generated, and lessons were learned. This enables the developer to avoid false moves,
166
+ design flaws, and "dead ends." Remember that, in the same way, Ruby on Rails was first an application (Basecamp, as
167
+ I recall) before it was abstracted and generalized into a framework.
168
+
169
+ <p>
170
+ Softcover does other things right as well. It isn't just a tool or framework, but also a publishing platform for
171
+ ebooks. There is at least one print book published this way as well, and I expect more.
172
+
173
+ <p>
174
+ When programmers write, the readers are often programmers as well. And we are certainly (on the whole) heavy
175
+ consumers of electronic reading material. Only one American in four uses any kind of ebook reader; but do you know
176
+ of even a single software person who doesn't use one?
177
+
178
+ <p>
179
+ So it's a tool, and it's a publishing platform. The business model permits the author to keep a high percentage of
180
+ the sale price of the book. All this assumes, of course, that the author is actually capable of producing quality
181
+ material without the help of the host of individuals at a traditional publishing house. But I've noticed that this
182
+ often can be done, especially if the author seeks a little outside help now and then.
183
+
184
+ <p>
185
+ So I see Softcover as a tool, a platform, and community that connects writers to readers (and to each other). You
186
+ might consider checking it out.
187
+
188
+ <p>
189
+ </div>
190
+ </article>
191
+ </body>
192
+ </html>