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,23 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'webgen/content_processor/sass'
|
|
4
|
+
|
|
5
|
+
module Webgen
|
|
6
|
+
class ContentProcessor
|
|
7
|
+
|
|
8
|
+
# Processes content in sassy CSS markup (used for writing CSS files) using the +sass+ library.
|
|
9
|
+
module Scss
|
|
10
|
+
|
|
11
|
+
# Convert the content in +scss+ markup to CSS.
|
|
12
|
+
def self.call(context)
|
|
13
|
+
options = Webgen::ContentProcessor::Sass.default_options(context).merge(:syntax => :scss)
|
|
14
|
+
context.content = ::Sass::Engine.new(context.content, options).render
|
|
15
|
+
context
|
|
16
|
+
rescue ::Sass::SyntaxError => e
|
|
17
|
+
raise Webgen::RenderError.new(e, self.class.name, context.dest_node, nil, (e.sass_line if e.sass_line))
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'webgen/content_processor'
|
|
4
|
+
|
|
5
|
+
module Webgen
|
|
6
|
+
class ContentProcessor
|
|
7
|
+
|
|
8
|
+
# Processes special webgen tags to provide dynamic content.
|
|
9
|
+
#
|
|
10
|
+
# webgen tags are an easy way to add dynamically generated content to websites, for example menus
|
|
11
|
+
# or breadcrumb trails.
|
|
12
|
+
#
|
|
13
|
+
# See Webgen::Tag and all the classes in its namespace for further information.
|
|
14
|
+
module Tags
|
|
15
|
+
|
|
16
|
+
# Replace all webgen tags in the content of +context+ with the rendered content.
|
|
17
|
+
def self.call(context)
|
|
18
|
+
context.website.ext.tag.replace_tags(context.content) do |tag, params, body|
|
|
19
|
+
context.website.logger.debug do
|
|
20
|
+
"Replacing tag #{tag} with data #{params.inspect} and body '#{body}' in <#{context.ref_node}>"
|
|
21
|
+
end
|
|
22
|
+
context.website.ext.tag.call(tag, params, body, context)
|
|
23
|
+
end
|
|
24
|
+
context
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'webgen/content_processor'
|
|
4
|
+
require 'webgen/utils/external_command'
|
|
5
|
+
|
|
6
|
+
module Webgen
|
|
7
|
+
class ContentProcessor
|
|
8
|
+
|
|
9
|
+
# Uses the external +tidy+ program to format the content as valid (X)HTML.
|
|
10
|
+
module Tidy
|
|
11
|
+
|
|
12
|
+
# Process the content of +context+ with the +tidy+ program.
|
|
13
|
+
def self.call(context)
|
|
14
|
+
Webgen::Utils::ExternalCommand.ensure_available!('tidy', '-v')
|
|
15
|
+
|
|
16
|
+
cmd = "tidy -q #{context.website.config['content_processor.tidy.options']}"
|
|
17
|
+
status, stdout, stderr = systemu(cmd, 'stdin' => context.content)
|
|
18
|
+
if status.exitstatus != 0
|
|
19
|
+
stderr.split(/\n/).each do |line|
|
|
20
|
+
context.website.logger.send(status.exitstatus == 1 ? :warn : :error) do
|
|
21
|
+
"Tidy reported problems for <#{context.dest_node.alcn}>: #{line}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
context.content = stdout
|
|
26
|
+
context
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'erb'
|
|
4
|
+
require 'tempfile'
|
|
5
|
+
require 'fileutils'
|
|
6
|
+
require 'webgen/content_processor'
|
|
7
|
+
require 'webgen/utils/external_command'
|
|
8
|
+
|
|
9
|
+
Webgen::Utils::ExternalCommand.ensure_available!('pdflatex', '-v')
|
|
10
|
+
Webgen::Utils::ExternalCommand.ensure_available!('pdfcrop', '--version')
|
|
11
|
+
Webgen::Utils::ExternalCommand.ensure_available!('gs', '-v')
|
|
12
|
+
Webgen::Utils::ExternalCommand.ensure_available!('convert', '-version')
|
|
13
|
+
Webgen::Utils::ExternalCommand.ensure_available!('identify', '-version')
|
|
14
|
+
|
|
15
|
+
module Webgen
|
|
16
|
+
class ContentProcessor
|
|
17
|
+
|
|
18
|
+
# Uses LaTeX and the TikZ library for creating images from LaTeX code.
|
|
19
|
+
module Tikz
|
|
20
|
+
|
|
21
|
+
LATEX_TEMPLATE = <<EOF
|
|
22
|
+
\\nonstopmode \\documentclass{article} \\usepackage{tikz} \\pagestyle{empty}
|
|
23
|
+
<% if context['content_processor.tikz.libraries'] %>
|
|
24
|
+
\\usetikzlibrary{<%= context['content_processor.tikz.libraries'].join(',') %>}
|
|
25
|
+
<% end %>
|
|
26
|
+
\\begin{document}
|
|
27
|
+
\\begin{tikzpicture}[<%= context['content_processor.tikz.opts'] %>]
|
|
28
|
+
<%= context.content %>
|
|
29
|
+
\\end{tikzpicture}
|
|
30
|
+
\\end{document}
|
|
31
|
+
EOF
|
|
32
|
+
|
|
33
|
+
# Process the content with LaTeX to generate a TikZ image.
|
|
34
|
+
def self.call(context)
|
|
35
|
+
prepare_options(context)
|
|
36
|
+
context.content = ERB.new(LATEX_TEMPLATE).result(binding)
|
|
37
|
+
context.content = File.binread(compile(context))
|
|
38
|
+
context
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Collect the necessary options and save them in the context object.
|
|
42
|
+
def self.prepare_options(context)
|
|
43
|
+
%w[content_processor.tikz.resolution content_processor.tikz.transparent
|
|
44
|
+
content_processor.tikz.libraries content_processor.tikz.opts].each do |opt|
|
|
45
|
+
context[opt] = context.content_node[opt] || context.website.config[opt]
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
private_class_method :prepare_options
|
|
49
|
+
|
|
50
|
+
# Compile the LaTeX document stored in the Context and convert the resulting PDF to the
|
|
51
|
+
# correct output image format specified by context[:ext] (the extension needs to include the
|
|
52
|
+
# dot).
|
|
53
|
+
#
|
|
54
|
+
# Returns the path to the created image.
|
|
55
|
+
def self.compile(context)
|
|
56
|
+
cwd = context.website.tmpdir('content_processor.tikz')
|
|
57
|
+
FileUtils.mkdir_p(cwd)
|
|
58
|
+
tempfile = Tempfile.open(['webgen-tikz', '.tex'], cwd)
|
|
59
|
+
tempfile.write(context.content)
|
|
60
|
+
tempfile.close
|
|
61
|
+
|
|
62
|
+
file = File.basename(tempfile.path, '.tex')
|
|
63
|
+
ext = File.extname(context.dest_node.dest_path)
|
|
64
|
+
render_res, output_res = context['content_processor.tikz.resolution'].split(' ')
|
|
65
|
+
|
|
66
|
+
execute("pdflatex --shell-escape -interaction=batchmode #{file}.tex", cwd, context) do |status, stdout, stderr|
|
|
67
|
+
errors = stderr.scan(/^!(.*\n.*)/).join("\n")
|
|
68
|
+
raise Webgen::RenderError.new("Error while parsing TikZ picture commands with PDFLaTeX: #{errors}",
|
|
69
|
+
self.name, context.dest_node, context.ref_node)
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
execute("pdfcrop #{file}.pdf #{file}.pdf", cwd, context)
|
|
73
|
+
|
|
74
|
+
if context['content_processor.tikz.transparent'] && ext =~ /\.png/i
|
|
75
|
+
cmd = "gs -dSAFER -dBATCH -dNOPAUSE -r#{render_res} -sDEVICE=pngalpha -dGraphicsAlphaBits=4 " +
|
|
76
|
+
"-dTextAlphaBits=4 -sOutputFile=#{file}#{ext} #{file}.pdf"
|
|
77
|
+
else
|
|
78
|
+
cmd = "convert -density #{render_res} #{file}.pdf #{file}#{ext}"
|
|
79
|
+
end
|
|
80
|
+
execute(cmd, cwd, context)
|
|
81
|
+
|
|
82
|
+
if render_res != output_res
|
|
83
|
+
status, stdout, stderr = execute("identify #{file}#{ext}", cwd, context)
|
|
84
|
+
width, height = stdout.scan(/\s\d+x\d+\s/).first.strip.split('x').collect do |s|
|
|
85
|
+
s.to_f * output_res.to_f / render_res.to_f
|
|
86
|
+
end
|
|
87
|
+
execute("convert -resize #{width}x#{height} #{file}#{ext} #{file}#{ext}", cwd, context)
|
|
88
|
+
end
|
|
89
|
+
File.join(cwd, file + ext)
|
|
90
|
+
end
|
|
91
|
+
private_class_method :compile
|
|
92
|
+
|
|
93
|
+
# Execute the command +cmd+ in the working directory +cwd+.
|
|
94
|
+
#
|
|
95
|
+
# If the exit status is not zero, yields to the given block if one is given, or raises an error
|
|
96
|
+
# otherwise.
|
|
97
|
+
#
|
|
98
|
+
# Returns [status, stdout, stderr]
|
|
99
|
+
def self.execute(cmd, cwd, context)
|
|
100
|
+
status, stdout, stderr = systemu(cmd, :cwd => cwd)
|
|
101
|
+
if status.exitstatus != 0
|
|
102
|
+
if block_given?
|
|
103
|
+
yield(status, stdout, stderr)
|
|
104
|
+
else
|
|
105
|
+
raise Webgen::RenderError.new("Error while running a command for a TikZ picture: #{stdout + "\n" + stderr}",
|
|
106
|
+
self.name, context.dest_node, context.ref_node)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
[status, stdout, stderr]
|
|
110
|
+
end
|
|
111
|
+
private_class_method :execute
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'webgen/content_processor'
|
|
4
|
+
require 'webgen/utils/external_command'
|
|
5
|
+
|
|
6
|
+
module Webgen
|
|
7
|
+
class ContentProcessor
|
|
8
|
+
|
|
9
|
+
# Uses the external +xmllint+ program to check if the content is valid (X)HTML.
|
|
10
|
+
module Xmllint
|
|
11
|
+
|
|
12
|
+
# Checks the content of +context+ with the +xmllint+ program for validness.
|
|
13
|
+
def self.call(context)
|
|
14
|
+
Webgen::Utils::ExternalCommand.ensure_available!('xmllint', '--version')
|
|
15
|
+
|
|
16
|
+
cmd = "xmllint #{context.website.config['content_processor.xmllint.options']} -"
|
|
17
|
+
status, stdout, stderr = systemu(cmd, 'stdin' => context.content)
|
|
18
|
+
if status.exitstatus != 0
|
|
19
|
+
stderr.scan(/^-:(\d+):(.*?\n)(.*?\n)/).each do |line, error_msg, line_context|
|
|
20
|
+
context.website.logger.warn do
|
|
21
|
+
"xmllint reported problems for <#{context.dest_node.alcn}:~#{line}>: #{error_msg.strip} (context: #{line_context.strip})"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
context
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
end
|
data/lib/webgen/context.rb
CHANGED
|
@@ -1,60 +1,88 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
|
-
require 'webgen/context/nodes'
|
|
3
|
-
require 'webgen/context/tags'
|
|
4
|
-
require 'webgen/context/render'
|
|
5
2
|
|
|
6
3
|
module Webgen
|
|
7
4
|
|
|
8
5
|
# This class represents the context object that is passed, for example, to the +call+ method of a
|
|
9
6
|
# content processor.
|
|
10
7
|
#
|
|
11
|
-
#
|
|
12
|
-
# however, there are three noteworthy options:
|
|
8
|
+
# == About
|
|
13
9
|
#
|
|
14
|
-
#
|
|
15
|
-
#
|
|
10
|
+
# A context object provides information about the render context as well as access to the website
|
|
11
|
+
# that is rendered. The needed context variables are stored in the +options+ hash. You can set any
|
|
12
|
+
# options you like, however, there are two noteworthy options:
|
|
16
13
|
#
|
|
17
|
-
# [
|
|
18
|
-
#
|
|
19
|
-
# processors.
|
|
14
|
+
# [:content]
|
|
15
|
+
# The content string that should be processed. This option is always set.
|
|
20
16
|
#
|
|
21
|
-
# [
|
|
17
|
+
# [:chain]
|
|
22
18
|
# The chain of nodes that is processed. There are some utiltity methods for getting
|
|
23
|
-
# special nodes of the chain (see #ref_node, #content_node and #dest_node).
|
|
19
|
+
# special nodes of the chain (see Nodes#ref_node, Nodes#content_node and Nodes#dest_node).
|
|
24
20
|
#
|
|
25
21
|
# The +persistent+ options hash is shared by all cloned Context objects.
|
|
22
|
+
#
|
|
23
|
+
# == Adding custom methods
|
|
24
|
+
#
|
|
25
|
+
# If you want to add custom methods to each context object of your website that is created, you
|
|
26
|
+
# just need to define one or more modules in which your custom methods are defined and then add
|
|
27
|
+
# the modules to the 'website.ext.context_modules' array.
|
|
28
|
+
#
|
|
29
|
+
# Here is a simple example:
|
|
30
|
+
#
|
|
31
|
+
# module MyContextMethods
|
|
32
|
+
#
|
|
33
|
+
# def my_method
|
|
34
|
+
# # do something useful here
|
|
35
|
+
# end
|
|
36
|
+
#
|
|
37
|
+
# end
|
|
38
|
+
#
|
|
39
|
+
# website.ext.context_modules << MyContextMethods
|
|
40
|
+
#
|
|
26
41
|
class Context
|
|
27
42
|
|
|
28
|
-
|
|
29
|
-
|
|
43
|
+
require 'webgen/context/nodes'
|
|
44
|
+
require 'webgen/context/webgen_tags'
|
|
45
|
+
require 'webgen/context/rendering'
|
|
46
|
+
require 'webgen/context/html_head'
|
|
47
|
+
|
|
48
|
+
include Nodes
|
|
49
|
+
include WebgenTags
|
|
50
|
+
include Rendering
|
|
51
|
+
include HtmlHead
|
|
52
|
+
|
|
30
53
|
|
|
31
54
|
# The persistent options. Once initialized, all cloned objects refer to the same hash.
|
|
32
55
|
attr_reader :persistent
|
|
33
56
|
|
|
34
57
|
# Processing options.
|
|
35
|
-
|
|
58
|
+
attr_reader :options
|
|
36
59
|
|
|
37
|
-
#
|
|
60
|
+
# The website object to which the render context belongs.
|
|
61
|
+
attr_reader :website
|
|
62
|
+
|
|
63
|
+
# Create a new Context object belonging to the website object +website+.
|
|
64
|
+
#
|
|
65
|
+
# All modules listed in the array 'website.ext.context_modules' are automatically used to extend
|
|
66
|
+
# the Context object.
|
|
38
67
|
#
|
|
39
68
|
# The following options are set by default and can be overridden via the +options+ hash:
|
|
40
69
|
#
|
|
41
|
-
# [
|
|
70
|
+
# [:content]
|
|
42
71
|
# Is set to an empty string.
|
|
43
72
|
#
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
@options = {
|
|
48
|
-
:content => '',
|
|
49
|
-
:processors => Webgen::ContentProcessor::AccessHash.new
|
|
50
|
-
}.merge(options)
|
|
73
|
+
def initialize(website, options = {}, persistent = {})
|
|
74
|
+
@website = website
|
|
75
|
+
(website.ext.context_modules || []).each {|m| self.extend(m)}
|
|
76
|
+
@options = {:content => ''}.merge(options)
|
|
51
77
|
@persistent = persistent
|
|
52
78
|
end
|
|
53
79
|
|
|
54
|
-
# Create a copy of the current object.
|
|
55
|
-
#
|
|
80
|
+
# Create a copy of the current object.
|
|
81
|
+
#
|
|
82
|
+
# You can use the +options+ parameter to override options of the current Context object in the
|
|
83
|
+
# newly created Context object.
|
|
56
84
|
def clone(options = {})
|
|
57
|
-
self.class.new(@options.merge(options), @persistent)
|
|
85
|
+
self.class.new(@website, @options.merge(options), @persistent)
|
|
58
86
|
end
|
|
59
87
|
|
|
60
88
|
# Return the value of the option +name+.
|
|
@@ -67,12 +95,12 @@ module Webgen
|
|
|
67
95
|
@options[name] = value
|
|
68
96
|
end
|
|
69
97
|
|
|
70
|
-
# Return the
|
|
98
|
+
# Return the :content option.
|
|
71
99
|
def content
|
|
72
100
|
@options[:content]
|
|
73
101
|
end
|
|
74
102
|
|
|
75
|
-
# Set the
|
|
103
|
+
# Set the :content option to the given +value+.
|
|
76
104
|
def content=(value)
|
|
77
105
|
@options[:content] = value
|
|
78
106
|
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
require 'webgen/error'
|
|
4
|
+
|
|
5
|
+
module Webgen
|
|
6
|
+
class Context
|
|
7
|
+
|
|
8
|
+
# Provides methods for adding data for Webgen::ContentProcessor::HtmlHead.
|
|
9
|
+
module HtmlHead
|
|
10
|
+
|
|
11
|
+
# Proxy object for working with the data structure needed by
|
|
12
|
+
# Webgen::ContentProcessor::HtmlHead.
|
|
13
|
+
class Proxy
|
|
14
|
+
|
|
15
|
+
def initialize(context) #:nodoc:
|
|
16
|
+
@context = context
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Add a link to the given file in the HTML head section.
|
|
20
|
+
#
|
|
21
|
+
# The type can either be :css for CSS files or :js for javascript files. The path to the
|
|
22
|
+
# file is resolved using the "relocatable" tag (see Webgen::Tag::Relocatable).
|
|
23
|
+
def link_file(type, file)
|
|
24
|
+
type_check!(type)
|
|
25
|
+
(cp_hash["#{type}_file".intern] ||= []) << @context.tag('relocatable', file)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Add inline CSS or JS fragments to the HTML head section.
|
|
29
|
+
#
|
|
30
|
+
# The type can either be :css for a CSS fragment or :js for a javascript fragment.
|
|
31
|
+
def inline_fragment(type, content)
|
|
32
|
+
type_check!(type)
|
|
33
|
+
(cp_hash["#{type}_inline".intern] ||= []) << content
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def type_check!(type) #:nodoc:
|
|
37
|
+
if ![:css, :js].include?(type)
|
|
38
|
+
raise Webgen::RenderError.new("Type must either be :css or :js, not #{type}",
|
|
39
|
+
self.class.name, @context.dest_node, @context.ref_node)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
private :type_check!
|
|
43
|
+
|
|
44
|
+
def cp_hash #:nodoc:
|
|
45
|
+
@context.persistent[:cp_html_head] ||= {}
|
|
46
|
+
end
|
|
47
|
+
private :cp_hash
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Return the Proxy object for adding data to the context for
|
|
52
|
+
# Webgen::ContentProcessor::HtmlHead.
|
|
53
|
+
def html_head
|
|
54
|
+
Proxy.new(self)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
end
|
|
60
|
+
end
|
data/lib/webgen/context/nodes.rb
CHANGED
|
@@ -1,36 +1,41 @@
|
|
|
1
|
-
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
|
2
2
|
|
|
3
|
+
module Webgen
|
|
3
4
|
class Context
|
|
4
5
|
|
|
5
|
-
#
|
|
6
|
-
|
|
7
|
-
# rendering the content of node called <tt>my.page</tt> into the output of the node
|
|
8
|
-
# <tt>this.page</tt>, <tt>this.page</tt> would be the +dest_node+ and <tt>my.page</tt> would be
|
|
9
|
-
# the +content_node+.
|
|
10
|
-
#
|
|
11
|
-
# The +dest_node+ is not included in the chain but can be set via the option <tt>:dest_node</tt>!
|
|
12
|
-
#
|
|
13
|
-
# The returned node should be used as source node for calculating relative paths to other nodes.
|
|
14
|
-
def dest_node
|
|
15
|
-
@options[:dest_node] || self.content_node
|
|
16
|
-
end
|
|
6
|
+
# Provides quick access to special nodes of the node chain of a context object.
|
|
7
|
+
module Nodes
|
|
17
8
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
9
|
+
# Return the node which represents the file into which everything gets rendered.
|
|
10
|
+
#
|
|
11
|
+
# This is normally the same node as #content_node but can differ in special cases. For
|
|
12
|
+
# example, when rendering the content of node called 'my.page' into the output of the node
|
|
13
|
+
# 'this.page', 'this.page' would be the #dest_node and 'my.page' would be the #content_node.
|
|
14
|
+
#
|
|
15
|
+
# The #dest_node is not included in the chain but can be set via the option +:dest_node+!
|
|
16
|
+
#
|
|
17
|
+
# The returned node should be used as source node for calculating relative paths to other nodes.
|
|
18
|
+
def dest_node
|
|
19
|
+
@options[:dest_node] || self.content_node
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Return the reference node, ie. the node which provided the original content for this context
|
|
23
|
+
# object.
|
|
24
|
+
#
|
|
25
|
+
# The returned node should be used, for example, for resolving relative paths.
|
|
26
|
+
def ref_node
|
|
27
|
+
@options[:chain] && @options[:chain].first
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Return the node that is ultimately rendered.
|
|
31
|
+
#
|
|
32
|
+
# This node should be used, for example, for retrieving meta information.
|
|
33
|
+
def content_node
|
|
34
|
+
@options[:chain] && @options[:chain].last
|
|
35
|
+
end
|
|
36
|
+
alias :node :content_node
|
|
25
37
|
|
|
26
|
-
# Return the node that is ultimately rendered.
|
|
27
|
-
#
|
|
28
|
-
# This node should be used, for example, for retrieving meta information.
|
|
29
|
-
def content_node
|
|
30
|
-
@options[:chain] && @options[:chain].last
|
|
31
38
|
end
|
|
32
|
-
alias :node :content_node
|
|
33
39
|
|
|
34
40
|
end
|
|
35
|
-
|
|
36
41
|
end
|