webgen 0.5.17 → 1.0.0.beta1
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.
- data/API.rdoc +143 -0
- data/AUTHORS +0 -1
- data/COPYING +17 -8
- data/ChangeLog +4456 -0
- data/GPL +623 -289
- data/README.md +71 -0
- data/Rakefile +87 -99
- data/VERSION +1 -1
- data/bin/webgen +1 -7
- data/data/webgen/basic_website_template/ext/init.rb +15 -0
- data/data/webgen/basic_website_template/webgen.config +18 -0
- data/data/webgen/bundle_template_files/README.md.erb +24 -0
- data/data/webgen/bundle_template_files/Rakefile.erb +36 -0
- data/data/webgen/bundle_template_files/info.yaml.erb +16 -0
- data/data/webgen/bundle_template_files/init.rb.erb +1 -0
- data/data/webgen/passive_sources/default.metainfo +32 -0
- data/data/webgen/passive_sources/stylesheets/coderay-default.css +109 -118
- data/data/webgen/passive_sources/templates/feed.template +62 -0
- data/data/webgen/passive_sources/templates/sitemap.template +3 -6
- data/data/webgen/passive_sources/templates/tag.template +42 -0
- data/data/webgen/website_bundles/default/README +2 -2
- data/lib/webgen/blackboard.rb +15 -51
- data/lib/webgen/bundle/built-in-show-changes/init.rb +54 -0
- data/lib/webgen/bundle/built-in/init.rb +366 -0
- data/lib/webgen/bundle_loader.rb +126 -0
- data/lib/webgen/cache.rb +9 -18
- data/lib/webgen/cli.rb +131 -58
- data/lib/webgen/cli/bundle_command.rb +30 -0
- data/lib/webgen/cli/create_bundle_command.rb +46 -0
- data/lib/webgen/cli/create_command.rb +48 -60
- data/lib/webgen/cli/generate_command.rb +25 -0
- data/lib/webgen/cli/install_bundle_command.rb +34 -0
- data/lib/webgen/cli/list_bundle_command.rb +108 -0
- data/lib/webgen/cli/logger.rb +45 -0
- data/lib/webgen/cli/show_command.rb +30 -0
- data/lib/webgen/cli/show_config_command.rb +63 -0
- data/lib/webgen/cli/show_dependencies_command.rb +103 -0
- data/lib/webgen/cli/show_extensions_command.rb +74 -0
- data/lib/webgen/cli/utils.rb +68 -95
- data/lib/webgen/configuration.rb +143 -105
- data/lib/webgen/content_processor.rb +160 -0
- data/lib/webgen/content_processor/blocks.rb +96 -0
- data/lib/webgen/content_processor/builder.rb +25 -0
- data/lib/webgen/content_processor/erb.rb +25 -0
- data/lib/webgen/content_processor/erubis.rb +31 -0
- data/lib/webgen/content_processor/fragments.rb +82 -0
- data/lib/webgen/content_processor/haml.rb +25 -0
- data/lib/webgen/content_processor/html_head.rb +157 -0
- data/lib/webgen/content_processor/kramdown.rb +49 -0
- data/lib/webgen/content_processor/maruku.rb +39 -0
- data/lib/webgen/content_processor/r_discount.rb +21 -0
- data/lib/webgen/content_processor/rdoc.rb +22 -0
- data/lib/webgen/content_processor/redcloth.rb +23 -0
- data/lib/webgen/content_processor/ruby.rb +20 -0
- data/lib/webgen/content_processor/sass.rb +145 -0
- data/lib/webgen/content_processor/scss.rb +23 -0
- data/lib/webgen/content_processor/tags.rb +30 -0
- data/lib/webgen/content_processor/tidy.rb +32 -0
- data/lib/webgen/content_processor/tikz.rb +116 -0
- data/lib/webgen/content_processor/xmllint.rb +31 -0
- data/lib/webgen/context.rb +57 -29
- data/lib/webgen/context/html_head.rb +60 -0
- data/lib/webgen/context/nodes.rb +32 -27
- data/lib/webgen/context/rendering.rb +39 -0
- data/lib/webgen/context/webgen_tags.rb +25 -0
- data/lib/webgen/core_ext.rb +25 -0
- data/lib/webgen/destination.rb +151 -0
- data/lib/webgen/destination/file_system.rb +62 -0
- data/lib/webgen/error.rb +59 -49
- data/lib/webgen/extension_manager.rb +121 -0
- data/lib/webgen/item_tracker.rb +237 -0
- data/lib/webgen/item_tracker/file.rb +39 -0
- data/lib/webgen/item_tracker/missing_node.rb +61 -0
- data/lib/webgen/item_tracker/node_content.rb +40 -0
- data/lib/webgen/item_tracker/node_meta_info.rb +53 -0
- data/lib/webgen/item_tracker/nodes.rb +92 -0
- data/lib/webgen/logger.rb +26 -82
- data/lib/webgen/node.rb +122 -367
- data/lib/webgen/node_finder.rb +336 -0
- data/lib/webgen/page.rb +48 -85
- data/lib/webgen/path.rb +218 -156
- data/lib/webgen/path_handler.rb +400 -0
- data/lib/webgen/path_handler/base.rb +220 -0
- data/lib/webgen/path_handler/copy.rb +78 -0
- data/lib/webgen/path_handler/directory.rb +21 -0
- data/lib/webgen/path_handler/feed.rb +82 -0
- data/lib/webgen/path_handler/meta_info.rb +84 -0
- data/lib/webgen/path_handler/page.rb +38 -0
- data/lib/webgen/path_handler/page_utils.rb +79 -0
- data/lib/webgen/path_handler/sitemap.rb +52 -0
- data/lib/webgen/path_handler/template.rb +96 -0
- data/lib/webgen/path_handler/virtual.rb +85 -0
- data/lib/webgen/{webgentask.rb → rake_task.rb} +31 -27
- data/lib/webgen/source.rb +106 -24
- data/lib/webgen/source/file_system.rb +41 -0
- data/lib/webgen/source/stacked.rb +49 -53
- data/lib/webgen/source/tar_archive.rb +59 -0
- data/lib/webgen/tag.rb +250 -19
- data/lib/webgen/tag/breadcrumb_trail.rb +65 -0
- data/lib/webgen/tag/coderay.rb +32 -35
- data/lib/webgen/tag/date.rb +9 -9
- data/lib/webgen/tag/execute_command.rb +31 -0
- data/lib/webgen/tag/include_file.rb +32 -0
- data/lib/webgen/tag/langbar.rb +31 -47
- data/lib/webgen/tag/link.rb +17 -18
- data/lib/webgen/tag/menu.rb +27 -189
- data/lib/webgen/tag/meta_info.rb +31 -0
- data/lib/webgen/tag/relocatable.rb +48 -39
- data/lib/webgen/tag/tikz.rb +24 -100
- data/lib/webgen/task.rb +99 -0
- data/lib/webgen/task/create_bundle.rb +73 -0
- data/lib/webgen/task/create_website.rb +94 -0
- data/lib/webgen/task/generate_website.rb +47 -0
- data/lib/webgen/test_helper.rb +183 -0
- data/lib/webgen/tree.rb +95 -46
- data/lib/webgen/utils.rb +39 -0
- data/lib/webgen/utils/external_command.rb +27 -0
- data/lib/webgen/utils/tag_parser.rb +124 -0
- data/lib/webgen/version.rb +1 -1
- data/lib/webgen/website.rb +134 -296
- data/setup.rb +1 -1
- data/test/test_documentation.rb +43 -0
- data/test/webgen/cli/test_logger.rb +41 -0
- data/test/{test_contentprocessor_blocks.rb → webgen/content_processor/test_blocks.rb} +30 -28
- data/test/webgen/content_processor/test_builder.rb +25 -0
- data/test/webgen/content_processor/test_erb.rb +21 -0
- data/test/webgen/content_processor/test_erubis.rb +33 -0
- data/test/webgen/content_processor/test_fragments.rb +96 -0
- data/test/webgen/content_processor/test_haml.rb +24 -0
- data/test/webgen/content_processor/test_html_head.rb +78 -0
- data/test/webgen/content_processor/test_kramdown.rb +49 -0
- data/test/webgen/content_processor/test_maruku.rb +30 -0
- data/test/webgen/content_processor/test_r_discount.rb +18 -0
- data/test/webgen/content_processor/test_rdoc.rb +18 -0
- data/test/webgen/content_processor/test_redcloth.rb +23 -0
- data/test/webgen/content_processor/test_ruby.rb +24 -0
- data/test/webgen/content_processor/test_sass.rb +44 -0
- data/test/webgen/content_processor/test_scss.rb +23 -0
- data/test/webgen/content_processor/test_tags.rb +44 -0
- data/test/webgen/content_processor/test_tidy.rb +31 -0
- data/test/webgen/content_processor/test_tikz.rb +33 -0
- data/test/webgen/content_processor/test_xmllint.rb +32 -0
- data/test/webgen/destination/test_file_system.rb +54 -0
- data/test/webgen/item_tracker/test_file.rb +31 -0
- data/test/webgen/item_tracker/test_missing_node.rb +70 -0
- data/test/webgen/item_tracker/test_node_content.rb +42 -0
- data/test/webgen/item_tracker/test_node_meta_info.rb +44 -0
- data/test/webgen/item_tracker/test_nodes.rb +61 -0
- data/test/webgen/path_handler/test_base.rb +153 -0
- data/test/webgen/path_handler/test_copy.rb +56 -0
- data/test/webgen/path_handler/test_feed.rb +85 -0
- data/test/webgen/path_handler/test_meta_info.rb +98 -0
- data/test/webgen/path_handler/test_page.rb +25 -0
- data/test/webgen/path_handler/test_page_utils.rb +59 -0
- data/test/webgen/path_handler/test_sitemap.rb +95 -0
- data/test/webgen/path_handler/test_template.rb +64 -0
- data/test/webgen/path_handler/test_virtual.rb +87 -0
- data/test/webgen/source/test_file_system.rb +51 -0
- data/test/webgen/source/test_stacked.rb +35 -0
- data/test/{test_source_tararchive.rb → webgen/source/test_tar_archive.rb} +10 -25
- data/test/webgen/tag/test_breadcrumb_trail.rb +66 -0
- data/test/webgen/tag/test_coderay.rb +34 -0
- data/test/webgen/tag/test_date.rb +18 -0
- data/test/webgen/tag/test_execute_command.rb +36 -0
- data/test/webgen/tag/test_include_file.rb +35 -0
- data/test/webgen/tag/test_langbar.rb +50 -0
- data/test/webgen/tag/test_link.rb +40 -0
- data/test/webgen/tag/test_menu.rb +61 -0
- data/test/webgen/tag/test_meta_info.rb +25 -0
- data/test/webgen/tag/test_relocatable.rb +50 -0
- data/test/webgen/tag/test_tikz.rb +41 -0
- data/test/webgen/task/test_create_website.rb +46 -0
- data/test/webgen/test_blackboard.rb +31 -0
- data/test/webgen/test_bundle_loader.rb +55 -0
- data/test/{test_cache.rb → webgen/test_cache.rb} +3 -15
- data/test/webgen/test_cli.rb +41 -0
- data/test/webgen/test_configuration.rb +131 -0
- data/test/webgen/test_content_processor.rb +86 -0
- data/test/webgen/test_context.rb +73 -0
- data/test/webgen/test_core_ext.rb +20 -0
- data/test/webgen/test_destination.rb +48 -0
- data/test/webgen/test_error.rb +121 -0
- data/test/webgen/test_extension_manager.rb +70 -0
- data/test/webgen/test_item_tracker.rb +106 -0
- data/test/{test_languages.rb → webgen/test_languages.rb} +4 -4
- data/test/webgen/test_logger.rb +46 -0
- data/test/webgen/test_node.rb +178 -0
- data/test/webgen/test_node_finder.rb +127 -0
- data/test/{test_page.rb → webgen/test_page.rb} +44 -48
- data/test/webgen/test_path.rb +271 -0
- data/test/{test_webgentask.rb → webgen/test_rake_task.rb} +4 -4
- data/test/webgen/test_source.rb +59 -0
- data/test/webgen/test_tag.rb +137 -0
- data/test/webgen/test_task.rb +40 -0
- data/test/webgen/test_tree.rb +147 -0
- data/test/webgen/test_utils.rb +16 -0
- data/test/webgen/test_website.rb +45 -0
- data/test/webgen/utils/test_tag_parser.rb +99 -0
- metadata +292 -344
- data/data/webgen/passive_sources/templates/atom_feed.template +0 -39
- data/data/webgen/passive_sources/templates/rss_feed.template +0 -28
- data/data/webgen/resources.yaml +0 -4
- data/data/webgen/webgui/app.rb +0 -11
- data/data/webgen/webgui/controller/main.rb +0 -135
- data/data/webgen/webgui/layout/default.xhtml +0 -40
- data/data/webgen/webgui/overrides/win32console.rb +0 -0
- data/data/webgen/webgui/public/css/jquery.autocomplete.css +0 -50
- data/data/webgen/webgui/public/css/ramaze_error.css +0 -90
- data/data/webgen/webgui/public/css/style.css +0 -55
- data/data/webgen/webgui/public/img/headerbg.jpg +0 -0
- data/data/webgen/webgui/public/img/webgen_logo.png +0 -0
- data/data/webgen/webgui/public/js/jquery.autocomplete.js +0 -15
- data/data/webgen/webgui/public/js/jquery.js +0 -32
- data/data/webgen/webgui/start.rb +0 -9
- data/data/webgen/webgui/view/create_website.xhtml +0 -14
- data/data/webgen/webgui/view/error.xhtml +0 -64
- data/data/webgen/webgui/view/index.xhtml +0 -22
- data/data/webgen/webgui/view/manage_website.xhtml +0 -18
- data/data/webgen/website_skeleton/README +0 -10
- data/data/webgen/website_skeleton/Rakefile +0 -69
- data/data/webgen/website_skeleton/config.yaml +0 -35
- data/data/webgen/website_skeleton/ext/init.rb +0 -10
- data/doc/contentprocessor.template +0 -11
- data/doc/contentprocessor/blocks.page +0 -129
- data/doc/contentprocessor/builder.page +0 -79
- data/doc/contentprocessor/erb.page +0 -60
- data/doc/contentprocessor/erubis.page +0 -46
- data/doc/contentprocessor/fragments.page +0 -26
- data/doc/contentprocessor/haml.page +0 -46
- data/doc/contentprocessor/head.page +0 -31
- data/doc/contentprocessor/kramdown.page +0 -49
- data/doc/contentprocessor/less.page +0 -34
- data/doc/contentprocessor/maruku.page +0 -44
- data/doc/contentprocessor/rdiscount.page +0 -37
- data/doc/contentprocessor/rdoc.page +0 -36
- data/doc/contentprocessor/redcloth.page +0 -41
- data/doc/contentprocessor/sass.page +0 -31
- data/doc/contentprocessor/scss.page +0 -39
- data/doc/contentprocessor/tags.page +0 -73
- data/doc/contentprocessor/tidy.page +0 -14
- data/doc/contentprocessor/xmllint.page +0 -14
- data/doc/extensions.metainfo +0 -29
- data/doc/extensions.page +0 -15
- data/doc/extensions.template +0 -17
- data/doc/faq.page +0 -222
- data/doc/getting_started.page +0 -135
- data/doc/index.page +0 -71
- data/doc/manual.page +0 -727
- data/doc/reference_configuration.page +0 -1254
- data/doc/reference_metainfo.page +0 -265
- data/doc/reference_website_styles.page +0 -32
- data/doc/source/filesystem.page +0 -41
- data/doc/source/tararchive.page +0 -40
- data/doc/sourcehandler.template +0 -23
- data/doc/sourcehandler/copy.page +0 -19
- data/doc/sourcehandler/directory.page +0 -27
- data/doc/sourcehandler/feed.page +0 -102
- data/doc/sourcehandler/metainfo.page +0 -48
- data/doc/sourcehandler/page.page +0 -14
- data/doc/sourcehandler/sitemap.page +0 -46
- data/doc/sourcehandler/template.page +0 -45
- data/doc/sourcehandler/virtual.page +0 -49
- data/doc/tag.template +0 -25
- data/doc/tag/breadcrumbtrail.page +0 -40
- data/doc/tag/coderay.page +0 -53
- data/doc/tag/date.page +0 -31
- data/doc/tag/executecommand.page +0 -26
- data/doc/tag/includefile.page +0 -32
- data/doc/tag/langbar.page +0 -47
- data/doc/tag/link.page +0 -44
- data/doc/tag/menu.page +0 -109
- data/doc/tag/metainfo.page +0 -29
- data/doc/tag/relocatable.page +0 -38
- data/doc/tag/sitemap.page +0 -31
- data/doc/tag/tikz.page +0 -159
- data/doc/upgrading.page +0 -138
- data/doc/webgen_page_format.page +0 -129
- data/doc/website_styles.metainfo +0 -8
- data/lib/webgen/cli/apply_command.rb +0 -66
- data/lib/webgen/cli/run_command.rb +0 -22
- data/lib/webgen/cli/webgui_command.rb +0 -68
- data/lib/webgen/common.rb +0 -27
- data/lib/webgen/common/sitemap.rb +0 -83
- data/lib/webgen/contentprocessor.rb +0 -117
- data/lib/webgen/contentprocessor/blocks.rb +0 -92
- data/lib/webgen/contentprocessor/builder.rb +0 -29
- data/lib/webgen/contentprocessor/erb.rb +0 -26
- data/lib/webgen/contentprocessor/erubis.rb +0 -39
- data/lib/webgen/contentprocessor/fragments.rb +0 -25
- data/lib/webgen/contentprocessor/haml.rb +0 -34
- data/lib/webgen/contentprocessor/head.rb +0 -128
- data/lib/webgen/contentprocessor/kramdown.rb +0 -27
- data/lib/webgen/contentprocessor/kramdown/html.rb +0 -36
- data/lib/webgen/contentprocessor/less.rb +0 -35
- data/lib/webgen/contentprocessor/maruku.rb +0 -36
- data/lib/webgen/contentprocessor/rdiscount.rb +0 -19
- data/lib/webgen/contentprocessor/rdoc.rb +0 -20
- data/lib/webgen/contentprocessor/redcloth.rb +0 -21
- data/lib/webgen/contentprocessor/sass.rb +0 -22
- data/lib/webgen/contentprocessor/scss.rb +0 -22
- data/lib/webgen/contentprocessor/tags.rb +0 -170
- data/lib/webgen/contentprocessor/tidy.rb +0 -38
- data/lib/webgen/contentprocessor/xmllint.rb +0 -37
- data/lib/webgen/context/render.rb +0 -32
- data/lib/webgen/context/tags.rb +0 -20
- data/lib/webgen/coreext.rb +0 -13
- data/lib/webgen/default_config.rb +0 -240
- data/lib/webgen/loggable.rb +0 -25
- data/lib/webgen/output.rb +0 -86
- data/lib/webgen/output/filesystem.rb +0 -69
- data/lib/webgen/source/filesystem.rb +0 -61
- data/lib/webgen/source/resource.rb +0 -45
- data/lib/webgen/source/tararchive.rb +0 -78
- data/lib/webgen/sourcehandler.rb +0 -275
- data/lib/webgen/sourcehandler/base.rb +0 -281
- data/lib/webgen/sourcehandler/copy.rb +0 -44
- data/lib/webgen/sourcehandler/directory.rb +0 -30
- data/lib/webgen/sourcehandler/feed.rb +0 -92
- data/lib/webgen/sourcehandler/fragment.rb +0 -70
- data/lib/webgen/sourcehandler/memory.rb +0 -42
- data/lib/webgen/sourcehandler/metainfo.rb +0 -128
- data/lib/webgen/sourcehandler/page.rb +0 -64
- data/lib/webgen/sourcehandler/sitemap.rb +0 -60
- data/lib/webgen/sourcehandler/template.rb +0 -66
- data/lib/webgen/sourcehandler/virtual.rb +0 -117
- data/lib/webgen/tag/base.rb +0 -170
- data/lib/webgen/tag/breadcrumbtrail.rb +0 -70
- data/lib/webgen/tag/executecommand.rb +0 -31
- data/lib/webgen/tag/includefile.rb +0 -42
- data/lib/webgen/tag/metainfo.rb +0 -27
- data/lib/webgen/tag/sitemap.rb +0 -41
- data/lib/webgen/websiteaccess.rb +0 -31
- data/lib/webgen/websitemanager.rb +0 -125
- data/misc/default.css +0 -403
- data/misc/default.template +0 -76
- data/misc/htmldoc.metainfo +0 -26
- data/misc/htmldoc.virtual +0 -17
- data/misc/images/arrow.gif +0 -0
- data/misc/images/error.png +0 -0
- data/misc/images/headerbg.jpg +0 -0
- data/misc/images/important.png +0 -0
- data/misc/images/information.png +0 -0
- data/misc/images/quote.gif +0 -0
- data/misc/images/warning.png +0 -0
- data/misc/logo.svg +0 -313
- data/misc/style.page +0 -33
- data/test/helper.rb +0 -61
- data/test/test_blackboard.rb +0 -60
- data/test/test_cli.rb +0 -119
- data/test/test_common_sitemap.rb +0 -58
- data/test/test_configuration.rb +0 -68
- data/test/test_contentprocessor.rb +0 -39
- data/test/test_contentprocessor_builder.rb +0 -41
- data/test/test_contentprocessor_erb.rb +0 -33
- data/test/test_contentprocessor_erubis.rb +0 -62
- data/test/test_contentprocessor_fragments.rb +0 -43
- data/test/test_contentprocessor_haml.rb +0 -39
- data/test/test_contentprocessor_head.rb +0 -96
- data/test/test_contentprocessor_kramdown.rb +0 -56
- data/test/test_contentprocessor_less.rb +0 -40
- data/test/test_contentprocessor_maruku.rb +0 -33
- data/test/test_contentprocessor_rdiscount.rb +0 -21
- data/test/test_contentprocessor_rdoc.rb +0 -22
- data/test/test_contentprocessor_redcloth.rb +0 -26
- data/test/test_contentprocessor_sass.rb +0 -28
- data/test/test_contentprocessor_scss.rb +0 -28
- data/test/test_contentprocessor_tags.rb +0 -122
- data/test/test_contentprocessor_tidy.rb +0 -34
- data/test/test_contentprocessor_xmllint.rb +0 -38
- data/test/test_context.rb +0 -81
- data/test/test_error.rb +0 -93
- data/test/test_loggable.rb +0 -32
- data/test/test_logger.rb +0 -94
- data/test/test_node.rb +0 -469
- data/test/test_output_filesystem.rb +0 -60
- data/test/test_path.rb +0 -241
- data/test/test_source_filesystem.rb +0 -76
- data/test/test_source_resource.rb +0 -28
- data/test/test_source_stacked.rb +0 -49
- data/test/test_sourcehandler_base.rb +0 -136
- data/test/test_sourcehandler_copy.rb +0 -47
- data/test/test_sourcehandler_directory.rb +0 -38
- data/test/test_sourcehandler_feed.rb +0 -88
- data/test/test_sourcehandler_fragment.rb +0 -70
- data/test/test_sourcehandler_main.rb +0 -39
- data/test/test_sourcehandler_memory.rb +0 -44
- data/test/test_sourcehandler_metainfo.rb +0 -127
- data/test/test_sourcehandler_page.rb +0 -73
- data/test/test_sourcehandler_sitemap.rb +0 -68
- data/test/test_sourcehandler_template.rb +0 -68
- data/test/test_sourcehandler_virtual.rb +0 -106
- data/test/test_tag_base.rb +0 -62
- data/test/test_tag_breadcrumbtrail.rb +0 -91
- data/test/test_tag_coderay.rb +0 -45
- data/test/test_tag_date.rb +0 -18
- data/test/test_tag_executecommand.rb +0 -41
- data/test/test_tag_includefile.rb +0 -50
- data/test/test_tag_langbar.rb +0 -71
- data/test/test_tag_link.rb +0 -70
- data/test/test_tag_menu.rb +0 -207
- data/test/test_tag_metainfo.rb +0 -26
- data/test/test_tag_relocatable.rb +0 -60
- data/test/test_tag_sitemap.rb +0 -47
- data/test/test_tag_tikz.rb +0 -69
- data/test/test_tree.rb +0 -70
- data/test/test_website.rb +0 -130
- data/test/test_websiteaccess.rb +0 -25
- data/test/test_websitemanager.rb +0 -65
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'webgen/error'
|
|
4
|
+
require 'systemu'
|
|
5
|
+
|
|
6
|
+
module Webgen
|
|
7
|
+
module Utils
|
|
8
|
+
|
|
9
|
+
# This module provides methods for easily working with external commands.
|
|
10
|
+
module ExternalCommand
|
|
11
|
+
|
|
12
|
+
# Raise an error if the given command is not available.
|
|
13
|
+
#
|
|
14
|
+
# This just checks if the exit status is zero.
|
|
15
|
+
def self.ensure_available!(cmd, *args)
|
|
16
|
+
status = systemu([cmd, *args], 'stdout' => '')
|
|
17
|
+
raise Webgen::CommandNotFoundError.new(cmd) if status.exitstatus != 0
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'yaml'
|
|
4
|
+
require 'strscan'
|
|
5
|
+
require 'webgen/error'
|
|
6
|
+
|
|
7
|
+
module Webgen
|
|
8
|
+
module Utils
|
|
9
|
+
|
|
10
|
+
# This class is used to parse a string for webgen tags and replace them with dynamically
|
|
11
|
+
# generated content. See #replace_tags for more information.
|
|
12
|
+
class TagParser
|
|
13
|
+
|
|
14
|
+
# Raised by the Webgen::Utils::TagParser class.
|
|
15
|
+
class Error < Webgen::Error
|
|
16
|
+
|
|
17
|
+
attr_accessor :line
|
|
18
|
+
attr_accessor :column
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
# Create a new TagParser object, optionally providing a tag prefix.
|
|
24
|
+
def initialize(prefix = nil)
|
|
25
|
+
@start_re = /(\\*)\{#{prefix}(\w+)(::?)/
|
|
26
|
+
@end_re = /(\\*)\{#{prefix}(\w+)\}/
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
BRACKETS_RE = /([{}])/ # :nodoc:
|
|
30
|
+
ProcessingStruct = Struct.new(:state, :tag, :simple_tag, :backslashes, :brackets, :start_pos, :end_pos,
|
|
31
|
+
:params_start_pos, :params_end_pos, :body_end_pos) # :nodoc:
|
|
32
|
+
|
|
33
|
+
# Return the +content+ with all webgen tags replaced.
|
|
34
|
+
#
|
|
35
|
+
# When a webgen tag is encountered by the parser, the method yields all found information and
|
|
36
|
+
# substitutes the returned string for the tag.
|
|
37
|
+
def replace_tags(content) #:yields: tag_name, params, body
|
|
38
|
+
scanner = StringScanner.new(content)
|
|
39
|
+
data = ProcessingStruct.new(:before_tag)
|
|
40
|
+
while true
|
|
41
|
+
case data.state
|
|
42
|
+
when :before_tag
|
|
43
|
+
if scanner.skip_until(@start_re)
|
|
44
|
+
data.state = :in_start_tag
|
|
45
|
+
data.backslashes = scanner[1].length
|
|
46
|
+
data.brackets = 1
|
|
47
|
+
data.tag = scanner[2]
|
|
48
|
+
data.simple_tag = (scanner[3] == ':')
|
|
49
|
+
data.params_start_pos = scanner.pos
|
|
50
|
+
data.start_pos = scanner.pos - scanner.matched.length
|
|
51
|
+
else
|
|
52
|
+
data.state = :done
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
when :in_start_tag
|
|
56
|
+
data.brackets += (scanner[1] == '{' ? 1 : -1) while data.brackets != 0 && scanner.skip_until(BRACKETS_RE)
|
|
57
|
+
if data.brackets != 0
|
|
58
|
+
raise Error.new("Unbalanced curly brackets found for tag '#{data.tag}'")
|
|
59
|
+
else
|
|
60
|
+
data.params_end_pos = data.body_end_pos = data.end_pos = scanner.pos - 1
|
|
61
|
+
data.state = (data.simple_tag ? :process : :in_body)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
when :process
|
|
65
|
+
begin
|
|
66
|
+
enc = scanner.string.encoding
|
|
67
|
+
scanner.string.force_encoding('ASCII-8BIT')
|
|
68
|
+
if data.backslashes % 2 == 0
|
|
69
|
+
params = parse_params(scanner.string[data.params_start_pos...data.params_end_pos].force_encoding(enc),
|
|
70
|
+
data.tag)
|
|
71
|
+
result = yield(data.tag, params,
|
|
72
|
+
scanner.string[(data.params_end_pos+1)...data.body_end_pos].to_s.force_encoding(enc))
|
|
73
|
+
result = result.to_s.force_encoding('ASCII-8BIT')
|
|
74
|
+
scanner.string[data.start_pos..data.end_pos] = "\\" * (data.backslashes / 2) + result
|
|
75
|
+
scanner.pos = data.start_pos + result.length
|
|
76
|
+
else
|
|
77
|
+
scanner.string[data.start_pos, 1 + data.backslashes / 2] = ''
|
|
78
|
+
scanner.pos -= 1 + data.backslashes / 2
|
|
79
|
+
end
|
|
80
|
+
ensure
|
|
81
|
+
scanner.string.force_encoding(enc)
|
|
82
|
+
end
|
|
83
|
+
data.state = :before_tag
|
|
84
|
+
|
|
85
|
+
when :in_body
|
|
86
|
+
while (result = scanner.skip_until(@end_re))
|
|
87
|
+
next unless scanner[2] == data.tag
|
|
88
|
+
if scanner[1].length % 2 == 1
|
|
89
|
+
scanner.string[(scanner.pos - scanner.matched.length), 1 + scanner[1].length / 2] = ''
|
|
90
|
+
scanner.pos -= 1 + scanner[1].length / 2
|
|
91
|
+
else
|
|
92
|
+
break
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
if result
|
|
96
|
+
data.state = :process
|
|
97
|
+
data.end_pos = scanner.pos - 1
|
|
98
|
+
data.body_end_pos = scanner.pos - scanner.matched.length + scanner[1].length / 2
|
|
99
|
+
else
|
|
100
|
+
raise Error.new("Invalid body part - no end tag found for '#{data.tag}'")
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
when :done
|
|
104
|
+
break
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
scanner.string
|
|
108
|
+
rescue Error => e
|
|
109
|
+
e.line = scanner.string[0...data.start_pos].scan("\n").size + 1
|
|
110
|
+
e.column = data.start_pos - (scanner.string.rindex("\n", data.start_pos) || -1)
|
|
111
|
+
raise
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Parse the parameter string and return the result.
|
|
115
|
+
def parse_params(param_string, tag)
|
|
116
|
+
YAML::load("--- #{param_string}")
|
|
117
|
+
rescue ArgumentError, SyntaxError => e
|
|
118
|
+
raise Error.new("Could not parse parameter string '#{param_string}' for tag '#{tag}': #{e.message}")
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
end
|
|
124
|
+
end
|
data/lib/webgen/version.rb
CHANGED
data/lib/webgen/website.rb
CHANGED
|
@@ -1,35 +1,20 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
2
|
|
|
3
|
-
##
|
|
4
|
-
# Welcome to the API documentation of wegen!
|
|
5
|
-
#
|
|
6
|
-
# Have a look at the base <a href=Webgen.html>webgen module</a> which provides a good starting point!
|
|
7
|
-
|
|
8
|
-
|
|
9
3
|
# Standard lib requires
|
|
10
|
-
require '
|
|
11
|
-
require 'set'
|
|
4
|
+
require 'stringio'
|
|
12
5
|
require 'fileutils'
|
|
6
|
+
require 'ostruct'
|
|
13
7
|
|
|
14
8
|
# Requirements for Website
|
|
15
|
-
require 'webgen/
|
|
16
|
-
require 'webgen/
|
|
17
|
-
require 'webgen/logger'
|
|
9
|
+
require 'webgen/core_ext'
|
|
10
|
+
require 'webgen/utils'
|
|
18
11
|
require 'webgen/configuration'
|
|
19
|
-
require 'webgen/websiteaccess'
|
|
20
12
|
require 'webgen/blackboard'
|
|
21
13
|
require 'webgen/cache'
|
|
22
|
-
require 'webgen/tree'
|
|
23
14
|
require 'webgen/error'
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
require 'webgen/
|
|
27
|
-
require 'webgen/context'
|
|
28
|
-
require 'webgen/source'
|
|
29
|
-
require 'webgen/output'
|
|
30
|
-
require 'webgen/sourcehandler'
|
|
31
|
-
require 'webgen/contentprocessor'
|
|
32
|
-
require 'webgen/tag'
|
|
15
|
+
require 'webgen/tree'
|
|
16
|
+
require 'webgen/bundle_loader'
|
|
17
|
+
require 'webgen/logger'
|
|
33
18
|
|
|
34
19
|
# Load other needed files
|
|
35
20
|
require 'webgen/path'
|
|
@@ -38,337 +23,190 @@ require 'webgen/page'
|
|
|
38
23
|
require 'webgen/version'
|
|
39
24
|
|
|
40
25
|
|
|
41
|
-
# The Webgen namespace houses all classes/modules used by webgen.
|
|
42
|
-
#
|
|
43
|
-
# = webgen
|
|
44
|
-
#
|
|
45
|
-
# webgen is a command line application for generating a web site from templates and content
|
|
46
|
-
# files. Despite this fact, the implementation also provides adequate support for using webgen as a
|
|
47
|
-
# library and *full* *support* for extending it.
|
|
48
|
-
#
|
|
49
|
-
# == Extending webgen
|
|
50
|
-
#
|
|
51
|
-
# webgen can be extended very easily. Any file called <tt>init.rb</tt> put into the <tt>ext/</tt>
|
|
52
|
-
# directory of the website or into one of its sub-directories is automatically loaded on
|
|
53
|
-
# Website#init.
|
|
54
|
-
#
|
|
55
|
-
# You can extend webgen in several ways. However, no magic or special knowledge is needed since
|
|
56
|
-
# webgen relies on the power of Ruby itself. So, for example, an extension is just a normal Ruby
|
|
57
|
-
# class. Most extension types provide a Base module for mixing into an extension which provides
|
|
58
|
-
# default implementations for needed methods.
|
|
59
|
-
#
|
|
60
|
-
# Following are links to detailed descriptions on how to develop specific types of extensions:
|
|
61
|
-
#
|
|
62
|
-
# [Webgen::Source] Information on how to implement a class that provides source paths for
|
|
63
|
-
# webgen. For example, one could implement a source class that uses a database as
|
|
64
|
-
# backend.
|
|
65
|
-
#
|
|
66
|
-
# [Webgen::Output] Information on how to implement a class that writes content to an output
|
|
67
|
-
# location. The default output class just writes to the file system. One could, for
|
|
68
|
-
# example, implement an output class that writes the generated files to multiple
|
|
69
|
-
# locations or to a remote server.
|
|
70
|
-
#
|
|
71
|
-
# [Webgen::ContentProcessor] Information on how to develop an extension that processes the
|
|
72
|
-
# content. For example, markup-to-HTML converters are implemented as
|
|
73
|
-
# content processors in webgen.
|
|
74
|
-
#
|
|
75
|
-
# [Webgen::SourceHandler::Base] Information on how to implement a class that handles objects of type
|
|
76
|
-
# source Path and creates Node instances. For example,
|
|
77
|
-
# Webgen::SourceHandler::Page handles the conversion of <tt>.page</tt>
|
|
78
|
-
# files to <tt>.html</tt> files.
|
|
79
|
-
#
|
|
80
|
-
# [Webgen::Tag::Base] Information on how to implement a webgen tag. webgen tags are used to provide
|
|
81
|
-
# an easy way for users to include dynamic content such as automatically
|
|
82
|
-
# generated menus.
|
|
83
|
-
#
|
|
84
|
-
#
|
|
85
|
-
# == General information
|
|
86
|
-
#
|
|
87
|
-
# Here are some detail on the internals of webgen that will help you while developing for webgen:
|
|
88
|
-
#
|
|
89
|
-
# * webgen uses a not so complex system for determining whether a node needs to be recreated or
|
|
90
|
-
# re-rendered. However, for this to work correctly all extensions have to follow some rules:
|
|
91
|
-
#
|
|
92
|
-
# * It is necessary that all node alcns from which the content is used are put into the
|
|
93
|
-
# destination node's <tt>node_info[:used_nodes]</tt> set.
|
|
94
|
-
#
|
|
95
|
-
# * It is necessary that all other node alcns that are used for a node in any way, even if they
|
|
96
|
-
# are only referenced or the route to their output path used, have to be put into the node's
|
|
97
|
-
# <tt>node_info[:used_meta_info_nodes]</tt> set.
|
|
98
|
-
#
|
|
99
|
-
# * Any node that is created during the rendering phase, ie. via a content processor, a tag or in
|
|
100
|
-
# the #content method of a source handler needs to be put into the rendered node's
|
|
101
|
-
# <tt>node_info[:used_meta_info_nodes]</tt> or <tt>node_info[:used_nodes]</tt> set (see above for
|
|
102
|
-
# details)! This is especially necessary when using resolved nodes since resolved nodes can be
|
|
103
|
-
# created by passive sources!
|
|
104
|
-
#
|
|
105
|
-
# * webgen provides various Error classes. However, errors should only be raised if additional runs
|
|
106
|
-
# won't correct the problem. For example, if a path cannot be resolved, it is possible that in the
|
|
107
|
-
# next run a node will be created and that the path can be resolved then. This is always the case,
|
|
108
|
-
# for example, with fragment nodes! In such cases an error message should be written out to the
|
|
109
|
-
# log to inform the user that there is a potential problem.
|
|
110
|
-
#
|
|
111
|
-
# == Blackboard services
|
|
112
|
-
#
|
|
113
|
-
# The Blackboard class provides an easy communication facility between objects. It implements the
|
|
114
|
-
# Observer pattern on the one side and allows the definition of services on the other side. One
|
|
115
|
-
# advantage of a service over the direct use of an object instance method is that the caller does
|
|
116
|
-
# not need to how to find the object that provides the service. It justs uses the Website#blackboard
|
|
117
|
-
# instance. An other advantage is that one can easily exchange the place where the service was
|
|
118
|
-
# defined without breaking extensions that rely on it.
|
|
119
|
-
#
|
|
120
|
-
# Following is a list of all services available in the stock webgen distribution by the name and the
|
|
121
|
-
# method that implements it (which is useful for looking up the parameters of service).
|
|
122
|
-
#
|
|
123
|
-
# <tt>:create_fragment_nodes</tt>:: SourceHandler::Fragment#create_fragment_nodes
|
|
124
|
-
# <tt>:templates_for_node</tt>:: SourceHandler::Template#templates_for_node
|
|
125
|
-
# <tt>:parse_html_headers</tt>:: SourceHandler::Fragment#parse_html_headers
|
|
126
|
-
# <tt>:output_instance</tt>:: Output.instance
|
|
127
|
-
# <tt>:content_processor_names</tt>:: ContentProcessor.list
|
|
128
|
-
# <tt>:content_processor</tt>:: ContentProcessor.for_name
|
|
129
|
-
# <tt>:create_sitemap</tt>:: Common::Sitemap#create_sitemap
|
|
130
|
-
# <tt>:create_directories</tt>:: SourceHandler::Directory#create_directories
|
|
131
|
-
# <tt>:create_nodes</tt>:: SourceHandler::Main#create_nodes
|
|
132
|
-
# <tt>:create_nodes_from_paths</tt>:: SourceHandler::Main#create_nodes_from_paths
|
|
133
|
-
# <tt>:source_paths</tt>:: SourceHandler::Main#find_all_source_paths
|
|
134
|
-
#
|
|
135
|
-
# Following is the list of all messages that can be listened to:
|
|
136
|
-
#
|
|
137
|
-
# <tt>:node_flagged</tt>::
|
|
138
|
-
# See Node#flag
|
|
139
|
-
#
|
|
140
|
-
# <tt>:node_unflagged</tt>::
|
|
141
|
-
# See Node#unflag
|
|
142
|
-
#
|
|
143
|
-
# <tt>:node_changed?</tt>::
|
|
144
|
-
# See Node#changed?
|
|
145
|
-
# <tt>:node_meta_info_changed?</tt>::
|
|
146
|
-
# See Node#meta_info_changed?
|
|
147
|
-
#
|
|
148
|
-
# <tt>:before_node_created</tt>::
|
|
149
|
-
# Sent by the <tt>:create_nodes</tt> service before a node is created (handled by a source handler)
|
|
150
|
-
# with the +parent+ and the +path+ as arguments.
|
|
151
|
-
#
|
|
152
|
-
# <tt>:after_node_created</tt>::
|
|
153
|
-
# Sent by the <tt>:create_nodes</tt> service after a node has been created with the created node
|
|
154
|
-
# as argument.
|
|
155
|
-
#
|
|
156
|
-
# <tt>:before_node_deleted</tt>::
|
|
157
|
-
# See Tree#delete_node
|
|
158
|
-
#
|
|
159
|
-
# == Other places to look at
|
|
160
|
-
#
|
|
161
|
-
# Here is a list of modules/classes that are primarily used throughout webgen or provide useful
|
|
162
|
-
# methods for developing extensions:
|
|
163
|
-
#
|
|
164
|
-
# Common, Tree, Node, Path, Cache, Page
|
|
165
|
-
|
|
166
26
|
module Webgen
|
|
167
27
|
|
|
168
|
-
#
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
@@data_dir = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'data', 'webgen'))
|
|
173
|
-
@@data_dir = File.expand_path(File.join(Config::CONFIG["datadir"], "webgen")) if !File.exists?(@@data_dir)
|
|
174
|
-
raise "Could not find webgen data directory! This is a bug, report it please!" unless File.directory?(@@data_dir)
|
|
175
|
-
end
|
|
176
|
-
@@data_dir
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
# Represents a webgen website and is used to render it.
|
|
28
|
+
#
|
|
29
|
+
# == About
|
|
30
|
+
#
|
|
31
|
+
# Represents a webgen website and provides the main interface for users.
|
|
181
32
|
#
|
|
182
33
|
# Normally, webgen is used from the command line via the +webgen+ command or from Rakefiles via
|
|
183
|
-
# Webgen::
|
|
34
|
+
# Webgen::RakeTask. However, you can also easily use webgen as a library and this class provides
|
|
184
35
|
# the interface for this usage!
|
|
185
36
|
#
|
|
37
|
+
# You may notice that this class doesn't have many methods. This is because webgen is designed
|
|
38
|
+
# from ground up to be extensible. Most of the 'magic' happens in extensions which are registered
|
|
39
|
+
# on the #ext OpenStruct object. The simple 'core' classes that are not extensions have separate
|
|
40
|
+
# accessor methods (#config for the Configuration object, #blackboard for the Blackboard and so
|
|
41
|
+
# on).
|
|
42
|
+
#
|
|
186
43
|
# Since a webgen website is, basically, just a directory, the only parameter needed for creating a
|
|
187
|
-
# new Website object is the website directory.
|
|
44
|
+
# new Website object is the website directory. Once created, the website is fully initialized and
|
|
45
|
+
# one can work with it:
|
|
188
46
|
#
|
|
189
|
-
# * If you want to
|
|
190
|
-
#
|
|
47
|
+
# * If you want to generate the website, you just need to call #execute_task with
|
|
48
|
+
# :generate_website as parameter.
|
|
191
49
|
#
|
|
192
|
-
# * If you want to
|
|
193
|
-
#
|
|
50
|
+
# * If you want to retrieve data from the website, you can use the various accessors on the
|
|
51
|
+
# Website object itself or use #ext to access all available extensions.
|
|
194
52
|
#
|
|
195
|
-
#
|
|
196
|
-
#
|
|
197
|
-
# data. *Note*: This is generally only useful if the website has been rendered because otherwise
|
|
198
|
-
# there is no data to retrieve.
|
|
53
|
+
# *Note*: This is generally only useful if the website has been generated before because
|
|
54
|
+
# otherwise there probably is no data to retrieve.
|
|
199
55
|
#
|
|
200
56
|
class Website
|
|
201
57
|
|
|
202
|
-
#
|
|
203
|
-
class ConfigFileInvalid < RuntimeError; end
|
|
204
|
-
|
|
205
|
-
include Loggable
|
|
206
|
-
|
|
207
|
-
# The website configuration. Can only be used after #init has been called (which is
|
|
208
|
-
# automatically done in #render).
|
|
58
|
+
# The website configuration.
|
|
209
59
|
attr_reader :config
|
|
210
60
|
|
|
211
|
-
# The blackboard used for inter-object communication.
|
|
212
|
-
# called.
|
|
61
|
+
# The blackboard used for inter-object communication.
|
|
213
62
|
attr_reader :blackboard
|
|
214
63
|
|
|
215
|
-
# A cache to store information that should be available
|
|
216
|
-
#
|
|
64
|
+
# A cache to store information that should be available the next time the website gets
|
|
65
|
+
# generated.
|
|
217
66
|
attr_reader :cache
|
|
218
67
|
|
|
68
|
+
# Access to all extension objects. An OpenStruct object.
|
|
69
|
+
attr_reader :ext
|
|
70
|
+
|
|
219
71
|
# The internal data structure used to store information about individual nodes.
|
|
72
|
+
#
|
|
73
|
+
# See Tree for more information
|
|
220
74
|
attr_reader :tree
|
|
221
75
|
|
|
222
|
-
# The
|
|
223
|
-
|
|
76
|
+
# The Webgen::Logger used for logging.
|
|
77
|
+
attr_reader :logger
|
|
224
78
|
|
|
225
79
|
# The website directory.
|
|
226
80
|
attr_reader :directory
|
|
227
81
|
|
|
228
|
-
# Create a new webgen
|
|
229
|
-
#
|
|
230
|
-
#
|
|
231
|
-
#
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
82
|
+
# Create a new webgen Website object for the website in the directory +dir+.
|
|
83
|
+
#
|
|
84
|
+
# If no logger is specified, a dummy logger that logs to a StringIO is created.
|
|
85
|
+
#
|
|
86
|
+
# You can provide a block for modifying the Website object in any way during the initialization:
|
|
87
|
+
#
|
|
88
|
+
# * If the block only takes one parameter, it is called with the Website object after the
|
|
89
|
+
# initialization is done but before the cache is restored.
|
|
90
|
+
#
|
|
91
|
+
# * If it takes two parameters, the first one is the Website object and the second one is a
|
|
92
|
+
# boolean specifying whether the block is currently called any initialization (value is
|
|
93
|
+
# +true+) or after it (value is +false).
|
|
94
|
+
#
|
|
95
|
+
def initialize(dir, logger = nil, &block)
|
|
96
|
+
@directory = dir
|
|
97
|
+
@logger = logger || Webgen::Logger.new(StringIO.new)
|
|
98
|
+
@init_block = block
|
|
99
|
+
init
|
|
246
100
|
end
|
|
247
101
|
|
|
248
102
|
# Initialize the configuration, blackboard and cache objects and load the default configuration
|
|
249
|
-
# as well as
|
|
250
|
-
# deleted!
|
|
103
|
+
# as well as all specified extensions.
|
|
251
104
|
def init
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
Dir.glob(File.join(@directory, 'ext', '**/init.rb')) {|f| load(f)}
|
|
258
|
-
read_config_file
|
|
105
|
+
@tree = Tree.new(self)
|
|
106
|
+
@blackboard = Blackboard.new
|
|
107
|
+
@config = Configuration.new
|
|
108
|
+
@cache = nil
|
|
109
|
+
@ext = OpenStruct.new
|
|
259
110
|
|
|
260
|
-
|
|
261
|
-
|
|
111
|
+
@init_block.call(self, true) if @init_block && @init_block.arity == 2
|
|
112
|
+
load_bundles
|
|
113
|
+
load_configuration
|
|
114
|
+
if @init_block
|
|
115
|
+
@init_block.arity == 1 ? @init_block.call(self) : @init_block.call(self, false)
|
|
262
116
|
end
|
|
263
|
-
|
|
264
|
-
end
|
|
117
|
+
@config.freeze
|
|
265
118
|
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
def render
|
|
269
|
-
result = nil
|
|
270
|
-
execute_in_env do
|
|
271
|
-
init
|
|
272
|
-
|
|
273
|
-
puts "Starting webgen..."
|
|
274
|
-
shm = SourceHandler::Main.new
|
|
275
|
-
result = shm.render
|
|
276
|
-
save_tree_and_cache if result
|
|
277
|
-
puts "Finished"
|
|
278
|
-
|
|
279
|
-
if @logger && @logger.log_output.length > 0
|
|
280
|
-
puts "\nLog messages:"
|
|
281
|
-
puts @logger.log_output
|
|
282
|
-
end
|
|
283
|
-
end
|
|
284
|
-
result
|
|
119
|
+
restore_cache
|
|
120
|
+
@blackboard.dispatch_msg(:website_initialized)
|
|
285
121
|
end
|
|
122
|
+
private :init
|
|
286
123
|
|
|
287
|
-
#
|
|
288
|
-
# +del_outdir+ is +true+, then the base output directory is also deleted. When a delete
|
|
289
|
-
# operation fails, the error is silently ignored and the clean operation continues.
|
|
124
|
+
# Load all extension bundles.
|
|
290
125
|
#
|
|
291
|
-
#
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
126
|
+
# This loads the extension bundle for the built-in extensions as well as all website specific
|
|
127
|
+
# extension bundles.
|
|
128
|
+
def load_bundles
|
|
129
|
+
ext_dir = File.join(@directory, 'ext')
|
|
130
|
+
ext_loader = BundleLoader.new(self, ext_dir)
|
|
131
|
+
ext_loader.load('built-in')
|
|
132
|
+
ext_loader.load_autoload_bundles
|
|
133
|
+
Dir[File.join(ext_dir, '**/init.rb')].sort.each {|file| ext_loader.load(file[ext_dir.length..-1])}
|
|
134
|
+
ext_loader.load('init.rb') if File.file?(File.join(ext_dir, 'init.rb'))
|
|
135
|
+
end
|
|
136
|
+
private :load_bundles
|
|
300
137
|
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
138
|
+
# The name of the configuration file webgen uses.
|
|
139
|
+
CONFIG_FILENAME = 'webgen.config'
|
|
140
|
+
|
|
141
|
+
# Load the configuration file into the Configuration object.
|
|
142
|
+
def load_configuration
|
|
143
|
+
config_file = File.join(@directory, CONFIG_FILENAME)
|
|
144
|
+
return unless File.exist?(config_file)
|
|
304
145
|
|
|
305
|
-
|
|
306
|
-
|
|
146
|
+
first_line = File.open(config_file, 'r') {|f| f.gets}
|
|
147
|
+
if first_line =~ /^\s*#.*\bruby\b/
|
|
148
|
+
o = Object.new
|
|
149
|
+
o.instance_variable_set(:@website, self)
|
|
150
|
+
def o.website; @website; end
|
|
151
|
+
begin
|
|
152
|
+
o.instance_eval(File.read(config_file), config_file)
|
|
153
|
+
rescue Exception => e
|
|
154
|
+
raise Webgen::Error.new("Couldn't load webgen configuration file (using Ruby syntax):\n#{e.message}")
|
|
155
|
+
end
|
|
156
|
+
else
|
|
157
|
+
unknown_options = @config.load_from_file(config_file)
|
|
158
|
+
@logger.vinfo { "Configuration data loaded from <#{config_file}>" }
|
|
159
|
+
if unknown_options.length > 0
|
|
160
|
+
@logger.debug { "Ignored following unknown options in configuration file: #{unknown_options.join(', ')}" }
|
|
307
161
|
end
|
|
308
162
|
end
|
|
309
163
|
end
|
|
164
|
+
private :load_configuration
|
|
310
165
|
|
|
311
|
-
#
|
|
312
|
-
|
|
313
|
-
def execute_in_env
|
|
314
|
-
set_back = Thread.current[:webgen_website]
|
|
315
|
-
Thread.current[:webgen_website] = self
|
|
316
|
-
yield
|
|
317
|
-
ensure
|
|
318
|
-
Thread.current[:webgen_website] = set_back
|
|
319
|
-
end
|
|
320
|
-
|
|
321
|
-
#######
|
|
322
|
-
private
|
|
323
|
-
#######
|
|
324
|
-
|
|
325
|
-
# Restore the tree and the cache from +website.cache+ and returns the Tree object.
|
|
326
|
-
def restore_tree_and_cache
|
|
166
|
+
# Restore the cache using the +website.cache+ configuration option.
|
|
167
|
+
def restore_cache
|
|
327
168
|
@cache = Cache.new
|
|
328
|
-
@tree = Tree.new
|
|
329
169
|
data = if config['website.cache'].first == :file
|
|
330
|
-
cache_file
|
|
331
|
-
File.open(cache_file, 'rb') {|f| f.read} if File.exists?(cache_file)
|
|
170
|
+
File.binread(cache_file) if File.file?(cache_file)
|
|
332
171
|
else
|
|
333
172
|
config['website.cache'].last
|
|
334
173
|
end
|
|
335
|
-
cache_data,
|
|
336
|
-
if cache_data && version == Webgen::VERSION
|
|
337
|
-
@cache.restore(cache_data)
|
|
338
|
-
@tree = tree
|
|
339
|
-
end
|
|
174
|
+
cache_data, version = Marshal.load(data) rescue nil
|
|
175
|
+
@cache.restore(cache_data) if cache_data && version == Webgen::VERSION
|
|
340
176
|
end
|
|
177
|
+
private :restore_cache
|
|
341
178
|
|
|
342
|
-
# Save the +
|
|
343
|
-
def
|
|
344
|
-
|
|
179
|
+
# Save the +cache+.
|
|
180
|
+
def save_cache
|
|
181
|
+
return if config['website.dry_run']
|
|
182
|
+
cache_data = [@cache.dump, Webgen::VERSION]
|
|
345
183
|
if config['website.cache'].first == :file
|
|
346
|
-
cache_file = File.join(@directory, config['website.cache'].last)
|
|
347
184
|
File.open(cache_file, 'wb') {|f| Marshal.dump(cache_data, f)}
|
|
348
185
|
else
|
|
349
186
|
config['website.cache'][1] = Marshal.dump(cache_data)
|
|
350
187
|
end
|
|
351
188
|
end
|
|
352
189
|
|
|
353
|
-
#
|
|
354
|
-
def
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
end
|
|
365
|
-
end
|
|
366
|
-
rescue RuntimeError, ArgumentError => e
|
|
367
|
-
raise ConfigFileInvalid, "Configuration invalid: " + e.message
|
|
368
|
-
end
|
|
369
|
-
elsif File.exists?(File.join(@directory, 'config.yml'))
|
|
370
|
-
log(:warn) { "No configuration file called config.yaml found (there is a config.yml - spelling error?)" }
|
|
190
|
+
# The full path of the cache filename.
|
|
191
|
+
def cache_file
|
|
192
|
+
tmpdir(config['website.cache'].last)
|
|
193
|
+
end
|
|
194
|
+
private :cache_file
|
|
195
|
+
|
|
196
|
+
# Append the path to the website's temporary directory and return the full path to it.
|
|
197
|
+
def tmpdir(path = '')
|
|
198
|
+
unless defined?(@_tmpdir)
|
|
199
|
+
@_tmpdir = File.absolute_path(config['website.tmpdir'], @directory)
|
|
200
|
+
FileUtils.mkdir_p(@_tmpdir)
|
|
371
201
|
end
|
|
202
|
+
File.join(@_tmpdir, path)
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# Execute the given task.
|
|
206
|
+
#
|
|
207
|
+
# See Webgen::Task and the classes in its namespace for available classes.
|
|
208
|
+
def execute_task(task, *options)
|
|
209
|
+
@ext.task.execute(task, *options)
|
|
372
210
|
end
|
|
373
211
|
|
|
374
212
|
end
|