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
@@ -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