webgen 0.5.1 → 0.5.2

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.
Files changed (58) hide show
  1. data/Rakefile +16 -5
  2. data/VERSION +1 -1
  3. data/data/webgen/webgui/controller/main.rb +129 -0
  4. data/data/webgen/webgui/overrides/win32console.rb +0 -0
  5. data/data/webgen/webgui/public/css/jquery.autocomplete.css +50 -0
  6. data/data/webgen/webgui/public/css/ramaze_error.css +90 -0
  7. data/data/webgen/webgui/public/css/style.css +55 -0
  8. data/data/webgen/webgui/public/img/headerbg.jpg +0 -0
  9. data/data/webgen/webgui/public/img/webgen_logo.png +0 -0
  10. data/data/webgen/webgui/public/js/jquery.autocomplete.js +15 -0
  11. data/data/webgen/webgui/public/js/jquery.js +32 -0
  12. data/data/webgen/webgui/view/create_website.xhtml +22 -0
  13. data/data/webgen/webgui/view/error.xhtml +64 -0
  14. data/data/webgen/webgui/view/index.xhtml +22 -0
  15. data/data/webgen/webgui/view/manage_website.xhtml +18 -0
  16. data/data/webgen/webgui/view/page.xhtml +40 -0
  17. data/doc/extensions.page +1 -2
  18. data/doc/getting_started.page +7 -3
  19. data/doc/manual.page +75 -29
  20. data/lib/webgen/cache.rb +17 -9
  21. data/lib/webgen/cli.rb +3 -1
  22. data/lib/webgen/cli/utils.rb +5 -1
  23. data/lib/webgen/cli/webgui_command.rb +48 -0
  24. data/lib/webgen/node.rb +15 -1
  25. data/lib/webgen/output.rb +8 -2
  26. data/lib/webgen/output/filesystem.rb +7 -1
  27. data/lib/webgen/path.rb +7 -4
  28. data/lib/webgen/source/filesystem.rb +4 -2
  29. data/lib/webgen/source/resource.rb +12 -3
  30. data/lib/webgen/sourcehandler.rb +27 -10
  31. data/lib/webgen/sourcehandler/fragment.rb +11 -6
  32. data/lib/webgen/sourcehandler/metainfo.rb +2 -1
  33. data/lib/webgen/sourcehandler/page.rb +21 -1
  34. data/lib/webgen/tag/breadcrumbtrail.rb +2 -2
  35. data/lib/webgen/tag/executecommand.rb +4 -1
  36. data/lib/webgen/tag/includefile.rb +1 -1
  37. data/lib/webgen/tag/langbar.rb +32 -4
  38. data/lib/webgen/tag/menu.rb +13 -8
  39. data/lib/webgen/version.rb +1 -1
  40. data/lib/webgen/website.rb +3 -1
  41. data/lib/webgen/websitemanager.rb +1 -0
  42. data/man/man1/webgen.1 +3 -0
  43. data/misc/default.template +1 -1
  44. data/test/test_cache.rb +5 -5
  45. data/test/test_node.rb +20 -1
  46. data/test/test_output_filesystem.rb +2 -1
  47. data/test/test_page.rb +12 -0
  48. data/test/test_path.rb +14 -0
  49. data/test/test_source_filesystem.rb +1 -1
  50. data/test/test_source_resource.rb +5 -0
  51. data/test/test_sourcehandler_fragment.rb +9 -4
  52. data/test/test_sourcehandler_page.rb +12 -13
  53. data/test/test_sourcehandler_template.rb +1 -2
  54. data/test/test_tag_breadcrumbtrail.rb +3 -2
  55. data/test/test_tag_executecommand.rb +0 -1
  56. data/test/test_tag_langbar.rb +7 -0
  57. data/test/test_tag_menu.rb +1 -1
  58. metadata +65 -2
@@ -1,6 +1,6 @@
1
1
  module Webgen
2
2
 
3
3
  # The version of webgen.
4
- VERSION = '0.5.1'
4
+ VERSION = '0.5.2'
5
5
 
6
6
  end
@@ -1,6 +1,7 @@
1
1
  # Standard lib requires
2
2
  require 'logger'
