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
@@ -0,0 +1,64 @@
1
+ <link rel="stylesheet" href="/css/ramaze_error.css" />
2
+ <script type="text/javascript" src="/js/jquery.js"></script>
3
+
4
+ <p>The backtrace gives filenames and line numbers for all parts of the call stack.<br />
5
+ Click on any of them to view the surrounding source code.</p>
6
+
7
+ <h3>#@title</h3>
8
+
9
+ <table class="main">
10
+ <tr class="head">
11
+ <td>File</td><td>Line</td><td>Method</td>
12
+ </tr>
13
+ <?r @backtrace.each do |lines, hash, file, lineno, meth| ?>
14
+ <tr class="line" id="#{hash}">
15
+ <td>#{file}</td><td class="lineno">#{lineno}</td><td><pre>#{meth}</pre></td>
16
+ </tr>
17
+ <tr id="source_#{hash}" style="display:none;">
18
+ <td colspan="3">
19
+ <div class="source">
20
+ <table style="width:100%;">
21
+ <tr>
22
+ <td class="editor" colspan="2">
23
+ #{@editor} #{file} +#{lineno}
24
+ <div style="float: right">
25
+ <a href="txmt://open?url=file://#{file}&line=#{lineno}">open in textmate</a>
26
+ </div>
27
+ </td>
28
+ </tr>
29
+ <?r lines.each do |llineno, lcode, lcurrent| ?>
30
+ <tr class="source" #{'style="background:#faa;"' if lcurrent}>
31
+ <td class="lineno">#{llineno}</td>
32
+ <td class="code"><pre>#{lcode.to_s.rstrip}</pre></td>
33
+ </tr>
34
+ <?r end ?>
35
+ </table>
36
+ </div>
37
+ </td>
38
+ </tr>
39
+ <?r end ?>
40
+ </table>
41
+
42
+ <?r
43
+ { 'Session' => Thread.current[:session],
44
+ 'Request' => Thread.current[:request],
45
+ 'Response' => Thread.current[:response],
46
+ 'Global' => Global,
47
+ }.each do |title, content|
48
+ hash = [title, content].object_id.abs
49
+ ?>
50
+ <div class="additional">
51
+ <h3 id="#{hash}">#{title}</h3>
52
+ <pre style="display:none" id="is_#{hash}">#{CGI.escapeHTML(content.pretty_inspect)}</pre>
53
+ </div>
54
+ <?r end ?>
55
+
56
+ <script type="text/javascript">
57
+ $("tr.line").click(function(){
58
+ $("tr#source_"+this.id).toggle()
59
+ });
60
+
61
+ $("div.additional > h3").click(function(){
62
+ $("pre#is_"+this.id).toggle()
63
+ });
64
+ </script>
@@ -0,0 +1,22 @@
1
+ <h2>Welcome to the webgen webgui!</h2>
2
+
3
+ <p>
4
+ This web application lets you create and manage webgen website. Just set the directory of an
5
+ existing or a to-be-created website in the top right corner and click the button!
6
+ </p>
7
+
8
+ <ul>
9
+ <li>
10
+ If you select an existing directory, the webgui assumes that it is a webgen website directory and
11
+ presents you with page for managing a webgen website.
12
+ </li>
13
+ <li>
14
+ If you select a non-existing directory, the webgui shows you a page for creating a webgen website.
15
+ </li>
16
+ </ul>
17
+
18
+ <p>
19
+ The text input field uses auto-completion to show you the available directories on your
20
+ computer. You can either start typing an absolute path name or relative one which will be resolved
21
+ from the directory in which you started the webgui.
22
+ </p>
@@ -0,0 +1,18 @@
1
+ <form method='post' action='#{R :manage_website}'>
2
+ <p>
3
+ <label for='verbosity'>Verbosity:
4
+ <select id='verbosity' name='verbosity'>
5
+ <option #{@verbosity == 'normal' ? selected='selected' : ''}>normal</option>
6
+ <option #{@verbosity == 'verbose' ? selected='selected' : ''}>verbose</option>
7
+ <option #{@verbosity == 'quiet' ? selected='selected' : ''}>quiet</option>
8
+ </select>
9
+ <input type='submit' id='render_site' name='render_site' value='Render website' />
10
+ <!-- <input type='submit' id='auto_render_site' name='auto_render_site' value='#{session['auto_render'] ? 'Stop auto-rendering' : 'Start auto-rendering'}' /> -->
11
+ </p>
12
+ </form>
13
+
14
+ <div id='website_log'>
15
+ <pre>#{CGI::escapeHTML(@log.to_s)}</pre>
16
+ </div>
17
+
18
+ <object id='website_preview' type='text/html' data='#{R :preview_website, "/index.html"}' width='100%' height='600px' style='border: 1px solid black' />
@@ -0,0 +1,40 @@
1
+ <?xml version="1.0" ?>
2
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml">
4
+ <head>
5
+ <title>#{@title}</title>
6
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
7
+ <meta http-equiv="Content-Style-Type" content="text/css" />
8
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
9
+
10
+ <link href="#{R '/css/style.css'}" rel="stylesheet" type="text/css" />
11
+ <link href="#{R '/css/jquery.autocomplete.css'}" rel="stylesheet" type="text/css" />
12
+
13
+ <script type='text/javascript' src="#{R '/js/jquery.js'}"></script>
14
+ <script type='text/javascript' src="#{R '/js/jquery.autocomplete.js'}"></script>
15
+ <script type='text/javascript'>
16
+ $(document).ready(function() {
17
+ $("#website_dir").autocomplete('#{R MainController, :path_autocomplete}');
18
+ });
19
+ </script>
20
+ </head>
21
+ <body>
22
+ <div id="header">
23
+ <img src="#{R '/img/webgen_logo.png'}" alt='logo' />
24
+ <h2><a href="#{R '/'}">webgen <span>webgui</span></a></h2>
25
+
26
+ <div id='site-select-form'>
27
+ <form method='post' action='#{R MainController, :site_ops}'>
28
+ <p>
29
+ <input type='text' id='website_dir' name='website_dir' value='#{session["website_dir"]}' size="70" />
30
+ <input type='submit' id='set_site' name='set_site' value='Set website directory' />
31
+ </p>
32
+ </form>
33
+ </div>
34
+
35
+ </div>
36
+ <div id="content">
37
+ #@content
38
+ </div>
39
+ </body>
40
+ </html>
@@ -1,6 +1,5 @@
1
1
  ---
