webgen 0.3.6 → 0.3.7

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 (261) hide show
  1. data/ChangeLog +1523 -97
  2. data/Rakefile +11 -24
  3. data/TODO +22 -9
  4. data/VERSION +1 -1
  5. data/bin/webgen +2 -2
  6. data/bin/webgen-gallery-editor +654 -0
  7. data/bin/webgen-gui +10 -0
  8. data/data/webgen/data/ISO-639-2_values_8bits.txt +492 -0
  9. data/data/webgen/gallery-creator/default.png +0 -0
  10. data/data/webgen/icon_mapping.yaml +27 -0
  11. data/data/webgen/resources/emoticons/bigeyes/angry.png +0 -0
  12. data/data/webgen/resources/emoticons/bigeyes/cool.png +0 -0
  13. data/data/webgen/resources/emoticons/bigeyes/cry.png +0 -0
  14. data/data/webgen/resources/emoticons/bigeyes/drunk.png +0 -0
  15. data/data/webgen/resources/emoticons/bigeyes/lol.png +0 -0
  16. data/data/webgen/resources/emoticons/bigeyes/oops.png +0 -0
  17. data/data/webgen/resources/emoticons/bigeyes/sad.png +0 -0
  18. data/data/webgen/resources/emoticons/bigeyes/sleep.png +0 -0
  19. data/data/webgen/resources/emoticons/bigeyes/smile.png +0 -0
  20. data/data/webgen/resources/emoticons/bigeyes/tongue.png +0 -0
  21. data/data/webgen/resources/emoticons/bigeyes/wink.png +0 -0
  22. data/data/webgen/resources/emoticons/crystal/angry.png +0 -0
  23. data/data/webgen/resources/emoticons/crystal/cool.png +0 -0
  24. data/data/webgen/resources/emoticons/crystal/cry.png +0 -0
  25. data/data/webgen/resources/emoticons/crystal/drunk.png +0 -0
  26. data/data/webgen/resources/emoticons/crystal/lol.png +0 -0
  27. data/data/webgen/resources/emoticons/crystal/oops.png +0 -0
  28. data/data/webgen/resources/emoticons/crystal/sad.png +0 -0
  29. data/data/webgen/resources/emoticons/crystal/sleep.png +0 -0
  30. data/data/webgen/resources/emoticons/crystal/smile.png +0 -0
  31. data/data/webgen/resources/emoticons/crystal/tongue.png +0 -0
  32. data/data/webgen/resources/emoticons/crystal/wink.png +0 -0
  33. data/data/webgen/resources/emoticons/cyclops/angry.png +0 -0
  34. data/data/webgen/resources/emoticons/cyclops/cool.png +0 -0
  35. data/data/webgen/resources/emoticons/cyclops/cry.png +0 -0
  36. data/data/webgen/resources/emoticons/cyclops/drunk.png +0 -0
  37. data/data/webgen/resources/emoticons/cyclops/lol.png +0 -0
  38. data/data/webgen/resources/emoticons/cyclops/oops.png +0 -0
  39. data/data/webgen/resources/emoticons/cyclops/sad.png +0 -0
  40. data/data/webgen/resources/emoticons/cyclops/sleep.png +0 -0
  41. data/data/webgen/resources/emoticons/cyclops/smile.png +0 -0
  42. data/data/webgen/resources/emoticons/cyclops/tongue.png +0 -0
  43. data/data/webgen/resources/emoticons/cyclops/wink.png +0 -0
  44. data/data/webgen/resources/emoticons/glass/angry.png +0 -0
  45. data/data/webgen/resources/emoticons/glass/cool.png +0 -0
  46. data/data/webgen/resources/emoticons/glass/cry.png +0 -0
  47. data/data/webgen/resources/emoticons/glass/drunk.png +0 -0
  48. data/data/webgen/resources/emoticons/glass/lol.png +0 -0
  49. data/data/webgen/resources/emoticons/glass/oops.png +0 -0
  50. data/data/webgen/resources/emoticons/glass/sad.png +0 -0
  51. data/data/webgen/resources/emoticons/glass/sleep.png +0 -0
  52. data/data/webgen/resources/emoticons/glass/smile.png +0 -0
  53. data/data/webgen/resources/emoticons/glass/tongue.png +0 -0
  54. data/data/webgen/resources/emoticons/glass/wink.png +0 -0
  55. data/data/webgen/resources/emoticons/icqstyle/angry.png +0 -0
  56. data/data/webgen/resources/emoticons/icqstyle/cool.png +0 -0
  57. data/data/webgen/resources/emoticons/icqstyle/cry.png +0 -0
  58. data/data/webgen/resources/emoticons/icqstyle/drunk.png +0 -0
  59. data/data/webgen/resources/emoticons/icqstyle/lol.png +0 -0
  60. data/data/webgen/resources/emoticons/icqstyle/oops.png +0 -0
  61. data/data/webgen/resources/emoticons/icqstyle/sad.png +0 -0
  62. data/data/webgen/resources/emoticons/icqstyle/sleep.png +0 -0
  63. data/data/webgen/resources/emoticons/icqstyle/smile.png +0 -0
  64. data/data/webgen/resources/emoticons/icqstyle/tongue.png +0 -0
  65. data/data/webgen/resources/emoticons/icqstyle/wink.png +0 -0
  66. data/data/webgen/resources/emoticons/matrix/angry.gif +0 -0
  67. data/data/webgen/resources/emoticons/matrix/cool.gif +0 -0
  68. data/data/webgen/resources/emoticons/matrix/cry.gif +0 -0
  69. data/data/webgen/resources/emoticons/matrix/drunk.gif +0 -0
  70. data/data/webgen/resources/emoticons/matrix/lol.gif +0 -0
  71. data/data/webgen/resources/emoticons/matrix/oops.gif +0 -0
  72. data/data/webgen/resources/emoticons/matrix/sad.gif +0 -0
  73. data/data/webgen/resources/emoticons/matrix/sleep.gif +0 -0
  74. data/data/webgen/resources/emoticons/matrix/smile.gif +0 -0
  75. data/data/webgen/resources/emoticons/matrix/tongue.gif +0 -0
  76. data/data/webgen/resources/emoticons/matrix/wink.gif +0 -0
  77. data/data/webgen/resources/emoticons/smellies/angry.gif +0 -0
  78. data/data/webgen/resources/emoticons/smellies/cool.gif +0 -0
  79. data/data/webgen/resources/emoticons/smellies/cry.gif +0 -0
  80. data/data/webgen/resources/emoticons/smellies/drunk.gif +0 -0
  81. data/data/webgen/resources/emoticons/smellies/lol.gif +0 -0
  82. data/data/webgen/resources/emoticons/smellies/oops.gif +0 -0
  83. data/data/webgen/resources/emoticons/smellies/sad.gif +0 -0
  84. data/data/webgen/resources/emoticons/smellies/sleep.gif +0 -0
  85. data/data/webgen/resources/emoticons/smellies/smile.gif +0 -0
  86. data/data/webgen/resources/emoticons/smellies/tongue.gif +0 -0
  87. data/data/webgen/resources/emoticons/smellies/wink.gif +0 -0
  88. data/data/webgen/resources/icons/compressed.png +0 -0
  89. data/data/webgen/resources/icons/document.png +0 -0
  90. data/data/webgen/resources/icons/download.png +0 -0
  91. data/data/webgen/resources/icons/image.png +0 -0
  92. data/data/webgen/resources/icons/linux.png +0 -0
  93. data/data/webgen/resources/icons/mac.png +0 -0
  94. data/data/webgen/resources/icons/pdf.png +0 -0
  95. data/data/webgen/resources/icons/penguin.png +0 -0
  96. data/data/webgen/resources/icons/quicktime.png +0 -0
  97. data/data/webgen/resources/icons/real.png +0 -0
  98. data/data/webgen/resources/icons/rpm.png +0 -0
  99. data/data/webgen/resources/icons/sound.png +0 -0
  100. data/data/webgen/resources/icons/source.png +0 -0
  101. data/data/webgen/resources/icons/spreadsheet.png +0 -0
  102. data/data/webgen/resources/icons/text.png +0 -0
  103. data/data/webgen/resources/icons/vcard.png +0 -0
  104. data/data/webgen/resources/icons/video.png +0 -0
  105. data/data/webgen/resources/icons/win.png +0 -0
  106. data/data/webgen/{images → resources/images}/generated_by_webgen.png +0 -0
  107. data/data/webgen/{images → resources/images}/valid-css.gif +0 -0
  108. data/data/webgen/{images → resources/images}/valid-xhtml11.png +0 -0
  109. data/data/webgen/{images → resources/images}/webgen_logo.png +0 -0
  110. data/data/webgen/{example/src → website_styles/default}/default.css +0 -0
  111. data/data/webgen/{example/src → website_styles/default}/default.template +2 -2
  112. data/data/webgen/website_templates/default/README +6 -0
  113. data/data/webgen/{example → website_templates/default}/config.yaml +0 -0
  114. data/data/webgen/{example → website_templates/default}/src/index.page +0 -0
  115. data/data/webgen/website_templates/personal_hp/README +6 -0
  116. data/data/webgen/website_templates/personal_hp/src/about.page +12 -0
  117. data/data/webgen/website_templates/personal_hp/src/index.page +9 -0
  118. data/data/webgen/website_templates/personal_hp/src/links.page +22 -0
  119. data/data/webgen/website_templates/personal_hp/src/projects.page +20 -0
  120. data/data/webgen/website_templates/project/README +7 -0
  121. data/data/webgen/website_templates/project/src/about.page +12 -0
  122. data/data/webgen/website_templates/project/src/download.page +15 -0
  123. data/data/webgen/website_templates/project/src/features.page +8 -0
  124. data/data/webgen/website_templates/project/src/index.page +9 -0
  125. data/data/webgen/website_templates/project/src/screenshots.page +18 -0
  126. data/doc/config.yaml +3 -0
  127. data/doc/plugin/clidesc.rb +18 -7
  128. data/doc/plugin/emoticon.rb +29 -0
  129. data/doc/plugin/extension.rb +15 -16
  130. data/doc/plugin/listpluginparameters.rb +39 -0
  131. data/doc/plugin/resources.rb +4 -4
  132. data/doc/plugin/source.rb +21 -0
  133. data/doc/src/default.css +7 -4
  134. data/doc/src/default.template +4 -2
  135. data/doc/src/documentation/cli.page +1 -1
  136. data/doc/src/documentation/extending_webgen.page +102 -0
  137. data/doc/src/documentation/gettingstarted.page +3 -6
  138. data/doc/src/documentation/index.page +1 -1
  139. data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/html.page +0 -0
  140. data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/index.page +0 -0
  141. data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/markdown.page +0 -0
  142. data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/rdoc.page +0 -0
  143. data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/textile.page +0 -0
  144. data/doc/src/documentation/plugins/{system → coreplugins}/configuration.page +0 -0
  145. data/doc/src/documentation/plugins/coreplugins/index.page +7 -0
  146. data/doc/src/documentation/plugins/{system → coreplugins}/logging.page +0 -0
  147. data/doc/src/documentation/plugins/{resourcemanager.page → coreplugins/resourcemanager.page} +5 -1
  148. data/doc/src/documentation/plugins/{filehandler → filehandlers}/backing.page +1 -1
  149. data/doc/src/documentation/plugins/{filehandler → filehandlers}/copy.page +1 -1
  150. data/doc/src/documentation/plugins/{filehandler/directory.page → filehandlers/directoryhandler.page} +11 -2
  151. data/doc/src/documentation/plugins/{filehandler/galleryhandler.page → filehandlers/gallery.page} +20 -13
  152. data/doc/src/documentation/plugins/{filehandler → filehandlers}/index.page +0 -0
  153. data/doc/src/documentation/plugins/{filehandler/pagehandler.page → filehandlers/page.page} +6 -4
  154. data/doc/src/documentation/plugins/{filehandler → filehandlers}/template.page +0 -0
  155. data/doc/src/documentation/plugins/{gallerylayouter → gallerylayouters}/index.page +7 -3
  156. data/doc/src/documentation/plugins/{htmlvalidator → htmlvalidators}/index.page +0 -0
  157. data/doc/src/documentation/plugins/{htmlvalidator → htmlvalidators}/xmllint.page +0 -0
  158. data/doc/src/documentation/plugins/index.page +4 -0
  159. data/doc/src/documentation/plugins/menustyles/{horizontal-dropdown.page → horizontaldropdown.page} +0 -0
  160. data/doc/src/documentation/plugins/menustyles/{vertical-dropdown.page → verticaldropdown.page} +1 -1
  161. data/doc/src/documentation/plugins/miscplugins/index.page +7 -0
  162. data/doc/src/documentation/plugins/miscplugins/smileyreplacer.page +38 -0
  163. data/doc/src/documentation/plugins/tags/breadcrumbtrail.page +20 -0
  164. data/doc/src/documentation/plugins/tags/download.page +23 -0
  165. data/doc/src/documentation/plugins/tags/resource.page +1 -1
  166. data/doc/src/documentation/plugins/tags/sitemap.page +1 -2
  167. data/doc/src/documentation/references/index.page +8 -0
  168. data/doc/src/documentation/{meta_info_reference.page → references/meta_info_reference.page} +1 -0
  169. data/doc/src/documentation/references/parameter_reference.page +12 -0
  170. data/doc/src/documentation/webgen_gallery_editor.page +82 -0
  171. data/doc/src/download.page +2 -2
  172. data/doc/src/features.page +3 -2
  173. data/doc/src/images/screenshots/wge-image.png +0 -0
  174. data/doc/src/images/screenshots/wge-layout-preview.png +0 -0
  175. data/doc/src/images/screenshots/wge-main-disabled.png +0 -0
  176. data/doc/src/images/screenshots/wge-main.png +0 -0
  177. data/doc/src/index.page +30 -11
  178. data/doc/src/meta.info +7 -7
  179. data/doc/src/screenshots.gallery +33 -0
  180. data/install.rb +1 -1
  181. data/lib/webgen.rb +275 -0
  182. data/lib/webgen/composite.rb +1 -1
  183. data/lib/webgen/gui/common.rb +38 -0
  184. data/lib/webgen/gui/main.rb +219 -0
  185. data/lib/webgen/gui/new_website_dlg.rb +125 -0
  186. data/lib/webgen/listener.rb +1 -1
  187. data/lib/webgen/node.rb +4 -2
  188. data/lib/webgen/plugin.rb +167 -100
  189. data/lib/webgen/plugins/{contenthandler/defaultcontenthandler.rb → contenthandlers/default.rb} +1 -1
  190. data/lib/webgen/plugins/{contenthandler → contenthandlers}/html.rb +2 -2
  191. data/lib/webgen/plugins/{contenthandler → contenthandlers}/markdown.rb +2 -2
  192. data/lib/webgen/plugins/{contenthandler → contenthandlers}/rdoc.rb +2 -2
  193. data/lib/webgen/plugins/{contenthandler → contenthandlers}/textile.rb +2 -2
  194. data/lib/webgen/{configuration.rb → plugins/coreplugins/configuration.rb} +34 -14
  195. data/lib/webgen/{logging.rb → plugins/coreplugins/logging.rb} +4 -4
  196. data/lib/webgen/plugins/{resourcemanager.rb → coreplugins/resourcemanager.rb} +44 -22
  197. data/lib/webgen/plugins/{filehandler → filehandlers}/backing.rb +11 -11
  198. data/lib/webgen/plugins/{filehandler/filecopy.rb → filehandlers/copy.rb} +3 -3
  199. data/lib/webgen/plugins/{filehandler → filehandlers}/directory.rb +15 -10
  200. data/lib/webgen/plugins/{filehandler → filehandlers}/filehandler.rb +9 -7
  201. data/lib/webgen/plugins/{filehandler/picturegallery.rb → filehandlers/gallery.rb} +35 -28
  202. data/lib/webgen/plugins/{filehandler → filehandlers}/page.rb +30 -15
  203. data/lib/webgen/plugins/{filehandler → filehandlers}/template.rb +3 -3
  204. data/lib/webgen/plugins/{gallerylayouter/defaultgallerylayouter.rb → gallerylayouters/default.rb} +11 -11
  205. data/lib/webgen/plugins/{htmlvalidator/defaulthtmlvalidator.rb → htmlvalidators/default.rb} +1 -1
  206. data/lib/webgen/plugins/{htmlvalidator → htmlvalidators}/xmllint.rb +2 -2
  207. data/lib/webgen/plugins/menustyles/{defaultmenustyle.rb → default.rb} +2 -2
  208. data/lib/webgen/plugins/menustyles/horizontal.rb +2 -2
  209. data/lib/webgen/plugins/menustyles/horizontal_dropdown.rb +2 -2
  210. data/lib/webgen/plugins/menustyles/partial.rb +2 -2
  211. data/lib/webgen/plugins/menustyles/vertical.rb +2 -2
  212. data/lib/webgen/plugins/menustyles/vertical_dropdown.rb +2 -2
  213. data/lib/webgen/plugins/miscplugins/smileyreplacer.rb +84 -0
  214. data/lib/webgen/plugins/{treewalker.rb → miscplugins/treewalker.rb} +1 -1
  215. data/lib/webgen/plugins/tags/{navbar.rb → breadcrumbtrail.rb} +5 -9
  216. data/lib/webgen/plugins/tags/date.rb +2 -6
  217. data/lib/webgen/plugins/tags/download.rb +155 -0
  218. data/lib/webgen/plugins/tags/executecommand.rb +2 -6
  219. data/lib/webgen/plugins/tags/includefile.rb +4 -8
  220. data/lib/webgen/plugins/tags/langbar.rb +2 -6
  221. data/lib/webgen/plugins/tags/menu.rb +2 -7
  222. data/lib/webgen/plugins/tags/meta.rb +2 -6
  223. data/lib/webgen/plugins/tags/relocatable.rb +2 -6
  224. data/lib/webgen/plugins/tags/sitemap.rb +14 -10
  225. data/lib/webgen/plugins/tags/tags.rb +25 -18
  226. data/lib/webgen/plugins/tags/wikilink.rb +2 -6
  227. metadata +311 -195
  228. data/doc/src/design.gallery +0 -18
  229. data/doc/src/designs/curdesign.png +0 -0
  230. data/doc/src/designs/nostyle.png +0 -0
  231. data/doc/src/designs/old.png +0 -0
  232. data/doc/src/documentation/plugins/gallerylayouter/defaultlayouter.page +0 -12
  233. data/doc/src/documentation/plugins/system/index.page +0 -7
  234. data/doc/src/documentation/plugins/tags/navbar.page +0 -20
  235. data/lib/webgen/webgen.rb +0 -271
  236. data/testsite/config.yaml +0 -7
  237. data/testsite/src/bghack.png +0 -0
  238. data/testsite/src/bluecloth.page +0 -102
  239. data/testsite/src/default.css +0 -146
  240. data/testsite/src/default.template +0 -33
  241. data/testsite/src/home.en.page +0 -22
  242. data/testsite/src/home.page +0 -22
  243. data/testsite/src/images/bghack.png +0 -0
  244. data/testsite/src/index.page +0 -21
  245. data/testsite/src/meta.info +0 -12
  246. data/testsite/src/news.page +0 -20
  247. data/testsite/src/news_are_so-cool.de.page +0 -19
  248. data/testsite/src/noindex/noindex.page +0 -20
  249. data/testsite/src/pictures/index.page +0 -20
  250. data/testsite/src/projects.de.page +0 -11
  251. data/testsite/src/projects.es.page +0 -11
  252. data/testsite/src/projects.page +0 -17
  253. data/testsite/src/projects/00.index.de.page +0 -10
  254. data/testsite/src/projects/01.project2.page +0 -20
  255. data/testsite/src/projects/02.project1.page +0 -20
  256. data/testsite/src/projects/05.project3.page +0 -22
  257. data/testsite/src/projects/index.page +0 -20
  258. data/testsite/src/projects/subproj/index.page +0 -22
  259. data/testsite/src/projects/subproj/project3.page +0 -21
  260. data/testsite/src/rdoc.page +0 -12
  261. data/testsite/src/redcloth.page +0 -106
