webgen 0.3.6 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. data/ChangeLog +1523 -97
  2. data/Rakefile +11 -24
  3. data/TODO +22 -9
  4. data/VERSION +1 -1
  5. data/bin/webgen +2 -2
  6. data/bin/webgen-gallery-editor +654 -0
  7. data/bin/webgen-gui +10 -0
  8. data/data/webgen/data/ISO-639-2_values_8bits.txt +492 -0
  9. data/data/webgen/gallery-creator/default.png +0 -0
  10. data/data/webgen/icon_mapping.yaml +27 -0
  11. data/data/webgen/resources/emoticons/bigeyes/angry.png +0 -0
  12. data/data/webgen/resources/emoticons/bigeyes/cool.png +0 -0
  13. data/data/webgen/resources/emoticons/bigeyes/cry.png +0 -0
  14. data/data/webgen/resources/emoticons/bigeyes/drunk.png +0 -0
  15. data/data/webgen/resources/emoticons/bigeyes/lol.png +0 -0
  16. data/data/webgen/resources/emoticons/bigeyes/oops.png +0 -0
  17. data/data/webgen/resources/emoticons/bigeyes/sad.png +0 -0
  18. data/data/webgen/resources/emoticons/bigeyes/sleep.png +0 -0
  19. data/data/webgen/resources/emoticons/bigeyes/smile.png +0 -0
  20. data/data/webgen/resources/emoticons/bigeyes/tongue.png +0 -0
  21. data/data/webgen/resources/emoticons/bigeyes/wink.png +0 -0
  22. data/data/webgen/resources/emoticons/crystal/angry.png +0 -0
  23. data/data/webgen/resources/emoticons/crystal/cool.png +0 -0
  24. data/data/webgen/resources/emoticons/crystal/cry.png +0 -0
  25. data/data/webgen/resources/emoticons/crystal/drunk.png +0 -0
  26. data/data/webgen/resources/emoticons/crystal/lol.png +0 -0
  27. data/data/webgen/resources/emoticons/crystal/oops.png +0 -0
  28. data/data/webgen/resources/emoticons/crystal/sad.png +0 -0
  29. data/data/webgen/resources/emoticons/crystal/sleep.png +0 -0
  30. data/data/webgen/resources/emoticons/crystal/smile.png +0 -0
  31. data/data/webgen/resources/emoticons/crystal/tongue.png +0 -0
  32. data/data/webgen/resources/emoticons/crystal/wink.png +0 -0
  33. data/data/webgen/resources/emoticons/cyclops/angry.png +0 -0
  34. data/data/webgen/resources/emoticons/cyclops/cool.png +0 -0
  35. data/data/webgen/resources/emoticons/cyclops/cry.png +0 -0
  36. data/data/webgen/resources/emoticons/cyclops/drunk.png +0 -0
  37. data/data/webgen/resources/emoticons/cyclops/lol.png +0 -0
  38. data/data/webgen/resources/emoticons/cyclops/oops.png +0 -0
  39. data/data/webgen/resources/emoticons/cyclops/sad.png +0 -0
  40. data/data/webgen/resources/emoticons/cyclops/sleep.png +0 -0
  41. data/data/webgen/resources/emoticons/cyclops/smile.png +0 -0
  42. data/data/webgen/resources/emoticons/cyclops/tongue.png +0 -0
  43. data/data/webgen/resources/emoticons/cyclops/wink.png +0 -0
  44. data/data/webgen/resources/emoticons/glass/angry.png +0 -0
  45. data/data/webgen/resources/emoticons/glass/cool.png +0 -0
  46. data/data/webgen/resources/emoticons/glass/cry.png +0 -0
  47. data/data/webgen/resources/emoticons/glass/drunk.png +0 -0
  48. data/data/webgen/resources/emoticons/glass/lol.png +0 -0
  49. data/data/webgen/resources/emoticons/glass/oops.png +0 -0
  50. data/data/webgen/resources/emoticons/glass/sad.png +0 -0
  51. data/data/webgen/resources/emoticons/glass/sleep.png +0 -0
  52. data/data/webgen/resources/emoticons/glass/smile.png +0 -0
  53. data/data/webgen/resources/emoticons/glass/tongue.png +0 -0
  54. data/data/webgen/resources/emoticons/glass/wink.png +0 -0
  55. data/data/webgen/resources/emoticons/icqstyle/angry.png +0 -0
  56. data/data/webgen/resources/emoticons/icqstyle/cool.png +0 -0
  57. data/data/webgen/resources/emoticons/icqstyle/cry.png +0 -0
  58. data/data/webgen/resources/emoticons/icqstyle/drunk.png +0 -0
  59. data/data/webgen/resources/emoticons/icqstyle/lol.png +0 -0
  60. data/data/webgen/resources/emoticons/icqstyle/oops.png +0 -0
  61. data/data/webgen/resources/emoticons/icqstyle/sad.png +0 -0
  62. data/data/webgen/resources/emoticons/icqstyle/sleep.png +0 -0
  63. data/data/webgen/resources/emoticons/icqstyle/smile.png +0 -0
  64. data/data/webgen/resources/emoticons/icqstyle/tongue.png +0 -0
  65. data/data/webgen/resources/emoticons/icqstyle/wink.png +0 -0
  66. data/data/webgen/resources/emoticons/matrix/angry.gif +0 -0
  67. data/data/webgen/resources/emoticons/matrix/cool.gif +0 -0
  68. data/data/webgen/resources/emoticons/matrix/cry.gif +0 -0
  69. data/data/webgen/resources/emoticons/matrix/drunk.gif +0 -0
  70. data/data/webgen/resources/emoticons/matrix/lol.gif +0 -0
  71. data/data/webgen/resources/emoticons/matrix/oops.gif +0 -0
  72. data/data/webgen/resources/emoticons/matrix/sad.gif +0 -0
  73. data/data/webgen/resources/emoticons/matrix/sleep.gif +0 -0
  74. data/data/webgen/resources/emoticons/matrix/smile.gif +0 -0
  75. data/data/webgen/resources/emoticons/matrix/tongue.gif +0 -0
  76. data/data/webgen/resources/emoticons/matrix/wink.gif +0 -0
  77. data/data/webgen/resources/emoticons/smellies/angry.gif +0 -0
  78. data/data/webgen/resources/emoticons/smellies/cool.gif +0 -0
  79. data/data/webgen/resources/emoticons/smellies/cry.gif +0 -0
  80. data/data/webgen/resources/emoticons/smellies/drunk.gif +0 -0
  81. data/data/webgen/resources/emoticons/smellies/lol.gif +0 -0
  82. data/data/webgen/resources/emoticons/smellies/oops.gif +0 -0
  83. data/data/webgen/resources/emoticons/smellies/sad.gif +0 -0
  84. data/data/webgen/resources/emoticons/smellies/sleep.gif +0 -0
  85. data/data/webgen/resources/emoticons/smellies/smile.gif +0 -0
  86. data/data/webgen/resources/emoticons/smellies/tongue.gif +0 -0
  87. data/data/webgen/resources/emoticons/smellies/wink.gif +0 -0
  88. data/data/webgen/resources/icons/compressed.png +0 -0
  89. data/data/webgen/resources/icons/document.png +0 -0
  90. data/data/webgen/resources/icons/download.png +0 -0
  91. data/data/webgen/resources/icons/image.png +0 -0
  92. data/data/webgen/resources/icons/linux.png +0 -0
  93. data/data/webgen/resources/icons/mac.png +0 -0
  94. data/data/webgen/resources/icons/pdf.png +0 -0
  95. data/data/webgen/resources/icons/penguin.png +0 -0
  96. data/data/webgen/resources/icons/quicktime.png +0 -0
  97. data/data/webgen/resources/icons/real.png +0 -0
  98. data/data/webgen/resources/icons/rpm.png +0 -0
  99. data/data/webgen/resources/icons/sound.png +0 -0
  100. data/data/webgen/resources/icons/source.png +0 -0
  101. data/data/webgen/resources/icons/spreadsheet.png +0 -0
  102. data/data/webgen/resources/icons/text.png +0 -0
  103. data/data/webgen/resources/icons/vcard.png +0 -0
  104. data/data/webgen/resources/icons/video.png +0 -0
  105. data/data/webgen/resources/icons/win.png +0 -0
  106. data/data/webgen/{images → resources/images}/generated_by_webgen.png +0 -0
  107. data/data/webgen/{images → resources/images}/valid-css.gif +0 -0
  108. data/data/webgen/{images → resources/images}/valid-xhtml11.png +0 -0
  109. data/data/webgen/{images → resources/images}/webgen_logo.png +0 -0
  110. data/data/webgen/{example/src → website_styles/default}/default.css +0 -0
  111. data/data/webgen/{example/src → website_styles/default}/default.template +2 -2
  112. data/data/webgen/website_templates/default/README +6 -0
  113. data/data/webgen/{example → website_templates/default}/config.yaml +0 -0
  114. data/data/webgen/{example → website_templates/default}/src/index.page +0 -0
  115. data/data/webgen/website_templates/personal_hp/README +6 -0
  116. data/data/webgen/website_templates/personal_hp/src/about.page +12 -0
  117. data/data/webgen/website_templates/personal_hp/src/index.page +9 -0
  118. data/data/webgen/website_templates/personal_hp/src/links.page +22 -0
  119. data/data/webgen/website_templates/personal_hp/src/projects.page +20 -0
  120. data/data/webgen/website_templates/project/README +7 -0
  121. data/data/webgen/website_templates/project/src/about.page +12 -0
  122. data/data/webgen/website_templates/project/src/download.page +15 -0
  123. data/data/webgen/website_templates/project/src/features.page +8 -0
  124. data/data/webgen/website_templates/project/src/index.page +9 -0
  125. data/data/webgen/website_templates/project/src/screenshots.page +18 -0
  126. data/doc/config.yaml +3 -0
  127. data/doc/plugin/clidesc.rb +18 -7
  128. data/doc/plugin/emoticon.rb +29 -0
  129. data/doc/plugin/extension.rb +15 -16
  130. data/doc/plugin/listpluginparameters.rb +39 -0
  131. data/doc/plugin/resources.rb +4 -4
  132. data/doc/plugin/source.rb +21 -0
  133. data/doc/src/default.css +7 -4
  134. data/doc/src/default.template +4 -2
  135. data/doc/src/documentation/cli.page +1 -1
  136. data/doc/src/documentation/extending_webgen.page +102 -0
  137. data/doc/src/documentation/gettingstarted.page +3 -6
  138. data/doc/src/documentation/index.page +1 -1
  139. data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/html.page +0 -0
  140. data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/index.page +0 -0
  141. data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/markdown.page +0 -0
  142. data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/rdoc.page +0 -0
  143. data/doc/src/documentation/plugins/{contenthandler → contenthandlers}/textile.page +0 -0
  144. data/doc/src/documentation/plugins/{system → coreplugins}/configuration.page +0 -0
  145. data/doc/src/documentation/plugins/coreplugins/index.page +7 -0
  146. data/doc/src/documentation/plugins/{system → coreplugins}/logging.page +0 -0
  147. data/doc/src/documentation/plugins/{resourcemanager.page → coreplugins/resourcemanager.page} +5 -1
  148. data/doc/src/documentation/plugins/{filehandler → filehandlers}/backing.page +1 -1
  149. data/doc/src/documentation/plugins/{filehandler → filehandlers}/copy.page +1 -1
  150. data/doc/src/documentation/plugins/{filehandler/directory.page → filehandlers/directoryhandler.page} +11 -2
  151. data/doc/src/documentation/plugins/{filehandler/galleryhandler.page → filehandlers/gallery.page} +20 -13
  152. data/doc/src/documentation/plugins/{filehandler → filehandlers}/index.page +0 -0
  153. data/doc/src/documentation/plugins/{filehandler/pagehandler.page → filehandlers/page.page} +6 -4
  154. data/doc/src/documentation/plugins/{filehandler → filehandlers}/template.page +0 -0
  155. data/doc/src/documentation/plugins/{gallerylayouter → gallerylayouters}/index.page +7 -3
  156. data/doc/src/documentation/plugins/{htmlvalidator → htmlvalidators}/index.page +0 -0
  157. data/doc/src/documentation/plugins/{htmlvalidator → htmlvalidators}/xmllint.page +0 -0
  158. data/doc/src/documentation/plugins/index.page +4 -0
  159. data/doc/src/documentation/plugins/menustyles/{horizontal-dropdown.page → horizontaldropdown.page} +0 -0
  160. data/doc/src/documentation/plugins/menustyles/{vertical-dropdown.page → verticaldropdown.page} +1 -1
  161. data/doc/src/documentation/plugins/miscplugins/index.page +7 -0
  162. data/doc/src/documentation/plugins/miscplugins/smileyreplacer.page +38 -0
  163. data/doc/src/documentation/plugins/tags/breadcrumbtrail.page +20 -0
  164. data/doc/src/documentation/plugins/tags/download.page +23 -0
  165. data/doc/src/documentation/plugins/tags/resource.page +1 -1
  166. data/doc/src/documentation/plugins/tags/sitemap.page +1 -2
  167. data/doc/src/documentation/references/index.page +8 -0
  168. data/doc/src/documentation/{meta_info_reference.page → references/meta_info_reference.page} +1 -0
  169. data/doc/src/documentation/references/parameter_reference.page +12 -0
  170. data/doc/src/documentation/webgen_gallery_editor.page +82 -0
  171. data/doc/src/download.page +2 -2
  172. data/doc/src/features.page +3 -2
  173. data/doc/src/images/screenshots/wge-image.png +0 -0
  174. data/doc/src/images/screenshots/wge-layout-preview.png +0 -0
  175. data/doc/src/images/screenshots/wge-main-disabled.png +0 -0
  176. data/doc/src/images/screenshots/wge-main.png +0 -0
  177. data/doc/src/index.page +30 -11
  178. data/doc/src/meta.info +7 -7
  179. data/doc/src/screenshots.gallery +33 -0
  180. data/install.rb +1 -1
  181. data/lib/webgen.rb +275 -0
  182. data/lib/webgen/composite.rb +1 -1
  183. data/lib/webgen/gui/common.rb +38 -0
  184. data/lib/webgen/gui/main.rb +219 -0
  185. data/lib/webgen/gui/new_website_dlg.rb +125 -0
  186. data/lib/webgen/listener.rb +1 -1
  187. data/lib/webgen/node.rb +4 -2
  188. data/lib/webgen/plugin.rb +167 -100
  189. data/lib/webgen/plugins/{contenthandler/defaultcontenthandler.rb → contenthandlers/default.rb} +1 -1
  190. data/lib/webgen/plugins/{contenthandler → contenthandlers}/html.rb +2 -2
  191. data/lib/webgen/plugins/{contenthandler → contenthandlers}/markdown.rb +2 -2
  192. data/lib/webgen/plugins/{contenthandler → contenthandlers}/rdoc.rb +2 -2
  193. data/lib/webgen/plugins/{contenthandler → contenthandlers}/textile.rb +2 -2
  194. data/lib/webgen/{configuration.rb → plugins/coreplugins/configuration.rb} +34 -14
  195. data/lib/webgen/{logging.rb → plugins/coreplugins/logging.rb} +4 -4
  196. data/lib/webgen/plugins/{resourcemanager.rb → coreplugins/resourcemanager.rb} +44 -22
  197. data/lib/webgen/plugins/{filehandler → filehandlers}/backing.rb +11 -11
  198. data/lib/webgen/plugins/{filehandler/filecopy.rb → filehandlers/copy.rb} +3 -3
  199. data/lib/webgen/plugins/{filehandler → filehandlers}/directory.rb +15 -10
  200. data/lib/webgen/plugins/{filehandler → filehandlers}/filehandler.rb +9 -7
  201. data/lib/webgen/plugins/{filehandler/picturegallery.rb → filehandlers/gallery.rb} +35 -28
  202. data/lib/webgen/plugins/{filehandler → filehandlers}/page.rb +30 -15
  203. data/lib/webgen/plugins/{filehandler → filehandlers}/template.rb +3 -3
  204. data/lib/webgen/plugins/{gallerylayouter/defaultgallerylayouter.rb → gallerylayouters/default.rb} +11 -11
  205. data/lib/webgen/plugins/{htmlvalidator/defaulthtmlvalidator.rb → htmlvalidators/default.rb} +1 -1
  206. data/lib/webgen/plugins/{htmlvalidator → htmlvalidators}/xmllint.rb +2 -2
  207. data/lib/webgen/plugins/menustyles/{defaultmenustyle.rb → default.rb} +2 -2
  208. data/lib/webgen/plugins/menustyles/horizontal.rb +2 -2
  209. data/lib/webgen/plugins/menustyles/horizontal_dropdown.rb +2 -2
  210. data/lib/webgen/plugins/menustyles/partial.rb +2 -2
  211. data/lib/webgen/plugins/menustyles/vertical.rb +2 -2
  212. data/lib/webgen/plugins/menustyles/vertical_dropdown.rb +2 -2
  213. data/lib/webgen/plugins/miscplugins/smileyreplacer.rb +84 -0
  214. data/lib/webgen/plugins/{treewalker.rb → miscplugins/treewalker.rb} +1 -1
  215. data/lib/webgen/plugins/tags/{navbar.rb → breadcrumbtrail.rb} +5 -9
  216. data/lib/webgen/plugins/tags/date.rb +2 -6
  217. data/lib/webgen/plugins/tags/download.rb +155 -0
  218. data/lib/webgen/plugins/tags/executecommand.rb +2 -6
  219. data/lib/webgen/plugins/tags/includefile.rb +4 -8
  220. data/lib/webgen/plugins/tags/langbar.rb +2 -6
  221. data/lib/webgen/plugins/tags/menu.rb +2 -7
  222. data/lib/webgen/plugins/tags/meta.rb +2 -6
  223. data/lib/webgen/plugins/tags/relocatable.rb +2 -6
  224. data/lib/webgen/plugins/tags/sitemap.rb +14 -10
  225. data/lib/webgen/plugins/tags/tags.rb +25 -18
  226. data/lib/webgen/plugins/tags/wikilink.rb +2 -6
  227. metadata +311 -195
  228. data/doc/src/design.gallery +0 -18
  229. data/doc/src/designs/curdesign.png +0 -0
  230. data/doc/src/designs/nostyle.png +0 -0
  231. data/doc/src/designs/old.png +0 -0
  232. data/doc/src/documentation/plugins/gallerylayouter/defaultlayouter.page +0 -12
  233. data/doc/src/documentation/plugins/system/index.page +0 -7
  234. data/doc/src/documentation/plugins/tags/navbar.page +0 -20
  235. data/lib/webgen/webgen.rb +0 -271
  236. data/testsite/config.yaml +0 -7
  237. data/testsite/src/bghack.png +0 -0
  238. data/testsite/src/bluecloth.page +0 -102
  239. data/testsite/src/default.css +0 -146
  240. data/testsite/src/default.template +0 -33
  241. data/testsite/src/home.en.page +0 -22
  242. data/testsite/src/home.page +0 -22
  243. data/testsite/src/images/bghack.png +0 -0
  244. data/testsite/src/index.page +0 -21
  245. data/testsite/src/meta.info +0 -12
  246. data/testsite/src/news.page +0 -20
  247. data/testsite/src/news_are_so-cool.de.page +0 -19
  248. data/testsite/src/noindex/noindex.page +0 -20
  249. data/testsite/src/pictures/index.page +0 -20
  250. data/testsite/src/projects.de.page +0 -11
  251. data/testsite/src/projects.es.page +0 -11
  252. data/testsite/src/projects.page +0 -17
  253. data/testsite/src/projects/00.index.de.page +0 -10
  254. data/testsite/src/projects/01.project2.page +0 -20
  255. data/testsite/src/projects/02.project1.page +0 -20
  256. data/testsite/src/projects/05.project3.page +0 -22
  257. data/testsite/src/projects/index.page +0 -20
  258. data/testsite/src/projects/subproj/index.page +0 -22
  259. data/testsite/src/projects/subproj/project3.page +0 -21
  260. data/testsite/src/rdoc.page +0 -12
  261. data/testsite/src/redcloth.page +0 -106
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
+