2
2
  title: Extensions
3
- in_menu: true
4
3
  ---
5
4
  # webgen Extensions
6
5
 
@@ -19,4 +18,4 @@ next if n.is_fragment?
19
18
  * <%= dest_node.link_to(n) %>
20
19
  <%
21
20
  end
22
- %>
21
+ %>
@@ -46,9 +46,13 @@ possibilities:
46
46
  example `webgen -d sample_site`.
47
47
 
48
48
  Easy! webgen has used all files in the `src` directory and created the HTML output in the directory
49
- `out`. Since webgen automatically creates relative links, you can just open the `index.html` file
50
- and you will have a fully functional website - no web server needed! However, as we did not write
51
- any content yet, there is not much to see (only the default pages). So let's do that now!
49
+ `out`. Now you just need to open the `out/index.html` file to view your website! However, as we did
50
+ not write any content yet, there is not much to see (only the default pages). So let's do that now!
51
+
52
+ > Since webgen automatically creates relative links, you will have a fully functional website
53
+ > without needing a web server! This also implies that you can deploy your website to any directory
54
+ > on your web server and it will just work!
55
+ {.information}
52
56
 
53
57
 
54
58
  ### Adding Content
@@ -42,9 +42,84 @@ Following is a short overview of the available commands:
42
42
 
43
43
  Displays the version of webgen.
44
44
 
45
+ * `webgui`
46
+
47
+ Starts the webgen webgui, a browser based graphical user interface for managing webgen
48
+ websites. First the webgui web application is started and then the webgui is opened in the
49
+ default browser.
50
+
45
51
  [cmdparse]: http://cmdparse.rubyforge.org
46
52
 
47
53
 
