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,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
@@ -0,0 +1,2 @@
1
+ class RAlbumException < RuntimeError
2
+ end
@@ -0,0 +1,17 @@
1
+
2
+
3
+ class Resource
4
+
5
+ def photos
6
+ "photos"
7
+ end
8
+
9
+ def thumbnails
10
+ "Thumbnails"
11
+ end
12
+
13
+ def subalbums
14
+ "Sub-Albums"
15
+ end
16
+ end
17
+
@@ -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