diff --git a/extension/latextext.py b/extension/latextext.py index 4cc9aa5..6edb168 100755 --- a/extension/latextext.py +++ b/extension/latextext.py @@ -13,9 +13,10 @@ from lxml import etree -MAC = "Mac OS" +MAC = "Darwin" WINDOWS = "Windows" PLATFORM = platform.system() +PY3 = int(platform.python_version()[0]) >= 3 STANDALONE = False LOG_LEVEL = 3 @@ -70,7 +71,7 @@ def log_message(msg_level, *msg): print(*msg) else: for m in msg: - inkex.debug(m) + inkex.utils.debug(m) def set_log_level(l): @@ -95,9 +96,7 @@ class SvgTransformer: # matrix multiplication helper function def _matmult(self, a, b): - zip_b = zip(*b) - # uncomment next line if python 3 : - # zip_b = list(zip_b) + zip_b = list(zip(*b)) if PY3 else zip(*b) return [[sum(ele_a * ele_b for ele_a, ele_b in zip(row_a, col_b)) for col_b in zip_b] for row_a in a] @@ -227,8 +226,8 @@ def __init__(self, infile, options): self.options = options self.svg_input = infile - self.defaults = dict2obj({"scale": 1.0, "depth": 0.0, "fontsize": 10, - "preamble": "","packages": "amsmath,amssymb","math": False, + self.defaults = dict2obj({"scale": 1.0, "depth": 0.0, "fontsize": 10, + "preamble": "","packages": "amsmath,amssymb","math": False, "newline": False}) # load from file or use existing document root @@ -469,7 +468,7 @@ def run(self): if txt_empty: log_debug("Empty text element, skipping...") continue - if self.options.math and latex_string[0] is not '$': + if self.options.math and latex_string[0] != '$': latex_string = '$' + latex_string + '$' log_debug(latex_string) rendergroup = lat2svg.render(latex_string, self.options.preamble, self.options.packages, self.options.fontsize, self.options.scale) @@ -587,8 +586,18 @@ def render(self, latex_code, preamble_file=None, package_list="", fontsize=10, s # Convert PDF to SVG if PLATFORM == WINDOWS: PDF2SVG_PATH = os.path.join(os.path.realpath(EXT_PATH), 'pdf2svg') + if PLATFORM == MAC: + if os.path.exists('/opt/local/bin/pdf2svg'): + PDF2SVG_PATH = '/opt/local/bin' + elif os.path.exists('/usr/local/bin/pdf2svg'): + PDF2SVG_PATH = '/usr/local/bin' + elif shutil.which("pdf2svg"): + PDF2SVG_PATH = os.path.dirname(shutil.which("pdf2svg")) + else: + log_error('PDF2SVG_PATH not found.') else: PDF2SVG_PATH = '' + self._exec_command([os.path.join(PDF2SVG_PATH, 'pdf2svg'), os.path.join(tmp_path, 'tmp.pdf'), os.path.join(tmp_path, 'tmp.svg'), '1']) tree = etree.parse(os.path.join(tmp_path, 'tmp.svg')) @@ -607,28 +616,23 @@ def render(self, latex_code, preamble_file=None, package_list="", fontsize=10, s # Init for standalone or Inkscape extension run mode # commandline options shared by standalone application and inkscape extension -def add_options(parser): - parser.add_option("-o", "--outfile", dest="outfile", - help="write to output file or directory", metavar="FILE") - parser.add_option("-p", "--preamble", dest="preamble", - help="latex preamble file", metavar="FILE") - parser.add_option("-k", "--packages", dest="packages", - help="comma separated list of additional latex packages to be loaded", metavar="LIST") - parser.add_option("-f", "--fontsize", dest="fontsize", type="int", - help="latex base font size") - parser.add_option("-s", "--scale", dest="scale", type="float", - help="apply additional scaling") - parser.add_option("-d", "--depth", dest="depth", type="int", - help="maximum search depth for grouped text elements") - parser.add_option("-n", "--newline", dest="newline", - action="store_true", - help="insert \\\\ at every line break") - parser.add_option("-m", "--math", dest="math", - action="store_true", - help="encapsulate all text in math mode") - parser.add_option("-c", "--clean", - action="store_true", dest="clean", - help="remove all renderings") +def add_arguments(parser): + parser.add_argument("-o", "--outfile", dest="outfile", + help="write to output file or directory", metavar="FILE") + parser.add_argument("-p", "--preamble", dest="preamble", + help="latex preamble file", metavar="FILE") + parser.add_argument("-k", "--packages", dest="packages", + help="comma separated list of additional latex packages to be loaded", + metavar="LIST") + parser.add_argument("-f", "--fontsize", dest="fontsize", type=int, + help="latex base font size") + parser.add_argument("-s", "--scale", dest="scale", type=float, + help="apply additional scaling") + parser.add_argument("-d", "--depth", dest="depth", type=int, + help="maximum search depth for grouped text elements") + parser.add_argument("-c", "--clean", + action="store_true", dest="clean", + help="remove all renderings") if STANDALONE is False: @@ -636,16 +640,15 @@ def add_options(parser): class RenderLatexEffect(inkex.Effect): def __init__(self): inkex.Effect.__init__(self) - add_options(self.OptionParser) - self.OptionParser.set_conflict_handler("resolve") - self.OptionParser.add_option("-l", "--log", type='inkbool', - action="store", dest="debug", default=False, + add_arguments(self.arg_parser) + self.arg_parser.add_argument("-l", "--log", type=inkex.utils.Boolean, + dest="debug", default=False, help="show log messages in inkscape") - self.OptionParser.add_option("-n", "--newline", dest="newline", - action="store", type='inkbool', + self.arg_parser.add_argument("-n", "--newline", dest="newline", + type=inkex.utils.Boolean, help="insert \newline at every line break") - self.OptionParser.add_option("-m", "--math", type='inkbool', - action="store", dest="math", + self.arg_parser.add_argument("-m", "--math", type=inkex.utils.Boolean, + dest="math", help="encapsulate all text in math mode") def effect(self): @@ -657,39 +660,48 @@ def effect(self): # Create a standalone commandline application def main_standalone(): # parse commandline arguments - from optparse import OptionParser - parser = OptionParser(usage="usage: %prog [options] SVGfile(s)") - add_options(parser) - parser.add_option("-v", "--verbose", default=False, - action="store_true", dest="verbose") - (options, args) = parser.parse_args() - - if options.verbose is True: + import argparse + parser = argparse.ArgumentParser(conflict_handler='resolve') + add_arguments(parser) + parser.add_argument("-n", "--newline", dest="newline", + action="store_true", + help="insert \\\\ at every line break") + parser.add_argument("-m", "--math", dest="math", + action="store_true", + help="encapsulate all text in math mode") + parser.add_argument("-v", "--verbose", default=False, + action="store_true", dest="verbose") + parser.add_argument("svg", type=str, nargs='+', + metavar="FILE", + help="SVGfile(s)") + args = parser.parse_args() + + if args.verbose is True: set_log_level(log_level_debug) # expand wildcards - args = [glob.glob(arg) if '*' in arg else arg for arg in args] + files = [glob.glob(arg) if '*' in arg else arg for arg in args.svg] - if len(args) < 1: + if len(files) < 1: log_error('No input file specified! Call with -h argument for usage instructions.') sys.exit(1) - elif len(args) > 2 and options.outfile and not os.path.isdir(options.outfile): + elif len(files) > 2 and args.outfile and not os.path.isdir(args.outfile): log_error('If more than one input file is specified -o/--outfile has to point to a directory.') sys.exit(1) # main loop, run the SVG processor for each input file - for infile in args: - if options.outfile: - if os.path.isdir(options.outfile): - outfile = os.path.join(options.outfile, os.path.basename(infile)) + for infile in files: + if args.outfile: + if os.path.isdir(args.outfile): + outfile = os.path.join(args.outfile, os.path.basename(infile)) else: - outfile = options.outfile + outfile = args.outfile else: outfile = infile log_info("Rendering " + infile + " -> " + outfile) - svgprocessor = SvgProcessor(infile, options) + svgprocessor = SvgProcessor(infile, args) try: result = svgprocessor.run() @@ -708,6 +720,6 @@ def main_standalone(): if STANDALONE is False: # run the extension effect = RenderLatexEffect() - effect.affect() + effect.run() else: main_standalone() diff --git a/extension/latextext_gtk3.inx b/extension/latextext_gtk3.inx index 7a6763b..1bb5592 100644 --- a/extension/latextext_gtk3.inx +++ b/extension/latextext_gtk3.inx @@ -4,7 +4,6 @@ org.inkscape.render.latextext_gtk3 latextext.py latextext_gtk3.py - inkex.py all diff --git a/extension/latextext_gtk3.py b/extension/latextext_gtk3.py index dfcb158..f772343 100755 --- a/extension/latextext_gtk3.py +++ b/extension/latextext_gtk3.py @@ -53,7 +53,7 @@ def prepare_dialog(self, options): row_count = 0 box0 = Gtk.Box(spacing=6) - grid.attach(Gtk.Label("Preamble File"), 0, row_count, 1, 1) + grid.attach(Gtk.Label(label="Preamble File"), 0, row_count, 1, 1) self.entryPreamble = Gtk.Entry() self.entryPreamble.set_text(options.preamble) self.entryPreamble.set_hexpand(True) @@ -65,14 +65,14 @@ def prepare_dialog(self, options): grid.attach(box0, 1, row_count, 1, 1) row_count += 1 - grid.attach(Gtk.Label("Additional Packages"), 0, row_count, 1, 1) + grid.attach(Gtk.Label(label="Additional Packages"), 0, row_count, 1, 1) self.entryPackages = Gtk.Entry() self.entryPackages.set_text(options.packages) self.entryPackages.set_hexpand(True) grid.attach(self.entryPackages, 1, row_count, 1, 1) row_count += 1 - grid.attach(Gtk.Label("Document base font size"), 0, row_count, 1, 1) + grid.attach(Gtk.Label(label="Document base font size"), 0, row_count, 1, 1) self.entryFontsize = Gtk.SpinButton.new_with_range(1, 32, 1) self.entryFontsize.set_value(options.fontsize) self.entryFontsize.set_hexpand(False) @@ -82,29 +82,29 @@ def prepare_dialog(self, options): self.entryScale = Gtk.SpinButton.new_with_range(0.01, 20.0, 0.05) self.entryScale.set_digits(2) self.entryScale.set_value(options.scale) - grid.attach(Gtk.Label("Scale factor"), 0, row_count, 1, 1) + grid.attach(Gtk.Label(label="Scale factor"), 0, row_count, 1, 1) grid.attach(self.entryScale, 1, row_count, 1, 1) row_count += 1 self.entryDepth = Gtk.SpinButton.new_with_range(0, 100, 1) self.entryDepth.set_value(options.depth) - grid.attach(Gtk.Label("SVG/XML tree max. depth"), 0, row_count, 1, 1) + grid.attach(Gtk.Label(label="SVG/XML tree max. depth"), 0, row_count, 1, 1) grid.attach(self.entryDepth, 1, row_count, 1, 1) row_count += 1 - grid.attach(Gtk.Label("Add \\\\ at every line break"), 0, row_count, 1, 1) + grid.attach(Gtk.Label(label="Add \\\\ at every line break"), 0, row_count, 1, 1) self.btnNewline = Gtk.CheckButton() self.btnNewline.set_active(options.newline) grid.attach(self.btnNewline, 1, row_count, 1, 1) row_count += 1 - grid.attach(Gtk.Label("Encapsulate all text with ($..$)"), 0, row_count, 1, 1) + grid.attach(Gtk.Label(label="Encapsulate all text with ($..$)"), 0, row_count, 1, 1) self.btnMath = Gtk.CheckButton() self.btnMath.set_active(options.math) grid.attach(self.btnMath, 1, row_count, 1, 1) row_count += 1 - grid.attach(Gtk.Label("Show log messages"), 0, row_count, 1, 1) + grid.attach(Gtk.Label(label="Show log messages"), 0, row_count, 1, 1) self.btnShowLog = Gtk.CheckButton() grid.attach(self.btnShowLog, 1, row_count, 1, 1) @@ -128,10 +128,11 @@ def prepare_dialog(self, options): self.set_default(btnApply) def on_select_preamble(self, widget): - dialog = Gtk.FileChooserDialog("Please choose a Latex preamble file", self, + dialog = Gtk.FileChooserDialog(self, Gtk.FileChooserAction.OPEN, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, - Gtk.STOCK_OPEN, Gtk.ResponseType.OK)) + Gtk.STOCK_OPEN, Gtk.ResponseType.OK), + label="Please choose a Latex preamble file") dialog.set_keep_above(True) dialog.set_modal(True) response = dialog.run() @@ -174,4 +175,4 @@ def effect(self): if __name__ == "__main__": effect = RenderLatexEffectGTK3() - effect.affect() + effect.run()