webgen 0.5.1 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
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