def main(args): from frags.cmdopts import parse_args (setup.options, args) = parse_args(args) # fixed options setup.options.use_bbox = True setup.options.prettyXML = False input_txt = setup.options.input_txt input_svg = setup.options.input_svg output_svg = setup.options.output_svg if not input_txt: log.error("Rules file not provided, use switch -r or --rules") sys.exit(1) elif not os.path.exists(input_txt): log.error("Rules file '%s' don't exist", input_txt) sys.exit(1) if not input_svg: log.error("Input SVG file not provided, use switch -i or --input") sys.exit(1) elif not os.path.exists(input_svg): log.error("Input SVG file '%s' don't exist", input_svg) sys.exit(1) if not output_svg: log.error("Output SVG file not provided, use switch -i or --output") sys.exit(1) elif os.path.exists(output_svg) and not setup.options.frags_overwrite_file: log.error( "File %s already exists, and cannot be overwritten. Use switch -f or --force-overwrite to change this behaviour.", output_svg) sys.exit(1) # 1. Load SVG file XML = xml.dom.minidom.parse(input_svg) # 1.1. Create 'defs' tag (if doesn't exists), and add xlink namespace if not XML.getElementsByTagName('defs'): XML.documentElement.insertBefore(XML.createElement('defs'), XML.documentElement.firstChild) if not XML.documentElement.getAttribute('xmlns:xlink'): XML.documentElement.setAttribute('xmlns:xlink', "http://www.w3.org/1999/xlink") if True: # XXX: hack; for unknown reason expat do not read id attribute # and getElementById always fails ID = {} frags.collect_Id(XML, ID) def my_getElementById(id): try: return ID[id] except KeyError: return None XML.getElementById = my_getElementById # 1.2. find all text objects text_objects = {} # text -> node for node in XML.getElementsByTagName('text'): try: text = frags.get_text(node, setup.options.frags_strip) # add to list if text in text_objects: text_objects[text].append(node) else: text_objects[text] = [node] except ValueError: pass #for # 2. Load & parse replace pairs input = open(input_txt, 'r').read() from frags.parse_subst import parse repl_defs = frags.Dict() # valid defs text_nodes = set() # text nodes to remove/hide try: for item in parse(input): ((kind, value), tex, options) = item if tex is None: # i.e. "this" if kind == 'string': if setup.options.frags_strip: tex = value.strip() else: tex = value elif kind == 'id': node = XML.getElementById(value[1:]) if frags.istextnode(node): tex = frags.get_text(node) if tex is None: log.error( "Keyword 'this' is not allowed for rect/points object") continue if kind == 'string': if setup.options.frags_strip: value = value.strip() try: for node in text_objects[value]: text_nodes.add(node) repl_defs[tex] = ((kind, node), tex, options) except KeyError: log.warning( "String '%s' doesn't found in SVG, skipping repl", value) elif kind == 'id': object = XML.getElementById(value[1:]) if object: # "forget" id, save object if object.nodeName in ['rect', 'ellipse', 'circle']: repl_defs[tex] = ((kind, object), tex, options) elif object.nodeName == 'text': repl_defs[tex] = (('string', object), tex, options) else: log.warning( "Object with id=%s is not text, rect, ellipse nor circle - skipping repl", value) else: log.warning( "Object with id=%s doesn't found in SVG, skipping repl", value) else: # point, rect -- no additional tests needed repl_defs[tex] = ((kind, value), tex, options) except frags.parse_subst.SyntaxError, e: log.error("Syntax error: %s", str(e)) sys.exit(1)
def main(args): from frags.cmdopts import parse_args (setup.options, args) = parse_args(args) # fixed options setup.options.use_bbox = True setup.options.prettyXML = False input_txt = setup.options.input_txt input_svg = setup.options.input_svg output_svg = setup.options.output_svg if not input_txt: log.error("Rules file not provided, use switch -r or --rules") sys.exit(1) elif not os.path.exists(input_txt): log.error("Rules file '%s' don't exist", input_txt) sys.exit(1) if not input_svg: log.error("Input SVG file not provided, use switch -i or --input") sys.exit(1) elif not os.path.exists(input_svg): log.error("Input SVG file '%s' don't exist", input_svg) sys.exit(1) if not output_svg: log.error("Output SVG file not provided, use switch -i or --output") sys.exit(1) elif os.path.exists(output_svg) and not setup.options.frags_overwrite_file: log.error("File %s already exists, and cannot be overwritten. Use switch -f or --force-overwrite to change this behaviour.", output_svg) sys.exit(1) # 1. Load SVG file XML = xml.dom.minidom.parse(input_svg) # 1.1. Create 'defs' tag (if doesn't exists), and add xlink namespace if not XML.getElementsByTagName('defs'): XML.documentElement.insertBefore( XML.createElement('defs'), XML.documentElement.firstChild ) if not XML.documentElement.getAttribute('xmlns:xlink'): XML.documentElement.setAttribute('xmlns:xlink', "http://www.w3.org/1999/xlink") if True: # XXX: hack; for unknown reason expat do not read id attribute # and getElementById always fails ID = {} frags.collect_Id(XML, ID) def my_getElementById(id): try: return ID[id] except KeyError: return None XML.getElementById = my_getElementById # 1.2. find all text objects text_objects = {} # text -> node for node in XML.getElementsByTagName('text'): try: text = frags.get_text(node, setup.options.frags_strip) # add to list if text in text_objects: text_objects[text].append(node) else: text_objects[text] = [node] except ValueError: pass #for # 2. Load & parse replace pairs input = open(input_txt, 'r').read() from frags.parse_subst import parse repl_defs = frags.Dict() # valid defs text_nodes = set() # text nodes to remove/hide try: for item in parse(input): ((kind, value), tex, options) = item if tex is None: # i.e. "this" if kind == 'string': if setup.options.frags_strip: tex = value.strip() else: tex = value elif kind == 'id': node = XML.getElementById(value[1:]) if frags.istextnode(node): tex = frags.get_text(node) if tex is None: log.error("Keyword 'this' is not allowed for rect/points object") continue if kind == 'string': if setup.options.frags_strip: value = value.strip() try: for node in text_objects[value]: text_nodes.add(node) repl_defs[tex] = ((kind, node), tex, options) except KeyError: log.warning("String '%s' doesn't found in SVG, skipping repl", value) elif kind == 'id': object = XML.getElementById(value[1:]) if object: # "forget" id, save object if object.nodeName in ['rect', 'ellipse', 'circle']: repl_defs[tex] = ((kind, object), tex, options) elif object.nodeName == 'text': repl_defs[tex] = (('string', object), tex, options) else: log.warning("Object with id=%s is not text, rect, ellipse nor circle - skipping repl", value) else: log.warning("Object with id=%s doesn't found in SVG, skipping repl", value) else: # point, rect -- no additional tests needed repl_defs[tex] = ((kind, value), tex, options) except frags.parse_subst.SyntaxError, e: log.error("Syntax error: %s", str(e)) sys.exit(1)
# there are more then one referenco to this TeX object, so # we have to **define** it, and then reference to, with <use> eq_id = 'svgfrags-%x' % eq_id_n eq_id_n += 1 SVG.lastpage.setAttribute('id', eq_id) XML.getElementsByTagName('defs')[0].appendChild(SVG.lastpage) else: # just one reference, use node crated by SVGDocument equation = SVG.lastpage eq_id = None # process for ((kind, value), tex, options) in items: px, py = options.position if px == 'inherit': if frags.istextnode(value): px = frags.get_anchor(value) else: px = 0.0 # bounding box of equation (xmin, ymin, xmax, ymax) = SVG.lastbbox # enlarge with margin values xmin -= options.margin[0] xmax += options.margin[1] ymin -= options.margin[2] ymax += options.margin[3] # and calculate bbox's dimensions dx = xmax - xmin
# we have to **define** it, and then reference to, with <use> eq_id = 'svgfrags-%x' % eq_id_n eq_id_n += 1 SVG.lastpage.setAttribute('id', eq_id) XML.getElementsByTagName('defs')[0].appendChild(SVG.lastpage) else: # just one reference, use node crated by SVGDocument equation = SVG.lastpage eq_id = None # process for ((kind, value), tex, options) in items: px, py = options.position if px == 'inherit': if frags.istextnode(value): px = frags.get_anchor(value) else: px = 0.0 # bounding box of equation (xmin, ymin, xmax, ymax) = SVG.lastbbox # enlarge with margin values xmin -= options.margin[0] xmax += options.margin[1] ymin -= options.margin[2] ymax += options.margin[3] # and calculate bbox's dimensions dx = xmax - xmin