3
3
  require 'set'
4
+ require 'fileutils'
4
5
 
5
6
  # Requirements for Website
6
7
  require 'webgen/loggable'
@@ -73,6 +74,7 @@ module Webgen
73
74
  def initialize(dir, logger=Webgen::Logger.new($stdout, false), &block)
74
75
  @blackboard = nil
75
76
  @cache = nil
77
+ @config = nil
76
78
  @logger = logger
77
79
  @config_block = block
78
80
  @directory = dir
@@ -165,7 +167,7 @@ module Webgen
165
167
  @tree = Tree.new
166
168
  data = if config['website.cache'].first == :file
167
169
  cache_file = File.join(@directory, config['website.cache'].last)
168
- File.read(cache_file) if File.exists?(cache_file)
170
+ File.open(cache_file, 'rb') {|f| f.read} if File.exists?(cache_file)
169
171
  else
170
172
  config['website.cache'].last
171
173
  end
@@ -1,4 +1,5 @@
1
1
  require 'ostruct'
2
+ require 'fileutils'
2
3
  require 'webgen/website'
3
4
 
4
5
  module Webgen
@@ -52,6 +52,9 @@ no command was issued.
52
52
  .TP
53
53
  \fBversion\fR
54
54
  Shows the version of the program and exit.
55
+ .TP
56
+ \fBwebgui\fR
57
+ Starts the webgen webgui, a browser based graphical user interface for manging webgen websites.
55
58
  .SH SEE ALSO
56
59
  The webgen website, http://webgen.rubyforge.org/ for more information.
57
60
  .SH AUTHOR
@@ -65,7 +65,7 @@
65
65
  <a href="http://validator.w3.org/check/referer">XHTML</a>
66
66
  </p>
67
67
 
68
- <p>Page last changed at: {date:}</p>
68
+ <p>Page last changed at: {modified_at:}</p>
69
69
  </div>
70
70
 
71
71
  </div></div>
@@ -33,14 +33,15 @@ class TestCache < Test::Unit::TestCase
33
33
 
34
34
  def test_volatile_cache
35
35
  @cache.volatile[:key] = :value
36
+ assert_equal(:value, @cache.volatile[:key])
37
+ dump_and_restore
36
38
  assert_equal(nil, @cache.volatile[:key])
37
39
 
40
+ @cache.volatile[:key] = :value
38
41
  obj = @cache.instance('Hash')
42
+ @cache.reset_volatile_cache
43
+ assert_equal(nil, @cache.volatile[:key])
39
44
  assert_equal(obj, @cache.instance('Hash'))
40
-
41
- @cache.enable_volatile_cache
42
- @cache.volatile[:key] = :value
43
- assert_equal(:value, @cache.volatile[:key])
44
45
  end
45
46
 
46
47
  def test_instance
@@ -50,7 +51,6 @@ class TestCache < Test::Unit::TestCase
50
51
  @cache.instance('Array')
51
52
  assert_equal(['Hash', 'Array'], @cache.permanent[:classes])
52
53
  dump_and_restore
53
- @cache.enable_volatile_cache
54
54
  assert_not_nil(@cache.volatile[:classes]['Hash'])
55
55
  end
56
56
 
@@ -41,7 +41,7 @@ class TestNode < Test::Unit::TestCase
41
41
  assert(node.dirty)
42
42
  assert(node.created)
43
43
  assert_equal(mi, node.meta_info)
44
- assert_equal({:used_nodes => Set.new}, node.node_info)
44
+ assert_equal({:used_nodes => Set.new, :used_meta_info_nodes => Set.new}, node.node_info)
45
45
  mi.each {|k,v| assert_equal(v, node[k])}
46
46
  end
47
47
 
@@ -159,6 +159,25 @@ class TestNode < Test::Unit::TestCase
159
159
  assert_equal(1, calls)
160
160
  end
161
161
 
