import uno import unohelper from com.sun.star.task import XJobExecutor import easymacro 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}} \\begingroup \Huge \[ {} \] \endgroup \end{{document}} """ # ~ TEMPLATE = """\documentclass{{standalone}} # ~ \\usepackage[a5paper, landscape]{{geometry}} # ~ \\usepackage{{xcolor}} # ~ \\usepackage{{amssymb}} # ~ \\usepackage{{amsmath}} # ~ \\usepackage{{tikz}} # ~ \pagestyle{{empty}} # ~ \\begin{{document}} # ~ \\begin{{tikzpicture}} # ~ \\node at (0, 0) {{ # ~ \\begin{{equation*}} # ~ \[ {} \] # ~ \end{{equation*}} # ~ }}; # ~ \end{{tikzpicture}} # ~ \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 _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 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 def _from_selection(self): 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 _dlg(self): dlg = self._create_dialog() sel = app.selection if hasattr(sel, 'description'): dlg.text.value = sel.description 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': 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': 15, 'ImageURL': 'view.png', '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': 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.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 g_ImplementationHelper = unohelper.ImplementationHelper() g_ImplementationHelper.addImplementation(ZAZLaTex2SVG, ID_EXTENSION, SERVICE)