#!/usr/bin/env python3 import easymacro as app ID_EXTENSION = '' TITLE = 'ZAZ Latex2SVG' _ = None TEMPLATE = """\documentclass{{article}} \\usepackage[a5paper, landscape]{{geometry}} \\usepackage{{xcolor}} \\usepackage{{amssymb}} \\usepackage{{amsmath}} \pagestyle{{empty}} \\begin{{document}} \\begingroup \Huge \[ {} \] \endgroup \end{{document}} """ class Controllers(object): def __init__(self, dlg): self.d = dlg self._path = '' def cmd_close_action(self, event): self.d.close() return def cmd_preview_action(self, event): code = self.d.text.value if not code: msg = _('Write some code') app.errorbox(msg) return self._path = _latex_to_svg(code) self.d.image.url = self._path return def cmd_insert_action(self, event): if not self._path: msg = _('First, generate preview') app.errorbox(msg) return attr = {} sel = app.selection if hasattr(sel, 'anchor'): attr = sel.size anchor = sel.anchor anchor.dp.remove(sel) sel = anchor image = sel.insert_image(self._path, attr) image.description = self.d.text.value self.d.close() return def validate_app(): msg1 = _('Not found') msg2 = _('Found') result = msg1 if app.paths.exists_app('pdflatex'): result = msg2 msg = f'pdflatex = {result}\n' result = msg1 if app.paths.exists_app('pdfcrop'): result = msg2 msg += f'pdfcrop = {result}\n' result = msg1 if app.paths.exists_app('pdf2svg'): result = msg2 msg += f'pdf2svg = {result}\n\n' msg += _('Not used, if not found some application.') app.msgbox(msg) return def _latex_to_svg(code): NAME = 'temp' data = TEMPLATE.format(code) dt = app.paths.dir_tmp() path_tex = app._P.join(dt.name, f'{NAME}.tex') path_pdf = app._P.join(dt.name, f'{NAME}.pdf') path_svg = app._P.join(app._P.temp_dir, f'{NAME}.svg') app.paths.save(path_tex, data) cmd = f'pdflatex --interaction=batchmode -output-directory="{dt.name}" "{path_tex}"' app.run(cmd) cmd = f'pdfcrop "{path_pdf}" "{path_pdf}"' app.run(cmd) cmd = f'pdf2svg "{path_pdf}" "{path_svg}"' app.run(cmd) if not app.paths.exists(path_svg): path_svg = '' dt.cleanup() return path_svg def from_selection(): doc = app.active sel = doc.selection data = sel.value path_svg = _latex_to_svg(data) sel = sel.offset() args = {} if doc.type == 'writer': args = {'Width': 5000, 'Height': 2000} image = sel.insert_image(path_svg, args) image.description = data return def _create_dialog(): args = { 'Name': 'dialog', 'Title': TITLE, 'Width': 270, 'Height': 260, } dlg = app.create_dialog(args) dlg.id = ID_EXTENSION dlg.events = Controllers args = { 'Type': 'Label', 'Name': 'lbl_code', 'Label': _('Latex code'), 'Width': 70, 'Height': 10, 'X': 10, 'Y': 5, 'VerticalAlign': 1, } dlg.add_control(args) args = { 'Type': 'Text', 'Name': 'text', 'Width': 250, 'Height': 75, 'MultiLine': True, 'VScroll': True, } dlg.add_control(args) args = { 'Type': 'Button', 'Name': 'cmd_preview', 'Label': _('Preview'), 'Width': 70, 'Height': 20, 'ImageURL': 'preview.svg', 'ImagePosition': 1, } dlg.add_control(args) args = { 'Type': 'Image', 'Name': 'image', 'Width': 250, 'Height': 100, } dlg.add_control(args) args = { 'Type': 'Button', 'Name': 'cmd_insert', 'Label': _('Insert'), 'Width': 70, 'Height': 20, 'ImageURL': 'insert.svg', 'ImagePosition': 1, } dlg.add_control(args) args = { 'Type': 'Button', 'Name': 'cmd_close', 'Label': _('Close'), 'Width': 70, 'Height': 20, 'ImageURL': 'close.svg', 'ImagePosition': 1, } dlg.add_control(args) dlg.text.move(dlg.lbl_code) dlg.cmd_preview.move(dlg.text, center=True) dlg.image.move(dlg.cmd_preview, center=True) dlg.cmd_insert.move(dlg.image) dlg.cmd_close.move(dlg.image) controls = (dlg.cmd_insert, dlg.cmd_close) dlg.center(controls) return dlg def from_dialog(): dlg = _create_dialog() sel = app.selection if hasattr(sel, 'description'): dlg.text.value = sel.description dlg.open() return def run(args, path_locales): global _ _ = app.install_locales(path_locales) globals()[args]() return