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,121 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'ostruct'
|
|
4
|
+
require 'webgen/utils'
|
|
5
|
+
require 'webgen/error'
|
|
6
|
+
|
|
7
|
+
module Webgen
|
|
8
|
+
|
|
9
|
+
# Provides common functionality for extension manager classes.
|
|
10
|
+
#
|
|
11
|
+
# This module is intended for mixing into an extension manager class. An example for an extension
|
|
12
|
+
# manage class is the Webgen::ContentProcessor class which manages all content processors.
|
|
13
|
+
# Extension manager classes provide methods for registering a certain type of extension and
|
|
14
|
+
# invoking methods on them via a common interface.
|
|
15
|
+
#
|
|
16
|
+
# It is assumed that one wants to associate one or more names with an extension object.
|
|
17
|
+
module ExtensionManager
|
|
18
|
+
|
|
19
|
+
# Create a new extension manager.
|
|
20
|
+
def initialize
|
|
21
|
+
@extensions = {}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def initialize_copy(orig) #:nodoc:
|
|
25
|
+
super
|
|
26
|
+
@extensions = {}
|
|
27
|
+
orig.instance_eval { @extensions }.each {|k,v| @extensions[k] = v.clone}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Register a new extension.
|
|
31
|
+
#
|
|
32
|
+
# **Note** that this method has to be implemented by classes that include this module. It should
|
|
33
|
+
# register one or more names for an extension object by associating the names with the extension
|
|
34
|
+
# object data (should be an object that responds at least to :object) via the @extensions hash.
|
|
35
|
+
#
|
|
36
|
+
# The simplest way to achieve this is to use the #do_register method.
|
|
37
|
+
def register(klass, options = {}, &block)
|
|
38
|
+
raise NotImplementedError
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Automatically perform the necessary steps to register the extension +klass+. This involves
|
|
42
|
+
# normalization of the class name and associating the extension name (derived from the class
|
|
43
|
+
# name if not set via the key :name in the options hash) with the extension.
|
|
44
|
+
#
|
|
45
|
+
# The parameter +klass+ can either be a String or a Class specifying the class that should be
|
|
46
|
+
# registered.
|
|
47
|
+
#
|
|
48
|
+
# The parameter +options+ allows to associate additional information with an extension. The only
|
|
49
|
+
# recognized key is :name (for the extension name). All other keys are ignored and can/should be
|
|
50
|
+
# used by the extension manager class itself.
|
|
51
|
+
#
|
|
52
|
+
# The parameter +allow_block+ specifies whether the extension manager allows blocks as
|
|
53
|
+
# extensions. If this parameter is +true+ and a block is provided, the +klass+ parameter is
|
|
54
|
+
# not used!
|
|
55
|
+
#
|
|
56
|
+
# Returns the (possibly automatically generated) name for the extension.
|
|
57
|
+
def do_register(klass, options = {}, allow_block = true, &block)
|
|
58
|
+
if !allow_block && block_given?
|
|
59
|
+
raise ArgumentError, "The extension manager '#{self.class.name}' does not support blocks on #register"
|
|
60
|
+
end
|
|
61
|
+
klass, klass_name = normalize_class_name(klass, !block_given?)
|
|
62
|
+
name = (options[:name] || Webgen::Utils.snake_case(klass_name)).to_sym
|
|
63
|
+
@extensions[name] = OpenStruct.new(:object => (block_given? ? block : klass))
|
|
64
|
+
name
|
|
65
|
+
end
|
|
66
|
+
private :do_register
|
|
67
|
+
|
|
68
|
+
# Return a complete class name (including the hierarchy part) based on +klass+ and the class
|
|
69
|
+
# name without the hierarchy part.
|
|
70
|
+
#
|
|
71
|
+
# If the parameter +do_autoload+ is +true+ and the +klass+ is defined under this class, it is
|
|
72
|
+
# autoloaded by turning the class name into a path name (See Webgen::Utils.snake_case).
|
|
73
|
+
def normalize_class_name(klass, do_autoload = true)
|
|
74
|
+
klass = (klass.kind_of?(Class) || klass.include?('::') ? klass : "#{self.class.name}::#{klass}")
|
|
75
|
+
klass_name = klass.to_s.split(/::/).last
|
|
76
|
+
if do_autoload && klass.to_s.start_with?(self.class.name) && klass_name =~ /^[A-Z]/
|
|
77
|
+
self.class.autoload(klass_name.to_sym, Webgen::Utils.snake_case(klass.to_s))
|
|
78
|
+
end
|
|
79
|
+
[klass, klass_name]
|
|
80
|
+
end
|
|
81
|
+
private :normalize_class_name
|
|
82
|
+
|
|
83
|
+
# Return the registered object for the extension +name+.
|
|
84
|
+
#
|
|
85
|
+
# This method also works in the case that +name+ is a String referencing a class. The method
|
|
86
|
+
# assumes that @extensions[name] is an array where the registered object is the first element!
|
|
87
|
+
def extension(name)
|
|
88
|
+
raise Webgen::Error.new("No extension called '#{name}' registered for the '#{self.class.name}' extension manager") unless registered?(name)
|
|
89
|
+
name = name.to_sym
|
|
90
|
+
ext = @extensions[name].object
|
|
91
|
+
ext.kind_of?(String) ? @extensions[name].object = resolve_class(ext) : ext
|
|
92
|
+
end
|
|
93
|
+
private :extension
|
|
94
|
+
|
|
95
|
+
# Return the extension data for the extension +name+.
|
|
96
|
+
def ext_data(name)
|
|
97
|
+
@extensions[name.to_sym]
|
|
98
|
+
end
|
|
99
|
+
private :ext_data
|
|
100
|
+
|
|
101
|
+
# If +class_or_name+ is a String, it is taken as the name of a class and is resolved. Else
|
|
102
|
+
# returns +class_or_name+.
|
|
103
|
+
def resolve_class(class_or_name)
|
|
104
|
+
String === class_or_name ? Webgen::Utils.const_for_name(class_or_name) : class_or_name
|
|
105
|
+
end
|
|
106
|
+
private :resolve_class
|
|
107
|
+
|
|
108
|
+
# Return +true+ if an extension with the given name has been registered with this manager
|
|
109
|
+
# class.
|
|
110
|
+
def registered?(name)
|
|
111
|
+
@extensions.has_key?(name.to_sym)
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
# Return the meta data of all extensions registered with this manager class.
|
|
115
|
+
def registered_extensions
|
|
116
|
+
@extensions.dup
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
end
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'set'
|
|
4
|
+
require 'webgen/extension_manager'
|
|
5
|
+
|
|
6
|
+
module Webgen
|
|
7
|
+
|
|
8
|
+
# Namespace for all item trackers.
|
|
9
|
+
#
|
|
10
|
+
# == About
|
|
11
|
+
#
|
|
12
|
+
# This extension manager class is used to track various "items". Such items can be added as a
|
|
13
|
+
# dependency to a node and later be checked if they have changed. This allows webgen to
|
|
14
|
+
# conditionally render a node.
|
|
15
|
+
#
|
|
16
|
+
# An item can basically be anything, there only has to be an item tracker extension that knows how
|
|
17
|
+
# to handle it. Each item tracker extension is uniquely identified by its name (e.g.
|
|
18
|
+
# :+node_content+, :+node_meta_info+, ...).
|
|
19
|
+
#
|
|
20
|
+
# == Implementing an item tracker.
|
|
21
|
+
#
|
|
22
|
+
# An item tracker extension class must respond to the following methods:
|
|
23
|
+
#
|
|
24
|
+
# [initialize(website)]
|
|
25
|
+
# Initializes the extension and provides the website object which can be used to resolve the
|
|
26
|
+
# item ID to the referenced item or item data itself.
|
|
27
|
+
#
|
|
28
|
+
# [item_id(*item)]
|
|
29
|
+
# Return the unique ID for the given item. The returned ID has to be unique for this item
|
|
30
|
+
# tracker extension
|
|
31
|
+
#
|
|
32
|
+
# [item_data(*item)]
|
|
33
|
+
# Return the data for the item so that it can be correctly checked later if it has changed.
|
|
34
|
+
#
|
|
35
|
+
# [changed?(item_id, old_data)]
|
|
36
|
+
# Return +true+ if the item identified by its unique ID has changed. The parameter +old_data+
|
|
37
|
+
# contains the last known data of the item.
|
|
38
|
+
#
|
|
39
|
+
# [node_referenced?(item_id, old_data, node_alcn)]
|
|
40
|
+
# Return +true+ if the node identified by +node_alcn+ is referenced in the old data identified
|
|
41
|
+
# by the unique ID.
|
|
42
|
+
#
|
|
43
|
+
# The parameter +item+ for the methods +item_id+ and +item_data+ contains the information needed
|
|
44
|
+
# to identify the item and is depdendent on the specific item tracker extension class. Therefore
|
|
45
|
+
# you need to look at the documentation for an item tracker extension to see what it expects as
|
|
46
|
+
# the item.
|
|
47
|
+
#
|
|
48
|
+
# Since these methods are invoked multiple times for different items, these methods should have no
|
|
49
|
+
# side effects.
|
|
50
|
+
#
|
|
51
|
+
# == Sample item tracker
|
|
52
|
+
#
|
|
53
|
+
# The following sample item tracker tracks changes in configuration values. It needs the
|
|
54
|
+
# configuration option name as item.
|
|
55
|
+
#
|
|
56
|
+
# class ConfigTracker
|
|
57
|
+
#
|
|
58
|
+
# def initialize(website)
|
|
59
|
+
# @website = website
|
|
60
|
+
# end
|
|
61
|
+
#
|
|
62
|
+
# def item_id(config_key)
|
|
63
|
+
# config_key
|
|
64
|
+
# end
|
|
65
|
+
#
|
|
66
|
+
# def item_data(config_key)
|
|
67
|
+
# @website.config[config_key]
|
|
68
|
+
# end
|
|
69
|
+
#
|
|
70
|
+
# def changed?(config_key, old_val)
|
|
71
|
+
# @website.config[config_key] != old_val
|
|
72
|
+
# end
|
|
73
|
+
#
|
|
74
|
+
# def node_referenced?(config_key, config_value, node_alcn)
|
|
75
|
+
# false
|
|
76
|
+
# end
|
|
77
|
+
#
|
|
78
|
+
# end
|
|
79
|
+
#
|
|
80
|
+
# website.ext.item_tracker.register ConfigTracker, name: :config
|
|
81
|
+
#
|
|
82
|
+
class ItemTracker
|
|
83
|
+
|
|
84
|
+
include Webgen::ExtensionManager
|
|
85
|
+
|
|
86
|
+
# Create a new item tracker for the given website.
|
|
87
|
+
def initialize(website)
|
|
88
|
+
super()
|
|
89
|
+
@instances = {}
|
|
90
|
+
@node_dependencies = Hash.new {|h,k| h[k] = Set.new}
|
|
91
|
+
@item_data = {}
|
|
92
|
+
@cached = {:node_dependencies => {}, :item_data => {}}
|
|
93
|
+
@written_nodes = []
|
|
94
|
+
@checked_nodes = Set.new
|
|
95
|
+
|
|
96
|
+
@website = website
|
|
97
|
+
|
|
98
|
+
@item_changed = {}
|
|
99
|
+
|
|
100
|
+
@website.blackboard.add_listener(:website_initialized, self) do
|
|
101
|
+
@cached = @website.cache[:item_tracker_data] || @cached
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
@website.blackboard.add_listener(:after_tree_populated, self) do |node|
|
|
105
|
+
@item_data.keys.each do |uid|
|
|
106
|
+
@item_data[uid] = item_tracker(uid.first).item_data(*uid.last)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
@website.blackboard.add_listener(:before_all_nodes_written, self) do
|
|
111
|
+
# make all used item data from the previous pass current again if applicable
|
|
112
|
+
@written_nodes.each do |node|
|
|
113
|
+
next unless @website.tree[node.alcn]
|
|
114
|
+
@node_dependencies[node.alcn].each do |uid|
|
|
115
|
+
@item_data[uid] = item_tracker(uid.first).item_data(*uid.last)
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
@written_nodes = []
|
|
119
|
+
@item_changed = {}
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
@website.blackboard.add_listener(:after_node_written, self) do |node|
|
|
123
|
+
@written_nodes << node
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
@website.blackboard.add_listener(:after_all_nodes_written, self) do
|
|
127
|
+
# update cached data with data from the run
|
|
128
|
+
@written_nodes.each do |node|
|
|
129
|
+
next unless @website.tree[node.alcn]
|
|
130
|
+
@cached[:node_dependencies][node.alcn] = @node_dependencies[node.alcn]
|
|
131
|
+
@node_dependencies[node.alcn].each {|uid| @cached[:item_data][uid] = @item_data[uid]}
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
@website.blackboard.add_listener(:website_generated, self) do
|
|
136
|
+
@cached[:node_dependencies].reject! {|alcn, data| !@website.tree[alcn]}
|
|
137
|
+
@cached[:item_data].merge!(@item_data)
|
|
138
|
+
@cached[:item_data].reject! do |uid, _|
|
|
139
|
+
!@cached[:node_dependencies].find {|alcn, data| data.include?(uid)}
|
|
140
|
+
end
|
|
141
|
+
@website.cache[:item_tracker_data] = @cached
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Register an item tracker.
|
|
146
|
+
#
|
|
147
|
+
# The parameter +klass+ has to contain the name of the item tracker class or the class object
|
|
148
|
+
# itself. If the class is located under this namespace, only the class name without the
|
|
149
|
+
# hierarchy part is needed, otherwise the full class name including parent module/class names is
|
|
150
|
+
# needed.
|
|
151
|
+
#
|
|
152
|
+
# === Options:
|
|
153
|
+
#
|
|
154
|
+
# [:name] The name for the item tracker class. If not set, it defaults to the snake-case version
|
|
155
|
+
# (i.e. FileSystem → file_system) of the class name (without the hierarchy part). It
|
|
156
|
+
# should only contain letters.
|
|
157
|
+
#
|
|
158
|
+
# === Examples:
|
|
159
|
+
#
|
|
160
|
+
# item_tracker.register('Node') # registers Webgen::ItemTracker::Node
|
|
161
|
+
#
|
|
162
|
+
# item_tracker.register('::Node') # registers Node !!!
|
|
163
|
+
#
|
|
164
|
+
# item_tracker.register('MyModule::Doit', name: 'infos')
|
|
165
|
+
#
|
|
166
|
+
def register(klass, options={}, &block)
|
|
167
|
+
do_register(klass, options, false, &block)
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# Add the given item that is handled by the item tracker extension +name+ as a dependency to the
|
|
171
|
+
# node.
|
|
172
|
+
def add(node, name, *item)
|
|
173
|
+
uid = unique_id(name, item)
|
|
174
|
+
@node_dependencies[node.alcn] << uid
|
|
175
|
+
@item_data[uid] ||= item_tracker(name).item_data(*uid.last)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
# Return +true+ if the given node has changed.
|
|
179
|
+
def node_changed?(node)
|
|
180
|
+
return false if @checked_nodes.include?(node)
|
|
181
|
+
@checked_nodes << node
|
|
182
|
+
!@cached[:node_dependencies].has_key?(node.alcn) ||
|
|
183
|
+
@cached[:node_dependencies][node.alcn].any? {|uid| item_changed_by_uid?(uid)}
|
|
184
|
+
ensure
|
|
185
|
+
@checked_nodes.delete(node)
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
# Return +true+ if the given node has been referenced by any item tracker extension.
|
|
189
|
+
def node_referenced?(node)
|
|
190
|
+
node_alcn = node.alcn
|
|
191
|
+
checked_uids = Set.new
|
|
192
|
+
@cached[:node_dependencies].each do |alcn, uids|
|
|
193
|
+
next if alcn == node_alcn
|
|
194
|
+
uids.each do |uid|
|
|
195
|
+
next if checked_uids.include?(uid)
|
|
196
|
+
checked_uids << uid
|
|
197
|
+
return true if item_tracker(uid.first).node_referenced?(uid.last, @cached[:item_data][uid], node_alcn)
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
false
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
# Return +true+ if the given item that is handled by the item tracker extension +name+ has
|
|
204
|
+
# changed.
|
|
205
|
+
def item_changed?(name, *item)
|
|
206
|
+
item_changed_by_uid?(unique_id(name, item))
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
#######
|
|
210
|
+
private
|
|
211
|
+
#######
|
|
212
|
+
|
|
213
|
+
# Return +true+ if the given item has changed. See #add for a description of the item
|
|
214
|
+
# parameters.
|
|
215
|
+
def item_changed_by_uid?(uid)
|
|
216
|
+
return @item_changed[uid] if @item_changed.has_key?(uid)
|
|
217
|
+
@item_changed[uid] = if !@cached[:item_data].has_key?(uid)
|
|
218
|
+
true
|
|
219
|
+
else
|
|
220
|
+
item_tracker(uid.first).changed?(uid.last, @cached[:item_data][uid])
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
# Return the unique ID for the given item handled by the item tracker extension object specified
|
|
225
|
+
# by name.
|
|
226
|
+
def unique_id(name, item)
|
|
227
|
+
[name.to_sym, item_tracker(name).item_id(*item)]
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Return the item tracker extension object called name.
|
|
231
|
+
def item_tracker(name)
|
|
232
|
+
@instances[name] ||= extension(name).new(@website)
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'webgen/item_tracker'
|
|
4
|
+
|
|
5
|
+
module Webgen
|
|
6
|
+
class ItemTracker
|
|
7
|
+
|
|
8
|
+
# This class is used to track changes to a file.
|
|
9
|
+
#
|
|
10
|
+
# The item for this tracker is the name of the file, i.e. add an item like this:
|
|
11
|
+
#
|
|
12
|
+
# website.ext.item_tracker.add(some_node, :file, '/home/me/file.jpg')
|
|
13
|
+
#
|
|
14
|
+
class File
|
|
15
|
+
|
|
16
|
+
def initialize(website) #:nodoc:
|
|
17
|
+
@website = website
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def item_id(filename) #:nodoc:
|
|
21
|
+
filename
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def item_data(filename) #:nodoc:
|
|
25
|
+
::File.mtime(filename)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def changed?(filename, old_mtime) #:nodoc:
|
|
29
|
+
::File.mtime(filename) > old_mtime
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def node_referenced?(filename, mtime, node_alcn) #:nodoc:
|
|
33
|
+
false
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'webgen/item_tracker'
|
|
4
|
+
|
|
5
|
+
module Webgen
|
|
6
|
+
class ItemTracker
|
|
7
|
+
|
|
8
|
+
# This class is used to track unresolved absolute node paths.
|
|
9
|
+
#
|
|
10
|
+
# The item for this tracker is the unresolved absolute node path and, optionally, a language.
|
|
11
|
+
#
|
|
12
|
+
# For example:
|
|
13
|
+
#
|
|
14
|
+
# website.ext.item_tracker.add(some_node, :missing_node, '/dir/missing.html')
|
|
15
|
+
# website.ext.item_tracker.add(some_node, :missing_node, '/dir/missing.html', 'de')
|
|
16
|
+
#
|
|
17
|
+
class MissingNode
|
|
18
|
+
|
|
19
|
+
def initialize(website) #:nodoc:
|
|
20
|
+
@website = website
|
|
21
|
+
@at_least_one_node_created = true
|
|
22
|
+
@stop_reporting = false
|
|
23
|
+
|
|
24
|
+
@website.blackboard.add_listener(:after_node_created, self) do
|
|
25
|
+
@at_least_one_node_created = true
|
|
26
|
+
end
|
|
27
|
+
@website.blackboard.add_listener(:after_all_nodes_written, self) do
|
|
28
|
+
if @at_least_one_node_created
|
|
29
|
+
@at_least_one_node_created = false
|
|
30
|
+
else
|
|
31
|
+
@stop_reporting = true
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
@website.blackboard.add_listener(:website_generated, self) do
|
|
35
|
+
@at_least_one_node_created = true
|
|
36
|
+
@stop_reporting = false
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def item_id(path, lang = nil) #:nodoc:
|
|
41
|
+
[path, lang]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def item_data(path, lang) #:nodoc:
|
|
45
|
+
@website.tree.resolve_node(path, lang).nil?
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def changed?(iid, old_data) #:nodoc:
|
|
49
|
+
return false if @stop_reporting
|
|
50
|
+
missing = item_data(*iid)
|
|
51
|
+
missing || missing != old_data
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def node_referenced?(iid, missing, node_alcn) #:nodoc:
|
|
55
|
+
iid.first == node_alcn
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
end
|