@@ -0,0 +1,38 @@
1
+ require 'csv'
2
+ require 'webgen'
3
+
4
+ module Webgen
5
+
6
+ class Website
7
+
8
+ attr_reader :directory
9
+
10
+ def initialize( directory )
11
+ @directory = directory
12
+ end
13
+
14
+ def files
15
+ end
16
+
17
+ def self.languages
18
+ unless defined?( @@languages )
19
+ @@languages = []
20
+ code_file = File.join( CorePlugins::Configuration.data_dir, 'data/ISO-639-2_values_8bits.txt' )
21
+ CSV::Reader.parse( File.open( code_file, 'r' ), ?| ) do |row|
22
+ @@languages << [row[0].data, row[3].data] unless !@@languages.last.nil? && @@languages.last[0] == row[0].data && @@languages.last[1] == row[3].data
23
+ end
24
+ end
25
+ @@languages
26
+ end
27
+
28
+ def self.templates
29
+ Dir[File.join( CorePlugins::Configuration.data_dir, 'website_templates', '*' )].collect {|f| File.basename( f )}
30
+ end
31
+
32
+ def self.styles
33
+ Dir[File.join( CorePlugins::Configuration.data_dir, 'website_styles', '*' )].collect {|f| File.basename( f )}
34
+ end
35
+
36
+ end
37
+
38
+ end
@@ -0,0 +1,219 @@
1
+ begin
2
+ require 'RMagick'
3
+ rescue
4
+ # do nothing
5
+ # RMagick has to be loaded before Qt else an error occursr
6
+ end
7
+
8
+ require 'Qt'
9
+ require 'cgi'
10
+ require 'webgen/gui/common'
11
+ require 'webgen/gui/new_website_dlg'
12
+
13
+
14
+ class Object
15
+
16
+ def self.set_logger( logger, set_it = false )
17
+ @@logger = logger if set_it
18
+ end
19
+
20
+ end
21
+
22
+ module Webgen::GUI
23
+
24
+ ERROR_PALETTE = Qt::Palette.new( Qt::red.light, Qt::red.light )
25
+ ERROR_PALETTE.setColor( Qt::Palette::Active, Qt::ColorGroup::Base, Qt::red.light )
26
+ ERROR_PALETTE.setColor( Qt::Palette::Inactive, Qt::ColorGroup::Base, Qt::red.light )
27
+
28
+
29
+ class Logger < Webgen::Logger
30
+
31
+ def format_message( severity, timestamp, msg, progname )
32
+ color = case severity
33
+ when 'ERROR' then '#ff0000'
34
+ when 'WARN' then '#880000'
35
+ when 'INFO' then '#008800'
36
+ when 'DEBUG' then '#aaaaaa'
37
+ end
38
+ msg.gsub!(/&/, '&amp;')
39
+ msg.gsub!(/>/, '&gt;')
40
+ msg.gsub!(/</, '&lt;')
41
+ "<font color=#{color}><b>%s</b> %5s -- %s: %s</font>" % [timestamp, severity, progname, msg ]
42
+ end
43
+
44
+ end
45
+
46
+
47
+ class LogWidget < Qt::TextEdit
48
+
49
+ slots 'toggleShown()'
50
+
51
+ # Create a LogWindow
52
+ def initialize( p )
53
+ super( p )
54
+ setTextFormat( Qt::LogText )
55
+ setFont( Qt::Font.new( "Courier" ) )
56
+ Object.set_logger( Logger.new( self, 0, 0, logger.level ), true )
57
+ end
58
+
59
+ # Invoked by the logger library for writing log messages.
60
+ def write( message )
61
+ self.append( message )
62
+ end
63
+
64
+ # Invoked by the logger library for closing the log device. Does nothing.
65
+ def close; end
66
+
67
+ def toggleShown
68
+ if isShown then hide else show end
69
+ end
70
+
71
+ end
72
+
73
+ class MainWindow < Qt::MainWindow
74
+
75
+ slots 'new()', 'open()', 'save()', 'preview_page()', 'preview_text()', 'filter_files()',
76
+ 'run_webgen()'
77
+
78
+ def initialize
79
+ super
80
+ setCaption( 'webgen GUI' )
81
+ setup_window
82
+ setup_menus
83
+ @website = Webgen::Website.new( '/home/thomas/work/projects/trunk/webgen/DIR' )
84
+ end
85
+
86
+ def new
87
+ dlg = NewWebsiteDialog.new( self )
88
+ if dlg.exec == Qt::Dialog::Accepted
89
+ @website = Webgen::Website.new( dlg.website_directory )
90
+ #TODO init website
91
+ end
92
+ end
93
+
94
+ def open
95
+ #TODO save files in existing dir if necessary
96
+ dir = Qt::FileDialog.getExistingDirectory( @website.directory, self, nil, "Select website directory" )
97
+ unless dir.nil?
98
+ @website = Webgen::Website.new( dir )
99
+ #TODO init website
100
+ end
101
+ end
102
+
103
+ def save
104
+ #TODO What to save???
105
+ end
106
+
107
+ def preview_page
108
+ @old = @pageEditor.text
109
+ @pageEditor.setTextFormat( Qt::RichText )
110
+ @pageEditor.setText( RedCloth.new( @old ).to_html )
111
+ end
112
+
113
+ def preview_text
114
+ @pageEditor.setTextFormat( Qt::PlainText )
115
+ @pageEditor.setText( @old )
116
+ end
117
+
118
+ def filter_files
119
+ # set_file_list
120
+ # set status text
121
+ end
122
+
123
+ def run_webgen
124
+ @log.clear
125
+ before = Time.now
126
+ Webgen.run_webgen( @website.directory )
127
+ # call external command
128
+ diff = Time.now - before
129
+ puts diff
130
+ end
131
+
132
+ #######
133
+ private
134
+ #######
135
+
136
+ def setup_menus
137
+ filemenu = Qt::PopupMenu.new( self )
138
+ filemenu.insertItem( "&Create website dir...", self, SLOT("new()"), Qt::KeySequence.new( CTRL+Key_N ) )
139
+ filemenu.insertItem( "&Open website dir...", self, SLOT("open()"), Qt::KeySequence.new( CTRL+Key_O ) )
140
+ filemenu.insertItem( "&Save website", self, SLOT("save()"), Qt::KeySequence.new( CTRL+Key_S ) )
141
+ filemenu.insertSeparator
142
+ filemenu.insertItem( "&Quit", $app, SLOT("quit()"), Qt::KeySequence.new( CTRL+Key_Q ) )
143
+
144
+ toolsmenu = Qt::PopupMenu.new( self )
145
+ toolsmenu.insertItem( "&Run webgen...", self, SLOT("run_webgen()"), Qt::KeySequence.new( CTRL+Key_R ) )
146
+ toolsmenu.insertItem( "Toogle &log window", @log, SLOT('toggleShown()'), Qt::KeySequence.new( CTRL+Key_L) )
147
+
148
+ self.menuBar.insertItem( "&File", filemenu )
149
+ self.menuBar.insertItem( "&Tools", toolsmenu )
150
+ end
151
+
152
+ def setup_window
153
+ mainWidget = Qt::Splitter.new( Qt::Vertical, self )
154
+ mainWidget.setOpaqueResize( true )
155
+
156
+ upperWidget = Qt::Widget.new( mainWidget )
157
+
158
+ left = Qt::Widget.new( upperWidget )
159
+ setup_file_list( left )
160
+ setup_file_view( upperWidget )
161
+
162
+ mainLayout = Qt::HBoxLayout.new( upperWidget )
163
+ mainLayout.setSpacing( 3 )
164
+ mainLayout.setMargin( 3 )
165
+ mainLayout.addWidget( left )
166
+ mainLayout.addWidget( @fileView, 1 )
167
+
168
+ @log = LogWidget.new( mainWidget )
169
+ @log.hide
170
+
171
+ setCentralWidget( mainWidget )
172
+ end
173
+
174
+ def setup_file_list( mainWidget )
175
+ button = Qt::PushButton.new( 'Clear', mainWidget )
176
+ @filter = Qt::LineEdit.new( mainWidget )
177
+ @filter.setMinimumWidth( 200 )
178
+
179
+ connect( button, SIGNAL('clicked()'), @filter, SLOT('clear()') )
180
+ connect( @filter, SIGNAL('textChanged(const QString&)'), self, SLOT('filter_files()') )
181
+
182
+ @fileList = Qt::ListBox.new( mainWidget )
183
+
184
+ @fileStatusText = Qt::Label.new( mainWidget )
185
+ @fileStatusText.setText( 'something' )
186
+
187
+ filterLayout = Qt::HBoxLayout.new
188
+ filterLayout.addWidget( @filter )
189
+ filterLayout.addWidget( button )
190
+
191
+ layout = Qt::VBoxLayout.new( mainWidget )
192
+ layout.setSpacing( 3 )
193
+ layout.addLayout( filterLayout )
194
+ layout.addWidget( @fileList )
195
+ layout.addWidget( @fileStatusText )
196
+ end
197
+
198
+ def setup_file_view( mainWidget )
199
+ @fileView = Qt::WidgetStack.new( mainWidget )
200
+ @fileView.setMinimumSize( 300, 300 )
201
+
202
+ main = Qt::Widget.new( @fileView )
203
+ @pageEditor = Qt::TextEdit.new( main )
204
+ @pageEditor.setTextFormat( Qt::PlainText )
205
+ button = Qt::PushButton.new( "Preview", main )
206
+ connect( button, SIGNAL('pressed()'), self, SLOT('preview_page()') )
207
+ connect( button, SIGNAL('released()'), self, SLOT('preview_text()') )
208
+ layout = Qt::VBoxLayout.new( main )
209
+ layout.setSpacing( 3 )
210
+ layout.addWidget( @pageEditor )
211
+ layout.addWidget( button )
212
+
213
+
214
+ @imageViewer = Qt::Label.new( @fileView )
215
+ end
216
+
217
+ end
218
+
219
+ end
@@ -0,0 +1,125 @@
1
+ module Webgen::GUI
2
+
3
+ class NewWebsiteDialog < Qt::Dialog
4
+
5
+ slots 'choose_dir()', 'check_input()', 'create_website()'
6
+ signals 'input_valid(bool)'
7
+
8
+ def initialize( parent )
9
+ super( parent )
10
+ setCaption( "Create new website..." )
11
+ setup_window
12
+ end
13
+
14
+ def setup_window
15
+ layout = Qt::VBoxLayout.new( self, 10, 10 )
16
+
17
+ mainLayout = Qt::GridLayout.new( 5, 2, 3 )
18
+
19
+ mainLayout.addWidget( Qt::Label.new( "Directory:", self ), 0, 0 )
20
+ box = Qt::HBoxLayout.new( 3 )
21
+ @directory = Qt::LineEdit.new( self )
22
+ @directory.setText( Dir.pwd )
23
+ connect( @directory, SIGNAL('textChanged(const QString&)'), self, SLOT('check_input()') )
24
+ dirChooser = Qt::PushButton.new( "...", self )
25
+ connect( dirChooser, SIGNAL('clicked()'), self, SLOT('choose_dir()') )
26
+ box.addWidget( @directory )
27
+ box.addWidget( dirChooser )
28
+ mainLayout.addLayout( box, 0, 1 )
29
+
30
+ mainLayout.addWidget( Qt::Label.new( "Website name:", self ), 1, 0 )
31
+ @website = Qt::LineEdit.new( self )
32
+ @website.setFocus()
33
+ connect( @website, SIGNAL('textChanged(const QString&)'), self, SLOT('check_input()') )
34
+ mainLayout.addWidget( @website, 1, 1 )
35
+
36
+ mainLayout.addWidget( Qt::Label.new( "Website template:", self ), 2, 0 )
37
+ @template = Qt::ComboBox.new( self )
38
+ @template.insertStringList( Webgen::Website.templates.sort )
39
+ @template.setCurrentText( 'default' )
40
+ mainLayout.addWidget( @template, 2, 1 )
41
+
42
+ mainLayout.addWidget( Qt::Label.new( "Website style:", self ), 3, 0 )
43
+ @style = Qt::ComboBox.new( self )
44
+ @style.insertStringList( Webgen::Website.styles.sort )
45
+ @style.setCurrentText( 'default' )
46
+ mainLayout.addWidget( @style, 3, 1 )
47
+
48
+ mainLayout.addWidget( Qt::Label.new( "Main language:", self ), 4, 0 )
49
+ @language = Qt::ComboBox.new( self )
50
+ @language.insertStringList( Webgen::Website.languages.collect {|l| l[1]}.sort )
51
+ @language.setCurrentText( 'English' )
52
+ mainLayout.addWidget( @language, 4, 1 )
53
+
54
+ box = Qt::HBoxLayout.new( 3 )
55
+ box.addStretch( 1 )
56
+ @cancel = Qt::PushButton.new( "Cancel", self )
57
+ connect( @cancel, SIGNAL('clicked()'), self, SLOT('reject()') )
58
+ box.addWidget( @cancel )
59
+ @create = Qt::PushButton.new( "Create", self )
60
+ @create.setEnabled( false )
61
+ connect( @create, SIGNAL('clicked()'), self, SLOT('create_website()') )
62
+ connect( self, SIGNAL('input_valid(bool)'), @create, SLOT('setEnabled(bool)') )
63
+ @create.setDefault( true )
64
+ box.addWidget( @create )
65
+
66
+ layout.addLayout( mainLayout )
67
+ layout.addLayout( box )
68
+ layout.setResizeMode( Qt::Layout::Fixed )
69
+
70
+ check_input
71
+ end
72
+
73
+ def choose_dir
74
+ newdir = Qt::FileDialog.getExistingDirectory( @directory.text, self, nil, "Select website base directory" )
75
+ @directory.setText( newdir ) unless newdir.nil?
76
+ end
77
+
78
+ def check_input
79
+ valid = true
80
+
81
+ #check website parent dir
82
+ if File.directory?( @directory.text )
83
+ @directory.unsetPalette()
84
+ else
85
+ valid = false
86
+ @directory.setPalette( Webgen::GUI::ERROR_PALETTE )
87
+ end
88
+
89
+ # check website name
90
+ if @website.text.empty? || File.exists?( File.join( @directory.text, @website.text ) )
91
+ valid = false
92
+ @website.setPalette( Webgen::GUI::ERROR_PALETTE )
93
+ else
94
+ @website.unsetPalette()
95
+ end
96
+
97
+ emit input_valid( valid )
98
+ end
99
+
100
+ def website_directory
101
+ File.join( @directory.text, @website.text )
102
+ end
103
+
104
+ #######
105
+ private
106
+ #######
107
+
108
+ def create_website
109
+ template = @template.currentText
110
+ style = @style.currentText
111
+ lang = Webgen::Website.languages.rassoc( @language.currentText )[0]
112
+ begin
113
+ Webgen.create_website( website_directory, template, style )
114
+ File.open( File.join( website_directory, 'config.yaml' ), 'a+' ) {|f| f.write( "Configuration:\n lang: #{lang}" ) }
115
+ rescue RuntimeError, SystemCallError => e
116
+ Qt::MessageBox.critical( self, "Creation error", "Could not create website: \n#{e.message}",
117
+ Qt::MessageBox::Ok, Qt::MessageBox::NoButton, Qt::MessageBox::NoButton )
118
+ return
119
+ end
120
+ accept
121
+ end
122
+
123
+ end
124
+
125
+ end
@@ -1,7 +1,7 @@
1
1
  #
