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,160 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'webgen/extension_manager'
|
|
4
|
+
require 'webgen/error'
|
|
5
|
+
|
|
6
|
+
module Webgen
|
|
7
|
+
|
|
8
|
+
# Namespace for all content processors.
|
|
9
|
+
#
|
|
10
|
+
# == About
|
|
11
|
+
#
|
|
12
|
+
# Content processors are used to process the content of paths, normally of paths in Webgen Page
|
|
13
|
+
# Format. However, they can potentially process any type of content, even binary content.
|
|
14
|
+
#
|
|
15
|
+
# == Implementing a content processor
|
|
16
|
+
#
|
|
17
|
+
# A content processor only needs to respond to one method called +call+. This method is invoked
|
|
18
|
+
# with a Webgen::Context object that provides the whole context (especially the content and the
|
|
19
|
+
# node chain) and the method needs to return this object. During processing a content processor
|
|
20
|
+
# normally changes the content of the context but it does not need to.
|
|
21
|
+
#
|
|
22
|
+
# This allows one to implement a content processor as a class with a class method called +call+.
|
|
23
|
+
# Or as a Proc object.
|
|
24
|
+
#
|
|
25
|
+
# The content processor has to be registered so that webgen knows about it, see
|
|
26
|
+
# ContentProcessor.register for more information.
|
|
27
|
+
#
|
|
28
|
+
# == Sample Content Processor
|
|
29
|
+
#
|
|
30
|
+
# The following sample content processor checks for a meta information +replace_key+ and replaces
|
|
31
|
+
# strings of the form 'replace_key:path/to/node' with a link to the specified node if it is found.
|
|
32
|
+
#
|
|
33
|
+
# Note how the content node, the reference node and the destination node are used so that the
|
|
34
|
+
# correct meta information is used, the node is correctly resolved and the correct relative link
|
|
35
|
+
# is calculated respectively!
|
|
36
|
+
#
|
|
37
|
+
# class Replacer
|
|
38
|
+
#
|
|
39
|
+
# def self.call(context)
|
|
40
|
+
# if !context.content_node['replace_key'].to_s.empty?
|
|
41
|
+
# context.content.gsub!(/#{context.content_node['replace_key']}:([\w\/.]+)/ ) do |match|
|
|
42
|
+
# link_node = context.ref_node.resolve($1, context.content_node.lang)
|
|
43
|
+
# if link_node
|
|
44
|
+
# context.dest_node.link_to(link_node, context.content_node.lang)
|
|
45
|
+
# else
|
|
46
|
+
# match
|
|
47
|
+
# end
|
|
48
|
+
# end
|
|
49
|
+
# end
|
|
50
|
+
# context
|
|
51
|
+
# rescue Exception => e
|
|
52
|
+
# raise "Error while replacing special key: #{e.message}"
|
|
53
|
+
# end
|
|
54
|
+
#
|
|
55
|
+
# end
|
|
56
|
+
#
|
|
57
|
+
# website.ext.content_processor.register Replacer, :name => 'replacer'
|
|
58
|
+
#
|
|
59
|
+
class ContentProcessor
|
|
60
|
+
|
|
61
|
+
include Webgen::ExtensionManager
|
|
62
|
+
|
|
63
|
+
# Register a content processor.
|
|
64
|
+
#
|
|
65
|
+
# The parameter +klass+ can either be a String containing the name of a class/module (which has
|
|
66
|
+
# to respond to :call) or an object that responds to :call. If the class is located under this
|
|
67
|
+
# namespace, only the class name without the hierarchy part is needed, otherwise the full
|
|
68
|
+
# class/module name including parent module/class names is needed.
|
|
69
|
+
#
|
|
70
|
+
# Instead of registering an object that responds to \#call, you can also provide a block that
|
|
71
|
+
# has to take one parameter (the context object).
|
|
72
|
+
#
|
|
73
|
+
# === Options:
|
|
74
|
+
#
|
|
75
|
+
# [:name] The name for the content processor. If not set, it defaults to the snake-case version
|
|
76
|
+
# of the class name (without the hierarchy part). It should only contain letters.
|
|
77
|
+
#
|
|
78
|
+
# [:type] Defines which type of content the content processor can process. Can be set to either
|
|
79
|
+
# :text (the default) or :binary.
|
|
80
|
+
#
|
|
81
|
+
# [:ext_map] Defines a mapping of pre-processed file extension names to post-processed
|
|
82
|
+
# file extension names (e.g. {'sass' => 'css'}).
|
|
83
|
+
#
|
|
84
|
+
# === Examples:
|
|
85
|
+
#
|
|
86
|
+
# content_processor.register('Kramdown') # registers Webgen::ContentProcessor::Kramdown
|
|
87
|
+
#
|
|
88
|
+
# content_processor.register('::Kramdown') # registers Kramdown !!!
|
|
89
|
+
#
|
|
90
|
+
# content_processor.register('MyModule::Doit', type: :binary)
|
|
91
|
+
#
|
|
92
|
+
# content_processor.register('doit') do |context|
|
|
93
|
+
# context.content = 'Nothing left.'
|
|
94
|
+
# end
|
|
95
|
+
#
|
|
96
|
+
def register(klass, options={}, &block)
|
|
97
|
+
name = do_register(klass, options, true, &block)
|
|
98
|
+
ext_data(name).type = options[:type] || :text
|
|
99
|
+
ext_data(name).extension_map = options[:ext_map] || {}
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Call the content processor object identified by the given name with the given context.
|
|
103
|
+
def call(name, context)
|
|
104
|
+
extension(name).call(context)
|
|
105
|
+
rescue Webgen::Error => e
|
|
106
|
+
e.path = context.dest_node if e.path.to_s.empty?
|
|
107
|
+
raise
|
|
108
|
+
rescue Exception => e
|
|
109
|
+
ext = extension(name)
|
|
110
|
+
raise Webgen::RenderError.new(e, (ext.respond_to?(:name) ? ext.name : nil), context.dest_node)
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Normalize the content processor pipeline.
|
|
114
|
+
#
|
|
115
|
+
# The pipeline parameter can be a String in the format 'a,b,c' or 'a, b, c' or an array '[a, b,
|
|
116
|
+
# c]' with content processors a, b and c.
|
|
117
|
+
#
|
|
118
|
+
# Raises an error if an unknown content processor is found.
|
|
119
|
+
#
|
|
120
|
+
# Returns an array with valid content processors.
|
|
121
|
+
def normalize_pipeline(pipeline)
|
|
122
|
+
pipeline = (pipeline.kind_of?(String) ? pipeline.split(/,\s*/) : pipeline)
|
|
123
|
+
pipeline.each do |processor|
|
|
124
|
+
raise Webgen::Error.new("Unknown content processor '#{processor}'") if !registered?(processor)
|
|
125
|
+
end
|
|
126
|
+
pipeline
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
# Return whether the content processor is processing binary data.
|
|
130
|
+
def is_binary?(name)
|
|
131
|
+
registered?(name) && ext_data(name).type == :binary
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
# Return the mapping of pre-processed file extension names to post-processed file extension
|
|
135
|
+
# names for the given content processor or a combination of all mappings if +name+ is +nil+.
|
|
136
|
+
#
|
|
137
|
+
# An empty map is returned if the content processor is not registered.
|
|
138
|
+
def extension_map(name = nil)
|
|
139
|
+
if name.nil?
|
|
140
|
+
@extension_map ||= registered_extensions.inject({}) {|hash, data| hash.update(data.last.extension_map)}
|
|
141
|
+
elsif registered?(name)
|
|
142
|
+
ext_data(name).extension_map
|
|
143
|
+
else
|
|
144
|
+
{}
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
# Return the content processor name and the mapped extension of a pre-processed file extension
|
|
149
|
+
# or +nil+ if the extension cannot be mapped.
|
|
150
|
+
def map_extension(ext)
|
|
151
|
+
registered_extensions.each do |name, data|
|
|
152
|
+
mapped_ext = data.extension_map[ext]
|
|
153
|
+
return [name, mapped_ext] if mapped_ext
|
|
154
|
+
end
|
|
155
|
+
nil
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'webgen/content_processor'
|
|
4
|
+
require 'webgen/error'
|
|
5
|
+
|
|
6
|
+
module Webgen
|
|
7
|
+
class ContentProcessor
|
|
8
|
+
|
|
9
|
+
# Replaces special XML tags with the rendered content of a node block.
|
|
10
|
+
#
|
|
11
|
+
# The module provides a ::call method so that it can be used by the content processor extension.
|
|
12
|
+
# However, it also provides the ::render_block method that contains the actual logic for
|
|
13
|
+
# rendering a block of a node given a render context.
|
|
14
|
+
module Blocks
|
|
15
|
+
|
|
16
|
+
BLOCK_RE = /<webgen:block\s*?((?:\s\w+=('|")[^'"]+\2)+)\s*\/>/ # :nodoc:
|
|
17
|
+
BLOCK_ATTR_RE = /(\w+)=('|")([^'"]+)\2/ # :nodoc:
|
|
18
|
+
|
|
19
|
+
# Replace the webgen:block xml tags with the rendered content of the specified node.
|
|
20
|
+
def self.call(context)
|
|
21
|
+
context.content.gsub!(BLOCK_RE) do |match|
|
|
22
|
+
attr = {}
|
|
23
|
+
match_object = $~
|
|
24
|
+
attr[:line_nr_proc] = lambda { match_object.pre_match.scan("\n").size + 1 }
|
|
25
|
+
match.scan(BLOCK_ATTR_RE) {|name, sep, content| attr[name.to_sym] = content}
|
|
26
|
+
render_block(context, attr)
|
|
27
|
+
end
|
|
28
|
+
context
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# Render a block of a page node and return the result.
|
|
32
|
+
#
|
|
33
|
+
# The Webgen::Context object +context+ is used as the render context and the +options+ hash
|
|
34
|
+
# needs to hold all relevant information, that is:
|
|
35
|
+
#
|
|
36
|
+
# [:name (mandatory)]
|
|
37
|
+
# The name of the block that should be used.
|
|
38
|
+
#
|
|
39
|
+
# [:chain]
|
|
40
|
+
# The node chain used for rendering. If this is not specified, the node chain from the
|
|
41
|
+
# context is used. It needs to be a String in the format '(A)LCN;(A)LCN;...' or an array of
|
|
42
|
+
# nodes.
|
|
43
|
+
#
|
|
44
|
+
# [:node]
|
|
45
|
+
# Defines which node in the node chain should be used. Valid values are +next+ (= default
|
|
46
|
+
# value; the next node in the node chain), +first+ (the first node in the node chain with a
|
|
47
|
+
# block called +name+) or +current+ (the currently rendered node, ignores the +chain+ option).
|
|
48
|
+
#
|
|
49
|
+
# [:notfound]
|
|
50
|
+
# If this property is set to +ignore+, a missing block will not raise an error. It is unset by
|
|
51
|
+
# default, so missing blocks will raise errors.
|
|
52
|
+
#
|
|
53
|
+
def self.render_block(context, options)
|
|
54
|
+
if options[:chain].nil?
|
|
55
|
+
used_chain = (context[:chain].length > 1 ? context[:chain][1..-1] : context[:chain].dup)
|
|
56
|
+
elsif options[:chain].kind_of?(Array)
|
|
57
|
+
used_chain = options[:chain]
|
|
58
|
+
dest_node = context.dest_node
|
|
59
|
+
else
|
|
60
|
+
paths = options[:chain].split(';')
|
|
61
|
+
used_chain = paths.collect do |path|
|
|
62
|
+
context.ref_node.resolve(path.strip, context.dest_node.lang, true)
|
|
63
|
+
end.compact
|
|
64
|
+
return '' if used_chain.length != paths.length
|
|
65
|
+
dest_node = context.dest_node
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
if options[:node] == 'first'
|
|
69
|
+
used_chain.shift while used_chain.length > 0 && !used_chain.first.blocks.has_key?(options[:name])
|
|
70
|
+
elsif options[:node] == 'current'
|
|
71
|
+
used_chain = context[:chain].dup
|
|
72
|
+
end
|
|
73
|
+
block_node = used_chain.first
|
|
74
|
+
|
|
75
|
+
if !block_node || !block_node.blocks.has_key?(options[:name])
|
|
76
|
+
if options[:notfound] == 'ignore'
|
|
77
|
+
return ''
|
|
78
|
+
elsif block_node
|
|
79
|
+
raise Webgen::RenderError.new("No block named '#{options[:name]}' found in <#{block_node}>",
|
|
80
|
+
self.name, context.dest_node,
|
|
81
|
+
context.ref_node, (options[:line_nr_proc].call if options[:line_nr_proc]))
|
|
82
|
+
else
|
|
83
|
+
raise Webgen::RenderError.new("No node in the render chain has a block named '#{options[:name]}'",
|
|
84
|
+
self.name, context.dest_node,
|
|
85
|
+
context.ref_node, (options[:line_nr_proc].call if options[:line_nr_proc]))
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
tmp_context = block_node.render_block(options[:name], context.clone(:chain => used_chain, :dest_node => dest_node))
|
|
90
|
+
tmp_context.content
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'webgen/content_processor'
|
|
4
|
+
webgen_require 'builder'
|
|
5
|
+
|
|
6
|
+
module Webgen
|
|
7
|
+
class ContentProcessor
|
|
8
|
+
|
|
9
|
+
# Processes content that is valid Ruby to build an XML tree. This is done by using the +builder+
|
|
10
|
+
# library.
|
|
11
|
+
module Builder
|
|
12
|
+
|
|
13
|
+
# Process the content of +context+ which needs to be valid Ruby code. The special variable +xml+
|
|
14
|
+
# should be used to construct the XML content.
|
|
15
|
+
def self.call(context)
|
|
16
|
+
xml = ::Builder::XmlMarkup.new(:indent => 2)
|
|
17
|
+
eval(context.content, binding, context.ref_node.alcn)
|
|
18
|
+
context.content = xml.target!
|
|
19
|
+
context
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'webgen/content_processor'
|
|
4
|
+
require 'erb'
|
|
5
|
+
|
|
6
|
+
module Webgen
|
|
7
|
+
class ContentProcessor
|
|
8
|
+
|
|
9
|
+
# Processes embedded Ruby statements.
|
|
10
|
+
module Erb
|
|
11
|
+
|
|
12
|
+
extend ERB::Util
|
|
13
|
+
|
|
14
|
+
# Process the Ruby statements embedded in the content of +context+.
|
|
15
|
+
def self.call(context)
|
|
16
|
+
erb = ERB.new(context.content)
|
|
17
|
+
erb.filename = context.ref_node.alcn
|
|
18
|
+
context.content = erb.result(binding)
|
|
19
|
+
context
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'webgen/content_processor'
|
|
4
|
+
webgen_require 'erubis'
|
|
5
|
+
|
|
6
|
+
module Webgen
|
|
7
|
+
class ContentProcessor
|
|
8
|
+
|
|
9
|
+
# Processes embedded Ruby statements with the +erubis+ library.
|
|
10
|
+
module Erubis
|
|
11
|
+
|
|
12
|
+
# Including Erubis because of problem with resolving Erubis::XmlHelper et al
|
|
13
|
+
include ::Erubis
|
|
14
|
+
|
|
15
|
+
# Process the Ruby statements embedded in the content of +context+.
|
|
16
|
+
def self.call(context)
|
|
17
|
+
options = context.website.config['content_processor.erubis.options']
|
|
18
|
+
erubis = if context.website.config['content_processor.erubis.use_pi']
|
|
19
|
+
::Erubis::PI::Eruby.new(context.content, options)
|
|
20
|
+
else
|
|
21
|
+
::Erubis::Eruby.new(context.content, options)
|
|
22
|
+
end
|
|
23
|
+
erubis.filename = context.ref_node.alcn
|
|
24
|
+
context.content = erubis.result(binding)
|
|
25
|
+
context
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'webgen/content_processor'
|
|
4
|
+
require 'webgen/path'
|
|
5
|
+
|
|
6
|
+
module Webgen
|
|
7
|
+
class ContentProcessor
|
|
8
|
+
|
|
9
|
+
# Uses the HTML headers h1, h2, ..., h6 (only those with valid IDs) to generate nested fragment
|
|
10
|
+
# nodes.
|
|
11
|
+
module Fragments
|
|
12
|
+
|
|
13
|
+
# Create the nested fragment nodes from the content under the content node but only if there
|
|
14
|
+
# is no associated block or the block is named +content+.
|
|
15
|
+
def self.call(context)
|
|
16
|
+
if !context[:block_name] || context[:block_name] == 'content'
|
|
17
|
+
sections = parse_html_headers(context.content)
|
|
18
|
+
create_fragment_nodes(context, sections, context.content_node)
|
|
19
|
+
end
|
|
20
|
+
context
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
HTML_HEADER_REGEXP = /<h([123456])(?:>|\s([^>]*)>)(.*?)<\/h\1\s*>/i
|
|
24
|
+
HTML_ATTR_REGEXP = /\s*(\w+)\s*=\s*('|")(.+?)\2\s*/
|
|
25
|
+
|
|
26
|
+
# Parse the string +content+ for headers +h1+, ..., +h6+ and return the found, nested
|
|
27
|
+
# sections.
|
|
28
|
+
#
|
|
29
|
+
# Only those headers are used which have an +id+ attribute set. The method returns a list of
|
|
30
|
+
# arrays with entries 'level, id, title, sub sections' where 'sub sections' is such a list
|
|
31
|
+
# again.
|
|
32
|
+
def self.parse_html_headers(content)
|
|
33
|
+
sections = []
|
|
34
|
+
stack = []
|
|
35
|
+
content.scan(HTML_HEADER_REGEXP).each do |level,attrs,title|
|
|
36
|
+
next if attrs.nil?
|
|
37
|
+
id_attr = attrs.scan(HTML_ATTR_REGEXP).find {|name,sep,value| name == 'id'}
|
|
38
|
+
next if id_attr.nil?
|
|
39
|
+
id = id_attr[2]
|
|
40
|
+
|
|
41
|
+
section = [level.to_i, id, title, []]
|
|
42
|
+
success = false
|
|
43
|
+
while !success
|
|
44
|
+
if stack.empty?
|
|
45
|
+
sections << section
|
|
46
|
+
stack << section
|
|
47
|
+
success = true
|
|
48
|
+
elsif stack.last.first < section.first
|
|
49
|
+
stack.last.last << section
|
|
50
|
+
stack << section
|
|
51
|
+
success = true
|
|
52
|
+
else
|
|
53
|
+
stack.pop
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
sections
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Create nested fragment nodes under +parent+ from +sections+ (which can be created using
|
|
61
|
+
# #parse_html_headers).
|
|
62
|
+
#
|
|
63
|
+
# The meta info +sort_info+ is calculated from the base +si+ value.
|
|
64
|
+
def self.create_fragment_nodes(context, sections, parent, si = 1000)
|
|
65
|
+
sections.each do |level, id, title, sub_sections|
|
|
66
|
+
path = Webgen::Path.new(parent.alcn.sub(/#.*$/, '') + '#' + id)
|
|
67
|
+
path['parent_alcn'] = parent.alcn
|
|
68
|
+
path['handler'] = 'copy'
|
|
69
|
+
path['pipeline'] = []
|
|
70
|
+
path['no_output'] = true
|
|
71
|
+
path['title'] = title
|
|
72
|
+
path['sort_info'] = si = si.succ
|
|
73
|
+
node = context.website.ext.path_handler.create_secondary_nodes(path, '', context.content_node.alcn).first
|
|
74
|
+
|
|
75
|
+
create_fragment_nodes(context, sub_sections, node, si.succ)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'webgen/content_processor'
|
|
4
|
+
webgen_require 'haml'
|
|
5
|
+
|
|
6
|
+
module Webgen
|
|
7
|
+
class ContentProcessor
|
|
8
|
+
|
|
9
|
+
# Processes content in Haml markup using the +haml+ library.
|
|
10
|
+
module Haml
|
|
11
|
+
|
|
12
|
+
# Convert the content in +haml+ markup to HTML.
|
|
13
|
+
def self.call(context)
|
|
14
|
+
context.content = ::Haml::Engine.new(context.content, :filename => context.ref_node.alcn).
|
|
15
|
+
render(Object.new, :context => context)
|
|
16
|
+
context
|
|
17
|
+
rescue ::Haml::Error => e
|
|
18
|
+
line = (e.line ? e.line + 1 : Webgen::Error.error_line(e))
|
|
19
|
+
raise Webgen::RenderError.new(e, self.class.name, context.dest_node, nil, line)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
end
|