Mercurial > MadButterfly
view pyink/mbbbox.py @ 1393:2d56ed5b0995
Add exporter for export svg with bbox information.
All children of svg:g node are attributed with bbox information. It
means all graphic nodes, except top most svg:g nodes, are wroute out
with bbox information.
author | Thinker K.F. Li <thinker@codemud.net> |
---|---|
date | Wed, 30 Mar 2011 13:42:30 +0800 |
parents | |
children | 4a786de1d62f |
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) 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(): 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)'})