Tweak shadows CSS More subtle shadows (Thanks Amaury) Remove "-webkit-box-shadow...
[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-2006 Guillaume Cottenceau <http://zarb.org/~gc/resource/gc_mail.png>
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
22 begin
23     require 'rubygems'
24 rescue LoadError
25 end
26
27 require 'getoptlong'
28 require 'gettext'
29 include GetText
30 require 'booh/rexml/document'
31 include REXML
32
33 require 'booh/booh-lib'
34 include Booh
35
36 #- options
37 $options = [
38     [ '--help',          '-h', GetoptLong::NO_ARGUMENT,       _("Get help message") ],
39
40     [ '--config',        '-C', GetoptLong::REQUIRED_ARGUMENT, _("File containing config listing images and videos within directories with captions") ],
41
42     [ '--verbose-level', '-v', GetoptLong::REQUIRED_ARGUMENT, _("Set max verbosity level (0: errors, 1: warnings, 2: important messages, 3: other messages)") ],
43 ]
44
45 #- default values for some globals 
46 $switches = []
47 $stdout.sync = true
48
49 def usage
50     puts _("Usage: %s [OPTION]...") % File.basename($0)
51     $options.each { |ary|
52         printf " %3s, %-15s %s\n", ary[1], ary[0], ary[3]
53     }
54 end
55
56 def handle_options
57     parser = GetoptLong.new
58     parser.set_options(*$options.collect { |ary| ary[0..2] })
59     begin
60         parser.each_option do |name, arg|
61             case name
62             when '--help'
63                 usage
64                 exit(0)
65
66             when '--config'
67                 if File.readable?(arg)
68                     $xmldoc = REXML::Document.new File.new(arg)
69                     $conffile = arg
70                 else
71                     die_ _('Config file does not exist or is unreadable.')
72                 end
73
74             when '--verbose-level'
75                 $verbose_level = arg.to_i
76
77             end
78         end
79     rescue
80         puts $!
81         usage
82         exit(1)
83     end
84
85     if !$xmldoc
86         die_ _("Missing --config parameter.")
87     end
88
89     $source = $xmldoc.root.attributes['source']
90     $dest = $xmldoc.root.attributes['destination']
91 end
92
93 def utf8_and_entities(string)
94     return utf8(string).gsub('&agrave;', 'à').
95                         gsub('&ccedil;', 'ç').
96                         gsub('&ocirc;',  'ô').
97                         gsub('&eacute;', 'é').
98                         gsub('&ecirc;',  'ê').
99                         gsub('&egrave;', 'è').
100                         gsub('&Egrave;', 'È').
101                         gsub('&icirc;',  'î').
102                         gsub('&lt;',     '<').
103                         gsub('&gt;',     '>').
104                         gsub('&ugrave;', 'ù').
105                         gsub('&quot;',   '"')
106 end
107
108 def parse_webalbum_indextxt(filepath)
109     begin
110         contents = File.open(filepath).readlines
111         out = {}
112         out[:legends] = {}
113         legend = ''
114         for line in contents
115             if line =~ /^\s*#/
116                 next
117             elsif line =~ /^\s*TITLE\s*=\s*(.*)/
118                 out[:title] = $1
119             elsif line =~ /^\s*ABSTRACT\s*=\s*(.*)/
120                 out[:abstract] = $1
121             elsif line =~ /^\s*IMAGE_LEGEND\s*=\s*(.*)/
122                 legend = $1
123             elsif line =~ /^\s*IMAGE_FILE\s*=\s*(.*)/
124                 out[:legends][$1] = legend
125             end
126         end
127         return out
128     rescue
129         return nil
130     end
131 end
132
133 def walk_source_dir
134
135     `find #{$source} -type d`.split("\n").sort.each { |dir|
136         dir.chomp!
137         msg 2, _("Handling %s from config list...") % dir
138
139         if !infos = parse_webalbum_indextxt("#{dir}/index.txt")
140             next
141         end
142
143         #- place xml document on proper node
144         xmldir = $xmldoc.elements["//dir[@path='#{utf8(dir)}']"]
145
146         if infos.has_key?(:title)
147             type = find_subalbum_info_type(xmldir)
148             xmldir.add_attribute("#{type}-caption", utf8_and_entities(infos[:title]))
149         end
150         
151         xmldir.elements.each { |element|
152             if %w(image video).include?(element.name)
153                 if infos[:legends].has_key?(element.attributes['filename'])
154                     element.add_attribute('caption', utf8_and_entities(infos[:legends][element.attributes['filename']]))
155                 end
156             end
157         }
158     }
159 end
160
161
162 handle_options
163
164 walk_source_dir
165
166 ios = File.open("#{$conffile}.merged", "w")
167 $xmldoc.write(ios)
168 ios.close