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.
- data/ChangeLog +1523 -97
- data/Rakefile +11 -24
- data/TODO +22 -9
- data/VERSION +1 -1
- data/bin/webgen +2 -2
- data/bin/webgen-gallery-editor +654 -0
- data/bin/webgen-gui +10 -0
- data/data/webgen/data/ISO-639-2_values_8bits.txt +492 -0
- data/data/webgen/gallery-creator/default.png +0 -0
- data/data/webgen/icon_mapping.yaml +27 -0
- data/data/webgen/resources/emoticons/bigeyes/angry.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/cool.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/cry.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/drunk.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/lol.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/oops.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/sad.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/sleep.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/smile.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/tongue.png +0 -0
- data/data/webgen/resources/emoticons/bigeyes/wink.png +0 -0
- data/data/webgen/resources/emoticons/crystal/angry.png +0 -0
- data/data/webgen/resources/emoticons/crystal/cool.png +0 -0
- data/data/webgen/resources/emoticons/crystal/cry.png +0 -0
- data/data/webgen/resources/emoticons/crystal/drunk.png +0 -0
- data/data/webgen/resources/emoticons/crystal/lol.png +0 -0
- data/data/webgen/resources/emoticons/crystal/oops.png +0 -0
- data/data/webgen/resources/emoticons/crystal/sad.png +0 -0
- data/data/webgen/resources/emoticons/crystal/sleep.png +0 -0
- data/data/webgen/resources/emoticons/crystal/smile.png +0 -0
- data/data/webgen/resources/emoticons/crystal/tongue.png +0 -0
- data/data/webgen/resources/emoticons/crystal/wink.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/angry.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/cool.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/cry.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/drunk.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/lol.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/oops.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/sad.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/sleep.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/smile.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/tongue.png +0 -0
- data/data/webgen/resources/emoticons/cyclops/wink.png +0 -0
- data/data/webgen/resources/emoticons/glass/angry.png +0 -0
- data/data/webgen/resources/emoticons/glass/cool.png +0 -0
- data/data/webgen/resources/emoticons/glass/cry.png +0 -0
- data/data/webgen/resources/emoticons/glass/drunk.png +0 -0
- data/data/webgen/resources/emoticons/glass/lol.png +0 -0
- data/data/webgen/resources/emoticons/glass/oops.png +0 -0
- data/data/webgen/resources/emoticons/glass/sad.png +0 -0
- data/data/webgen/resources/emoticons/glass/sleep.png +0 -0
- data/data/webgen/resources/emoticons/glass/smile.png +0 -0
- data/data/webgen/resources/emoticons/glass/tongue.png +0 -0
- data/data/webgen/resources/emoticons/glass/wink.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/angry.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/cool.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/cry.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/drunk.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/lol.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/oops.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/sad.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/sleep.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/smile.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/tongue.png +0 -0
- data/data/webgen/resources/emoticons/icqstyle/wink.png +0 -0
- data/data/webgen/resources/emoticons/matrix/angry.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/cool.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/cry.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/drunk.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/lol.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/oops.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/sad.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/sleep.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/smile.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/tongue.gif +0 -0
- data/data/webgen/resources/emoticons/matrix/wink.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/angry.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/cool.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/cry.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/drunk.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/lol.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/oops.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/sad.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/sleep.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/smile.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/tongue.gif +0 -0
- data/data/webgen/resources/emoticons/smellies/wink.gif +0 -0
- data/data/webgen/resources/icons/compressed.png +0 -0
- data/data/webgen/resources/icons/document.png +0 -0
- data/data/webgen/resources/icons/download.png +0 -0
- data/data/webgen/resources/icons/image.png +0 -0
- data/data/webgen/resources/icons/linux.png +0 -0
- data/data/webgen/resources/icons/mac.png +0 -0
- data/data/webgen/resources/icons/pdf.png +0 -0
- data/data/webgen/resources/icons/penguin.png +0 -0
- data/data/webgen/resources/icons/quicktime.png +0 -0
- data/data/webgen/resources/icons/real.png +0 -0
- data/data/webgen/resources/icons/rpm.png +0 -0
- data/data/webgen/resources/icons/sound.png +0 -0
- data/data/webgen/resources/icons/source.png +0 -0
- data/data/webgen/resources/icons/spreadsheet.png +0 -0
- data/data/webgen/resources/icons/text.png +0 -0
- data/data/webgen/resources/icons/vcard.png +0 -0
- data/data/webgen/resources/icons/video.png +0 -0
- data/data/webgen/resources/icons/win.png +0 -0
- data/data/webgen/{images → resources/images}/generated_by_webgen.png +0 -0
- data/data/webgen/{images → resources/images}/valid-css.gif +0 -0
- data/data/webgen/{images → resources/images}/valid-xhtml11.png +0 -0
- data/data/webgen/{images → resources/images}/webgen_logo.png +0 -0
- data/data/webgen/{example/src → website_styles/default}/default.css +0 -0
- data/data/webgen/{example/src → website_styles/default}/default.template +2 -2
- data/data/webgen/website_templates/default/README +6 -0
- data/data/webgen/{example → website_templates/default}/config.yaml +0 -0
- data/data/webgen/{example → website_templates/default}/src/index.page +0 -0
- data/data/webgen/website_templates/personal_hp/README +6 -0
- data/data/webgen/website_templates/personal_hp/src/about.page +12 -0
- data/data/webgen/website_templates/personal_hp/src/index.page +9 -0
- data/data/webgen/website_templates/personal_hp/src/links.page +22 -0
- data/data/webgen/website_templates/personal_hp/src/projects.page +20 -0
- data/data/webgen/website_templates/project/README +7 -0
- data/data/webgen/website_templates/project/src/about.page +12 -0
- data/data/webgen/website_templates/project/src/download.page +15 -0
- data/data/webgen/website_templates/project/src/features.page +8 -0
- data/data/webgen/website_templates/project/src/index.page +9 -0
- data/data/webgen/website_templates/project/src/screenshots.page +18 -0
- data/doc/config.yaml +3 -0
- data/doc/plugin/clidesc.rb +18 -7
- data/doc/plugin/emoticon.rb +29 -0
- data/doc/plugin/extension.rb +15 -16
- data/doc/plugin/listpluginparameters.rb +39 -0
- data/doc/plugin/resources.rb +4 -4
- data/doc/plugin/source.rb +21 -0
- data/doc/src/default.css +7 -4
- data/doc/src/default.template +4 -2
- data/doc/src/documentation/cli.page +1 -1
- data/doc/src/documentation/extending_webgen.page +102 -0
- data/doc/src/documentation/gettingstarted.page +3 -6
- data/doc/src/documentation/index.page +1 -1
- data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/html.page +0 -0
- data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/index.page +0 -0
- data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/markdown.page +0 -0
- data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/rdoc.page +0 -0
- data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/textile.page +0 -0
- data/doc/src/documentation/plugins/{system → coreplugins}/configuration.page +0 -0
- data/doc/src/documentation/plugins/coreplugins/index.page +7 -0
- data/doc/src/documentation/plugins/{system → coreplugins}/logging.page +0 -0
- data/doc/src/documentation/plugins/{resourcemanager.page → coreplugins/resourcemanager.page} +5 -1
- data/doc/src/documentation/plugins/{filehandler → filehandlers}/backing.page +1 -1
- data/doc/src/documentation/plugins/{filehandler → filehandlers}/copy.page +1 -1
- data/doc/src/documentation/plugins/{filehandler/directory.page → filehandlers/directoryhandler.page} +11 -2
- data/doc/src/documentation/plugins/{filehandler/galleryhandler.page → filehandlers/gallery.page} +20 -13
- data/doc/src/documentation/plugins/{filehandler → filehandlers}/index.page +0 -0
- data/doc/src/documentation/plugins/{filehandler/pagehandler.page → filehandlers/page.page} +6 -4
- data/doc/src/documentation/plugins/{filehandler → filehandlers}/template.page +0 -0
- data/doc/src/documentation/plugins/{gallerylayouter → gallerylayouters}/index.page +7 -3
- data/doc/src/documentation/plugins/{htmlvalidator → htmlvalidators}/index.page +0 -0
- data/doc/src/documentation/plugins/{htmlvalidator → htmlvalidators}/xmllint.page +0 -0
- data/doc/src/documentation/plugins/index.page +4 -0
- data/doc/src/documentation/plugins/menustyles/{horizontal-dropdown.page → horizontaldropdown.page} +0 -0
- data/doc/src/documentation/plugins/menustyles/{vertical-dropdown.page → verticaldropdown.page} +1 -1
- data/doc/src/documentation/plugins/miscplugins/index.page +7 -0
- data/doc/src/documentation/plugins/miscplugins/smileyreplacer.page +38 -0
- data/doc/src/documentation/plugins/tags/breadcrumbtrail.page +20 -0
- data/doc/src/documentation/plugins/tags/download.page +23 -0
- data/doc/src/documentation/plugins/tags/resource.page +1 -1
- data/doc/src/documentation/plugins/tags/sitemap.page +1 -2
- data/doc/src/documentation/references/index.page +8 -0
- data/doc/src/documentation/{meta_info_reference.page → references/meta_info_reference.page} +1 -0
- data/doc/src/documentation/references/parameter_reference.page +12 -0
- data/doc/src/documentation/webgen_gallery_editor.page +82 -0
- data/doc/src/download.page +2 -2
- data/doc/src/features.page +3 -2
- data/doc/src/images/screenshots/wge-image.png +0 -0
- data/doc/src/images/screenshots/wge-layout-preview.png +0 -0
- data/doc/src/images/screenshots/wge-main-disabled.png +0 -0
- data/doc/src/images/screenshots/wge-main.png +0 -0
- data/doc/src/index.page +30 -11
- data/doc/src/meta.info +7 -7
- data/doc/src/screenshots.gallery +33 -0
- data/install.rb +1 -1
- data/lib/webgen.rb +275 -0
- data/lib/webgen/composite.rb +1 -1
- data/lib/webgen/gui/common.rb +38 -0
- data/lib/webgen/gui/main.rb +219 -0
- data/lib/webgen/gui/new_website_dlg.rb +125 -0
- data/lib/webgen/listener.rb +1 -1
- data/lib/webgen/node.rb +4 -2
- data/lib/webgen/plugin.rb +167 -100
- data/lib/webgen/plugins/{contenthandler/defaultcontenthandler.rb → contenthandlers/default.rb} +1 -1
- data/lib/webgen/plugins/{contenthandler → contenthandlers}/html.rb +2 -2
- data/lib/webgen/plugins/{contenthandler → contenthandlers}/markdown.rb +2 -2
- data/lib/webgen/plugins/{contenthandler → contenthandlers}/rdoc.rb +2 -2
- data/lib/webgen/plugins/{contenthandler → contenthandlers}/textile.rb +2 -2
- data/lib/webgen/{configuration.rb → plugins/coreplugins/configuration.rb} +34 -14
- data/lib/webgen/{logging.rb → plugins/coreplugins/logging.rb} +4 -4
- data/lib/webgen/plugins/{resourcemanager.rb → coreplugins/resourcemanager.rb} +44 -22
- data/lib/webgen/plugins/{filehandler → filehandlers}/backing.rb +11 -11
- data/lib/webgen/plugins/{filehandler/filecopy.rb → filehandlers/copy.rb} +3 -3
- data/lib/webgen/plugins/{filehandler → filehandlers}/directory.rb +15 -10
- data/lib/webgen/plugins/{filehandler → filehandlers}/filehandler.rb +9 -7
- data/lib/webgen/plugins/{filehandler/picturegallery.rb → filehandlers/gallery.rb} +35 -28
- data/lib/webgen/plugins/{filehandler → filehandlers}/page.rb +30 -15
- data/lib/webgen/plugins/{filehandler → filehandlers}/template.rb +3 -3
- data/lib/webgen/plugins/{gallerylayouter/defaultgallerylayouter.rb → gallerylayouters/default.rb} +11 -11
- data/lib/webgen/plugins/{htmlvalidator/defaulthtmlvalidator.rb → htmlvalidators/default.rb} +1 -1
- data/lib/webgen/plugins/{htmlvalidator → htmlvalidators}/xmllint.rb +2 -2
- data/lib/webgen/plugins/menustyles/{defaultmenustyle.rb → default.rb} +2 -2
- data/lib/webgen/plugins/menustyles/horizontal.rb +2 -2
- data/lib/webgen/plugins/menustyles/horizontal_dropdown.rb +2 -2
- data/lib/webgen/plugins/menustyles/partial.rb +2 -2
- data/lib/webgen/plugins/menustyles/vertical.rb +2 -2
- data/lib/webgen/plugins/menustyles/vertical_dropdown.rb +2 -2
- data/lib/webgen/plugins/miscplugins/smileyreplacer.rb +84 -0
- data/lib/webgen/plugins/{treewalker.rb → miscplugins/treewalker.rb} +1 -1
- data/lib/webgen/plugins/tags/{navbar.rb → breadcrumbtrail.rb} +5 -9
- data/lib/webgen/plugins/tags/date.rb +2 -6
- data/lib/webgen/plugins/tags/download.rb +155 -0
- data/lib/webgen/plugins/tags/executecommand.rb +2 -6
- data/lib/webgen/plugins/tags/includefile.rb +4 -8
- data/lib/webgen/plugins/tags/langbar.rb +2 -6
- data/lib/webgen/plugins/tags/menu.rb +2 -7
- data/lib/webgen/plugins/tags/meta.rb +2 -6
- data/lib/webgen/plugins/tags/relocatable.rb +2 -6
- data/lib/webgen/plugins/tags/sitemap.rb +14 -10
- data/lib/webgen/plugins/tags/tags.rb +25 -18
- data/lib/webgen/plugins/tags/wikilink.rb +2 -6
- metadata +311 -195
- data/doc/src/design.gallery +0 -18
- data/doc/src/designs/curdesign.png +0 -0
- data/doc/src/designs/nostyle.png +0 -0
- data/doc/src/designs/old.png +0 -0
- data/doc/src/documentation/plugins/gallerylayouter/defaultlayouter.page +0 -12
- data/doc/src/documentation/plugins/system/index.page +0 -7
- data/doc/src/documentation/plugins/tags/navbar.page +0 -20
- data/lib/webgen/webgen.rb +0 -271
- data/testsite/config.yaml +0 -7
- data/testsite/src/bghack.png +0 -0
- data/testsite/src/bluecloth.page +0 -102
- data/testsite/src/default.css +0 -146
- data/testsite/src/default.template +0 -33
- data/testsite/src/home.en.page +0 -22
- data/testsite/src/home.page +0 -22
- data/testsite/src/images/bghack.png +0 -0
- data/testsite/src/index.page +0 -21
- data/testsite/src/meta.info +0 -12
- data/testsite/src/news.page +0 -20
- data/testsite/src/news_are_so-cool.de.page +0 -19
- data/testsite/src/noindex/noindex.page +0 -20
- data/testsite/src/pictures/index.page +0 -20
- data/testsite/src/projects.de.page +0 -11
- data/testsite/src/projects.es.page +0 -11
- data/testsite/src/projects.page +0 -17
- data/testsite/src/projects/00.index.de.page +0 -10
- data/testsite/src/projects/01.project2.page +0 -20
- data/testsite/src/projects/02.project1.page +0 -20
- data/testsite/src/projects/05.project3.page +0 -22
- data/testsite/src/projects/index.page +0 -20
- data/testsite/src/projects/subproj/index.page +0 -22
- data/testsite/src/projects/subproj/project3.page +0 -21
- data/testsite/src/rdoc.page +0 -12
- 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!(/&/, '&')
|
|
39
|
+
msg.gsub!(/>/, '>')
|
|
40
|
+
msg.gsub!(/</, '<')
|
|
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
|
data/lib/webgen/listener.rb
CHANGED
data/lib/webgen/node.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#
|
|
2
2
|
#--
|
|
3
3
|
#
|
|
4
|
-
# $Id: node.rb
|
|
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?
|
data/lib/webgen/plugin.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#
|
|
2
2
|
#--
|
|
3
3
|
#
|
|
4
|
-
# $Id: plugin.rb
|
|
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
|
|
33
|
-
class
|
|
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
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
70
|
+
# Return plugin data
|
|
71
|
+
def config
|
|
72
|
+
@@config
|
|
73
|
+
end
|
|
43
74
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
end
|
|
82
|
+
# Add subclass to plugin data.
|
|
83
|
+
def inherited( klass )
|
|
84
|
+
ClassMethods.extended( klass )
|
|
85
|
+
end
|
|
56
86
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
-
|
|
113
|
-
ancestor_classes
|
|
114
|
-
|
|
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
|
-
|
|
118
|
-
|
|
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(
|
|
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
|
-
|
|
206
|
+
!self.class.config[klass].params.nil? && self.class.config[klass].params.has_key?( name )
|
|
136
207
|
end
|
|
137
208
|
end
|
|
138
209
|
|
|
139
|
-
|
|
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
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
|