2
2
  #--
3
3
  #
4
- # $Id: listener.rb 334 2005-08-23 19:11:53Z thomas $
4
+ # $Id: listener.rb 271 2005-05-09 08:50:47Z thomas $
5
5
  #
6
6
  # webgen: template based static website generator
7
7
  # Copyright (C) 2004 Thomas Leitner
@@ -1,7 +1,7 @@
1
1
  #
2
2
  #--
3
3
  #
4
- # $Id: node.rb 334 2005-08-23 19:11:53Z thomas $
4
+ # $Id: node.rb 336 2005-08-25 06:23:46Z thomas $
5
5
  #
6
6
  # webgen: template based static website generator
7
7
  # Copyright (C) 2004 Thomas Leitner
@@ -149,6 +149,8 @@ class Node
149
149
  #######
150
150
 
151
151
  def get_node_for_string( destString, metainfo='dest' )
152
+ return self if destString == ''
153
+
152
154
  if /^\// =~ destString
153
155
  node = Node.root( self )
154
156
  destString = destString[1..-1]
@@ -158,7 +160,7 @@ class Node
158
160
 
159
161
  startElement = node
160
162
  elements = destString.split( '/' )
161
- pagelang = (/\.(\w\w)\.page$/ =~ destString ? $1 : Webgen::Plugin['Configuration']['lang'])
163
+ pagelang = (/\.(\w\w\w?)\.page$/ =~ destString ? $1 : Webgen::Plugin['Configuration']['lang'])
162
164
 
