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
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', '~> 1.0.3' )
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
- * simplify menu style plugins
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
- * DEV: self.logger.warn/error/info/debug can be used for messages
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.6
1
+ 0.3.7
data/bin/webgen CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'webgen/webgen'
3
+ require 'webgen'
4
4
 
5
- Webgen::WebgenMain.new.main( ARGV )
5
+ Webgen::cli_main
@@ -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
+