OSDN Git Service

LinGui: fix loading of multiple subtitles from a preset
[handbrake-jp/handbrake-jp-git.git] / gtk / src / create_resources.py
1 #! /bin/python
2 #
3
4 import gtk
5 import types
6 import os
7 import sys
8 import time
9 import datetime
10 import plistlib
11 import getopt
12 from xml.parsers import expat
13
14
15 pl = dict()
16 stack = list()
17 stack.append(pl)
18
19 def top(ss):
20         return ss[len(ss)-1]
21
22 def end_element_handler(tag):
23         global stack
24
25         if tag == "section":
26                 stack.pop()
27
28 def start_element_handler(tag, attr):
29         global pl, stack
30
31         current = top(stack)
32         key = val = None
33         if tag == "section":
34                 key = attr["name"]
35                 if key == "icons":
36                         val = dict()
37                         stack.append(val)
38         elif tag == "icon":
39                 fbase = attr["file"]
40                 fname = find_file(fbase)
41                 key = attr["name"]
42                 if fname != None and key != None:
43                         val = dict()
44                         pb = gtk.gdk.pixbuf_new_from_file(fname)
45                         val["colorspace"] = pb.get_colorspace()
46                         val["alpha"] = pb.get_has_alpha()
47                         val["bps"] = pb.get_bits_per_sample()
48                         val["width"] = pb.get_width()
49                         val["height"] = pb.get_height()
50                         val["rowstride"] = pb.get_rowstride()
51                         val["data"] = plistlib.Data(pb.get_pixels())
52                 elif fname == None:
53                         print >> sys.stderr, ( "Error: No such icon file %s" % fbase )
54                         sys.exit(1)
55         elif tag == "plist":
56                 fbase = attr["file"]
57                 fname = find_file(fbase)
58                 key = attr["name"]
59                 if fname != None and key != None:
60                         val = plistlib.readPlist(fname)
61                 elif fname == None:
62                         print >> sys.stderr, ( "Error: No such plist file %s" % fbase )
63                         sys.exit(1)
64         elif tag == "string":
65                 fbase = attr["file"]
66                 fname = find_file(fbase)
67                 key = attr["name"]
68                 if fname != None and key != None:
69                         try:
70                                 ff = open(fname)
71                                 val = ff.read()
72                         except Exception, err:
73                                 print >> sys.stderr, ( "Error: %s"  % str(err) )
74                                 sys.exit(1)
75                 elif fname == None:
76                         print >> sys.stderr, ( "Error: No such string file %s" % fbase )
77                         sys.exit(1)
78                 
79         if val != None:
80                 if type(current) == types.DictType:
81                         current[key] = val
82                 elif type(current) == types.TupleType:
83                         current.append(val)
84
85
86 def cdata_handler(str):
87         return
88
89 def resource_parse_file(infile):
90         parser = expat.ParserCreate()
91         parser.StartElementHandler = start_element_handler
92         parser.EndElementHandler = end_element_handler
93         parser.CharacterDataHandler = cdata_handler
94         parser.ParseFile(infile)
95
96 def usage():
97         print >> sys.stderr, (
98                 "Usage: %s [-I <inc path>] <resource list> [resource plist]\n"
99                 "Summary:\n"
100                 "    Creates a resource plist from a resource list\n\n"
101                 "Options:\n"
102                 "    I - Include path to search for files\n"
103                 "    <resource list>    Input resources file\n"
104                 "    <resource plist>  Output resources plist file\n"
105                 % sys.argv[0]
106         )
107
108 inc_list = list()
109
110 def find_file(name):
111         global inc_list
112
113         for inc_dir in inc_list:
114                 inc = "%s/%s" % (inc_dir, name)
115                 if os.path.isfile(inc):
116                         return inc
117
118         if os.path.isfile(name):
119                 return name
120
121         return None
122
123 def main():
124         global inc_list
125
126         OPTS = "I:"
127         try:
128                 opts, args = getopt.gnu_getopt(sys.argv[1:], OPTS)
129         except getopt.GetoptError, err:
130                 print >> sys.stderr, str(err)
131                 usage()
132                 sys.exit(2)
133
134         for o, a in opts:
135                 if o == "-I":
136                         # add to include list
137                         inc_list.append(a)
138                 else:
139                         assert False, "unhandled option"
140
141         if len(args) > 2 or len(args) < 1:
142                 usage()
143                 sys.exit(2)
144
145         try:
146                 infile = open(args[0])
147         except Exception, err:
148                 print >> sys.stderr, ( "Error: %s"  % str(err) )
149                 sys.exit(1)
150
151         if len(args) > 1:
152                 try:
153                         outfile = open(args[1], "w")
154                 except Exception, err:
155                         print >> sys.stderr, ( "Error: %s"  % str(err))
156                         sys.exit(1)
157         else:
158                 outfile = sys.stdout
159
160         resource_parse_file(infile)
161         plistlib.writePlist(pl, outfile)
162
163 main()
164