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,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
+