import uno import unohelper from com.sun.star.task import XJobExecutor import easymacro2 as app ID_EXTENSION = 'net.elmau.zaz.latex2svg' SERVICE = ('com.sun.star.task.Job',) TITLE = 'ZAZ Latex2SVG' _ = app.install_locales(__file__) TEMPLATE = """\documentclass{{article}} \\usepackage[a5paper, landscape]{{geometry}} \\usepackage{{xcolor}} \\usepackage{{amssymb}} \\usepackage{{amsmath}} \pagestyle{{empty}} \\begin{{document}} \[ {} \] \end{{document}} """ class Controllers(object): def __init__(self, dlg): self.d = dlg def cmd_preview_action(self, event): data = self.d.text.value if not data: msg = _('Write some code') app.errorbox(msg) return app.msgbox(data) return class ZAZLaTex2SVG(unohelper.Base, XJobExecutor): NAME = 'temp' _msg1 = _('Not found') _msg2 = _('Found') def __init__(self, ctx): self.ctx = ctx def trigger(self, args=''): if args == 'app': self._app() return if args == 'dlg': self._dlg() return self._from_selection() return def _app(self): result = self._msg1 if app.paths.exists_app('pdflatex'): result = self._msg2 msg = f'pdflatex = {result}\n' result = self._msg1 if app.paths.exists_app('pdfcrop'): result = self._msg2 msg += f'pdfcrop = {result}\n' result = self._msg1 if app.paths.exists_app('pdf2svg'): result = self._msg2 msg += f'pdf2svg = {result}\n\n' msg += _('Not used, if not found some application.') app.msgbox(msg) return @app.catch_exception def _dlg(self): dlg = self._create_dialog() dlg.open() return def _create_dialog(self): args = { 'Name': 'dialog', 'Title': TITLE, 'Width': 270, 'Height': 250, } dlg = app.create_dialog(args) dlg.id = ID_EXTENSION dlg.events = Controllers args = { 'Type': 'Label', 'Name': 'lbl_code', 'Label': _('Latex code'), 'Width': 70, 'Height': 15, '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': 15, 'ImageURL': 'view.png', 'ImagePosition': 1, } dlg.add_control(args) args = { 'Type': 'Button', 'Name': 'cmd_insert', 'Label': _('Insert'), 'Width': 70, 'Height': 15, 'ImageURL': 'insert.png', 'ImagePosition': 1, } dlg.add_control(args) args = { 'Type': 'Button', 'Name': 'cmd_close', 'Label': _('Close'), 'Width': 70, 'Height': 15, 'ImageURL': 'close.png', 'ImagePosition': 1, } dlg.add_control(args) dlg.text.move(dlg.lbl_code) dlg.cmd_preview.move(dlg.text, center=True) dlg.cmd_insert.move(dlg.cmd_preview) dlg.cmd_close.move(dlg.cmd_preview) controls = (dlg.cmd_insert, dlg.cmd_close) dlg.center(controls) return dlg def _from_selection(self): doc = app.active sel = doc.selection if doc.type == 'writer': sel = sel[0] data = sel.value data = TEMPLATE.format(data) dt = app.paths.dir_tmp() path_tex = app._P.join(dt.name, f'{self.NAME}.tex') path_pdf = app._P.join(dt.name, f'{self.NAME}.pdf') path_svg = app._P.join(dt.name, f'{self.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) sel = sel.offset() args = {} if doc.type == 'writer': args = {'Width': 5000, 'Height': 2000} sel.insert_image(path_svg, args) dt.cleanup() return g_ImplementationHelper = unohelper.ImplementationHelper() g_ImplementationHelper.addImplementation(ZAZLaTex2SVG, ID_EXTENSION, SERVICE)