163
165
  elements.each do |element|
164
166
  break if node.nil?
@@ -1,7 +1,7 @@
1
1
  #
2
2
  #--
3
3
  #
4
- # $Id: plugin.rb 334 2005-08-23 19:11:53Z thomas $
4
+ # $Id: plugin.rb 348 2005-09-02 08:43:33Z thomas $
5
5
  #
6
6
  # webgen: template based static website generator
7
7
  # Copyright (C) 2004 Thomas Leitner
@@ -29,93 +29,164 @@ end
29
29
 
30
30
  module Webgen
31
31
 
32
- # Base class for all plugins.
33
- class Plugin
32
+ # Base module for all plugins. This module should be included by classes which need to derive from
33
+ # an existing class but also need the power of the plugin system. If a class does not have any
34
+ # base class, it is better to derive it from Webgen::Plugin instead of including this module.
35
+ module PluginDefs
36
+
37
+ # All the methods of this module become class methods in the classes which include the
38
+ # PluginDefs module.
39
+ module ClassMethods
40
+
41
+ # Holds the plugin data from each and every plugin.
42
+ @@config = {}
43
+ @@configFileData = {}
44
+
45
+ # Reloads the configuration file data.
46
+ def load_config_file
47
+ @@configFileData = ( File.exists?( 'config.yaml' ) ? YAML::load( File.new( 'config.yaml' ) ) : {} )
48
+ @@configFileData = {} unless @@configFileData.kind_of?( Hash )
49
+ @@configFileData.each do |pluginName, params|
50
+ next if (pair = @@config.find {|pluginKlass, data| data.plugin == pluginName}).nil?
51
+ if params.kind_of?( Hash ) && !pair[1].params.nil?
52
+ pair[1].params.each do |name, value|
53
+ set_param( pluginName, name, params[name] ) if params.has_key?( name )
54
+ end
55
+ end
56
+ end
57
+ end
34
58
 
