gf-ralbum 0.0.2

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 (187) hide show
  1. data/LICENSE +20 -0
  2. data/README.rdoc +80 -0
  3. data/bin/ralbum-JPG2jpg.rb +90 -0
  4. data/bin/ralbum-compile_skins.rb +18 -0
  5. data/bin/ralbum-myconv.rb +81 -0
  6. data/bin/ralbum-readexif.rb +18 -0
  7. data/bin/ralbum-reorder.rb +200 -0
  8. data/bin/ralbum.rb +12 -0
  9. data/example/README.txt +8 -0
  10. data/example/example.sh +3 -0
  11. data/example/httpd.rb +35 -0
  12. data/example/test_phototree/album.xml +21 -0
  13. data/example/test_phototree/catalog_data/md5_to_key.yaml +4 -0
  14. data/example/test_phototree/catalog_data/md5_to_key.yaml.test +4 -0
  15. data/example/test_phototree/catalog_data/project.xml +329 -0
  16. data/example/test_phototree/r_photo01.jpg +0 -0
  17. data/example/test_phototree/r_photo01.jpg.xml +17 -0
  18. data/example/test_phototree/subalbum01/album.xml +21 -0
  19. data/example/test_phototree/subalbum01/subalbum01_photo01.jpg +0 -0
  20. data/example/test_phototree/subalbum01/subalbum01_photo01.jpg.xml +15 -0
  21. data/example/test_phototree/subalbum01/subalbum01_photo02.jpg +0 -0
  22. data/example/test_phototree/subalbum01/subalbum01_photo02.jpg.xml +15 -0
  23. data/example/test_phototree/subalbum01/subalbum01_photo03.jpg +0 -0
  24. data/example/test_phototree/subalbum01/subalbum01_photo03.jpg.xml +15 -0
  25. data/example/test_phototree/subalbum01/subalbum01_photo04.jpg +0 -0
  26. data/example/test_phototree/subalbum01/subalbum01_photo04.jpg.xml +15 -0
  27. data/example/test_phototree/subalbum02/album.xml +10 -0
  28. data/example/test_phototree/subalbum02/subalbum02_photo01.jpg +0 -0
  29. data/example/test_phototree/subalbum02/subalbum02_photo01.jpg.xml +15 -0
  30. data/example/test_phototree/subalbum02/subalbum02_photo02.jpg +0 -0
  31. data/example/test_phototree/subalbum02/subalbum02_photo02.jpg.xml +15 -0
  32. data/example/test_phototree/subalbum02/subalbum02_photo03.jpg +0 -0
  33. data/example/test_phototree/subalbum02/subalbum02_photo03.jpg.xml +15 -0
  34. data/example/test_phototree/subalbum02/subalbum02_photo04.jpg +0 -0
  35. data/example/test_phototree/subalbum02/subalbum02_photo04.jpg.xml +15 -0
  36. data/example/test_phototree/subalbum02/subalbum02_photo05.jpg +0 -0
  37. data/example/test_phototree/subalbum02/subalbum02_photo05.jpg.xml +15 -0
  38. data/lib/ralbum-common/object_with_properties.rb +14 -0
  39. data/lib/ralbum-common/object_with_validation.rb +50 -0
  40. data/lib/ralbum.rb +19 -0
  41. data/lib/ralbum/album.rb +66 -0
  42. data/lib/ralbum/catalog.rb +178 -0
  43. data/lib/ralbum/cli/cli_ralbum.rb +116 -0
  44. data/lib/ralbum/generate_album_tree_node_visitor.rb +60 -0
  45. data/lib/ralbum/image_file.rb +81 -0
  46. data/lib/ralbum/image_pool.rb +71 -0
  47. data/lib/ralbum/image_strategy.rb +143 -0
  48. data/lib/ralbum/options.rb +15 -0
  49. data/lib/ralbum/photo_tree_builder.rb +165 -0
  50. data/lib/ralbum/photo_tree_item.rb +89 -0
  51. data/lib/ralbum/photo_tree_node.rb +40 -0
  52. data/lib/ralbum/project.rb +89 -0
  53. data/lib/ralbum/ralbum_exception.rb +2 -0
  54. data/lib/ralbum/resource.rb +17 -0
  55. data/lib/ralbum/skin.rb +76 -0
  56. data/lib/ralbum/skin_engine.rb +98 -0
  57. data/lib/ralbum/skin_engines/erb_skin_engine.rb +35 -0
  58. data/lib/ralbum/skin_engines/kwartz_skin_engine.rb +54 -0
  59. data/lib/ralbum/skin_manager.rb +46 -0
  60. data/lib/ralbum/skins/cgi/cgi_skin.rb +27 -0
  61. data/lib/ralbum/skins/cgi/info.yml +3 -0
  62. data/lib/ralbum/skins/cgi/res/model.rb +235 -0
  63. data/lib/ralbum/skins/cgi/res/resource.rb +17 -0
  64. data/lib/ralbum/skins/gfold/inc/menu_bottom.html +53 -0
  65. data/lib/ralbum/skins/gfold/inc/menu_top.html +71 -0
  66. data/lib/ralbum/skins/gfold/inc/page_footer.html +28 -0
  67. data/lib/ralbum/skins/gfold/info.yml +3 -0
  68. data/lib/ralbum/skins/gfold/out/album_page.rb +316 -0
  69. data/lib/ralbum/skins/gfold/out/image_page.rb +231 -0
  70. data/lib/ralbum/skins/gfold/out/tree_page.rb +96 -0
  71. data/lib/ralbum/skins/gfold/res/16-arrow-down.png +0 -0
  72. data/lib/ralbum/skins/gfold/res/16-arrow-left.png +0 -0
  73. data/lib/ralbum/skins/gfold/res/16-arrow-right.png +0 -0
  74. data/lib/ralbum/skins/gfold/res/16-arrow-up.png +0 -0
  75. data/lib/ralbum/skins/gfold/res/left.gif +0 -0
  76. data/lib/ralbum/skins/gfold/res/prototype.js +3277 -0
  77. data/lib/ralbum/skins/gfold/res/right.gif +0 -0
  78. data/lib/ralbum/skins/gfold/res/style1.css +453 -0
  79. data/lib/ralbum/skins/gfold/res/style2.css +414 -0
  80. data/lib/ralbum/skins/gfold/res/styleswitcher.js +89 -0
  81. data/lib/ralbum/skins/gfold/res/top.gif +0 -0
  82. data/lib/ralbum/skins/gfold/res/up.gif +0 -0
  83. data/lib/ralbum/skins/gfold/res/valid-css.png +0 -0
  84. data/lib/ralbum/skins/gfold/res/valid-xhtml.png +0 -0
  85. data/lib/ralbum/skins/gfold/res/valid-xhtml11.png +0 -0
  86. data/lib/ralbum/skins/gfold/res/vcss.gif +0 -0
  87. data/lib/ralbum/skins/gfold/template/album_page.html +161 -0
  88. data/lib/ralbum/skins/gfold/template/album_page.plogic +127 -0
  89. data/lib/ralbum/skins/gfold/template/image_page.html +91 -0
  90. data/lib/ralbum/skins/gfold/template/image_page.plogic +70 -0
  91. data/lib/ralbum/skins/gfold/template/tree_page.html +79 -0
  92. data/lib/ralbum/skins/gfold/template/tree_page.plogic +45 -0
  93. data/lib/ralbum/skins/js/info.yml +3 -0
  94. data/lib/ralbum/skins/js/js_skin.rb +50 -0
  95. data/lib/ralbum/skins/js/out/album_page.rb +181 -0
  96. data/lib/ralbum/skins/js/out/slideshow_page.rb +187 -0
  97. data/lib/ralbum/skins/js/out/tree_page.rb +134 -0
  98. data/lib/ralbum/skins/js/res/left.gif +0 -0
  99. data/lib/ralbum/skins/js/res/right.gif +0 -0
  100. data/lib/ralbum/skins/js/res/style.css +76 -0
  101. data/lib/ralbum/skins/js/res/top.gif +0 -0
  102. data/lib/ralbum/skins/js/res/up.gif +0 -0
  103. data/lib/ralbum/skins/js/template/album_page.html +178 -0
  104. data/lib/ralbum/skins/js/template/album_page.plogic +88 -0
  105. data/lib/ralbum/skins/js/template/slideshow_page.html +169 -0
  106. data/lib/ralbum/skins/js/template/slideshow_page.plogic +1 -0
  107. data/lib/ralbum/skins/js/template/tree_page.html +118 -0
  108. data/lib/ralbum/skins/js/template/tree_page.plogic +43 -0
  109. data/lib/ralbum/skins/test_erb/info.yml +3 -0
  110. data/lib/ralbum/skins/test_erb/out/album_page.rb +54 -0
  111. data/lib/ralbum/skins/test_erb/out/image_page.rb +54 -0
  112. data/lib/ralbum/skins/test_kwartz/info.yml +3 -0
  113. data/lib/ralbum/skins/test_kwartz/out/album_page.rb +54 -0
  114. data/lib/ralbum/skins/test_kwartz/out/image_page.rb +54 -0
  115. data/lib/ralbum/skins/test_kwartz/template/album_page.html +37 -0
  116. data/lib/ralbum/skins/test_kwartz/template/image_page.html +37 -0
  117. data/test/ralbum/cli/test_cli_ralbum.rb +13 -0
  118. data/test/ralbum/tc_01_photo_tree.rb +37 -0
  119. data/test/ralbum/tc_02_photo_tree_builder.rb +20 -0
  120. data/test/ralbum/tc_03_album.rb +42 -0
  121. data/test/ralbum/tc_04_skin_manager.rb +30 -0
  122. data/test/ralbum/tc_05_kwartz_skin_engine.rb +50 -0
  123. data/test/ralbum/tc_06_image_strategy.rb +21 -0
  124. data/test/ralbum/tc_catalog.rb +31 -0
  125. data/test/ralbum/test_helper.rb +13 -0
  126. data/test/test_ralbum.rb +14 -0
  127. data/test_data/ralbum/test_data/albums_directory/gfold/album_1/img_0004.jpg.html +148 -0
  128. data/test_data/ralbum/test_data/albums_directory/gfold/album_1/img_0005.jpg.html +152 -0
  129. data/test_data/ralbum/test_data/albums_directory/gfold/album_1/img_0006.jpg.html +152 -0
  130. data/test_data/ralbum/test_data/albums_directory/gfold/album_1/img_0007.jpg.html +148 -0
  131. data/test_data/ralbum/test_data/albums_directory/gfold/album_1/index.html +195 -0
  132. data/test_data/ralbum/test_data/albums_directory/gfold/album_2/img_0008.jpg.html +148 -0
  133. data/test_data/ralbum/test_data/albums_directory/gfold/album_2/img_0009.jpg.html +152 -0
  134. data/test_data/ralbum/test_data/albums_directory/gfold/album_2/img_0010.jpg.html +152 -0
  135. data/test_data/ralbum/test_data/albums_directory/gfold/album_2/img_0011.jpg.html +152 -0
  136. data/test_data/ralbum/test_data/albums_directory/gfold/album_2/img_0012.jpg.html +148 -0
  137. data/test_data/ralbum/test_data/albums_directory/gfold/album_2/index.html +206 -0
  138. data/test_data/ralbum/test_data/albums_directory/gfold/img_0003.jpg.html +141 -0
  139. data/test_data/ralbum/test_data/albums_directory/gfold/index.html +208 -0
  140. data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0003.jpg +0 -0
  141. data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0004.jpg +0 -0
  142. data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0005.jpg +0 -0
  143. data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0006.jpg +0 -0
  144. data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0007.jpg +0 -0
  145. data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0008.jpg +0 -0
  146. data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0009.jpg +0 -0
  147. data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0010.jpg +0 -0
  148. data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0011.jpg +0 -0
  149. data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0012.jpg +0 -0
  150. data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0003.jpg +0 -0
  151. data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0004.jpg +0 -0
  152. data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0005.jpg +0 -0
  153. data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0006.jpg +0 -0
  154. data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0007.jpg +0 -0
  155. data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0008.jpg +0 -0
  156. data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0009.jpg +0 -0
  157. data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0010.jpg +0 -0
  158. data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0011.jpg +0 -0
  159. data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0012.jpg +0 -0
  160. data/test_data/ralbum/test_data/albums_directory/res/left.gif +0 -0
  161. data/test_data/ralbum/test_data/albums_directory/res/prototype.js +3277 -0
  162. data/test_data/ralbum/test_data/albums_directory/res/right.gif +0 -0
  163. data/test_data/ralbum/test_data/albums_directory/res/style1.css +453 -0
  164. data/test_data/ralbum/test_data/albums_directory/res/style2.css +414 -0
  165. data/test_data/ralbum/test_data/albums_directory/res/styleswitcher.js +89 -0
  166. data/test_data/ralbum/test_data/albums_directory/res/top.gif +0 -0
  167. data/test_data/ralbum/test_data/albums_directory/res/up.gif +0 -0
  168. data/test_data/ralbum/test_data/albums_directory/res/valid-css.png +0 -0
  169. data/test_data/ralbum/test_data/albums_directory/res/valid-xhtml.png +0 -0
  170. data/test_data/ralbum/test_data/albums_directory/res/valid-xhtml11.png +0 -0
  171. data/test_data/ralbum/test_data/albums_directory/res/vcss.gif +0 -0
  172. data/test_data/ralbum/test_data/albums_directory/test/album_1/img_0004.jpg.html +11 -0
  173. data/test_data/ralbum/test_data/albums_directory/test/album_1/img_0005.jpg.html +11 -0
  174. data/test_data/ralbum/test_data/albums_directory/test/album_1/img_0006.jpg.html +11 -0
  175. data/test_data/ralbum/test_data/albums_directory/test/album_1/img_0007.jpg.html +11 -0
  176. data/test_data/ralbum/test_data/albums_directory/test/album_1/index.html +13 -0
  177. data/test_data/ralbum/test_data/albums_directory/test/album_2/img_0008.jpg.html +11 -0
  178. data/test_data/ralbum/test_data/albums_directory/test/album_2/img_0009.jpg.html +11 -0
  179. data/test_data/ralbum/test_data/albums_directory/test/album_2/img_0010.jpg.html +11 -0
  180. data/test_data/ralbum/test_data/albums_directory/test/album_2/img_0011.jpg.html +11 -0
  181. data/test_data/ralbum/test_data/albums_directory/test/album_2/img_0012.jpg.html +11 -0
  182. data/test_data/ralbum/test_data/albums_directory/test/album_2/index.html +13 -0
  183. data/test_data/ralbum/test_data/albums_directory/test/img_0003.jpg.html +11 -0
  184. data/test_data/ralbum/test_data/albums_directory/test/index.html +13 -0
  185. data/test_data/ralbum/test_data/is_test/r_photo01_scaled.jpg +0 -0
  186. data/test_data/ralbum/test_data/is_test/r_photo01_sepia_scaled.jpg +0 -0
  187. metadata +276 -0
