changeset 1404:ce981aa3fbf2

Translate pathes for xlink:href attriutes to relative pathes.
author Thinker K.F. Li <thinker@codemud.net>
date Mon, 04 Apr 2011 12:43:29 +0800
parents c297ceec37f2
children 3e80b5cf8da2 6fa411fd9549
files pyink/mbbbox.py
diffstat 1 files changed, 157 insertions(+), 111 deletions(-) [+]
line wrap: on
line diff
--- a/pyink/mbbbox.py	Sun Apr 03 22:13:37 2011 +0800
+++ b/pyink/mbbbox.py	Mon Apr 04 12:43:29 2011 +0800
@@ -1,130 +1,176 @@
+## \file
+# \brief MadButterfly with bbox.
+#
+# This module export a document with bounding box information.
+#
 import pybExtension
 
-def _print_subtree(node, lvl, out):
-    def _print_level(txt, lvl, out):
-        indent = '    ' * lvl
-        print >> out, '%s%s' % (indent, txt)
-        pass
-
-    def _print_node_open(node, lvl, out):
-        node_name = node.name()
-    
-        attrs = []
-        for attrname in node.allAttributes():
-            attrvalue = node.getAttribute(attrname)
-	    if attrname[0:13] == 'inkscape:bbox':
-	        continue
-            attr = '%s="%s"' % (attrname, attrvalue)
-            attrs.append(attr)
-            pass
-        
-        parent_node = node.parent()
-        if parent_node:
-            parent_name = parent_node.name()
-            if parent_name == 'svg:g':
-                bbox = node.getBBox()
-                attr = 'inkscape:bbox-x="%f"' % (bbox[0])
-                attrs.append(attr)
-                bbox = node.getBBox()
-                attr = 'inkscape:bbox-y="%f"' % (bbox[1])
-                attrs.append(attr)
-                bbox = node.getBBox()
-                attr = 'inkscape:bbox-width="%f"' % (bbox[2])
-                attrs.append(attr)
-                bbox = node.getBBox()
-                attr = 'inkscape:bbox-height="%f"' % (bbox[3])
-                attrs.append(attr)
+class mbbbox_ext(pybExtension.PYBindExtImp):
+    def _translate_attr(self, node, attrname, attrvalue):
+        if attrname == 'xlink:href' and attrvalue.startswith('file://'):
+            # translate to relative path
+            from os.path import relpath, dirname, realpath, abspath
+            
+            fn = abspath(attrvalue[7:])
+            fn = realpath(fn)
+            
+            doc_name = abspath(self._doc_name)
+            doc_name = realpath(doc_name)
+            doc_dir = dirname(doc_name)
+            
+            relfn = relpath(fn, doc_dir)
+            
+            if not relfn.startswith('../'):
+                attrvalue = relfn
                 pass
             pass
         
-        if attrs:
-            attrs_str = ' '.join(attrs)
-            line = '<%s %s>' % (node_name, attrs_str)
-        else:
-            line = '<%s>' % (node_name)
+        return attrname, attrvalue
+    
+    def _print_subtree(self, node, lvl, out):
+        def _print_level(txt, lvl, out):
+            indent = '    ' * lvl
+            print >> out, '%s%s' % (indent, txt)
+            pass
+        
+        def _print_node_open(node, lvl, out):
+            node_name = node.name()
+            
+            attrs = []
+            if node_name == 'svg:svg':
+                attrs.append('xmlns:dc="http://purl.org/dc/elements/1.1/"')
+                attrs.append('xmlns:cc="http://creativecommons.org/ns#"')
+                attrs.append('xmlns:rdf='
+                             '"http://www.w3.org/1999/02/22-rdf-syntax-ns#"')
+                attrs.append('xmlns:svg="http://www.w3.org/2000/svg"')
+                attrs.append('xmlns="http://www.w3.org/2000/svg"')
+                attrs.append('xmlns:xlink="http://www.w3.org/1999/xlink"')
+                attrs.append('xmlns:sodipodi="http://'
+                             'sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"')
+                attrs.append('xmlns:inkscape='
+                             '"http://www.inkscape.org/namespaces/inkscape"')
+                pass
+
+            for attrname in node.allAttributes():
+                attrvalue = node.getAttribute(attrname)
+                attrname, attrvalue = \
+                    self._translate_attr(node, attrname, attrvalue)
+                if attrname[0:13] == 'inkscape:bbox':
+                    continue
+                attr = '%s="%s"' % (attrname, attrvalue)
+                attrs.append(attr)
+                pass
+            
+            parent_node = node.parent()
+            if parent_node:
+                parent_name = parent_node.name()
+                if parent_name == 'svg:g':
+                    bbox = node.getBBox()
+                    attr = 'inkscape:bbox-x="%f"' % (bbox[0])
+                    attrs.append(attr)
+                    bbox = node.getBBox()
+                    attr = 'inkscape:bbox-y="%f"' % (bbox[1])
+                    attrs.append(attr)
+                    bbox = node.getBBox()
+                    attr = 'inkscape:bbox-width="%f"' % (bbox[2])
+                    attrs.append(attr)
+                    bbox = node.getBBox()
+                    attr = 'inkscape:bbox-height="%f"' % (bbox[3])
+                    attrs.append(attr)
+                    pass
+                pass
+            
+            if attrs:
+                attrs_str = ' '.join(attrs)
+                line = '<%s %s>' % (node_name, attrs_str)
+            else:
+                line = '<%s>' % (node_name)
+                pass
+            _print_level(line, lvl, out)
             pass
