Code

utility script for producing a swatchbook of all filters
authorbuliabyak <buliabyak@users.sourceforge.net>
Thu, 5 Feb 2009 23:35:24 +0000 (23:35 +0000)
committerbuliabyak <buliabyak@users.sourceforge.net>
Thu, 5 Feb 2009 23:35:24 +0000 (23:35 +0000)
share/filters/samplify.py [new file with mode: 0644]

diff --git a/share/filters/samplify.py b/share/filters/samplify.py
new file mode 100644 (file)
index 0000000..3861112
--- /dev/null
@@ -0,0 +1,143 @@
+# This script produces a sample SVG demonstrating all filters in a filters file.
+#
+# It takes two inputs: the sample file with the object that will be cloned and filtered, and
+# the file with filters (such as Inkscape's share/filters/filters.svg).
+#
+# Run it thus:
+#
+#    python samplify.py sample.svg filters.svg > out.svg
+#
+# It requires 'inkscape' in executable path for dimension queries.
+
+import sys, os, string
+from lxml import etree
+
+if len(sys.argv) < 3:
+    sys.stderr.write ("Usage: python samplify.py sample.svg filters.svg > out.svg\n")
+    sys.exit(1)
+
+# namespaces we need to be aware of
+NSS = {
+u'sodipodi' :u'http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd',
+u'cc'       :u'http://web.resource.org/cc/',
+u'svg'      :u'http://www.w3.org/2000/svg',
+u'dc'       :u'http://purl.org/dc/elements/1.1/',
+u'rdf'      :u'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
+u'inkscape' :u'http://www.inkscape.org/namespaces/inkscape',
+u'xlink'    :u'http://www.w3.org/1999/xlink',
+u'xml'      :u'http://www.w3.org/XML/1998/namespace',
+}
+
+# helper function to add namespace URI to a name
+def addNS(tag, ns=None):
+    val = tag
+    if ns!=None and len(ns)>0 and NSS.has_key(ns) and len(tag)>0 and tag[0]!='{':
+        val = "{%s}%s" % (NSS[ns], tag)
+    return val
+
+# attributes and elements we will use, prepared with their namespace
+a_href = addNS('href', 'xlink')
+a_label = addNS('label', 'inkscape')
+e_text = addNS('text', 'svg')
+e_tspan = addNS('tspan', 'svg')
+e_flowRoot = addNS('flowRoot', 'svg')
+e_flowPara = addNS('flowPara', 'svg')
+e_flowSpan = addNS('flowSpan', 'svg')
+e_g = addNS('g', 'svg')
+e_use = addNS('use', 'svg')
+e_defs = addNS('defs', 'svg')
+e_rect = addNS('rect', 'svg')
+e_svg = addNS('svg', 'svg')
+e_switch = addNS('switch', 'svg')
+
+
+tstream = open(sys.argv[1], 'rb')
+tdoc = etree.parse(tstream)
+
+fstream = open(sys.argv[2], 'rb')
+fdoc = etree.parse(fstream)
+
+menus = []
+
+for defs in fdoc.getroot().getchildren():
+    for fi in defs.getchildren():
+        if fi.attrib[addNS('menu', 'inkscape')] not in menus:
+            menus.append(fi.attrib[addNS('menu', 'inkscape')])
+
+menu_shifts = {}
+for m in menus:
+    menu_shifts[m] = 0
+
+menus.sort()
+
+#print menus
+
+def copy_element (a):
+    b = etree.Element(a.tag, nsmap=NSS)
+    for i in a.items():
+        b.set(i[0], i[1])
+    b.text = a.text
+    b.tail = a.tail
+    return b
+
+#query inkscape about the bounding box of obj
+q = {'x':0,'y':0,'width':0,'height':0}
+file = sys.argv[1]
+id = tdoc.getroot().attrib["id"]
+for query in q.keys():
+    f,err = os.popen3('inkscape --query-%s --query-id=%s "%s"' % (query,id,file))[1:]
+    q[query] = float(f.read())
+    f.close()
+    err.close()
+
+# add some margins
+q['width'] = q['width'] * 1.3
+q['height'] = q['height'] * 1.3
+
+#print q    
+
+root = tdoc.getroot()
+tout = etree.ElementTree(copy_element(root))
+newroot = tout.getroot()
+for ch in root.getchildren():
+    chcopy = ch.__deepcopy__(-1)
+    newroot.append(chcopy)
+    if ch.tag == e_defs:
+        for defs in fdoc.getroot().getchildren():
+            for fi in defs.getchildren():
+                ficopy = fi.__deepcopy__(-1)
+                newroot.getchildren()[-1].append(ficopy)
+    if ch.tag == e_g:
+        newroot.getchildren()[-1].attrib["id"] = "original"
+        for menu in menus:
+            text = etree.Element(e_text, nsmap=NSS)
+            text.attrib['x']=str(q['x'] - q['width'] * 0.2)
+            text.attrib['y']=str( q['y'] + q['height'] * (menus.index(menu) + 1.4) )
+            text.attrib['style']="font-size:%d;text-anchor:end;" % (q['height']*0.2)
+            text.text = menu
+            newroot.append(text)
+        for defs in fdoc.getroot().getchildren():
+            for fi in defs.getchildren():
+                clone = etree.Element(e_use, nsmap=NSS)
+                clone.attrib[a_href]='#original'
+                clone.attrib["style"]='filter:url(#'+fi.attrib["id"]+')'
+                menu = fi.attrib[addNS('menu', 'inkscape')]
+                clone.attrib["transform"] = 'translate('+str( q['width'] * menu_shifts[menu] )+', '+str( q['height'] * (menus.index(menu) + 1) )+')'
+                newroot.append(clone)
+                text = etree.Element(e_text, nsmap=NSS)
+                text.attrib['x']=str( q['x'] + q['width'] * (menu_shifts[menu] + 0.5) )
+                text.attrib['y']=str( q['y'] + q['height'] * (menus.index(menu) + 1.8) )
+                text.attrib['style']="font-size:%d;text-anchor:middle;" % (q['height']*0.05)
+                text.text = fi.attrib[a_label]
+                newroot.append(text)
+
+                menu_shifts[menu] = menu_shifts[menu] + 1
+        break
+
+total_width = max(menu_shifts.values()) * q['width']    
+total_height = (len(menus) + 1) * q['height']
+tout.getroot().attrib['width'] = str(total_width)
+tout.getroot().attrib['height'] = str(total_height)
+
+print etree.tostring(tout, encoding='UTF-8')
+