webgen 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/ChangeLog +201 -0
  2. data/Rakefile +3 -2
  3. data/TODO +31 -4
  4. data/VERSION +1 -1
  5. data/data/webgen/example/config.yaml +2 -0
  6. data/data/webgen/example/src/default.css +84 -0
  7. data/data/webgen/example/src/default.template +32 -0
  8. data/data/webgen/example/src/index.page +8 -0
  9. data/{doc/src → data/webgen/images}/generated_by_webgen.png +0 -0
  10. data/data/webgen/images/valid-css.gif +0 -0
  11. data/data/webgen/images/valid-xhtml11.png +0 -0
  12. data/data/webgen/images/webgen_logo.png +0 -0
  13. data/doc/config.yaml +2 -0
  14. data/doc/plugin/extension.rb +8 -4
  15. data/doc/plugin/resources.rb +30 -0
  16. data/doc/src/default.css +251 -149
  17. data/doc/src/default.template +8 -8
  18. data/doc/src/documentation/gettingstarted.page +1 -1
  19. data/doc/src/documentation/index.page +6 -2
  20. data/doc/src/documentation/plugins/filehandler/backing.page +22 -9
  21. data/doc/src/documentation/plugins/filehandler/galleryhandler.page +1 -1
  22. data/doc/src/documentation/plugins/filehandler/index.page +9 -4
  23. data/doc/src/documentation/plugins/filehandler/pagehandler.page +33 -10
  24. data/doc/src/documentation/plugins/index.page +9 -1
  25. data/doc/src/documentation/plugins/menustyles/horizontal-dropdown.page +42 -0
  26. data/doc/src/documentation/plugins/menustyles/horizontal.page +21 -0
  27. data/doc/src/documentation/plugins/menustyles/index.page +12 -0
  28. data/doc/src/documentation/plugins/menustyles/partial.page +27 -0
  29. data/doc/src/documentation/plugins/menustyles/vertical-dropdown.page +23 -0
  30. data/doc/src/documentation/plugins/menustyles/vertical.page +32 -0
  31. data/doc/src/documentation/plugins/resourcemanager.page +30 -0
  32. data/doc/src/documentation/plugins/tags/index.page +2 -2
  33. data/doc/src/documentation/plugins/tags/langbar.page +4 -4
  34. data/doc/src/documentation/plugins/tags/menu.page +6 -17
  35. data/doc/src/documentation/plugins/tags/navbar.page +2 -1
  36. data/doc/src/documentation/plugins/tags/resource.page +22 -0
  37. data/doc/src/download.page +1 -1
  38. data/doc/src/features.page +32 -9
  39. data/doc/src/index.page +24 -10
  40. data/doc/src/meta.info +16 -6
  41. data/install.rb +1 -1
  42. data/lib/webgen/configuration.rb +24 -2
  43. data/lib/webgen/node.rb +29 -5
  44. data/lib/webgen/plugin.rb +1 -5
  45. data/lib/webgen/plugins/contenthandler/textile.rb +3 -3
  46. data/lib/webgen/plugins/filehandler/backing.rb +5 -4
  47. data/lib/webgen/plugins/filehandler/directory.rb +3 -3
  48. data/lib/webgen/plugins/filehandler/filehandler.rb +8 -4
  49. data/lib/webgen/plugins/filehandler/page.rb +33 -18
  50. data/lib/webgen/plugins/filehandler/picturegallery.rb +10 -8
  51. data/lib/webgen/plugins/menustyles/defaultmenustyle.rb +73 -0
  52. data/lib/webgen/plugins/menustyles/horizontal.rb +93 -0
  53. data/lib/webgen/plugins/menustyles/horizontal_dropdown.rb +113 -0
  54. data/lib/webgen/plugins/menustyles/partial.rb +95 -0
  55. data/lib/webgen/plugins/menustyles/vertical.rb +107 -0
  56. data/lib/webgen/plugins/menustyles/vertical_dropdown.rb +107 -0
  57. data/lib/webgen/plugins/resourcemanager.rb +264 -0
  58. data/lib/webgen/plugins/tags/langbar.rb +9 -5
  59. data/lib/webgen/plugins/tags/menu.rb +4 -66
  60. data/lib/webgen/plugins/treewalker.rb +7 -6
  61. data/lib/webgen/webgen.rb +72 -161
  62. metadata +37 -6
  63. data/doc/src/logo.png +0 -0
