add a script to convert webalbum files containing captions to booh
[booh] / bin / webalbum2booh
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 Guillaume Cottenceau <gc3 at bluewin.ch>
14 #
15 # This software may be freely redistributed under the terms of the GNU
16 # public license version 2.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with this program; if not, write to the Free Software
20 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
22 require 'getoptlong'
23 require 'gettext'
24 include GetText
25 require 'rexml/document'
26 include REXML
27
28 require 'booh/booh-lib'
29 include Booh
30
31 #- options
32 $options = [
33     [ '--help',          '-h', GetoptLong::NO_ARGUMENT,       _("Get help message") ],
34
35     [ '--config',        '-C', GetoptLong::REQUIRED_ARGUMENT, _("File containing config listing images and videos within directories with captions") ],
36
37     [ '--verbose-level', '-v', GetoptLong::REQUIRED_ARGUMENT, _("Set max verbosity level (0: errors, 1: warnings, 2: important messages, 3: other messages)") ],
38 ]
39
40 #- default values for some globals 
41 $switches = []
42 $stdout.sync = true
43
44 def usage
45     puts _("Usage: %s [OPTION]...") % File.basename($0)
46     $options.each { |ary|
47         printf " %3s, %-15s %s\n", ary[1], ary[0], ary[3]
48     }
49 end
50
51 def handle_options
52     parser = GetoptLong.new
53     parser.set_options(*$options.collect { |ary| ary[0..2] })
54     begin
55         parser.each_option do |name, arg|
56             case name
57             when '--help'
58                 usage
59                 exit(0)
60
61             when '--config'
62                 if File.readable?(arg)
63                     $xmldoc = REXML::Document.new File.new(arg)
64                     $conffile = arg
65                 else
66                     die _('Config file does not exist or is unreadable.')
67                 end
68
69             when '--verbose-level'
70                 $verbose_level = arg.to_i
71
72             end
73         end
74     rescue
75         puts $!
76         usage
77         exit(1)
78     end
79
80     if !$xmldoc
81         die _("Missing --config parameter.")
82     end
83
84     $source = $xmldoc.root.attributes['source']
85     $dest = $xmldoc.root.attributes['destination']
86 end
87
88 def utf8_and_entities(string)
89     return utf8(string).gsub('&agrave;', 'à').
90                         gsub('&ccedil;', 'ç').
91                         gsub('&eacute;', 'é').
92                         gsub('&ecirc;',  'ê').
93                         gsub('&egrave;', 'è').
94                         gsub('&icirc;',  'î').
95                         gsub('&lt;',     '<').
96                         gsub('&gt;',     '>').
97                         gsub('&ugrave;', 'ù').
98                         gsub('&quot;',   '"')
99 end
100
101 def parse_webalbum_indextxt(filepath)
102     begin
103         contents = File.open(filepath).readlines
104         out = {}
105         out[:legends] = {}
106         legend = ''
107         for line in contents
108             if line =~ /^\s*#/
109                 next
110             elsif line =~ /^\s*TITLE\s*=\s*(.*)/
111                 out[:title] = $1
112             elsif line =~ /^\s*ABSTRACT\s*=\s*(.*)/
113                 out[:abstract] = $1
114             elsif line =~ /^\s*IMAGE_LEGEND\s*=\s*(.*)/
115                 legend = $1
116             elsif line =~ /^\s*IMAGE_FILE\s*=\s*(.*)/
117                 out[:legends][$1] = legend
118             end
119         end
120         return out
121     rescue
122         return nil
123     end
124 end
125
126 def walk_source_dir
127
128     `find #{$source} -type d`.sort.each { |dir|
129         dir.chomp!
130         msg 2, _("Handling %s from config list...") % dir
131
132         if !infos = parse_webalbum_indextxt("#{dir}/index.txt")
133             next
134         end
135
136         #- place xml document on proper node
137         xmldir = $xmldoc.elements["//dir[@path='#{utf8(dir)}']"]
138
139         if infos.has_key?(:title)
140             type = find_subalbum_info_type(xmldir)
141             xmldir.add_attribute("#{type}-caption", utf8_and_entities(infos[:title]))
142         end
143         
144         xmldir.elements.each { |element|
145             if %w(image video).include?(element.name)
146                 if infos[:legends].has_key?(element.attributes['filename'])
147                     element.add_attribute('caption', utf8_and_entities(infos[:legends][element.attributes['filename']]))
148                 end
149             end
150         }
151     }
152 end
153
154
155 handle_options
156
157 walk_source_dir
158
159 ios = File.open("#{$conffile}.merged", "w")
160 $xmldoc.write(ios, 0)
161 ios.close