OSDN Git Service

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