-        _print_level(line, lvl, out)
-        pass
+        
+        def _print_node_close(node, lvl, out):
+            node_name = node.name()
+        
+            line = '</%s>' % (node_name)
+            _print_level(line, lvl, out)
+            pass
+        
+        def _print_node_single(node, lvl, out):
+            node_name = node.name()
+            
+            attrs = []
+            for attrname in node.allAttributes():
+                if attrname[0:13] == 'inkscape:bbox':
+                    continue
+                attrvalue = node.getAttribute(attrname)
+                attrname, attrvalue = \
+                    self._translate_attr(node, attrname, attrvalue)
+                attr = '%s="%s"' % (attrname, attrvalue)
+                attrs.append(attr)
+                pass
     
-    def _print_node_close(node, lvl, out):
-        node_name = node.name()
-        
-        line = '</%s>' % (node_name)
-        _print_level(line, lvl, out)
+            parent_node = node.parent()
+            if parent_node:
+                parent_name = parent_node.name()
+                if parent_name == 'svg:g':
+                    bbox = node.getBBox()
+                    attr = 'inkscape:bbox-x="%f"' % (bbox[0])
+                    attrs.append(attr)
+                    bbox = node.getBBox()
+                    attr = 'inkscape:bbox-y="%f"' % (bbox[1])
+                    attrs.append(attr)
+                    bbox = node.getBBox()
+                    attr = 'inkscape:bbox-width="%f"' % (bbox[2])
+                    attrs.append(attr)
+                    bbox = node.getBBox()
+                    attr = 'inkscape:bbox-height="%f"' % (bbox[3])
+                    attrs.append(attr)
+                    pass
+                pass
+            
+            if attrs:
+                attrs_str = ' '.join(attrs)
+                line = '<%s %s/>' % (node_name, attrs_str)
+            else:
+                line = '<%s/>' % (node_name)
+                pass
+            _print_level(line, lvl, out)
+            pass
+    
+        def _print_node_content(node, lvl, out):
+            line = node.content()
+            _print_level(line, lvl, out)
+            pass
+    
+        children = node.childList()
+        if not children:
+            if node.name() != 'string':
+                _print_node_single(node, lvl, out)
+            else:
+                _print_node_content(node, lvl, out)
+                pass
+            return
+    
+        _print_node_open(node, lvl, out)
+        for child in children:
+            self._print_subtree(child, lvl + 1, out)
+            pass
+        _print_node_close(node, lvl, out)
         pass
     
-    def _print_node_single(node, lvl, out):
-        node_name = node.name()
-        
-        attrs = []
-        for attrname in node.allAttributes():
-	    if attrname[0:13] == 'inkscape:bbox':
-	        continue
-            attrvalue = node.getAttribute(attrname)
-            attr = '%s="%s"' % (attrname, attrvalue)
-            attrs.append(attr)
-            pass
-
-        parent_node = node.parent()
-        if parent_node:
-            parent_name = parent_node.name()
-            if parent_name == 'svg:g':
-                bbox = node.getBBox()
-                attr = 'inkscape:bbox-x="%f"' % (bbox[0])
-                attrs.append(attr)
-                bbox = node.getBBox()
-                attr = 'inkscape:bbox-y="%f"' % (bbox[1])
-                attrs.append(attr)
-                bbox = node.getBBox()
-                attr = 'inkscape:bbox-width="%f"' % (bbox[2])
-                attrs.append(attr)
-                bbox = node.getBBox()
-                attr = 'inkscape:bbox-height="%f"' % (bbox[3])
-                attrs.append(attr)
-                pass
-            pass
-        
-        if attrs:
-            attrs_str = ' '.join(attrs)
-            line = '<%s %s/>' % (node_name, attrs_str)
-        else:
-            line = '<%s/>' % (node_name)
-            pass
-        _print_level(line, lvl, out)
-        pass
-
-    def _print_node_content(node, lvl, out):
-        line = node.content()
-        _print_level(line, lvl, out)
-        pass
-
-    children = node.childList()
-    if not children:
-        if node.name() != 'string':
-            _print_node_single(node, lvl, out)
-        else:
-            _print_node_content(node, lvl, out)
-            pass
-        return
-
-    _print_node_open(node, lvl, out)
-    for child in children:
-        _print_subtree(child, lvl + 1, out)
-        pass
-    _print_node_close(node, lvl, out)
-    pass
-
-class mbbbox_ext(pybExtension.PYBindExtImp):
     def save(self, module, doc, filename):
+        self._doc_name = filename
         out = file(filename, 'w+')
         
+        print >>out, '<?xml version="1.0" encoding="UTF-8" standalone="no"?>'
         root = doc.rdoc.root()
-        _print_subtree(root, 0, out)
-
+        self._print_subtree(root, 0, out)
+    
         out.close()
         pass
     pass
-
+    
 
 extension = (mbbbox_ext(),
              'net.scribboo.mbbbox',