162
+ def test_meta_info_changed
163
+ node = Webgen::Node.new(@tree.dummy_root, '/', '/')
164
+ node.dirty = node.created = false
165
+
166
+ calls = 0
167
+ @website.blackboard.add_listener(:node_meta_info_changed?) {|n| assert(node, n); node.dirty_meta_info = true; calls += 1}
168
+ assert(node.meta_info_changed?)
169
+ assert_equal(1, calls)
170
+ assert(node.meta_info_changed?)
171
+ assert_equal(1, calls)
172
+
173
+ node.dirty_meta_info = false
174
+ node.node_info[:used_meta_info_nodes] << node.absolute_lcn
175
+ node.node_info[:used_meta_info_nodes] << 'unknown alcn'
176
+ node.node_info[:used_meta_info_nodes] << @tree.dummy_root.absolute_lcn
177
+ assert(node.meta_info_changed?)
178
+ assert_equal(2, calls)
179
+ end
180
+
162
181
  def test_method_missing
163
182
  node = Webgen::Node.new(@tree.dummy_root, 'test/', 'test', {'lang' => 'de', :test => :value})
164
183
  assert_raise(NoMethodError) { node.unknown }
@@ -35,8 +35,9 @@ class TestOutputFileSystem < Test::Unit::TestCase
35
35
 
36
36
  output.write('/dir/hallo', 'content', :file)
37
37
  assert(File.file?(File.join(output.root, 'dir/hallo')))
38
- assert_equal('content', File.read(File.join(output.root, 'dir/hallo')))
39
38
  assert(output.exists?('/dir/hallo'))
39
+ assert_equal('content', File.read(File.join(output.root, 'dir/hallo')))
40
+ assert_equal('content', output.read('/dir/hallo'))
40
41
 
41
42
  output.delete('/dir/hallo')
42
43
  assert(!output.exists?('/dir/hallo'))
@@ -1,6 +1,18 @@
1
1
  require 'test/unit'
2
2
  require 'webgen/page'
3
3
 
4
+ class TestBlock < Test::Unit::TestCase
5
+
6
+ def test_render
7
+ block = Webgen::Block.new('content', 'some content', {'pipeline' => 'test'})
8
+ context = {:processors => {}}
9
+ assert_raise(RuntimeError) { block.render(context) }
10
+ context[:processors]['test'] = lambda {|context| context[:content] = context[:content].reverse + context[:block].name }
11
+ assert_equal('some content'.reverse + 'content', block.render(context)[:content])
12
+ end
13
+
14
+ end
15
+
4
16
  class TestPage < Test::Unit::TestCase
5
17
 
6
18
  VALID = <<EOF
@@ -52,6 +52,20 @@ class TestPath < Test::Unit::TestCase
52
52
  assert_equal('/', p.directory)
53
53
  assert_equal('somedir', p.cn)
54
54
  assert_equal('Somedir', p.meta_info['title'])
55
+
56
+ p = Webgen::Path.new('/source/test.rb')
57
+ p = p.mount_at('/', '/source/')
58
+ assert_equal('/test.rb', p.path)
59
+ assert_equal('/', p.directory)
60
+ assert_equal('test.rb', p.cn)
61
+ assert_equal('Test', p.meta_info['title'])
62
+
63
+ p = Webgen::Path.new('/source/')
64
+ p = p.mount_at('/', '/source')
65
+ assert_equal('/', p.path)
66
+ assert_equal('/', p.directory)
67
+ assert_equal('/', p.cn)
68
+ assert_equal('/', p.meta_info['title'])
55
69
  end
56
70
 
57
71
  def test_dup
@@ -50,7 +50,7 @@ class TestSourceFileSystem < Test::Unit::TestCase
50
50
  end
51
51
 
52
52
  def test_paths
53
- source = Webgen::Source::FileSystem.new('lib/webgen', '**/*')
53
+ source = Webgen::Source::FileSystem.new(File.join(File.dirname(__FILE__), '..', 'lib', 'webgen'), '/source/../**/*')
54
54
  assert(source.paths.length > 1)
55
55
  assert(source.paths.include?(Webgen::Path.new('/source/')))
56
56
  assert(source.paths.include?(Webgen::Path.new('/source/filesystem.rb')))
@@ -13,9 +13,14 @@ class TestSourceResource < Test::Unit::TestCase
13
13
 
14
14
  def test_paths