35
- # Holds the plugin data from each and every plugin.
36
- @@config = {}
37
- @@configFileData = ( File.exists?( 'config.yaml' ) ? YAML::load( File.new( 'config.yaml' ) ) : {} )
59
+ # Reset the configuration data. The configuration has to be initialized again.
60
+ def reset_config_data
61
+ @@config.each do |pluginKlass, data|
62
+ if pluginKlass != Logging && pluginKlass != Configuration
63
+ data.obj = nil
64
+ end
65
+ data.params.each {|name, p| set_param( data.plugin, name, p.default ) } if data.params
66
+ end
67
+ load_config_file
68
+ end
38
69
 
39
- # Return plugin data
40
- def self.config
41
- @@config
42
- end
70
+ # Return plugin data
71
+ def config
72
+ @@config
73
+ end
43
74
 
44
- # Shortcut for getting the plugin with the name +name+.
45
- def self.[]( name )
46
- pair = @@config.find {|k,v| v.plugin == name }
47
- self.logger.warn { "Could not retrieve plugin '#{name}' as such a plugin does not exist!" } if pair.nil?
48
- pair[1].obj unless pair.nil?
49
- end
75
+ # Shortcut for getting the plugin with the name +name+.
76
+ def []( name )
77
+ pair = @@config.find {|k,v| v.plugin == name }
78
+ self.logger.warn { "Could not retrieve plugin '#{name}' as such a plugin does not exist!" } if pair.nil?
79
+ pair[1].obj unless pair.nil?
80
+ end
50
81
 