@@ -0,0 +1,107 @@
1
+ #
2
+ #--
3
+ #
4
+ # $Id: vertical.rb 293 2005-06-11 08:37:51Z thomas $
5
+ #
6
+ # webgen: template based static website generator
7
+ # Copyright (C) 2004 Thomas Leitner
8
+ #
9
+ # This program is free software; you can redistribute it and/or modify it under the terms of the GNU
10
+ # General Public License as published by the Free Software Foundation; either version 2 of the
11
+ # License, or (at your option) any later version.
12
+ #
13
+ # This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
14
+ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ # General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License along with this program; if not,
18
+ # write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
+ #
20
+ #++
21
+ #
22
+
23
+ require 'webgen/plugins/menustyles/defaultmenustyle'
24
+
25
+ module MenuStyles
26
+
27
+ class VerticalMenuStyle < MenuStyles::DefaultMenuStyle
28
+
29
+ summary "Builds a vertical menu"
30
+
31
+ register_menu_style 'vertical'
32
+
33
+ add_param 'level', 1, \
34
+ 'Specifies how many levels the menu should have by default, ie. how deep it is. ' \
35
+ 'For example, if level = 3, then three levels are always shown at least.'
36
+ add_param 'subtreeLevel', 3, \
37
+ 'Specifies how many levels should be shown for subtrees. The number specifies ' \
38
+ 'the maximum depth the menu will have.'
39
+ add_param 'showCurrentSubtreeOnly', true, \
40
+ 'True if only the current subtree should be shown in the menu. If set to false, ' \
41
+ 'each subtree will be shown.'
42
+
43
+ CSS = "
44
+ /* START Webgen vertical menu style */
45
+ .webgen-menu-vert li > ul {
46
+ font-size: 95%;
47
+ }
48
+
49
+ .webgen-menu-vert ul {
50
+ padding: 0px;
51
+ margin-left: 10px;
52
+ }
53
+
54
+ .webgen-menu-vert li {
55
+ padding-left: 5px;
56
+ }
57
+
58
+ .webgen-menu-vert .webgen-menu-submenu-inhierarchy > a {
59
+ font-weight: bold;
60
+ }
61
+
62
+ .webgen-menu-vert .webgen-menu-item-selected > a {
63
+ font-weight: bold;
64
+ }
65
+ /* STOP Webgen vertical menu style */
66
+ "
67
+
68
+ def internal_build_menu( srcNode, menuTree )
69
+ unless defined?( @css_added )
70
+ Webgen::Plugin['ResourceManager'].append_data( 'webgen-css', CSS )
71
+ @css_added = true
72
+ end
73
+ "<div class=\"webgen-menu-vert #{get_param('divClass')}\">#{submenu( srcNode, menuTree, 1 )}</div>"
74
+ end
75
+
76
+ #######
77
+ private
78
+ #######
79
+
80
+ def submenu( srcNode, node, level )
81
+ if node.nil? \
82
+ || level > get_param( 'subtreeLevel' ) \
83
+ || ( level > get_param( 'level' ) \
84
+ && ( node['node'].level > srcNode.level \
85
+ || ( get_param( 'showCurrentSubtreeOnly' ) && !srcNode.in_subtree?( node['node'] ) )
86
+ )
87
+ )
88
+ return ''
89
+ end
90
+
91
+ out = "<ul>"
92
+ node.each do |child|
93
+ menu = child['node']['int:directory?'] ? submenu( srcNode, child, level + 1 ) : ''
94
+ style, link = menu_item_details( srcNode, child['node'] )
95
+
96
+ out << "<li #{style}>#{link}"
97
+ out << menu
98
+ out << "</li>"
99
+ end
100
+ out << "</ul>"
101
+
102
+ return out
103
+ end
104
+
105
+ end
106
+
107
+ end
@@ -0,0 +1,107 @@
1
+ #
2
+ #--
3
+ #
4
+ # $Id: vertical_dropdown.rb 300 2005-06-14 10:04:17Z thomas $
5
+ #
6
+ # webgen: template based static website generator
7
+ # Copyright (C) 2004 Thomas Leitner
8
+ #
9
+ # This program is free software; you can redistribute it and/or modify it under the terms of the GNU
10
+ # General Public License as published by the Free Software Foundation; either version 2 of the
11
+ # License, or (at your option) any later version.
12
+ #
13
+ # This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
14
+ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ # General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License along with this program; if not,
18
+ # write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
+ #
20
+ #++
21
+ #
22
+
23
+ require 'webgen/plugins/menustyles/defaultmenustyle'
24
+
25
+ module MenuStyles
26
+
27
+ class VerticalDropdownMenuStyle < MenuStyles::DefaultMenuStyle
28
+
29
+ summary "Builds a vertical menu with CSS drop down submenus"
30
+
31
+ register_menu_style 'vertical-dropdown'
32
+
33
+ CSS = "
34
+ /* START Webgen vertical dropdown menu style */
35
+ .webgen-menu-vert-dd ul {
36
+ list-style-type: none;
37
+ margin: 0;
38
+ padding: 0;
39
+ width: 15em;
40
+ }
41
+
42
+ .webgen-menu-vert-dd ul ul {
43
+ border: 1px solid black;
44
+ position: absolute;
45
+ z-index: 500;
46
+ left: 100%;
47
+ top: 0;
48
+ }
49
+
50
+ .webgen-menu-vert-dd a {
51
+ display: block;
52
+ margin: 0px;
53
+ padding: 3px 3px;
54
+ background-color: white;
55
+ }
56
+
57
+ .webgen-menu-vert-dd li {
58
+ position: relative;
59
+ }
60
+
61
+ .webgen-menu-vert-dd ul ul {
62
+ display: none;
63
+ }
64
+
65
+ .webgen-menu-vert-dd ul li:hover > ul > ul {
66
+ display: none;
67
+ }
68
+
69
+ .webgen-menu-vert-dd ul li:hover > ul {
70
+ display: block;
71
+ }
72
+ /* STOP Webgen vertical dropdown menu style */
73
+ "
74
+
75
+ def internal_build_menu( srcNode, menuTree )
76
+ unless defined?( @css_added )
77
+ Webgen::Plugin['ResourceManager'].append_data( 'webgen-css', CSS )
78
+ @css_added = true
79
+ end
80
+ "<div class=\"webgen-menu-vert-dd #{get_param('divClass')}\">#{submenu( srcNode, menuTree, 1 )}</div>"
81
+ end
82
+
83
+ #######
84
+ private
85
+ #######
86
+
87
+ def submenu( srcNode, node, level )
88
+ out = ''
89
+ out = "<ul>" if level > 1
90
+ node.each do |child|
91
+ menu = child['node']['int:directory?'] ? submenu( srcNode, child, level + 1 ) : ''
92
+ style, link = menu_item_details( srcNode, child['node'] )
93
+
94
+ out << "<ul>" if level == 1
95
+ out << "<li #{style}>#{link}"
96
+ out << menu
97
+ out << "</li>"
98
+ out << "</ul>" if level == 1
99
+ end
100
+ out << "</ul>" if level > 1
101
+
102
+ return out
103
+ end
104
+
105
+ end
106
+
107
+ end
@@ -0,0 +1,264 @@
1
+ #
2
+ #--
3
+ #
4
+ # $Id: resourcemanager.rb 300 2005-06-14 10:04:17Z thomas $
5
+ #
6
+ # webgen: template based static website generator
7
+ # Copyright (C) 2004 Thomas Leitner
8
+ #
9
+ # This program is free software; you can redistribute it and/or modify it under the terms of the GNU
10
+ # General Public License as published by the Free Software Foundation; either version 2 of the
11
+ # License, or (at your option) any later version.
12
+ #
13
+ # This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
14
+ # even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
+ # General Public License for more details.
16
+ #
17
+ # You should have received a copy of the GNU General Public License along with this program; if not,
18
+ # write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19
+ #
20
+ #++
21
+ #
22
+
23
+ require 'rbconfig'
24
+ require 'fileutils'
25
+ require 'webgen/plugins/tags/tags'
26
+ require 'webgen/plugins/filehandler/filehandler'
27
+
28
+ module Webgen
29
+
30
+ class ResourceManager < Plugin
31
+
32
+ class Resource
33
+
34
+ attr_reader :name
35
+ attr_reader :output_path
36
+ attr_accessor :predefined
37
+ attr_accessor :type
38
+
39
+ def initialize( name, type, output_path )
40
+ @name = name
41
+ @type = type
42
+ @output_path = output_path.sub( /^\//, '' )
43
+ @used = false
44
+ end
45
+
46
+ # Returns the relative path from the node to the resource.
47
+ def relpath_from_node( node )
48
+ node.relpath_to_string( '/' + @output_path )
49
+ end
50
+
51
+ # Returns the complete destination path.
52
+ def dest_path
53
+ File.join( Webgen::Plugin['Configuration']['outDirectory'], @output_path )
54
+ end
55
+
56
+ # Mark the resource as referenced. Only referenced resources are written to the output directory.
57
+ def referenced!
58
+ @referenced = true
59
+ end
60
+
61
+ # Has the resource been used somewhere?
62
+ def referenced?
63
+ @referenced
64
+ end
65
+
66
+ # Can the resource be written to the output directory?
67
+ def write_resource?
68
+ @referenced
69
+ end
70
+
71
+ # Write the resource to the output directory.
72
+ def write_resource
73
+ raise NotImplementedError
74
+ end
75
+
76
+ end
77
+
78
+ class FileResource < Resource
79
+
80
+ attr_reader :res_path
81
+
82
+ def initialize( name, output_path, res_path )
83
+ super( name, :file, output_path )
84
+ @res_path = res_path
85
+ end
86
+
87
+ def data
88
+ File.read( @res_path )
89
+ end
90
+
91
+ def write_resource?
92
+ referenced? && Webgen::Plugin['FileHandler'].file_modified?( @res_path, dest_path )
93
+ end
94
+
95
+ def write_resource
96
+ FileUtils.cp( res_path, dest_path ) if write_resource?
97
+ end
98
+
99
+ end
100
+
101
+ class MemoryResource < Resource
102
+
103
+ def initialize( name, output_path )
104
+ super( name, :memory, output_path )
105
+ @data = ''
106
+ end
107
+
108
+ def data
109
+ @data
110
+ end
111
+
112
+ def append_data( data )
113
+ @data << data
114
+ end
115
+
116
+ def write_resource
117
+ File.open( dest_path, 'w' ) {|file| file.write( data )} if write_resource?
118
+ end
119
+
120
+ end
121
+
122
+
123
+ summary "Provides access to pre- and userdefined resources"
124
+ description "The resource manager manages a list of predefined and " \
125
+ "userdefined resources. These resources can be used in page files."
126
+ add_param 'resources', [], 'User defined file resources. Value has to be an array of arrays with three strings defining '\
127
+ 'name, resource path and output path'
128
+
129
+ depends_on 'FileHandler'
130
+
131
+ attr_reader :data_dir
132
+
133
+ def initialize
134
+ Plugin.config[self.class].resources = {}
135
+ Plugin['FileHandler'].add_msg_listener( :AFTER_ALL_WRITTEN, method( :write_resources ) )
136
+ define_webgen_resources unless Webgen::Configuration.data_dir.empty?
137
+ define_user_resources
138
+ end
139
+
140
+
141
+ # Adds an exisiting file resource which can be referenced later by using +name+. The +output_path+
142
+ # should be an absolute path, like +/images/logo.png+. If not, it will be relative to the output
143
+ # directory.
144
+ def define_file_resource( name, resource_path, output_path )
145
+ if !File.exists?( resource_path )
146
+ logger.error { "Path <#{resource_path}> for resource #{name} is invalid!" }
147
+ else
148
+ define_resource( name, FileResource.new( name, output_path, resource_path ) )
149
+ end
150
+ end
151
+
152
+
153
+ # Adds a new resource which can be referenced later by using +name+. The +output_path+
154
+ # should be an absolute path, like +/images/logo.png+. If not, it will be relative to the output
155
+ # directory.
156
+ def define_memory_resource( name, output_path )
157
+ define_resource( name, MemoryResource.new( name, output_path ) )
158
+ end
159
+
160
+
161
+ # Returns the requested resource.
162
+ def get_resource( name )
163
+ Plugin.config[self.class].resources[name]
164
+ end
165
+
166
+
167
+ # Appends given +data+ to the resource +name+. Data can only be appended to memory resources!
168
+ def append_data( name, data )
169
+ if (res = get_resource( name )) && res.type == :memory
170
+ res.append_data( data )
171
+ else
172
+ logger.error {"Resource #{name} does not exist or data cannot be appended to it!" }
173
+ end
174
+ end
175
+
176
+ #######
177
+ private
178
+ #######
179
+
180
+ def define_resource( name, res )
181
+ if Plugin.config[self.class].resources.has_key?( name )
182
+ logger.error { "Resource #{name} already defined, not using new definition (#{res.inspect})" }
183
+ else
184
+ logger.info { "Adding resource #{name} to pool (#{res.inspect})" }
185
+ Plugin.config[self.class].resources[name] = res
186
+ end
187
+ end
188
+
189
+ def define_webgen_resources
190
+ define_file_resource( 'webgen-logo', File.join( Webgen::Configuration.data_dir, 'images', 'webgen_logo.png' ),
191
+ '/images/webgen-logo.png' ).predefined = "The logo of webgen as seen on the homepage."
192
+ define_file_resource( 'webgen-generated', File.join( Webgen::Configuration.data_dir, 'images', 'generated_by_webgen.png' ),
193
+ '/images/webgen-generated-by.png' ).predefined = "A 88x31 image for use on web sites that were generated by webgen."
194
+ define_file_resource( 'w3c-valid-css', File.join( Webgen::Configuration.data_dir, 'images', 'valid-css.gif' ),
195
+ '/images/w3c-valid-css.gif' ).predefined = 'The W3C image for valid css.'
196
+ define_file_resource( 'w3c-valid-xhtml11', File.join( Webgen::Configuration.data_dir, 'images', 'valid-xhtml11.png' ),
197
+ '/images/w3c-valid-xhtml11.png' ).predefined = "The W3C image for valid XHTML1.1"
198
+
199
+ define_memory_resource( 'webgen-css', '/css/webgen.css' ).predefined = "Plugins use this resource for their CSS styles."
200
+ define_memory_resource( 'webgen-javascript', '/css/webgen.js' ).predefined = "Plugins use this resource for their Javascript fragments."
201
+ end
202
+
203
+ def define_user_resources
204
+ p = get_param( 'resources' )
205
+ if !p.kind_of?( Array ) || p.find {|h| !h.kind_of?( Array ) || h.length != 3}
206
+ logger.error { "Parameter resources not correctly structured!" }
207
+ return
208
+ end
209
+ p.each {|name, res_path, out_path| define_file_resource( name, res_path, out_path ) }
210
+ end
211
+
212
+
213
+ def write_resources
214
+ Plugin.config[self.class].resources.each do |name, res|
215
+ if res.write_resource?
216
+ begin
217
+ FileUtils.makedirs( File.dirname( res.dest_path ) )
218
+ res.write_resource
219
+ logger.info { "Resource #{name} written to <#{res.dest_path}>" }
220
+ rescue Exception => e
221
+ logger.error { "Error while writing resource #{name}: #{e.message}" }
222
+ end
223
+ end
224
+ end
225
+ end
226
+
227
+ end
228
+
229
+ end
230
+
231
+
232
+ module Tags
233
+
234
+ class ResourceTag < DefaultTag
235
+
236
+ summary "Used for referencing resources"
237
+ description "This tag should be used output the path to a resource or the resource itself."
238
+
239
+ add_param 'name', nil, 'The name of the resource'
240
+ add_param 'insert', :path, 'What should be returned by the tag: the path to the resource (value :path) ' \
241
+ 'or the data (value :data)'
242
+
243
+ set_mandatory 'name', true
244
+
245
+ depends_on 'Tags'
246
+
247
+ def initialize
248
+ super
249
+ register_tag( 'resource' )
250
+ end
251
+
252
+ def process_tag( tag, node, refNode )
253
+ result = ''
254
+ if res = Webgen::Plugin['ResourceManager'].get_resource( get_param( 'name' ) )
255
+ result = (get_param( 'insert' ) == :path ? res.referenced! && res.relpath_from_node( node ) : res.data )
256
+ else
257
+ logger.error { "Could not retrieve resource #{get_param( 'name' )} as it does not exist!" }
258
+ end
259
+ result
260
+ end
261
+
262
+ end
263
+
264
+ end