@@ -0,0 +1,21 @@
1
+ <?xml version='1.0'?>
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
10
+
11
+
12
+
13
+
14
+ <album>
15
+ <title>album_1</title>
16
+ <thumbnail/>
17
+ <shortdesc/>
18
+ <longdesc/>
19
+ <date/>
20
+ <order/>
21
+ </album>
@@ -0,0 +1,15 @@
1
+ <?xml version='1.0'?>
2
+ <photo>
3
+ <title>titolo deathvalley_0046</title>
4
+ <description>description deathvalley_0046</description>
5
+ <date>Thu Jan 27 03:02:00 +0100 2005</date>
6
+ <exif>
7
+ <model/>
8
+ <date_and_time/>
9
+ <exposure_time/>
10
+ <white_balance/>
11
+ <metering_mode/>
12
+ <iso_speed/>
13
+ <FocalLength/>
14
+ </exif>
15
+ </photo>
@@ -0,0 +1,15 @@
1
+ <?xml version='1.0'?>
2
+ <photo>
3
+ <title>titolo deathvalley_0083</title>
4
+ <description>description deathvalley_0083</description>
5
+ <date>Thu Jan 27 03:02:00 +0100 2005</date>
6
+ <exif>
7
+ <model/>
8
+ <date_and_time/>
9
+ <exposure_time/>
10
+ <white_balance/>
11
+ <metering_mode/>
12
+ <iso_speed/>
13
+ <FocalLength/>
14
+ </exif>
15
+ </photo>
@@ -0,0 +1,15 @@
1
+ <?xml version='1.0'?>
2
+ <photo>
3
+ <title>titolo MntWhitney_0019</title>
4
+ <description>description MntWhitney_0019</description>
5
+ <date>Thu Jan 27 03:02:00 +0100 2005</date>
6
+ <exif>
7
+ <model>unknown</model>
8
+ <date_and_time>unknown</date_and_time>
9
+ <exposure_time>unknown</exposure_time>
10
+ <white_balance>unknown</white_balance>
11
+ <metering_mode/>
12
+ <iso_speed>unknown</iso_speed>
13
+ <FocalLength>unknown</FocalLength>
14
+ </exif>
15
+ </photo>
@@ -0,0 +1,15 @@
1
+ <?xml version='1.0'?>
2
+ <photo>
3
+ <title>titolo zion_0177</title>
4
+ <description>description zion_0177</description>
5
+ <date>Thu Jan 27 03:02:00 +0100 2005</date>
6
+ <exif>
7
+ <model>Canon PowerShot G5.</model>
8
+ <date_and_time>2003:11:30 00:21:46.</date_and_time>
9
+ <exposure_time>1/10</exposure_time>
10
+ <white_balance>0</white_balance>
11
+ <metering_mode/>
12
+ <iso_speed>unknown</iso_speed>
13
+ <FocalLength>unknown</FocalLength>
14
+ </exif>
15
+ </photo>
@@ -0,0 +1,10 @@
1
+ <?xml version='1.0'?>
2
+
3
+ <album>
4
+ <title>album_2</title>
5
+ <thumbnail/>
6
+ <shortdesc>descrizione corta</shortdesc>
7
+ <longdesc>descrizione lunga</longdesc>
8
+ <date/>
9
+ <order/>
10
+ </album>
@@ -0,0 +1,15 @@
1
+ <?xml version='1.0'?>
2
+ <photo>
3
+ <title>titolo capitolreef_0030</title>
4
+ <description>description capitolreef_0030</description>
5
+ <date>Thu Jan 27 03:02:00 +0100 2005</date>
6
+ <exif>
7
+ <model>Canon PowerShot S500.</model>
8
+ <date_and_time>2004:04:11 07:00:29.</date_and_time>
9
+ <exposure_time>1/50</exposure_time>
10
+ <white_balance>0</white_balance>
11
+ <metering_mode/>
12
+ <iso_speed>unknown</iso_speed>
13
+ <FocalLength>unknown</FocalLength>
14
+ </exif>
15
+ </photo>
@@ -0,0 +1,15 @@
1
+ <?xml version='1.0'?>
2
+ <photo>
3
+ <title>titolo CrystalCove11_0031</title>
4
+ <description>description CrystalCove11_0031</description>
5
+ <date>Thu Jan 27 03:02:00 +0100 2005</date>
6
+ <exif>
7
+ <model/>
8
+ <date_and_time/>
9
+ <exposure_time/>
10
+ <white_balance/>
11
+ <metering_mode/>
12
+ <iso_speed/>
13
+ <FocalLength/>
14
+ </exif>
15
+ </photo>
@@ -0,0 +1,15 @@
1
+ <?xml version='1.0'?>
2
+ <photo>
3
+ <title>titolo CrystalCove9_0013</title>
4
+ <description>description CrystalCove9_0013</description>
5
+ <date>Thu Jan 27 03:02:00 +0100 2005</date>
6
+ <exif>
7
+ <model/>
8
+ <date_and_time/>
9
+ <exposure_time/>
10
+ <white_balance/>
11
+ <metering_mode/>
12
+ <iso_speed/>
13
+ <FocalLength/>
14
+ </exif>
15
+ </photo>
@@ -0,0 +1,15 @@
1
+ <?xml version='1.0'?>
2
+ <photo>
3
+ <title>titolo Ninfee.jpg</title>
4
+ <description>descrizione Ninfee.jpg</description>
5
+ <date>Thu Aug 19 14:00:00 +0200 2004</date>
6
+ <exif>
7
+ <model/>
8
+ <date_and_time/>
9
+ <exposure_time/>
10
+ <white_balance/>
11
+ <metering_mode/>
12
+ <iso_speed/>
13
+ <FocalLength/>
14
+ </exif>
15
+ </photo>
@@ -0,0 +1,15 @@
1
+ <?xml version='1.0'?>
2
+ <photo>
3
+ <title>titolo Tramonto.jpg</title>
4
+ <description>description Tramonto.jpg</description>
5
+ <date>Thu Aug 19 14:00:00 +0200 2004</date>
6
+ <exif>
7
+ <model/>
8
+ <date_and_time/>
9
+ <exposure_time/>
10
+ <white_balance/>
11
+ <metering_mode/>
12
+ <iso_speed/>
13
+ <FocalLength/>
14
+ </exif>
15
+ </photo>
@@ -0,0 +1,14 @@
1
+ module ObjectWithProperties
2
+ def init_object_with_properties
3
+ @properties = {}
4
+ @properties.default = ""
5
+ end
6
+
7
+ def []( key )
8
+ @properties[ key ]
9
+ end
10
+
11
+ def[]=( key, value )
12
+ @properties[ key ] = value
13
+ end
14
+ end
@@ -0,0 +1,50 @@
1
+ # Classe astratta
2
+ # Oggetto che si valida, contiene all'interno la lista
3
+ # di messaggi che spiegano perche' non e' valido
4
+ #
5
+ # la classe derivata deve definire il metodo validate
6
+ #
7
+ class ObjectWithValidation
8
+
9
+ def initialize
10
+ @valid = true
11
+ # @explain = []
12
+ # puts "base initialize"
13
+ end
14
+
15
+ def valid?
16
+ @valid
17
+ end
18
+
19
+ def invalid?
20
+ not valid?
21
+ end
22
+
23
+ def force_validate
24
+ validate
25
+ @valid
26
+ end
27
+
28
+ def explain
29
+ raise "Valid object" if valid?
30
+ @explain
31
+ end
32
+
33
+ protected
34
+
35
+ def add_error( msg )
36
+ @valid = false
37
+ @explain ||= []
38
+
39
+ if msg.class == String
40
+ @explain << msg
41
+ end
42
+
43
+ if msg.class == Array
44
+ msg.each { |ex|
45
+ add_error("Invalid image_file nested message: '#{ex}'")
46
+ }
47
+ end
48
+ end
49
+
50
+ end
data/lib/ralbum.rb ADDED
@@ -0,0 +1,19 @@
1
+ class Ralbum
2
+ VERSION = '0.0.1'
3
+ end
4
+
5
+ #
6
+ # Check dependecies
7
+ #
8
+ require 'rubygems'
9
+ begin
10
+ require 'tree_visitor'
11
+ rescue LoadError
12
+ abort 'tree_visitor gem required!!'
13
+ end
14
+
15
+ begin
16
+ require 'image_size'
17
+ rescue LoadError
18
+ abort 'imagesize gem required!!'
19
+ end
@@ -0,0 +1,66 @@
1
+ require 'rubygems'
2
+
3
+ # ralbum
4
+ require 'tree_visitor/tree_node'
5
+
6
+ #
7
+ # subalbum -> childs
8
+ # leaves -> photos o image_pools
9
+ #
10
+ class Album < TreeNode
11
+
12
+ attr_reader :key
13
+ attr_reader :description
14
+
15
+ def initialize( parent, key, title, description )
16
+ super( title, parent )
17
+
18
+ @key = key
19
+ @description = description
20
+ @defaultImagePool = nil
21
+ end
22
+
23
+ def relroot
24
+ "../" * depth
25
+ end
26
+
27
+ def relroot_with_prefix
28
+ root.prefix_path + relroot
29
+ end
30
+
31
+ def pageurl_from_root
32
+ File.join( path_from_root, "index.html" )
33
+ end
34
+
35
+ def pageurl
36
+ File.join( name, "index.html" )
37
+ end
38
+
39
+ def defaultImagePool
40
+ return @defaultImagePool unless @defaultImagePool.nil?
41
+ if leaves.length > 0
42
+ @defaultImagePool = leaves[0]
43
+ elsif childs.length > 0
44
+ @defaultImagePool = childs[0].defaultImagePool
45
+ end
46
+ if @defaultImagePool.nil?
47
+ puts "cannot determine defaultphoto for album #{title} #{reldir} #{@leaves.length} #{@childs.length}"
48
+ exit 1
49
+ end
50
+ @defaultImagePool
51
+ end
52
+
53
+ def breadcrumbs
54
+ h = { :title => name, :path => pageurl_from_root }
55
+ if parent
56
+ parent.breadcrumbs << h
57
+ else
58
+ [ h ]
59
+ end
60
+ end
61
+
62
+ def to_s
63
+ "a: #{name.to_s}"
64
+ end
65
+
66
+ end
@@ -0,0 +1,178 @@
1
+ # stlib
2
+ require 'singleton'
3
+ require 'yaml'
4
+
5
+ # ralbums
6
+ require 'ralbum/image_pool'
7
+ require 'ralbum/image_strategy'
8
+
9
+
10
+ #
11
+ # All photos are stored here by md5
12
+ #
13
+ class Catalog
14
+
15
+ attr_reader :catalog_dirname
16
+
17
+ def initialize( catalog_dirname )
18
+ @catalog_dir = catalog_dirname
19
+ if not FileTest.directory?( catalog_dirname )
20
+ raise "Catog.init: catalog directory '#{catalog_dir}' not exists"
21
+ end
22
+
23
+ @md5_to_key = {}
24
+ @key_to_md5 = {}
25
+
26
+ @key_to_album = {}
27
+ @album_to_key = {}
28
+
29
+ load
30
+ end
31
+
32
+ def register_photo( md5 )
33
+ key = @md5_to_key[ md5 ]
34
+ return key unless key.nil?
35
+ key = new_key
36
+ @md5_to_key[ md5 ] = key
37
+ @key_to_md5[ key ] = md5
38
+ key
39
+ end
40
+
41
+ def key( md5 )
42
+ k = register_photo( md5.to_s )
43
+ sprintf("%04d", k )
44
+ end
45
+
46
+ def photo_file( phototreeitem )
47
+ "img_" + key( phototreeitem.md5.to_s ) + ".jpg"
48
+ end
49
+
50
+ def album_key( reldir )
51
+ key = @album_to_key[ reldir ]
52
+ return key unless key.nil?
53
+ key = new_key_album
54
+ @album_to_key[ reldir ] = key
55
+ @key_to_album[ key ] = reldir
56
+ key
57
+ end
58
+
59
+ #--------------------------------------------------------------------------------
60
+ # model
61
+
62
+ # def model_to_txt( albums )
63
+ # album_txt, photo_txt = [], []
64
+ # model_to_txt_rec( albums, album_txt, photo_txt )
65
+ # File.open( @catalog_dir + "/photos.txt", "w" ) { |f| f.puts photo_txt }
66
+ # File.open( @catalog_dir + "/albums.txt", "w" ) { |f| f.puts album_txt }
67
+ # end
68
+ #
69
+ # def model_to_txt_rec( albums, album_txt, photo_txt )
70
+ # album_txt << "#{albums.key}|#{albums.title}|#{albums.description}"
71
+ # albums.photos.each { |photo|
72
+ # photo_txt << "#{photo.key}|#{photo.title}|#{photo.description}"
73
+ # }
74
+ # # recurse on each subnode
75
+ # albums.subalbums.each{ |subalbum|
76
+ # model_to_txt_rec( subalbum, album_txt, photo_txt )
77
+ # }
78
+ # end
79
+
80
+ #-----------------------------------------------------------------------------
81
+ # catalog
82
+
83
+ # def create_images( phototree, album_dirname, image_strategies )
84
+ # # create_images_rec( phototree, albums_dirname )
85
+ # # store
86
+ # # phototree.accept( GenerateImageTreeNodeVisitor.new(albums_dirname, self) )
87
+ #
88
+ # verbose( 1, "create images" )
89
+ # catalog = self
90
+ #
91
+ # visitor = CallbackTreeNodeVisitor.new
92
+ # visitor.onVisitLeafNode { |photoItem|
93
+ # msg = ""
94
+ # image_strategies.each { |image_strategy|
95
+ # inpath = photoItem.path
96
+ # outdir = album_dirname + File::Separator + "images_" + image_strategy.name
97
+ #
98
+ # outfile = catalog.photo_file( photoItem )
99
+ # outpath = outdir + File::Separator + outfile
100
+ #
101
+ # if File.exist?(outpath) and File.mtime(inpath) < File.mtime(outpath)
102
+ # msg += "(s) "
103
+ # next
104
+ # end
105
+ # Dir.mkdir( outdir ) unless File.exist?( outdir )
106
+ # msg += image_strategy.build( inpath, outpath )
107
+ # }
108
+ # verbose( 2, sprintf("%40s: %s \n", photoItem.basename, msg ) )
109
+ # }
110
+ # phototree.accept( visitor )
111
+ # end
112
+
113
+
114
+
115
+ # private
116
+
117
+ def load
118
+ filename = @catalog_dir + File::Separator + "md5_to_key.yaml"
119
+ if FileTest.exists?( filename )
120
+ File.open( filename, "r" ) { |file|
121
+ @md5_to_key = YAML::load( file )
122
+ if not @md5_to_key
123
+ raise "Error loading md5_to_key, file corrupted?"
124
+ end
125
+ }
126
+ @md5_to_key.each { |md5,key| @key_to_md5[ key ] = md5 }
127
+ end
128
+
129
+
130
+ filename = @catalog_dir + File::Separator + "album_to_key.yaml"
131
+ if FileTest.exists?( filename )
132
+ File.open( filename, "r" ) { |file|
133
+ @album_to_key = YAML::load( file )
134
+ if not @album_to_key
135
+ raise "Error loading md5_to_key, file corrupted?"
136
+ end
137
+ }
138
+ @album_to_key.each { |k,v| @key_to_album[ v ] = k }
139
+ end
140
+ end
141
+
142
+ def store
143
+ if not @md5_to_key.empty?
144
+ filename = File.join(@catalog_dir, "md5_to_key.yaml")
145
+ # verbose(1, "Writing file md5_to_key.yaml in #{@catalog_dir}" )
146
+ File.open( filename, "w" ) { |file|
147
+ file.write( @md5_to_key.to_yaml )
148
+ }
149
+ end
150
+
151
+ if not @album_to_key.empty?
152
+ filename = @catalog_dir + File::Separator + "album_to_key.yaml"
153
+ # verbose( 1, "Writing file album_to_key.yaml in #{@catalog_dir}" )
154
+ File.open( filename, "w" ) { |file|
155
+ file.write( @album_to_key.to_yaml )
156
+ }
157
+ end
158
+ end
159
+ #
160
+ #
161
+ #
162
+ def new_key
163
+ key = 0
164
+ while @key_to_md5.key?( key )
165
+ key += 1
166
+ end
167
+ key
168
+ end
169
+
170
+ def new_key_album
171
+ key = 0
172
+ while @album_to_key.key?( key )
173
+ key += 1
174
+ end
175
+ key
176
+ end
177
+
178
+ end