view pyink/mbbbox.py @ 1395:a768d74e5f49

Fix the svg:use. For a svg:use, it is a group which include the content it reference. It means that we can not tween it to its origin object directly. Instead, we need to ungroup it and then use the result matrix to generate the tweened transformation matrix. Therefore, we need to concate its matrix to the referenced object. Ad center object when the bbox-x is not available.
author wycc
date Sat, 02 Apr 2011 05:36:36 +0800
parents 4a786de1d62f
children ce981aa3fbf2
line wrap: on
line source

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)
                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_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)
            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):
        out = file(filename, 'w+')
        
        root = doc.rdoc.root()
        _print_subtree(root, 0, out)

        out.close()
        pass
    pass


extension = (mbbbox_ext(),
             'net.scribboo.mbbbox',
             'SVG with BBox exporter',
             'output',
             {'extension': '.svg',
              'mimetype': 'image/svg+xml',
              '_filetypename': 'SVG+BBox (*.svg)'})