Advertisement
Guest User

clonecanvas.py

a guest
Apr 30th, 2015
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.40 KB | None | 0 0
  1. #!/usr/bin/env python3
  2.  
  3. #import argparse
  4. import xml.etree.ElementTree as ET
  5. import gzip
  6. from zipfile import ZipFile
  7.  
  8. def load_xml(fname):
  9.   dot = fname.find('.')
  10.   if dot < 0:
  11.     ext = 'sif'
  12.   else:
  13.     ext = fname[dot+1:]
  14.   if ext == 'sifz':
  15.     with gzip.open(fname, 'r') as file_obj:
  16.       return ET.parse(file_obj)
  17.   elif ext == 'sfg':
  18.     with ZipFile(fname, 'r') as arc:
  19.       with arc.open('project.sifz', 'r') as file_obj0:
  20.         with gzip.open(file_obj0) as file_obj:
  21.           return ET.parse(file_obj)
  22.   else:
  23.     return ET.parse(fname)
  24. def save_xml(fname, tree):
  25.   dot = fname.find('.')
  26.   if dot < 0:
  27.     ext = 'sif'
  28.   else:
  29.     ext = fname[dot+1:]
  30.   if ext == 'sifz':
  31.     with gzip.open(fname, 'w') as file_obj:
  32.       tree.write(file_obj, 'utf-8', True)
  33.   elif ext == 'sfg':
  34.     files = {}
  35.     with ZipFile(fname, 'r') as arc:
  36.       for name in arc.namelist():
  37.         if name != 'project.sifz':
  38.           files[name] = arc.read(name)
  39.     with ZipFile(fname, 'w') as arc:
  40.       for name, data in files.items():
  41.         arc.writestr(name, data)
  42.       arc.writestr('project.sifz', gzip.compress(b'<?xml version="1.0" encoding="UTF-8"?>\n'+ET.tostring(tree.getroot(), 'utf-8')))
  43.   else:
  44.     tree.write(fname, 'utf-8', True)
  45.  
  46. class Canvas:
  47.   def __init__(self, fname, tree=None, element=None, parent=None, name=''):
  48.     if tree is None:
  49.       tree = load_xml(fname)
  50.     if element is None:
  51.       element = tree.getroot()
  52.     self.fname = fname
  53.     self.tree = tree
  54.     self.element = element
  55.     self.parent = parent
  56.     self.name = name
  57.   @classmethod
  58.   def named(cls, name, prev=None):
  59.     pound = name.find('#')
  60.     if pound >= 0:
  61.       fname = name[:pound]
  62.       name = name[pound+1:]
  63.     elif prev is None:
  64.       fname = name
  65.       name = ''
  66.     else:
  67.       pound = prev.find('#')
  68.       if pound < 0:
  69.         fname = prev
  70.       else:
  71.         fname = prev[:pound]
  72.     canv = cls(fname)
  73.     return canv.relative(name)
  74.   def relative(self, name):
  75.     canv = self
  76.     tree = name.split(':')
  77.     if len(tree[0]) == 0:
  78.       canv = canv.root()
  79.       tree = tree[1:]
  80.     for branch in tree:
  81.       canv = canv.child(branch)
  82.     return canv
  83.   def child(self, child_id):
  84.     elem = self.element.find("./defs/canvas[@id='%s']" % child_id)
  85.     if elem is None:
  86.       defs = self.element.find("./defs")
  87.       if defs is None:
  88.         defs = ET.SubElement(self.element, 'defs')
  89.       elem = ET.SubElement(defs, 'canvas', {'id': child_id})
  90.     return Canvas(self.fname, self.tree, elem, self, self.name+':'+child_id)
  91.   def root(self):
  92.     return self if self.parent is None else self.parent.root()
  93.   def copy_to(self, other, mine=None, others=None):
  94.     if mine is None:
  95.       mine = self.element
  96.     if others is None:
  97.       others = other.element
  98.     others.text = mine.text
  99.     others.tail = mine.tail
  100.     for name, value in mine.items():
  101.       if others.get(name) is not None:
  102.         continue
  103.       if name == 'use' and value[0] == ':':
  104.         if value.startswith(self.name):
  105.           value = other.name+value[len(self.name):]
  106.         elif other.fname != self.fname:
  107.           value = self.fname+'#'+value
  108.       others.set(name, value)
  109.     for el in mine:
  110.       self.copy_to(other, el, ET.SubElement(others, el.tag))
  111.  
  112. import sys
  113.  
  114. src = Canvas.named(sys.argv[1])
  115. dest = Canvas.named(sys.argv[2], sys.argv[1])
  116. src.copy_to(dest)
  117. save_xml(dest.fname, dest.tree)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement