support mageia-style gettext package (rubygems)
[booh] / bin / album2booh
1 #! /usr/bin/ruby
2 #
3 #                         *  BOOH  *
4 #
5 # A.k.a 'Best web-album Of the world, Or your money back, Humerus'.
6 #
7 # The acronyn sucks, however this is a tribute to Dragon Ball by
8 # Akira Toriyama, where the last enemy beaten by heroes of Dragon
9 # Ball is named "Boo". But there was already a free software project
10 # called Boo, so this one will be it "Booh". Or whatever.
11 #
12 #
13 # Copyright (c) 2004-2006 Guillaume Cottenceau <http://zarb.org/~gc/resource/gc_mail.png>
14 # Copyright (c) 2007 Stephane Fillod
15 #
16 # This software may be freely redistributed under the terms of the GNU
17 # public license version 2.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program; if not, write to the Free Software
21 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22
23 # 'album' structure:
24 # "captions.txt"
25 #       <directory><tab><title>
26 #       <picfilename><tab><title><tab><texte>
27 # <directory>".captions.txt"
28 #       <picfilename><tab><title><tab><texte>
29 # <directory>/<picfilename>".txt"
30 #       <free text>
31 #
32 # Since Booh requires UTF-8, you may need to convert caption files:
33 #       $ recode ISO-8859-1..UTF-8 captions.txt
34 #
35
36 begin
37     require 'rubygems'
38 rescue LoadError
39 end
40
41 require 'getoptlong'
42 require 'gettext'
43 include GetText
44 require 'booh/rexml/document'
45 include REXML
46
47 require 'booh/booh-lib'
48 include Booh
49
50 #- options
51 $options = [
52     [ '--help',          '-h', GetoptLong::NO_ARGUMENT,       _("Get help message") ],
53
54     [ '--config',        '-C', GetoptLong::REQUIRED_ARGUMENT, _("File containing config listing images and videos within directories with captions") ],
55
56     [ '--verbose-level', '-v', GetoptLong::REQUIRED_ARGUMENT, _("Set max verbosity level (0: errors, 1: warnings, 2: important messages, 3: other messages)") ],
57 ]
58
59 #- default values for some globals 
60 $switches = []
61 $stdout.sync = true
62
63 def usage
64     puts _("Usage: %s [OPTION]...") % File.basename($0)
65     $options.each { |ary|
66         printf " %3s, %-15s %s\n", ary[1], ary[0], ary[3]
67     }
68 end
69
70 def handle_options
71     parser = GetoptLong.new
72     parser.set_options(*$options.collect { |ary| ary[0..2] })
73     begin
74         parser.each_option do |name, arg|
75             case name
76             when '--help'
77                 usage
78                 exit(0)
79
80             when '--config'
81                 if File.readable?(arg)
82                     $xmldoc = REXML::Document.new File.new(arg)
83                     $conffile = arg
84                 else
85                     die_ _('Config file does not exist or is unreadable.')
86                 end
87
88             when '--verbose-level'
89                 $verbose_level = arg.to_i
90
91             end
92         end
93     rescue
94         puts $!
95         usage
96         exit(1)
97     end
98
99     if !$xmldoc
100         die_ _("Missing --config parameter.")
101     end
102
103     $source = $xmldoc.root.attributes['source']
104     $dest = $xmldoc.root.attributes['destination']
105 end
106
107 def utf8_and_entities(string)
108     return utf8(string).gsub('&agrave;', 'à').
109                         gsub('&ccedil;', 'ç').
110                         gsub('&ocirc;',  'ô').
111                         gsub('&eacute;', 'é').
112                         gsub('&ecirc;',  'ê').
113                         gsub('&egrave;', 'è').
114                         gsub('&Egrave;', 'È').
115                         gsub('&icirc;',  'î').
116                         gsub('&lt;',     '<').
117                         gsub('&gt;',     '>').
118                         gsub('&ugrave;', 'ù').
119                         gsub('&quot;',   '"')
120 end
121
122 def parse_album_captionstxt(filepath)
123     begin
124         contents = File.open(filepath).readlines
125         out = {}
126         out[:legends] = {}
127         for line in contents
128             if line =~ /^(.*)\t(.*)\t(.*)/
129                 out[:legends][$1] = $2 + "\n" + $3
130             elsif line =~ /^(.*)\t(.*)/
131                 out[:legends][$1] = $2
132             end
133         end
134         return out
135     rescue
136         return nil
137     end
138 end
139
140 def walk_source_dir
141
142     `find #{$source} -type d`.split("\n").sort.each { |dir|
143         dir.chomp!
144         msg 2, _("Handling %s from config list...") % dir
145
146         if !infos = parse_album_captionstxt("#{dir}/captions.txt")
147             next
148         end
149
150         #- place xml document on proper node
151         xmldir = $xmldoc.elements["//dir[@path='#{utf8(dir)}']"]
152
153         #if infos.has_key?(:title)
154         #    type = find_subalbum_info_type(xmldir)
155         #    xmldir.add_attribute("#{type}-caption", utf8_and_entities(infos[:title]))
156         #end
157         
158         xmldir.elements.each { |element|
159             if %w(image video).include?(element.name)
160                 if infos[:legends].has_key?(element.attributes['filename'])
161                     element.add_attribute('caption', utf8_and_entities(infos[:legends][element.attributes['filename']]))
162                 end
163             end
164         }
165     }
166 end
167
168
169 handle_options
170
171 walk_source_dir
172
173 ios = File.open("#{$conffile}.merged", "w")
174 $xmldoc.write(ios)
175 ios.close