OSDN Git Service

LinGui: rewrite my resource parser in python.
authorjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Fri, 27 Mar 2009 02:18:53 +0000 (02:18 +0000)
committerjstebbins <jstebbins@b64f7644-9d1e-0410-96f1-a4d463321fa5>
Fri, 27 Mar 2009 02:18:53 +0000 (02:18 +0000)
It's not quite ready for use because it requires python 2.6 and none
of the distributions have 2.6 yet. I'm getting a head start.

This is the first of a few tools that I'm rewriting in python
because compiling them at build time causes problems in a cross
compiling environment.

git-svn-id: svn://localhost/HandBrake/trunk@2277 b64f7644-9d1e-0410-96f1-a4d463321fa5

gtk/src/create_resources.py [new file with mode: 0644]

diff --git a/gtk/src/create_resources.py b/gtk/src/create_resources.py
new file mode 100644 (file)
index 0000000..1e346fb
--- /dev/null
@@ -0,0 +1,160 @@
+#! /bin/python
+#
+
+import gtk
+import types
+import os
+import sys
+import time
+import datetime
+import plistlib
+import getopt
+from xml.parsers import expat
+
+
+pl = dict()
+stack = list()
+stack.append(pl)
+
+def top(ss):
+       return ss[len(ss)-1]
+
+def end_element_handler(tag):
+       global stack
+
+       if tag == "section":
+               stack.pop()
+
+def start_element_handler(tag, attr):
+       global pl, stack
+
+       current = top(stack)
+       key = val = None
+       if tag == "section":
+               key = attr["name"]
+               if key == "icons":
+                       val = dict()
+                       stack.append(val)
+       elif tag == "icon":
+               fname = attr["file"]
+               fname = find_file(fname)
+               key = attr["name"]
+               if fname != None and key != None:
+                       val = dict()
+                       pb = gtk.gdk.pixbuf_new_from_file(fname)
+                       val["colorspace"] = pb.get_colorspace()
+                       val["alpha"] = pb.get_has_alpha()
+                       val["bps"] = pb.get_bits_per_sample()
+                       val["width"] = pb.get_width()
+                       val["height"] = pb.get_height()
+                       val["rowstride"] = pb.get_rowstride()
+                       val["data"] = plistlib.Data(pb.get_pixels())
+       elif tag == "plist":
+               fname = attr["file"]
+               fname = find_file(fname)
+               key = attr["name"]
+               if fname != None and key != None:
+                       val = plistlib.readPlist(fname)
+       elif tag == "string":
+               fname = attr["file"]
+               fname = find_file(fname)
+               key = attr["name"]
+               if fname != None and key != None:
+                       try:
+                               ff = open(fname)
+                               val = ff.read()
+                       except Exception, err:
+                               print >> sys.stderr, ( "Error: %s"  % str(err) )
+               
+       if val != None:
+               if type(current) == types.DictType:
+                       current[key] = val
+               elif type(current) == types.TupleType:
+                       current.append(val)
+
+
+def cdata_handler(str):
+       return
+
+def resource_parse_file(infile):
+       parser = expat.ParserCreate()
+       parser.StartElementHandler = start_element_handler
+       parser.EndElementHandler = end_element_handler
+       parser.CharacterDataHandler = cdata_handler
+       parser.ParseFile(infile)
+
+def usage():
+       print >> sys.stderr, (
+               "Usage: %s [-I <inc path>] <resource list> [resource plist]\n"
+               "Summary:\n"
+               "    Creates a resource plist from a resource list\n\n"
+               "Options:\n"
+               "    I - Include path to search for files\n"
+               "    <resource list>    Input resources file\n"
+               "    <resource plist>  Output resources plist file\n"
+               % sys.argv[0]
+       )
+
+inc_list = list()
+
+def find_file(name):
+       global inc_list
+
+       for inc_dir in inc_list:
+               inc = "%s/%s" % inc_dir, name
+               if os.path.isfile(inc):
+                       return inc
+
+       if os.path.isfile(name):
+               return name
+
+       return None
+
+def main():
+       global inc_list
+
+       OPTS = "I:"
+       try:
+               opts, args = getopt.gnu_getopt(sys.argv[1:], OPTS)
+       except getopt.GetoptError, err:
+               print >> sys.stderr, str(err)
+               usage()
+               sys.exit(2)
+
+       for o, a in opts:
+               if o == "-I":
+                       # add to include list
+                       inc_list.append(a)
+               else:
+                       assert False, "unhandled option"
+
+       if len(args) > 2 or len(args) < 1:
+               usage()
+               sys.exit(2)
+
+       try:
+               infile = open(args[0])
+       except Exception, err:
+               print >> sys.stderr, ( "Error: %s"  % str(err) )
+               sys.exit(1)
+
+       try:
+               infile = open(args[0])
+       except Exception, err:
+               print >> sys.stderr, ( "Error: %s"  % str(err) )
+               sys.exit(1)
+
+       if len(args) > 1:
+               try:
+                       outfile = open(args[1], "w")
+               except Exception, err:
+                       print >> sys.stderr, ( "Error: %s"  % str(err))
+                       sys.exit(1)
+       else:
+               outfile = sys.stdout
+
+       resource_parse_file(infile)
+       plistlib.writePlist(pl, outfile)
+
+main()
+