webgen 0.3.6 → 0.3.7

Sign up to get free protection for your applications and to get access to all the features.
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