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.
- data/LICENSE +20 -0
- data/README.rdoc +80 -0
- data/bin/ralbum-JPG2jpg.rb +90 -0
- data/bin/ralbum-compile_skins.rb +18 -0
- data/bin/ralbum-myconv.rb +81 -0
- data/bin/ralbum-readexif.rb +18 -0
- data/bin/ralbum-reorder.rb +200 -0
- data/bin/ralbum.rb +12 -0
- data/example/README.txt +8 -0
- data/example/example.sh +3 -0
- data/example/httpd.rb +35 -0
- data/example/test_phototree/album.xml +21 -0
- data/example/test_phototree/catalog_data/md5_to_key.yaml +4 -0
- data/example/test_phototree/catalog_data/md5_to_key.yaml.test +4 -0
- data/example/test_phototree/catalog_data/project.xml +329 -0
- data/example/test_phototree/r_photo01.jpg +0 -0
- data/example/test_phototree/r_photo01.jpg.xml +17 -0
- data/example/test_phototree/subalbum01/album.xml +21 -0
- data/example/test_phototree/subalbum01/subalbum01_photo01.jpg +0 -0
- data/example/test_phototree/subalbum01/subalbum01_photo01.jpg.xml +15 -0
- data/example/test_phototree/subalbum01/subalbum01_photo02.jpg +0 -0
- data/example/test_phototree/subalbum01/subalbum01_photo02.jpg.xml +15 -0
- data/example/test_phototree/subalbum01/subalbum01_photo03.jpg +0 -0
- data/example/test_phototree/subalbum01/subalbum01_photo03.jpg.xml +15 -0
- data/example/test_phototree/subalbum01/subalbum01_photo04.jpg +0 -0
- data/example/test_phototree/subalbum01/subalbum01_photo04.jpg.xml +15 -0
- data/example/test_phototree/subalbum02/album.xml +10 -0
- data/example/test_phototree/subalbum02/subalbum02_photo01.jpg +0 -0
- data/example/test_phototree/subalbum02/subalbum02_photo01.jpg.xml +15 -0
- data/example/test_phototree/subalbum02/subalbum02_photo02.jpg +0 -0
- data/example/test_phototree/subalbum02/subalbum02_photo02.jpg.xml +15 -0
- data/example/test_phototree/subalbum02/subalbum02_photo03.jpg +0 -0
- data/example/test_phototree/subalbum02/subalbum02_photo03.jpg.xml +15 -0
- data/example/test_phototree/subalbum02/subalbum02_photo04.jpg +0 -0
- data/example/test_phototree/subalbum02/subalbum02_photo04.jpg.xml +15 -0
- data/example/test_phototree/subalbum02/subalbum02_photo05.jpg +0 -0
- data/example/test_phototree/subalbum02/subalbum02_photo05.jpg.xml +15 -0
- data/lib/ralbum-common/object_with_properties.rb +14 -0
- data/lib/ralbum-common/object_with_validation.rb +50 -0
- data/lib/ralbum.rb +19 -0
- data/lib/ralbum/album.rb +66 -0
- data/lib/ralbum/catalog.rb +178 -0
- data/lib/ralbum/cli/cli_ralbum.rb +116 -0
- data/lib/ralbum/generate_album_tree_node_visitor.rb +60 -0
- data/lib/ralbum/image_file.rb +81 -0
- data/lib/ralbum/image_pool.rb +71 -0
- data/lib/ralbum/image_strategy.rb +143 -0
- data/lib/ralbum/options.rb +15 -0
- data/lib/ralbum/photo_tree_builder.rb +165 -0
- data/lib/ralbum/photo_tree_item.rb +89 -0
- data/lib/ralbum/photo_tree_node.rb +40 -0
- data/lib/ralbum/project.rb +89 -0
- data/lib/ralbum/ralbum_exception.rb +2 -0
- data/lib/ralbum/resource.rb +17 -0
- data/lib/ralbum/skin.rb +76 -0
- data/lib/ralbum/skin_engine.rb +98 -0
- data/lib/ralbum/skin_engines/erb_skin_engine.rb +35 -0
- data/lib/ralbum/skin_engines/kwartz_skin_engine.rb +54 -0
- data/lib/ralbum/skin_manager.rb +46 -0
- data/lib/ralbum/skins/cgi/cgi_skin.rb +27 -0
- data/lib/ralbum/skins/cgi/info.yml +3 -0
- data/lib/ralbum/skins/cgi/res/model.rb +235 -0
- data/lib/ralbum/skins/cgi/res/resource.rb +17 -0
- data/lib/ralbum/skins/gfold/inc/menu_bottom.html +53 -0
- data/lib/ralbum/skins/gfold/inc/menu_top.html +71 -0
- data/lib/ralbum/skins/gfold/inc/page_footer.html +28 -0
- data/lib/ralbum/skins/gfold/info.yml +3 -0
- data/lib/ralbum/skins/gfold/out/album_page.rb +316 -0
- data/lib/ralbum/skins/gfold/out/image_page.rb +231 -0
- data/lib/ralbum/skins/gfold/out/tree_page.rb +96 -0
- data/lib/ralbum/skins/gfold/res/16-arrow-down.png +0 -0
- data/lib/ralbum/skins/gfold/res/16-arrow-left.png +0 -0
- data/lib/ralbum/skins/gfold/res/16-arrow-right.png +0 -0
- data/lib/ralbum/skins/gfold/res/16-arrow-up.png +0 -0
- data/lib/ralbum/skins/gfold/res/left.gif +0 -0
- data/lib/ralbum/skins/gfold/res/prototype.js +3277 -0
- data/lib/ralbum/skins/gfold/res/right.gif +0 -0
- data/lib/ralbum/skins/gfold/res/style1.css +453 -0
- data/lib/ralbum/skins/gfold/res/style2.css +414 -0
- data/lib/ralbum/skins/gfold/res/styleswitcher.js +89 -0
- data/lib/ralbum/skins/gfold/res/top.gif +0 -0
- data/lib/ralbum/skins/gfold/res/up.gif +0 -0
- data/lib/ralbum/skins/gfold/res/valid-css.png +0 -0
- data/lib/ralbum/skins/gfold/res/valid-xhtml.png +0 -0
- data/lib/ralbum/skins/gfold/res/valid-xhtml11.png +0 -0
- data/lib/ralbum/skins/gfold/res/vcss.gif +0 -0
- data/lib/ralbum/skins/gfold/template/album_page.html +161 -0
- data/lib/ralbum/skins/gfold/template/album_page.plogic +127 -0
- data/lib/ralbum/skins/gfold/template/image_page.html +91 -0
- data/lib/ralbum/skins/gfold/template/image_page.plogic +70 -0
- data/lib/ralbum/skins/gfold/template/tree_page.html +79 -0
- data/lib/ralbum/skins/gfold/template/tree_page.plogic +45 -0
- data/lib/ralbum/skins/js/info.yml +3 -0
- data/lib/ralbum/skins/js/js_skin.rb +50 -0
- data/lib/ralbum/skins/js/out/album_page.rb +181 -0
- data/lib/ralbum/skins/js/out/slideshow_page.rb +187 -0
- data/lib/ralbum/skins/js/out/tree_page.rb +134 -0
- data/lib/ralbum/skins/js/res/left.gif +0 -0
- data/lib/ralbum/skins/js/res/right.gif +0 -0
- data/lib/ralbum/skins/js/res/style.css +76 -0
- data/lib/ralbum/skins/js/res/top.gif +0 -0
- data/lib/ralbum/skins/js/res/up.gif +0 -0
- data/lib/ralbum/skins/js/template/album_page.html +178 -0
- data/lib/ralbum/skins/js/template/album_page.plogic +88 -0
- data/lib/ralbum/skins/js/template/slideshow_page.html +169 -0
- data/lib/ralbum/skins/js/template/slideshow_page.plogic +1 -0
- data/lib/ralbum/skins/js/template/tree_page.html +118 -0
- data/lib/ralbum/skins/js/template/tree_page.plogic +43 -0
- data/lib/ralbum/skins/test_erb/info.yml +3 -0
- data/lib/ralbum/skins/test_erb/out/album_page.rb +54 -0
- data/lib/ralbum/skins/test_erb/out/image_page.rb +54 -0
- data/lib/ralbum/skins/test_kwartz/info.yml +3 -0
- data/lib/ralbum/skins/test_kwartz/out/album_page.rb +54 -0
- data/lib/ralbum/skins/test_kwartz/out/image_page.rb +54 -0
- data/lib/ralbum/skins/test_kwartz/template/album_page.html +37 -0
- data/lib/ralbum/skins/test_kwartz/template/image_page.html +37 -0
- data/test/ralbum/cli/test_cli_ralbum.rb +13 -0
- data/test/ralbum/tc_01_photo_tree.rb +37 -0
- data/test/ralbum/tc_02_photo_tree_builder.rb +20 -0
- data/test/ralbum/tc_03_album.rb +42 -0
- data/test/ralbum/tc_04_skin_manager.rb +30 -0
- data/test/ralbum/tc_05_kwartz_skin_engine.rb +50 -0
- data/test/ralbum/tc_06_image_strategy.rb +21 -0
- data/test/ralbum/tc_catalog.rb +31 -0
- data/test/ralbum/test_helper.rb +13 -0
- data/test/test_ralbum.rb +14 -0
- data/test_data/ralbum/test_data/albums_directory/gfold/album_1/img_0004.jpg.html +148 -0
- data/test_data/ralbum/test_data/albums_directory/gfold/album_1/img_0005.jpg.html +152 -0
- data/test_data/ralbum/test_data/albums_directory/gfold/album_1/img_0006.jpg.html +152 -0
- data/test_data/ralbum/test_data/albums_directory/gfold/album_1/img_0007.jpg.html +148 -0
- data/test_data/ralbum/test_data/albums_directory/gfold/album_1/index.html +195 -0
- data/test_data/ralbum/test_data/albums_directory/gfold/album_2/img_0008.jpg.html +148 -0
- data/test_data/ralbum/test_data/albums_directory/gfold/album_2/img_0009.jpg.html +152 -0
- data/test_data/ralbum/test_data/albums_directory/gfold/album_2/img_0010.jpg.html +152 -0
- data/test_data/ralbum/test_data/albums_directory/gfold/album_2/img_0011.jpg.html +152 -0
- data/test_data/ralbum/test_data/albums_directory/gfold/album_2/img_0012.jpg.html +148 -0
- data/test_data/ralbum/test_data/albums_directory/gfold/album_2/index.html +206 -0
- data/test_data/ralbum/test_data/albums_directory/gfold/img_0003.jpg.html +141 -0
- data/test_data/ralbum/test_data/albums_directory/gfold/index.html +208 -0
- data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0003.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0004.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0005.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0006.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0007.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0008.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0009.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0010.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0011.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_100x100/img_0012.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0003.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0004.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0005.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0006.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0007.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0008.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0009.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0010.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0011.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/images_640x480/img_0012.jpg +0 -0
- data/test_data/ralbum/test_data/albums_directory/res/left.gif +0 -0
- data/test_data/ralbum/test_data/albums_directory/res/prototype.js +3277 -0
- data/test_data/ralbum/test_data/albums_directory/res/right.gif +0 -0
- data/test_data/ralbum/test_data/albums_directory/res/style1.css +453 -0
- data/test_data/ralbum/test_data/albums_directory/res/style2.css +414 -0
- data/test_data/ralbum/test_data/albums_directory/res/styleswitcher.js +89 -0
- data/test_data/ralbum/test_data/albums_directory/res/top.gif +0 -0
- data/test_data/ralbum/test_data/albums_directory/res/up.gif +0 -0
- data/test_data/ralbum/test_data/albums_directory/res/valid-css.png +0 -0
- data/test_data/ralbum/test_data/albums_directory/res/valid-xhtml.png +0 -0
- data/test_data/ralbum/test_data/albums_directory/res/valid-xhtml11.png +0 -0
- data/test_data/ralbum/test_data/albums_directory/res/vcss.gif +0 -0
- data/test_data/ralbum/test_data/albums_directory/test/album_1/img_0004.jpg.html +11 -0
- data/test_data/ralbum/test_data/albums_directory/test/album_1/img_0005.jpg.html +11 -0
- data/test_data/ralbum/test_data/albums_directory/test/album_1/img_0006.jpg.html +11 -0
- data/test_data/ralbum/test_data/albums_directory/test/album_1/img_0007.jpg.html +11 -0
- data/test_data/ralbum/test_data/albums_directory/test/album_1/index.html +13 -0
- data/test_data/ralbum/test_data/albums_directory/test/album_2/img_0008.jpg.html +11 -0
- data/test_data/ralbum/test_data/albums_directory/test/album_2/img_0009.jpg.html +11 -0
- data/test_data/ralbum/test_data/albums_directory/test/album_2/img_0010.jpg.html +11 -0
- data/test_data/ralbum/test_data/albums_directory/test/album_2/img_0011.jpg.html +11 -0
- data/test_data/ralbum/test_data/albums_directory/test/album_2/img_0012.jpg.html +11 -0
- data/test_data/ralbum/test_data/albums_directory/test/album_2/index.html +13 -0
- data/test_data/ralbum/test_data/albums_directory/test/img_0003.jpg.html +11 -0
- data/test_data/ralbum/test_data/albums_directory/test/index.html +13 -0
- data/test_data/ralbum/test_data/is_test/r_photo01_scaled.jpg +0 -0
- data/test_data/ralbum/test_data/is_test/r_photo01_sepia_scaled.jpg +0 -0
- metadata +276 -0
Binary file
|
@@ -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>
|
Binary file
|
@@ -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>
|
Binary file
|
@@ -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>
|
Binary file
|
@@ -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>
|
Binary file
|
@@ -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>
|
Binary file
|
@@ -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>
|
Binary file
|
@@ -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>
|
Binary file
|
@@ -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>
|
Binary file
|
@@ -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,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
|
data/lib/ralbum/album.rb
ADDED
@@ -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
|