webgen 0.3.2 → 0.3.3

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 (77) hide show
  1. data/ChangeLog +224 -0
  2. data/Rakefile +2 -3
  3. data/TODO +18 -1
  4. data/VERSION +1 -1
  5. data/doc/plugin/clidesc.rb +35 -0
  6. data/doc/plugin/extension.rb +73 -0
  7. data/doc/src/about.page +2 -1
  8. data/doc/src/default.css +5 -1
  9. data/doc/src/default.template +9 -0
  10. data/doc/src/documentation/cli.page +12 -0
  11. data/doc/src/documentation/gettingstarted.page +150 -0
  12. data/doc/src/documentation/index.page +1 -19
  13. data/doc/src/documentation/{contenthandler → plugins/contenthandler}/html.page +0 -0
  14. data/doc/src/documentation/{contenthandler → plugins/contenthandler}/index.page +0 -0
  15. data/doc/src/documentation/{contenthandler → plugins/contenthandler}/markdown.page +0 -0
  16. data/doc/src/documentation/{contenthandler → plugins/contenthandler}/rdoc.page +0 -0
  17. data/doc/src/documentation/{contenthandler → plugins/contenthandler}/textile.page +0 -0
  18. data/doc/src/documentation/plugins/filehandler/backing.page +33 -0
  19. data/doc/src/documentation/{filehandler → plugins/filehandler}/copy.page +0 -0
  20. data/doc/src/documentation/{filehandler → plugins/filehandler}/directory.page +1 -2
  21. data/doc/src/documentation/{filehandler → plugins/filehandler}/galleryhandler.page +1 -1
  22. data/doc/src/documentation/{filehandler → plugins/filehandler}/index.page +0 -0
  23. data/doc/src/documentation/{filehandler → plugins/filehandler}/pagehandler.page +0 -0
  24. data/doc/src/documentation/{filehandler → plugins/filehandler}/template.page +0 -0
  25. data/doc/src/documentation/{gallerylayouter → plugins/gallerylayouter}/defaultlayouter.page +0 -0
  26. data/doc/src/documentation/{gallerylayouter → plugins/gallerylayouter}/index.page +0 -0
  27. data/doc/src/documentation/{htmlvalidator → plugins/htmlvalidator}/index.page +0 -0
  28. data/doc/src/documentation/{htmlvalidator → plugins/htmlvalidator}/xmllint.page +0 -0
  29. data/doc/src/documentation/plugins/index.page +20 -0
  30. data/doc/src/documentation/plugins/system/configuration.page +12 -0
  31. data/doc/src/documentation/plugins/system/index.page +7 -0
  32. data/doc/src/documentation/plugins/system/logging.page +13 -0
  33. data/doc/src/documentation/{tags → plugins/tags}/date.page +0 -0
  34. data/doc/src/documentation/{tags → plugins/tags}/executecommand.page +0 -1
  35. data/doc/src/documentation/{tags → plugins/tags}/includefile.page +0 -0
  36. data/doc/src/documentation/{tags → plugins/tags}/index.page +2 -2
  37. data/doc/src/documentation/{tags → plugins/tags}/langbar.de.page +0 -0
  38. data/doc/src/documentation/{tags → plugins/tags}/langbar.page +1 -1
  39. data/doc/src/documentation/{tags → plugins/tags}/menu.de.page +1 -0
  40. data/doc/src/documentation/{tags → plugins/tags}/menu.page +1 -1
  41. data/doc/src/documentation/{tags → plugins/tags}/meta.page +0 -0
  42. data/doc/src/documentation/{tags → plugins/tags}/multilang.de.page +0 -0
  43. data/doc/src/documentation/{tags → plugins/tags}/multilang.fr.page +0 -0
  44. data/doc/src/documentation/{tags → plugins/tags}/multilang.page +0 -0
  45. data/doc/src/documentation/{tags → plugins/tags}/navbar.page +0 -0
  46. data/doc/src/documentation/{tags → plugins/tags}/relocatable.page +0 -0
  47. data/doc/src/documentation/{tags → plugins/tags}/sitemap.page +0 -0
  48. data/doc/src/documentation/{tags → plugins/tags}/wikilink.page +0 -0
  49. data/doc/src/download.page +1 -0
  50. data/doc/src/index.page +26 -8
  51. data/doc/src/meta.info +13 -18
  52. data/install.rb +1 -1
  53. data/lib/webgen/configuration.rb +6 -153
  54. data/lib/webgen/logging.rb +38 -10
  55. data/lib/webgen/node.rb +26 -6
  56. data/lib/webgen/plugin.rb +168 -0
  57. data/lib/webgen/plugins/filehandler/backing.rb +11 -56
  58. data/lib/webgen/plugins/filehandler/directory.rb +8 -8
  59. data/lib/webgen/plugins/filehandler/filecopy.rb +2 -2
  60. data/lib/webgen/plugins/filehandler/filehandler.rb +5 -9
  61. data/lib/webgen/plugins/filehandler/page.rb +40 -79
  62. data/lib/webgen/plugins/filehandler/picturegallery.rb +3 -3
  63. data/lib/webgen/plugins/filehandler/template.rb +2 -2
  64. data/lib/webgen/plugins/tags/langbar.rb +2 -2
  65. data/lib/webgen/plugins/tags/menu.rb +5 -13
  66. data/lib/webgen/plugins/tags/relocatable.rb +2 -2
  67. data/lib/webgen/plugins/tags/sitemap.rb +2 -2
  68. data/lib/webgen/plugins/tags/wikilink.rb +4 -3
  69. data/lib/webgen/webgen.rb +262 -57
  70. data/testsite/src/default.template +1 -1
  71. data/testsite/src/images/bghack.png +0 -0
  72. data/testsite/src/meta.info +7 -10
  73. metadata +65 -44
  74. data/doc/extension.config +0 -60
  75. data/doc/src/documentation/extloader.page +0 -20
  76. data/doc/src/documentation/filehandler/backing.page +0 -16
  77. data/lib/webgen/plugins/extloader.rb +0 -88
