zaz-latex2svg/source/ZAZLaTex2SVG.py

266 lines
6.1 KiB
Python
Raw Normal View History

2020-10-29 21:37:01 -06:00
import uno
import unohelper
from com.sun.star.task import XJobExecutor
2020-12-17 17:32:21 -06:00
import easymacro as app
2020-10-29 21:37:01 -06:00
ID_EXTENSION = 'net.elmau.zaz.latex2svg'
SERVICE = ('com.sun.star.task.Job',)
2020-10-30 22:22:25 -06:00
TITLE = 'ZAZ Latex2SVG'
_ = app.install_locales(__file__)
TEMPLATE = """\documentclass{{article}}
\\usepackage[a5paper, landscape]{{geometry}}
\\usepackage{{xcolor}}
\\usepackage{{amssymb}}
\\usepackage{{amsmath}}
\pagestyle{{empty}}
\\begin{{document}}
2020-11-01 23:30:58 -06:00
\\begingroup
2020-11-03 18:26:04 -06:00
\Huge
2020-10-30 22:22:25 -06:00
\[ {} \]
2020-11-01 23:30:58 -06:00
\endgroup
2020-10-30 22:22:25 -06:00
\end{{document}}
"""
2020-11-01 19:18:19 -06:00
# ~ TEMPLATE = """\documentclass{{standalone}}
# ~ \\usepackage[a5paper, landscape]{{geometry}}
# ~ \\usepackage{{xcolor}}
# ~ \\usepackage{{amssymb}}
# ~ \\usepackage{{amsmath}}
# ~ \\usepackage{{tikz}}
# ~ \pagestyle{{empty}}
# ~ \\begin{{document}}
# ~ \\begin{{tikzpicture}}
2020-11-01 19:29:17 -06:00
# ~ \\node at (0, 0) {{
# ~ \\begin{{equation*}}
2020-11-01 19:18:19 -06:00
# ~ \[ {} \]
2020-11-01 19:29:17 -06:00
# ~ \end{{equation*}}
# ~ }};
2020-11-01 19:18:19 -06:00
# ~ \end{{tikzpicture}}
# ~ \end{{document}}
# ~ """
2020-10-30 22:22:25 -06:00
class Controllers(object):
def __init__(self, dlg):
self.d = dlg
2020-11-01 23:30:58 -06:00
self._path = ''
2020-10-30 22:22:25 -06:00
2020-10-31 22:45:30 -06:00
def cmd_close_action(self, event):
self.d.close()
return
2020-10-30 22:22:25 -06:00
def cmd_preview_action(self, event):
2020-11-01 23:30:58 -06:00
code = self.d.text.value
if not code:
2020-10-30 22:22:25 -06:00
msg = _('Write some code')
app.errorbox(msg)
return
2020-11-01 23:30:58 -06:00
self._path = _latex_to_svg(code)
2020-11-03 18:26:04 -06:00
self.d.image.url = self._path
2020-10-30 22:22:25 -06:00
return
2020-10-29 21:37:01 -06:00
2020-10-31 22:45:30 -06:00
def cmd_insert_action(self, event):
2020-11-03 18:26:04 -06:00
if not self._path:
msg = _('First, generate preview')
2020-10-31 22:48:02 -06:00
app.errorbox(msg)
return
2020-11-04 16:11:44 -06:00
attr = {}
2020-11-03 18:26:04 -06:00
sel = app.selection
if hasattr(sel, 'anchor'):
2020-11-04 16:11:44 -06:00
attr = sel.size
2020-11-03 18:26:04 -06:00
anchor = sel.anchor
anchor.dp.remove(sel)
sel = anchor
2020-10-31 22:45:30 -06:00
2020-11-04 16:11:44 -06:00
image = sel.insert_image(self._path, attr)
2020-11-03 18:26:04 -06:00
image.description = self.d.text.value
2020-10-31 22:45:30 -06:00
self.d.close()
return
2020-10-29 21:37:01 -06:00
2020-11-01 23:30:58 -06:00
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
2020-10-29 21:37:01 -06:00
class ZAZLaTex2SVG(unohelper.Base, XJobExecutor):
2020-10-30 22:22:25 -06:00
NAME = 'temp'
_msg1 = _('Not found')
_msg2 = _('Found')
2020-10-29 21:37:01 -06:00
def __init__(self, ctx):
self.ctx = ctx
2020-10-30 22:22:25 -06:00
def trigger(self, args=''):
2020-10-29 21:37:01 -06:00
if args == 'app':
self._app()
return
2020-10-30 22:22:25 -06:00
if args == 'dlg':
self._dlg()
return
2020-10-29 21:37:01 -06:00
self._from_selection()
return
def _app(self):
2020-10-30 22:22:25 -06:00
result = self._msg1
2020-10-29 21:37:01 -06:00
if app.paths.exists_app('pdflatex'):
2020-10-30 22:22:25 -06:00
result = self._msg2
2020-10-29 21:37:01 -06:00
msg = f'pdflatex = {result}\n'
2020-10-30 22:22:25 -06:00
result = self._msg1
2020-10-29 21:37:01 -06:00
if app.paths.exists_app('pdfcrop'):
2020-10-30 22:22:25 -06:00
result = self._msg2
2020-10-29 21:37:01 -06:00
msg += f'pdfcrop = {result}\n'
2020-10-30 22:22:25 -06:00
result = self._msg1
2020-10-29 21:37:01 -06:00
if app.paths.exists_app('pdf2svg'):
2020-10-30 22:22:25 -06:00
result = self._msg2
2020-10-29 21:37:01 -06:00
msg += f'pdf2svg = {result}\n\n'
2020-10-30 22:22:25 -06:00
msg += _('Not used, if not found some application.')
2020-10-29 21:37:01 -06:00
app.msgbox(msg)
return
2020-11-04 16:11:44 -06:00
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
2020-10-30 22:22:25 -06:00
def _dlg(self):
dlg = self._create_dialog()
2020-11-03 18:26:04 -06:00
sel = app.selection
if hasattr(sel, 'description'):
dlg.text.value = sel.description
2020-10-30 22:22:25 -06:00
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,
2020-11-01 23:30:58 -06:00
'Height': 10,
2020-10-30 22:22:25 -06:00
'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)
2020-11-01 23:30:58 -06:00
args = {
'Type': 'Image',
'Name': 'image',
'Width': 250,
'Height': 100,
}
dlg.add_control(args)
2020-10-30 22:22:25 -06:00
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)
2020-11-01 23:30:58 -06:00
dlg.image.move(dlg.cmd_preview, center=True)
dlg.cmd_insert.move(dlg.image)
dlg.cmd_close.move(dlg.image)
2020-10-30 22:22:25 -06:00
controls = (dlg.cmd_insert, dlg.cmd_close)
dlg.center(controls)
return dlg
2020-10-29 21:37:01 -06:00
g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation(ZAZLaTex2SVG, ID_EXTENSION, SERVICE)