15
15
  @website.config['resources']['test-resource'] = ['Webgen::Source::FileSystem', '.', File.basename(__FILE__)]
16
+ @website.config['resources']['other-resource'] = ['Webgen::Source::FileSystem', '../lib']
17
+
16
18
  source = Webgen::Source::Resource.new('test-*')
17
19
  assert_equal(1, source.paths.length)
18
20
  assert(source.paths.include?(Webgen::Path.new('/test_source_resource.rb')))
21
+
22
+ source = Webgen::Source::Resource.new('other-*', '/webgen/**/*', '/webgen/')
23
+ assert(source.paths.include?(Webgen::Path.new('/source/resource.rb')))
19
24
  end
20
25
 
21
26
  end
@@ -43,15 +43,20 @@ EOF
43
43
  def test_create_fragment_nodes
44
44
  @obj = Webgen::SourceHandler::Fragment.new
45
45
  root = Webgen::Node.new(Webgen::Tree.new.dummy_root, 'test/', 'test')
46
- node = @obj.create_node(root, path_with_meta_info('hallo.html') {StringIO.new('')})
47
- @website.blackboard.add_service(:create_nodes) {|tree, alcn, path, sh| [sh.create_node(tree[alcn], path_with_meta_info(path.path))]}
46
+ path = path_with_meta_info('hallo.html') {StringIO.new('')}
47
+ node = @obj.create_node(root, path)
48
+ @website.blackboard.add_service(:create_nodes, method(:create_nodes_service))
48
49
 
49
- section = @obj.parse_html_headers(YAML::load(TEST_CONTENT).first['data'])
50
- @obj.create_fragment_nodes(section, node, 'true')
50
+ sections = @obj.parse_html_headers(YAML::load(TEST_CONTENT).first['data'])
51
+ @obj.create_fragment_nodes(sections, node, path, 'true')
51
52
  assert_equal(node, node.resolve('#test').parent)
52
53
  assert_equal(node.resolve('#test'), node.resolve('#other').parent)
53
54
  end
54
55
 
56
+ def create_nodes_service(tree, alcn, path, sh)
57
+ [yield(tree[alcn], path_with_meta_info(path.path))]
58
+ end
59
+
55
60
  def check_sections(sections, valid)
56
61
  sections.each do |level, id, title, subsecs|
57
62
  assert_equal(valid.shift, [level, id, title])
@@ -3,19 +3,6 @@ require 'helper'
3
3
  require 'webgen/sourcehandler/page'
4
4
  require 'stringio'
5
5
 
6
- class TestBlock < Test::Unit::TestCase
7
-
8
- def test_render
9
- block = Webgen::Block.new('content', 'some content', {'pipeline' => 'test'})
10
- context = {:processors => {}}
11
- assert_raise(RuntimeError) { block.render(context) }
12
- context[:processors]['test'] = lambda {|context| context[:content] = context[:content].reverse + context[:block].name }
13
- assert_equal('some content'.reverse + 'content', block.render(context)[:content])
14
- end
15
-
16
- end
17
-
18
-
19
6
  class TestSourceHandlerPage < Test::Unit::TestCase
20
7
 
21
8
  include Test::WebsiteHelper
@@ -32,6 +19,7 @@ class TestSourceHandlerPage < Test::Unit::TestCase
32
19
  @root = Webgen::Node.new(Webgen::Tree.new.dummy_root, 'test/', 'test')
33
20
  @path = path_with_meta_info('/index.page') {StringIO.new('content')}
34
21
  @path.meta_info.update({'lang'=>'eo', 'test'=>'yes', 'sort_info'=>6})
22
+ @website.blackboard.add_service(:source_paths) {{@path.path => @path}}
35
23
  end
36
24
 
37
25
  def test_create_node
@@ -67,4 +55,15 @@ class TestSourceHandlerPage < Test::Unit::TestCase
67
55
  assert_raise(RuntimeError) { @obj.render_node(node, 'other') }
68
56
  end
69
57
 
