diff --git a/renderlib.py b/renderlib.py index 5c26035..0f99adf 100644 --- a/renderlib.py +++ b/renderlib.py @@ -6,9 +6,8 @@ import re import glob import shutil import errno -import logging import subprocess -import svgtemplate +from svgtemplate import SVGTemplate from lxml import etree from urllib.request import urlopen from wand.image import Image @@ -18,10 +17,6 @@ fps = 25 debug = True args = None -cssutils.ser.prefs.lineSeparator = ' ' -cssutils.log.setLevel(logging.FATAL) - - def loadProject(projectname): sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), projectname)) return __import__(projectname) @@ -131,10 +126,10 @@ def cachedRenderFrame(frame, frameNr, task, cache): elif not skip_rendering: cache[frame] = frameNr - svgstr = svgtemplate.open(task) - svgstr = svgtemplate.replacetext(svgstr, task) - svgstr = svgtemplate.transform(svgstr, frame, task) - svgfile = svgtemplate.write(svgstr, task) + with SVGTemplate(task) as svg: + svg.replacetext() + svg.transform(frame) + svgfile = svg.write() outfile = '{0}/.frames/{1:04d}.png'.format(task.workdir, frameNr) renderFrame(svgfile, task, outfile) @@ -144,9 +139,9 @@ def cachedRenderFrame(frame, frameNr, task, cache): def rendertask_image(task): - svgstr = svgtemplate.open(task) - svgstr = svgtemplate.replacetext(svgstr, task) - svgfile = svgtemplate.write(svgstr, task) + with SVGTemplate(task) as svg: + svg.replacetext() + svgfile = svg.write() renderFrame(svgfile, task, task.outfile) def rendertask_video(task): diff --git a/svgtemplate.py b/svgtemplate.py index f774fe3..f6797b0 100644 --- a/svgtemplate.py +++ b/svgtemplate.py @@ -1,43 +1,54 @@ # vim: tabstop=4 shiftwidth=4 expandtab import builtins import cssutils +import logging import os from lxml import etree from xml.sax.saxutils import escape as xmlescape -def open(task): - with builtins.open(os.path.join(task.workdir, task.infile), 'r') as fp: - return fp.read() +cssutils.ser.prefs.lineSeparator = ' ' +cssutils.log.setLevel(logging.FATAL) -def replacetext(svgstr, task): - for key in task.parameters.keys(): - svgstr = svgstr.replace(key, xmlescape(str(task.parameters[key]))) - return svgstr +class SVGTemplate: + def __init__(self, task): + self.task = task -def transform(svgstr, frame, task): - parser = etree.XMLParser(huge_tree=True) - svg = etree.fromstring(svgstr.encode('utf-8'), parser) - # apply the replace-pairs to the input text, by finding the specified xml-elements by their id and modify their css-parameter the correct value - for replaceinfo in frame: - (id, type, key, value) = replaceinfo - for el in svg.findall(".//*[@id='" + id.replace("'", "\\'") + "']"): - if type == 'style': - style = cssutils.parseStyle(el.attrib['style'] if 'style' in el.attrib else '') - style[key] = str(value) - el.attrib['style'] = style.cssText - elif type == 'attr': - el.attrib[key] = str(value) - elif type == 'text': - el.text = str(value) - # if '$subtitle' in task.parameters and task.parameters['$subtitle'] == '': - # child = svg.findall(".//*[@id='subtitle']")[0] - # child.getparent().remove(child) - return etree.tostring(svg, encoding='unicode') + def __enter__(self): + with builtins.open(os.path.join(self.task.workdir, self.task.infile), 'r') as fp: + self.svgstr = fp.read() + return self -def write(svgstr, task): - # open the output-file (named ".gen.svg" in the workdir) - outfile = os.path.join(task.workdir, '.gen.svg') - with builtins.open(outfile, 'w') as fp: - # write the generated svg-text into the output-file - fp.write(svgstr) - return outfile + def write(self): + # open the output-file (named ".gen.svg" in the workdir) + outfile = os.path.join(self.task.workdir, '.gen.svg') + with builtins.open(outfile, 'w') as fp: + # write the generated svg-text into the output-file + fp.write(self.svgstr) + return outfile + + def replacetext(self): + for key in self.task.parameters.keys(): + self.svgstr = self.svgstr.replace(key, xmlescape(str(self.task.parameters[key]))) + + def transform(self, frame): + parser = etree.XMLParser(huge_tree=True) + svg = etree.fromstring(self.svgstr.encode('utf-8'), parser) + # apply the replace-pairs to the input text, by finding the specified xml-elements by their id and modify their css-parameter the correct value + for replaceinfo in frame: + (id, type, key, value) = replaceinfo + for el in svg.findall(".//*[@id='" + id.replace("'", "\\'") + "']"): + if type == 'style': + style = cssutils.parseStyle(el.attrib['style'] if 'style' in el.attrib else '') + style[key] = str(value) + el.attrib['style'] = style.cssText + elif type == 'attr': + el.attrib[key] = str(value) + elif type == 'text': + el.text = str(value) + # if '$subtitle' in task.parameters and task.parameters['$subtitle'] == '': + # child = svg.findall(".//*[@id='subtitle']")[0] + # child.getparent().remove(child) + self.xmlstr = etree.tostring(svg, encoding='unicode') + + def __exit__(self, exception_type, exception_value, traceback): + pass