51
- # Add subclass to plugin data.
52
- def self.inherited( klass )
53
- (@@config[klass] = OpenStruct.new).klass = klass
54
- @@config[klass].plugin = klass.name.split( /::/ ).last
55
- end
82
+ # Add subclass to plugin data.
83
+ def inherited( klass )
84
+ ClassMethods.extended( klass )
85
+ end
56
86
 
57
- ['summary', 'description'].each do |name|
58
- self.module_eval "def self.#{name}( obj ); @@config[self].#{name} = obj; end"
59
- end
87
+ # Called when PluginDefs is included in another class. Add this class to plugin data.
88
+ def self.extended( klass )
89
+ if (klass != Webgen::Plugin) && (klass != Webgen::CommandPlugin)
90
+ (@@config[klass] = OpenStruct.new).klass = klass
91
+ @@config[klass].plugin = klass.name.split( /::/ ).last
92
+ end
93
+ end
60
94
 
61
- # Add a dependency to the plugin. Dependencies are instantiated before the plugin gets
62
- # instantiated.
63
- def self.depends_on( *dep )
64
- dep.each {|d| (@@config[self].dependencies ||= []) << d}
65
- end
95
+ ['summary', 'description'].each do |name|
96
+ module_eval "def #{name}( obj ); @@config[self].#{name} = obj; end"
97
+ end
66
98
 
