# HG changeset patch # User Thinker K.F. Li # Date 1301892209 -28800 # Node ID ce981aa3fbf29ea4605aeabcdc00cc92d307df51 # Parent c297ceec37f2cf152802c81a08c5336c1c15cdea Translate pathes for xlink:href attriutes to relative pathes. diff -r c297ceec37f2 -r ce981aa3fbf2 pyink/mbbbox.py --- 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 = '' % (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 = '' % (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, '' 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',