58
+ def test_meta_info_changed
59
+ node = @obj.create_node(@root, @path)
60
+ @website.blackboard.dispatch_msg(:node_meta_info_changed?, node)
61
+ assert(node.meta_info_changed?)
62
+
63
+ node.dirty_meta_info = false
64
+ @website.cache.restore(@website.cache.dump)
65
+ @website.blackboard.dispatch_msg(:node_meta_info_changed?, node)
66
+ assert(!node.meta_info_changed?)
67
+ end
68
+
70
69
  end
@@ -34,7 +34,6 @@ class TestSourceHandlerTemplate < Test::Unit::TestCase
34
34
  chained_template = Webgen::Node.new(root, 'chained.template', 'chained.template', {'template' => 'other.template'})
35
35
  german_file = Webgen::Node.new(root, 'german.html', 'german.page', {'lang' => 'de', 'template' => 'other.template'})
36
36
 
37
- @website.cache.enable_volatile_cache
38
37
  assert_equal([], @obj.templates_for_node(default_template))
39
38
  assert_equal([], @obj.templates_for_node(stopped_template))
40
39
  assert_equal([default_template], @obj.templates_for_node(other_template))
@@ -42,7 +41,7 @@ class TestSourceHandlerTemplate < Test::Unit::TestCase
42
41
  assert_equal([default_template, other_template], @obj.templates_for_node(chained_template))
43
42
  assert_equal([default_de_template, other_template], @obj.templates_for_node(german_file))
44
43
 
45
- @website.cache.volatile[:enabled] = false
44
+ @website.cache.reset_volatile_cache
46
45
  root.tree.delete_node(default_template)
47
46
  assert_equal([], @obj.templates_for_node(other_template))
48
47
  end
@@ -41,8 +41,9 @@ class TestTagBreadcrumbTrail < Test::Unit::TestCase
41
41
 
42
42
  assert_equal('<a href="../../index.html"></a> / <a href="../">Dir1</a> / <a href="index.html">Dir11</a> / <span>File111</span>',
43
43
  call(context, ' / ', false, false))
44
- assert_equal(Set.new([nodes[:file11_en], nodes[:index_en], nodes[:index11_en], nodes[:dir1], nodes[:dir11], nodes[:root]].map {|n| n.absolute_lcn}),
45
- nodes[:file11_en].node_info[:used_nodes])
44
+ assert_equal(Set.new([nodes[:file11_en], nodes[:index_en], nodes[:index11_en],
45
+ nodes[:dir1], nodes[:dir11], nodes[:root]].map {|n| n.absolute_lcn}),
46
+ nodes[:file11_en].node_info[:used_meta_info_nodes])
46
47
 
47
48
 