54
+
55
+ # A webgen Website {#website}
56
+
57
+ webgen needs a special directory structure so that it works out of the box. This directory structure
58
+ is automatically created by the `webgen create` command.
59
+
60
+ The root directory of webgen website is called the website directory. You can have the following
61
+ files and directories under this directory:
62
+
63
+ * `src`: The source directory in which all the source files for the website are. If this directory
64
+ is not called `src` or you want to include additional source directories, you need to change the
65
+ `sources` configuration option.
66
+
67
+ * `out`: This directory is created, if it does not exist, when webgen generates the HTML files. All
68
+ the output files are put into this directory. This directory can be changed by setting the
69
+ `output` configuration option.
70
+
71
+ * `ext`: The extension directory (optional). You can put self-written extensions into this directory
72
+ so that they are used by webgen.
73
+
74
+ * `config.yaml`: This file can be used to set configuration options for the website. See the
75
+ [Configuration File]({relocatable: '#website-configfile'}) section for more information.
76
+
77
+ * `Rakefile`: This file is provided for your convenience to execute tasks via `rake` and provides
78
+ some useful tasks out of the box. See the [Rakefile]({relocatable: '#website-rakefile'}) section
79
+ for more information.
80
+
81
+
82
+ ## Configuration File {#website-configfile}
83
+
84
+ Many user will want to change some configuration options, for example, the default language of the
85
+ website since not all people will want to write websites in English. This is primarily done via the
86
+ configuration file.
87
+
88
+ The configuration file is called `config.yaml` and has to be placed directly under the website
89
+ directory. It uses [YAML](http://www.yaml.org) as file format. You can find a list of all available
90
+ configuration options that can be set in the [Configuration Options Reference]({relocatable:
91
+ reference_configuration.html}).
92
+
93
+ Each configuration option can be set in the configuration file by specifing the configuration option
94
+ name and the new value as a key/value pair. A sample configuration file looks like this:
95
+
96
+ website.lang: de
97
+ website.link_to_current_page: true
98
+
99
+ There is one special key called `default_meta_info` which behaves a little different. It does not
100
+ map to any configuration option but is used to update the meta information hashes of the
101
+ configuration option `sourcehandler.default_meta_info`. For example, the following configuration
102
+ file updates the default meta information for all source handlers by setting a new value for
103
+ `output_path_style` and setting `in_menu` to `true`:
104
+
105
+ default_meta_info:
106
+ :all:
107
+ output_path_style: [:parent, :cnbase, :ext, [., :lang]]
108
+ in_menu: true
109
+
110
+
111
+ ## Rakefile {#website-rakefile}
112
+
113
+ The Rakefile that is automatically created upon website creation provides a place to specify
114
+ recurring task for your website, for example, for deploying the website to a server. It contains
115
+ some useful tasks out of the box:
116
+
117
+ * `webgen`: Renders the webgen website once.
118
+ * `auto_webgen`: Automatically renders the website when a source file has changed.
119
+ * `clobber_webgen`: Removes all webgen generated products (the output files and the cache file).
120
+
121
+
122
+
48
123
  # All About Paths and Sources {#source}
49
124
 
50
125
  A source provides paths that identity files or directories. webgen can use paths from many sources.
@@ -312,35 +387,6 @@ There is clearly defined order in which meta information is applied to a node fo
312
387
 
313
388
 
314
389
 
315
- # The Configuration File
316
-
317
- Many user will want to change some configuration options, for example, the default language of the
318
- website since not all people will want to write websites in English. This is primarily done via the
319
- configuration file.
320
-
321
- The configuration file is called `config.yaml` and has to be placed directly under the website
322
- directory. It uses [YAML](http://www.yaml.org) as file format. You can find a list of all available
323
- configuration options that can be set in the [Configuration Options Reference]({relocatable:
324
- reference_configuration.html}).
325
-
326
- Each configuration option can be set in the configuration file by specifing the configuration option
327
- name and the new value as a key/value pair. A sample configuration file looks like this:
328
-
329
- website.lang: de
330
- website.link_to_current_page: true
331
-
332
- There is one special key called `default_meta_info` which behaves a little different. It does not
333
- map to any configuration option but is used to update the meta information hashes of the
334
- configuration option `sourcehandler.default_meta_info`. For example, the following configuration
335
- file updates the default meta information for all source handlers by setting a new value for
336
- `output_path_style` and setting `in_menu` to `true`:
337
-
338
- default_meta_info:
339
- :all:
340
- output_path_style: [:parent, :cnbase, :ext, [., :lang]]
341
- in_menu: true
342
-
343
-
344
390
  # Extending webgen
345
391
 
346
392
  If you know the programming language Ruby a little bit, you can easily extend webgen and add new
@@ -14,11 +14,25 @@ module Webgen
14
14
  # standard:: The standard cache saves data between webgen runs and returns the cached data (not
15
15
  # the newly set data) if it is available. This is useful, for example, to store file
16
16
  # modifcation times and check if a file has been changed between runs.
17
+ #
18
+ # The standard cache should be accessed through the <tt>[]</tt> method which returns the correct
19
+ # value and the <tt>[]=</tt> method should be used for setting the new value. However, if you
20
+ # really need to access a particular value of the old or new standard cache, you can use the
21
+ # accessors +old_data+ and +new_data+.
17
22
  class Cache
18
23
 
19
24
  # The permanent cache hash.
20
25
  attr_reader :permanent
21
26
 
27
+ # The volatile cache hash.
28
+ attr_reader :volatile
29
+
30
+ # The cache data stored in the previous webgen run.
31
+ attr_reader :old_data
32
+
33
+ # The cache data stored in the current webgen run.
34
+ attr_reader :new_data
35
+
22
36
  # Create a new cache object.
23
37
  def initialize()
24
38
  @old_data = {}
@@ -53,15 +67,9 @@ module Webgen
53
67
  [@old_data.merge(@new_data), @permanent]
54
68
  end
55
69
 
56
- # Return the volatile cache hash. If volatile caching has not been enabled, a new hash is
57
- # returned on every invocation!
58
- def volatile
59
- (@volatile[:enabled] ? @volatile : {})
60
- end
61
-
62
- # Enable the volatile cache.
63
- def enable_volatile_cache
64
- @volatile[:enabled] = true
70
+ # Reset the volatile cache.
71
+ def reset_volatile_cache
72
+ @volatile = {:classes => @volatile[:classes]}
65
73
  end
66
74
 
67
75
  # Return the unique instance of the class +name+. This method should be used when it is
@@ -58,6 +58,7 @@ module Webgen
58
58
 
59
59
  autoload :RunCommand, 'webgen/cli/run_command'
60
60
  autoload :CreateCommand, 'webgen/cli/create_command'
61
+ autoload :WebguiCommand, 'webgen/cli/webgui_command'
61
62
 
62
63
  autoload :Utils, 'webgen/cli/utils'
63
64
 
@@ -81,6 +82,7 @@ module Webgen
81
82
  @directory = Dir.pwd
82
83
  @verbosity = :normal
83
84
  @log_level = ::Logger::WARN
85
+ @log_filter = nil
84
86
 
85
87
  self.program_name = "webgen"
86
88
  self.program_version = Webgen::VERSION
@@ -89,7 +91,7 @@ module Webgen
89
91
  opts.on("--directory DIR", "-d", String, "The website directory (default: the current directory)") {|@directory|}
90
92
  opts.on("--verbose", "-v", "Print more output") { @verbosity = :verbose }
91
93
  opts.on("--quiet", "-q", "No output") { @verbosity = :quiet }
92
- opts.on("--log-level", "-l", [0, 1, 2, 3], "The logging level (0..debug, 3..error)") {|@log_level|}
94
+ opts.on("--log-level LEVEL", "-l", Integer, "The logging level (0..debug, 3..error)") {|@log_level|}
93
95
  opts.on("--log-filter", "-f", Regexp, 'Filter for logging events') {|@log_filter|}
94
96
  end
95
97
  self.add_command(CmdParse::HelpCommand.new)
@@ -10,7 +10,11 @@ module Webgen::CLI
10
10
  class Utils
11
11
 
12
12
  USE_ANSI_COLORS = !Config::CONFIG['arch'].include?('mswin32')
13
- DEFAULT_WIDTH = ((size = %x{stty size 2>/dev/null}).length > 0 ? x.split.last.to_i : 72) rescue 72
13
+ DEFAULT_WIDTH = if Config::CONFIG['arch'].include?('mswin32')
14
+ 72
15
+ else
16
+ ((size = %x{stty size 2>/dev/null}).length > 0 ? size.split.last.to_i : 72) rescue 72
17
+ end
14
18
 
15
19
  # Used for dynamically formatting the text (setting color, bold face, ...).
16
20
  def self.method_missing(id, text = nil)
@@ -0,0 +1,48 @@
1
+ require 'webgen/cli'
2
+
3
+ module Webgen::CLI
4
+
5
+ # The CLI command for starting the webgen webgui.
6
+ class WebguiCommand < CmdParse::Command
7
+
8
+ def initialize # :nodoc:
9
+ super('webgui', false)
10
+ self.short_desc = 'Starts the webgen webgui'
11
+ end
12
+
13
+ # Render the website.
14
+ def execute(args)
15
+ # some fixes for ramaze-2008.06
16
+ # - fix for Windows bug when win32console is not installed
17
+ # - fix for message displayed on shutdown
18
+ $:.unshift File.join(Webgen.data_dir, 'webgui', 'overrides')
19
+ require 'win32console'
20
+ $:.shift
21
+ require 'ramaze'
22
+ Ramaze::Log.loggers = []
23
+ def Ramaze.shutdown; end
24
+
25
+ acquire Webgen.data_dir/:webgui/:controller/'*'
26
+ Ramaze::Global.setup do |g|
27
+ g.root = Webgen.data_dir/:webgui
28
+ g.public_root = Webgen.data_dir/:webgui/:public
29
+ g.view_root = Webgen.data_dir/:webgui/:view
30
+ g.adapter = :webrick
31
+ g.port = 7000
32
+ end
33
+
34
+ puts 'Starting webgui on http://localhost:7000, press Control-C to stop'
35
+ Thread.new do
36
+ sleep 2
37
+ puts 'Launching web browser'
38
+ require 'launchy'
39
+ Launchy.open('http://localhost:7000')
40
+ end
41
+
42
+ Ramaze.start
43
+ puts 'webgui finished'
44
+ end
45
+
46
+ end
47
+
48
+ end
@@ -50,6 +50,10 @@ module Webgen
50
50
  # not be set to +false+ once it is +true+!
51
51
  attr_accessor :dirty
52
52
 
53
+ # Set by other objects to +true+ if the meta information of the node has changed since the last
54
+ # run. Must not be set to +false+ once it is +true+!
55
+ attr_accessor :dirty_meta_info
56
+
53
57
  # Has the node been created or has it been read from the cache?
54
58
  attr_accessor :created
55
59
 
@@ -120,6 +124,15 @@ module Webgen
120
124
  @dirty
121
125
  end
122
126
 
127
+ # Return +true+ if the meta information of the node has changed.
128
+ def meta_info_changed?
129
+ @dirty_meta_info = node_info[:used_meta_info_nodes].any? do |n|
130
+ n != @absolute_lcn && (!tree[n] || tree[n].meta_info_changed?)
131
+ end unless @dirty_meta_info
132
+ website.blackboard.dispatch_msg(:node_meta_info_changed?, self) unless @dirty_meta_info
133
+ @dirty_meta_info
134
+ end
135
+
123
136
  # Return an informative representation of the node.
124
137
  def inspect
125
138
  "<##{self.class.name}: alcn=#{@absolute_lcn}>"
@@ -133,7 +146,7 @@ module Webgen
133
146
  # Sort nodes by using the meta info +sort_info+ (or +title+ if +sort_info+ is not set) of both
134
147
  # involved nodes.
135
148
  def <=>(other)
136
- self_so = (self['sort_info'] && self['sort_info'].to_s) || self['title'] || ''
149
+ self_so = (@meta_info['sort_info'] && @meta_info['sort_info'].to_s) || @meta_info['title'] || ''
137
150
  other_so = (other['sort_info'] && other['sort_info'].to_s) || other['title'] || ''
138
151
  if self_so !~ /\D/ && other_so !~ /\D/
139
152
  self_so = self_so.to_i
@@ -295,6 +308,7 @@ module Webgen
295
308
  @parent.children << self unless @parent == @tree
296
309
 
297
310
  self.node_info[:used_nodes] = Set.new
311
+ self.node_info[:used_meta_info_nodes] = Set.new
298
312
  end
299
313
 
300
314
  # Delegate missing methods to a processor. The current node is placed into the argument array as