webgen 0.5.17 → 1.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- 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,59 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'open-uri'
|
4
|
+
require 'zlib'
|
5
|
+
require 'set'
|
6
|
+
|
7
|
+
require 'webgen/source'
|
8
|
+
require 'webgen/path'
|
9
|
+
webgen_require 'archive/tar/minitar', 'archive-tar-minitar'
|
10
|
+
|
11
|
+
module Webgen
|
12
|
+
class Source
|
13
|
+
|
14
|
+
# This class is used to read source paths from a (gzipped) tar archive. The archive can be remote
|
15
|
+
# (http(s) or ftp) or local.
|
16
|
+
#
|
17
|
+
# For example, the following are all valid URIs:
|
18
|
+
# http://example.com/directory/file.tgz
|
19
|
+
# /home/test/my.tar.gz
|
20
|
+
# ftp://ftp.example.com/archives/archive.tar
|
21
|
+
#
|
22
|
+
class TarArchive
|
23
|
+
|
24
|
+
# The URI of the tar archive.
|
25
|
+
attr_reader :uri
|
26
|
+
|
27
|
+
# The glob (see File.fnmatch for details) that is used to specify which paths in the archive should
|
28
|
+
# be returned by #paths.
|
29
|
+
attr_reader :glob
|
30
|
+
|
31
|
+
# Create a new tar archive source for the URI string +uri+.
|
32
|
+
def initialize(website, uri, glob = '**/*')
|
33
|
+
@uri = uri
|
34
|
+
@glob = glob
|
35
|
+
end
|
36
|
+
|
37
|
+
# Return all paths in the tar archive available at #uri.
|
38
|
+
def paths
|
39
|
+
if !defined?(@paths)
|
40
|
+
stream = open(@uri)
|
41
|
+
stream = Zlib::GzipReader.new(stream) if @uri =~ /(\.tar\.gz|\.tgz)$/
|
42
|
+
Archive::Tar::Minitar::Input.open(stream) do |input|
|
43
|
+
@paths = input.collect do |entry|
|
44
|
+
path = entry.full_name
|
45
|
+
next unless File.fnmatch(@glob, path, File::FNM_DOTMATCH|File::FNM_CASEFOLD|File::FNM_PATHNAME)
|
46
|
+
path += '/' if entry.directory? && path[-1] != ?/
|
47
|
+
path = '/' + path unless path[0] == ?/
|
48
|
+
data = entry.read.to_s
|
49
|
+
Path.new(path, 'modified_at' => Time.at(entry.mtime)) {|mode| StringIO.new(data, mode) }
|
50
|
+
end.compact.to_set
|
51
|
+
end
|
52
|
+
end
|
53
|
+
@paths
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
data/lib/webgen/tag.rb
CHANGED
@@ -1,26 +1,257 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
|
+
require 'webgen/extension_manager'
|
4
|
+
require 'webgen/error'
|
5
|
+
require 'webgen/utils/tag_parser'
|
6
|
+
|
3
7
|
module Webgen
|
4
8
|
|
5
|
-
# Namespace for all
|
6
|
-
#
|
7
|
-
#
|
8
|
-
#
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
9
|
+
# Namespace for all webgen tags.
|
10
|
+
#
|
11
|
+
# == About
|
12
|
+
#
|
13
|
+
# A tag object is a webgen extension that handles specific webgen tags. webgen tags are used to
|
14
|
+
# add dynamic content to page and template files (or any other file for that matter) and are made
|
15
|
+
# for ease of use.
|
16
|
+
#
|
17
|
+
# == Implementing a tag
|
18
|
+
#
|
19
|
+
# A tag object only needs to respond to the method +call+ which needs to accept three parameters:
|
20
|
+
#
|
21
|
+
# [tag]: The name of the tag which should be processed (useful for tag objects which can process
|
22
|
+
# different tags).
|
23
|
+
#
|
24
|
+
# [body]: Holds the body value for the tag if any.
|
25
|
+
#
|
26
|
+
# [context]: Holds all relevant information for processing -- have a look at the Webgen::Context
|
27
|
+
# class to see what is available. The special key :config is set to an
|
28
|
+
# Webgen::Configuration object that should be used to retrieve configuration option
|
29
|
+
# values because the values might be changed due to options set directly via the tag
|
30
|
+
# syntax.
|
31
|
+
#
|
32
|
+
# The method has to return the result of the processing and, optionally, a boolean value
|
33
|
+
# specifying if the result should further be processed (ie. webgen tags replaced).
|
34
|
+
#
|
35
|
+
# This allows one to implement a tag object as a class with a class method called +call+. Or as a
|
36
|
+
# Proc object.
|
37
|
+
#
|
38
|
+
# The tag object has to be registered so that webgen knows about it, see #register for more
|
39
|
+
# information.
|
40
|
+
#
|
41
|
+
# == Tag options
|
42
|
+
#
|
43
|
+
# webgen tags allow the specification of options in the tag definition. When registering a tag,
|
44
|
+
# one can specify which options are mandatory, i.e. which options always have to be set directly
|
45
|
+
# for the tag. The value of the option :config_base for the #register method is used to resolve
|
46
|
+
# partially stated configuration entries.
|
47
|
+
#
|
48
|
+
# == Sample Tag
|
49
|
+
#
|
50
|
+
# Following is a simple tag class example which just reverses the body text and adds some
|
51
|
+
# information about the context to the result.
|
52
|
+
#
|
53
|
+
# class Reverser
|
54
|
+
#
|
55
|
+
# def self.call(tag, body, context)
|
56
|
+
# result = context[:config]['do_reverse'] ? body.reverse : body
|
57
|
+
# result << "Node: " << context.content_node.alcn << " (" << context.content_node['title'] << ")"
|
58
|
+
# result << "Reference node: " << context.ref_node.alcn
|
59
|
+
# result
|
60
|
+
# end
|
61
|
+
#
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# website.config.define_option('reverser.do_reverse', nil, 'Actually do reverse the text')
|
65
|
+
# website.ext.tag.register Reverser, :names => 'reverse', :mandatory => ['do_reverse']
|
66
|
+
#
|
67
|
+
class Tag
|
68
|
+
|
69
|
+
include Webgen::ExtensionManager
|
70
|
+
|
71
|
+
# Render the tag template for the given tag and return the result.
|
72
|
+
#
|
73
|
+
# The value of the configuration option 'tag.<TAG>.template' (where '<TAG>' is replaced with
|
74
|
+
# +tag+) is used as template path.
|
75
|
+
#
|
76
|
+
# If the template node cannot be found, an empty string is returned.
|
77
|
+
def self.render_tag_template(context, tag)
|
78
|
+
path = context[:config]["tag.#{tag}.template"]
|
79
|
+
template_node = context.ref_node.resolve(path, context.dest_node.lang, true)
|
80
|
+
if template_node
|
81
|
+
context.render_block(:name => "tag.#{tag}", :node => 'first',
|
82
|
+
:chain => [*template_node.template_chain, template_node, context.content_node])
|
83
|
+
else
|
84
|
+
''
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
|
89
|
+
def initialize(website) # :nodoc:
|
90
|
+
super()
|
91
|
+
website.blackboard.add_listener(:website_initialized, self) do
|
92
|
+
@parser = Webgen::Utils::TagParser.new(website.config['tag.prefix'])
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
# Register a tag.
|
97
|
+
#
|
98
|
+
# The parameter +klass+ can either be a String containing the name of a class/module (which has
|
99
|
+
# to respond to :call) or an object that responds to :call. If the class is located under this
|
100
|
+
# namespace, only the class name without the hierarchy part is needed, otherwise the full
|
101
|
+
# class/module name including parent module/class names is needed.
|
102
|
+
#
|
103
|
+
# Instead of registering an object that responds to :call, you can also provide a block that
|
104
|
+
# processes a tag.
|
105
|
+
#
|
106
|
+
# === Options:
|
107
|
+
#
|
108
|
+
# [:names] The tag name or an array of tag names. If not set, it defaults to the lowercase
|
109
|
+
# version of the class name (without the hierarchy part).
|
110
|
+
#
|
111
|
+
# The name :default is used for specifying the default tag which is called if an
|
112
|
+
# unknown tag name is encountered.
|
113
|
+
#
|
114
|
+
# [:config_base] The configuration base, i.e. the part of a configuration option name that does
|
115
|
+
# not need to be specified. Defaults to the full class name without the Webgen
|
116
|
+
# module downcased and all "::" substituted with "." (e.g. Webgen::Tag::Menu →
|
117
|
+
# tag.menu). Needs to be specified when a block is used!
|
118
|
+
#
|
119
|
+
# [:mandatory] A list of configuration option names whose values always need to be provided. The
|
120
|
+
# first configuration option name is used as the default mandatory option (used
|
121
|
+
# when only a string is provided in the tag definition).
|
122
|
+
#
|
123
|
+
# === Examples:
|
124
|
+
#
|
125
|
+
# tag.register('Date') # registers Webgen::Tag::Date
|
126
|
+
#
|
127
|
+
# tag.register('::Date') # registers Date !!!
|
128
|
+
#
|
129
|
+
# tag.register('MyModule::Date', names: ['mydate', 'date'])
|
130
|
+
#
|
131
|
+
# tag.register('date', config_base: 'tag.date') do |tag, body, context|
|
132
|
+
# Time.now.strftime(param('tag.date.format'))
|
133
|
+
# end
|
134
|
+
#
|
135
|
+
def register(klass, options = {}, &block)
|
136
|
+
if block_given? && !options[:config_base]
|
137
|
+
raise ArgumentError, "The option :config_base needs to be specified when using a block"
|
138
|
+
end
|
139
|
+
|
140
|
+
names = [options.delete(:names)].flatten.compact
|
141
|
+
options[:name] = names.shift
|
142
|
+
name = do_register(klass, options, true, &block)
|
143
|
+
ext_data(name).mandatory = options[:mandatory] || []
|
144
|
+
ext_data(name).config_base = options[:config_base] ||
|
145
|
+
Webgen::Utils.snake_case(ext_data(name).object.to_s.gsub(/::/, '.').gsub(/^Webgen\./, ''))
|
146
|
+
ext_data(name).initialized = false
|
147
|
+
names.each {|n| @extensions[n.to_sym] = @extensions[name]}
|
148
|
+
end
|
149
|
+
|
150
|
+
# Process the +tag+ and return the result.
|
151
|
+
#
|
152
|
+
# The parameter +params+ (can be a Hash, a String or nil) needs to contain the parameters for
|
153
|
+
# the tag and +body+ is the optional body for the tag. +context+ needs to be a valid
|
154
|
+
# Webgen::Context object.
|
155
|
+
def call(tag, params, body, context)
|
156
|
+
result = ''
|
157
|
+
tdata = tag_data(tag, context)
|
158
|
+
if !tdata.nil?
|
159
|
+
context[:config] = create_config(tag, params, tdata, context)
|
160
|
+
result, process_output = tdata.object.call(tag, body, context)
|
161
|
+
result = context.website.ext.content_processor.call('tags', context.clone(:content => result)).content if process_output
|
162
|
+
else
|
163
|
+
raise Webgen::RenderError.new("No tag processor for '#{tag}' found", self.class.name,
|
164
|
+
context.dest_node, context.ref_node)
|
165
|
+
end
|
166
|
+
result
|
167
|
+
rescue Webgen::Error => e
|
168
|
+
e.path = context.dest_node if e.path.to_s.empty?
|
169
|
+
raise
|
170
|
+
rescue Exception => e
|
171
|
+
raise Webgen::RenderError.new(e, (tdata && tdata.object.respond_to?(:name) ? tdata.object.name : "tag '#{tag}'"),
|
172
|
+
context.dest_node, context.ref_node)
|
173
|
+
end
|
174
|
+
|
175
|
+
# See Webgen::Utils::TagParser#replace_tags.
|
176
|
+
def replace_tags(str, &block) #:yields: tag_name, params, body
|
177
|
+
@parser.replace_tags(str, &block)
|
178
|
+
end
|
179
|
+
|
180
|
+
#######
|
181
|
+
private
|
182
|
+
#######
|
183
|
+
|
184
|
+
# Create the Webgen::Configuration object from the parameters and the given configuration
|
185
|
+
# base.
|
186
|
+
def create_config(tag, params, tdata, context)
|
187
|
+
values = case params
|
188
|
+
when Hash then values_from_hash(tag, params, tdata, context)
|
189
|
+
when String then values_from_string(tag, params, tdata, context)
|
190
|
+
when NilClass then {}
|
191
|
+
else
|
192
|
+
raise Webgen::RenderError.new("Invalid parameter type (#{params.class})",
|
193
|
+
self.class.name, context.dest_node, context.ref_node)
|
194
|
+
end
|
195
|
+
|
196
|
+
if !tdata.mandatory.all? {|k| values.has_key?(k)}
|
197
|
+
raise Webgen::RenderError.new("Not all mandatory parameters set", self.class.name, context.dest_node, context.ref_node)
|
198
|
+
end
|
199
|
+
config = context.website.config.dup
|
200
|
+
config.set_values(values)
|
201
|
+
config.freeze
|
202
|
+
config
|
203
|
+
end
|
204
|
+
|
205
|
+
# Return a hash containing valid configuration options by taking key-value pairs from +params+.
|
206
|
+
def values_from_hash(tag, params, tdata, context)
|
207
|
+
result = {}
|
208
|
+
params.each do |key, value|
|
209
|
+
if context.website.config.option?(key)
|
210
|
+
result[key] = value
|
211
|
+
elsif context.website.config.option?(tdata.config_base + '.' + key)
|
212
|
+
result[tdata.config_base + '.' + key] = value
|
213
|
+
else
|
214
|
+
context.website.logger.warn do
|
215
|
+
["Invalid configuration option '#{key}' for tag '#{tag}' found in <#{context.ref_node}>",
|
216
|
+
"Remove the invalid key '#{key}' to fix the warning."]
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|
220
|
+
result
|
221
|
+
end
|
222
|
+
|
223
|
+
# Return a hash containing valid configuration options by setting the default mandatory
|
224
|
+
# parameter for +tag+ to +str+.
|
225
|
+
def values_from_string(tag, str, tdata, context)
|
226
|
+
if tdata.mandatory.first.nil?
|
227
|
+
context.website.logger.error do
|
228
|
+
["No default mandatory option specified for tag '#{tag}' but set in <#{context.ref_node}>",
|
229
|
+
"Use the {key: value} syntax for assigning the value '#{str}' to the intended tag option!"]
|
230
|
+
end
|
231
|
+
{}
|
232
|
+
else
|
233
|
+
{tdata.mandatory.first => str}
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
# Return the tag data for +tag+ or +nil+ if +tag+ is unknown.
|
238
|
+
def tag_data(tag, context)
|
239
|
+
tdata = @extensions[tag.to_sym] || @extensions[:default]
|
240
|
+
if tdata && !tdata.initialized
|
241
|
+
tdata.object = resolve_class(tdata.object)
|
242
|
+
tdata.mandatory.each_with_index do |o, index|
|
243
|
+
next if context.website.config.option?(o)
|
244
|
+
o = tdata.config_base + '.' + o
|
245
|
+
if context.website.config.option?(o)
|
246
|
+
tdata.mandatory[index] = o
|
247
|
+
else
|
248
|
+
raise ArgumentError, "Invalid configuration option name '#{o}' specified as mandatory option for tag '#{tag}'"
|
249
|
+
end
|
250
|
+
end
|
251
|
+
tdata.initialized = true
|
252
|
+
end
|
253
|
+
tdata
|
254
|
+
end
|
24
255
|
|
25
256
|
end
|
26
257
|
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'webgen/tag'
|
4
|
+
|
5
|
+
module Webgen
|
6
|
+
class Tag
|
7
|
+
|
8
|
+
# Generates a breadcrumb trail for the page. Such a breadcrumb trail is especially useful when
|
9
|
+
# pages are in deep hierarchies of directories.
|
10
|
+
module BreadcrumbTrail
|
11
|
+
|
12
|
+
# Create the breadcrumb trail.
|
13
|
+
def self.call(tag, body, context)
|
14
|
+
options = {
|
15
|
+
:alcn => context.content_node.alcn,
|
16
|
+
:start_level => context[:config]['tag.breadcrumb_trail.start_level'],
|
17
|
+
:end_level => context[:config]['tag.breadcrumb_trail.end_level'],
|
18
|
+
:omit_dir_index => context[:config]['tag.breadcrumb_trail.omit_dir_index']
|
19
|
+
}
|
20
|
+
context.website.ext.item_tracker.add(context.dest_node, :nodes,
|
21
|
+
['Webgen::Tag::BreadcrumbTrail', 'nodes'], options, :meta_info)
|
22
|
+
|
23
|
+
context[:nodes] = nodes(context.website, options)
|
24
|
+
Webgen::Tag.render_tag_template(context, 'breadcrumb_trail')
|
25
|
+
end
|
26
|
+
|
27
|
+
# Return the list of nodes that make up the breadcrumb trail of a node while respecting the
|
28
|
+
# parameters.
|
29
|
+
#
|
30
|
+
# The options hash needs to include the following keys:
|
31
|
+
#
|
32
|
+
# [:alcn]
|
33
|
+
# The alcn of the node for which the breadcrumb trail should be generated.
|
34
|
+
#
|
35
|
+
# [:start_level]
|
36
|
+
# The start level (an index into an array).
|
37
|
+
#
|
38
|
+
# [:end_level]
|
39
|
+
# The end level (an index into an array).
|
40
|
+
#
|
41
|
+
# [:omit_dir_index]
|
42
|
+
# If set, omits the last path component if it is a directory index.
|
43
|
+
#
|
44
|
+
def self.nodes(website, options)
|
45
|
+
node = website.tree[options[:alcn]]
|
46
|
+
nodes = []
|
47
|
+
omit_dir_index = if node.meta_info.has_key?('omit_dir_index')
|
48
|
+
node['omit_dir_index']
|
49
|
+
else
|
50
|
+
options[:omit_dir_index]
|
51
|
+
end
|
52
|
+
|
53
|
+
node = node.parent if omit_dir_index && node.parent.proxy_node(node.lang) == node
|
54
|
+
|
55
|
+
until node == website.tree.dummy_root
|
56
|
+
nodes.unshift(node)
|
57
|
+
node = node.parent
|
58
|
+
end
|
59
|
+
nodes[options[:start_level]..options[:end_level]].to_a
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
end
|
data/lib/webgen/tag/coderay.rb
CHANGED
@@ -1,42 +1,39 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
class
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
options
|
3
|
+
webgen_require 'coderay'
|
4
|
+
|
5
|
+
module Webgen
|
6
|
+
class Tag
|
7
|
+
|
8
|
+
# Provides syntax highlighting via the +coderay+ library.
|
9
|
+
module Coderay
|
10
|
+
|
11
|
+
# Highlight the body of the block.
|
12
|
+
def self.call(tag, body, context)
|
13
|
+
config = context[:config]
|
14
|
+
|
15
|
+
options = {}
|
16
|
+
if config['tag.coderay.css'].to_s == 'other'
|
17
|
+
options[:css] = :class
|
18
|
+
elsif config['tag.coderay.css'].to_s == 'class'
|
19
|
+
options[:css] = :class
|
20
|
+
context.html_head.link_file(:css, '/stylesheets/coderay-default.css')
|
21
|
+
else
|
22
|
+
options[:css] = :style
|
23
|
+
end
|
24
|
+
options.merge!(:wrap => config['tag.coderay.wrap'].to_sym,
|
25
|
+
:line_numbers => (config['tag.coderay.line_numbers'] ? :inline : nil),
|
26
|
+
:line_number_start => config['tag.coderay.line_number_start'],
|
27
|
+
:tab_width => config['tag.coderay.tab_width'],
|
28
|
+
:bold_every => config['tag.coderay.bold_every'])
|
29
|
+
|
30
|
+
if config['tag.coderay.process_body']
|
31
|
+
body = context.website.ext.content_processor.call('tags', context.clone(:content => body)).content
|
32
|
+
end
|
33
|
+
CodeRay.scan(body, config['tag.coderay.lang'].to_sym).html(options)
|
25
34
|
end
|
26
|
-
|
27
|
-
:line_numbers => (param('tag.coderay.line_numbers') ? :inline : nil),
|
28
|
-
:line_number_start => param('tag.coderay.line_number_start'),
|
29
|
-
:tab_width => param('tag.coderay.tab_width'),
|
30
|
-
:bold_every => param('tag.coderay.bold_every'))
|
31
|
-
|
32
|
-
if param('tag.coderay.process_body')
|
33
|
-
body = website.blackboard.invoke(:content_processor, 'tags').call(context.clone(:content => body)).content
|
34
|
-
end
|
35
|
-
CodeRay.scan(body, param('tag.coderay.lang').to_sym).html(options)
|
36
|
-
rescue LoadError
|
37
|
-
raise Webgen::LoadError.new('coderay', self.class.name, context.dest_node, 'coderay')
|
35
|
+
|
38
36
|
end
|
39
37
|
|
40
38
|
end
|
41
|
-
|
42
39
|
end
|