48
49
  assert_equal('<a href="../../index.html"></a> / <a href="../">Dir1</a> / <a href="index.html">Dir11</a> / <span>File111</span>',
@@ -1,7 +1,6 @@
1
1
  require 'test/unit'
2
2
  require 'helper'
3
3
  require 'webgen/tag'
4
- require 'rbconfig'
5
4
 
6
5
  class TestTagExecuteCommand < Test::Unit::TestCase
7
6
 
@@ -33,6 +33,13 @@ class TestTagLangbar < Test::Unit::TestCase
33
33
 
34
34
  @obj.set_params('tag.langbar.show_single_lang'=>true, 'tag.langbar.show_own_lang'=>true, 'tag.langbar.separator' => ' --- ')
35
35
  assert_equal("#{de_link} --- #{en_link}", @obj.call('langbar', '', Webgen::ContentProcessor::Context.new(:chain => [nodes[:index_en]])))
36
+
37
+ nodes[:index_en].dirty = false
38
+ @website.blackboard.dispatch_msg(:node_changed?, nodes[:index_en])
39
+ assert(!nodes[:index_en].dirty)
40
+ nodes[:index_en].tree.delete_node(nodes[:index_de])
41
+ @website.blackboard.dispatch_msg(:node_changed?, nodes[:index_en])
42
+ assert(nodes[:index_en].dirty)
36
43
  end
37
44
 
38
45
  def check_results(node, both_true, both_false, first_false, second_false)
@@ -85,7 +85,7 @@ class TestTagMenu < Test::Unit::TestCase
85
85
  @website.blackboard.dispatch_msg(:node_changed?, nodes[:file11_en])
86
86
  assert(!nodes[:file11_en].dirty)
87
87
 
88
- nodes[:index11_en].dirty = true
88
+ nodes[:index11_en].dirty_meta_info = true
89
89
  @website.blackboard.dispatch_msg(:node_changed?, nodes[:file11_en])
90
90
  assert(nodes[:file11_en].dirty)
91
91
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webgen
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.1
4
+ version: 0.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Leitner
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-07-31 00:00:00 +02:00
12
+ date: 2008-08-13 00:00:00 +02:00
13
13
  default_executable: webgen
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -52,6 +52,26 @@ dependencies:
52
52
  - !ruby/object:Gem::Version
53
53
  version: 0.8.0
54
54
  version:
55
+ - !ruby/object:Gem::Dependency
56
+ name: ramaze
57
+ type: :runtime
58
+ version_requirement:
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - "="
62
+ - !ruby/object:Gem::Version
63
+ version: "2008.06"
64
+ version:
65
+ - !ruby/object:Gem::Dependency
66
+ name: launchy
67
+ type: :runtime
68
+ version_requirement:
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: 0.3.2
74
+ version:
55
75
  - !ruby/object:Gem::Dependency
56
76
  name: rcov
57
77
  type: :development
@@ -112,6 +132,26 @@ dependencies:
112
132
  - !ruby/object:Gem::Version
113
133
  version: 2.1.0
114
134
  version:
135
+ - !ruby/object:Gem::Dependency
136
+ name: rdoc
137
+ type: :development
138
+ version_requirement:
139
+ version_requirements: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - ">="
142
+ - !ruby/object:Gem::Version
143
+ version: 2.0.0
144
+ version:
145
+ - !ruby/object:Gem::Dependency
146
+ name: coderay
147
+ type: :development
148
+ version_requirement:
149
+ version_requirements: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: 0.7.4.215
154
+ version:
115
155
  description: webgen is used to generate static websites from templates and content files (which can be written in a markup language). It can generate dynamic content like menus on the fly and comes with many powerful extensions.
116
156
  email: t_leitner@gmx.at
117
157
  executables:
@@ -131,6 +171,28 @@ files:
131
171
  - bin/webgen
132
172
  - data/webgen
133
173
  - data/webgen/resources.yaml
174
+ - data/webgen/webgui
175
+ - data/webgen/webgui/controller
176
+ - data/webgen/webgui/controller/main.rb
177
+ - data/webgen/webgui/overrides
178
+ - data/webgen/webgui/overrides/win32console.rb
179
+ - data/webgen/webgui/public
180
+ - data/webgen/webgui/public/css
181
+ - data/webgen/webgui/public/css/jquery.autocomplete.css
182
+ - data/webgen/webgui/public/css/ramaze_error.css
183
+ - data/webgen/webgui/public/css/style.css
184
+ - data/webgen/webgui/public/img
185
+ - data/webgen/webgui/public/img/headerbg.jpg
186
+ - data/webgen/webgui/public/img/webgen_logo.png
187
+ - data/webgen/webgui/public/js
188
+ - data/webgen/webgui/public/js/jquery.autocomplete.js
189
+ - data/webgen/webgui/public/js/jquery.js
190
+ - data/webgen/webgui/view
191
+ - data/webgen/webgui/view/create_website.xhtml
192
+ - data/webgen/webgui/view/error.xhtml
193
+ - data/webgen/webgui/view/index.xhtml
194
+ - data/webgen/webgui/view/manage_website.xhtml
195
+ - data/webgen/webgui/view/page.xhtml
134
196
  - data/webgen/website_skeleton
135
197
  - data/webgen/website_skeleton/config.yaml
136
198
  - data/webgen/website_skeleton/ext
@@ -308,6 +370,7 @@ files:
308
370
  - lib/webgen/cli/create_command.rb
309
371
  - lib/webgen/cli/run_command.rb
310
372
  - lib/webgen/cli/utils.rb
373
+ - lib/webgen/cli/webgui_command.rb
311
374
  - lib/webgen/cli.rb
312
375
  - lib/webgen/configuration.rb
313
376
  - lib/webgen/contentprocessor/blocks.rb