commit
dfddead15b
File diff suppressed because it is too large
Load Diff
@ -1 +0,0 @@
|
||||
/home/mau/Projects/libre_office/zaz/source/easymacro2.py
|
Binary file not shown.
Binary file not shown.
@ -1,265 +1,23 @@
|
||||
import uno
|
||||
import unohelper
|
||||
from com.sun.star.task import XJobExecutor
|
||||
import easymacro2 as app
|
||||
import main
|
||||
|
||||
|
||||
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()
|
||||
main.ID_EXTENSION = ID_EXTENSION
|
||||
main.run(args, __file__)
|
||||
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)
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 3.6 KiB |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,227 @@
|
||||
#!/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
|
Loading…
Reference in new issue