Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- #import argparse
- import xml.etree.ElementTree as ET
- import gzip
- from zipfile import ZipFile
- def load_xml(fname):
- dot = fname.find('.')
- if dot < 0:
- ext = 'sif'
- else:
- ext = fname[dot+1:]
- if ext == 'sifz':
- with gzip.open(fname, 'r') as file_obj:
- return ET.parse(file_obj)
- elif ext == 'sfg':
- with ZipFile(fname, 'r') as arc:
- with arc.open('project.sifz', 'r') as file_obj0:
- with gzip.open(file_obj0) as file_obj:
- return ET.parse(file_obj)
- else:
- return ET.parse(fname)
- def save_xml(fname, tree):
- dot = fname.find('.')
- if dot < 0:
- ext = 'sif'
- else:
- ext = fname[dot+1:]
- if ext == 'sifz':
- with gzip.open(fname, 'w') as file_obj:
- tree.write(file_obj, 'utf-8', True)
- elif ext == 'sfg':
- files = {}
- with ZipFile(fname, 'r') as arc:
- for name in arc.namelist():
- if name != 'project.sifz':
- files[name] = arc.read(name)
- with ZipFile(fname, 'w') as arc:
- for name, data in files.items():
- arc.writestr(name, data)
- arc.writestr('project.sifz', gzip.compress(b'<?xml version="1.0" encoding="UTF-8"?>\n'+ET.tostring(tree.getroot(), 'utf-8')))
- else:
- tree.write(fname, 'utf-8', True)
- class Canvas:
- def __init__(self, fname, tree=None, element=None, parent=None, name=''):
- if tree is None:
- tree = load_xml(fname)
- if element is None:
- element = tree.getroot()
- self.fname = fname
- self.tree = tree
- self.element = element
- self.parent = parent
- self.name = name
- @classmethod
- def named(cls, name, prev=None):
- pound = name.find('#')
- if pound >= 0:
- fname = name[:pound]
- name = name[pound+1:]
- elif prev is None:
- fname = name
- name = ''
- else:
- pound = prev.find('#')
- if pound < 0:
- fname = prev
- else:
- fname = prev[:pound]
- canv = cls(fname)
- return canv.relative(name)
- def relative(self, name):
- canv = self
- tree = name.split(':')
- if len(tree[0]) == 0:
- canv = canv.root()
- tree = tree[1:]
- for branch in tree:
- canv = canv.child(branch)
- return canv
- def child(self, child_id):
- elem = self.element.find("./defs/canvas[@id='%s']" % child_id)
- if elem is None:
- defs = self.element.find("./defs")
- if defs is None:
- defs = ET.SubElement(self.element, 'defs')
- elem = ET.SubElement(defs, 'canvas', {'id': child_id})
- return Canvas(self.fname, self.tree, elem, self, self.name+':'+child_id)
- def root(self):
- return self if self.parent is None else self.parent.root()
- def copy_to(self, other, mine=None, others=None):
- if mine is None:
- mine = self.element
- if others is None:
- others = other.element
- others.text = mine.text
- others.tail = mine.tail
- for name, value in mine.items():
- if others.get(name) is not None:
- continue
- if name == 'use' and value[0] == ':':
- if value.startswith(self.name):
- value = other.name+value[len(self.name):]
- elif other.fname != self.fname:
- value = self.fname+'#'+value
- others.set(name, value)
- for el in mine:
- self.copy_to(other, el, ET.SubElement(others, el.tag))
- import sys
- src = Canvas.named(sys.argv[1])
- dest = Canvas.named(sys.argv[2], sys.argv[1])
- src.copy_to(dest)
- save_xml(dest.fname, dest.tree)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement