[gnome-icon-theme] Benjamin's rendering script is using inkscape shell, so it's faster in that it only invokes inkscape



commit 04c65eee496e9f0ed56099a90bb874d1f33c8823
Author: Jakub Steiner <jimmac gmail com>
Date:   Mon Mar 29 16:09:02 2010 +0200

    Benjamin's rendering script is using inkscape shell, so it's faster in that it only invokes inkscape once. Also it's in python which is a) installed by default pretty much everywhere b) I hardly speak it.

 render-icon-theme.py |  149 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 149 insertions(+), 0 deletions(-)
---
diff --git a/render-icon-theme.py b/render-icon-theme.py
new file mode 100755
index 0000000..75347c5
--- /dev/null
+++ b/render-icon-theme.py
@@ -0,0 +1,149 @@
+#!/usr/bin/env python
+
+import os
+import sys
+import xml.sax
+import subprocess
+
+INKSCAPE = '/usr/bin/inkscape'
+SRC = os.path.join('.', 'src')
+
+inkscape_process = None
+
+def wait_for_prompt(process, command=None):
+    if command is not None:
+        process.stdin.write(command+'\n')
+
+    output = process.stdout.read(1)
+    output += process.stdout.read(1)
+    
+    while output != "\n>":
+        output = output[-1:]
+        output += process.stdout.read(1)
+
+def start_inkscape():
+    process = subprocess.Popen([INKSCAPE, '--shell'], bufsize=0, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
+    wait_for_prompt(process)
+    return process
+
+def inkscape_render_rect(icon_file, rect, output_file):
+    global inkscape_process
+    if inkscape_process is None:
+        inkscape_process = start_inkscape()
+    wait_for_prompt(inkscape_process, '%s -i %s -e %s' % (icon_file, rect, output_file))
+
+class ContentHandler(xml.sax.ContentHandler):
+    ROOT = 0
+    SVG = 1
+    LAYER = 2
+    OTHER = 3
+    TEXT = 4
+    def __init__(self, path, force=False):
+        self.stack = [self.ROOT]
+        self.inside = [self.ROOT]
+        self.path = path
+        self.rects = []
+        self.state = self.ROOT
+        self.chars = ""
+        self.force = force
+
+    def endDocument(self):
+        pass
+
+    def startElement(self, name, attrs):
+        if self.inside[-1] == self.ROOT:
+            if name == "svg":
+                self.stack.append(self.SVG)
+                self.inside.append(self.SVG)
+                return
+        elif self.inside[-1] == self.SVG:
+            if (name == "g" and attrs.has_key('inkscape:groupmode') and attrs.has_key('inkscape:label')
+               and attrs['inkscape:groupmode'] == 'layer' and attrs['inkscape:label'] == 'baseplate'):
+                self.stack.append(self.LAYER)
+                self.inside.append(self.LAYER)
+                self.context = None
+                self.icon_name = None
+                self.rects = []
+                return
+        elif self.inside[-1] == self.LAYER:
+            if name == "text" and attrs.has_key('inkscape:label') and attrs['inkscape:label'] == 'context':
+                self.stack.append(self.TEXT)
+                self.inside.append(self.TEXT)
+                self.text='context'
+                self.chars = ""
+                return
+            elif name == "text" and attrs.has_key('inkscape:label') and attrs['inkscape:label'] == 'icon-name':
+                self.stack.append(self.TEXT)
+                self.inside.append(self.TEXT)
+                self.text='icon-name'
+                self.chars = ""
+                return
+            elif name == "rect":
+                self.rects.append(attrs)
+
+        self.stack.append(self.OTHER)
+
+
+    def endElement(self, name):
+        stacked = self.stack.pop()
+        if self.inside[-1] == stacked:
+            self.inside.pop()
+
+        if stacked == self.TEXT and self.text is not None:
+            assert self.text in ['context', 'icon-name']
+            if self.text == 'context':
+                self.context = self.chars
+            elif self.text == 'icon-name':
+                self.icon_name = self.chars
+            self.text = None
+        elif stacked == self.LAYER:
+            assert self.icon_name
+            assert self.context
+            print '%s %s' % (self.context, self.icon_name)
+            for rect in self.rects:
+                width = rect['width']
+                height = rect['height']
+                id = rect['id']
+
+                dir = os.path.join("gnome", "%sx%s" % (width, height), self.context)
+                outfile = os.path.join(dir, self.icon_name+'.png')
+                if not os.path.exists(dir):
+                    os.mkdir(dir)
+                # Do a time based check!
+                if self.force or not os.path.exists(outfile):
+                    inkscape_render_rect(self.path, id, outfile)
+                    sys.stdout.write('.')
+                else:
+                    stat_in = os.stat(self.path)
+                    stat_out = os.stat(outfile)
+                    if stat_in.st_mtime > stat_out.st_mtime:
+                        inkscape_render_rect(self.path, id, outfile)
+                        sys.stdout.write('.')
+                    else:
+                        sys.stdout.write('-')
+                sys.stdout.flush()
+            sys.stdout.write('\n')
+            sys.stdout.flush()
+
+    def characters(self, chars):
+        self.chars += chars.strip()
+
+if len(sys.argv) == 1:
+    if not os.path.exists('gnome'):
+        os.mkdir('gnome')
+    print 'Rendering from SVGs in %s' % SRC
+    for file in os.listdir(SRC):
+        if file[-4:] == '.svg':
+            file = os.path.join(SRC, file)
+            handler = ContentHandler(file)
+            xml.sax.parse(open(file), handler)
+else:
+    file = os.path.join(SRC, sys.argv[1] + '.svg')
+    if os.path.exists(os.path.join(file)):
+        handler = ContentHandler(file, True)
+        xml.sax.parse(open(file), handler)
+    else:
+        print "Error: No such file %s" % file
+        sys.exit(1)
+
+



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]