thewoolleyman-webgen 0.5.8.20090419
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/AUTHORS +8 -0
- data/COPYING +10 -0
- data/GPL +340 -0
- data/Rakefile +334 -0
- data/THANKS +18 -0
- data/bin/webgen +12 -0
- data/data/webgen/resources.yaml +3 -0
- data/data/webgen/webgui/controller/main.rb +135 -0
- data/data/webgen/webgui/overrides/win32console.rb +0 -0
- data/data/webgen/webgui/public/css/jquery.autocomplete.css +50 -0
- data/data/webgen/webgui/public/css/ramaze_error.css +90 -0
- data/data/webgen/webgui/public/css/style.css +55 -0
- 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 +15 -0
- data/data/webgen/webgui/public/js/jquery.js +32 -0
- data/data/webgen/webgui/view/create_website.xhtml +22 -0
- data/data/webgen/webgui/view/error.xhtml +64 -0
- data/data/webgen/webgui/view/index.xhtml +22 -0
- data/data/webgen/webgui/view/manage_website.xhtml +18 -0
- data/data/webgen/webgui/view/page.xhtml +40 -0
- data/data/webgen/website_skeleton/README +10 -0
- data/data/webgen/website_skeleton/Rakefile +40 -0
- data/data/webgen/website_skeleton/config.yaml +17 -0
- data/data/webgen/website_skeleton/ext/init.rb +10 -0
- data/data/webgen/website_styles/1024px/README +13 -0
- data/data/webgen/website_styles/1024px/src/default.css +188 -0
- data/data/webgen/website_styles/1024px/src/default.template +60 -0
- data/data/webgen/website_styles/1024px/src/images/background.gif +0 -0
- data/data/webgen/website_styles/andreas00/README +13 -0
- data/data/webgen/website_styles/andreas00/src/default.css +290 -0
- data/data/webgen/website_styles/andreas00/src/default.template +60 -0
- data/data/webgen/website_styles/andreas00/src/images/bg.gif +0 -0
- data/data/webgen/website_styles/andreas00/src/images/front.jpg +0 -0
- data/data/webgen/website_styles/andreas00/src/images/menubg.gif +0 -0
- data/data/webgen/website_styles/andreas00/src/images/menubg2.gif +0 -0
- data/data/webgen/website_styles/andreas01/README +14 -0
- data/data/webgen/website_styles/andreas01/src/default.css +310 -0
- data/data/webgen/website_styles/andreas01/src/default.template +62 -0
- data/data/webgen/website_styles/andreas01/src/images/bg.gif +0 -0
- data/data/webgen/website_styles/andreas01/src/images/front.jpg +0 -0
- data/data/webgen/website_styles/andreas01/src/print.css +35 -0
- data/data/webgen/website_styles/andreas03/README +14 -0
- data/data/webgen/website_styles/andreas03/src/default.css +223 -0
- data/data/webgen/website_styles/andreas03/src/default.template +58 -0
- data/data/webgen/website_styles/andreas03/src/images/bodybg.png +0 -0
- data/data/webgen/website_styles/andreas03/src/images/contbg.png +0 -0
- data/data/webgen/website_styles/andreas03/src/images/footerbg.png +0 -0
- data/data/webgen/website_styles/andreas03/src/images/gradient1.png +0 -0
- data/data/webgen/website_styles/andreas03/src/images/gradient2.png +0 -0
- data/data/webgen/website_styles/andreas04/README +15 -0
- data/data/webgen/website_styles/andreas04/src/default.css +290 -0
- data/data/webgen/website_styles/andreas04/src/default.template +81 -0
- data/data/webgen/website_styles/andreas04/src/images/blinkarrow.gif +0 -0
- data/data/webgen/website_styles/andreas04/src/images/bodybg.png +0 -0
- data/data/webgen/website_styles/andreas04/src/images/contentbg.png +0 -0
- data/data/webgen/website_styles/andreas04/src/images/entrybg.png +0 -0
- data/data/webgen/website_styles/andreas04/src/images/flash.gif +0 -0
- data/data/webgen/website_styles/andreas04/src/images/flash2.gif +0 -0
- data/data/webgen/website_styles/andreas04/src/images/globe.gif +0 -0
- data/data/webgen/website_styles/andreas04/src/images/globebottom.gif +0 -0
- data/data/webgen/website_styles/andreas04/src/images/linkarrow.gif +0 -0
- data/data/webgen/website_styles/andreas04/src/images/menuhover.png +0 -0
- data/data/webgen/website_styles/andreas05/README +14 -0
- data/data/webgen/website_styles/andreas05/src/default.css +33 -0
- data/data/webgen/website_styles/andreas05/src/default.template +40 -0
- data/data/webgen/website_styles/andreas05/src/images/bodybg.gif +0 -0
- data/data/webgen/website_styles/andreas05/src/images/front.png +0 -0
- data/data/webgen/website_styles/andreas06/README +14 -0
- data/data/webgen/website_styles/andreas06/src/default.css +354 -0
- data/data/webgen/website_styles/andreas06/src/default.template +70 -0
- data/data/webgen/website_styles/andreas06/src/images/bodybg.gif +0 -0
- data/data/webgen/website_styles/andreas06/src/images/boxbg.gif +0 -0
- data/data/webgen/website_styles/andreas06/src/images/greypx.gif +0 -0
- data/data/webgen/website_styles/andreas06/src/images/header.jpg +0 -0
- data/data/webgen/website_styles/andreas06/src/images/innerbg.gif +0 -0
- data/data/webgen/website_styles/andreas06/src/images/leaves.jpg +0 -0
- data/data/webgen/website_styles/andreas06/src/images/tabs.gif +0 -0
- data/data/webgen/website_styles/andreas07/README +15 -0
- data/data/webgen/website_styles/andreas07/src/browserfix.css +7 -0
- data/data/webgen/website_styles/andreas07/src/default.css +92 -0
- data/data/webgen/website_styles/andreas07/src/default.template +42 -0
- data/data/webgen/website_styles/andreas07/src/images/bodybg.gif +0 -0
- data/data/webgen/website_styles/andreas07/src/images/sidebarbg.gif +0 -0
- data/data/webgen/website_styles/andreas08/README +14 -0
- data/data/webgen/website_styles/andreas08/src/default.css +224 -0
- data/data/webgen/website_styles/andreas08/src/default.template +51 -0
- data/data/webgen/website_styles/andreas09/README +14 -0
- data/data/webgen/website_styles/andreas09/src/default.css +308 -0
- data/data/webgen/website_styles/andreas09/src/default.template +68 -0
- data/data/webgen/website_styles/andreas09/src/images/bodybg-black.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/bodybg-green.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/bodybg-orange.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/bodybg-purple.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/bodybg-red.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/bodybg.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/footerbg.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/menuhover-black.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/menuhover-green.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/menuhover-orange.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/menuhover-purple.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/menuhover-red.jpg +0 -0
- data/data/webgen/website_styles/andreas09/src/images/menuhover.jpg +0 -0
- data/data/webgen/website_styles/simple/README +6 -0
- data/data/webgen/website_styles/simple/src/default.css +84 -0
- data/data/webgen/website_styles/simple/src/default.template +36 -0
- data/data/webgen/website_templates/default/README +6 -0
- data/data/webgen/website_templates/default/src/index.page +8 -0
- data/data/webgen/website_templates/project/README +5 -0
- data/data/webgen/website_templates/project/src/about.page +12 -0
- data/data/webgen/website_templates/project/src/download.page +15 -0
- data/data/webgen/website_templates/project/src/features.page +8 -0
- data/data/webgen/website_templates/project/src/index.page +9 -0
- data/data/webgen/website_templates/project/src/screenshots.page +18 -0
- data/doc/contentprocessor.template +11 -0
- data/doc/contentprocessor/blocks.page +129 -0
- data/doc/contentprocessor/builder.page +80 -0
- data/doc/contentprocessor/erb.page +59 -0
- data/doc/contentprocessor/erubis.page +46 -0
- data/doc/contentprocessor/fragments.page +25 -0
- data/doc/contentprocessor/haml.page +47 -0
- data/doc/contentprocessor/maruku.page +41 -0
- data/doc/contentprocessor/rdiscount.page +37 -0
- data/doc/contentprocessor/rdoc.page +36 -0
- data/doc/contentprocessor/redcloth.page +39 -0
- data/doc/contentprocessor/sass.page +31 -0
- data/doc/contentprocessor/tags.page +73 -0
- data/doc/extensions.metainfo +29 -0
- data/doc/extensions.page +16 -0
- data/doc/extensions.template +17 -0
- data/doc/faq.page +219 -0
- data/doc/getting_started.page +135 -0
- data/doc/index.page +65 -0
- data/doc/manual.page +589 -0
- data/doc/reference_configuration.page +959 -0
- data/doc/reference_metainfo.page +222 -0
- data/doc/source/filesystem.page +39 -0
- data/doc/source/tararchive.page +40 -0
- data/doc/sourcehandler.template +21 -0
- data/doc/sourcehandler/copy.page +19 -0
- data/doc/sourcehandler/directory.page +27 -0
- data/doc/sourcehandler/feed.page +105 -0
- data/doc/sourcehandler/metainfo.page +41 -0
- data/doc/sourcehandler/page.page +14 -0
- data/doc/sourcehandler/sitemap.page +46 -0
- data/doc/sourcehandler/template.page +45 -0
- data/doc/sourcehandler/virtual.page +49 -0
- data/doc/tag.template +25 -0
- data/doc/tag/breadcrumbtrail.page +40 -0
- data/doc/tag/coderay.page +49 -0
- data/doc/tag/date.page +31 -0
- data/doc/tag/executecommand.page +26 -0
- data/doc/tag/includefile.page +32 -0
- data/doc/tag/langbar.page +44 -0
- data/doc/tag/link.page +44 -0
- data/doc/tag/menu.page +106 -0
- data/doc/tag/metainfo.page +29 -0
- data/doc/tag/relocatable.page +38 -0
- data/doc/tag/sitemap.page +31 -0
- data/doc/tag/tikz.page +158 -0
- data/doc/upgrading.page +139 -0
- data/doc/webgen_page_format.page +129 -0
- data/lib/webgen/blackboard.rb +78 -0
- data/lib/webgen/cache.rb +87 -0
- data/lib/webgen/cli.rb +124 -0
- data/lib/webgen/cli/apply_command.rb +64 -0
- data/lib/webgen/cli/create_command.rb +66 -0
- data/lib/webgen/cli/run_command.rb +22 -0
- data/lib/webgen/cli/utils.rb +88 -0
- data/lib/webgen/cli/webgui_command.rb +72 -0
- data/lib/webgen/common.rb +21 -0
- data/lib/webgen/common/sitemap.rb +83 -0
- data/lib/webgen/configuration.rb +153 -0
- data/lib/webgen/contentprocessor.rb +99 -0
- data/lib/webgen/contentprocessor/blocks.rb +60 -0
- data/lib/webgen/contentprocessor/builder.rb +30 -0
- data/lib/webgen/contentprocessor/context.rb +89 -0
- data/lib/webgen/contentprocessor/erb.rb +28 -0
- data/lib/webgen/contentprocessor/erubis.rb +40 -0
- data/lib/webgen/contentprocessor/fragments.rb +25 -0
- data/lib/webgen/contentprocessor/haml.rb +30 -0
- data/lib/webgen/contentprocessor/maruku.rb +20 -0
- data/lib/webgen/contentprocessor/rdiscount.rb +17 -0
- data/lib/webgen/contentprocessor/rdoc.rb +19 -0
- data/lib/webgen/contentprocessor/redcloth.rb +17 -0
- data/lib/webgen/contentprocessor/sass.rb +20 -0
- data/lib/webgen/contentprocessor/tags.rb +136 -0
- data/lib/webgen/coreext.rb +13 -0
- data/lib/webgen/default_config.rb +215 -0
- data/lib/webgen/languages.rb +589 -0
- data/lib/webgen/loggable.rb +25 -0
- data/lib/webgen/logger.rb +97 -0
- data/lib/webgen/node.rb +391 -0
- data/lib/webgen/output.rb +82 -0
- data/lib/webgen/output/filesystem.rb +69 -0
- data/lib/webgen/page.rb +153 -0
- data/lib/webgen/path.rb +194 -0
- data/lib/webgen/source.rb +54 -0
- data/lib/webgen/source/filesystem.rb +61 -0
- data/lib/webgen/source/resource.rb +44 -0
- data/lib/webgen/source/stacked.rb +55 -0
- data/lib/webgen/source/tararchive.rb +73 -0
- data/lib/webgen/sourcehandler.rb +226 -0
- data/lib/webgen/sourcehandler/base.rb +248 -0
- data/lib/webgen/sourcehandler/copy.rb +43 -0
- data/lib/webgen/sourcehandler/directory.rb +36 -0
- data/lib/webgen/sourcehandler/feed.rb +117 -0
- data/lib/webgen/sourcehandler/fragment.rb +68 -0
- data/lib/webgen/sourcehandler/memory.rb +43 -0
- data/lib/webgen/sourcehandler/metainfo.rb +128 -0
- data/lib/webgen/sourcehandler/page.rb +59 -0
- data/lib/webgen/sourcehandler/sitemap.rb +60 -0
- data/lib/webgen/sourcehandler/template.rb +66 -0
- data/lib/webgen/sourcehandler/virtual.rb +110 -0
- data/lib/webgen/tag.rb +27 -0
- data/lib/webgen/tag/base.rb +170 -0
- data/lib/webgen/tag/breadcrumbtrail.rb +70 -0
- data/lib/webgen/tag/coderay.rb +31 -0
- data/lib/webgen/tag/date.rb +18 -0
- data/lib/webgen/tag/executecommand.rb +30 -0
- data/lib/webgen/tag/includefile.rb +42 -0
- data/lib/webgen/tag/langbar.rb +52 -0
- data/lib/webgen/tag/link.rb +26 -0
- data/lib/webgen/tag/menu.rb +207 -0
- data/lib/webgen/tag/metainfo.rb +25 -0
- data/lib/webgen/tag/relocatable.rb +54 -0
- data/lib/webgen/tag/sitemap.rb +41 -0
- data/lib/webgen/tag/tikz.rb +119 -0
- data/lib/webgen/tree.rb +90 -0
- data/lib/webgen/version.rb +8 -0
- data/lib/webgen/webgentask.rb +152 -0
- data/lib/webgen/website.rb +342 -0
- data/lib/webgen/websiteaccess.rb +31 -0
- data/lib/webgen/websitemanager.rb +127 -0
- data/man/man1/webgen.1 +73 -0
- data/misc/default.css +384 -0
- data/misc/default.template +75 -0
- data/misc/htmldoc.metainfo +25 -0
- data/misc/htmldoc.virtual +5 -0
- 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/setup.rb +1585 -0
- data/test/helper.rb +45 -0
- data/test/test_blackboard.rb +60 -0
- data/test/test_cache.rb +59 -0
- data/test/test_cli.rb +21 -0
- data/test/test_common.rb +18 -0
- data/test/test_common_sitemap.rb +58 -0
- data/test/test_configuration.rb +68 -0
- data/test/test_contentprocessor.rb +33 -0
- data/test/test_contentprocessor_blocks.rb +68 -0
- data/test/test_contentprocessor_builder.rb +23 -0
- data/test/test_contentprocessor_context.rb +40 -0
- data/test/test_contentprocessor_erb.rb +23 -0
- data/test/test_contentprocessor_erubis.rb +49 -0
- data/test/test_contentprocessor_fragments.rb +42 -0
- data/test/test_contentprocessor_haml.rb +23 -0
- data/test/test_contentprocessor_maruku.rb +29 -0
- data/test/test_contentprocessor_rdiscount.rb +17 -0
- data/test/test_contentprocessor_rdoc.rb +18 -0
- data/test/test_contentprocessor_redcloth.rb +15 -0
- data/test/test_contentprocessor_sass.rb +22 -0
- data/test/test_contentprocessor_tags.rb +99 -0
- data/test/test_languages.rb +67 -0
- data/test/test_loggable.rb +32 -0
- data/test/test_logger.rb +94 -0
- data/test/test_node.rb +367 -0
- data/test/test_output_filesystem.rb +60 -0
- data/test/test_page.rb +214 -0
- data/test/test_path.rb +165 -0
- data/test/test_source_filesystem.rb +76 -0
- data/test/test_source_resource.rb +28 -0
- data/test/test_source_stacked.rb +36 -0
- data/test/test_source_tararchive.rb +65 -0
- data/test/test_sourcehandler_base.rb +123 -0
- data/test/test_sourcehandler_copy.rb +47 -0
- data/test/test_sourcehandler_directory.rb +42 -0
- data/test/test_sourcehandler_feed.rb +77 -0
- data/test/test_sourcehandler_fragment.rb +69 -0
- data/test/test_sourcehandler_memory.rb +44 -0
- data/test/test_sourcehandler_metainfo.rb +118 -0
- data/test/test_sourcehandler_page.rb +65 -0
- data/test/test_sourcehandler_sitemap.rb +49 -0
- data/test/test_sourcehandler_template.rb +65 -0
- data/test/test_sourcehandler_virtual.rb +87 -0
- data/test/test_tag_base.rb +85 -0
- data/test/test_tag_breadcrumbtrail.rb +91 -0
- data/test/test_tag_coderay.rb +32 -0
- data/test/test_tag_date.rb +18 -0
- data/test/test_tag_executecommand.rb +41 -0
- data/test/test_tag_includefile.rb +50 -0
- data/test/test_tag_langbar.rb +72 -0
- data/test/test_tag_link.rb +69 -0
- data/test/test_tag_menu.rb +207 -0
- data/test/test_tag_metainfo.rb +19 -0
- data/test/test_tag_relocatable.rb +59 -0
- data/test/test_tag_sitemap.rb +47 -0
- data/test/test_tag_tikz.rb +69 -0
- data/test/test_tree.rb +70 -0
- data/test/test_webgentask.rb +23 -0
- data/test/test_website.rb +98 -0
- data/test/test_websiteaccess.rb +25 -0
- data/test/test_websitemanager.rb +70 -0
- metadata +613 -0
@@ -0,0 +1,66 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'webgen/cli'
|
4
|
+
require 'webgen/websitemanager'
|
5
|
+
|
6
|
+
module Webgen::CLI
|
7
|
+
|
8
|
+
# The CLI command for creating a webgen website.
|
9
|
+
class CreateCommand < CmdParse::Command
|
10
|
+
|
11
|
+
def initialize #:nodoc:
|
12
|
+
super('create', false)
|
13
|
+
self.description = Utils.format("If the verbosity level is set to verbose, the created files are listed.")
|
14
|
+
@template = 'default'
|
15
|
+
@style = 'andreas07'
|
16
|
+
|
17
|
+
self.short_desc = 'Create a basic webgen website with selectable template/style'
|
18
|
+
self.options = CmdParse::OptionParserWrapper.new do |opts|
|
19
|
+
opts.separator "Options:"
|
20
|
+
opts.on('-t', '--template TEMPLATE', String, 'A website template or "none" (default: default)') do |val|
|
21
|
+
@template = (val == 'none' ? nil : val)
|
22
|
+
end
|
23
|
+
opts.on('-s', '--style STYLE', String, 'A website style or "none" (default: andreas07)') do |val|
|
24
|
+
@style = (val == 'none' ? nil : val)
|
25
|
+
end
|
26
|
+
opts.separator ""
|
27
|
+
opts.separator "Arguments:"
|
28
|
+
opts.separator opts.summary_indent + "DIR: the directory in which the website should be created"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def usage # :nodoc:
|
33
|
+
"Usage: #{commandparser.program_name} [global options] create [options] DIR"
|
34
|
+
end
|
35
|
+
|
36
|
+
def show_help # :nodoc:
|
37
|
+
super
|
38
|
+
wm = Webgen::WebsiteManager.new(commandparser.directory)
|
39
|
+
|
40
|
+
puts
|
41
|
+
puts "Available templates and styles:"
|
42
|
+
puts Utils.headline('Templates')
|
43
|
+
wm.templates.sort.each {|name, entry| Utils.hash_output(name, entry.instance_eval { @table }) }
|
44
|
+
puts Utils.headline('Styles')
|
45
|
+
wm.styles.select {|k,v| k =~ /^website-|[^-]+/ }.sort.each {|name, entry| Utils.hash_output(name, entry.instance_eval { @table }) }
|
46
|
+
end
|
47
|
+
|
48
|
+
# Create a webgen website in the directory <tt>args[0]</tt>.
|
49
|
+
def execute(args)
|
50
|
+
if args.length == 0
|
51
|
+
raise OptionParser::MissingArgument.new('DIR')
|
52
|
+
else
|
53
|
+
wm = Webgen::WebsiteManager.new(args[0])
|
54
|
+
paths = wm.create_website
|
55
|
+
paths += wm.apply_template(@template) if @template
|
56
|
+
paths += wm.apply_style(@style) if @style
|
57
|
+
if commandparser.verbosity == :verbose
|
58
|
+
puts "The following files were created in the directory #{args[0]}:"
|
59
|
+
puts paths.sort.collect {|f| "- " + f }.join("\n")
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'webgen/cli'
|
4
|
+
|
5
|
+
module Webgen::CLI
|
6
|
+
|
7
|
+
# The CLI command for rendering a webgen website.
|
8
|
+
class RunCommand < CmdParse::Command
|
9
|
+
|
10
|
+
def initialize # :nodoc:
|
11
|
+
super('render', false)
|
12
|
+
self.short_desc = 'Render the webgen website'
|
13
|
+
end
|
14
|
+
|
15
|
+
# Render the website.
|
16
|
+
def execute(args)
|
17
|
+
commandparser.create_website.render
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'facets/ansicode'
|
4
|
+
require 'rbconfig'
|
5
|
+
|
6
|
+
ANSICode.define_ansicolor_method(:lred, '1;31')
|
7
|
+
ANSICode.define_ansicolor_method(:lblue, '1;34')
|
8
|
+
|
9
|
+
module Webgen::CLI
|
10
|
+
|
11
|
+
# Provides methods for other CLI classes for formatting text in a consistent manner.
|
12
|
+
class Utils
|
13
|
+
|
14
|
+
USE_ANSI_COLORS = !Config::CONFIG['arch'].include?('mswin32')
|
15
|
+
DEFAULT_WIDTH = if Config::CONFIG['arch'].include?('mswin32')
|
16
|
+
72
|
17
|
+
else
|
18
|
+
((size = %x{stty size 2>/dev/null}).length > 0 ? size.split.last.to_i : 72) rescue 72
|
19
|
+
end
|
20
|
+
|
21
|
+
# Used for dynamically formatting the text (setting color, bold face, ...).
|
22
|
+
def self.method_missing(id, text = nil)
|
23
|
+
if USE_ANSI_COLORS && ANSICode.respond_to?(id)
|
24
|
+
ANSICode.send(id, text.to_s)
|
25
|
+
else
|
26
|
+
text.to_s
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Return an array of lines which represents the text in +content+ formatted sothat no line is
|
31
|
+
# longer than +width+ characters. The +indent+ parameter specifies the amount of spaces
|
32
|
+
# prepended to each line. If +first_line_indented+ is +true+, then the first line is indented.
|
33
|
+
def self.format(content, indent = 0, first_line_indented = false, width = DEFAULT_WIDTH)
|
34
|
+
content = (content || '').dup
|
35
|
+
length = width - indent
|
36
|
+
|
37
|
+
paragraphs = content.split(/\n\n/)
|
38
|
+
if (0..1) === paragraphs.length
|
39
|
+
pattern = /^(.{0,#{length}})[ \n]/m
|
40
|
+
lines = []
|
41
|
+
while content.length > length
|
42
|
+
if content =~ pattern
|
43
|
+
str = $1
|
44
|
+
len = $&.length
|
45
|
+
else
|
46
|
+
str = content[0, length]
|
47
|
+
len = length
|
48
|
+
end
|
49
|
+
lines << (lines.empty? && !first_line_indented ? '' : ' '*indent) + str.gsub(/\n/, ' ')
|
50
|
+
content.slice!(0, len)
|
51
|
+
end
|
52
|
+
lines << (lines.empty? && !first_line_indented ? '' : ' '*indent) + content.gsub(/\n/, ' ') unless content.strip.empty?
|
53
|
+
lines
|
54
|
+
else
|
55
|
+
((format(paragraphs.shift, indent, first_line_indented, width) << '') +
|
56
|
+
paragraphs.collect {|p| format(p, indent, true, width) << '' }).flatten[0..-2]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# Return a headline with the given +text+ and amount of +indent+.
|
61
|
+
def self.headline(text, indent = 2)
|
62
|
+
' '*indent + "#{bold(text)}"
|
63
|
+
end
|
64
|
+
|
65
|
+
# Return a section header with the given +text+ formatted in the given +color+ and indented
|
66
|
+
# according to +indent+. The whole text is also left justified to the column specified with
|
67
|
+
# +ljustlength+.
|
68
|
+
def self.section(text, ljustlength = 0, indent = 4, color = :green)
|
69
|
+
' '*indent + "#{send(color, text)}".ljust(ljustlength - indent + send(color).length)
|
70
|
+
end
|
71
|
+
|
72
|
+
# Creates a listing of the key-value pairs of +hash+ under a section called +name+.
|
73
|
+
def self.hash_output(name, hash)
|
74
|
+
ljust = 20
|
75
|
+
puts section('Name', ljust) + "#{lred(name)}"
|
76
|
+
|
77
|
+
hash.sort_by {|k,v| k.to_s }.each do |name, value|
|
78
|
+
next unless value.respond_to?(:to_str)
|
79
|
+
desc = format(value.to_str, ljust)
|
80
|
+
puts section(name.to_s.capitalize, ljust) + desc.shift
|
81
|
+
desc.each {|line| puts line}
|
82
|
+
end
|
83
|
+
puts
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'webgen/cli'
|
4
|
+
require 'facets/kernel/silence'
|
5
|
+
|
6
|
+
# nothing to see here
|
7
|
+
module Ramaze # :nodoc:
|
8
|
+
end
|
9
|
+
|
10
|
+
module Webgen::CLI
|
11
|
+
|
12
|
+
# The CLI command for starting the webgen webgui.
|
13
|
+
class WebguiCommand < CmdParse::Command
|
14
|
+
|
15
|
+
def initialize # :nodoc:
|
16
|
+
super('webgui', false)
|
17
|
+
self.short_desc = 'Starts the webgen webgui'
|
18
|
+
end
|
19
|
+
|
20
|
+
# Render the website.
|
21
|
+
def execute(args)
|
22
|
+
# some fixes for ramaze-2009.02
|
23
|
+
# - fix for Windows when win32console is not installed
|
24
|
+
# - fix for message displayed on shutdown
|
25
|
+
# - fix for warning message
|
26
|
+
$:.unshift File.join(Webgen.data_dir, 'webgui', 'overrides')
|
27
|
+
require 'win32console'
|
28
|
+
$:.shift
|
29
|
+
silence_warnings do
|
30
|
+
begin
|
31
|
+
require 'ramaze'
|
32
|
+
rescue LoadError
|
33
|
+
puts "The Ramaze web framework which is needed for the webgui was not found."
|
34
|
+
puts "You can install it via 'gem install ramaze --version 2009.02'"
|
35
|
+
return
|
36
|
+
end
|
37
|
+
end
|
38
|
+
def Ramaze.shutdown; # :nodoc:
|
39
|
+
end
|
40
|
+
|
41
|
+
Ramaze::acquire(File.join(Webgen.data_dir, 'webgui', 'controller', '*'))
|
42
|
+
Ramaze::Log.loggers = []
|
43
|
+
Ramaze::Global.setup do |g|
|
44
|
+
g.root = File.join(Webgen.data_dir, 'webgui')
|
45
|
+
g.public_root = File.join(Webgen.data_dir, 'webgui', 'public')
|
46
|
+
g.view_root = File.join(Webgen.data_dir, 'webgui', 'view')
|
47
|
+
g.adapter = :webrick
|
48
|
+
g.port = 7000
|
49
|
+
end
|
50
|
+
|
51
|
+
puts 'Starting webgui on http://localhost:7000, press Control-C to stop'
|
52
|
+
|
53
|
+
Thread.new do
|
54
|
+
begin
|
55
|
+
require 'launchy'
|
56
|
+
sleep 2
|
57
|
+
puts 'Launching web browser'
|
58
|
+
Launchy.open('http://localhost:7000')
|
59
|
+
rescue LoadError
|
60
|
+
puts "Can't open browser because the launchy library was not found."
|
61
|
+
puts "You can install it via 'gem install launchy'"
|
62
|
+
puts "Please open a browser window and enter 'http://localhost:7000' into the address bar!"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
Ramaze.start
|
67
|
+
puts 'webgui finished'
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
module Webgen
|
6
|
+
|
7
|
+
# Namespace for classes and methods that provide common functionality.
|
8
|
+
module Common
|
9
|
+
|
10
|
+
autoload :Sitemap, 'webgen/common/sitemap'
|
11
|
+
|
12
|
+
# Make the given +path+ absolute by prepending the absolute path +base+ if necessary. Also
|
13
|
+
# resolves all '..' and '.' references in +path+.
|
14
|
+
def self.absolute_path(path, base)
|
15
|
+
raise(ArgumentError, 'base has to be an absolute path') unless base =~ /\//
|
16
|
+
Pathname.new(path =~ /^\// ? path : File.join(base, path)).cleanpath.to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'webgen/tag'
|
4
|
+
require 'webgen/websiteaccess'
|
5
|
+
|
6
|
+
module Webgen::Common
|
7
|
+
|
8
|
+
# This class provides functionality for creating sitemaps and checking if a sitemap has changed.
|
9
|
+
class Sitemap
|
10
|
+
|
11
|
+
include Webgen::WebsiteAccess
|
12
|
+
|
13
|
+
def initialize #:nodoc:
|
14
|
+
website.blackboard.add_listener(:node_changed?, method(:node_changed?))
|
15
|
+
end
|
16
|
+
|
17
|
+
# Return the sitemap tree as Webgen::Tag::Menu::MenuNode created for the +node+ in the language
|
18
|
+
# +lang+ using the provided +options+ which can be any configuration option starting with
|
19
|
+
# <tt>common.sitemap</tt>.
|
20
|
+
def create_sitemap(node, lang, options)
|
21
|
+
@options = options
|
22
|
+
tree = recursive_create(nil, node.tree.root, lang).sort!
|
23
|
+
@options = nil
|
24
|
+
(node.node_info[:common_sitemap] ||= {})[[options.to_a.sort, lang]] = tree.to_lcn_list
|
25
|
+
tree
|
26
|
+
end
|
27
|
+
|
28
|
+
#######
|
29
|
+
private
|
30
|
+
#######
|
31
|
+
|
32
|
+
# Recursively create the sitemap.
|
33
|
+
def recursive_create(parent, node, lang, in_sitemap = true)
|
34
|
+
mnode = Webgen::Tag::Menu::MenuNode.new(parent, node)
|
35
|
+
node.children.map do |n|
|
36
|
+
sub_in_sitemap = in_sitemap?(n, lang)
|
37
|
+
[(!n.children.empty? || sub_in_sitemap ? n : nil), sub_in_sitemap]
|
38
|
+
end.each do |n, sub_in_sitemap|
|
39
|
+
next if n.nil?
|
40
|
+
sub_node = recursive_create(mnode, n, lang, sub_in_sitemap)
|
41
|
+
mnode.children << sub_node unless sub_node.nil?
|
42
|
+
end
|
43
|
+
(mnode.children.empty? && !in_sitemap ? nil : mnode)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Return +true+ if the +child+ of the +node+ is in the sitemap for the language +lang+.
|
47
|
+
def in_sitemap?(child, lang, allow_index_file = false)
|
48
|
+
((option('common.sitemap.used_kinds').empty? || option('common.sitemap.used_kinds').include?(child['kind']) ||
|
49
|
+
(child.routing_node(lang, false) != child && in_sitemap?(child.routing_node(lang), lang, true))) &&
|
50
|
+
(option('common.sitemap.any_lang') || child.lang.nil? || child.lang == lang) &&
|
51
|
+
(!option('common.sitemap.honor_in_menu') || child['in_menu']) &&
|
52
|
+
(allow_index_file || child.parent == child.tree.root || child.parent.routing_node(lang) != child))
|
53
|
+
end
|
54
|
+
|
55
|
+
# Retrieve the configuration option value for +name+. The value is taken from the current
|
56
|
+
# configuration options hash if +name+ is specified there or from the website configuration
|
57
|
+
# otherwise.
|
58
|
+
def option(name)
|
59
|
+
(@options && @options.has_key?(name) ? @options[name] : website.config[name])
|
60
|
+
end
|
61
|
+
|
62
|
+
# Check if the sitemaps for +node+ have changed.
|
63
|
+
def node_changed?(node)
|
64
|
+
return if !node.node_info[:common_sitemap]
|
65
|
+
|
66
|
+
node.node_info[:common_sitemap].each do |(options, lang), cached_tree|
|
67
|
+
@options = options.to_hash
|
68
|
+
tree = recursive_create(nil, node.tree.root, lang).sort!.to_lcn_list
|
69
|
+
@options = nil
|
70
|
+
|
71
|
+
if (tree != cached_tree) ||
|
72
|
+
(tree.flatten.any? do |alcn|
|
73
|
+
(n = node.tree[alcn]) && (r = n.routing_node(lang)) && r.meta_info_changed?
|
74
|
+
end)
|
75
|
+
node.flag(:dirty)
|
76
|
+
break
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'facets/symbol/to_proc'
|
4
|
+
|
5
|
+
module Webgen
|
6
|
+
|
7
|
+
# Stores the configuration for a webgen website.
|
8
|
+
#
|
9
|
+
# Configuration options should be created like this:
|
10
|
+
#
|
11
|
+
# config.my.new.config 'value', :doc => 'some', :meta => 'info'
|
12
|
+
#
|
13
|
+
# and later accessed or set using the accessor methods #[] and #[]= or a configuration helper.
|
14
|
+
# These helpers are defined in the Helpers module and provide easier access to complex
|
15
|
+
# configuration options. Also see the {webgen
|
16
|
+
# manual}[http://webgen.rubyforge.org/documentation/manual.html#website-configfile] for
|
17
|
+
# information about the configuration helpers.
|
18
|
+
class Configuration
|
19
|
+
|
20
|
+
# Helper class for providing an easy method to define configuration options.
|
21
|
+
class MethodChain
|
22
|
+
|
23
|
+
def initialize(config) #:nodoc:
|
24
|
+
@config = config
|
25
|
+
@name = ''
|
26
|
+
end
|
27
|
+
|
28
|
+
def method_missing(id, *args) #:nodoc:
|
29
|
+
@name += (@name.empty? ? '' : '.') + id.id2name.sub(/(!|=)$/,'')
|
30
|
+
if args.length > 0
|
31
|
+
value = args.shift
|
32
|
+
@config.data[@name] = value unless @config.data.has_key?(@name) # value is set only the first time
|
33
|
+
@config.meta_info[@name] ||= {}
|
34
|
+
@config.meta_info[@name].update(*args) if args.length > 0
|
35
|
+
nil
|
36
|
+
else
|
37
|
+
self
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
# This module provides methods for setting more complex configuration options. It is mixed into
|
44
|
+
# Webgen::Configuration so that its methods can be used. Detailed information on the use of the
|
45
|
+
# methods can be found in the "User Manual" in the "Configuration File" section.
|
46
|
+
#
|
47
|
+
# All public methods defined in this module are available for direct use in the
|
48
|
+
# configuration file, e.g. the method named +default_meta_info+ can be used like this:
|
49
|
+
#
|
50
|
+
# default_meta_info:
|
51
|
+
# Webgen::SourceHandler::Page:
|
52
|
+
# in_menu : true
|
53
|
+
# :action : replace
|
54
|
+
#
|
55
|
+
# All methods have to take exactly one argument, a Hash.
|
56
|
+
#
|
57
|
+
# The special key <tt>:action</tt> should be used for specifying how the configuration option
|
58
|
+
# should be set:
|
59
|
+
#
|
60
|
+
# [replace] Replace the configuration option with the new values.
|
61
|
+
# [modify] Replace old values with new values and add missing ones (useful for hashes and
|
62
|
+
# normally the default value)
|
63
|
+
module Helpers
|
64
|
+
|
65
|
+
# Set the default meta information for source handlers.
|
66
|
+
def default_meta_info(args)
|
67
|
+
args.each do |sh_name, mi|
|
68
|
+
raise ArgumentError, 'Invalid argument for configuration helper default_meta_info' unless mi.kind_of?(Hash)
|
69
|
+
action = mi.delete(:action) || 'modify'
|
70
|
+
mi_hash = (self['sourcehandler.default_meta_info'][complete_source_handler_name(sh_name)] ||= {})
|
71
|
+
case action
|
72
|
+
when 'replace' then mi_hash.replace(mi)
|
73
|
+
else mi_hash.update(mi)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
# Set the path patterns used by source handlers.
|
80
|
+
def patterns(args)
|
81
|
+
args.each do |sh_name, data|
|
82
|
+
pattern_arr = (self['sourcehandler.patterns'][complete_source_handler_name(sh_name)] ||= [])
|
83
|
+
case data
|
84
|
+
when Array then pattern_arr.replace(data)
|
85
|
+
when Hash
|
86
|
+
(data['del'] || []).each {|pat| pattern_arr.delete(pat)}
|
87
|
+
(data['add'] || []).each {|pat| pattern_arr << pat}
|
88
|
+
else
|
89
|
+
raise ArgumentError, 'Invalid argument for configuration helper patterns'
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
|
95
|
+
# Set the default processing pipeline for a source handler.
|
96
|
+
def default_processing_pipeline(args)
|
97
|
+
args.each do |sh_name, pipeline|
|
98
|
+
raise ArgumentError, 'Invalid argument for configuration helper pipeline' unless pipeline.kind_of?(String)
|
99
|
+
mi_hash = (self['sourcehandler.default_meta_info'][complete_source_handler_name(sh_name)] ||= {})
|
100
|
+
((mi_hash['blocks'] ||= {})['default'] ||= {})['pipeline'] = pipeline
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
|
105
|
+
# Complete +sh_name+ by checking if a source handler called
|
106
|
+
# <tt>Webgen::SourceHandler::SH_NAME</tt> exists.
|
107
|
+
def complete_source_handler_name(sh_name)
|
108
|
+
(Webgen::SourceHandler.constants.map(&:to_s).include?(sh_name) ? 'Webgen::SourceHandler::' + sh_name : sh_name)
|
109
|
+
end
|
110
|
+
private :complete_source_handler_name
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
include Helpers
|
116
|
+
|
117
|
+
# The hash which stores the meta info for the configuration options.
|
118
|
+
attr_reader :meta_info
|
119
|
+
|
120
|
+
# The configuration options hash.
|
121
|
+
attr_reader :data
|
122
|
+
|
123
|
+
# Create a new Configuration object.
|
124
|
+
def initialize
|
125
|
+
@data = {}
|
126
|
+
@meta_info = {}
|
127
|
+
end
|
128
|
+
|
129
|
+
# Return the configuration option +name+.
|
130
|
+
def [](name)
|
131
|
+
if @data.has_key?(name)
|
132
|
+
@data[name]
|
133
|
+
else
|
134
|
+
raise ArgumentError, "No such configuration option: #{name}"
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
# Set the configuration option +name+ to the provided +value+.
|
139
|
+
def []=(name, value)
|
140
|
+
if @data.has_key?(name)
|
141
|
+
@data[name] = value
|
142
|
+
else
|
143
|
+
raise ArgumentError, "No such configuration option: #{name}"
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def method_missing(id, *args) #:nodoc:
|
148
|
+
MethodChain.new(self).method_missing(id, *args)
|
149
|
+
end
|
150
|
+
|
151
|
+
end
|
152
|
+
|
153
|
+
end
|