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
@@ -0,0 +1,15 @@
|
|
1
|
+
if ! defined?( $options )
|
2
|
+
require 'ostruct'
|
3
|
+
$options = OpenStruct.new
|
4
|
+
# $options.force = false
|
5
|
+
$options.verbose = 0
|
6
|
+
# $options.inputfilter = "rubyalbum"
|
7
|
+
# $options.outputfilters = [ "html" ]
|
8
|
+
# $options.inctemplate = nil
|
9
|
+
end
|
10
|
+
|
11
|
+
def ralbum_verbose( level, msg )
|
12
|
+
if level < $options.verbose
|
13
|
+
puts msg
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
# stdlib
|
2
|
+
require 'rubygems'
|
3
|
+
require "rexml/document"
|
4
|
+
|
5
|
+
# ralbum
|
6
|
+
require 'tree_visitor/tree_node_visitor'
|
7
|
+
require 'tree_visitor/dir_tree_walker'
|
8
|
+
require 'ralbum/photo_tree_item'
|
9
|
+
require 'ralbum/photo_tree_node'
|
10
|
+
|
11
|
+
#
|
12
|
+
# Crea un PhotoTree a partire da una
|
13
|
+
# stuttura gerarchia di foto presente sul filesystem
|
14
|
+
#
|
15
|
+
class PhotoTreeBuilder
|
16
|
+
|
17
|
+
def run( phototree_dirname )
|
18
|
+
photoTree = buildPhotoTreeFromDirectory( phototree_dirname )
|
19
|
+
readMetaInfoOldFormat( photoTree )
|
20
|
+
updateMetaInfo( photoTree )
|
21
|
+
photoTree
|
22
|
+
end
|
23
|
+
|
24
|
+
# ------------------------------------------------------------------------------
|
25
|
+
#
|
26
|
+
# build photo tree senza metainfo
|
27
|
+
#
|
28
|
+
|
29
|
+
def buildPhotoTreeFromDirectory( phototree_dirname )
|
30
|
+
ralbum_verbose( 1, "phototree - building phototree from #{phototree_dirname}" )
|
31
|
+
visitor = CallbackTreeNodeVisitor2.new
|
32
|
+
|
33
|
+
visitor.onEnterTreeNode { |pathname, parent|
|
34
|
+
if not parent.nil?
|
35
|
+
pathname = File.basename( pathname )
|
36
|
+
end
|
37
|
+
PhotoTreeNode.new( pathname, parent )
|
38
|
+
}
|
39
|
+
|
40
|
+
visitor.onVisitLeafNode{ |pathname, parent|
|
41
|
+
PhotoTreeItem.new(File.basename( pathname ), parent )
|
42
|
+
}
|
43
|
+
|
44
|
+
dtw = DirTreeWalker.new( phototree_dirname )
|
45
|
+
dtw.add_ignore_dir( ".svn" )
|
46
|
+
dtw.add_ignore_dir( "catalog_data" )
|
47
|
+
dtw.add_inspect_file( /.jpg/ )
|
48
|
+
dtw.add_ignore_file( /.xml/ )
|
49
|
+
dtw.add_ignore_file( /(ignore)|(orig)/ )
|
50
|
+
|
51
|
+
photoTree = dtw.run( visitor )
|
52
|
+
# puts "------------------------------------ PhotoTree"
|
53
|
+
# photoTree.accept( PrintTreeNodeVisitor.new )
|
54
|
+
photoTree
|
55
|
+
end
|
56
|
+
|
57
|
+
# ---------------------------------------------------------------------------------------
|
58
|
+
#
|
59
|
+
# Read Metainfo vecchio formato
|
60
|
+
#
|
61
|
+
def readMetaInfoOldFormat( photoTree )
|
62
|
+
ralbum_verbose( 1, "phototree - reading metainfo" )
|
63
|
+
visitor = CallbackTreeNodeVisitor.new
|
64
|
+
visitor.onEnterTreeNode { |photoTreeNode|
|
65
|
+
read_photo_tree_node_xml( photoTreeNode )
|
66
|
+
}
|
67
|
+
visitor.onVisitLeafNode{ |photoTreeItem|
|
68
|
+
read_photo_item_xml( photoTreeItem )
|
69
|
+
}
|
70
|
+
photoTree.accept( visitor )
|
71
|
+
end
|
72
|
+
|
73
|
+
#
|
74
|
+
# old metainfo
|
75
|
+
#
|
76
|
+
|
77
|
+
def read_photo_item_xml(photoTreeItem)
|
78
|
+
xml_file = File.join( photoTreeItem.parent.path, photoTreeItem.basename + ".xml" )
|
79
|
+
|
80
|
+
if File.exist?(xml_file)
|
81
|
+
ralbum_verbose( 2, "NOTE: reading file xml for #{photoTreeItem.name}" )
|
82
|
+
else
|
83
|
+
ralbum_verbose( 1, "WARNING: file xml for #{photoTreeItem.name} not exists" )
|
84
|
+
return
|
85
|
+
end
|
86
|
+
|
87
|
+
doc = REXML::Document.new File.new( xml_file )
|
88
|
+
doc.elements["photo"].each_element { |e|
|
89
|
+
photoTreeItem[e.name.to_s] = e.text.to_s.strip.gsub( /\n/, "" ).gsub( /\s+/, " " )
|
90
|
+
}
|
91
|
+
end
|
92
|
+
|
93
|
+
def read_photo_tree_node_xml( photoTreeNode )
|
94
|
+
xml_file = File.join(photoTreeNode.path, "album.xml")
|
95
|
+
|
96
|
+
if File.exist?(xml_file)
|
97
|
+
ralbum_verbose( 2, "NOTE: reading xml for node '#{photoTreeNode.path_from_root}'" )
|
98
|
+
else
|
99
|
+
ralbum_verbose( 1, "WARNING: xml for node '#{photoTreeNode.path_from_root}' not exists" )
|
100
|
+
return
|
101
|
+
end
|
102
|
+
|
103
|
+
doc = REXML::Document.new File.new( xml_file )
|
104
|
+
doc.elements["album"].each_element { |e|
|
105
|
+
photoTreeNode[e.name.to_s] = e.text.to_s.strip.gsub( /\n/, "" ).gsub( /\s+/, " " )
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
109
|
+
# ---------------------------------------------------------------------------------------
|
110
|
+
#
|
111
|
+
# TODO: read meta info nuovo formato
|
112
|
+
|
113
|
+
def readMetaInfoNewFormat( photoTree, catalog_dirname )
|
114
|
+
ralbum_verbose( 1, "phototree - writing metainfo in #{catalog_dirname}" )
|
115
|
+
xml_project = File.join( catalog_dirname, "project.xml")
|
116
|
+
|
117
|
+
if File.exist?(xml_project)
|
118
|
+
ralbum_verbose( 2, "NOTE: reading xml for project" )
|
119
|
+
else
|
120
|
+
ralbum_verbose( 1, "WARNING: xml project not exists" )
|
121
|
+
return
|
122
|
+
end
|
123
|
+
|
124
|
+
doc = REXML::Document.new File.new( xml_project )
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
# ---------------------------------------------------------------------------------------
|
129
|
+
#
|
130
|
+
# check meta info nuovo formato
|
131
|
+
#
|
132
|
+
def updateMetaInfo( photoTree )
|
133
|
+
ralbum_verbose( 1, "phototree - updating metainfo" )
|
134
|
+
visitor = CallbackTreeNodeVisitor.new
|
135
|
+
visitor.onVisitLeafNode{ |photoTreeItem|
|
136
|
+
# TODO: updatare metainfo solo se il file della photo e' piu' aggionato del metainfo
|
137
|
+
if photoTreeItem['file_date'].empty? or photoTreeItem['file_date'] < photoTreeItem.time
|
138
|
+
photoTreeItem.force_read_metainfo
|
139
|
+
end
|
140
|
+
}
|
141
|
+
photoTree.accept( visitor )
|
142
|
+
|
143
|
+
end
|
144
|
+
|
145
|
+
# ---------------------------------------------------------------------------------------
|
146
|
+
#
|
147
|
+
# scrive meta info nuovo formato
|
148
|
+
#
|
149
|
+
# write xml - new format
|
150
|
+
#
|
151
|
+
|
152
|
+
def write_xml( photoTree, xml_project )
|
153
|
+
xml_photo_tree = xml_project.add_element("photo_tree")
|
154
|
+
visitor = CallbackTreeNodeVisitor2.new( xml_photo_tree )
|
155
|
+
visitor.onEnterTreeNode { |photoTreeNode, xml_el|
|
156
|
+
photoTreeNode.write_xml( xml_el )
|
157
|
+
}
|
158
|
+
visitor.onVisitLeafNode{ |photoTreeItem, xml_el|
|
159
|
+
photoTreeItem.write_xml( xml_el )
|
160
|
+
}
|
161
|
+
photoTree.accept( visitor )
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
165
|
+
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# rubygem
|
2
|
+
require 'rubygems'
|
3
|
+
require 'RMagick'
|
4
|
+
|
5
|
+
# ralbum
|
6
|
+
require 'gf_utility/md5'
|
7
|
+
require 'tree_visitor/leaf_node'
|
8
|
+
require 'ralbum-common/object_with_properties'
|
9
|
+
require 'ralbum/options'
|
10
|
+
require 'ralbum/ralbum_exception'
|
11
|
+
|
12
|
+
#
|
13
|
+
# Un photoTreeItem contiene una "foto" (da distinguersi con un'immagine)
|
14
|
+
# e le metainformazioni sulla foto
|
15
|
+
# un photoTreeItem appartiene sempre ad un photoTreeNode
|
16
|
+
#
|
17
|
+
class PhotoTreeItem < LeafNode
|
18
|
+
include ObjectWithProperties
|
19
|
+
|
20
|
+
attr_accessor :md5
|
21
|
+
|
22
|
+
def initialize( filename, photoTreeNode )
|
23
|
+
if photoTreeNode.nil?
|
24
|
+
raise "photoTreeNode non puo' essere nil!!"
|
25
|
+
end
|
26
|
+
super( filename, photoTreeNode )
|
27
|
+
init_object_with_properties
|
28
|
+
@time = nil
|
29
|
+
end
|
30
|
+
|
31
|
+
def basename
|
32
|
+
File.basename( name )
|
33
|
+
end
|
34
|
+
|
35
|
+
def time
|
36
|
+
return @time if ! @time.nil?
|
37
|
+
@time = File.mtime( parent.path )
|
38
|
+
end
|
39
|
+
|
40
|
+
def force_read_metainfo
|
41
|
+
unless File.exist?(path)
|
42
|
+
raise RAlbumException.new "photo '#{path}' not exists"
|
43
|
+
end
|
44
|
+
blob = File.open(path, "rb") do |f|
|
45
|
+
f.read
|
46
|
+
end
|
47
|
+
@md5 = MD5.new( blob ).to_s
|
48
|
+
ralbum_verbose( 2, sprintf("%40s: %d %s \n", name, time, @md5 ) )
|
49
|
+
|
50
|
+
image = Magick::ImageList.new
|
51
|
+
image.from_blob( blob )
|
52
|
+
set_exif_property(image, "model", "Model")
|
53
|
+
set_exif_property(image, "date_and_time", "DateTimeOriginal")
|
54
|
+
set_exif_property(image, "FocalLength", "FocalLengthIn35mmFilm")
|
55
|
+
set_exif_property(image, "exposure_time", "ExposureTime")
|
56
|
+
set_exif_property(image, "white_balance", "WhiteBalance")
|
57
|
+
set_exif_property(image, "iso_speed", "ISOSpeedRatings")
|
58
|
+
|
59
|
+
@properties['width'] = image.columns
|
60
|
+
@properties['height'] = image.rows
|
61
|
+
end
|
62
|
+
|
63
|
+
def write_xml( xml_el )
|
64
|
+
xml_photo = xml_el.add_element( "photo" )
|
65
|
+
xml_photo.add_element("md5").text = md5
|
66
|
+
xml_photo.add_element("title").text = name
|
67
|
+
xml_photo.add_element("description").text = self["description"]
|
68
|
+
xml_photo.add_element("file_date").text = time
|
69
|
+
|
70
|
+
xml_exif = xml_photo.add_element("exif")
|
71
|
+
xml_exif.add_element("model").text = self["model"]
|
72
|
+
xml_exif.add_element("date_and_time").text = self["date_and_time"]
|
73
|
+
xml_exif.add_element("FocalLength").text = self["FocalLength"]
|
74
|
+
xml_exif.add_element("exposure_time").text = self["exposure_time"]
|
75
|
+
xml_exif.add_element("white_balance").text = self["white_balance"]
|
76
|
+
xml_exif.add_element("iso_speed").text = self["iso_speed"]
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def set_exif_property(image, key_xml, key_exif )
|
82
|
+
a = image.get_exif_by_entry(key_exif)
|
83
|
+
if a && ( value = a[0][1] )
|
84
|
+
@properties[key_xml] = value
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# ralbum
|
2
|
+
require 'rubygems'
|
3
|
+
require 'ralbum-common/object_with_properties'
|
4
|
+
require 'tree_visitor/tree_node'
|
5
|
+
|
6
|
+
|
7
|
+
#
|
8
|
+
# phototree contiene una gerarchia di phototreenode
|
9
|
+
# contiene una lista di photoitem
|
10
|
+
#
|
11
|
+
class PhotoTreeNode < TreeNode
|
12
|
+
include ObjectWithProperties
|
13
|
+
|
14
|
+
def initialize( dirname, parentPhotoTreeNode = nil )
|
15
|
+
super( dirname, parentPhotoTreeNode )
|
16
|
+
|
17
|
+
init_object_with_properties
|
18
|
+
end
|
19
|
+
|
20
|
+
def write_xml( xml_el )
|
21
|
+
xml_album = xml_el.add_element( "album" )
|
22
|
+
xml_album.add_element("title").text = name
|
23
|
+
xml_album.add_element("thumbnail")
|
24
|
+
xml_album.add_element("shortdesc")
|
25
|
+
xml_album.add_element("longdesc")
|
26
|
+
xml_album.add_element("date")
|
27
|
+
xml_album.add_element("order")
|
28
|
+
xml_album
|
29
|
+
end
|
30
|
+
|
31
|
+
def to_str( prefix = "" )
|
32
|
+
str << ""
|
33
|
+
str += prefix + name + "\n"
|
34
|
+
str += prefix + " photoItems: "
|
35
|
+
@childs.each{ |c| str += c.name }
|
36
|
+
str
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
@@ -0,0 +1,89 @@
|
|
1
|
+
class Project
|
2
|
+
|
3
|
+
attr_accessor :phototree_dirname
|
4
|
+
attr_accessor :album_dirname
|
5
|
+
|
6
|
+
attr_accessor :skin_names
|
7
|
+
|
8
|
+
def initialize(skin_manager)
|
9
|
+
@skin_manager = skin_manager
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def run
|
14
|
+
|
15
|
+
# TODO: carica file xml di project
|
16
|
+
# TODO: da file xml di project ricava le image strategy
|
17
|
+
|
18
|
+
@phototree_dirname = File.expand_path( @phototree_dirname )
|
19
|
+
@album_dirname = File.expand_path( @album_dirname )
|
20
|
+
catalog_dirname = File.join( @phototree_dirname, "catalog_data" )
|
21
|
+
FileUtils.mkpath( catalog_dirname ) unless File.directory?( catalog_dirname )
|
22
|
+
|
23
|
+
#
|
24
|
+
# =================================
|
25
|
+
#
|
26
|
+
skin_name = @skin_names.first
|
27
|
+
skin = @skin_manager.get_skin( skin_name )
|
28
|
+
skin.skin_engine.album_dirname = @album_dirname
|
29
|
+
# TODO: skin.configure( xml_project )
|
30
|
+
|
31
|
+
#
|
32
|
+
# step 1: reading phototree
|
33
|
+
#
|
34
|
+
|
35
|
+
photoTreeBuilder = PhotoTreeBuilder.new
|
36
|
+
photoTree = photoTreeBuilder.run( phototree_dirname )
|
37
|
+
# TODO: photoTreeBuilder.configure( xml_project )
|
38
|
+
|
39
|
+
#
|
40
|
+
# step 2: build catalog
|
41
|
+
#
|
42
|
+
|
43
|
+
catalog = Catalog.new( catalog_dirname )
|
44
|
+
# catalog.create_images( photoTree, @album_dirname, skin.image_strategies )
|
45
|
+
# albums = catalog.create_model( phototree, albums_dir )
|
46
|
+
# catalog.model_to_txt( albums )
|
47
|
+
|
48
|
+
#
|
49
|
+
# step : generate album_tree
|
50
|
+
#
|
51
|
+
# TODO: l'album tree e' generato in base allo skin
|
52
|
+
generator = GenerateAlbumTreeNodeVisitor.new( album_dirname, catalog, skin.skin_engine.image_strategies )
|
53
|
+
albumTree = generator.run( photoTree )
|
54
|
+
|
55
|
+
|
56
|
+
|
57
|
+
#
|
58
|
+
# step 3: generate albums
|
59
|
+
#
|
60
|
+
# $options.outputfilters.each { |filter|
|
61
|
+
# skin = Generator::SkinFactory.get( filter )
|
62
|
+
# skin.create( albums_dir, albums )
|
63
|
+
# }
|
64
|
+
|
65
|
+
|
66
|
+
#
|
67
|
+
# output album tree
|
68
|
+
#
|
69
|
+
# puts "------------------------------------ AlbumTree"
|
70
|
+
# albumTree.accept( PrintTreeNodeVisitor.new )
|
71
|
+
|
72
|
+
# TODO: se generare l'album nella directory "skin_name" oppure nella root
|
73
|
+
skin.create( albumTree )
|
74
|
+
|
75
|
+
#
|
76
|
+
# save project
|
77
|
+
#
|
78
|
+
ralbum_verbose( 1, "phototree - writing metainfo in #{catalog_dirname}" )
|
79
|
+
doc = REXML::Document.new
|
80
|
+
doc << REXML::XMLDecl.new
|
81
|
+
xml_project = doc.add_element( "project" )
|
82
|
+
photoTreeBuilder.write_xml(photoTree, xml_project)
|
83
|
+
xml_project = File.join( catalog_dirname, "project.xml")
|
84
|
+
File.open( xml_project, "w") {|f|
|
85
|
+
doc.write( f, 0 )
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
data/lib/ralbum/skin.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
# rubygems
|
2
|
+
require 'rubygems'
|
3
|
+
|
4
|
+
#ralbum
|
5
|
+
require 'gf_utility/file_utilities'
|
6
|
+
require 'ralbum/skin_engine'
|
7
|
+
|
8
|
+
class Skin
|
9
|
+
|
10
|
+
attr_reader :skin_dirname
|
11
|
+
|
12
|
+
attr_reader :skin_name
|
13
|
+
attr_reader :skin_description
|
14
|
+
attr_reader :skin_author
|
15
|
+
|
16
|
+
def initialize( skin_name, skin_dirname )
|
17
|
+
@metainfo = nil
|
18
|
+
@skin_engine = nil
|
19
|
+
@skin_dirname = skin_dirname
|
20
|
+
|
21
|
+
@skin_name = skin_name
|
22
|
+
@skin_author = "please enter skin author name"
|
23
|
+
@skin_description = "no description"
|
24
|
+
load_info
|
25
|
+
end
|
26
|
+
|
27
|
+
def load_info
|
28
|
+
info_filename = File.join( @skin_dirname, "info.yml" )
|
29
|
+
if File.exist?( info_filename )
|
30
|
+
info = YAML::load( File.read(info_filename) )
|
31
|
+
if not info.kind_of?(Hash)
|
32
|
+
ralbum_verbose(1, "description skin file '#{info_filename}' is incorrect")
|
33
|
+
else
|
34
|
+
@metainfo = info
|
35
|
+
@skin_author = info["author"]
|
36
|
+
@skin_description = info["description"]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def create( albumTree )
|
42
|
+
skin_engine.create( albumTree )
|
43
|
+
end
|
44
|
+
|
45
|
+
def skin_engine
|
46
|
+
if @skin_engine
|
47
|
+
return @skin_engine
|
48
|
+
end
|
49
|
+
|
50
|
+
skin_engine_rb = File.join( @skin_dirname, @skin_name + "_skin.rb" )
|
51
|
+
if File.exist?( skin_engine_rb )
|
52
|
+
require skin_engine_rb
|
53
|
+
clss = get_constant( @skin_name.capitalize + "SkinEngine" )
|
54
|
+
@skin_engine = clss.new( self )
|
55
|
+
return @skin_engine
|
56
|
+
end
|
57
|
+
|
58
|
+
engine = @metainfo['engine']
|
59
|
+
unless engine
|
60
|
+
puts "warning non engine defined for skin #{skin_name} using erb engine"
|
61
|
+
engine = 'erb'
|
62
|
+
end
|
63
|
+
|
64
|
+
case engine
|
65
|
+
when 'erb' then
|
66
|
+
require 'ralbum/skin_engines/erb_skin_engine'
|
67
|
+
@skin_engine = ErbSkinEngine.new( self )
|
68
|
+
when 'kwartz' then
|
69
|
+
require 'ralbum/skin_engines/kwartz_skin_engine'
|
70
|
+
@skin_engine = KwartzSkinEngine.new( self )
|
71
|
+
else
|
72
|
+
raise RAlbumException.new, "skin engine #{engine} unknow"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|