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.
- checksums.yaml +4 -4
- data/README.lt3 +324 -0
- data/README.md +3155 -1
- data/assets/.DS_Store +0 -0
- data/assets/README.md +44 -0
- data/assets/back-icon.png +0 -0
- data/assets/icons/facebook.svg +1 -0
- data/assets/icons/github.svg +1 -0
- data/assets/icons/instagram.svg +1 -0
- data/assets/icons/reddit.svg +1 -0
- data/assets/icons/ui/.DS_Store +0 -0
- data/assets/icons/ui/back.png +0 -0
- data/assets/icons/ui/copy.png +0 -0
- data/assets/icons/ui/down.png +0 -0
- data/assets/icons/ui/end.png +0 -0
- data/assets/icons/ui/exit.png +0 -0
- data/assets/icons/ui/foo +10 -0
- data/assets/icons/ui/home.png +0 -0
- data/assets/icons/ui/left.png +0 -0
- data/assets/icons/ui/next.png +0 -0
- data/assets/icons/ui/right.png +0 -0
- data/assets/icons/ui/start.png +0 -0
- data/assets/icons/ui/up.png +0 -0
- data/assets/icons/x.svg +1 -0
- data/assets/icons/youtube.svg +1 -0
- data/assets/samples/placeholder.svg +9 -0
- data/assets/themes/standard/favicon.svg +6 -0
- data/bin/scriptorium +1511 -0
- data/doc/README.txt +6 -0
- data/doc/anti-amnesia/20250727-054000-scriptorium-overview.md +95 -0
- data/doc/anti-amnesia/20250727-060000-api-design-tui-planning.md +34 -0
- data/doc/anti-amnesia/20250727-061000-runeblog-tui-analysis.md +50 -0
- data/doc/anti-amnesia/20250727-123000-anti-amnesia-conventions.md +31 -0
- data/doc/anti-amnesia/20250727-154000-livetext-plugin-file-stats.md +73 -0
- data/doc/anti-amnesia/20250727-172600-cursor-rbenv-ruby-version-mystery.md +64 -0
- data/doc/anti-amnesia/20250727-172600-unified-minitest-framework.md +70 -0
- data/doc/anti-amnesia/20250727-172900-ai-cognitive-assessment-capabilities.md +40 -0
- data/doc/anti-amnesia/20250727-173000-widget-testing-achievement.md +110 -0
- data/doc/anti-amnesia/20250727-180000-post-id-num-refactoring.md +73 -0
- data/doc/anti-amnesia/20250728-124243-aaa-syntax-clarification.md +46 -0
- data/doc/anti-amnesia/20250728-124421-conversation-summary-concise.md +124 -0
- data/doc/anti-amnesia/20250729-190000-scriptorium-tui-testing-complete.md +46 -0
- data/doc/anti-amnesia/20250729-200000-scriptorium-tui-testing-edit-file-workflow.md +97 -0
- data/doc/anti-amnesia/20250729-210000-reddit-autopost-integration-complete.md +158 -0
- data/doc/anti-amnesia/20250729-211500-dependency-management-system.md +211 -0
- data/doc/anti-amnesia/20250729-213000-python-virtual-environment-setup.md +141 -0
- data/doc/anti-amnesia/20250729-214500-theme-management-commands.md +211 -0
- data/doc/anti-amnesia/20250729-215000-version-update-to-0.6.0.md +134 -0
- data/doc/anti-amnesia/20250729-220000-user-guide-complete.md +41 -0
- data/doc/anti-amnesia/20250804-190500-cognitive-loop-bug.md +45 -0
- data/doc/anti-amnesia/20250804-190700-anti-amnesia-timestamping-fix.md +30 -0
- data/doc/anti-amnesia/20250804-213700-publishing-test-fix.md +49 -0
- data/doc/anti-amnesia/20250804-214400-additional-test-fixes.md +46 -0
- data/doc/anti-amnesia/20250804-220000-asset-function-logic-clarification.md +41 -0
- data/doc/anti-amnesia/20250806-202032-asset-function-logic-clarification.md +41 -0
- data/doc/anti-amnesia/20250807-213025.md +116 -0
- data/doc/anti-amnesia/20250813-082428-syntax-highlighting-and-navigation-improvements.md +256 -0
- data/doc/banner_svg_config.md +114 -0
- data/doc/contrib.lt3 +8 -0
- data/doc/dependencies.md +281 -0
- data/doc/hacker.lt3 +5 -0
- data/doc/reddit_credentials_template.json +8 -0
- data/doc/reddit_integration.md +207 -0
- data/doc/user.lt3 +38 -0
- data/doc/user_guide_section_1.md +137 -0
- data/doc/user_guide_section_10.md +515 -0
- data/doc/user_guide_section_11.md +708 -0
- data/doc/user_guide_section_2.md +233 -0
- data/doc/user_guide_section_3.md +5 -0
- data/doc/user_guide_section_4.md +221 -0
- data/doc/user_guide_section_5.md +243 -0
- data/doc/user_guide_section_6.md +147 -0
- data/doc/user_guide_section_7.md +311 -0
- data/doc/user_guide_section_8.md +224 -0
- data/doc/user_guide_section_9.md +375 -0
- data/doc/userdoc-toc.txt +88 -0
- data/lib/rouge/lexers/livetext.rb +74 -0
- data/lib/scriptorium/api.rb +640 -0
- data/lib/scriptorium/banner_svg.rb +742 -0
- data/lib/scriptorium/contract.rb +33 -0
- data/lib/scriptorium/exceptions.rb +174 -0
- data/lib/scriptorium/helpers.rb +475 -0
- data/lib/scriptorium/post.rb +195 -0
- data/lib/scriptorium/reddit.rb +83 -0
- data/lib/scriptorium/repo.rb +624 -0
- data/lib/scriptorium/standard_files.rb +515 -0
- data/lib/scriptorium/syntax_highlighter.rb +234 -0
- data/lib/scriptorium/theme.rb +179 -0
- data/lib/scriptorium/version.rb +2 -2
- data/lib/scriptorium/view.rb +976 -0
- data/lib/scriptorium/widgets/featured_posts.rb +149 -0
- data/lib/scriptorium/widgets/links.rb +112 -0
- data/lib/scriptorium/widgets/pages.rb +133 -0
- data/lib/scriptorium/widgets/widget.rb +133 -0
- data/lib/scriptorium.rb +22 -9
- data/lib/skeleton.rb +11 -2
- data/scriptorium.gemspec +15 -4
- data/test/README.md +69 -0
- data/test/all +43 -0
- data/test/api_demo.rb +99 -0
- data/test/assets/imagenotfound.jpg +0 -0
- data/test/assets/images/.DS_Store +0 -0
- data/test/assets/images/README.md +27 -0
- data/test/assets/images/odd_aspect.png +0 -0
- data/test/assets/images/perfect.png +0 -0
- data/test/assets/images/small.png +0 -0
- data/test/assets/images/tall.png +0 -0
- data/test/assets/images/very_tall.png +0 -0
- data/test/assets/images/very_wide.png +0 -0
- data/test/assets/images/wide.png +0 -0
- data/test/assets/testbanner.jpg +0 -0
- data/test/banner_svg/simple_helpers.rb +13 -0
- data/test/banner_svg/unit.rb +768 -0
- data/test/ed_test.rb +204 -0
- data/test/integration/cursor_banner_combinations.rb +193 -0
- data/test/integration/cursor_banner_features.rb +374 -0
- data/test/integration/integration_test.rb +326 -0
- data/test/livetext_plugin_test.rb +229 -0
- data/test/manual/asset_mgmt.rb +67 -0
- data/test/manual/banner-tests/config.txt +3 -0
- data/test/manual/banner-tests/index.html +45 -0
- data/test/manual/banner-tests/test01.html +58 -0
- data/test/manual/banner-tests/test02.html +58 -0
- data/test/manual/banner-tests/test03.html +58 -0
- data/test/manual/banner-tests/test04.html +65 -0
- data/test/manual/banner-tests/test05.html +65 -0
- data/test/manual/banner-tests/test06.html +65 -0
- data/test/manual/banner-tests/test07.html +65 -0
- data/test/manual/banner-tests/test08.html +59 -0
- data/test/manual/banner-tests/test09.html +59 -0
- data/test/manual/banner-tests/test10.html +59 -0
- data/test/manual/banner-tests/test11.html +59 -0
- data/test/manual/banner-tests/test12.html +59 -0
- data/test/manual/banner-tests/test13.html +59 -0
- data/test/manual/banner-tests/test14.html +59 -0
- data/test/manual/banner-tests/test15.html +58 -0
- data/test/manual/banner-tests/test16.html +58 -0
- data/test/manual/banner-tests/test17.html +58 -0
- data/test/manual/banner-tests/test18.html +68 -0
- data/test/manual/banner-tests/test19.html +68 -0
- data/test/manual/banner-tests/test20.html +68 -0
- data/test/manual/banner-tests/test21.html +68 -0
- data/test/manual/banner-tests/test22.html +68 -0
- data/test/manual/banner-tests/test23.html +68 -0
- data/test/manual/banner-tests/test24.html +68 -0
- data/test/manual/banner-tests/test25.html +67 -0
- data/test/manual/banner_environment.rb +192 -0
- data/test/manual/deploy_symlink_demo.rb +142 -0
- data/test/manual/environment.rb +67 -0
- data/test/manual/make_banner.rb +153 -0
- data/test/manual/sample_banner_config.txt +12 -0
- data/test/manual/symlink_demo.rb +117 -0
- data/test/manual/test1.rb +47 -0
- data/test/manual/test2.rb +12 -0
- data/test/manual/test3.rb +38 -0
- data/test/manual/test4.rb +40 -0
- data/test/manual/test5.rb +24 -0
- data/test/manual/test6.rb +73 -0
- data/test/manual/test_banner_combinations.rb +120 -0
- data/test/manual/test_banner_features.rb +306 -0
- data/test/manual/test_banner_from_file.rb +150 -0
- data/test/manual/test_banner_in_header.rb +35 -0
- data/test/manual/test_code_highlighting.rb +68 -0
- data/test/manual/test_complex_header.rb +74 -0
- data/test/manual/test_empty_header.rb +32 -0
- data/test/manual/test_radial_custom.rb +58 -0
- data/test/manual/test_radial_large_radius.rb +52 -0
- data/test/manual/test_svg_debug.rb +47 -0
- data/test/manual/test_syntax_highlighting.rb +147 -0
- data/test/pages-demo/config/currentview.txt +1 -0
- data/test/pages-demo/views/demo/config/bootstrap_css.txt +5 -0
- data/test/pages-demo/views/demo/config/bootstrap_js.txt +4 -0
- data/test/pages-demo/views/demo/config/common.js +57 -0
- data/test/pages-demo/views/demo/config/footer.txt +1 -0
- data/test/pages-demo/views/demo/config/global-head.txt +8 -0
- data/test/pages-demo/views/demo/config/header.txt +1 -0
- data/test/pages-demo/views/demo/config/layout.txt +1 -0
- data/test/pages-demo/views/demo/config/left.txt +1 -0
- data/test/pages-demo/views/demo/config/main.txt +1 -0
- data/test/pages-demo/views/demo/config/right.txt +1 -0
- data/test/pages-demo/views/demo/config.txt +3 -0
- data/test/pages-demo/views/demo/output/panes/footer.html +1 -0
- data/test/pages-demo/views/demo/output/panes/header.html +1 -0
- data/test/pages-demo/views/demo/output/panes/left.html +1 -0
- data/test/pages-demo/views/demo/output/panes/main.html +1 -0
- data/test/pages-demo/views/demo/output/panes/right.html +1 -0
- data/test/rubytext/rubytext_comprehensive_test.rb +307 -0
- data/test/rubytext/rubytext_demo_test.rb +42 -0
- data/test/rubytext/rubytext_testing_guide.md +277 -0
- data/test/run_automated_tests.rb +45 -0
- data/test/scriptorium-TEST-1754622690-146/config/bootstrap_css.txt +5 -0
- data/test/scriptorium-TEST-1754622690-146/config/bootstrap_js.txt +4 -0
- data/test/scriptorium-TEST-1754622690-146/config/common.js +57 -0
- data/test/scriptorium-TEST-1754622690-146/config/currentview.txt +1 -0
- data/test/scriptorium-TEST-1754622690-146/config/global-head.txt +9 -0
- data/test/scriptorium-TEST-1754622690-146/config/last_post_num.txt +1 -0
- data/test/scriptorium-TEST-1754622690-146/config/os_helpers.rb +4 -0
- data/test/scriptorium-TEST-1754622690-146/config/widgets.txt +3 -0
- data/test/scriptorium-TEST-1754622690-146/posts/0001/meta.txt +8 -0
- data/test/scriptorium-TEST-1754622690-146/posts/0001/source.lt3 +6 -0
- data/test/scriptorium-TEST-1754622690-146/themes/standard/README.txt +1 -0
- data/test/scriptorium-TEST-1754622690-146/themes/standard/config.txt +1 -0
- data/test/scriptorium-TEST-1754622690-146/themes/standard/initial/post.lt3 +12 -0
- data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/footer.txt +2 -0
- data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/header.txt +4 -0
- data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/left.txt +3 -0
- data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/main.txt +5 -0
- data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/config/right.txt +3 -0
- data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/gen/text.css +1 -0
- data/test/scriptorium-TEST-1754622690-146/themes/standard/layout/layout.txt +5 -0
- data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/index.lt3 +1 -0
- data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/index_entry.lt3 +14 -0
- data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/post.lt3 +13 -0
- data/test/scriptorium-TEST-1754622690-146/themes/standard/templates/widget.lt3 +1 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/bootstrap_css.txt +5 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/bootstrap_js.txt +4 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/common.js +57 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/deploy.txt +5 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/footer.txt +2 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/global-head.txt +9 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/header.txt +4 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/layout.txt +5 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/left.txt +3 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/main.txt +5 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/reddit.txt +10 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/right.txt +3 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/social.txt +7 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/config/status.txt +7 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/config.txt +3 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/layout/footer.html +3 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/layout/header.html +3 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/layout/left.html +3 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/layout/main.html +3 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/layout/right.html +3 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/footer.html +1 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/header.html +1 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/left.html +1 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/main.html +1 -0
- data/test/scriptorium-TEST-1754622690-146/views/sample/output/panes/right.html +1 -0
- data/test/staging/.DS_Store +0 -0
- data/test/syntax_highlighting_test.lt3 +124 -0
- data/test/test_helpers.rb +230 -0
- data/test/tui_editor_integration_test.rb +296 -0
- data/test/tui_integration_test.rb +637 -0
- data/test/unit/api.rb +1056 -0
- data/test/unit/asset_management.rb +245 -0
- data/test/unit/clipboard_test.rb +60 -0
- data/test/unit/contract_test.rb +91 -0
- data/test/unit/core.rb +857 -0
- data/test/unit/deploy_test.rb +187 -0
- data/test/unit/gem_asset_management.rb +189 -0
- data/test/unit/livetext_basic.rb +69 -0
- data/test/unit/livetext_compatibility.rb +89 -0
- data/test/unit/post.rb +244 -0
- data/test/unit/read_commented_file_test.rb +276 -0
- data/test/unit/reddit_test.rb +235 -0
- data/test/unit/repo.rb +548 -0
- data/test/unit/social_test.rb +369 -0
- data/test/unit/symlink_test.rb +213 -0
- data/test/unit/view.rb +431 -0
- data/test/unit/widgets.rb +669 -0
- data/test/wizard_test.rb +123 -0
- data/ui/README.md +67 -0
- data/ui/common/lib/ui_common.rb +8 -0
- data/ui/rubytext/README.md +191 -0
- data/ui/rubytext/bin/scriptorium-rubytext +402 -0
- data/ui/rubytext/lib/rubytext_ui.rb +300 -0
- data/ui/tui/bin/scriptorium +1420 -0
- data/ui/tui/test/tui_test.rb +23 -0
- data/ui/web/app/app.rb +1378 -0
- data/ui/web/app/error_helpers.rb +150 -0
- data/ui/web/app/views/advanced_config.erb +190 -0
- data/ui/web/app/views/asset_management.erb +589 -0
- data/ui/web/app/views/banner_config.erb +200 -0
- data/ui/web/app/views/configure_view.erb +401 -0
- data/ui/web/app/views/dashboard.erb +162 -0
- data/ui/web/app/views/deploy_config.erb +146 -0
- data/ui/web/app/views/edit_pages.erb +195 -0
- data/ui/web/app/views/edit_post.erb +54 -0
- data/ui/web/app/views/error_page.erb +29 -0
- data/ui/web/app/views/header_config.erb +155 -0
- data/ui/web/app/views/layout_config.erb +147 -0
- data/ui/web/app/views/navbar_config.erb +411 -0
- data/ui/web/app/views/view_dashboard.erb +138 -0
- data/ui/web/bin/scriptorium-web +153 -0
- data/ui/web/test/web_basic_test.rb +38 -0
- data/ui/web/test_navbar.txt +7 -0
- data/ui/web/tmp/web_server.log +5 -0
- data/ui/web/tmp/web_server.pid +1 -0
- metadata +360 -5
@@ -0,0 +1,150 @@
|
|
1
|
+
module ErrorHelpers
|
2
|
+
# Error message mapping for common errors
|
3
|
+
ERROR_MESSAGES = {
|
4
|
+
'CannotReadFileNotFound' => {
|
5
|
+
message: 'File not found',
|
6
|
+
suggestion: 'The file may have been moved or deleted. Try refreshing the page or recreating the content.'
|
7
|
+
},
|
8
|
+
'CannotCreatePostRepoNil' => {
|
9
|
+
message: 'Repository not initialized',
|
10
|
+
suggestion: 'Please create or open a repository first.'
|
11
|
+
},
|
12
|
+
'CannotCreatePostNumNil' => {
|
13
|
+
message: 'Invalid post ID',
|
14
|
+
suggestion: 'Please provide a valid post number.'
|
15
|
+
},
|
16
|
+
'CannotCreatePostNumEmpty' => {
|
17
|
+
message: 'Post ID is empty',
|
18
|
+
suggestion: 'Please provide a valid post number.'
|
19
|
+
},
|
20
|
+
'CannotCreatePostNumInvalid' => {
|
21
|
+
message: 'Invalid post ID format',
|
22
|
+
suggestion: 'Post ID must be a number.'
|
23
|
+
},
|
24
|
+
'CannotGetPostIdNil' => {
|
25
|
+
message: 'Post ID not provided',
|
26
|
+
suggestion: 'Please specify a post ID.'
|
27
|
+
},
|
28
|
+
'CannotGetPostIdEmpty' => {
|
29
|
+
message: 'Post ID is empty',
|
30
|
+
suggestion: 'Please provide a valid post ID.'
|
31
|
+
},
|
32
|
+
'CannotGetPostIdInvalid' => {
|
33
|
+
message: 'Invalid post ID format',
|
34
|
+
suggestion: 'Post ID must be a number.'
|
35
|
+
},
|
36
|
+
'CannotEditFilePathNil' => {
|
37
|
+
message: 'File path not specified',
|
38
|
+
suggestion: 'Please provide a valid file path.'
|
39
|
+
},
|
40
|
+
'CannotEditFilePathEmpty' => {
|
41
|
+
message: 'File path is empty',
|
42
|
+
suggestion: 'Please provide a valid file path.'
|
43
|
+
},
|
44
|
+
'RepoDirAlreadyExists' => {
|
45
|
+
message: 'Repository already exists',
|
46
|
+
suggestion: 'The repository directory already exists. You can open it instead.'
|
47
|
+
},
|
48
|
+
'CannotLookupViewTargetNil' => {
|
49
|
+
message: 'View not specified',
|
50
|
+
suggestion: 'Please provide a valid view name.'
|
51
|
+
},
|
52
|
+
'CannotCreateViewNameNil' => {
|
53
|
+
message: 'View name not provided',
|
54
|
+
suggestion: 'Please provide a view name.'
|
55
|
+
},
|
56
|
+
'CannotCreateViewNameEmpty' => {
|
57
|
+
message: 'View name is empty',
|
58
|
+
suggestion: 'Please provide a view name.'
|
59
|
+
},
|
60
|
+
'CannotCreateViewTitleNil' => {
|
61
|
+
message: 'View title not provided',
|
62
|
+
suggestion: 'Please provide a view title.'
|
63
|
+
},
|
64
|
+
'CannotCreateViewTitleEmpty' => {
|
65
|
+
message: 'View title is empty',
|
66
|
+
suggestion: 'Please provide a view title.'
|
67
|
+
},
|
68
|
+
'CannotCreateViewNameInvalid' => {
|
69
|
+
message: 'Invalid view name',
|
70
|
+
suggestion: 'View names can only contain letters, numbers, hyphens (-), and underscores (_).'
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
# Get a user-friendly error message
|
75
|
+
def friendly_error_message(error)
|
76
|
+
error_class = error.class.name
|
77
|
+
error_message = error.message
|
78
|
+
|
79
|
+
if ERROR_MESSAGES[error_class]
|
80
|
+
{
|
81
|
+
message: ERROR_MESSAGES[error_class][:message],
|
82
|
+
suggestion: ERROR_MESSAGES[error_class][:suggestion],
|
83
|
+
details: error_message
|
84
|
+
}
|
85
|
+
else
|
86
|
+
{
|
87
|
+
message: 'An unexpected error occurred',
|
88
|
+
suggestion: 'Please try again or contact support if the problem persists.',
|
89
|
+
details: error_message
|
90
|
+
}
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
# Validate required parameters
|
95
|
+
def validate_required_params(params, *required_keys)
|
96
|
+
missing = required_keys.select { |key| params[key].nil? || params[key].to_s.strip.empty? }
|
97
|
+
|
98
|
+
if missing.any?
|
99
|
+
raise ArgumentError.new("Missing required parameters: #{missing.join(', ')}")
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
# Validate post ID
|
104
|
+
def validate_post_id(post_id)
|
105
|
+
return false if post_id.nil?
|
106
|
+
return false unless post_id.to_s.match?(/^\d+$/)
|
107
|
+
return false if post_id.to_i <= 0
|
108
|
+
true
|
109
|
+
end
|
110
|
+
|
111
|
+
# Validate view name
|
112
|
+
def validate_view_name(name)
|
113
|
+
return false if name.nil?
|
114
|
+
return false if name.to_s.strip.empty?
|
115
|
+
return false unless name.to_s.match?(/^[a-zA-Z0-9_-]+$/)
|
116
|
+
true
|
117
|
+
end
|
118
|
+
|
119
|
+
# Safe file operations
|
120
|
+
def safe_read_file(path, default_content = "")
|
121
|
+
return default_content unless File.exist?(path)
|
122
|
+
File.read(path)
|
123
|
+
rescue => e
|
124
|
+
puts "Error reading file #{path}: #{e.message}" if $DEBUG
|
125
|
+
default_content
|
126
|
+
end
|
127
|
+
|
128
|
+
def safe_write_file(path, content)
|
129
|
+
FileUtils.mkdir_p(File.dirname(path))
|
130
|
+
File.write(path, content)
|
131
|
+
true
|
132
|
+
rescue => e
|
133
|
+
puts "Error writing file #{path}: #{e.message}" if $DEBUG
|
134
|
+
false
|
135
|
+
end
|
136
|
+
|
137
|
+
# Format error for display
|
138
|
+
def format_error_display(error_info)
|
139
|
+
html = "<div class='error-details'>"
|
140
|
+
html += "<strong>#{error_info[:message]}</strong><br>"
|
141
|
+
html += "<em>#{error_info[:suggestion]}</em>"
|
142
|
+
|
143
|
+
if error_info[:details] && error_info[:details] != error_info[:message]
|
144
|
+
html += "<br><small>Technical details: #{error_info[:details]}</small>"
|
145
|
+
end
|
146
|
+
|
147
|
+
html += "</div>"
|
148
|
+
html
|
149
|
+
end
|
150
|
+
end
|
@@ -0,0 +1,190 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>Advanced Configuration - <%= @current_view.name %> - Scriptorium</title>
|
5
|
+
<style>
|
6
|
+
body {
|
7
|
+
font-family: Arial, sans-serif;
|
8
|
+
margin: 0;
|
9
|
+
padding: 20px;
|
10
|
+
background-color: #f5f5f5;
|
11
|
+
}
|
12
|
+
.container {
|
13
|
+
max-width: 800px;
|
14
|
+
margin: 0 auto;
|
15
|
+
background: white;
|
16
|
+
border-radius: 8px;
|
17
|
+
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
|
18
|
+
overflow: hidden;
|
19
|
+
}
|
20
|
+
.header {
|
21
|
+
background: #007bff;
|
22
|
+
color: white;
|
23
|
+
padding: 20px;
|
24
|
+
text-align: center;
|
25
|
+
}
|
26
|
+
.header h1 {
|
27
|
+
margin: 0;
|
28
|
+
font-size: 24px;
|
29
|
+
}
|
30
|
+
.header p {
|
31
|
+
display: none;
|
32
|
+
}
|
33
|
+
.content {
|
34
|
+
padding: 30px;
|
35
|
+
}
|
36
|
+
.config-table {
|
37
|
+
width: 100%;
|
38
|
+
border-collapse: collapse;
|
39
|
+
}
|
40
|
+
.config-table td {
|
41
|
+
padding: 8px 0;
|
42
|
+
vertical-align: middle;
|
43
|
+
}
|
44
|
+
.config-table td:first-child {
|
45
|
+
width: 20px;
|
46
|
+
padding-right: 15px;
|
47
|
+
}
|
48
|
+
.config-table td:nth-child(2) {
|
49
|
+
width: 120px;
|
50
|
+
padding-right: 15px;
|
51
|
+
}
|
52
|
+
.config-table td:last-child {
|
53
|
+
padding-left: 0;
|
54
|
+
}
|
55
|
+
.config-item p {
|
56
|
+
margin: 0;
|
57
|
+
color: #666;
|
58
|
+
font-size: 14px;
|
59
|
+
line-height: 1.4;
|
60
|
+
flex: 1;
|
61
|
+
min-width: 0;
|
62
|
+
}
|
63
|
+
.btn {
|
64
|
+
display: inline-block;
|
65
|
+
padding: 8px 16px;
|
66
|
+
background: #007bff;
|
67
|
+
color: white;
|
68
|
+
text-decoration: none;
|
69
|
+
border-radius: 4px;
|
70
|
+
font-size: 14px;
|
71
|
+
transition: background 0.2s;
|
72
|
+
white-space: nowrap;
|
73
|
+
min-width: 120px;
|
74
|
+
text-align: center;
|
75
|
+
}
|
76
|
+
.btn {
|
77
|
+
display: inline-block;
|
78
|
+
padding: 8px 16px;
|
79
|
+
background: #007bff;
|
80
|
+
color: white;
|
81
|
+
text-decoration: none;
|
82
|
+
border-radius: 4px;
|
83
|
+
font-size: 14px;
|
84
|
+
transition: background 0.2s;
|
85
|
+
}
|
86
|
+
.btn:hover {
|
87
|
+
background: #0056b3;
|
88
|
+
}
|
89
|
+
.btn-secondary {
|
90
|
+
background: #6c757d;
|
91
|
+
}
|
92
|
+
.btn-secondary:hover {
|
93
|
+
background: #545b62;
|
94
|
+
}
|
95
|
+
.back-link {
|
96
|
+
margin-top: 20px;
|
97
|
+
text-align: center;
|
98
|
+
}
|
99
|
+
.status-indicator {
|
100
|
+
display: inline-block;
|
101
|
+
width: 8px;
|
102
|
+
height: 8px;
|
103
|
+
border-radius: 50%;
|
104
|
+
margin-right: 8px;
|
105
|
+
}
|
106
|
+
.status-active {
|
107
|
+
background: #28a745;
|
108
|
+
}
|
109
|
+
.status-inactive {
|
110
|
+
background: #dc3545;
|
111
|
+
}
|
112
|
+
</style>
|
113
|
+
</head>
|
114
|
+
<body>
|
115
|
+
<div class="container">
|
116
|
+
<div class="header">
|
117
|
+
<h1>Advanced Configuration</h1>
|
118
|
+
<p>Configure all aspects of <%= @current_view.name %></p>
|
119
|
+
</div>
|
120
|
+
|
121
|
+
<div class="content">
|
122
|
+
<table class="config-table">
|
123
|
+
<tr>
|
124
|
+
<td><span class="status-indicator status-active"></span></td>
|
125
|
+
<td><a href="#" class="btn">Update Main Settings</a></td>
|
126
|
+
<td>Configure basic view settings, title, subtitle, and other core properties.</td>
|
127
|
+
</tr>
|
128
|
+
|
129
|
+
<tr>
|
130
|
+
<td><span class="status-indicator status-active"></span></td>
|
131
|
+
<td><a href="/layout_config" class="btn">Edit Layout</a></td>
|
132
|
+
<td>Configure the overall page layout and structure.</td>
|
133
|
+
</tr>
|
134
|
+
|
135
|
+
<tr>
|
136
|
+
<td><span class="status-indicator <%= @configs[:header] ? 'status-active' : 'status-inactive' %>"></span></td>
|
137
|
+
<td><a href="/header_config" class="btn">Update Header</a></td>
|
138
|
+
<td>Set up the header structure and content for this view.</td>
|
139
|
+
</tr>
|
140
|
+
|
141
|
+
<% if @configs[:header] %>
|
142
|
+
<tr>
|
143
|
+
<td><span class="status-indicator <%= @configs[:banner] ? 'status-active' : 'status-inactive' %>"></span></td>
|
144
|
+
<td><a href="/banner_config" class="btn">Update Banner</a></td>
|
145
|
+
<td>Customize the SVG banner with colors, fonts, and layout options.</td>
|
146
|
+
</tr>
|
147
|
+
|
148
|
+
<tr>
|
149
|
+
<td><span class="status-indicator <%= @configs[:navbar] ? 'status-active' : 'status-inactive' %>"></span></td>
|
150
|
+
<td><a href="/navbar_config" class="btn">Update Navbar</a></td>
|
151
|
+
<td>Build the navigation menu structure with pages and sections.</td>
|
152
|
+
</tr>
|
153
|
+
<% end %>
|
154
|
+
|
155
|
+
<% if @layout_containers.include?('left') %>
|
156
|
+
<tr>
|
157
|
+
<td><span class="status-indicator status-active"></span></td>
|
158
|
+
<td><a href="#" class="btn">Update Left</a></td>
|
159
|
+
<td>Configure the left sidebar content and layout.</td>
|
160
|
+
</tr>
|
161
|
+
<% end %>
|
162
|
+
|
163
|
+
<% if @layout_containers.include?('right') %>
|
164
|
+
<tr>
|
165
|
+
<td><span class="status-indicator status-active"></span></td>
|
166
|
+
<td><a href="#" class="btn">Update Right</a></td>
|
167
|
+
<td>Configure the right sidebar content and layout.</td>
|
168
|
+
</tr>
|
169
|
+
<% end %>
|
170
|
+
|
171
|
+
<tr>
|
172
|
+
<td><span class="status-indicator status-active"></span></td>
|
173
|
+
<td><a href="/edit_pages" class="btn">Edit Pages</a></td>
|
174
|
+
<td>Create and edit content pages for this view.</td>
|
175
|
+
</tr>
|
176
|
+
|
177
|
+
<tr>
|
178
|
+
<td><span class="status-indicator status-active"></span></td>
|
179
|
+
<td><a href="/deploy_config" class="btn">Configure Deployment</a></td>
|
180
|
+
<td>Set up server deployment settings for this view.</td>
|
181
|
+
</tr>
|
182
|
+
</table>
|
183
|
+
|
184
|
+
<div class="back-link">
|
185
|
+
<a href="/view/<%= @current_view.name %>" class="btn btn-secondary">Back to Dashboard</a>
|
186
|
+
</div>
|
187
|
+
</div>
|
188
|
+
</div>
|
189
|
+
</body>
|
190
|
+
</html>
|