67
- # Specify which meta information entries are used by the plugin.
68
- def self.used_meta_info( *names )
69
- names.each {|n| (@@config[self].used_meta_info ||= []) << n }
70
- end
71
99
 
72
- # Add a parameter for the current class. Has to be used by subclasses to define their parameters!
73
- #
74
- # Arguments:
75
- # +name+:: the name of the parameter
76
- # +default+:: the default value of the parameter
77
- # +description+:: a small description of the parameter
78
- # +changeHandler+:: optional, method/proc which is invoked every time the parameter is changed.
79
- # Handler signature: changeHandler( paramName, oldValue, newValue )
80
- def self.add_param( name, default, description, changeHandler = nil )
81
- self.logger.debug { "Adding parameter '#{name}' for plugin class '#{self.name}'" }
82
- if @@configFileData.kind_of?( Hash ) && @@configFileData.has_key?( @@config[self].plugin ) \
83
- && @@configFileData[@@config[self].plugin].kind_of?( Hash ) && @@configFileData[@@config[self].plugin].has_key?( name )
84
- curval = @@configFileData[@@config[self].plugin][name]
85
- self.logger.debug { "Using configured value for parameter #{@@config[self].plugin} -> #{name}" }
86
- else
87
- curval = default
100
+ # Add a dependency to the plugin. Dependencies are instantiated before the plugin gets
101
+ # instantiated.
102
+ def depends_on( *dep )
103
+ dep.each {|d| (@@config[self].dependencies ||= []) << d}
104
+ end
105
+
106
+ # Specify which meta information entries are used by the plugin.
107
+ def used_meta_info( *names )
108
+ names.each {|n| (@@config[self].used_meta_info ||= []) << n }
109
+ end
110
+
111
+ # Add a parameter for the current class. Has to be used by subclasses to define their parameters!
112
+ #
113
+ # Arguments:
114
+ # +name+:: the name of the parameter
115
+ # +default+:: the default value of the parameter
116
+ # +description+:: a small description of the parameter
117
+ # +changeHandler+:: optional, method/proc which is invoked every time the parameter is changed.
118
+ # Handler signature: changeHandler( paramName, oldValue, newValue )
119
+ def add_param( name, default, description, changeHandler = nil )
120
+ self.logger.debug { "Adding parameter '#{name}' for plugin class '#{self.name}'" }
121
+ if @@configFileData.kind_of?( Hash ) && @@configFileData.has_key?( @@config[self].plugin ) \
122
+ && @@configFileData[@@config[self].plugin].kind_of?( Hash ) && @@configFileData[@@config[self].plugin].has_key?( name )
123
+ curval = @@configFileData[@@config[self].plugin][name]
124
+ self.logger.debug { "Using configured value for parameter #{@@config[self].plugin} -> #{name}" }
125
+ else
126
+ curval = default
127
+ end
128
+ data = OpenStruct.new( :name => name, :value => curval, :default => default, :description => description, :changeHandler => changeHandler )
129
+ (@@config[self].params ||= {})[name] = data
130
+ changeHandler.call( name, default, curval ) if changeHandler
88
131
  end
89
- data = OpenStruct.new( :name => name, :value => curval, :default => default, :description => description, :changeHandler => changeHandler )
90
- (@@config[self].params ||= {})[name] = data
91
- changeHandler.call( name, default, curval ) if changeHandler
92
- end
93
132
 
