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
data/Rakefile
CHANGED
|
@@ -32,7 +32,7 @@ require 'rake/testtask'
|
|
|
32
32
|
# General actions ##############################################################
|
|
33
33
|
|
|
34
34
|
$:.push 'lib'
|
|
35
|
-
require 'webgen/configuration'
|
|
35
|
+
require 'webgen/plugins/coreplugins/configuration'
|
|
36
36
|
|
|
37
37
|
PKG_NAME = "webgen"
|
|
38
38
|
PKG_VERSION = Webgen::VERSION.join( '.' )
|
|
@@ -117,12 +117,19 @@ PKG_FILES = FileList.new( [
|
|
|
117
117
|
fl.exclude( 'doc/output' )
|
|
118
118
|
end
|
|
119
119
|
|
|
120
|
-
task :package => [:gen_files] do
|
|
120
|
+
task :package => [:gen_files, :create_gal_layout_pics] do
|
|
121
121
|
chdir 'pkg' do
|
|
122
122
|
sh "rpaadmin packport #{PKG_NAME}-#{PKG_VERSION}"
|
|
123
123
|
end
|
|
124
124
|
end
|
|
125
125
|
|
|
126
|
+
CLOBBER << "otherdata/web-for-gallery-pics/output"
|
|
127
|
+
task :create_gal_layout_pics do
|
|
128
|
+
chdir 'otherdata/web-for-gallery-pics' do
|
|
129
|
+
ruby "-I../../lib create_pictures.rb"
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
126
133
|
task :gen_changelog do
|
|
127
134
|
sh "svn log -r HEAD:1 -v > ChangeLog"
|
|
128
135
|
end
|
|
@@ -182,7 +189,7 @@ else
|
|
|
182
189
|
#### Dependencies, requirements and files
|
|
183
190
|
|
|
184
191
|
s.files = PKG_FILES.to_a
|
|
185
|
-
s.add_dependency( 'cmdparse', '~>
|
|
192
|
+
s.add_dependency( 'cmdparse', '~> 2.0.0' )
|
|
186
193
|
|
|
187
194
|
s.require_path = 'lib'
|
|
188
195
|
s.autorequire = nil
|
|
@@ -194,7 +201,7 @@ else
|
|
|
194
201
|
|
|
195
202
|
s.has_rdoc = true
|
|
196
203
|
s.extra_rdoc_files = rd.rdoc_files.reject do |fn| fn =~ /\.rb$/ end.to_a
|
|
197
|
-
s.rdoc_options = ['--line-numbers', '-m README']
|
|
204
|
+
s.rdoc_options = ['--line-numbers', '-m', 'README']
|
|
198
205
|
|
|
199
206
|
#### Author and project details
|
|
200
207
|
|
|
@@ -263,23 +270,3 @@ task :statistics do
|
|
|
263
270
|
end
|
|
264
271
|
show_line( "Total", total_lines, total_code )
|
|
265
272
|
end
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
def run_testsite( arguments = '' )
|
|
269
|
-
Dir.chdir("testsite")
|
|
270
|
-
ruby %{-I../lib #{arguments} ../bin/webgen -V 3 }
|
|
271
|
-
end
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
CLOBBER << "testsite/output" << "testsite/webgen.log"
|
|
275
|
-
desc "Build the test site"
|
|
276
|
-
task :testsite do
|
|
277
|
-
run_testsite
|
|
278
|
-
end
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
CLOBBER << "testsite/coverage"
|
|
282
|
-
desc "Run the code coverage tool on the testsite"
|
|
283
|
-
task :coverage do
|
|
284
|
-
run_testsite '-rcoverage'
|
|
285
|
-
end
|
data/TODO
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
---- CURRENT ----
|
|
2
2
|
|
|
3
|
-
*
|
|
3
|
+
* show available styles and templates in docu and in online help (webgen help create)
|
|
4
|
+
* think about plugin system, @@config etc - should work from within webgen-gui, not only once from webgen
|
|
5
|
+
* make webgen source installation work with correct cmdparse version
|
|
6
|
+
* FileCopyHandler#initialize not reentrant
|
|
4
7
|
* make menu generation faster (for webgen: 5.2s without menus in template, 9.2s with menus!)
|
|
5
|
-
* modify tags system sothat tags can be specified via a tag directive (like extension with file handlers)
|
|
6
8
|
* create tests for methods in webgen.rb
|
|
7
|
-
* webgen -c => output same info as on docu pages
|
|
8
9
|
* check if duplicate nodes are created??? by using a tag in a template
|
|
9
10
|
* allow a template to use another template (templates as page description files?) (template2 uses template1)
|
|
10
11
|
* use code generator to create test file with all tags and all tag parameter configurations
|
|
11
12
|
|
|
12
13
|
---- DOCU ----
|
|
13
14
|
|
|
14
|
-
*
|
|
15
|
-
* add keywords to default.template
|
|
16
|
-
* document which meta info can be used in gallery file for gallery itself, gallery pages and picture pages
|
|
15
|
+
* examples for each type of plugins in extending webgen section
|
|
17
16
|
|
|
18
17
|
---- FUTURE ----
|
|
19
18
|
|
|
19
|
+
* Configuration:outDirectory should support FTP and SFTP protocols
|
|
20
|
+
* refactor code sothat one source file can be used by 0..n processors
|
|
21
|
+
* tag 'link' which provides a link to the file optionally showing an icon
|
|
22
|
+
* parameter for including page icons in menus
|
|
20
23
|
* parameter for setting the orderInfo of index pages so that they always appear as first entry
|
|
21
|
-
* custom commands provided by plugins
|
|
22
24
|
* implement plugin which creates nodes for fragment identifiers (#info) in html
|
|
23
|
-
* convert smiley characters to smileys
|
|
24
25
|
* include spell checker (ispell, aspell, MS Word OLE on Win32,...)
|
|
25
|
-
* tag 'download' which links to a download file and appends its size and ev. an image (PDF, ...)
|
|
26
26
|
* tag 'resume', uses xmlresume2x to provide HTML version of xml resume
|
|
27
27
|
* multi-lingual picture/gallery files
|
|
28
28
|
* include exif info for pictures
|
|
@@ -197,3 +197,16 @@ W do not allow two or more page files in the same language, print warn
|
|
|
197
197
|
* better docu for backing file handler
|
|
198
198
|
* make dropdown menus "look" nice in IE
|
|
199
199
|
* make dropdown menus work in IE -> rather hard to do in a general way
|
|
200
|
+
* convert smiley characters to smileys
|
|
201
|
+
* add keywords to default.template
|
|
202
|
+
* document which meta info can be used in gallery file for gallery itself, gallery pages and picture pages
|
|
203
|
+
* summary page of all parameters
|
|
204
|
+
* add note that smellies emoticon pack is from ... -> see temp/smileys dir
|
|
205
|
+
* docu for webgen-gallery-editor
|
|
206
|
+
* docu on how to extend webgen
|
|
207
|
+
* custom commands provided by plugins
|
|
208
|
+
* tag 'download' which links to a download file and appends its size and ev. an image (PDF, ...)
|
|
209
|
+
* modify tags system sothat tags can be specified via a tag directive (like extension with file handlers)
|
|
210
|
+
* adapt clidesc to cmdparse 2.0.0
|
|
211
|
+
* webgen show config => output same info as on docu pages
|
|
212
|
+
* test usage for en, deu, eng (ISO-639-2 codes)
|
data/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
0.3.
|
|
1
|
+
0.3.7
|
data/bin/webgen
CHANGED
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
# -*- ruby -*-
|
|
3
|
+
|
|
4
|
+
require 'yaml'
|
|
5
|
+
require 'ostruct'
|
|
6
|
+
require 'webgen/plugin'
|
|
7
|
+
require 'webgen/plugins/coreplugins/configuration'
|
|
8
|
+
require 'webgen/plugins/filehandlers/gallery'
|
|
9
|
+
require 'Qt'
|
|
10
|
+
# Error when loading Qt before RMagick -> error in RMagick undefined method `display' for class `Magick::Image'
|
|
11
|
+
# report that to qtruby team and RMagick team
|
|
12
|
+
|
|
13
|
+
class Gallery
|
|
14
|
+
|
|
15
|
+
attr_accessor :meta
|
|
16
|
+
attr_accessor :relpath
|
|
17
|
+
|
|
18
|
+
def initialize
|
|
19
|
+
set_default_values
|
|
20
|
+
@relpath = '.'
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def []( name )
|
|
24
|
+
@meta[name]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def []=( name, value )
|
|
28
|
+
@meta[name] = value
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def set_default_values
|
|
32
|
+
@meta = {}
|
|
33
|
+
Webgen::Plugin.config[FileHandlers::GalleryFileHandler].params.each do |name, data|
|
|
34
|
+
@meta[name] = data.value
|
|
35
|
+
end
|
|
36
|
+
@meta['mainPage'] = nil
|
|
37
|
+
@meta['galleryPages'] = nil
|
|
38
|
+
@meta['thumbnailSize'] = nil
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def read_file( filename )
|
|
42
|
+
filedata = YAML::load( File.read( filename ) )
|
|
43
|
+
|
|
44
|
+
set_default_values
|
|
45
|
+
filedata.each {|name, data| @meta[name] = data }
|
|
46
|
+
@relpath = File.dirname( filename )
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def write_file( filename )
|
|
50
|
+
File.open( filename, 'w+' ) {|file| file.write( @meta.to_yaml ) }
|
|
51
|
+
@relpath= File.dirname( filename )
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class ImageViewer < Qt::Frame
|
|
58
|
+
|
|
59
|
+
def initialize( p )
|
|
60
|
+
super( p )
|
|
61
|
+
setFrameStyle( Qt::Frame::StyledPanel | Qt::Frame::Sunken )
|
|
62
|
+
set_image
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def set_image( filename = nil)
|
|
66
|
+
filename = File.join( CorePlugins::Configuration.data_dir, 'resources/images/webgen_logo.png' ) if filename.nil?
|
|
67
|
+
@image = Qt::Image.new( filename )
|
|
68
|
+
update
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def drawContents( painter )
|
|
72
|
+
return if @image.nil?
|
|
73
|
+
width = contentsRect.width
|
|
74
|
+
height = contentsRect.height
|
|
75
|
+
image = ( width > @image.width && height > @image.height ? @image : @image.smoothScale( width, height, Qt::Image::ScaleMin ) )
|
|
76
|
+
painter.drawImage( contentsRect.left + (width - image.width) / 2, contentsRect.top + (height - image.height) / 2, image )
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def sizeHint
|
|
80
|
+
Qt::Size.new( 320, 200 )
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class MetaTableNameItem < Qt::TableItem
|
|
87
|
+
|
|
88
|
+
def initialize( table, text = '' )
|
|
89
|
+
super( table, Qt::TableItem::OnTyping )
|
|
90
|
+
setReplaceable( false )
|
|
91
|
+
setText( text )
|
|
92
|
+
add_text_to_list( text )
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def createEditor
|
|
96
|
+
cb = Qt::ComboBox.new( table.viewport )
|
|
97
|
+
cb.setEditable( true )
|
|
98
|
+
cb.setAutoCompletion( true )
|
|
99
|
+
cb.insertStringList( table.meta_items )
|
|
100
|
+
cb.setCurrentText( text )
|
|
101
|
+
cb
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def setContentFromEditor( widget )
|
|
105
|
+
setText( widget.currentText )
|
|
106
|
+
add_text_to_list( widget.currentText )
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def add_text_to_list( text )
|
|
110
|
+
unless text.nil? || text.empty? || table.meta_items.include?( text )
|
|
111
|
+
table.meta_items << text
|
|
112
|
+
table.meta_items.sort!
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
class MetaTableValueItem < Qt::TableItem
|
|
119
|
+
|
|
120
|
+
def initialize( table, text = '' )
|
|
121
|
+
super( table, Qt::TableItem::OnTyping )
|
|
122
|
+
setContent( text )
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def setContent( content )
|
|
126
|
+
setText( content.to_s )
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def getContent
|
|
130
|
+
case text
|
|
131
|
+
when 'true' then true
|
|
132
|
+
when 'false' then false
|
|
133
|
+
when 'nil' then nil
|
|
134
|
+
when /\d+/ then text.to_i
|
|
135
|
+
else text
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class MetaDataTable < Qt::Table
|
|
143
|
+
|
|
144
|
+
slots 'value_changed(int, int)'
|
|
145
|
+
|
|
146
|
+
attr_reader :meta_items
|
|
147
|
+
|
|
148
|
+
def initialize( p, meta_items = [], exclude_items = [] )
|
|
149
|
+
super( 1, 2, p )
|
|
150
|
+
@meta_items = meta_items.sort!
|
|
151
|
+
@exclude_items = exclude_items
|
|
152
|
+
horizontalHeader.setLabel( 0, 'Name' )
|
|
153
|
+
horizontalHeader.setLabel( 1, 'Value' )
|
|
154
|
+
setSelectionMode( Qt::Table::Single )
|
|
155
|
+
setItem( 0, 0, MetaTableNameItem.new( self ) )
|
|
156
|
+
setItem( 0, 1, MetaTableValueItem.new( self ) )
|
|
157
|
+
|
|
158
|
+
connect( horizontalHeader, SIGNAL('clicked(int)'), self, SLOT('setFocus()') )
|
|
159
|
+
connect( verticalHeader, SIGNAL('clicked(int)'), self, SLOT('setFocus()') )
|
|
160
|
+
connect( self, SIGNAL('valueChanged(int, int)'), self, SLOT('value_changed( int, int )') )
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def activateNextCell
|
|
164
|
+
activate = endEdit( currentRow, currentColumn, true, false )
|
|
165
|
+
oldRow = currentRow
|
|
166
|
+
oldCol = currentColumn
|
|
167
|
+
|
|
168
|
+
setCurrentCell( currentColumn == 1 ? (currentRow == numRows - 1 ? 0 : currentRow + 1) : currentRow,
|
|
169
|
+
(currentColumn + 1) % 2 )
|
|
170
|
+
setCurrentCell( oldRow, oldCol ) if !activate
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def endEdit( row, col, accept, replace )
|
|
174
|
+
activate_next_cell = true
|
|
175
|
+
w = cellWidget( row, col )
|
|
176
|
+
if col == 0 && !w.nil?
|
|
177
|
+
if keys( (0...row).to_a + (row+1..numRows-1).to_a ).find {|t| t == w.currentText && t != '' }
|
|
178
|
+
msg = "You can't add duplicate entries!"
|
|
179
|
+
elsif @exclude_items.include?( w.currentText )
|
|
180
|
+
msg = "This meta information can only be defined via other controls!"
|
|
181
|
+
end
|
|
182
|
+
if msg
|
|
183
|
+
Qt::MessageBox.information( self, "Error adding entry", msg )
|
|
184
|
+
accept = false
|
|
185
|
+
activate_next_cell = false
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
super( row, col, accept, replace )
|
|
189
|
+
activate_next_cell
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
def fill( items )
|
|
193
|
+
setNumRows( items.length + 1 )
|
|
194
|
+
items.each_with_index do |data, index|
|
|
195
|
+
setItem( index, 0, MetaTableNameItem.new( self, data[0] ) )
|
|
196
|
+
setItem( index, 1, MetaTableValueItem.new( self, data[1] ) )
|
|
197
|
+
end
|
|
198
|
+
setItem( items.length, 0, MetaTableNameItem.new( self ) )
|
|
199
|
+
setItem( items.length, 1, MetaTableValueItem.new( self ) )
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
def keys( rows = (0..(numRows-1)).to_a )
|
|
203
|
+
retval = []
|
|
204
|
+
rows.each do |i|
|
|
205
|
+
retval << text( i, 0 )
|
|
206
|
+
end
|
|
207
|
+
retval
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def meta_info
|
|
211
|
+
retval = {}
|
|
212
|
+
0.upto( numRows - 2 ) do |i|
|
|
213
|
+
retval[text( i, 0 )] = item( i, 1 ).getContent
|
|
214
|
+
end
|
|
215
|
+
retval
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
def value_changed( row, col )
|
|
219
|
+
col0empty = text( row, 0 ).nil? || text( row, 0).empty?
|
|
220
|
+
col1empty = text( row, 1 ).nil? || text( row, 1).empty?
|
|
221
|
+
if row == numRows - 1 && (!col0empty || !col1empty)
|
|
222
|
+
setNumRows( numRows + 1 )
|
|
223
|
+
setItem( numRows - 1, 0, MetaTableNameItem.new( self ) )
|
|
224
|
+
setItem( numRows - 1, 1, MetaTableValueItem.new( self ) )
|
|
225
|
+
elsif !(row == numRows - 1) && col0empty && col1empty
|
|
226
|
+
removeRow( row )
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def keyReleaseEvent( event )
|
|
231
|
+
if event.key == Qt::Key_Delete
|
|
232
|
+
if currentSelection == -1
|
|
233
|
+
setText( currentRow, currentColumn, '' )
|
|
234
|
+
emit valueChanged( currentRow, currentColumn )
|
|
235
|
+
else
|
|
236
|
+
sel = selection( currentSelection )
|
|
237
|
+
sel.topRow.upto( sel.bottomRow ) do |row|
|
|
238
|
+
sel.leftCol.upto( sel.rightCol) do |col|
|
|
239
|
+
setText( row, col, '' )
|
|
240
|
+
emit valueChanged( row, col )
|
|
241
|
+
end
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
else
|
|
245
|
+
event.ignore
|
|
246
|
+
end
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
class MyTextEdit < Qt::TextEdit
|
|
253
|
+
|
|
254
|
+
signals 'myReturnPressed()'
|
|
255
|
+
|
|
256
|
+
def keyPressEvent( event )
|
|
257
|
+
if (event.key == Qt::Key_Return || event.key == Qt::Key_Enter) && (event.state & Qt::ControlButton == Qt::ControlButton)
|
|
258
|
+
emit myReturnPressed()
|
|
259
|
+
else
|
|
260
|
+
super
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
|
|
264
|
+
end
|
|
265
|
+
|
|
266
|
+
|
|
267
|
+
class ImageFileDrag < Qt::DragObject
|
|
268
|
+
|
|
269
|
+
def initialize( text, parent )
|
|
270
|
+
super( parent )
|
|
271
|
+
@text = text
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def format( param )
|
|
275
|
+
if param == 0
|
|
276
|
+
"app/webgen-image-file" #how to define a user mime type correctly?
|
|
277
|
+
else
|
|
278
|
+
nil
|
|
279
|
+
end
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
def encodedData( format )
|
|
283
|
+
@text
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
class ImageFileList < Qt::ListBox
|
|
289
|
+
|
|
290
|
+
def initialize( parent, mainWindow )
|
|
291
|
+
super( parent )
|
|
292
|
+
setAcceptDrops( true )
|
|
293
|
+
@dragPos = nil
|
|
294
|
+
@mainWindow = mainWindow
|
|
295
|
+
Qt::ToolTip.add( self, "You can order the images by dragging and dropping the image names (sets the <b>orderInfo</b> meta information)" )
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
def fill_list( items )
|
|
299
|
+
items.sort do |a,b|
|
|
300
|
+
aoi = (@mainWindow.gallery[a].nil? ? 0 : @mainWindow.gallery[a]['orderInfo'].to_s.to_i)
|
|
301
|
+
boi = (@mainWindow.gallery[b].nil? ? 0 : @mainWindow.gallery[b]['orderInfo'].to_s.to_i)
|
|
302
|
+
aoi <=> boi
|
|
303
|
+
end.each {|image| insertItem( image )}
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
def dragEnterEvent( event )
|
|
307
|
+
event.accept if event.provides( "app/webgen-image-file" )
|
|
308
|
+
end
|
|
309
|
+
|
|
310
|
+
def dropEvent( event )
|
|
311
|
+
text = event.encodedData( "app/webgen-image-file" ).to_s
|
|
312
|
+
dropIndex = index( itemAt( event.pos ) )
|
|
313
|
+
|
|
314
|
+
blockSignals( true )
|
|
315
|
+
@mainWindow.save_image_meta_info
|
|
316
|
+
removeItem( currentItem )
|
|
317
|
+
insertItem( text, dropIndex )
|
|
318
|
+
@mainWindow.save_image_meta_info
|
|
319
|
+
blockSignals( false )
|
|
320
|
+
|
|
321
|
+
0.upto( count - 1 ) {|i| (@mainWindow.gallery[text( i )] ||= {})['orderInfo'] = i }
|
|
322
|
+
|
|
323
|
+
setCurrentItem( dropIndex )
|
|
324
|
+
end
|
|
325
|
+
|
|
326
|
+
def mousePressEvent( event )
|
|
327
|
+
super
|
|
328
|
+
@dragPos = event.pos
|
|
329
|
+
end
|
|
330
|
+
|
|
331
|
+
def mouseReleaseEvent( event )
|
|
332
|
+
super
|
|
333
|
+
@dragPos = nil
|
|
334
|
+
end
|
|
335
|
+
|
|
336
|
+
def mouseMoveEvent( event )
|
|
337
|
+
if @dragPos && (@dragPos - event.pos).manhattanLength > Qt::Application.startDragDistance
|
|
338
|
+
d = ImageFileDrag.new( currentText, self )
|
|
339
|
+
d.dragMove
|
|
340
|
+
@dragPos = nil
|
|
341
|
+
end
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
class GalleryWindow < Qt::MainWindow
|
|
348
|
+
|
|
349
|
+
slots 'new()', 'open()', 'save()', 'save_as()', 'image_selected(const QString &)',
|
|
350
|
+
'init_image_list()', 'select_next_image()', "assign_pic_names()"
|
|
351
|
+
|
|
352
|
+
attr_reader :gallery
|
|
353
|
+
|
|
354
|
+
def initialize
|
|
355
|
+
super
|
|
356
|
+
setCaption( "Webgen Gallery Editor" )
|
|
357
|
+
|
|
358
|
+
@gallery = nil
|
|
359
|
+
@curfile = nil
|
|
360
|
+
setup_menus
|
|
361
|
+
setup_window
|
|
362
|
+
centralWidget.setEnabled( false )
|
|
363
|
+
end
|
|
364
|
+
|
|
365
|
+
def new
|
|
366
|
+
gallery = Gallery.new
|
|
367
|
+
if save_as( gallery )
|
|
368
|
+
@gallery = gallery
|
|
369
|
+
init_widgets
|
|
370
|
+
end
|
|
371
|
+
end
|
|
372
|
+
|
|
373
|
+
def open
|
|
374
|
+
openDialog = Qt::FileDialog.new( '.', 'Gallery files (*.gallery)', self, 'Open file...', true )
|
|
375
|
+
openDialog.setMode( Qt::FileDialog::ExistingFile )
|
|
376
|
+
open_file( openDialog.selectedFile ) if openDialog.exec == Qt::Dialog::Accepted
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
def open_file( file )
|
|
380
|
+
@curfile = file
|
|
381
|
+
@gallery = Gallery.new
|
|
382
|
+
@gallery.read_file( file )
|
|
383
|
+
init_widgets
|
|
384
|
+
end
|
|
385
|
+
|
|
386
|
+
def save
|
|
387
|
+
update_gallery
|
|
388
|
+
@gallery.write_file( @curfile )
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
def save_as( gallery = @gallery )
|
|
392
|
+
ret_val = false
|
|
393
|
+
saveDialog = Qt::FileDialog.new( '.', 'Gallery files (*.gallery)', self, 'Select new file...', true )
|
|
394
|
+
saveDialog.setMode( Qt::FileDialog::AnyFile )
|
|
395
|
+
if saveDialog.exec == Qt::Dialog::Accepted
|
|
396
|
+
fname = saveDialog.selectedFile
|
|
397
|
+
fname += '.gallery' if File.extname( fname ) == ''
|
|
398
|
+
gallery.write_file( fname )
|
|
399
|
+
@curfile = fname
|
|
400
|
+
ret_val = true
|
|
401
|
+
end
|
|
402
|
+
ret_val
|
|
403
|
+
end
|
|
404
|
+
|
|
405
|
+
def image_selected( name )
|
|
406
|
+
save_image_meta_info
|
|
407
|
+
@last_selected_image = name
|
|
408
|
+
|
|
409
|
+
if @gallery[name]
|
|
410
|
+
@imageTitle.setText( @gallery[name].delete( 'title' ) )
|
|
411
|
+
@imageDescription.setText( @gallery[name].delete( 'description' ) )
|
|
412
|
+
@picMetaTable.fill( @gallery[name] )
|
|
413
|
+
end
|
|
414
|
+
@image.set_image( File.join( @gallery.relpath, name ) )
|
|
415
|
+
end
|
|
416
|
+
|
|
417
|
+
def select_next_image
|
|
418
|
+
if @imageList.currentItem == @imageList.count - 1
|
|
419
|
+
@imageList.setCurrentItem( 0 ) if @imageList.count > 0
|
|
420
|
+
else
|
|
421
|
+
@imageList.setCurrentItem( @imageList.currentItem + 1 )
|
|
422
|
+
end
|
|
423
|
+
end
|
|
424
|
+
|
|
425
|
+
def assign_pic_names
|
|
426
|
+
0.upto( @imageList.count - 1 ) do |i|
|
|
427
|
+
@gallery[@imageList.text( i )] ||= {}
|
|
428
|
+
if @gallery[@imageList.text( i )]['title'].to_s.empty?
|
|
429
|
+
@gallery[@imageList.text( i )]['title'] = @imageList.text( i )
|
|
430
|
+
end
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
def save_image_meta_info
|
|
435
|
+
if @last_selected_image
|
|
436
|
+
@gallery[@last_selected_image] = @picMetaTable.meta_info
|
|
437
|
+
@gallery[@last_selected_image]['title'] = @imageTitle.text
|
|
438
|
+
@gallery[@last_selected_image]['description'] = @imageDescription.text
|
|
439
|
+
@last_selected_image = nil
|
|
440
|
+
end
|
|
441
|
+
end
|
|
442
|
+
|
|
443
|
+
#######
|
|
444
|
+
private
|
|
445
|
+
#######
|
|
446
|
+
|
|
447
|
+
def page_meta_items
|
|
448
|
+
['title', 'description', 'orderInfo', 'template', 'inMenu']
|
|
449
|
+
end
|
|
450
|
+
|
|
451
|
+
def gallery_items
|
|
452
|
+
['title', 'layout', 'files', 'imagesPerPage',
|
|
453
|
+
'imagePageInMenu', 'galleryPageInMenu', 'mainPageInMenu',
|
|
454
|
+
'imagePageTemplate', 'galleryPageTemplate', 'mainPageTemplate',
|
|
455
|
+
'galleryPages', 'mainPage', 'galleryOrderInfo', 'thumbnailSize' ]
|
|
456
|
+
end
|
|
457
|
+
|
|
458
|
+
def init_widgets
|
|
459
|
+
return if @gallery.nil?
|
|
460
|
+
|
|
461
|
+
gallery_items.each do |t|
|
|
462
|
+
case @widgets[t]
|
|
463
|
+
when Qt::LineEdit then @widgets[t].setText( @gallery[t] )
|
|
464
|
+
when Qt::SpinBox then @widgets[t].setValue( @gallery[t] )
|
|
465
|
+
when Qt::CheckBox then @widgets[t].setChecked( @gallery[t] )
|
|
466
|
+
when Qt::ComboBox then @widgets[t].setCurrentText( @gallery[t] )
|
|
467
|
+
when MetaDataTable then @widgets[t].fill( @gallery[t] ) if @gallery[t]
|
|
468
|
+
end
|
|
469
|
+
end
|
|
470
|
+
@picMetaTable.fill( [] )
|
|
471
|
+
init_image_list
|
|
472
|
+
@image.set_image
|
|
473
|
+
centralWidget.setEnabled( true )
|
|
474
|
+
end
|
|
475
|
+
|
|
476
|
+
def update_gallery
|
|
477
|
+
items = gallery_items
|
|
478
|
+
items.each do |t|
|
|
479
|
+
case @widgets[t]
|
|
480
|
+
when Qt::LineEdit then @gallery[t] = @widgets[t].text
|
|
481
|
+
when Qt::SpinBox then @gallery[t] = @widgets[t].value
|
|
482
|
+
when Qt::CheckBox then @gallery[t] = @widgets[t].checked?
|
|
483
|
+
when Qt::ComboBox then @gallery[t] = @widgets[t].currentText
|
|
484
|
+
when MetaDataTable then @gallery[t] = @widgets[t].meta_info
|
|
485
|
+
end
|
|
486
|
+
end
|
|
487
|
+
images = []
|
|
488
|
+
0.upto( @imageList.numRows ) {|i| images << @imageList.text( i ) }
|
|
489
|
+
|
|
490
|
+
save_image_meta_info
|
|
491
|
+
@gallery.meta.delete_if do |name, data|
|
|
492
|
+
!images.include?( name ) && !items.include?( name )
|
|
493
|
+
end
|
|
494
|
+
end
|
|
495
|
+
|
|
496
|
+
def init_image_list
|
|
497
|
+
@imageList.clear
|
|
498
|
+
images = Dir[File.join( @gallery.relpath, @widgets['files'].text)].collect {|i| i.sub( /#{@gallery.relpath + File::SEPARATOR}/, '' ) }
|
|
499
|
+
@imageList.fill_list( images )
|
|
500
|
+
@last_selected_image = nil
|
|
501
|
+
end
|
|
502
|
+
|
|
503
|
+
def setup_menus
|
|
504
|
+
filemenu = Qt::PopupMenu.new( self )
|
|
505
|
+
filemenu.insertItem( "&New...", self, SLOT("new()"), Qt::KeySequence.new( CTRL+Key_N ) )
|
|
506
|
+
filemenu.insertItem( "&Open...", self, SLOT("open()"), Qt::KeySequence.new( CTRL+Key_O ) )
|
|
507
|
+
filemenu.insertItem( "&Save", self, SLOT("save()"), Qt::KeySequence.new( CTRL+Key_S ) )
|
|
508
|
+
filemenu.insertItem( "&Save as...", self, SLOT("save_as()") )
|
|
509
|
+
filemenu.insertItem( "&Quit", $app, SLOT("quit()"), Qt::KeySequence.new( CTRL+Key_Q ) )
|
|
510
|
+
|
|
511
|
+
picmenu = Qt::PopupMenu.new( self )
|
|
512
|
+
picmenu.insertItem( "&Assign default names", self, SLOT("assign_pic_names()") )
|
|
513
|
+
|
|
514
|
+
menubar = Qt::MenuBar.new( self )
|
|
515
|
+
menubar.insertItem( "&File", filemenu )
|
|
516
|
+
menubar.insertItem( "&Images", picmenu )
|
|
517
|
+
end
|
|
518
|
+
|
|
519
|
+
def setup_window
|
|
520
|
+
mainFrame = Qt::Widget.new( self )
|
|
521
|
+
|
|
522
|
+
@widgets = {}
|
|
523
|
+
labels = {}
|
|
524
|
+
@widgets['title'] = Qt::LineEdit.new( mainFrame )
|
|
525
|
+
labels['title'] = [0, Qt::Label.new( @widgets['title'], "Gallery title:", mainFrame )]
|
|
526
|
+
|
|
527
|
+
@widgets['files'] = Qt::LineEdit.new( mainFrame )
|
|
528
|
+
connect( @widgets['files'], SIGNAL('textChanged(const QString&)'), self, SLOT('init_image_list()') )
|
|
529
|
+
labels['files'] = [1, Qt::Label.new( @widgets['files'], "File pattern:", mainFrame )]
|
|
530
|
+
|
|
531
|
+
@widgets['layout'] = Qt::ComboBox.new( true, mainFrame )
|
|
532
|
+
@widgets['layout'].setMaximumWidth( 200 )
|
|
533
|
+
Webgen::Plugin.config[GalleryLayouters::DefaultGalleryLayouter].layouts.keys.each do |name|
|
|
534
|
+
@widgets['layout'].insertItem( Qt::Pixmap.new( File.join( CorePlugins::Configuration.data_dir, 'gallery-creator', "#{name}.png" ) ), \
|
|
535
|
+
name )
|
|
536
|
+
end
|
|
537
|
+
@widgets['layout'].listBox.setMinimumWidth( @widgets['layout'].listBox.maxItemWidth + 20 )
|
|
538
|
+
labels['layout'] = [2, Qt::Label.new( @widgets['layout'], "Gallery layout:", mainFrame )]
|
|
539
|
+
|
|
540
|
+
@widgets['imagesPerPage'] = Qt::SpinBox.new( 0, 1000, 1, mainFrame )
|
|
541
|
+
labels['imagesPerPage'] = [3, Qt::Label.new( @widgets['imagesPerPage'], "Images per page:", mainFrame )]
|
|
542
|
+
|
|
543
|
+
@widgets['galleryOrderInfo'] = Qt::SpinBox.new( 0, 1000, 1, mainFrame )
|
|
544
|
+
labels['galleryOrderInfo'] = [4, Qt::Label.new( @widgets['galleryOrderInfo'], "Start <orderInfo> for gallery pages:", mainFrame )]
|
|
545
|
+
|
|
546
|
+
@widgets['thumbnailSize'] = Qt::LineEdit.new( mainFrame )
|
|
547
|
+
@widgets['thumbnailSize'].setValidator( Qt::RegExpValidator.new( Qt::RegExp.new( "\\d+x\\d+" ), mainFrame ) )
|
|
548
|
+
labels['thumbnailSize'] = [5, Qt::Label.new( @widgets['thumbnailSize'], "Thumbnail size:", mainFrame )]
|
|
549
|
+
|
|
550
|
+
@widgets['mainPageTemplate'] = Qt::LineEdit.new( mainFrame )
|
|
551
|
+
labels['mainPageTemplate'] = [6, Qt::Label.new( @widgets['mainPageTemplate'], "Template for main page:", mainFrame )]
|
|
552
|
+
|
|
553
|
+
@widgets['galleryPageTemplate'] = Qt::LineEdit.new( mainFrame )
|
|
554
|
+
labels['galleryPageTemplate'] = [7, Qt::Label.new( @widgets['galleryPageTemplate'], "Template for gallery pages:", mainFrame )]
|
|
555
|
+
|
|
556
|
+
@widgets['imagePageTemplate'] = Qt::LineEdit.new( mainFrame )
|
|
557
|
+
labels['imagePageTemplate'] = [8, Qt::Label.new( @widgets['imagePageTemplate'], "Template for image pages:", mainFrame )]
|
|
558
|
+
|
|
559
|
+
@widgets['mainPageInMenu'] = Qt::CheckBox.new( "Main page in menu?", mainFrame )
|
|
560
|
+
labels['mainPageInMenu'] = [9, nil]
|
|
561
|
+
|
|
562
|
+
@widgets['galleryPageInMenu'] = Qt::CheckBox.new( "Gallery pages in menu?", mainFrame )
|
|
563
|
+
labels['galleryPageInMenu'] = [10, nil]
|
|
564
|
+
|
|
565
|
+
@widgets['imagePageInMenu'] = Qt::CheckBox.new( "Image pages in menu?", mainFrame )
|
|
566
|
+
labels['imagePageInMenu'] = [11, nil]
|
|
567
|
+
|
|
568
|
+
layout = Qt::GridLayout.new( @widgets.length, 2 )
|
|
569
|
+
layout.setSpacing( 5 )
|
|
570
|
+
labels.each_with_index do |data, index|
|
|
571
|
+
layout.addWidget( data[1][1], data[1][0], 0 ) if data[1][1]
|
|
572
|
+
layout.addWidget( @widgets[data[0]], data[1][0], 1 )
|
|
573
|
+
end
|
|
574
|
+
|
|
575
|
+
leftLayout = Qt::VBoxLayout.new
|
|
576
|
+
leftLayout.setSpacing( 5 )
|
|
577
|
+
leftLayout.addLayout( layout )
|
|
578
|
+
leftLayout.addStretch
|
|
579
|
+
|
|
580
|
+
@widgets['mainPage'] = MetaDataTable.new( mainFrame, page_meta_items )
|
|
581
|
+
@widgets['mainPage'].setColumnWidth( 0, 150 )
|
|
582
|
+
@widgets['mainPage'].setColumnWidth( 1, 150 )
|
|
583
|
+
@widgets['mainPage'].setMinimumWidth( 350 )
|
|
584
|
+
@widgets['galleryPages'] = MetaDataTable.new( mainFrame, page_meta_items )
|
|
585
|
+
@widgets['galleryPages'].setColumnWidth( 0, 150 )
|
|
586
|
+
@widgets['galleryPages'].setColumnWidth( 1, 150 )
|
|
587
|
+
|
|
588
|
+
rightLayout = Qt::VBoxLayout.new
|
|
589
|
+
rightLayout.setSpacing( 5 )
|
|
590
|
+
rightLayout.addWidget( Qt::Label.new( 'Meta information for main page:', mainFrame ) )
|
|
591
|
+
rightLayout.addWidget( @widgets['mainPage'] )
|
|
592
|
+
rightLayout.addWidget( Qt::Label.new( 'Meta information for gallery pages:', mainFrame ) )
|
|
593
|
+
rightLayout.addWidget( @widgets['galleryPages'] )
|
|
594
|
+
|
|
595
|
+
galLayout = Qt::HBoxLayout.new
|
|
596
|
+
galLayout.setSpacing( 20 )
|
|
597
|
+
galLayout.addLayout( leftLayout )
|
|
598
|
+
galLayout.addLayout( rightLayout )
|
|
599
|
+
galLayout.setStretchFactor( rightLayout, 1 )
|
|
600
|
+
|
|
601
|
+
|
|
602
|
+
@image = ImageViewer.new( mainFrame )
|
|
603
|
+
@image.setSizePolicy( Qt::SizePolicy::Expanding, Qt::SizePolicy::Expanding )
|
|
604
|
+
@image.setMinimumSize( 320, 200 )
|
|
605
|
+
|
|
606
|
+
@imageTitle = Qt::LineEdit.new( mainFrame )
|
|
607
|
+
imageTitle = Qt::Label.new( @imageTitle, "Title:", mainFrame )
|
|
608
|
+
@imageDescription = MyTextEdit.new( mainFrame )
|
|
609
|
+
@imageDescription.setTextFormat( Qt::PlainText )
|
|
610
|
+
imageDescription = Qt::Label.new( @imageDescription, "Description:", mainFrame )
|
|
611
|
+
connect( @imageTitle, SIGNAL('returnPressed()'), @imageDescription, SLOT('setFocus()') )
|
|
612
|
+
connect( @imageDescription, SIGNAL('myReturnPressed()'), self, SLOT('select_next_image()') )
|
|
613
|
+
connect( @imageDescription, SIGNAL('myReturnPressed()'), @imageTitle, SLOT('setFocus()') )
|
|
614
|
+
|
|
615
|
+
@imageList = ImageFileList.new( mainFrame, self )
|
|
616
|
+
@imageList.setMaximumWidth( 300 )
|
|
617
|
+
connect( @imageList, SIGNAL('highlighted(const QString &)'), self, SLOT('image_selected( const QString &)') )
|
|
618
|
+
@picMetaTable = MetaDataTable.new( mainFrame, page_meta_items - ['title', 'description'], ['title', 'description'] )
|
|
619
|
+
@picMetaTable.setColumnWidth( 0, 100 )
|
|
620
|
+
@picMetaTable.setColumnWidth( 1, 100 )
|
|
621
|
+
@picMetaTable.setMaximumWidth( 300 )
|
|
622
|
+
|
|
623
|
+
imageLayout = Qt::GridLayout.new( 3, 3 )
|
|
624
|
+
imageLayout.setSpacing( 6 )
|
|
625
|
+
imageLayout.addWidget( @imageList, 0, 0 )
|
|
626
|
+
imageLayout.addMultiCellWidget( @picMetaTable, 1, 2, 0, 0 )
|
|
627
|
+
imageLayout.addMultiCellWidget( @image, 0, 0, 1, 2 )
|
|
628
|
+
imageLayout.addWidget( imageTitle, 1, 1 )
|
|
629
|
+
imageLayout.addWidget( @imageTitle, 1, 2 )
|
|
630
|
+
imageLayout.addWidget( imageDescription, 2, 1, Qt::AlignTop )
|
|
631
|
+
imageLayout.addWidget( @imageDescription, 2, 2 )
|
|
632
|
+
imageLayout.setRowStretch( 0, 1 )
|
|
633
|
+
|
|
634
|
+
mainLayout = Qt::VBoxLayout.new( mainFrame )
|
|
635
|
+
mainLayout.setMargin( 10 )
|
|
636
|
+
mainLayout.setSpacing( 20 )
|
|
637
|
+
mainLayout.addLayout( galLayout )
|
|
638
|
+
mainLayout.addLayout( imageLayout )
|
|
639
|
+
mainLayout.setStretchFactor( imageLayout, 1 )
|
|
640
|
+
|
|
641
|
+
setCentralWidget( mainFrame )
|
|
642
|
+
end
|
|
643
|
+
|
|
644
|
+
end
|
|
645
|
+
|
|
646
|
+
Webgen::Plugin['Configuration'].init_all
|
|
647
|
+
|
|
648
|
+
$app = Qt::Application.new( ARGV )
|
|
649
|
+
mainWindow = GalleryWindow.new
|
|
650
|
+
$app.setMainWidget( mainWindow )
|
|
651
|
+
mainWindow.show
|
|
652
|
+
mainWindow.open_file( ARGV[0] ) if ARGV.length > 0
|
|
653
|
+
$app.exec
|
|
654
|
+
|