data/doc/src/meta.info CHANGED
@@ -1,22 +1,17 @@
1
- index.page:
2
- en:
3
- menuOrder: 1
1
+ index.html:
2
+ menuOrder: 1
4
3
 
5
- download.page:
6
- en:
7
- menuOrder: 3
4
+ download.html:
5
+ menuOrder: 3
8
6
 
9
- features.page:
10
- en:
11
- menuOrder: 5
7
+ features.html:
8
+ menuOrder: 5
12
9
 
13
- api.page:
14
- en:
15
- dest: rdoc/index.html
16
- title: API Reference
17
- menuOrder: 7
18
- inMenu: true
10
+ api.html:
11
+ dest: rdoc/index.html
12
+ title: API Reference
13
+ menuOrder: 7
14
+ inMenu: true
19
15
 
20
- documentation/index.page:
21
- en:
22
- menuOrder: 9
16
+ documentation/index.html:
17
+ menuOrder: 9
data/install.rb CHANGED
@@ -3,7 +3,7 @@ require 'rpa/install'
3
3
 
4
4
  class Install_webgen < RPA::Install::FullInstaller
5
5
  name 'webgen'
6
- version '0.3.2-1'
6
+ version '0.3.3-1'
7
7
  classification Application
8
8
  build do
9
9
  installdocs %w[COPYING ChangeLog TODO]
@@ -1,7 +1,7 @@
1
1
  #
2
2
  #--
3
3
  #
4
- # $Id: configuration.rb 229 2005-03-17 09:20:12Z thomas $
4
+ # $Id: configuration.rb 259 2005-04-21 10:37:47Z thomas $
5
5
  #
6
6
  # webgen: template based static website generator
7
7
  # Copyright (C) 2004 Thomas Leitner
@@ -20,12 +20,10 @@
20
20
  #++
21
21
  #
22
22
 
23
- require 'yaml'
24
- require 'ostruct'
25
23
  require 'find'
26
24
  require 'tsort'
27
25
  require 'webgen/node'
28
- require 'webgen/logging'
26
+ require 'webgen/plugin'
29
27
 
30
28
  # Helper class for calculating plugin dependencies.
31
29
  class Dependency < Hash
@@ -37,168 +35,28 @@ class Dependency < Hash
37
35
  end
38
36
  end
39
37
 
40
- class OpenStruct
41
- public :table #:nodoc:#
42
- end
43
-
44
38
  module Webgen
45
39
 
46
- VERSION = [0, 3, 2]
40
+ VERSION = [0, 3, 3]
47
41
  SUMMARY = "Webgen is a templated based static website generator."
48
42
  DESCRIPTION = "Webgen is a web page generator implemented in Ruby. " \
49
43
  "It is used to generate static web pages from templates and page " \
50
44
  "description files."
51
45
 
52
- # Base class for all plugins.
53
- class Plugin
54
-
55
- # Holds the plugin data from each and every plugin.
56
- @@config = {}
57
-
58
- def self.inherited( klass )
59
- (@@config[klass] = OpenStruct.new).klass = klass
60
- @@config[klass].plugin = klass.name.split( /::/ ).last
61
- end
62
-
63
- ['extension', 'summary', 'description'].each do |name|
64
- self.module_eval "def self.#{name}( obj ); @@config[self].#{name} = obj; end"
65
- end
66
-
67
- # Return plugin data
68
- def self.config
69
- @@config
70
- end
71
-
72
- # Add a dependency to the plugin. Dependencies are instantiated before the plugin gets
73
- # instantiated.
74
- def self.depends_on( *dep )
75
- dep.each {|d| (@@config[self].dependencies ||= []) << d}
76
- end
77
-
78
- # Shortcut for getting the plugin with the name +name+.
79
- def self.[]( name )
80
- pair = @@config.find {|k,v| v.plugin == name }
81
- self.logger.warn { "Could not retrieve plugin '#{name}' as such a plugin does not exist!" } if pair.nil?
82
- pair[1].obj unless pair.nil?
83
- end
84
-
85
- # Add a parameter for the current class. Has to be used by subclasses to define their parameters!
86
- #
87
- # Arguments:
88
- # +name+:: the name of the parameter
89
- # +default+:: the default value of the parameter
90
- # +description+:: a small description of the parameter
91
- def self.add_param( name, default, description )
92
- self.logger.debug { "Adding parameter '#{name}' for plugin class '#{self.name}'" }
93
- data = OpenStruct.new( :name => name, :value => default, :default => default, :description => description )
94
- (@@config[self].params ||= {})[name] = data
95
- end
96
-
97
- # Set parameter +name+ for +plugin+ to +value+.
98
- def self.set_param( plugin, name, value )
99
- found = catch( :found ) do
100
- item = @@config.find {|k,v| v.plugin == plugin }[1]
101
- item.klass.ancestor_classes.each do |k|
102
- item = @@config[k]
103
- if !item.nil? && !item.params.nil? && item.params.has_key?( name )
104
- item.params[name].value = value
105
- logger.debug { "Setting parameter '#{name}' for plugin '#{plugin}' to #{value.inspect}" }
106
- throw :found, true
107
- end
108
- end
109
- end
110
- logger.error { "Cannot set undefined parameter '#{name}' for plugin '#{plugin}'" } unless found
111
- end
112
-
113
- # Return parameter +name+.
114
- def []( name )
115
- self.class.ancestor_classes.each do |klass|
116
- data = @@config[klass]
117
- return data.params[name].value unless data.params.nil? || data.params[name].nil?
118
- end
119
- logger.error { "Referencing invalid configuration value '#{name}' in class #{self.class.name}" }
120
- return nil
121
- end
122
-
123
- # Set parameter +name+.
124
- def []=( name, value )
125
- self.class.set_param( @@config[self.class].plugin, name, value )
126
- end
127
- alias get_param []
128
-
129
- # Checks if the plugin has a parameter +name+.
130
- def has_param?( name )
131
- self.class.ancestor_classes.any? do |klass|
132
- !@@config[klass].params.nil? && @@config[klass].params.has_key?( name )
133
- end
134
- end
135
-
136
- # Defines a new *handler class. The methods creates two methods based on the parameter +name+:
137
- # - klass.register_[name]
138
- # - object.get_[name]
139
- def self.define_handler( name )
140
- s = "def self.register_#{name}( param )
141
- self.logger.info { \"Registering class \#{self.name} for handling '\#{param}'\" }
142
- (Webgen::Plugin.config[#{self.name}].#{name}s ||= {})[param] = self
143
- Webgen::Plugin.config[self].registered_#{name} = param
144
- end\n"
145
- s += "def get_#{name}( param )
146
- if Webgen::Plugin.config[#{self.name}].#{name}s.has_key?( param )
147
- Webgen::Plugin.config[Webgen::Plugin.config[#{self.name}].#{name}s[param]].obj
148
- else
149
- self.logger.error { \"Invalid #{name} specified: \#{param}! Using #{self.name}!\" }
150
- Webgen::Plugin.config[#{self.name}].obj
151
- end
152
- end"
153
- module_eval s
154
- end
155
-
156
- #######
157
- private
158
- #######
159
-
160
- # Return the ancestor classes for the object's class which are sub classes from Plugin.
161
- def self.ancestor_classes
162
- self.ancestors.delete_if {|c| c.instance_of?( Module ) }[0..-3]
163
- end
164
-
165
- end
166
-
167
-
168
46
  # Responsible for loading the other plugin files and holds the basic configuration options.
169
47
  class Configuration < Plugin
170
48
 
171
- summary "Responsible for loading the configuration data"
49
+ summary "Responsible for loading plugins and holding general parameters"
172
50
 
173
51
  add_param 'srcDirectory', 'src', 'The directory from which the source files are read.'
174
52
  add_param 'outDirectory', 'output', 'The directory to which the output files are written.'
175
- add_param 'verbosityLevel', 2, 'The level of verbosity for the output of messages on the standard output.'
176
53
  add_param 'lang', 'en', 'The default language.'
177
- add_param 'configfile', 'config.yaml', 'The file from which extra configuration data is taken.'
178
- add_param 'logfile', 'webgen.log', 'The name of the log file if the log should be written to a file.'
179
54
 
180
55
  # Does all the initialisation stuff
181
- def init_all( data )
182
- data.each {|k,v| Plugin['Configuration'][k] = v}
183
- logger.level = get_param( 'verbosityLevel' )
184
-
56
+ def init_all
185
57
  load_plugins( File.dirname( __FILE__) + '/plugins', File.dirname( __FILE__).sub(/webgen$/, '') )
186
- parse_config_file
187
-
188
- data.each {|k,v| Plugin['Configuration'][k] = v}
189
- logger.level = get_param( 'verbosityLevel' )
58
+ load_plugins( 'plugin', '' )
190
59
  init_plugins
191
- Plugin['ExtensionLoader'].parse_config_file
192
- end
193
-
194
- # Parse config file and load the configuration values.
195
- def parse_config_file
196
- if File.exists?( get_param( 'configfile' ) )
197
- @pluginData = YAML::load( File.new( get_param( 'configfile' ) ) )
198
- @pluginData.each {|plugin, params| params.each {|name,value| Plugin.set_param( plugin, name, value ) } }
199
- else
200
- logger.info { "Config file <#{get_param( 'configfile' )}> does not exist, not extra configuration data read." }
201
- end
202
60
  end
203
61
 
204
62
  # Load all plugins in the given +path+. Before +require+ is actually called the path is
@@ -224,11 +82,6 @@ module Webgen
224
82
  end
225
83
  end
226
84
 
227
- # Set the log device to the logfile.
228
- def set_log_dev_to_logfile
229
- logger.set_log_dev( File.open( get_param( 'logfile' ), 'a' ) )
230
- end
231
-
232
85
  end
233
86
 
234
87
  # Initialize single configuration instance
@@ -1,7 +1,7 @@
1
1
  #
2
2
  #--
3
3
  #
4
- # $Id: logging.rb 203 2005-02-21 18:42:04Z thomas $
4
+ # $Id: logging.rb 259 2005-04-21 10:37:47Z thomas $
5
5
  #
6
6
  # webgen: template based static website generator
7
7
  # Copyright (C) 2004 Thomas Leitner
@@ -21,19 +21,16 @@
21
21
  #
22
22
 
23
23
  require 'logger'
24
+ require 'webgen/plugin'
24
25
 
25
26
  module Webgen
26
27
 
27
28
  class Logger < ::Logger
28
29
 
29
- def initialize( dev )
30
- super( dev )
30
+ def initialize( dev, files, size, level )
31
+ super( dev, files, size )
31
32
  self.datetime_format = "%Y-%m-%d %H:%M:%S"
32
- self.level = Logger::ERROR
33
- end
34
-
35
- def set_log_dev( dev )
36
- @logdev = LogDevice.new( dev )
33
+ self.level = level
37
34
  end
38
35
 
39
36
  def format_message( severity, timestamp, msg, progname )
@@ -56,10 +53,14 @@ end
56
53
 
57
54
  class Object
58
55
 
59
- LOGGER = Webgen::Logger.new( STDERR )
56
+ @@logger = Webgen::Logger.new( STDERR, 0, 0, Logger::ERROR )
57
+
58
+ def self.set_logger( logger )
59
+ @@logger = logger
60
+ end
60
61
 
61
62
  def logger
62
- LOGGER
63
+ @@logger
63
64
  end
64
65
 
65
66
  end
@@ -71,3 +72,30 @@ class Module
71
72
  end
72
73
 
73
74
  end
75
+
76
+ module Webgen
77
+
78
+ class Logging < Plugin
79
+
80
+ summary "Plugin for configuring the logger"
81
+
82
+ add_param 'maxLogFiles', 10, 'The maximum number of log files'
83
+ add_param 'maxLogSize', 1024*1024, 'The maximum size of the log files'
84
+ add_param 'verbosityLevel', 2, 'The level of verbosity for the output of logging messages (0=DEBUG, 1=INFO, 2=WARNING 3=ERROR).',
85
+ lambda {|p,o,n| logger.level = n }
86
+ add_param 'logToFile', false, 'Specifies if the log messages should be put to the logfile',
87
+ (lambda do |p, o, n|
88
+ dev = STDERR
89
+ if n
90
+ Dir.mkdir( 'log' ) unless File.exists?( 'log' )
91
+ dev = 'log/webgen.log'
92
+ end
93
+ Object.set_logger( Webgen::Logger.new( dev, get_param( 'maxLogFiles' ), get_param( 'maxLogSize' ), get_param( 'verbosityLevel') ) )
94
+ end)
95
+
96
+ end
97
+
98
+ # Initialize single logging instance
99
+ Plugin.config[Logging].obj = Logging.new
100
+
101
+ end
data/lib/webgen/node.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  #
2
2
  #--
3
3
  #
4
- # $Id: node.rb 220 2005-03-12 15:41:05Z thomas $
4
+ # $Id: node.rb 258 2005-04-21 10:35:28Z thomas $
5
5
  #
6
6
  # webgen: template based static website generator
7
7
  # Copyright (C) 2004 Thomas Leitner
@@ -20,7 +20,6 @@
20
20
  #++
21
21
  #
22
22
 
23
- require 'webgen/logging'
24
23
  require 'util/composite'
25
24
 
26
25
  class Node
@@ -86,7 +85,7 @@ class Node
86
85
  def node_for_string( destString )
87
86
  node = get_node_for_string( destString )
88
87
  if node.nil?
89
- self.logger.warn { "Could not get destination node '#{destString}' for <#{metainfo['src']}>" }
88
+ self.logger.warn { "Could not get destination node '#{destString}' for <#{recursive_value( 'src' )}>" }
90
89
  end
91
90
  node
92
91
  end
@@ -139,11 +138,32 @@ class Node
139
138
  node = self.parent_dir || self
140
139
  end
141
140
 
142
- destString.split( '/' ).each do |element|
143
- return nil if node.nil?
141
+ startElement = node
142
+ elements = destString.split( '/' )
143
+
144
+ elements.each do |element|
145
+ break if node.nil?
144
146
  case element
145
147
  when '..' then node = node.parent
146
- else node = node.find do |child| /^#{element}\/?$/ =~ child['dest'] end
148
+ else node = node.find {|child| /^#{element}\/?$/ =~ child['dest'] }
149
+ end
150
+ end
151
+
152
+ # try extended search where child['dest'] can have slashes
153
+ if node.nil?
154
+ node = startElement
155
+ elements.each_with_index do |element, index|
156
+ break if node.nil?
157
+ temp = node.find {|child| /^#{elements[index..-1].join( '/' )}\/?$/ =~ child['dest']}
158
+ if temp.nil?
159
+ case element
160
+ when '..' then node = node.parent
161
+ else node = node.find {|child| /^#{element}\/?$/ =~ child['dest'] }
162
+ end
163
+ else
164
+ node = temp
165
+ break
166
+ end
147
167
  end
148
168
  end
149
169
 
@@ -0,0 +1,168 @@
1
+ #
2
+ #--
3
+ #
4
+ # $Id: plugin.rb 259 2005-04-21 10:37:47Z 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 'yaml'
24
+ require 'ostruct'
25
+
26
+ class OpenStruct
27
+ public :table #:nodoc:#
28
+ end
29
+
30
+ module Webgen
31
+
32
+ # Base class for all plugins.
33
+ class Plugin
34
+
35
+ # Holds the plugin data from each and every plugin.
36
+ @@config = {}
37
+ @@configFileData = ( File.exists?( 'config.yaml' ) ? YAML::load( File.new( 'config.yaml' ) ) : {} )
38
+
39
+ def self.inherited( klass )
40
+ (@@config[klass] = OpenStruct.new).klass = klass
41
+ @@config[klass].plugin = klass.name.split( /::/ ).last
42
+ end
43
+
44
+ ['summary', 'description'].each do |name|
45
+ self.module_eval "def self.#{name}( obj ); @@config[self].#{name} = obj; end"
46
+ end
47
+
48
+ # Return plugin data
49
+ def self.config
50
+ @@config
51
+ end
52
+
53
+ # Add a dependency to the plugin. Dependencies are instantiated before the plugin gets
54
+ # instantiated.
55
+ def self.depends_on( *dep )
56
+ dep.each {|d| (@@config[self].dependencies ||= []) << d}
57
+ end
58
+
59
+ # Shortcut for getting the plugin with the name +name+.
60
+ def self.[]( name )
61
+ pair = @@config.find {|k,v| v.plugin == name }
62
+ self.logger.warn { "Could not retrieve plugin '#{name}' as such a plugin does not exist!" } if pair.nil?
63
+ pair[1].obj unless pair.nil?
64
+ end
65
+
66
+ # Add a parameter for the current class. Has to be used by subclasses to define their parameters!
67
+ #
68
+ # Arguments:
69
+ # +name+:: the name of the parameter
70
+ # +default+:: the default value of the parameter
71
+ # +description+:: a small description of the parameter
72
+ # +changeHandler+:: optional, method/proc which is invoked every time the parameter is changed.
73
+ # Handler signature: changeHandler( paramName, oldValue, newValue )
74
+ def self.add_param( name, default, description, changeHandler = nil )
75
+ self.logger.debug { "Adding parameter '#{name}' for plugin class '#{self.name}'" }
76
+ if @@configFileData.kind_of?( Hash ) && @@configFileData.has_key?( @@config[self].plugin ) \
77
+ && @@configFileData[@@config[self].plugin].has_key?( name )
78
+ curval = @@configFileData[@@config[self].plugin][name]
79
+ else
80
+ curval = default
81
+ end
82
+ data = OpenStruct.new( :name => name, :value => curval, :default => default, :description => description, :changeHandler => changeHandler )
83
+ (@@config[self].params ||= {})[name] = data
84
+ changeHandler.call( name, default, curval ) if changeHandler
85
+ end
86
+
87
+ # Set parameter +name+ for +plugin+ to +value+.
88
+ def self.set_param( plugin, name, value )
89
+ found = catch( :found ) do
90
+ item = @@config.find {|k,v| v.plugin == plugin }[1]
91
+ item.klass.ancestor_classes.each do |k|
92
+ item = @@config[k]
93
+ if !item.nil? && !item.params.nil? && item.params.has_key?( name )
94
+ oldvalue = item.params[name].value
95
+ item.params[name].value = value
96
+ item.params[name].changeHandler.call( name, oldvalue, value ) if item.params[name].changeHandler
97
+ logger.debug { "Set parameter '#{name}' for plugin '#{plugin}' to #{value.inspect}" }
98
+ throw :found, true
99
+ end
100
+ end
101
+ end
102
+ logger.error { "Cannot set undefined parameter '#{name}' for plugin '#{plugin}'" } unless found
103
+ end
104
+
105
+ def self.get_param( name )
106
+ ancestor_classes.each do |klass|
107
+ data = @@config[klass]
108
+ return data.params[name].value unless data.params.nil? || data.params[name].nil?
109
+ end
110
+ logger.error { "Referencing invalid configuration value '#{name}' in class #{self.class.name}" }
111
+ return nil
112
+ end
113
+
114
+ # Return parameter +name+.
115
+ def []( name )
116
+ self.class.get_param( name )
117
+ end
118
+ alias get_param []
119
+
120
+ # Set parameter +name+.
121
+ def []=( name, value )
122
+ self.class.set_param( @@config[self.class].plugin, name, value )
123
+ end
124
+
125
+ # Checks if the plugin has a parameter +name+.
126
+ def has_param?( name )
127
+ self.class.ancestor_classes.any? do |klass|
128
+ !@@config[klass].params.nil? && @@config[klass].params.has_key?( name )
129
+ end
130
+ end
131
+
132
+ # Defines a new *handler class. The methods creates two methods based on the parameter +name+:
133
+ # - klass.register_[name]
134
+ # - object.get_[name]
135
+ def self.define_handler( name )
136
+ s = "def self.register_#{name}( param )
137
+ self.logger.info { \"Registering class \#{self.name} for handling '\#{param}'\" }
138
+ (Webgen::Plugin.config[#{self.name}].#{name}s ||= {})[param] = self
139
+ Webgen::Plugin.config[self].registered_#{name} = param
140
+ end\n"
141
+ s += "def get_#{name}( param )
142
+ if Webgen::Plugin.config[#{self.name}].#{name}s.has_key?( param )
143
+ Webgen::Plugin.config[Webgen::Plugin.config[#{self.name}].#{name}s[param]].obj
144
+ else
145
+ self.logger.error { \"Invalid #{name} specified: \#{param}! Using #{self.name}!\" }
146
+ Webgen::Plugin.config[#{self.name}].obj
147
+ end
148
+ end"
149
+ module_eval s
150
+ end
151
+
152
+ #######
153
+ private
154
+ #######
155
+
156
+ # Return the ancestor classes for the object's class which are sub classes from Plugin.
157
+ def self.ancestor_classes
158
+ self.ancestors.delete_if {|c| c.instance_of?( Module ) }[0..-3]
159
+ end
160
+
161
+ end
162
+
163
+ require 'webgen/logging'
164
+ require 'webgen/configuration'
165
+
166
+ end
167
+
168
+