94
- # Set parameter +name+ for +plugin+ to +value+.
95
- def self.set_param( plugin, name, value )
96
- found = catch( :found ) do
97
- item = @@config.find {|k,v| v.plugin == plugin }[1]
98
- item.klass.ancestor_classes.each do |k|
99
- item = @@config[k]
100
- if !item.nil? && !item.params.nil? && item.params.has_key?( name )
101
- oldvalue = item.params[name].value
102
- item.params[name].value = value
103
- item.params[name].changeHandler.call( name, oldvalue, value ) if item.params[name].changeHandler
104
- logger.debug { "Set parameter '#{name}' for plugin '#{plugin}' to #{value.inspect}" }
105
- throw :found, true
133
+ # Set parameter +name+ for +plugin+ to +value+.
134
+ def set_param( plugin, name, value )
135
+ found = catch( :found ) do
136
+ item = @@config.find {|k,v| v.plugin == plugin }[1]
137
+ item.klass.ancestor_classes.each do |k|
138
+ item = @@config[k]
139
+ if !item.nil? && !item.params.nil? && item.params.has_key?( name )
140
+ oldvalue = item.params[name].value
141
+ item.params[name].value = value
142
+ item.params[name].changeHandler.call( name, oldvalue, value ) if item.params[name].changeHandler
143
+ logger.debug { "Set parameter '#{name}' for plugin '#{plugin}' to #{value.inspect}" }
144
+ throw :found, true
145
+ end
106
146
  end
107
147
  end
148
+ logger.error { "Cannot set undefined parameter '#{name}' for plugin '#{plugin}'" } unless found
149
+ end
150
+
151
+ def get_param( name )
152
+ ancestor_classes.each do |klass|
153
+ data = @@config[klass]
154
+ return data.params[name].value unless data.params.nil? || data.params[name].nil?
155
+ end
156
+ logger.error { "Referencing invalid configuration value '#{name}' in class #{self.name}" }
157
+ return nil
158
+ end
159
+
160
+ # Defines a new *handler class. The methods creates two methods based on the parameter +name+:
161
+ # - klass.register_[name]
162
+ # - object.get_[name]
163
+ def define_handler( name )
164
+ s = "def self.register_#{name}( param )
165
+ self.logger.info { \"Registering class \#{self.name} for handling #{name} '\#{param}'\" }
166
+ (Webgen::Plugin.config[#{self.name}].#{name}s ||= {})[param] = self
167
+ Webgen::Plugin.config[self].registered_#{name} = param
168
+ end\n"
169
+ s += "def get_#{name}( param )
170
+ if Webgen::Plugin.config[#{self.name}].#{name}s.has_key?( param )
171
+ Webgen::Plugin.config[Webgen::Plugin.config[#{self.name}].#{name}s[param]].obj
172
+ else
173
+ self.logger.error { \"Invalid #{name} specified: \#{param}! Using #{self.name}!\" }
174
+ Webgen::Plugin.config[#{self.name}].obj
175
+ end
176
+ end"
177
+ module_eval s
108
178
  end
109
- logger.error { "Cannot set undefined parameter '#{name}' for plugin '#{plugin}'" } unless found
110
- end
111
179
 
112
- def self.get_param( name )
113
- ancestor_classes.each do |klass|
114
- data = @@config[klass]
115
- return data.params[name].value unless data.params.nil? || data.params[name].nil?
180
+ # Return the ancestor classes for the object's class which are sub classes from Plugin.
181
+ def ancestor_classes
182
+ ancestors.delete_if {|c| c.instance_of?( Module ) }[0..-3]
116
183
  end
117
- logger.error { "Referencing invalid configuration value '#{name}' in class #{self.class.name}" }
118
- return nil
184
+
185
+ end
186
+
187
+ def self.append_features( klass )
188
+ super
189
+ klass.extend( ClassMethods )
119
190
  end
120
191
 
121
192
  # Return parameter +name+.
@@ -126,45 +197,41 @@ module Webgen
126
197
 
127
198
  # Set parameter +name+.
128
199
  def []=( name, value )
129
- self.class.set_param( @@config[self.class].plugin, name, value )
200
+ self.class.set_param( self.class.config[self.class].plugin, name, value )
130
201
  end
131
202
 
132
203
  # Checks if the plugin has a parameter +name+.
133
204
  def has_param?( name )
134
205
  self.class.ancestor_classes.any? do |klass|
135
- !@@config[klass].params.nil? && @@config[klass].params.has_key?( name )
206
+ !self.class.config[klass].params.nil? && self.class.config[klass].params.has_key?( name )
136
207
  end
137
208
  end
138
209
 
139
- # Defines a new *handler class. The methods creates two methods based on the parameter +name+:
140
- # - klass.register_[name]
141
- # - object.get_[name]
142
- def self.define_handler( name )
143
- s = "def self.register_#{name}( param )
144
- self.logger.info { \"Registering class \#{self.name} for handling '\#{param}'\" }
145
- (Webgen::Plugin.config[#{self.name}].#{name}s ||= {})[param] = self
146
- Webgen::Plugin.config[self].registered_#{name} = param
147
- end\n"
148
- s += "def get_#{name}( param )
149
- if Webgen::Plugin.config[#{self.name}].#{name}s.has_key?( param )
150
- Webgen::Plugin.config[Webgen::Plugin.config[#{self.name}].#{name}s[param]].obj
151
- else
152
- self.logger.error { \"Invalid #{name} specified: \#{param}! Using #{self.name}!\" }
153
- Webgen::Plugin.config[#{self.name}].obj
154
- end
155
- end"
156
- module_eval s
157
- end
210
+ end
158
211
 
159
- # Return the ancestor classes for the object's class which are sub classes from Plugin.
160
- def self.ancestor_classes
161
- self.ancestors.delete_if {|c| c.instance_of?( Module ) }[0..-3]
162
- end
212
+ module CommandPlugin; end
213
+
214
+ # The base class for all plugins.
215
+ class Plugin
216
+ include PluginDefs
163
217
 
218
+ load_config_file
219
+ end
220
+
221
+ # This module should be included by classes derived from CommandParser::Command as it
222
+ # automatically adds an object of the class to the main CommandParser object.
223
+ module CommandPlugin
224
+ include PluginDefs
225
+
226
+ def self.append_features( klass )
227
+ super
228
+ PluginDefs.append_features( klass )
229
+ klass.extend( ClassMethods )
230
+ end
164
231
  end
165
232
 
166
- require 'webgen/logging'
167
- require 'webgen/configuration'
233
+ require 'webgen/plugins/coreplugins/logging'
234
+ require 'webgen/plugins/coreplugins/configuration'
168
235
 
169
236
  end
170
237