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,116 @@
|
|
1
|
+
# stdlib
|
2
|
+
require 'rubygems'
|
3
|
+
require 'digest/md5'
|
4
|
+
require 'rexml/document'
|
5
|
+
require 'yaml'
|
6
|
+
require 'pp'
|
7
|
+
require 'optparse'
|
8
|
+
require 'ostruct'
|
9
|
+
require 'fileutils'
|
10
|
+
|
11
|
+
# ralbum
|
12
|
+
require 'tree_visitor/dir_tree_walker'
|
13
|
+
require 'tree_visitor/tree_node_visitor'
|
14
|
+
require 'ralbum/options'
|
15
|
+
require 'ralbum/photo_tree_builder'
|
16
|
+
require 'ralbum/catalog'
|
17
|
+
require 'ralbum/generate_album_tree_node_visitor'
|
18
|
+
require 'ralbum/skin_manager'
|
19
|
+
require 'ralbum/project'
|
20
|
+
|
21
|
+
class CliRAlbum
|
22
|
+
|
23
|
+
def self.run
|
24
|
+
self.new.parse_args( ARGV )
|
25
|
+
end
|
26
|
+
|
27
|
+
def parse_args( argv )
|
28
|
+
|
29
|
+
skin_manager = SkinManager.new
|
30
|
+
|
31
|
+
$options = OpenStruct.new
|
32
|
+
$options.force = false
|
33
|
+
$options.verbose = 0
|
34
|
+
$options.inputfilter = "rubyalbum"
|
35
|
+
$options.list_skins = false
|
36
|
+
$options.skins = [ "gfold" ]
|
37
|
+
$options.inctemplate = nil
|
38
|
+
|
39
|
+
options = OptionParser.new do |opts|
|
40
|
+
opts.banner =
|
41
|
+
"Usage: #{File.basename($0)} <photo tree directory> <album tree directory>\n" +
|
42
|
+
"Create albums from a phototree"
|
43
|
+
|
44
|
+
opts.on("-f", "--force", "force the creation of directory") {
|
45
|
+
$options.force = true
|
46
|
+
}
|
47
|
+
opts.on("-v", "--verbose [NUM]", Integer, "verbosity level") { |num|
|
48
|
+
if num.nil?
|
49
|
+
$options.verbose = 1
|
50
|
+
else
|
51
|
+
$options.verbose = num
|
52
|
+
end
|
53
|
+
}
|
54
|
+
opts.on("-i", "--ifilter STRING", String, "input filter (phototree)" ) { |arg|
|
55
|
+
$options.inputfilter = arg
|
56
|
+
}
|
57
|
+
opts.on("-l", "--list-skins", "show a list of skins") { |arg|
|
58
|
+
puts "Available skins:"
|
59
|
+
puts skin_manager.describe_skins
|
60
|
+
exit 0
|
61
|
+
}
|
62
|
+
opts.on("-s", "--skin x,y,z", Array, "skin(s)") { |arg|
|
63
|
+
$options.skins = arg
|
64
|
+
}
|
65
|
+
opts.on("--inc STRING", String, "includes kwarts template" ) { |arg|
|
66
|
+
$options.inctemplate = arg
|
67
|
+
}
|
68
|
+
opts.on("--help", "-h", "help!") {
|
69
|
+
puts opts
|
70
|
+
exit 0
|
71
|
+
}
|
72
|
+
end
|
73
|
+
options.parse!(argv)
|
74
|
+
|
75
|
+
if ARGV.length < 2
|
76
|
+
puts options
|
77
|
+
exit 1
|
78
|
+
end
|
79
|
+
|
80
|
+
phototree_dirname = argv[0]
|
81
|
+
album_dirname = argv[1]
|
82
|
+
|
83
|
+
|
84
|
+
$options.skins.each do |skin_name|
|
85
|
+
unless skin_manager.has_skin?(skin_name)
|
86
|
+
puts "skin: #{skin_name} not exists"
|
87
|
+
exit 1
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
if not File.directory?( phototree_dirname )
|
92
|
+
puts "phototree_dir '#{phototree_dirname}' not exists or is not a directory"
|
93
|
+
exit 1
|
94
|
+
end
|
95
|
+
|
96
|
+
if not File.directory?( album_dirname )
|
97
|
+
if $options.force
|
98
|
+
ralbum_verbose(1, "creating album_dir #{album_dirname}")
|
99
|
+
FileUtils.mkdir_p( album_dirname )
|
100
|
+
else
|
101
|
+
puts "albums_dir '#{album_dirname}' not exists or is not a directory"
|
102
|
+
puts "use -f to force the creation of directory"
|
103
|
+
exit 1
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
phototree_dirname = File.expand_path( phototree_dirname )
|
108
|
+
album_dirname = File.expand_path( album_dirname )
|
109
|
+
project = Project.new(skin_manager)
|
110
|
+
project.phototree_dirname = phototree_dirname
|
111
|
+
project.album_dirname = album_dirname
|
112
|
+
project.skin_names = $options.skins
|
113
|
+
project.run
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
# ralbum
|
4
|
+
require 'tree_visitor/tree_node_visitor'
|
5
|
+
require 'ralbum/album'
|
6
|
+
require 'ralbum/image_pool'
|
7
|
+
require 'ralbum/image_file'
|
8
|
+
|
9
|
+
class GenerateAlbumTreeNodeVisitor
|
10
|
+
|
11
|
+
def initialize( album_dirname, catalog, image_strategies )
|
12
|
+
@album_dirname = album_dirname
|
13
|
+
@catalog = catalog
|
14
|
+
@image_strategies = image_strategies
|
15
|
+
end
|
16
|
+
|
17
|
+
def run( photoTree )
|
18
|
+
ralbum_verbose( 1, "generate albumtree" )
|
19
|
+
ralbum_verbose( 1, "create images" )
|
20
|
+
visitor = CallbackTreeNodeVisitor2.new
|
21
|
+
|
22
|
+
visitor.onEnterTreeNode { |photoNode, parentAlbumNode|
|
23
|
+
album_key = @catalog.album_key( photoNode.path_from_root )
|
24
|
+
album_title = photoNode["title"]
|
25
|
+
album_desc = photoNode["shortdesc"]
|
26
|
+
albumNode = Album.new( parentAlbumNode, album_key, album_title, album_desc )
|
27
|
+
}
|
28
|
+
|
29
|
+
visitor.onVisitLeafNode{ |photoItem, parentAlbumNode|
|
30
|
+
photo_key = @catalog.key( photoItem.md5 )
|
31
|
+
photo_title = photoItem[ "title" ]
|
32
|
+
photo_desc = photoItem[ "description" ]
|
33
|
+
imagePool = ImagePool.new( parentAlbumNode, photoItem.md5, photo_key, photo_title, photo_desc )
|
34
|
+
msg = ""
|
35
|
+
@image_strategies.each_pair {|name,image_strategy|
|
36
|
+
image_basename = @catalog.photo_file( photoItem )
|
37
|
+
inpath = photoItem.path
|
38
|
+
outdir = File.join( @album_dirname, "images_" + image_strategy.name )
|
39
|
+
outpath = File.join( outdir, image_basename )
|
40
|
+
msg += "#{name} "
|
41
|
+
if File.exist?(outpath) and File.mtime(inpath) < File.mtime(outpath)
|
42
|
+
msg += "(s) "
|
43
|
+
else
|
44
|
+
Dir.mkdir( outdir ) unless File.exist?( outdir )
|
45
|
+
msg += image_strategy.build( inpath, outpath )
|
46
|
+
end
|
47
|
+
|
48
|
+
# imagePool.thumb = ImageFile.new( imagePool, @albums_dirname, "images_100x100/" + basename )
|
49
|
+
# imagePool.defaultImageFile = ImageFile.new( imagePool, @albums_dirname, "images_640x480/" + basename, basename + ".html")
|
50
|
+
image = ImageFile.new( imagePool, outpath, image_basename + ".html" )
|
51
|
+
imagePool.image( name, image )
|
52
|
+
}
|
53
|
+
ralbum_verbose( 2, sprintf("%40s: %s \n", photoItem.basename, msg ) )
|
54
|
+
}
|
55
|
+
|
56
|
+
photoTree.accept( visitor )
|
57
|
+
visitor.root
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
#gems
|
2
|
+
require 'rubygems'
|
3
|
+
require 'RMagick'
|
4
|
+
require 'image_size'
|
5
|
+
|
6
|
+
class ImageFile
|
7
|
+
|
8
|
+
attr_reader :imagePool
|
9
|
+
|
10
|
+
#
|
11
|
+
# url of image
|
12
|
+
#
|
13
|
+
# attr_reader :url
|
14
|
+
|
15
|
+
#
|
16
|
+
# url of html page displaying the image
|
17
|
+
#
|
18
|
+
attr_reader :pageurl
|
19
|
+
|
20
|
+
attr_reader :size, :width, :height
|
21
|
+
|
22
|
+
def initialize( imagePool, path, pageurl)
|
23
|
+
@imagePool = imagePool
|
24
|
+
@pageurl = pageurl
|
25
|
+
|
26
|
+
@size = File.size( path )
|
27
|
+
@size = @size / 1024
|
28
|
+
|
29
|
+
if not File.exist?(path)
|
30
|
+
raise RAlbumException.new "file '#{path}' not exist"
|
31
|
+
end
|
32
|
+
if File.directory?(path)
|
33
|
+
raise RAlbumException.new "expected '#{path}' as file but it is a directory"
|
34
|
+
end
|
35
|
+
|
36
|
+
blob = File.open(path, "rb") do |f|
|
37
|
+
f.read
|
38
|
+
end
|
39
|
+
image = Magick::ImageList.new
|
40
|
+
image.from_blob( blob )
|
41
|
+
@width = image.columns
|
42
|
+
@height = image.rows
|
43
|
+
end
|
44
|
+
|
45
|
+
def name
|
46
|
+
@imagePool.name
|
47
|
+
end
|
48
|
+
|
49
|
+
def description
|
50
|
+
@imagePool.description
|
51
|
+
end
|
52
|
+
|
53
|
+
def relroot
|
54
|
+
@imagePool.relroot
|
55
|
+
end
|
56
|
+
|
57
|
+
def relroot_with_prefix
|
58
|
+
@imagePool.relroot_with_prefix
|
59
|
+
end
|
60
|
+
|
61
|
+
def breadcrumbs
|
62
|
+
@imagePool.breadcrumbs
|
63
|
+
end
|
64
|
+
|
65
|
+
def prev_pageurl
|
66
|
+
if @imagePool.prev
|
67
|
+
@imagePool.prev.defaultImageFile.pageurl
|
68
|
+
else
|
69
|
+
nil
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def next_pageurl
|
74
|
+
if @imagePool.next
|
75
|
+
@imagePool.next.defaultImageFile.pageurl
|
76
|
+
else
|
77
|
+
nil
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
# ralbum
|
2
|
+
require 'tree_visitor/leaf_node'
|
3
|
+
|
4
|
+
#
|
5
|
+
# ImagePool e' creata da una PhotoItem identificata da un md5
|
6
|
+
# ImagePool ha una 'key' con cui viene identificata nel catalog
|
7
|
+
# ha un 'title' che e' anche il 'name' del LeafNode
|
8
|
+
# ha una 'description' della photo che rappresenta
|
9
|
+
#
|
10
|
+
class ImagePool < LeafNode
|
11
|
+
# include ObjectWithProperties
|
12
|
+
|
13
|
+
#
|
14
|
+
# md5 of original photo
|
15
|
+
#
|
16
|
+
attr_reader :md5
|
17
|
+
|
18
|
+
#
|
19
|
+
# key (number) assigned by catalog for the original photo
|
20
|
+
#
|
21
|
+
attr_reader :key
|
22
|
+
|
23
|
+
# title -> name
|
24
|
+
attr_reader :description
|
25
|
+
|
26
|
+
def initialize( album, md5, key, title, description )
|
27
|
+
super( title, album )
|
28
|
+
@md5 = md5
|
29
|
+
|
30
|
+
@key = key
|
31
|
+
@album = album
|
32
|
+
@description = description
|
33
|
+
|
34
|
+
@images = {}
|
35
|
+
end
|
36
|
+
|
37
|
+
def relroot
|
38
|
+
parent.relroot
|
39
|
+
end
|
40
|
+
|
41
|
+
def relroot_with_prefix
|
42
|
+
parent.relroot_with_prefix
|
43
|
+
end
|
44
|
+
|
45
|
+
def breadcrumbs
|
46
|
+
parent.breadcrumbs
|
47
|
+
end
|
48
|
+
|
49
|
+
def image( type, image_file = nil)
|
50
|
+
if image_file
|
51
|
+
@images[ type ] = image_file
|
52
|
+
end
|
53
|
+
res = @images[ type ]
|
54
|
+
if res.nil?
|
55
|
+
raise "image type '#{type}' of photo '#{name}' not found"
|
56
|
+
end
|
57
|
+
res
|
58
|
+
end
|
59
|
+
|
60
|
+
def defaultImageFile
|
61
|
+
image("default")
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_s
|
65
|
+
str = "ip: #{name.to_s} -#{@images.length}-"
|
66
|
+
@images.each_key { |key| str += key.to_s }
|
67
|
+
str
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# stdlib
|
2
|
+
require "fileutils"
|
3
|
+
|
4
|
+
# gems
|
5
|
+
require 'rubygems'
|
6
|
+
require 'RMagick'
|
7
|
+
|
8
|
+
#
|
9
|
+
# Strategy for build a scaled image
|
10
|
+
#
|
11
|
+
class ScaledImageStrategy
|
12
|
+
|
13
|
+
attr_reader :name, :width, :height, :quality
|
14
|
+
|
15
|
+
def initialize( name, width, height, quality )
|
16
|
+
@name = name
|
17
|
+
@width = width
|
18
|
+
@height = height
|
19
|
+
@quality = quality
|
20
|
+
end
|
21
|
+
|
22
|
+
#
|
23
|
+
# build a scaled image and store it in outpath
|
24
|
+
#
|
25
|
+
# inpath source image file
|
26
|
+
# outpath destination image file
|
27
|
+
#
|
28
|
+
def build( inpath, outpath )
|
29
|
+
# TODO: ritornare un risultato per es. 1 = skipped 2 = copiato 3 = scalata immagine
|
30
|
+
result_msg = ""
|
31
|
+
img = Magick::ImageList.new(inpath)
|
32
|
+
|
33
|
+
if @width > img.columns and @height > img.rows
|
34
|
+
result_msg = "(c) "
|
35
|
+
# FileUtils.cp( inpath, outpath )
|
36
|
+
# rimuovere i metadata
|
37
|
+
else
|
38
|
+
result_msg = "(#{@quality}%) "
|
39
|
+
img.resize_to_fit!(@width, @height)
|
40
|
+
end
|
41
|
+
img.profile!('*', nil)
|
42
|
+
|
43
|
+
img.write(outpath) {|i| i.quality = quality }
|
44
|
+
result_msg
|
45
|
+
end
|
46
|
+
|
47
|
+
def write_xml( xml_iss )
|
48
|
+
xml_is = xml_iss.add_element( "image_strategy")
|
49
|
+
xml_is.attributes["name"] = self.class.to_s
|
50
|
+
xml_par = xml_is.add_element("par")
|
51
|
+
xml_par.attributes["width"] = @width.to_s
|
52
|
+
xml_par.attributes["height"] = @height.to_s
|
53
|
+
xml_par.attributes["quality"] = @quality.to_s
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
|
58
|
+
#
|
59
|
+
# Strategy for build a scaled image
|
60
|
+
#
|
61
|
+
class SepiaScaledImageStrategy
|
62
|
+
|
63
|
+
attr_reader :name, :width, :height, :quality
|
64
|
+
|
65
|
+
def initialize( name, width, height, quality )
|
66
|
+
@name = name
|
67
|
+
@width = width
|
68
|
+
@height = height
|
69
|
+
@quality = quality
|
70
|
+
end
|
71
|
+
|
72
|
+
#
|
73
|
+
# build a scaled image and store it in outpath
|
74
|
+
#
|
75
|
+
# inpath source image file
|
76
|
+
# outpath destination image file
|
77
|
+
#
|
78
|
+
def build( inpath, outpath )
|
79
|
+
# TODO: ritornare un risultato per es. 1 = skipped 2 = copiato 3 = scalata immagine
|
80
|
+
result_msg = ""
|
81
|
+
img = Magick::ImageList.new(inpath)
|
82
|
+
|
83
|
+
if @width > img.columns and @height > img.rows
|
84
|
+
result_msg = "(c) "
|
85
|
+
# FileUtils.cp( inpath, outpath )
|
86
|
+
# rimuovere i metadata
|
87
|
+
else
|
88
|
+
result_msg = "(#{@quality}%) "
|
89
|
+
img.resize_to_fit!(@width, @height)
|
90
|
+
end
|
91
|
+
img = img.sepiatone
|
92
|
+
img.profile!('*', nil)
|
93
|
+
|
94
|
+
img.write(outpath) {|i| i.quality = quality }
|
95
|
+
result_msg
|
96
|
+
end
|
97
|
+
|
98
|
+
def write_xml( xml_iss )
|
99
|
+
xml_is = xml_iss.add_element( "image_strategy")
|
100
|
+
xml_is.attributes["name"] = self.class.to_s
|
101
|
+
xml_par = xml_is.add_element("par")
|
102
|
+
xml_par.attributes["width"] = @width
|
103
|
+
xml_par.attributes["height"] = @height
|
104
|
+
xml_par.attributes["quality"] = @quality
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
#
|
110
|
+
# Create a link from inpath to outpath
|
111
|
+
#
|
112
|
+
class LinkedImageStrategy
|
113
|
+
|
114
|
+
attr_reader :name
|
115
|
+
|
116
|
+
def initialize( name )
|
117
|
+
@name = name
|
118
|
+
end
|
119
|
+
|
120
|
+
def build( inpath, outpath )
|
121
|
+
return if File.exist?( outpath )
|
122
|
+
ralbum_verbose( 1, "link " )
|
123
|
+
File.symlink( inpath, outpath )
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
#
|
129
|
+
# Copy an image from inpath to outpath
|
130
|
+
#
|
131
|
+
class CopyImageStrategy
|
132
|
+
attr_reader :name
|
133
|
+
|
134
|
+
def initialize( name )
|
135
|
+
@name = name
|
136
|
+
end
|
137
|
+
|
138
|
+
def build( inpath, outpath )
|
139
|
+
FileUtils.cp( inpath, outpath )
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
143
|
+
|