From 9b4fd81b09e36cc1b87cfcee103a9d7306e7a270 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Thu, 29 Oct 2020 21:37:01 -0600 Subject: [PATCH 01/20] Initial version only for GNU/Linux --- README.md | 10 +- VERSION | 1 + conf.py | 432 ++++ easymacro2.py | 1 + files/ZAZLaTex2SVG_v0.1.0.oxt | Bin 0 -> 52996 bytes images/logo.png | Bin 0 -> 26700 bytes source/Addons.xcu | 54 + source/META-INF/manifest.xml | 6 + source/Office/Accelerators.xcu | 4 + source/ZAZLaTex2SVG.py | 89 + source/description.xml | 26 + source/description/desc_en.txt | 1 + source/description/desc_es.txt | 1 + source/images/zazlatex2svg.png | Bin 0 -> 26700 bytes source/pythonpath/easymacro2.py | 3549 ++++++++++++++++++++++++++++ source/registration/license_en.txt | 14 + source/registration/license_es.txt | 14 + zaz.py | 785 ++++++ 18 files changed, 4986 insertions(+), 1 deletion(-) create mode 100644 VERSION create mode 100644 conf.py create mode 120000 easymacro2.py create mode 100644 files/ZAZLaTex2SVG_v0.1.0.oxt create mode 100644 images/logo.png create mode 100644 source/Addons.xcu create mode 100644 source/META-INF/manifest.xml create mode 100644 source/Office/Accelerators.xcu create mode 100644 source/ZAZLaTex2SVG.py create mode 100644 source/description.xml create mode 100644 source/description/desc_en.txt create mode 100644 source/description/desc_es.txt create mode 100644 source/images/zazlatex2svg.png create mode 100644 source/pythonpath/easymacro2.py create mode 100644 source/registration/license_en.txt create mode 100644 source/registration/license_es.txt create mode 100755 zaz.py diff --git a/README.md b/README.md index cd418e9..5d784f0 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,11 @@ # zaz-latex2svg -Compile Latex equations to SVG into LibreOffice \ No newline at end of file +Compile Latex equations to SVG into LibreOffice + +Requirements: + +* LibreOffice 7.0+ +* Python 3.7+ +* pdflatex +* pdfcrop +* pdf2svg diff --git a/VERSION b/VERSION new file mode 100644 index 0000000..6c6aa7c --- /dev/null +++ b/VERSION @@ -0,0 +1 @@ +0.1.0 \ No newline at end of file diff --git a/conf.py b/conf.py new file mode 100644 index 0000000..01db5ec --- /dev/null +++ b/conf.py @@ -0,0 +1,432 @@ +#!/usr/bin/env python3 + +# ~ This file is part of ZAZ. + +# ~ ZAZ is free software: you can redistribute it and/or modify +# ~ it under the terms of the GNU General Public License as published by +# ~ the Free Software Foundation, either version 3 of the License, or +# ~ (at your option) any later version. + +# ~ ZAZ is distributed in the hope that it will be useful, +# ~ but WITHOUT ANY WARRANTY; without even the implied warranty of +# ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# ~ GNU General Public License for more details. + +# ~ You should have received a copy of the GNU General Public License +# ~ along with ZAZ. If not, see . + + +import logging + + +# ~ Type extension: +# ~ 1 = normal extension +# ~ 2 = new component +# ~ 3 = Calc addin +TYPE_EXTENSION = 1 + +# ~ https://semver.org/ +VERSION = '0.1.0' + +# ~ Your great extension name, not used spaces or "-_" +NAME = 'ZAZLaTex2SVG' + +# ~ Should be unique, used URL inverse +ID = 'net.elmau.zaz.latex2svg' + +# ~ If you extension will be multilanguage set: True +# ~ This feature used gettext, set pythonpath and easymacro in True +# ~ You can used PoEdit for edit PO files and generate MO files. +# ~ https://poedit.net/ +USE_LOCALES = True +DOMAIN = 'base' +PATH_LOCALES = 'locales' +PATH_PYGETTEXT = '/usr/lib/python3.8/Tools/i18n/pygettext.py' +PATH_MSGMERGE = 'msgmerge' + + +# ~ Show in extension manager +PUBLISHER = { + 'en': {'text': 'El Mau', 'link': 'https://gitlab.com/mauriciobaeza'}, + 'es': {'text': 'El Mau', 'link': 'https://gitlab.com/mauriciobaeza'}, +} + +# ~ Name in this folder for copy +ICON = 'images/logo.png' +# ~ Name inside extensions +ICON_EXT = f'{NAME.lower()}.png' + +# ~ For example +# ~ DEPENDENCIES_MINIMAL = '6.0' +DEPENDENCIES_MINIMAL = '' + +# ~ Change for you favorite license +LICENSE_EN = f"""This file is part of {NAME}. + + {NAME} is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + {NAME} is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with {NAME}. If not, see . +""" +LICENSE_ES = LICENSE_EN + +INFO = { + 'en': { + 'display_name': NAME, + 'description': 'Generate equations in SVG from LaTex', + 'license': LICENSE_EN, + }, + 'es': { + 'display_name': NAME, + 'description': 'Genera ecuaciones en SVG desde LaTex', + 'license': LICENSE_ES, + }, +} + + +# ~ Menus, only for TYPE_EXTENSION = 1 +# ~ Parent can be: AddonMenu or OfficeMenuBar +# ~ For icons con name: NAME_16.bmp, used only NAME +# ~ PARENT = '' +# ~ MENU_MAIN = {} +# ~ Shortcut: Key + "Modifier Keys" +# ~ Important: Not used any shortcuts used for LibreOffice +# ~ SHIFT is mapped to Shift on all platforms. +# ~ MOD1 is mapped to Ctrl on Windows/Linux, while it is mapped to Cmd on Mac. +# ~ MOD2 is mapped to Alt on all platforms. +# ~ For example: Shift+Ctrl+Alt+T -> T_SHIFT_MOD1_MOD2 +PARENT = 'OfficeMenuBar' +MENU_MAIN = { + 'en': 'ZAZ LaTex2Svg', + 'es': 'ZAZ LaTex2Svg', +} +MENUS = ( + { + 'title': {'en': 'From selection', 'es': 'Desde selección'}, + 'argument': 'selection', + 'context': 'calc,writer,draw,impress', + 'icon': 'icon1', + 'toolbar': False, + 'shortcut': '', + }, + { + 'title': {'en': 'Validate applications', 'es': 'Validar aplicaciones'}, + 'argument': 'app', + 'context': 'calc,writer,draw,impress', + 'icon': 'icon2', + 'toolbar': False, + 'shortcut': '', + }, +) + + +# ~ Functions, only for TYPE_EXTENSION = 3 +FUNCTIONS = { + 'test': { + 'displayname': {'en': 'test', 'es': 'prueba'}, + 'description': {'en': 'My test', 'es': 'Mi prueba'}, + 'parameters': { + 'value': { + 'displayname': {'en': 'value', 'es': 'valor'}, + 'description': {'en': 'The value', 'es': 'El valor'}, + }, + }, + }, +} +# ~ FUNCTIONS = {} + +EXTENSION = { + 'version': VERSION, + 'name': NAME, + 'id': ID, + 'icon': (ICON, ICON_EXT), + 'languages': tuple(INFO.keys()) +} + + +# ~ If used more libraries set python path in True and copy inside +# ~ If used easymacro pythonpath always is True, recommended +DIRS = { + 'meta': 'META-INF', + 'source': 'source', + 'description': 'description', + 'images': 'images', + 'registration': 'registration', + 'files': 'files', + 'office': 'Office', + 'locales': PATH_LOCALES, + 'pythonpath': True, +} + + +FILES = { + 'oxt': f'{NAME}_v{VERSION}.oxt', + 'py': f'{NAME}.py', + 'ext_desc': 'desc_{}.txt', + 'manifest': 'manifest.xml', + 'description': 'description.xml', + 'idl': f'X{NAME}.idl', + 'addons': 'Addons.xcu', + 'urd': f'X{NAME}.urd', + 'rdb': f'X{NAME}.rdb', + 'update': f'{NAME.lower()}.update.xml', + 'addin': 'CalcAddIn.xcu', + 'shortcut': 'Accelerators.xcu', + 'easymacro': True, +} + + +# ~ URLs for update for example +# ~ URL_XML_UPDATE = 'https://gitlab.com/USER/PROYECT/raw/BRANCH/FOLDERs/FILE_NAME' +URL_XML_UPDATE = '' +URL_OXT = '' + + +# ~ Default program for test: --calc, --writer, --draw +PROGRAM = '--calc' +# ~ Path to file for test +FILE_TEST = '' + +PATHS = { + 'idlc': '/usr/lib/libreoffice/sdk/bin/idlc', + 'include': '/usr/share/idl/libreoffice', + 'regmerge': '/usr/lib/libreoffice/program/regmerge', + 'soffice': ('soffice', PROGRAM, FILE_TEST), + 'install': ('unopkg', 'add', '-v', '-f', '-s'), + 'profile': '/home/mau/.config/libreoffice/4/user', + 'gettext': PATH_PYGETTEXT, + 'msgmerge': PATH_MSGMERGE, +} + + +SERVICES = { + 'job': "('com.sun.star.task.Job',)", + 'addin': "('com.sun.star.sheet.AddIn',)", +} + + +FORMAT = '%(asctime)s - %(levelname)s - %(message)s' +DATE = '%d/%m/%Y %H:%M:%S' +LEVEL_ERROR = logging.getLevelName(logging.ERROR) +LEVEL_INFO = logging.getLevelName(logging.INFO) +logging.addLevelName(logging.ERROR, f'\033[1;41m{LEVEL_ERROR}\033[1;0m') +logging.addLevelName(logging.INFO, f'\x1b[32m{LEVEL_INFO}\033[1;0m') +logging.basicConfig(level=logging.DEBUG, format=FORMAT, datefmt=DATE) +log = logging.getLogger(NAME) + + +def _methods(): + template = """ def {0}(self, {1}): + print({1}) + return 'ok'\n""" + functions = '' + for k, v in FUNCTIONS.items(): + args = ','.join(v['parameters'].keys()) + functions += template.format(k, args) + return functions + + +SRV = SERVICES['job'] +XSRV = 'XJobExecutor' +SRV_IMPORT = f'from com.sun.star.task import {XSRV}' +METHODS = """ def trigger(self, args='pyUNO'): + print('Hello World', args) + return\n""" + +if TYPE_EXTENSION > 1: + MENUS = () + XSRV = f'X{NAME}' + SRV_IMPORT = f'from {ID} import {XSRV}' +if TYPE_EXTENSION == 2: + SRV = f"('{ID}',)" + METHODS = """ def test(self, args='pyUNO'): + print('Hello World', args) + return\n""" +elif TYPE_EXTENSION == 3: + SRV = SERVICES['addin'] + METHODS = _methods() + + +DATA_PY = f"""import uno +import unohelper +{SRV_IMPORT} + + +ID_EXTENSION = '{ID}' +SERVICE = {SRV} + + +class {NAME}(unohelper.Base, {XSRV}): + + def __init__(self, ctx): + self.ctx = ctx + +{METHODS} + +g_ImplementationHelper = unohelper.ImplementationHelper() +g_ImplementationHelper.addImplementation({NAME}, ID_EXTENSION, SERVICE) +""" + +def _functions(): + a = '[in] any {}' + t = ' any {}({});' + f = '' + for k, v in FUNCTIONS.items(): + args = ','.join([a.format(k) for k, v in v['parameters'].items()]) + f += t.format(k, args) + return f + + +FILE_IDL = '' +if TYPE_EXTENSION > 1: + id_ext = ID.replace('.', '_') + interface = f'X{NAME}' + module = '' + for i, P in enumerate(ID.split('.')): + module += f'module {P} {{ ' + close_module = '}; ' * (i + 1) + functions = ' void test([in] any argument);' + if TYPE_EXTENSION == 3: + functions = _functions() + + FILE_IDL = f"""#ifndef __{id_ext}_idl__ +#define __{id_ext}_idl__ + +#include + +{module} + + interface {interface} : com::sun::star::uno::XInterface + {{ +{functions} + }}; + + service {P} {{ + interface {interface}; + }}; + +{close_module} +#endif +""" + + +def _parameters(args): + NODE = """ + +{displayname} + + +{description} + + """ + line = '{}{}' + node = '' + for k, v in args.items(): + displayname = '\n'.join( + [line.format(' ' * 16, k, v) for k, v in v['displayname'].items()]) + description = '\n'.join( + [line.format(' ' * 16, k, v) for k, v in v['description'].items()]) + values = { + 'name': k, + 'displayname': displayname, + 'description': description, + } + node += NODE.format(**values) + return node + + +NODE_FUNCTIONS = '' +if TYPE_EXTENSION == 3: + tmp = '{}{}' + NODE_FUNCTION = """ + +{displayname} + + +{description} + + + Add-In + + + AutoAddIn.{name} + + +{parameters} + + """ + + for k, v in FUNCTIONS.items(): + displayname = '\n'.join( + [tmp.format(' ' * 12, k, v) for k, v in v['displayname'].items()]) + description = '\n'.join( + [tmp.format(' ' * 12, k, v) for k, v in v['description'].items()]) + parameters = _parameters(v['parameters']) + values = { + 'name': k, + 'displayname': displayname, + 'description': description, + 'parameters': parameters, + } + NODE_FUNCTIONS += NODE_FUNCTION.format(**values) + + +FILE_ADDIN = f""" + + + + +{NODE_FUNCTIONS} + + + +""" + + +DATA_MANIFEST = [FILES['py'], f"Office/{FILES['shortcut']}", 'Addons.xcu'] +if TYPE_EXTENSION > 1: + DATA_MANIFEST.append(FILES['rdb']) +if TYPE_EXTENSION == 3: + DATA_MANIFEST.append('CalcAddIn.xcu') + +DATA_DESCRIPTION = { + 'identifier': {'value': ID}, + 'version': {'value': VERSION}, + 'display-name': {k: v['display_name'] for k, v in INFO.items()}, + 'icon': ICON_EXT, + 'publisher': PUBLISHER, + 'update': URL_XML_UPDATE, +} + +DATA_ADDONS = { + 'parent': PARENT, + 'images': DIRS['images'], + 'main': MENU_MAIN, + 'menus': MENUS, +} + +DATA = { + 'py': DATA_PY, + 'manifest': DATA_MANIFEST, + 'description': DATA_DESCRIPTION, + 'addons': DATA_ADDONS, + 'update': URL_OXT, + 'idl': FILE_IDL, + 'addin': FILE_ADDIN, +} + + +with open('VERSION', 'w') as f: + f.write(VERSION) + + +# ~ LICENSE_ACCEPT_BY = 'user' # or admin +# ~ LICENSE_SUPPRESS_ON_UPDATE = True diff --git a/easymacro2.py b/easymacro2.py new file mode 120000 index 0000000..d2de111 --- /dev/null +++ b/easymacro2.py @@ -0,0 +1 @@ +/home/mau/Projects/libre_office/zaz/source/easymacro2.py \ No newline at end of file diff --git a/files/ZAZLaTex2SVG_v0.1.0.oxt b/files/ZAZLaTex2SVG_v0.1.0.oxt new file mode 100644 index 0000000000000000000000000000000000000000..092f1c2be743edca8ff3029159ba14d32988f79d GIT binary patch literal 52996 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 + + + + + + ZAZ LaTex2Svg + ZAZ LaTex2Svg + + + _self + + + + + From selection + Desde selección + + + com.sun.star.sheet.SpreadsheetDocument,com.sun.star.text.TextDocument,com.sun.star.drawing.DrawingDocument,com.sun.star.presentation.PresentationDocument + + + service:net.elmau.zaz.latex2svg?selection + + + _self + + + %origin%/images/icon1 + + + + + Validate applications + Validar aplicaciones + + + com.sun.star.sheet.SpreadsheetDocument,com.sun.star.text.TextDocument,com.sun.star.drawing.DrawingDocument,com.sun.star.presentation.PresentationDocument + + + service:net.elmau.zaz.latex2svg?app + + + _self + + + %origin%/images/icon2 + + + + + + + diff --git a/source/META-INF/manifest.xml b/source/META-INF/manifest.xml new file mode 100644 index 0000000..4d0b201 --- /dev/null +++ b/source/META-INF/manifest.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/source/Office/Accelerators.xcu b/source/Office/Accelerators.xcu new file mode 100644 index 0000000..ad7ae40 --- /dev/null +++ b/source/Office/Accelerators.xcu @@ -0,0 +1,4 @@ + + + + diff --git a/source/ZAZLaTex2SVG.py b/source/ZAZLaTex2SVG.py new file mode 100644 index 0000000..442884c --- /dev/null +++ b/source/ZAZLaTex2SVG.py @@ -0,0 +1,89 @@ +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',) + + +class ZAZLaTex2SVG(unohelper.Base, XJobExecutor): + + def __init__(self, ctx): + self.ctx = ctx + + def trigger(self, args='pyUNO'): + if args == 'app': + self._app() + return + + self._from_selection() + return + + def _app(self): + result = 'No encontrado' + if app.paths.exists_app('pdflatex'): + result = 'Encontrado' + msg = f'pdflatex = {result}\n' + + result = 'No encontrado' + if app.paths.exists_app('pdfcrop'): + result = 'Encontrado' + msg += f'pdfcrop = {result}\n' + + result = 'No encontrado' + if app.paths.exists_app('pdf2svg'): + result = 'Encontrado' + msg += f'pdf2svg = {result}\n\n' + + msg += 'No continues hasta tener las tres aplicaciones detectadas' + + app.msgbox(msg) + return + + @app.catch_exception + def _from_selection(self): + template = """\documentclass{{article}} + \\usepackage[a5paper, landscape]{{geometry}} + \\usepackage{{xcolor}} + \\usepackage{{amssymb}} + \\usepackage{{amsmath}} + \pagestyle{{empty}} + \\begin{{document}} + + \[ {} \] + + \end{{document}} + """ + doc = app.active + sel = doc.selection + if doc.type == 'writer': + sel = sel[0] + data = sel.value + + data = template.format(data) + path_tmp = '/tmp' + path_tex = '/tmp/test.tex' + path_pdf = '/tmp/test.pdf' + path_svg = '/tmp/test.svg' + + app.paths.save(path_tex, data) + cmd = f'pdflatex --interaction=batchmode -output-directory={path_tmp} {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) + + return + + +g_ImplementationHelper = unohelper.ImplementationHelper() +g_ImplementationHelper.addImplementation(ZAZLaTex2SVG, ID_EXTENSION, SERVICE) diff --git a/source/description.xml b/source/description.xml new file mode 100644 index 0000000..491b052 --- /dev/null +++ b/source/description.xml @@ -0,0 +1,26 @@ + + + + + + ZAZLaTex2SVG + ZAZLaTex2SVG + + + + + + + + + + El Mau + El Mau + + + + + + + + diff --git a/source/description/desc_en.txt b/source/description/desc_en.txt new file mode 100644 index 0000000..5ef2a95 --- /dev/null +++ b/source/description/desc_en.txt @@ -0,0 +1 @@ +Generate equations in SVG from LaTex \ No newline at end of file diff --git a/source/description/desc_es.txt b/source/description/desc_es.txt new file mode 100644 index 0000000..aac48ec --- /dev/null +++ b/source/description/desc_es.txt @@ -0,0 +1 @@ +Genera ecuaciones en SVG desde LaTex \ No newline at end of file diff --git a/source/images/zazlatex2svg.png b/source/images/zazlatex2svg.png new file mode 100644 index 0000000000000000000000000000000000000000..2f210eda94433623e613c91ad5675eb6631dd370 GIT binary patch literal 26700 zcmV)9K*hg_P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3>vvRpTkrT=3UxdhC^asW7B);p->*LM&>ieySz z)oo2ld{i)odja<|xI4m~|N1}I{p(-<3cmF0a%sJeT0Ot=$Rkev(EaDv=V$Qw{r-OK zAAc8qf834o{fo#$iJ$57zx8~dKY6_T^@5hakFVb!cWr;)r+?ol{Cwm0E9sN-g~ysU;X+2xv>~lc)t`~JSimqevh9|N?b)6Y4Y>) zdy9Ic^XHr@zsHpSef`|erTd!&T<7oC&+qRu(qGH*d7~e&HP9CP`sa?+2E-7 z;xe>z`kiO7A>n@4w7m5V?(@U{`AZv{*tYVPxpRZlug_bo68?&<^!7RV;&^KIpL_|; zzHh)1@!5ro35gx>HKY=1@GZs`0_)h>pUIUI+9Pb+pmP7<2NWGf&=Y^8CpIE3UNiDyy!x`WkC)!e{4QcHM3F zJ@&L{$$$W7)tYr1HcvQ&(#fZsdfMq{oOy}0n{K}4*4u8s+PYtM?%((AZ+6Y*gWL2rNLk35 zf{=;y<4H62DL~ZEX|tDG*5M+XZT@JRbl{p=-j$1z0GoXD+2s9@{qi_L{X_!iI!va1$5oYDORMsx+XQa`r7S=D51AWPTE-w<-iIlo`4F z!uDoD`0jX#{jhAYKl``?xP~&|!6e{-_F~{-@&#DW(Wm;kPAqweCokm8%Y6Y*#$r`U zo4GIZ$K`NN>X%j2eFWCEO(T~`1G74;@#aKv%oSE_g9V$bv0HQdTeu1GsN6V@8#kI= zSa{d#*V>7+Tz(BApoP_vX>TltO+XNjcX#qR>`f-NRj_w`g@NuWUk0>#5vb4{PY(QNSaTdMN7Kwg$Qq zeB``eq*yKs&|;NH8NK;I8tPC$n?0+a5tX0YBH0oA(3y3g&jRecp|0{ zKcSN?Mzl-T4?9FHpo&J7&N$>t1L%1pA|)Iyy@1gLN@%GHpI4l`LB4?g+;)p!JzPi$ z;0}qnI%BbIX_4nAu0@J07PJ(YhIJ|DMj{1TIQ%UUL0tRZijgT*5AL!uI5&ylm`Bff z4nBxTD2~M>U7AmG>~J$NLinA-jxJ#I6aXV%@MVn|*q&vP0N$Nk$T5UZi99t z7gLk2HD!jybW>_91w=-&2R5>E$E2QKCR^I3pfF7Bmgn<5+MnwGY1e) z&a&@~Ro$B%nNuLJ=4mlqq7^1^sBZS$gPa3lTUy>E7#x=BwjOgP@4|-e&mF0vKxZ?&f zvi-aCnb~QUhYjH-n^fT#Tou^4k+~o%K@Tb9v+g8o24vF=5v=WmhtR9dBDg}}a3Q2rs>IGp; znsaLdc?_tN%j8y_AUdx|$dC7lL<2AVE(-$SB{&kN=Y)HzeG>+3?A&KHw__`(ES}lU z;Bj7x*k5A7$Pbo@Y+}{o!guu=KvILbK{-}@!y#t~y?LX&w-IXEbl^Q4s8Y%it|$w* zS>VC1(&?Xmy5Am{3U?#|H|i}`0s{}y`v!W55<|qWzD-_^O9!C13rG$K&Jbk3UhDTL^FeAqXc5jjX&;tQP_#M`g7~+mMdy8Ny*8yC6Pe8^C8;^x^(Z3az z0C}MY91#uBmE-~811R!e6RC1X8SKl0zvB+O z-!qGr7O4k}bR{ph0F;!SQ5a|uAI1fn2kJUvKNi~v4In)L>P;f(4$1Nt?x>Y({%?>*OopvXuVt~D+e z2Ryxu9{dQcKZT$92n5}OS~phil99kDYcOytQjj+$0po)nN&9)O;7?SYyw$bwk^5B zJ=Se5Zm9Zf=`J=3V)a}LH;y6!TzbIcMqdI;I;zwNFP>!D$RrQ^h`n2+!>rDrT~ACC z9(ZS*$JN51uMjVlr9=Ifj0T_N?ZC^|3;#@y(uQo4G%J2J_n&o0pB6|*FNrSZ( zW;f&wssbBFY@vjXX*UZIOQ3l6gUd@THe?OCKpY-|6Y-A(^DH&)Anq#(3z`uzU{dAT z%Hf7yC!`1D3Ck(cCC1SWF4wS9)LLfpw|ZdWsGz9&9{K^bi}c{L@H9j8W`y!W;NfnD z${wrQf{Dxlck@#<1>`pfzx1Z;gC|1U^{km>SeQ@+wjm>0F`fVm(al@Jt>+w^ngg2% zo+1#Gz&}Ledc_II51CPyA6fA}39kn9$dt&w^z*w-asGerXTCop0USHew4(*N>odhKQ5fOlR%@~9k(#U}|L$3Dd&QeK(Z~@mr zk+2ZLni=k4yCh486oI8jB!PL517TL2ZsyS=)^@=%RYSke^3Z z5XCk9a7~;Hu@TvZ*ahT>IRtmz2pr&+yda|Cu(blW#uK>W*bsDB<-(nH1K5!@`M^?K zd3z?Rc<%CUSsIi>m5fpp4sQEL3?Z5@vo99BFSuv)g~iFPA=l8T$O_%iL{6w=p(@o@ z9y zq>*R$ME7B6n0~su*Ep=nC56n^lLvl>n=}g@~Hh62JAigM)5jr`Q$n2+0MZ zLhlHDwiEZvHmTOMa41*?kOF}vq>DHooGXxp9eH;Si&w&vNbzjHngL4%4v>+sGr$HI zyR!ajED-K|aKxjq$phF8vKgiohu%DXJqH-fq2pm|;$8`aRUowyc0>e@av-ZWxdWhq z?BP>E!ur639r+riW8pRF@#bWSyWnR4fL!|NUK~NtvV?` zdDY3ae89a!XO4)}S7Qt(-8VwoinJA8G?3tcG#4;495zWM0>xhR;II%kd^Q(eN^-#P zqfN~GQKb-)l2qfK@JCq%jhoQuLY~Qf@AB0B(1-tqckX`;jO-`2^GcMBfT(zWZFz{0 zpQi&ObL)@fW5&*2!Uz%I5k7eTgmv4B2Xx9aT!i0+ELHo0_|?t|xHLA%$h89@9lwL1 zKamM|WQiWHTu<2s7=;ukp%!$9{Na^QjnbzKo3`#r8OO~GEq4ITR(p1bc}XjAy$@8(NJ_Y~F}dJiyt$X1unj2d$`_^| zm()g>KpQy>@Bxi{Q z{1wo_!lTip$m4Ybdc=Goui4hjbF-nUWS&$TwF(NW0<2dMHu{hbq#^M|R z|BkQ*w^fa`0KYuOPyGjI!>c5a;5ekNYKOjMaXqqJEljT>J=>#-$3#xS@HiYr$zI6n zuvT>#z=PWr*9WXh_s><2_L)Q{_#i zNvkP1oKVM=l5d?&O_<}ZN;moh72qQu*4YTu3z*V~$UaDda$m%j3dT-3OmzB1&Kn_5N) zC&Ej8k%UQAYeJoBwl{?!ltZ&52~^}Tau79gw`GtA#h_MOx#}wk$kywXMNkKEz#1Vi zsvx>R+FT?OQXjfdC1|dZT?raW00`x9Lk8qv)>$$T2ESC642tkwty7=}z3{dWgE8h` zEe;&LgPoJQ4RDNYwN0nCW~#)`eNx9cV?;9g~!u`pv}2br5gdz8apLAarDmI4mR0a@$dD3-s2fP@jENoof^}Kl7rB zcRsH^AG%LSe->0ronZt=QbPs}7@ZTDjwi6;O9~*+0QF%saD<%b>?!uDiq}bO(9>#H zu;IlgJ|2C9vx2*FhJ&%2dRI&djufMT{>jG@n$Y4;Wc;>(hpSP ze)$ldMNS`qB1X5%d>qxXaG~v$4F+qq5|ovJ5cV09epERm$q=IgBiznxTB(j016Y%x z6Y$~?ewPKospDh3L^7DS#pJgvl)Y;4m=eo7yE{%p50S0xY*$-hieU@dVl=@jinx-l zYNa3tJ)1^ybPOcMTTNELB$s3k(LeRVtWbHmh0aHU5C!-?VoIoGfU|hdca0CgOe70y zmc$OrEWYg5t_)OxhmGkhN~Y8l8>JrNz%gW}Oz4U+jN$DHCWRYf|h zf#~xCsUtdiHAr9$C$6^6_T(exnFIk3ZiMFx;e~tQ{;%rJi=04-b*>D&0h_t$g+3yC zc+XyzN(Wd((flM#G5^iW3!`2PB-m<@!BS!m40m1N^4gvP|zsP2^ja&pm6hy$t?48%qhbyTZo;Sg-52?v8IQ_68z%08^WNGq}#wMcG9agCoPq0)w^w|9%w%D<0 z5CL2vxovgVhy#&feTAS-*a6&JhI(57ke5coj*#*fW=T;s7-<1)rwA4$IJF?MS?l#0 zi4Wr5(m%8fKfEn6uZzWyc65ZDc zS&zR;Eg3zveDCC)HK+i$Ab1AyN#mqm#o-79v32rj$Ft(0FO{*>6eljZ1?*j)vjNWB zXps)@@owlE0SotgJg(+Ame{dK$ARIk_cJrJ4I`MtBp^z{16X!`XnII?h4mU;Rr02` za|kRC_8VBj24KHc9l;`I(sb0EGx}(TDz}6h@OV!WMH4TBd=Lw=Xo$TQ5Uc8JN9ftM zHn@C3fJpc>aFXK(3+H1B#M|U;iO*60Xu@t;#{(KbBm5WMgus3MZG;zevLQ%>AbK#2 zDYEZeZAoAqFDIMg?y$(^Dz>k@`&ZNcILgJqZ0kJ}%0 zsZk1q<9c%fp=eeUuY3eOwoxT`kEWvgr<_!1?m6lr$>RPk}2|9%={ROJz#b5#Z)j*8~UVS>sLe4WNzn!^YmEaM!%I7vfiqdJ?TI z6>rJ))ybp|mMRCY{xDlnd5%LN90AL5n z05oY^3%jUFJt&7Qk-1%p+#egIfgQ$MORs9ICtwB7^y=dVGW{2 zbb&%|8dPEp6s0IRPXe&`YHVyn4Cv4bR$T>0aN}~HPIr|fKm}xi*JuD7*`8U~qmc-V zDJcl#=GVc>`T2P=8qV`teclyCZ%%|ZUvnd>%A;w9#=2gRzM`?PhZtDo{6v+Npt8rC zyV2Tv@vP=K&{#_`jhBW}Icwnn)i<)DVSr3B>yGPc9 zHwQ2@E~?hY(R^dol%4E-SG%o1NBE(u+6vdT#m(R`%ojD+4Ez!Z*0a{B_z zl;fXDDQWM{)ipFt18N$b+b6fPMuX&4wimh;&93=3rm?MlK1@lirif-h68hJ%>QcF< z4=i$4n_1NZwoa9Dq^9a*hCl14I5QS zM$kk9qz&#rxFj9<5ox0D0x;drs|x{0YKGuG6I-PYm=a7K<1Cc0jB_9`5qa>oyQu=? zI7;yldwNQg;53cmhgWIjMp)B?!Gnbt4xtvQLddA*2{1?=)ap(GjqtCtKYXq?e`foE zSh$01%z2`TEvO9M_*}FP?Zw@rhn=V#HkJn>`y&RIqfv5uq2Jp9jdUs z(NF#kagyR1giKBTbL@;Qw8vk<%B`yIbTB&NJO+k$0 zAo?|eU#EDvO9Vw0duS|ilYbgO>T>0!G);VIKn-KBbGxtg%T2wOI4<@kjmQftb4tiG z>=5#JsUIEGW79cGv4_TL5hh4|S!1+DR~-u=-kP8u!kWa2gRwp8Za1>mkw+Tg*8H{s zK5QZ$6g9q7Rn>^P`u&;$mW#EOHwmCYS5UAAiB1p2a~~RGL{wD``jP5L?B15<+);rS z>XXliB}P&NA;k5*JWyx9^DGGawKPaW=U=1Xc%AqJUN?kiiq}`K*CA7Ukn}rpVxzzf zqmtR6qxK%j0}Y$bq82B!gJjpSENJ$s>7bEqqNnL>3ko9U98-z_OYs?vN`&yYINu%K zDJ8G6LwDTXD_rT&-XXB>;lh);S(>3QhpX1xg79;7^?bLEtYCrAvU^70f|yrjbeswz z03z(bLuQ>P11IoeNKcj+N$Ratf;sJVb*+nC~0~(a0!uks~c}JC|me!N27<>7m zc|G9LCQz@rVSDGHv8x`iv%Q_>P2jk9pg}~%ZUGdk)3Er3;wtb%dO^O`TPZSx4K3&N3j}AjYCH z@yqgwnj-tlHH_ZTA+>ktL=&_)%W@oXnN~n!7L5W%P0Mz1G#sLNr3LM4ni?@iNP)B! zI+y==a)}g-95ci+}0R(yB3BhgkRVp5NYR26V)g%D$?5ZL44*MN- zkOmA@IS+G>MQW#O$Om9lw|K0rBCsYvG2!nFj0!xpN|s=1wvJ^Y?t(n$U20jQci0l13rU;1SJCF!Xaf@n&=e_Mq`L2PbS z4rAtCw-Ui6m5)Jb`_V6BLE-8MXZx*j?r(d4YN{dCt4i7%BROgr)~gnf2hPd0Ff`MW z-@yd9f_-H_7TO3vgceaXM36}<;QP{^n(@P4%&K?Q+-O2_5ZOG16-B@VwM)5ib%T(> zRpYKI)5US#Bx6?#3O?7|D2iw$ETQTJ*iG};b=+RwBzD#&6Qs!6oqW~%lL21COMO8> z@QDR~u&lmm_^^dHoqlzuC*_Q9qmV2a+`sT{QK6^K zHaT!~@Mvpt+@x&I zv$fhwK4&cr2}PU?!H^uD=prkm=+IM%K);&bYZ@?wAg5lB=_MP~>o650b*i(XO`#Q) zEX*(X(~VUNd8(t>>SzM3noib9U6h67iAR*E8H_^HF^BXDbU|%0Eaj)-r-GjY4;m26 z13}+qpf8K~)ck8CcT_ieov~Lu#Qn9;@XpZql|mM6rK<1SH6((nkZ^<7Og-?WYRUpk zN7OJ>l3RYI!ig2n#H5Y~?(@55bJqUSY)C5q=Bu=vKp}{_WH#jd3&V!IMBF!r0Jv>y27~@x5twSM_i_d)Hx3HXGbE4b*{W_!K^9?@Sya z5ZEuxVI#4NS6Vc#n&*LI>V}jTg#Fd{5Dhx%5#yUMS8YZn1y0r25Q6qxvH{`6iw1HX zO{r6oBobZ%>OTUWf6`INCMZC2BXUDHIK&W(R4$Z+%E>_!UBvI+NyFJ{8eW~ABCVy< z*{c2_EHalcMzQe{)X)Py9fdWG#CiY|+S5clk*==}*y>P5jZLbggIiprxaJ%hpFP9H z)HGEDPu9^we!gQ;8b(!#{sw~R%5k7IFfH7|={)8sBK>9<}8Ui7suE+yHn!y>&ve-l5t`nTsAqUv3b9CxOr(}s2or_1w5~V|j zSpzBW(JuB%8j=I5>8bXpMt4@#Y~A4&A;A`3|`d>}Py*Xae$3pI%ZQBp@d>kFJ9++|&i~b$T=k zb-)jYASyR&YF{-H0)D;PV3$o$1s|joo}mm7DZU%(OEb?+$M-)6-5Xaso70euPU=DM zzzB9&gKT|}A#k%}RLO zkYLZiTSXh7epC+Inh6HIh*_Qf)dV|K9+p$r!8c@nN?1(Lg#@&!1ONQXj*xCs1L(Zd zlBU6$pxQP@scf!M{R5qBHJ4S;QVX-JtHD)pqO~^yqAxFKNM(<;FydB4Kz$ES3M!Fu z^Olob(qJX0q1gDqsuMPta~e#lEO0FlK;QSQd06L{2>TNhKM$ccq8KoW>ZN_Erm%KqAuBgYy|OC>fhi-vp#|~GL6S!RRd~!XhIJMMn39HR4z?*6E*>OO~3~6 zw~5~QnlUg^Z2G<LByLIwqa;0u7czi^vsy^1(XeskYLV5l3ns zRp6S)3c=3egCS(0%A5jujVS5M4>F=Wp%mYs&xKqNFo+b>**CB29to)oEC5Wa0=4f@ zT!4x2u;ly#vskaV$ANqwRN--krkh~rHxk9xB6{_89#sRh?8g3l-M2bD@ zt7M>nGc*yZgHxJ(G?`;KgiS$)zncVqHn4^aGkwn!7EDS?59k0YCKru~tsYnrpi*ZG zKuFKuI!!#jnlCTso(y4HOr<=1e@CcO6|btV-_Z9X#G!FUk1(_W_v>JcS0i-f!WE4v z+D(T9M4U+yLb3Wn5uISir7IC)QiBVf2N!VNTaLptEUF_xI29bE0k1koYnpz16=`4s z%4fl4*jpq8kvSSK=03_hJDbTi^p2Q71FhuUoCx*;K(B}x0dP$xpMnW($$%Rp8d>Mr zo9?9QTT#?|0D?btRvq~pW5QP`wl|u_3h+)CjilQyboxj zgZg}0)A1S>Zx$3AYFAXrt>*PiFp<8RP9F}{hkzin_P(|Sh$rP#spMloMdFwMS(;3- z`I(54Wk2nxP3cJzL@EY^yOeCv>A?Fr*zbkoYtGiAPDzj|MMJQW z*A&_c9HA4G@{2#&^{D%B$9zMvLbwdv&d2O(6Y%EkxH@ z=qe5S2sp{#DH2ELkaDn)zV-$lXh&`-OG2RLH=25AY6Vy&eH^w;vz9>zoU8OMVntsO zv6n}!W+?*Oswow9+3(WVBf-%gyOc^LI0mkoG;%-#)Tv2_qj8RkT;bAj-dnY!Bk52M z*jxg9e{{49N~pj+c1=g(-%*fIuM4qaPUBFSOWhA?E7G_ueZdx=jr!9O|Abcv{LptQ zX%H23VGT7AAIMEuStG-#Yj3$$wCGI)tcEKQo%&ZZ_Df$lfY{J?grW7O=D32U6cRgz zwn3aDkFg5*>idS?cU5>99DS$ORe$k)1JmcEg}xO=#*K{*5P=T;TC6(Uel%BttkFaZ zu^al(*Q89aU}9d{J9Y=AG~&A~m6VGP_l|qI&WjwMv#JaD2~wFg#)^8`$*%A90ODXc z6vfpMNp9td@kDSXpx3Jkw2pc<7$LApU84ws_(H5hkfJxJY!-c08WN3wmNtH8S7a7E z#@^o9kEuR!1!cB+tk~p47K>+Kk?Rg=kL7EfAEsd>^(#A@wXpR~-3pBf`_~J&8D{}2 z@f@^>q!aIeQdXbJ{Wm3Li3P*U+a>@20fcEoLr_UWLm+T+Z)Rz1WdHzpoPCi!NW(xJ z#a}<9DisF{ia2DbPF6%k9JLBXs1Ry}Rvk<({emV9Ns5c3;979-W3lSs;;gHKs~`w| zfVj9iDY{6B|4RxjVmvtR$GdxvyLW)UUS_Hp90yd*GE#}SkjbtJp;vSvgno=6C^1u? z6U8Jv$Jaf4e7%eDEbnuFjvggvGQcMg&obSxh&PC*H!Yp>K5>KfMlwl!8t44~66z#`7{DY2PB$rIC5*RraP=N}`@q_=t?{3Zfv%OftgRzYb`B$1oUnL7uPLK-UBXofPp7n zG9*U|(Ddi?!220}Qx@pE1-jSV-kSS3eE`zbRq_TnI0Qxtl)dip?#}k!{yo#|?*~RV za+L`>{<8o800v@9M??Vs0RI60puMM)00009a7bBm000N(000N(0phfhS^xk52XskI zMF-;v2Ny0F&B49P001BWNkl$6%~*o$fYSQ^d1PwCcE?g{&;7SNeB=iKo<5q z&pz4A%uadd{l2H4BT6X(bmLG<5%L1KTrPaRVn7X`GjJae4;%$H0gHfN5cvnC&cp%l z{rW3+)~y>DLzu@TJ8qG6LZ^Ab=Z)u>LwJ4rr=iV_4OyjM%UtFt7oD_&>c; zqXr3U*COx$FcZk{*c}f{2Ic@;EP#Xo1%aACFQB;Ncn{DHn4Yh3V+Q^3LjWKFfcQ7X zhyauawmLQ^0v`Zx10(~VI^Oe3ciu_jpMN6y-=~1_8AP!*CQL2ax;1Z3of-g0fc%qs z)U8Xx@4w#)tO2c?13Q36fvp*V;iMBsk22u?`|q>BQ!V~IKUAP)KI4BE8D(()>lZwVD#R-6m8iOpf!+U?J5H_uXdA<^EClT{K=C% zDneTk+K3<`B%C=DnB`Ya(;eSGQLuBIQuG-={*q5LV8#r91D5WRY6B3L%e`jVvVe$n zHK~ILhDctNdKhg^Tn?}Y_&y-wUHVHCAsXrczk;P}i-dZW@_cdyDqA;h49xmVpzc+w06dWj z4j7J7o(VqR6`gm2QkY3e3K-&;ADty2VqHCoF%0ne$^%Utn+pKbR6;_0(#DNn4Xs+W zbBxICF(Sl>&_RSR$Bqpk;XIVQXO95&9GgBcEq&rjDbM})V{s<0wdt0C4stcc0gHQ| zXLqEv5{?4?1P%c`4G8+Fb7x)@;ZGep5g?1+eg1irX@VB90RF)+PWH?u&-aIm7he}W z^`=(REenfHtI;0ZuYiLN92wSXH5f=1_$dfFjjmItM2ra0BJ>CZ(y@EW6x8X{<$z#o z)1SCp$rY+r%~r`c0FZ0+@D`sQiT3US)B@fB-bLhA;4UCDcWonJ4BA8dl|Ye%-+xC$ znECO?H?M-O{}gd-I_ybFF|+wHrUN7afLu*_=BuwT;TRBuj(WhdkgP(fr-1c98|&Ra z1&*0)4Nflo8`SlIldP&|%uUfKP!Z1wv2$ z{BtT;YRL_4dkJ!UcV7hqtQi2vHGFub6osF70;R(jDg#R$5<`6;QQ#SXls$XM+o;hQ z1si~StmCI!9K@zjAP-OqcmW;7nrMMlWD56ZecJ!GrApnqT^^&9Y*HYH%U(2yO1-M(m z8mISm*0^yjjEPCNk_z094z9Z!D2ld%<-demISxz%z6N%AVYeG-F>@vlJ^5sgeQ6zY zW~&B-m6cW&BO(O}{SkrBaGq4H}?eH-=H) zQqrCBbw5F8%GvZ}bTqL_5vvrX+qSjMEK7j?z=Md?0`3IvKqvjoK!>$li1Gp5(dSv~ zhIK%_ubz5}_97hEyEkXPw5TYBcIIgjNU1u}+53Vb)6ET~Qj)nj>AHuzcP(3%lz;vK zsB7sa!Io%LUcvrb+qchh@ZHLV3n^N5B!vgPdAG-}>FJ4CGdz|YpZSPRs6anT~` zG;A0E$n~HpAAQ6xefqfY`3|6ycR)v$)&lm0*Q&*^%kZeroic^bo`0Sw(t?&8a$YD( z6$5TZ8wgruI4l`h1@v)R(}F8hVC0r9*If^Z)<9ne*b2Iw1*T@h`-~B334CFV$A>`g z*qbz1F~=lKIZ{X00pZr>1fVH~@hhg8qJYCd_c?QD*sK{M!j;_ryU#z*?kQ6=Dh$Jg zX^uhXS7gRjW?0s=wTQ$krA~{b3(W`OuJJfp<8>Mxt^;tNf@R~f2OzdTN`QgDo3Vjt z-s?+Y)vJT{ZPc<}yq2$FDW>@w&{v>zAz()H=Gs(iO_a{Xi(l3?`%RwAIHh=CneTlWd{$9Civ_WFP_PqG0lPOZmTIo#?jPNcsD35Q#*ou|Q+Axica& zNzI~T)@1z{k-bW(1c2SZf~zpT$~5Wda$y15woT74;py?&!$Df09kK>66nHhjL2?L1 z)~kntLx_|{7e70e$zi!29A=Who6$h0LWQpQ`lEL2V5G-`QtAxw94=Q8pf>P0I#1%S zOn#OhcnSC)O05Qg-bEco`UGZGIN`JOB`X zyYVz{{Fmq`V4FS$IvoJU?%YYS(xtEZy~GX}!0P}0*S5D7utc91IJdm##VFAd<(}mH zNoE;o6NXWvNQ)N9Z+-dYW!?X$@4wH|zJ1AEr3y(KH#P)jkydBxHXr;wApj8nq9X?m zFrapAe7c^~7@(7blgyFu@F#p{&#G#D`p{+2plfnZuibYarj!jz-sZp{`o3s5U zO$q?SU&*q34YNc8o3)qo3=PqCfhA|e?^yPc#AqFj2 z5CDk3Q^M)f^oWWAco0~aQIY^!C`hc)zdtc=zn!D*{qTVUR4rPR79~pHJ9Nm9s3;YG z^r)JWqKh25-0p0@=KkHgd0XpeuLJKoxNfz7luG;wIIwpwg)h?y8vsZSq%NgPQ?btPO zB4`WS|5=;k(aCEkZSUm-vL|#W0FWF^BYN~;)39N;2E^=r*I%#Su zA`4OKbgugKd9ZtT9`?gx7Xg4|fu;=`#?L)^q?%ntN9^W9n^qfJpUfg22LS)A_|i+f zGJLpSk3q+X2vKLxer+uhS*19%rR!rKy2y0^AU6U1IBOQ;pL&XX={JX=9cO*f4Qg!P z+{cLYK&ixAnlTG!R>J0ni55Ic0&c%x1+pl%>TRU{1_qcKA9P?qvj{F@PoB9)U=c&jH zhwVj&!|XsuE$l!S2Rw{n9JbS>w*gE1H7GU!kn__U&6;s&?pzGG7oB38%dvYCI`(T3 zKt%1@4E_E08|wMzO`Aqk{`^dD+7xuC{#vr;J3E3dAFvi}FqS0!p=ML%+$B0|2=Z zX!78}{L-tJ9d7=A=(fqZ9joUY;PIO+`)=irKk`ZA#<)lqieCX;RN^@__sz&*HUX_M zj4jGEJv9al;NIrVsZ_0603iNML%Mcl@sB?blyjbV0t&0_9?YgN+U%%*Y{nT!4dI0a;GBdRXD} z=>CemVgqA(4)uNbVU8_W;7mtug)Y!nz=}>&PWKM&A z_#u_6+&gsW0aGjL1<^jHv-X0GE?BV%m?KcQV`!++UWAq+Ed2WG06_eZoGakbl)!jg zl>YO|D>R!rm5|DnZLV7mU9!pRIII~Er#zm|T+l49NcgN4Er=0eaOci!TC*k~V&!zQ zibV{xLX+wvy^wn1}w7GaX@bB{+x(pbK+dVgTg9d8w;>CEqUR*BM zRlBzU2f1>xtJ9fSITQi9G-}K^xr0OUqV3VtG;Vy{SI!eY?UwJLg9S1z?jf1&RRN3N#Is=aX_aC8)=DT>+`^qb_JtoALc;*@UfA(1bAlH+u^ws;& zl~TaUJoHyThz0o8==#7OON5C7jyfccV07uzThJD~ThO}0cW9^Sb{kw-?b)(==~71D ze}B533+X@tj7d($9Tdc*4?f`6K7H(6ozcZ7Dmo5N1frF$M#(LYKFYh_etX$t;tovn zE2i9z?>LIs>9YN*#bcnPzGJRu55;d zCNp~90>KUij7&@sJH);; z&SV&FOfv=;l|eUIgGghg)XB(8Ol%7PRo*3wT3l6h{3P4SM;X-oIvJ<6FTA-dm`c@8!Kx^FYZ%%o=z9(a2c``aW0FbLigFAO-$Jnu0 zFQ@>z>r?eurFQz$bG#rz2>grm=F_4+IB+TDeTMhw!Ny_3(v(`=HZHf7SQTPT^upHn z6BZ!O0*Qzu0g1R=iOTEsNd_Q_2HQL6h~V>)$9fktf!7rziB{rAXE^Q$po#02TNrcb zPyirTi>ydqH)-DULx@z2HO-U$@(i!ktV!PT<=OZ7=kw8dEuf1t^trQdUpl|{Ubb9k z)0#C5uT?9x!J@KQ#65!s(KgK@l_?!Pc#xh&ir7m09oGF-w7?dAfuBx5`%t1R-KDBy z-%6nVxGY%N0sy%(@v04A=ZpRU)buA4uk{So&^;0X4kA)EMX9qBbJ%mNTC#)*4?JKe zVdX-pqUhMI+~_)H&!U})8I1)01EyLQHm7d#a6BxySku#hC;c*L(2FmoN+^!av;659 z>ZF-poiXI&qZ%~Gao_-`egFNbp(wGYc{*09t@)caU88hWnKvz+=U$6D*a=xK2iF-z z`e@;DS+QjYILIZ^l#f1Q`D?FXXe-YO(oCHB6&&{$FS=#9YHh8qHswlyGt>NVPP|mD z8c7>c?IY#TL63boxBsJEDYMQASoLLqgJd6lJ9R26G&sV5FC5@_4>(?|RV%-EjyE5F z95IX_v=`c@ZorwhwNJtCXvF&Un!6}P(N?Xt14At1NgH(8p=0REGiQJUJ6;+|s zlTWI?pL}w|yfe!}XH!8-XE_NRcNHtf7~LT`0Fdn99N)HSgXk4$JGusxP4@#!{Y5!< zOqwK8BRuFFtJK)Qn?9EUu~-+N1AF(SX19`@SA6{6w^Tt za2!Kqf`|kZ1E7)pJH?s;z0d%y=lMT+q8wrw}mGslR4NM4j$0NiG6 zP5>SO4o?d>1Oos8c&Bx1ozSe*BGPiL0a`1Vo(#m^VBoMgM{bn*9j$wSj=8#D!I}br zs*eGH0CcNZk>ssg35DJca459(YI^uxcQJ15+8dEu=0d6Y8Nl%bux4Cd2}kN zy==~ssHo3F@4S=mZ?Kg#T7;B;{)s@Txejn7qpfwnKmE-&e6VOyV5SE+2&|tx*?ypJ z9N^z9VPP$O@$qWJ`t>)=v(EhZV|-pOA`)qFj@uoaqY>~+o<@y$;IYR7vpfJ0m^*ng zDLSKXzGEdl4m1e4?KU;y&p&UNm*!}*ToU-!0S>PvO8!#4e}7`$emgM30|0@St5xId zh7E|WliP%}kcwv&953!iVd)p51AF%}@b0^9XU@y$Vrr4r?i8Rgu=ti{%>v-auEogT zJ;(7UPx4ycyr9cWI<@cDfR743_80?i0LR#?_3Cl@x8D$5FLx@sMS)GHffp2fU7>4N zUL83yFtY;y(PSk%RX`VRv-<^pt)N9v@#2i$yVvhu(!C;7(qI3Dt`bs{;Um)2B}Ha-KZ64I>!ST#Bw!1#lF@D4cAXzEAxe{0nBzX@dl;gBJI{bJsD>@kjf`z-<$ zFwKeRY(SfKp$j?x7F4DT!H_z(&S>h18B%J%q?@+pR}QIMnKRqAG4!v$aJkd3n+Nvp zrEkfSRPElK9wSC%`I=pBy_Nktck-pjLr`$=H6LFQAzE~T&{3t-SC=r?I|c_+pmF1z ztAqSUgybz-K&cT9aGU{Zpwt#esEqrp)N*zW*`ogzElU8+>JfdgRQ&Yc{c zH;+S`HA^B<|eFF$YV$ z*0lWl?~#xY1*k^-`d#$+f3|GlIT1SL$%9HsA@SI;oC^>uhIq-9IL zE&M`ahgAX!#*RHE_{S%88(aI8$M)vAOM-5a15cA|o2@MNN zw*q%9SB^)4*>Aqdsw}iDb5g9w!%s;`1YZa40WhRV6O_k;D8)DLzI(xAm&}{TdzC5? z4x&z-lHhXX7_xF@&I8E6Hf@O3T(KtbieuMcV9|?<7V*}M8GZ?l=S7(F%rl@%fqqR| zzmb1{;=typd+y==g$uL&+A2+^lEQAc0BjsQ7^REKg#e*|d%#mqv3vV=9upxZG*pU$ z6a^^`GU=(O_+{x*07k$5I*mp6*^x>hA~X}BmeoPGbw~)kYS$+5>{)j2*nx=foCpVZ z?V_FtbwqeTgnheqapd4Z9u}cf!GgS6uO4@c(5*@pIz~oPHLW9Wmgw}UQ-}zK!opaj z6!Acr&`?^6@Y{LPk3aeMzcI9q8=_n;T3XyP$LSz;{aoNMy009-G~hW8Fv(BNofF=9 zht>W2155&*cN*$|h6)l&wP{1Y$&;_j^&c0p2h%VhI2n>$E|+2Wd?gS$h*BXya^8m? zN?QEmk5tnwr%<3Gt5@g5+O>q{%Ei{xr}K95Hfs1XSXpcLVek;LuX$-m2#p=MB!NJ zXYi6GD9t5vSE*4W)8ANHSp}e2o;-O{Ct8jH$R8_KaCH8BTv|4N(6OrpN*x`uf4^UH zj=rTz>FSQA`3vA|#_=veLCq8}_UKX7uzB;VelPogu&PxRa5g`n{3~C_$H~D2fLMQ!qG~ahAgCa=UfcDxXgP8UDu~sb=@wY4a=C zd*TGHhzPM%OZS=e>k(bYE6tjA{I~%WP~cKPa7YL#S~N6)(kHU0|GfRwQ=I>oevO0^CsJ{dWBeeo4H_Ui_|UnG_5^;9tXI$PfbsPw zpRk~PdqSb0RR;7fhdS^c@P?~kL1MLo@YeO*AN`3v(+?t#4spTteD!kZy(F8i88@)j5j3(6EJ-~x_$7$`OUb= z$u>9?K|!dL6nQ9reg(P(Z~?vgCx?|P#qK?OR6aPPfFh4Rs_#XqR4x)yw5XZ9Yu8bG zDx5ie8n^x@2-p)`upnQ5@(J@gbf80cI8%D{qRodNrn{e?zW&-?fx>~Uh{UH(EfIwl zDI*I3pT7S-EBp4v1cn|v#zCME95NsTuU95K{4izr?!EpZR_uTQbkKwJZ*(OwQCnadGaIzi3Z5)b?YK}awh}FUYRk2nH@Ud z21CxC4gGcE#B)qru`OC4A_j0sLPL*M?B3lIYnn;1rkPZsOBYYF#_bUo$dbN&F~D$x zGkRd9xX3ZqP3eWeH zw+^5=x>1iEk$VVu7+61!>(ij8ga~mLxOOuU{sOk7q~NwZ=|6t;6+@qVl0%j(UKp5X zDbUd&A;bZ(n>TZ7C0$Zt`=(7iQ>6+az%NSCLWIr0hNL8dLqgcKZ5w?mRN#RD1DNyn z+Z?vUg=sr?k|$q2%H+5sMK?`144=wWB^^DZ zMt~lGv(C^Dh%{G9d9D^G>{_Z6-aUKL*-X8_CxOJOY^7^%=1n+#n#iaqqP5ccf@9aK zN-4hqhogXWlMLYa1DEU3($7Ed>#JKZvvbD|-YQq_^5uD;`S|fX(Y}2e820P|?NGG? zw|)wCxgJJ4%rA@1cb{><)LpwMTB_7V&#`vJ3SMi_Ahq;k>Y@nvWBa#j&Oy3Ws6euA zeYP3wikid%9ZNm`Jg-lhl;a0&V4F7VojMhCX!=)5upiCLT5l;uGV@A z80;+C&`~SEjg-~b9avzv-H(h-Nx5u*{9A;gFo3jbG4>+*v4UM$;f5Ww!>_bJXS9jd zrhi;PL6gQLC!78RkZa08&cw&t;27xu$94?k<#DEo@&j<3Ja&v-Q>WsB8i2D9?m7(P zKjTajpD)un+V2VgvKJlAe05h#{ihE)ve!wGqHA(pki01=_BlQRT4dP$Gp0EO?L71w zx~59{%R0g7KJ;MQ%TX`WG?Vcn!nT1V8ZiTdrg96wN27ug7Od$;`7=6ygtlsbNi zq4-{9nx5{fSMye_S`-Kg5qF6aYLqq?XDi(zLLKXSv4{wwL7pp7LM_bN{Vo6=1ws_O z=7F~Fv}(nhnIxVuvNiqjO(g4ge%GWjxJ!cBduR{tI2b!=|36d_MEp zH{QtcgY-tTW{6?9F->Rjh*Q9Q3ij1}>#fU@_ea#KMSc;K$0NSu$KfiZZ`T2e+Sagy z1dP0S)k1x(tXR)}6J1rl2=GD$!)UkT%P&nb0Z81qaRfn_H!W3R9=cy*mS}M2&TJn$ z){f{+HxRZ5IR)stVg=Q&VaKp+2T14Q#qAnTWzmJ+Vlp{wF7V|SexP@>6R`(roC6#R z_z&>+mH0Ufurd}d#6>z;$KStu8dZg0IInXfVfADzW?pI%&liMmS0} zwdQvM@a=`lwssJ~(AO?&y_Ura4vbSOdjaxFjT$yMdRyXD_<7{-w@u61<8rxjEI7u! z{kAhjr*&xFhN_z7xGuyT$ zOwX)7_O=k1m7E2DwYh0tjNEli~j1GTq~8nuV>wVG3^Ai7OmDB1$} zZ5FI|F{Bj;X)1bc$sU08df)+0E?HvB=o5gaGbnmr14GfhF1RfwhS$c7$+5stO7X*t z8T_F|r;jp#qyGE3rF`F(Y?`-<$QIk`xNG}% zr*du^eI_Jd+I8|-;7A5`14pfu-)BwoqUc^JVu59aTck=CkyDd_=We-01K;gt?7n?O zYYuPQHOz|{E*w(9Ih-Y10CH-{5(EmM)M}u#W7khW2Vj>%mn)C;gT5A$R()iGV^zUY zI7fJZaew@AC6`FbxWV(+U&Neebr&F{a%D#R_17g|=&hD5$yKOO+KOGcFzvEXBPzqJ z8E-9mVFFJ^!@wcky5aSB_}}>PxWMIx)YZa--j`?|Jq~mO=8DKEuTqJhKynwYcNhjl zdZD7Blh5)4C45SK1ax>7Fb^M2x46YzfJ?6b^;Z^s_F3wCUO#dqp_xm+p$3Fs5kPv> zsYAl5RiOKluOiJ}Z=(C>4e$Z}((!5ArcDg4QU#A*&IV=x$8ZHBf{GVs@|8CReb4%2 zm2UTJ-n{v8F7(IDnW;)TK+#sME{&T4F4$n|LfSj5TQKL8ugaifQPDzPWX~}L& z65)767SHc4Q3CJYz0Cn?zWp}a7cb`2k|h#tDdm8vs#J;hZQQuZ(1xB>mgLhu8D4ga zBqUk$%OEux;2fGVcrah~>P4OmI$2QWw`E$3nD>hOAQm_(q09B>a*XK%3I>E$t;+ic z5BiNsZ%~yg7#bY&(Vp+rg;>EWDR8~I=K8MZxR`o{w`0DdEPa4c$B*MqNdaAGBaij& zXGWYaVjzgDouFj9b!ZX7Rd)Jv6OI|Vu82aMT?S+U2_jv*0c3MSFYw*L3z(}%_34x8_A{qW(fz>(=_rEl(4liot&WN6Y?aOyc@vTy{>eA)>Mw-jDV#P0Aia<$p=A6x?jsUe4>@Dpl zL5BcuwQ9xwFTX^f5=za_phIvUNlTSp4($Hs0(!t7AAG=YkB66s4NKkD_qpddG;JC#J(()`bP`=P zOL>pVAo>(>TDLC62C9G-lPB|7n>Jbg%_RY3RPWxb`|v~DIz4$a&TtF3>kJ&b|E;&^ zFknEA2gbUUD;Zh8zFj$^D!L(PF2_O>4NP@KMqZ7Ab?L@E0T_AoD0%be&yi!5Xc(X? z8@_L?;JHm`fCh-u&(-^4BNYrR9X>o2AZ)69*4?ozfZzTF9+nn$y&=gob z4p3=kz?+tmOp~aJ6-nN*Wi`4a>@5Pl?@$SW8S=33syW6AFr(hy6Ewrz#R^7+@WAkqtT;z zX~>Wq{i3H08^((w9RA@41j<`_T2}`+4goddVfB3@M)-Z(GdYh%=W;9r@BH!$F6}(C zD``|*w|8$xz@DL>rT~L}|2@m+Z6`v!o=bfln-8OXW(@=iR3bI{#QwCzVFYkpLgchW zL{RCOXQqtDl`Sjg(W46OFskC%^|*rFc^fvQRp-t*da`uC;|@H3 z{Y8*rxG>ETKu3q}rj>D#z9@C#^BW{>wQZU>r!4vXvK}l1m^*PIR_BoSMVng@7;7Ek zQSd{d#~!<6Ia9%_js#0>3XTUAo83fItxA8(2jZk? z9T9PkJ7mBYUtFAnhzJ%qMru(pm6`%SRet3aJ~&TF`Rh%G_V35%^U*;B&z3E2ped$# z2I%4dM*=#`p<|hL?M~cCt(J|nKUY+L#|?b_+H2%%+!%qMErX1c;!ODS-EY3hl5CVg z(|X(n8SsJouDg;>I*xS%9e@5gb>gGTDqZXvK2qH%MB0Ek{p+u+%+Ok5{uf`^UrStI z3^S*$Wy%n(zxE=1lGAGnzIT@{&C5fF=2#{C&0@vq>~>?oQ}}!ci*g9lMVy_clxw*liemPNx{kYGbt<$ zu=tyAaOp0p5;x9E^*jPl*zQMns5Zik=Tt&aj9b1s(xbN8NibgRQ18*ON@2 zk1ZQE5Zk^zo;`ao6B7lWPe=P2h7LG148$-%SAEw*X&0@dOWA_ZbF6Cnt}{lDW~QcUre*@AT;iJb-4Y zHhl@aY7{6SFTVbIj*~^~(DV?fq!JSP0?%bQWDoGJktfeM^W;gQ8Z@|G;7AvX6#=~N zbf{{xsvQ;KLI?2$13sm{CoAw6X{Al|;+4TuU9nm<;*K0ir>Muxn8C(ZU!_W|T9+WJ z8EiC7>esJNyj==5CRc5hhg|!HW0+>7bz*at$^2S zS|C>uSpZrlw%Yedi{pA6?NjS)EzAZ`N5OwZJ17yDsnW{Sp4aLo@ScKatxW|@*ambv z2H%BgZdKdV=H=?vd6z5g+p+BuVSwu#9mHyZR=_gn=CL;a50N_*Fl+t#94A)26dq2D zNIi6}K#XIuq@calWq=P|#fmw@oBfSaOz`@^my#C3tu8bH0bZUxo7VH^GY&9v=T;IK zsg_;BMgIbDxsaeB`Y&J3Nl?k)#qIWC7=mFKxLktUEfNtShk@4f=V$5M5jARH8pcx6 z=W7&KFgHlIN{BbK&&_TSGg#@|oC{K}di7BH)_XfP=M$LjhLb6}&B3=8IFf;XoAAF3 zl2s78`g^8Ydk@me_M1S{4N4`A`|UR>>SEJ5kv?+(TF|{l{^KrL@F`%^F&ZBuBzyz!0V9U8ZV<(&F-Tfi@RY5k6YE5)t8*sHnjS z@$qM@MKUuwrQlxRPti5bY&r|X&$@sWYlj7l6F_ZX*Ux9pP_<5-oV>!m1MEUado}`^ znsB0Y)22*S>bimBU|bv#l`Go-x!g~%($AJQGqeYJq2rhblh0F->s&c2^Ve?Or`vJP zAz@Xko?jVOD)p1b#Pqq1{Q1SQe%j}{&+GH0WIV?-r7#K<5EEV%&FMR#D^=R@YEOlW zgaOly+_?pn;C)0Z?_2!!j7=!LM^#Z!B_-J(C^jzz}k*I#Gtph37r!Z3^!<@0&R zb7g%vs*7+d5Ho8Q|7vl=lzGb0)IO~ZTRJ_(2TZ)ocRBIB_gLPqAFd4CKmluj>Fd@} zxmvaJFDC6t6KJilX7&I-T*2fT+PynlMvla^lz>FbM6nr|v}O%=)Toi;Ud}g@CNbVB zjAjBQtkom|%xQsw&^Ij^2IO`_s2f6D5Ft>wbZF=md0sb<9Em`F7lem`JFkcl2Cf>0 zAw6r>%#i~T5*9`=bR0v8v_;089+)FHHM!9RzU(E^10)g@bVVmU3*-`sM=39$YzLMy zP2S3(VJVqWGWdPKVt}rYgK)0>TuD&S70rszHE;4}Ja. + + +import datetime +import getpass +import gettext +import hashlib +import logging +import os +import platform +import re +import shlex +import shutil +import socket +import subprocess +import sys +import threading +import time + +from collections import OrderedDict +from collections.abc import MutableMapping +from decimal import Decimal +from enum import IntEnum +from functools import wraps +from pathlib import Path +from typing import Any + +import uno +import unohelper +from com.sun.star.awt import MessageBoxButtons as MSG_BUTTONS +from com.sun.star.awt.MessageBoxResults import YES +from com.sun.star.awt import Rectangle, Size, Point +from com.sun.star.awt import Key, KeyModifier, KeyEvent +from com.sun.star.container import NoSuchElementException + +from com.sun.star.beans import PropertyValue, NamedValue +from com.sun.star.sheet import TableFilterField +from com.sun.star.table.CellContentType import EMPTY, VALUE, TEXT, FORMULA +from com.sun.star.util import Time, Date, DateTime + +from com.sun.star.text.TextContentAnchorType import AS_CHARACTER + +from com.sun.star.awt import XActionListener +from com.sun.star.lang import XEventListener +from com.sun.star.awt import XMouseListener +from com.sun.star.awt import XMouseMotionListener +from com.sun.star.awt import XFocusListener + +# ~ https://api.libreoffice.org/docs/idl/ref/namespacecom_1_1sun_1_1star_1_1awt_1_1FontUnderline.html +from com.sun.star.awt import FontUnderline +from com.sun.star.style.VerticalAlignment import TOP, MIDDLE, BOTTOM + +try: + from peewee import Database, DateTimeField, DateField, TimeField, \ + __exception_wrapper__ +except ImportError as e: + Database = DateField = TimeField = DateTimeField = object + print('Install peewee') + + +LOG_FORMAT = '%(asctime)s - %(levelname)s - %(message)s' +LOG_DATE = '%d/%m/%Y %H:%M:%S' +logging.addLevelName(logging.ERROR, '\033[1;41mERROR\033[1;0m') +logging.addLevelName(logging.DEBUG, '\x1b[33mDEBUG\033[1;0m') +logging.addLevelName(logging.INFO, '\x1b[32mINFO\033[1;0m') +logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT, datefmt=LOG_DATE) +log = logging.getLogger(__name__) + + +LEFT = 0 +CENTER = 1 +RIGHT = 2 + +CALC = 'calc' +WRITER = 'writer' +DRAW = 'draw' +IMPRESS = 'impress' +BASE = 'base' +MATH = 'math' +BASIC = 'basic' +MAIN = 'main' +TYPE_DOC = { + CALC: 'com.sun.star.sheet.SpreadsheetDocument', + WRITER: 'com.sun.star.text.TextDocument', + DRAW: 'com.sun.star.drawing.DrawingDocument', + IMPRESS: 'com.sun.star.presentation.PresentationDocument', + BASE: 'com.sun.star.sdb.DocumentDataSource', + MATH: 'com.sun.star.formula.FormulaProperties', + BASIC: 'com.sun.star.script.BasicIDE', + MAIN: 'com.sun.star.frame.StartModule', +} + +OBJ_CELL = 'ScCellObj' +OBJ_RANGE = 'ScCellRangeObj' +OBJ_RANGES = 'ScCellRangesObj' +TYPE_RANGES = (OBJ_CELL, OBJ_RANGE, OBJ_RANGES) + +# ~ from com.sun.star.sheet.FilterOperator import EMPTY, NO_EMPTY, EQUAL, NOT_EQUAL +class FilterOperator(IntEnum): + EMPTY = 0 + NO_EMPTY = 1 + EQUAL = 2 + NOT_EQUAL = 3 + +# ~ https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1awt_1_1UnoControlEditModel.html#a54d3ff280d892218d71e667f81ce99d4 +class Border(IntEnum): + NO_BORDER = 0 + BORDER = 1 + SIMPLE = 2 + +OS = platform.system() +IS_WIN = OS == 'Windows' +IS_MAC = OS == 'Darwin' +USER = getpass.getuser() +PC = platform.node() +DESKTOP = os.environ.get('DESKTOP_SESSION', '') +INFO_DEBUG = f"{sys.version}\n\n{platform.platform()}\n\n" + '\n'.join(sys.path) + +_MACROS = {} + +SECONDS_DAY = 60 * 60 * 24 +DIR = { + 'images': 'images', + 'locales': 'locales', +} +DEFAULT_MIME_TYPE = 'png' +MODIFIERS = { + 'shift': KeyModifier.SHIFT, + 'ctrl': KeyModifier.MOD1, + 'alt': KeyModifier.MOD2, + 'ctrlmac': KeyModifier.MOD3, +} + +# ~ Menus +NODE_MENUBAR = 'private:resource/menubar/menubar' +MENUS = { + 'file': '.uno:PickList', + 'tools': '.uno:ToolsMenu', + 'help': '.uno:HelpMenu', + 'windows': '.uno:WindowList', + 'edit': '.uno:EditMenu', + 'view': '.uno:ViewMenu', + 'insert': '.uno:InsertMenu', + 'format': '.uno:FormatMenu', + 'styles': '.uno:FormatStylesMenu', + 'sheet': '.uno:SheetMenu', + 'data': '.uno:DataMenu', + 'table': '.uno:TableMenu', + 'form': '.uno:FormatFormMenu', + 'page': '.uno:PageMenu', + 'shape': '.uno:ShapeMenu', + 'slide': '.uno:SlideMenu', + 'show': '.uno:SlideShowMenu', +} + +MIME_TYPE = { + 'png': 'image/png', + 'jpg': 'image/jpeg', +} + +MESSAGES = { + 'es': { + 'OK': 'Aceptar', + 'Cancel': 'Cancelar', + 'Select file': 'Seleccionar archivo', + 'Incorrect user or password': 'Nombre de usuario o contraseña inválidos', + 'Allow less secure apps in GMail': 'Activa: Permitir aplicaciones menos segura en GMail', + } +} + + +CTX = uno.getComponentContext() +SM = CTX.getServiceManager() + + +def create_instance(name: str, with_context: bool=False, args: Any=None) -> Any: + if with_context: + instance = SM.createInstanceWithContext(name, CTX) + elif args: + instance = SM.createInstanceWithArguments(name, (args,)) + else: + instance = SM.createInstance(name) + return instance + + +def get_app_config(node_name, key=''): + name = 'com.sun.star.configuration.ConfigurationProvider' + service = 'com.sun.star.configuration.ConfigurationAccess' + cp = create_instance(name, True) + node = PropertyValue(Name='nodepath', Value=node_name) + try: + ca = cp.createInstanceWithArguments(service, (node,)) + if ca and not key: + return ca + if ca and ca.hasByName(key): + return ca.getPropertyValue(key) + except Exception as e: + error(e) + return '' + + +LANGUAGE = get_app_config('org.openoffice.Setup/L10N/', 'ooLocale') +LANG = LANGUAGE.split('-')[0] +NAME = TITLE = get_app_config('org.openoffice.Setup/Product', 'ooName') +VERSION = get_app_config('org.openoffice.Setup/Product','ooSetupVersion') + +INFO_DEBUG = f"{NAME} v{VERSION} {LANGUAGE}\n\n{INFO_DEBUG}" + +node = '/org.openoffice.Office.Calc/Calculate/Other/Date' +y = get_app_config(node, 'YY') +m = get_app_config(node, 'MM') +d = get_app_config(node, 'DD') +DATE_OFFSET = datetime.date(y, m, d).toordinal() + + +def error(info): + log.error(info) + return + + +def debug(*args): + data = [str(a) for a in args] + log.debug('\t'.join(data)) + return + + +def info(*args): + data = [str(a) for a in args] + log.info('\t'.join(data)) + return + + +def catch_exception(f): + @wraps(f) + def func(*args, **kwargs): + try: + return f(*args, **kwargs) + except Exception as e: + name = f.__name__ + if IS_WIN: + debug(traceback.format_exc()) + log.error(name, exc_info=True) + return func + + +def inspect(obj: Any) -> None: + zaz = create_instance('net.elmau.zaz.inspect') + if hasattr(obj, 'obj'): + obj = obj.obj + zaz.inspect(obj) + return + + +def mri(obj): + m = create_instance('mytools.Mri') + if m is None: + msg = 'Extension MRI not found' + error(msg) + return + + m.inspect(obj) + return + + +def now(only_time=False): + now = datetime.datetime.now() + if only_time: + now = now.time() + return now + + +def today(): + return datetime.date.today() + + +def _(msg): + if LANG == 'en': + return msg + + if not LANG in MESSAGES: + return msg + + return MESSAGES[LANG][msg] + + +def msgbox(message, title=TITLE, buttons=MSG_BUTTONS.BUTTONS_OK, type_msg='infobox'): + """ Create message box + type_msg: infobox, warningbox, errorbox, querybox, messbox + http://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1awt_1_1XMessageBoxFactory.html + """ + toolkit = create_instance('com.sun.star.awt.Toolkit') + parent = toolkit.getDesktopWindow() + box = toolkit.createMessageBox(parent, type_msg, buttons, title, str(message)) + return box.execute() + + +def question(message, title=TITLE): + result = msgbox(message, title, MSG_BUTTONS.BUTTONS_YES_NO, 'querybox') + return result == YES + + +def warning(message, title=TITLE): + return msgbox(message, title, type_msg='warningbox') + + +def errorbox(message, title=TITLE): + return msgbox(message, title, type_msg='errorbox') + + +def get_type_doc(obj: Any) -> str: + for k, v in TYPE_DOC.items(): + if obj.supportsService(v): + return k + return '' + + +def _get_class_doc(obj: Any) -> Any: + classes = { + CALC: LOCalc, + WRITER: LOWriter, + DRAW: LODraw, + IMPRESS: LOImpress, + BASE: LOBase, + MATH: LOMath, + BASIC: LOBasic, + } + type_doc = get_type_doc(obj) + return classes[type_doc](obj) + + +def _get_class_uno(obj: Any) -> Any: + classes = dict( + SwXTextGraphicObject = LOImage, + SvxShapeText = LOImage, + ) + name = obj.ImplementationName + print(f'ImplementationName = {name}') + instance = obj + if name in classes: + instance = classes[name](obj) + return instance + + +def dict_to_property(values: dict, uno_any: bool=False): + ps = tuple([PropertyValue(Name=n, Value=v) for n, v in values.items()]) + if uno_any: + ps = uno.Any('[]com.sun.star.beans.PropertyValue', ps) + return ps + + +def _array_to_dict(values): + d = {v[0]: v[1] for v in values} + return d + +def _property_to_dict(values): + d = {v.Name: v.Value for v in values} + return d + + +def data_to_dict(data): + if isinstance(data, tuple) and isinstance(data[0], tuple): + return _array_to_dict(data) + + if isinstance(data, tuple) and isinstance(data[0], (PropertyValue, NamedValue)): + return _property_to_dict(data) + return {} + + +def _path_url(path: str) -> str: + if path.startswith('file://'): + return path + return uno.systemPathToFileUrl(path) + + +def _path_system(path: str) -> str: + if path.startswith('file://'): + return str(Path(uno.fileUrlToSystemPath(path)).resolve()) + return path + + +def _get_dispatch() -> Any: + return create_instance('com.sun.star.frame.DispatchHelper') + + +def call_dispatch(frame: Any, url: str, args: dict={}) -> None: + dispatch = _get_dispatch() + opt = dict_to_property(args) + dispatch.executeDispatch(frame, url, '', 0, opt) + return + + +def get_desktop(): + return create_instance('com.sun.star.frame.Desktop', True) + + +def _date_to_struct(value): + if isinstance(value, datetime.datetime): + d = DateTime() + d.Year = value.year + d.Month = value.month + d.Day = value.day + d.Hours = value.hour + d.Minutes = value.minute + d.Seconds = value.second + elif isinstance(value, datetime.date): + d = Date() + d.Day = value.day + d.Month = value.month + d.Year = value.year + elif isinstance(value, datetime.time): + d = Time() + d.Hours = value.hour + d.Minutes = value.minute + d.Seconds = value.second + return d + + +def _struct_to_date(value): + d = None + if isinstance(value, Time): + d = datetime.time(value.Hours, value.Minutes, value.Seconds) + elif isinstance(value, Date): + if value != Date(): + d = datetime.date(value.Year, value.Month, value.Day) + elif isinstance(value, DateTime): + if value.Year > 0: + d = datetime.datetime( + value.Year, value.Month, value.Day, + value.Hours, value.Minutes, value.Seconds) + return d + + +def _get_url_script(args): + library = args['library'] + module = '.' + name = args['name'] + language = args.get('language', 'Python') + location = args.get('location', 'user') + + if language == 'Python': + module = '.py$' + elif language == 'Basic': + module = f".{module}." + if location == 'user': + location = 'application' + + url = 'vnd.sun.star.script' + url = f'{url}:{library}{module}{name}?language={language}&location={location}' + + return url + + +def _call_macro(args): + #~ https://wiki.openoffice.org/wiki/Documentation/DevGuide/Scripting/Scripting_Framework_URI_Specification + + url = _get_url_script(args) + args = args.get('args', ()) + + service = 'com.sun.star.script.provider.MasterScriptProviderFactory' + factory = create_instance(service) + script = factory.createScriptProvider('').getScript(url) + result = script.invoke(args, None, None)[0] + + return result + + +def call_macro(args, in_thread=False): + result = None + if in_thread: + t = threading.Thread(target=_call_macro, args=(args,)) + t.start() + else: + result = _call_macro(args) + return result + + +def run(command, capture=False): + cmd = shlex.split(command) + result = subprocess.run(cmd, capture_output=capture, text=True) + if capture: + result = result.stdout + else: + result = result.returncode + return result + + +# ~ def popen(command, stdin=None): + # ~ try: + # ~ proc = subprocess.Popen(shlex.split(command), shell=IS_WIN, + # ~ stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + # ~ for line in proc.stdout: + # ~ yield line.decode().rstrip() + # ~ except Exception as e: + # ~ error(e) + # ~ yield (e.errno, e.strerror) + + +def sleep(seconds): + time.sleep(seconds) + return + + +class TimerThread(threading.Thread): + + def __init__(self, event, seconds, macro): + threading.Thread.__init__(self) + self.stopped = event + self.seconds = seconds + self.macro = macro + + def run(self): + info('Timer started... {}'.format(self.macro['name'])) + while not self.stopped.wait(self.seconds): + _call_macro(self.macro) + info('Timer stopped... {}'.format(self.macro['name'])) + return + + +def start_timer(name, seconds, macro): + global _MACROS + _MACROS[name] = threading.Event() + thread = TimerThread(_MACROS[name], seconds, macro) + thread.start() + return + + +def stop_timer(name): + global _MACROS + _MACROS[name].set() + del _MACROS[name] + return + + +def install_locales(path, domain='base', dir_locales=DIR['locales']): + path_locales = _P.join(_P(path).path, dir_locales) + try: + lang = gettext.translation(domain, path_locales, languages=[LANG]) + lang.install() + _ = lang.gettext + except Exception as e: + from gettext import gettext as _ + error(e) + return _ + + +def _export_image(obj, args): + name = 'com.sun.star.drawing.GraphicExportFilter' + exporter = create_instance(name) + path = _P.to_system(args['URL']) + args = dict_to_property(args) + exporter.setSourceDocument(obj) + exporter.filter(args) + return _P.exists(path) + + +def sha256(data): + result = hashlib.sha256(data.encode()).hexdigest() + return result + +def sha512(data): + result = hashlib.sha512(data.encode()).hexdigest() + return result + + +# ~ Classes + +class LOBaseObject(object): + + def __init__(self, obj): + self._obj = obj + + def __setattr__(self, name, value): + exists = hasattr(self, name) + if not exists and not name in ('_obj', '_index'): + setattr(self._obj, name, value) + else: + super().__setattr__(name, value) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + @property + def obj(self): + return self._obj + + +class LOImage(object): + TYPE = { + 'png': 'image/png', + 'jpg': 'image/jpeg', + } + + def __init__(self, obj): + self._obj = obj + + @property + def obj(self): + return self._obj + + @property + def name(self): + return self.obj.Name or 'img' + + @property + def mimetype(self): + return self.obj.Bitmap.MimeType + + def save(self, path, mimetype=DEFAULT_MIME_TYPE): + p = _P(path) + if _P.is_dir(path): + name = self.name + else: + path = p.path + name = p.name + + path = _P.join(path, f'{name}.{mimetype.lower()}') + args = dict( + URL = _P.to_url(path), + MimeType = self.TYPE[mimetype], + ) + if not _export_image(self.obj, args): + path = '' + + # ~ size = len(self.obj.Bitmap.DIB) + # ~ data = self.obj.GraphicStream.readBytes((), size) + # ~ data = data[-1].value + + # ~ data = self.obj.Bitmap.DIB.value + # ~ data = self.obj.Graphic.DIB.value + + # ~ _P.save_bin(path, data) + return path + + +class LODocument(object): + + def __init__(self, obj): + self._obj = obj + self._cc = self.obj.getCurrentController() + self._undo = True + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + + @property + def obj(self): + return self._obj + + @property + def title(self): + return self.obj.getTitle() + @title.setter + def title(self, value): + self.obj.setTitle(value) + + @property + def type(self): + return self._type + + @property + def uid(self): + return self.obj.RuntimeUID + + @property + def frame(self): + return self._cc.getFrame() + + @property + def is_saved(self): + return self.obj.hasLocation() + + @property + def is_modified(self): + return self.obj.isModified() + + @property + def is_read_only(self): + return self.obj.isReadOnly() + + @property + def path(self): + return _path_system(self.obj.URL) + + @property + def status_bar(self): + return self._cc.getStatusIndicator() + + @property + def visible(self): + w = self.frame.ContainerWindow + return w.isVisible() + @visible.setter + def visible(self, value): + w = self.frame.ContainerWindow + w.setVisible(value) + + @property + def zoom(self): + return self._cc.ZoomValue + @zoom.setter + def zoom(self, value): + self._cc.ZoomValue = value + + @property + def undo(self): + return self._undo + @undo.setter + def undo(self, value): + self._undo = value + um = self.obj.UndoManager + if value: + try: + um.leaveUndoContext() + except: + pass + else: + um.enterHiddenUndoContext() + + @property + def selection(self): + sel = self.obj.CurrentSelection + return _get_class_uno(sel) + + def create_instance(self, name): + obj = self.obj.createInstance(name) + return obj + + def set_focus(self): + w = self.frame.ComponentWindow + w.setFocus() + return + + def copy(self): + call_dispatch(self.frame, '.uno:Copy') + return + + def paste(self): + sc = create_instance('com.sun.star.datatransfer.clipboard.SystemClipboard') + transferable = sc.getContents() + self._cc.insertTransferable(transferable) + return + + def select(self, obj): + self._cc.select(obj) + return + + def to_pdf(self, path: str='', args: dict={}): + path_pdf = path + filter_name = '{}_pdf_Export'.format(self.type) + filter_data = dict_to_property(args, True) + args = { + 'FilterName': filter_name, + 'FilterData': filter_data, + } + opt = dict_to_property(args) + try: + self.obj.storeToURL(_P.to_url(path), opt) + except Exception as e: + error(e) + path_pdf = '' + + return _P.exists(path_pdf) + + def save(self, path: str='', args: dict={}) -> bool: + result = True + opt = dict_to_property(args) + if path: + try: + self.obj.storeAsURL(_path_url(path), opt) + except Exception as e: + error(e) + result = False + else: + self.obj.store() + return result + + def close(self): + self.obj.close(True) + return + + +class LOCalc(LODocument): + + def __init__(self, obj): + super().__init__(obj) + self._type = CALC + self._sheets = obj.Sheets + + def __getitem__(self, index): + return LOCalcSheet(self._sheets[index]) + + def __len__(self): + return self._sheets.Count + + @property + def selection(self): + sel = self.obj.CurrentSelection + if sel.ImplementationName in TYPE_RANGES: + sel = LOCalcRange(sel) + return sel + + @property + def active(self): + return LOCalcSheet(self._cc.ActiveSheet) + + @property + def db_ranges(self): + # ~ return LOCalcDataBaseRanges(self.obj.DataBaseRanges) + return self.obj.DatabaseRanges + + def render(self, data, sheet=None, clean=True): + if sheet is None: + sheet = self.active + return sheet.render(data, clean=clean) + + +class LOChart(object): + + def __init__(self, name, obj, draw_page): + self._name = name + self._obj = obj + self._eobj = self._obj.EmbeddedObject + self._type = 'Column' + self._cell = None + self._shape = self._get_shape(draw_page) + self._pos = self._shape.Position + + def __getitem__(self, index): + return LOBaseObject(self.diagram.getDataRowProperties(index)) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + @property + def obj(self): + return self._obj + + @property + def name(self): + return self._name + + @property + def diagram(self): + return self._eobj.Diagram + + @property + def type(self): + return self._type + @type.setter + def type(self, value): + self._type = value + if value == 'Bar': + self.diagram.Vertical = True + return + type_chart = f'com.sun.star.chart.{value}Diagram' + self._eobj.setDiagram(self._eobj.createInstance(type_chart)) + + @property + def cell(self): + return self._cell + @cell.setter + def cell(self, value): + self._cell = value + self._shape.Anchor = value.obj + + @property + def position(self): + return self._pos + @position.setter + def position(self, value): + self._pos = value + self._shape.Position = value + + def _get_shape(self, draw_page): + for shape in draw_page: + if shape.PersistName == self.name: + break + return shape + + +class LOSheetCharts(object): + + def __init__(self, obj, sheet): + self._obj = obj + self._sheet = sheet + + def __getitem__(self, index): + return LOChart(index, self.obj[index], self._sheet.draw_page) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + def __contains__(self, item): + return item in self.obj + + def __len__(self): + return len(self.obj) + + @property + def obj(self): + return self._obj + + def new(self, name, pos_size, data): + self.obj.addNewByName(name, pos_size, data, True, True) + return LOChart(name, self.obj[name], self._sheet.draw_page) + + +class LOFormControl(LOBaseObject): + + def __init__(self, obj): + self._obj = obj + self._control = self.doc.CurrentController.getControl(self.obj) + + def __setattr__(self, name, value): + if name == '_control': + self.__dict__[name] = value + else: + super().__setattr__(name, value) + + @property + def doc(self): + return self.obj.Parent.Parent.Parent + + @property + def name(self): + return self.obj.Name + + @property + def label(self): + return self.obj.Label + + def set_focus(self): + self._control.setFocus() + return + + +class LOForm(object): + + def __init__(self, obj): + self._obj = obj + + def __getitem__(self, index): + return LOFormControl(self.obj[index]) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + def __contains__(self, item): + return item in self.obj + + def __len__(self): + return len(self.obj) + + @property + def obj(self): + return self._obj + + +class LOSheetForms(object): + + def __init__(self, obj): + self._obj = obj + + def __getitem__(self, index): + return LOForm(self.obj[index]) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + def __contains__(self, item): + return item in self.obj + + def __len__(self): + return len(self.obj) + + @property + def obj(self): + return self._obj + + +class LOSheetRows(object): + + def __init__(self, sheet): + self._sheet = sheet + self._obj = sheet.obj.Rows + + def __getitem__(self, index): + return LOSheetRows(self.obj[index]) + + @property + def obj(self): + return self._obj + + def insert(self, index, count): + self.obj.insertByIndex(index, count) + end = index + count + return self._sheet[index:end,0:] + + +class LOCalcSheet(object): + + def __init__(self, obj): + self._obj = obj + + def __getitem__(self, index): + return LOCalcRange(self.obj[index]) + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + @property + def obj(self): + return self._obj + + @property + def name(self): + return self._obj.Name + @name.setter + def name(self, value): + self._obj.Name = value + + @property + def used_area(self): + cursor = self.get_cursor() + cursor.gotoEndOfUsedArea(True) + return LOCalcRange(self[cursor.AbsoluteName].obj) + + @property + def draw_page(self): + return LODrawPage(self.obj.DrawPage) + + @property + def dp(self): + return self.draw_page + + @property + def shapes(self): + return self.draw_page + + @property + def doc(self): + return self.obj.DrawPage.Forms.Parent + + @property + def charts(self): + return LOSheetCharts(self.obj.Charts, self) + + @property + def rows(self): + return LOSheetRows(self) + + @property + def forms(self): + return LOSheetForms(self.obj.DrawPage.Forms) + + def get_cursor(self, cell=None): + if cell is None: + cursor = self.obj.createCursor() + else: + cursor = self.obj.createCursorByRange(cell) + return cursor + + def render(self, data, rango=None, clean=True): + if rango is None: + rango = self.used_area + return rango.render(data, clean) + + +class LOCalcRange(object): + + def __init__(self, obj): + self._obj = obj + self._sd = None + + def __getitem__(self, index): + return LOCalcRange(self.obj[index]) + + def __iter__(self): + self._r = 0 + self._c = 0 + return self + + def __next__(self): + try: + rango = self[self._r, self._c] + except Exception as e: + raise StopIteration + self._c += 1 + if self._c == self.columns: + self._c = 0 + self._r +=1 + return rango + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + def __str__(self): + if self.is_none: + s = 'Range: None' + else: + s = f'Range: {self.name}' + return s + + @property + def obj(self): + return self._obj + + @property + def is_none(self): + return self.obj is None + + @property + def sheet(self): + return LOCalcSheet(self.obj.Spreadsheet) + + @property + def doc(self): + doc = self.obj.Spreadsheet.DrawPage.Forms.Parent + return LODocument(doc) + + @property + def name(self): + return self.obj.AbsoluteName + + @property + def code_name(self): + name = self.name.replace('$', '').replace('.', '_').replace(':', '') + return name + + @property + def columns(self): + return self.obj.Columns.Count + + @property + def rows(self): + return self.obj.Rows.Count + + @property + def row(self): + r1 = self.address.Row + r2 = r1 + 1 + ra = self.current_region.range_address + c1 = ra.StartColumn + c2 = ra.EndColumn + 1 + return LOCalcRange(self.sheet[r1:r2, c1:c2].obj) + + @property + def type(self): + return self.obj.Type + + @property + def value(self): + v = None + if self.type == VALUE: + v = self.obj.getValue() + elif self.type == TEXT: + v = self.obj.getString() + elif self.type == FORMULA: + v = self.obj.getFormula() + return v + @value.setter + def value(self, data): + if isinstance(data, str): + # ~ print(isinstance(data, str), data[0]) + if data[0] in '=': + self.obj.setFormula(data) + # ~ print('Set Formula') + else: + self.obj.setString(data) + elif isinstance(data, Decimal): + self.obj.setValue(float(data)) + elif isinstance(data, (int, float, bool)): + self.obj.setValue(data) + elif isinstance(data, datetime.datetime): + d = data.toordinal() + t = (data - datetime.datetime.fromordinal(d)).seconds / SECONDS_DAY + self.obj.setValue(d - DATE_OFFSET + t) + elif isinstance(data, datetime.date): + d = data.toordinal() + self.obj.setValue(d - DATE_OFFSET) + elif isinstance(data, datetime.time): + d = (data.hour * 3600 + data.minute * 60 + data.second) / SECONDS_DAY + self.obj.setValue(d) + + @property + def date(self): + value = int(self.obj.Value) + date = datetime.date.fromordinal(value + DATE_OFFSET) + return date + + @property + def time(self): + seconds = self.obj.Value * SECONDS_DAY + time_delta = datetime.timedelta(seconds=seconds) + time = (datetime.datetime.min + time_delta).time() + return time + + @property + def datetime(self): + return datetime.datetime.combine(self.date, self.time) + + @property + def data(self): + return self.obj.getDataArray() + @data.setter + def data(self, values): + self.obj.setDataArray(values) + + @property + def formula(self): + return self.obj.getFormulaArray() + @formula.setter + def formula(self, values): + self.obj.setFormulaArray(values) + + @property + def address(self): + return self.obj.CellAddress + + @property + def range_address(self): + return self.obj.RangeAddress + + @property + def cursor(self): + cursor = self.obj.Spreadsheet.createCursorByRange(self.obj) + return cursor + + @property + def current_region(self): + cursor = self.cursor + cursor.collapseToCurrentRegion() + return LOCalcRange(self.sheet[cursor.AbsoluteName].obj) + + @property + def next_cell(self): + a = self.current_region.range_address + col = a.StartColumn + row = a.EndRow + 1 + return LOCalcRange(self.sheet[row, col].obj) + + @property + def position(self): + return self.obj.Position + + @property + def size(self): + return self.obj.Size + + @property + def possize(self): + data = { + 'Width': self.size.Width, + 'Height': self.size.Height, + 'X': self.position.X, + 'Y': self.position.Y, + } + return data + + def select(self): + self.doc.select(self.obj) + return + + def offset(self, rows=0, cols=1): + ra = self.range_address + col = ra.EndColumn + cols + row = ra.EndRow + rows + return LOCalcRange(self.sheet[row, col].obj) + + def to_size(self, rows, cols): + cursor = self.cursor + cursor.collapseToSize(cols, rows) + return LOCalcRange(self.sheet[cursor.AbsoluteName].obj) + + def copy_to(self, cell, formula=False): + rango = cell.to_size(self.rows, self.columns) + if formula: + rango.formula = self.data + else: + rango.data = self.data + return + + def auto_width(self): + self.obj.Columns.OptimalWidth = True + return + + def render(self, data, clean=True): + self._sd = self.sheet.obj.createSearchDescriptor() + self._sd.SearchCaseSensitive = False + for k, v in data.items(): + cell = self._render_value(k, v) + return cell + + def _render_value(self, key, value, parent=''): + cell = None + if isinstance(value, dict): + for k, v in value.items(): + cell = self._render_value(k, v, key) + return cell + elif isinstance(value, (list, tuple)): + self._render_list(key, value) + return + + search = f'{{{key}}}' + if parent: + search = f'{{{parent}.{key}}}' + ranges = self.find_all(search) + + for cell in ranges or range(0): + self._set_new_value(cell, search, value) + return LOCalcRange(cell) + + def _set_new_value(self, cell, search, value): + if not cell.ImplementationName == 'ScCellObj': + return + + if isinstance(value, str): + pattern = re.compile(search, re.IGNORECASE) + new_value = pattern.sub(value, cell.String) + cell.String = new_value + else: + LOCalcRange(cell).value = value + return + + def _render_list(self, key, rows): + for row in rows: + for k, v in row.items(): + self._render_value(k, v) + return + + def find_all(self, search_string): + if self._sd is None: + self._sd = self.sheet.obj.createSearchDescriptor() + self._sd.SearchCaseSensitive = False + + self._sd.setSearchString(search_string) + ranges = self.obj.findAll(self._sd) + return ranges + + def filter(self, args, with_headers=True): + ff = TableFilterField() + ff.Field = args['Field'] + ff.Operator = args['Operator'] + if isinstance(args['Value'], str): + ff.IsNumeric = False + ff.StringValue = args['Value'] + else: + ff.IsNumeric = True + ff.NumericValue = args['Value'] + + fd = self.obj.createFilterDescriptor(True) + fd.ContainsHeader = with_headers + fd.FilterFields = ((ff,)) + # ~ self.obj.AutoFilter = True + self.obj.filter(fd) + return + + def copy_format_from(self, rango): + rango.select() + self.doc.copy() + self.select() + args = { + 'Flags': 'T', + 'MoveMode': 4, + } + url = '.uno:InsertContents' + call_dispatch(self.doc.frame, url, args) + return + + def to_image(self): + self.select() + self.doc.copy() + args = {'SelectedFormat': 141} + url = '.uno:ClipboardFormatItems' + call_dispatch(self.doc.frame, url, args) + return self.sheet.shapes[-1] + + def insert_image(self, path, args={}): + ps = self.possize + args['Width'] = args.get('Width', ps['Width']) + args['Height'] = args.get('Height', ps['Height']) + args['X'] = args.get('X', ps['X']) + args['Y'] = args.get('Y', ps['Y']) + # ~ img.ResizeWithCell = True + img = self.sheet.dp.insert_image(path, args) + img.Anchor = self.obj + args.clear() + return img + + +class LOWriterPageStyle(LOBaseObject): + + def __init__(self, obj): + super().__init__(obj) + + def __str__(self): + return f'Page Style: {self.name}' + + @property + def name(self): + return self._obj.Name + + +class LOWriterPageStyles(object): + + def __init__(self, styles): + self._styles = styles + + def __getitem__(self, index): + return LOWriterPageStyle(self._styles[index]) + + @property + def names(self): + return self._styles.ElementNames + + def __str__(self): + return '\n'.join(self.names) + + +class LOWriterTextRange(object): + + def __init__(self, obj, doc): + self._obj = obj + self._doc = doc + self._is_paragraph = self.obj.ImplementationName == 'SwXParagraph' + self._is_table = self.obj.ImplementationName == 'SwXTextTable' + + @property + def obj(self): + return self._obj + + @property + def string(self): + return self.obj.String + @string.setter + def string(self, value): + self.obj.String = value + + @property + def value(self): + return self.string + + @property + def is_table(self): + return self._is_table + + @property + def text(self): + return self.obj.getText() + + @property + def cursor(self): + return self.text.createTextCursorByRange(self.obj) + + def offset(self): + cursor = self.cursor.getEnd() + return LOWriterTextRange(cursor, self._doc) + + def insert_content(self, data, cursor=None, replace=False): + if cursor is None: + cursor = self.cursor + self.text.insertTextContent(cursor, data, replace) + return + + def insert_image(self, path, args={}): + w = args.get('Width', 1000) + h = args.get('Height', 1000) + image = self._doc.create_instance('com.sun.star.text.GraphicObject') + image.GraphicURL = _P.to_url(path) + image.AnchorType = AS_CHARACTER + image.Width = w + image.Height = h + self.insert_content(image) + return + + +class LOWriterTextRanges(object): + + def __init__(self, obj, doc): + self._obj = obj + self._doc = doc + + def __getitem__(self, index): + return LOWriterTextRange(self.obj[index], self._doc) + + @property + def obj(self): + return self._obj + + +class LOWriter(LODocument): + + def __init__(self, obj): + super().__init__(obj) + self._type = WRITER + + @property + def selection(self): + sel = self.obj.CurrentSelection + # ~ print(sel.ImplementationName) + if sel.ImplementationName == 'SwXTextRanges': + sel = LOWriterTextRanges(sel, self) + return sel + + @property + def view_cursor(self): + return self._cc.ViewCursor + + @property + def cursor(self): + return self.obj.Text.createTextCursor() + + @property + def page_styles(self): + ps = self.obj.StyleFamilies['PageStyles'] + return LOWriterPageStyles(ps) + + +class LOShape(LOBaseObject): + + def __init__(self, obj, index): + self._index = index + super().__init__(obj) + + @property + def name(self): + return self.obj.Name or f'shape{self.index}' + @name.setter + def name(self, value): + self.obj.Name = value + + @property + def index(self): + return self._index + + @property + def string(self): + return self.obj.String + @string.setter + def string(self, value): + self.obj.String = value + + @property + def anchor(self): + return self.obj.Anchor + @anchor.setter + def anchor(self, value): + if hasattr(value, 'obj'): + value = value.obj + self.obj.Anchor = value + + def remove(self): + self.obj.Parent.remove(self.obj) + return + + +class LODrawPage(LOBaseObject): + + def __init__(self, obj): + super().__init__(obj) + + def __getitem__(self, index): + if isinstance(index, int): + shape = LOShape(self.obj[index], index) + else: + for i, o in enumerate(self.obj): + shape = self.obj[i] + name = shape.Name or f'shape{i}' + if name == index: + shape = LOShape(shape, i) + break + return shape + + @property + def name(self): + return self.obj.Name + + @property + def doc(self): + return self.obj.Forms.Parent + + @property + def width(self): + return self.obj.Width + + @property + def height(self): + return self.obj.Height + + @property + def count(self): + return self.obj.Count + + def create_instance(self, name): + return self.doc.createInstance(name) + + def add(self, type_shape, args={}): + """Insert a shape in page, type shapes: + Line + Rectangle + Ellipse + Text + """ + w = args.get('Width', 3000) + h = args.get('Height', 3000) + x = args.get('X', 1000) + y = args.get('Y', 1000) + + service = f'com.sun.star.drawing.{type_shape}Shape' + shape = self.create_instance(service) + shape.Size = Size(w, h) + shape.Position = Point(x, y) + index = self.count + shape.Name = f'{type_shape.lower()}{index}' + self.obj.add(shape) + return LOShape(self.obj[index], index) + + def insert_image(self, path, args={}): + w = args.get('Width', 3000) + h = args.get('Height', 3000) + x = args.get('X', 1000) + y = args.get('Y', 1000) + + image = self.create_instance('com.sun.star.drawing.GraphicObjectShape') + image.GraphicURL = _P.to_url(path) + image.Size = Size(w, h) + image.Position = Point(x, y) + index = self.count + image.Name = f'image{index}' + self.obj.add(image) + return LOShape(self.obj[index], index) + + +class LODrawImpress(LODocument): + + def __init__(self, obj): + super().__init__(obj) + + def __getitem__(self, index): + if isinstance(index, int): + page = self.obj.DrawPages[index] + else: + page = self.obj.DrawPages.getByName(index) + return LODrawPage(page) + + @property + def selection(self): + sel = self.obj.CurrentSelection[0] + return _get_class_uno(sel) + + @property + def current_page(self): + return LODrawPage(self._cc.getCurrentPage()) + + def paste(self): + call_dispatch(self.frame, '.uno:Paste') + return self.selection + + def add(self, type_shape, args={}): + return self.current_page.add(type_shape, args) + + def insert_image(self, path, args={}): + self.current_page.insert_image(path, args) + return + + # ~ def export(self, path, mimetype='png'): + # ~ args = dict( + # ~ URL = _P.to_url(path), + # ~ MimeType = MIME_TYPE[mimetype], + # ~ ) + # ~ result = _export_image(self.obj, args) + # ~ return result + + +class LODraw(LODrawImpress): + + def __init__(self, obj): + super().__init__(obj) + self._type = DRAW + + +class LOImpress(LODrawImpress): + + def __init__(self, obj): + super().__init__(obj) + self._type = IMPRESS + + +class BaseDateField(DateField): + + def db_value(self, value): + return _date_to_struct(value) + + def python_value(self, value): + return _struct_to_date(value) + + +class BaseTimeField(TimeField): + + def db_value(self, value): + return _date_to_struct(value) + + def python_value(self, value): + return _struct_to_date(value) + + +class BaseDateTimeField(DateTimeField): + + def db_value(self, value): + return _date_to_struct(value) + + def python_value(self, value): + return _struct_to_date(value) + + +class FirebirdDatabase(Database): + field_types = {'BOOL': 'BOOLEAN', 'DATETIME': 'TIMESTAMP'} + + def __init__(self, database, **kwargs): + super().__init__(database, **kwargs) + self._db = database + + def _connect(self): + return self._db + + def create_tables(self, models, **options): + options['safe'] = False + tables = self._db.tables + models = [m for m in models if not m.__name__.lower() in tables] + super().create_tables(models, **options) + + def execute_sql(self, sql, params=None, commit=True): + with __exception_wrapper__: + cursor = self._db.execute(sql, params) + return cursor + + def last_insert_id(self, cursor, query_type=None): + # ~ debug('LAST_ID', cursor) + return 0 + + def rows_affected(self, cursor): + return self._db.rows_affected + + @property + def path(self): + return self._db.path + + +class BaseRow: + pass + + +class BaseQuery(object): + PY_TYPES = { + 'SQL_LONG': 'getLong', + 'SQL_VARYING': 'getString', + 'SQL_FLOAT': 'getFloat', + 'SQL_BOOLEAN': 'getBoolean', + 'SQL_TYPE_DATE': 'getDate', + 'SQL_TYPE_TIME': 'getTime', + 'SQL_TIMESTAMP': 'getTimestamp', + } + TYPES_DATE = ('SQL_TYPE_DATE', 'SQL_TYPE_TIME', 'SQL_TIMESTAMP') + + def __init__(self, query): + self._query = query + self._meta = query.MetaData + self._cols = self._meta.ColumnCount + self._names = query.Columns.ElementNames + self._data = self._get_data() + + def __getitem__(self, index): + return self._data[index] + + def __iter__(self): + self._index = 0 + return self + + def __next__(self): + try: + row = self._data[self._index] + except IndexError: + raise StopIteration + self._index += 1 + return row + + def _to_python(self, index): + type_field = self._meta.getColumnTypeName(index) + value = getattr(self._query, self.PY_TYPES[type_field])(index) + if type_field in self.TYPES_DATE: + value = _struct_to_date(value) + return value + + def _get_row(self): + row = BaseRow() + for i in range(1, self._cols + 1): + column_name = self._meta.getColumnName(i) + value = self._to_python(i) + setattr(row, column_name, value) + return row + + def _get_data(self): + data = [] + while self._query.next(): + row = self._get_row() + data.append(row) + return data + + @property + def tuples(self): + data = [tuple(r.__dict__.values()) for r in self._data] + return tuple(data) + + @property + def dicts(self): + data = [r.__dict__ for r in self._data] + return tuple(data) + + +class LOBase(object): + DB_TYPES = { + str: 'setString', + int: 'setInt', + float: 'setFloat', + bool: 'setBoolean', + Date: 'setDate', + Time: 'setTime', + DateTime: 'setTimestamp', + } + # ~ setArray + # ~ setBinaryStream + # ~ setBlob + # ~ setByte + # ~ setBytes + # ~ setCharacterStream + # ~ setClob + # ~ setNull + # ~ setObject + # ~ setObjectNull + # ~ setObjectWithInfo + # ~ setPropertyValue + # ~ setRef + + def __init__(self, obj, args={}): + self._obj = obj + self._type = BASE + self._dbc = create_instance('com.sun.star.sdb.DatabaseContext') + self._rows_affected = 0 + path = args.get('path', '') + self._path = _P(path) + self._name = self._path.name + if _P.exists(path): + if not self.is_registered: + self.register() + db = self._dbc.getByName(self.name) + else: + db = self._dbc.createInstance() + db.URL = 'sdbc:embedded:firebird' + db.DatabaseDocument.storeAsURL(self._path.url, ()) + self.register() + self._obj = db + self._con = db.getConnection('', '') + + def __contains__(self, item): + return item in self.tables + + @property + def obj(self): + return self._obj + + @property + def name(self): + return self._name + + @property + def path(self): + return str(self._path) + + @property + def is_registered(self): + return self._dbc.hasRegisteredDatabase(self.name) + + @property + def tables(self): + tables = [t.Name.lower() for t in self._con.getTables()] + return tables + + @property + def rows_affected(self): + return self._rows_affected + + def register(self): + if not self.is_registered: + self._dbc.registerDatabaseLocation(self.name, self._path.url) + return + + def revoke(self, name): + self._dbc.revokeDatabaseLocation(name) + return True + + def save(self): + self.obj.DatabaseDocument.store() + self.refresh() + return + + def close(self): + self._con.close() + return + + def refresh(self): + self._con.getTables().refresh() + return + + def initialize(self, database_proxy, tables): + db = FirebirdDatabase(self) + database_proxy.initialize(db) + db.create_tables(tables) + return + + def _validate_sql(self, sql, params): + limit = ' LIMIT ' + for p in params: + sql = sql.replace('?', f"'{p}'", 1) + if limit in sql: + sql = sql.split(limit)[0] + sql = sql.replace('SELECT', f'SELECT FIRST {params[-1]}') + return sql + + def cursor(self, sql, params): + if sql.startswith('SELECT'): + sql = self._validate_sql(sql, params) + cursor = self._con.prepareStatement(sql) + return cursor + + if not params: + cursor = self._con.createStatement() + return cursor + + cursor = self._con.prepareStatement(sql) + for i, v in enumerate(params, 1): + t = type(v) + if not t in self.DB_TYPES: + error('Type not support') + debug((i, t, v, self.DB_TYPES[t])) + getattr(cursor, self.DB_TYPES[t])(i, v) + return cursor + + def execute(self, sql, params): + debug(sql, params) + cursor = self.cursor(sql, params) + + if sql.startswith('SELECT'): + result = cursor.executeQuery() + elif params: + result = cursor.executeUpdate() + self._rows_affected = result + self.save() + else: + result = cursor.execute(sql) + self.save() + + return result + + def select(self, sql): + debug('SELECT', sql) + if not sql.startswith('SELECT'): + return () + + cursor = self._con.prepareStatement(sql) + query = cursor.executeQuery() + return BaseQuery(query) + + def get_query(self, query): + sql, args = query.sql() + sql = self._validate_sql(sql, args) + return self.select(sql) + + +class LOMath(LODocument): + + def __init__(self, obj): + super().__init__(obj) + self._type = MATH + + +class LOBasic(LODocument): + + def __init__(self, obj): + super().__init__(obj) + self._type = BASIC + + +class LODocs(object): + _desktop = None + + def __init__(self): + self._desktop = get_desktop() + LODocs._desktop = self._desktop + + def __getitem__(self, index): + doc = None + for i, doc in enumerate(self._desktop.Components): + if isinstance(index, int) and i == index: + doc = _get_class_doc(doc) + break + elif isinstance(index, str) and doc.Title == index: + doc = _get_class_doc(doc) + break + return doc + + def __contains__(self, item): + doc = self[item] + return not doc is None + + def __iter__(self): + self._i = 0 + return self + + def __next__(self): + doc = self[self._i] + if doc is None: + raise StopIteration + self._i += 1 + return doc + + def __len__(self): + for i, _ in enumerate(self._desktop.Components): + pass + return i + 1 + + @property + def active(self): + return _get_class_doc(self._desktop.getCurrentComponent()) + + @classmethod + def new(cls, type_doc=CALC, args={}): + if type_doc == BASE: + return LOBase(None, args) + + path = f'private:factory/s{type_doc}' + opt = dict_to_property(args) + doc = cls._desktop.loadComponentFromURL(path, '_default', 0, opt) + return _get_class_doc(doc) + + @classmethod + def open(cls, path, args={}): + """ Open document in path + Usually options: + Hidden: True or False + AsTemplate: True or False + ReadOnly: True or False + Password: super_secret + MacroExecutionMode: 4 = Activate macros + Preview: True or False + + http://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1frame_1_1XComponentLoader.html + http://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1document_1_1MediaDescriptor.html + """ + path = _path_url(path) + opt = dict_to_property(args) + doc = cls._desktop.loadComponentFromURL(path, '_default', 0, opt) + if doc is None: + return + + return _get_class_doc(doc) + + def connect(self, path): + return LOBase(None, {'path': path}) + + +def _add_listeners(events, control, name=''): + listeners = { + 'addActionListener': EventsButton, + 'addMouseListener': EventsMouse, + 'addFocusListener': EventsFocus, + # ~ 'addItemListener': EventsItem, + # ~ 'addKeyListener': EventsKey, + # ~ 'addTabListener': EventsTab, + } + if hasattr(control, 'obj'): + control = control.obj + # ~ debug(control.ImplementationName) + is_grid = control.ImplementationName == 'stardiv.Toolkit.GridControl' + is_link = control.ImplementationName == 'stardiv.Toolkit.UnoFixedHyperlinkControl' + is_roadmap = control.ImplementationName == 'stardiv.Toolkit.UnoRoadmapControl' + + for key, value in listeners.items(): + if hasattr(control, key): + if is_grid and key == 'addMouseListener': + control.addMouseListener(EventsMouseGrid(events, name)) + continue + if is_link and key == 'addMouseListener': + control.addMouseListener(EventsMouseLink(events, name)) + continue + if is_roadmap and key == 'addItemListener': + control.addItemListener(EventsItemRoadmap(events, name)) + continue + + getattr(control, key)(listeners[key](events, name)) + + # ~ if is_grid: + # ~ controllers = EventsGrid(events, name) + # ~ control.addSelectionListener(controllers) + # ~ control.Model.GridDataModel.addGridDataListener(controllers) + return + + +def _set_properties(model, properties): + if 'X' in properties: + properties['PositionX'] = properties.pop('X') + if 'Y' in properties: + properties['PositionY'] = properties.pop('Y') + keys = tuple(properties.keys()) + values = tuple(properties.values()) + model.setPropertyValues(keys, values) + return + + +class EventsListenerBase(unohelper.Base, XEventListener): + + def __init__(self, controller, name, window=None): + self._controller = controller + self._name = name + self._window = window + + @property + def name(self): + return self._name + + def disposing(self, event): + self._controller = None + if not self._window is None: + self._window.setMenuBar(None) + + +class EventsMouse(EventsListenerBase, XMouseListener, XMouseMotionListener): + + def __init__(self, controller, name): + super().__init__(controller, name) + + def mousePressed(self, event): + event_name = '{}_click'.format(self._name) + if event.ClickCount == 2: + event_name = '{}_double_click'.format(self._name) + if hasattr(self._controller, event_name): + getattr(self._controller, event_name)(event) + return + + def mouseReleased(self, event): + pass + + def mouseEntered(self, event): + pass + + def mouseExited(self, event): + pass + + # ~ XMouseMotionListener + def mouseMoved(self, event): + pass + + def mouseDragged(self, event): + pass + + +class EventsMouseLink(EventsMouse): + + def __init__(self, controller, name): + super().__init__(controller, name) + self._text_color = 0 + + def mouseEntered(self, event): + model = event.Source.Model + self._text_color = model.TextColor or 0 + model.TextColor = get_color('blue') + return + + def mouseExited(self, event): + model = event.Source.Model + model.TextColor = self._text_color + return + + +class EventsButton(EventsListenerBase, XActionListener): + + def __init__(self, controller, name): + super().__init__(controller, name) + + def actionPerformed(self, event): + event_name = f'{self.name}_action' + if hasattr(self._controller, event_name): + getattr(self._controller, event_name)(event) + return + + +class EventsFocus(EventsListenerBase, XFocusListener): + CONTROLS = ( + 'stardiv.Toolkit.UnoControlEditModel', + ) + + def __init__(self, controller, name): + super().__init__(controller, name) + + def focusGained(self, event): + service = event.Source.Model.ImplementationName + # ~ print('Focus enter', service) + if service in self.CONTROLS: + obj = event.Source.Model + obj.BackgroundColor = COLOR_ON_FOCUS + return + + def focusLost(self, event): + service = event.Source.Model.ImplementationName + if service in self.CONTROLS: + obj = event.Source.Model + obj.BackgroundColor = -1 + return + + +# ~ BorderColor = ? +# ~ FontStyleName = ? +# ~ HelpURL = ? +class UnoBaseObject(object): + + def __init__(self, obj): + self._obj = obj + self._model = obj.Model + + def __setattr__(self, name, value): + exists = hasattr(self, name) + if not exists and not name in ('_obj', '_model'): + setattr(self._model, name, value) + else: + super().__setattr__(name, value) + + @property + def obj(self): + return self._obj + + @property + def model(self): + return self._model + @property + def m(self): + return self._model + + @property + def properties(self): + return {} + @properties.setter + def properties(self, values): + _set_properties(self.model, values) + + @property + def name(self): + return self.model.Name + + @property + def parent(self): + return self.obj.Context + + @property + def tag(self): + return self.model.Tag + @tag.setter + def tag(self, value): + self.model.Tag = value + + @property + def visible(self): + return self.obj.Visible + @visible.setter + def visible(self, value): + self.obj.setVisible(value) + + @property + def enabled(self): + return self.model.Enabled + @enabled.setter + def enabled(self, value): + self.model.Enabled = value + + @property + def step(self): + return self.model.Step + @step.setter + def step(self, value): + self.model.Step = value + + @property + def align(self): + return self.model.Align + @align.setter + def align(self, value): + self.model.Align = value + + @property + def valign(self): + return self.model.VerticalAlign + @valign.setter + def valign(self, value): + self.model.VerticalAlign = value + + @property + def font_weight(self): + return self.model.FontWeight + @font_weight.setter + def font_weight(self, value): + self.model.FontWeight = value + + @property + def font_height(self): + return self.model.FontHeight + @font_height.setter + def font_height(self, value): + self.model.FontHeight = value + + @property + def font_name(self): + return self.model.FontName + @font_name.setter + def font_name(self, value): + self.model.FontName = value + + @property + def font_underline(self): + return self.model.FontUnderline + @font_underline.setter + def font_underline(self, value): + self.model.FontUnderline = value + + @property + def text_color(self): + return self.model.TextColor + @text_color.setter + def text_color(self, value): + self.model.TextColor = value + + @property + def back_color(self): + return self.model.BackgroundColor + @back_color.setter + def back_color(self, value): + self.model.BackgroundColor = value + + @property + def multi_line(self): + return self.model.MultiLine + @multi_line.setter + def multi_line(self, value): + self.model.MultiLine = value + + @property + def help_text(self): + return self.model.HelpText + @help_text.setter + def help_text(self, value): + self.model.HelpText = value + + @property + def border(self): + return self.model.Border + @border.setter + def border(self, value): + # ~ Bug for report + self.model.Border = value + + @property + def width(self): + return self._model.Width + @width.setter + def width(self, value): + self.model.Width = value + + @property + def height(self): + return self.model.Height + @height.setter + def height(self, value): + self.model.Height = value + + def _get_possize(self, name): + ps = self.obj.getPosSize() + return getattr(ps, name) + + def _set_possize(self, name, value): + ps = self.obj.getPosSize() + setattr(ps, name, value) + self.obj.setPosSize(ps.X, ps.Y, ps.Width, ps.Height, POSSIZE) + return + + @property + def x(self): + if hasattr(self.model, 'PositionX'): + return self.model.PositionX + return self._get_possize('X') + @x.setter + def x(self, value): + if hasattr(self.model, 'PositionX'): + self.model.PositionX = value + else: + self._set_possize('X', value) + + @property + def y(self): + if hasattr(self.model, 'PositionY'): + return self.model.PositionY + return self._get_possize('Y') + @y.setter + def y(self, value): + if hasattr(self.model, 'PositionY'): + self.model.PositionY = value + else: + self._set_possize('Y', value) + + @property + def tab_index(self): + return self._model.TabIndex + @tab_index.setter + def tab_index(self, value): + self.model.TabIndex = value + + @property + def tab_stop(self): + return self._model.Tabstop + @tab_stop.setter + def tab_stop(self, value): + self.model.Tabstop = value + + def center(self, horizontal=True, vertical=False): + p = self.parent.Model + w = p.Width + h = p.Height + if horizontal: + x = w / 2 - self.width / 2 + self.x = x + if vertical: + y = h / 2 - self.height / 2 + self.y = y + return + + def move(self, origin, x=0, y=5, center=False): + if x: + self.x = origin.x + origin.width + x + else: + self.x = origin.x + if y: + self.y = origin.y + origin.height + y + else: + self.y = origin.y + + if center: + self.center() + return + + +class UnoLabel(UnoBaseObject): + + def __init__(self, obj): + super().__init__(obj) + + @property + def type(self): + return 'label' + + @property + def value(self): + return self.model.Label + @value.setter + def value(self, value): + self.model.Label = value + + +class UnoLabelLink(UnoLabel): + + def __init__(self, obj): + super().__init__(obj) + + @property + def type(self): + return 'link' + + +class UnoButton(UnoBaseObject): + + def __init__(self, obj): + super().__init__(obj) + + @property + def type(self): + return 'button' + + @property + def value(self): + return self.model.Label + @value.setter + def value(self, value): + self.model.Label = value + + +class UnoRadio(UnoBaseObject): + + def __init__(self, obj): + super().__init__(obj) + + @property + def type(self): + return 'radio' + + @property + def value(self): + return self.model.Label + @value.setter + def value(self, value): + self.model.Label = value + + +class UnoCheck(UnoBaseObject): + + def __init__(self, obj): + super().__init__(obj) + + @property + def type(self): + return 'check' + + @property + def value(self): + return self.model.State + @value.setter + def value(self, value): + self.model.State = value + + @property + def label(self): + return self.model.Label + @label.setter + def label(self, value): + self.model.Label = value + + @property + def tri_state(self): + return self.model.TriState + @tri_state.setter + def tri_state(self, value): + self.model.TriState = value + + +# ~ https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1awt_1_1UnoControlEditModel.html +class UnoText(UnoBaseObject): + + def __init__(self, obj): + super().__init__(obj) + + @property + def type(self): + return 'text' + + @property + def value(self): + return self.model.Text + @value.setter + def value(self, value): + self.model.Text = value + + +UNO_CLASSES = { + 'label': UnoLabel, + 'link': UnoLabelLink, + 'button': UnoButton, + 'radio': UnoRadio, + 'check': UnoCheck, + 'text': UnoText, +} + + +class LODialog(object): + MODELS = { + 'label': 'com.sun.star.awt.UnoControlFixedTextModel', + 'link': 'com.sun.star.awt.UnoControlFixedHyperlinkModel', + 'button': 'com.sun.star.awt.UnoControlButtonModel', + 'radio': 'com.sun.star.awt.UnoControlRadioButtonModel', + 'check': 'com.sun.star.awt.UnoControlCheckBoxModel', + 'text': 'com.sun.star.awt.UnoControlEditModel', + # ~ 'grid': 'com.sun.star.awt.grid.UnoControlGridModel', + # ~ 'groupbox': 'com.sun.star.awt.UnoControlGroupBoxModel', + # ~ 'listbox': 'com.sun.star.awt.UnoControlListBoxModel', + # ~ 'roadmap': 'com.sun.star.awt.UnoControlRoadmapModel', + # ~ 'tree': 'com.sun.star.awt.tree.TreeControlModel', + # ~ 'groupbox': 'com.sun.star.awt.UnoControlGroupBoxModel', + # ~ 'image': 'com.sun.star.awt.UnoControlImageControlModel', + # ~ 'pages': 'com.sun.star.awt.UnoMultiPageModel', + } + + def __init__(self, args): + self._obj = self._create(args) + self._model = self.obj.Model + self._events = None + self._modal = True + self._controls = {} + self._color_on_focus = COLOR_ON_FOCUS + + def _create(self, args): + service = 'com.sun.star.awt.DialogProvider' + path = args.pop('Path', '') + if path: + dp = create_instance(service, True) + dlg = dp.createDialog(_path_url(path)) + return dlg + + if 'Location' in args: + name = args['Name'] + library = args.get('Library', 'Standard') + location = args.get('Location', 'application') + if location == 'user': + location = 'application' + url = f'vnd.sun.star.script:{library}.{name}?location={location}' + if location == 'document': + dp = create_instance(service, args=docs.active.obj) + else: + dp = create_instance(service, True) + # ~ uid = docs.active.uid + # ~ url = f'vnd.sun.star.tdoc:/{uid}/Dialogs/{library}/{name}.xml' + dlg = dp.createDialog(url) + return dlg + + dlg = create_instance('com.sun.star.awt.UnoControlDialog', True) + model = create_instance('com.sun.star.awt.UnoControlDialogModel', True) + toolkit = create_instance('com.sun.star.awt.Toolkit', True) + _set_properties(model, args) + dlg.setModel(model) + dlg.setVisible(False) + dlg.createPeer(toolkit, None) + return dlg + + @property + def obj(self): + return self._obj + + @property + def model(self): + return self._model + + @property + def controls(self): + return self._controls + + @property + def visible(self): + return self.obj.Visible + @visible.setter + def visible(self, value): + self.obj.Visible = value + + @property + def events(self): + return self._events + @events.setter + def events(self, controllers): + self._events = controllers(self) + self._connect_listeners() + + @property + def color_on_focus(self): + return self._color_on_focus + @color_on_focus.setter + def color_on_focus(self, value): + self._color_on_focus = get_color(value) + + def _connect_listeners(self): + for control in self.obj.Controls: + _add_listeners(self.events, control, control.Model.Name) + return + + def _special_properties(self, tipo, args): + columns = args.pop('Columns', ()) + + if tipo == 'link' and not 'Label' in args: + args['Label'] = args['URL'] + elif tipo == 'grid': + args['ColumnModel'] = self._set_column_model(columns) + elif tipo == 'button': + if 'ImageURL' in args: + args['ImageURL'] = self._set_image_url(args['ImageURL']) + if not 'FocusOnClick' in args: + args['FocusOnClick'] = False + elif tipo == 'roadmap': + if not 'Height' in args: + args['Height'] = self.height + if 'Title' in args: + args['Text'] = args.pop('Title') + elif tipo == 'tab': + if not 'Width' in args: + args['Width'] = self.width + if not 'Height' in args: + args['Height'] = self.height + + return args + + def add_control(self, args): + tipo = args.pop('Type').lower() + root = args.pop('Root', '') + sheets = args.pop('Sheets', ()) + + args = self._special_properties(tipo, args) + model = self.model.createInstance(self.MODELS[tipo]) + _set_properties(model, args) + name = args['Name'] + self.model.insertByName(name, model) + control = self.obj.getControl(name) + _add_listeners(self.events, control, name) + control = UNO_CLASSES[tipo](control) + + if tipo == 'tree' and root: + control.root = root + elif tipo == 'pages' and sheets: + control.sheets = sheets + control.events = self.events + + setattr(self, name, control) + self._controls[name] = control + return control + + def open(self, modal=True): + self._modal = modal + if modal: + return self.obj.execute() + else: + self.visible = True + return + + def close(self, value=0): + if self._modal: + value = self.obj.endDialog(value) + else: + self.visible = False + self.obj.dispose() + return value + + +class LOSheets(object): + + def __getitem__(self, index): + return LODocs().active[index] + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + pass + + +class LOCells(object): + + def __getitem__(self, index): + return LODocs().active.active[index] + + +class LOShortCut(object): +# ~ getKeyEventsByCommand + + def __init__(self, app): + self._app = app + self._scm = None + self._init_values() + + def _init_values(self): + name = 'com.sun.star.ui.GlobalAcceleratorConfiguration' + instance = 'com.sun.star.ui.ModuleUIConfigurationManagerSupplier' + service = TYPE_DOC[self._app] + manager = create_instance(instance, True) + uicm = manager.getUIConfigurationManager(service) + self._scm = uicm.ShortCutManager + return + + def __contains__(self, item): + cmd = self._get_command(item) + return bool(cmd) + + def _get_key_event(self, command): + events = self._scm.AllKeyEvents + for event in events: + cmd = self._scm.getCommandByKeyEvent(event) + if cmd == command: + break + return event + + def _to_key_event(self, shortcut): + key_event = KeyEvent() + keys = shortcut.split('+') + for v in keys[:-1]: + key_event.Modifiers += MODIFIERS[v.lower()] + key_event.KeyCode = getattr(Key, keys[-1].upper()) + return key_event + + def _get_command(self, shortcut): + command = '' + key_event = self._to_key_event(shortcut) + try: + command = self._scm.getCommandByKeyEvent(key_event) + except NoSuchElementException: + debug(f'No exists: {shortcut}') + return command + + def add(self, shortcut, command): + if isinstance(command, dict): + command = _get_url_script(command) + key_event = self._to_key_event(shortcut) + self._scm.setKeyEvent(key_event, command) + self._scm.store() + return + + def reset(self): + self._scm.reset() + self._scm.store() + return + + def remove(self, shortcut): + key_event = self._to_key_event(shortcut) + try: + self._scm.removeKeyEvent(key_event) + self._scm.store() + except NoSuchElementException: + debug(f'No exists: {shortcut}') + return + + def remove_by_command(self, command): + if isinstance(command, dict): + command = _get_url_script(command) + try: + self._scm.removeCommandFromAllKeyEvents(command) + self._scm.store() + except NoSuchElementException: + debug(f'No exists: {command}') + return + + +class LOShortCuts(object): + + def __getitem__(self, index): + return LOShortCut(index) + + +class LOMenu(object): + + def __init__(self, app): + self._app = app + self._ui = None + self._pymenus = None + self._menu = None + self._menus = self._get_menus() + + def __getitem__(self, index): + if isinstance(index, int): + self._menu = self._menus[index] + else: + for menu in self._menus: + cmd = menu.get('CommandURL', '') + if MENUS[index.lower()] == cmd: + self._menu = menu + break + line = self._menu.get('CommandURL', '') + line += self._get_submenus(self._menu['ItemDescriptorContainer']) + return line + + def _get_menus(self): + instance = 'com.sun.star.ui.ModuleUIConfigurationManagerSupplier' + service = TYPE_DOC[self._app] + manager = create_instance(instance, True) + self._ui = manager.getUIConfigurationManager(service) + self._pymenus = self._ui.getSettings(NODE_MENUBAR, True) + data = [] + for menu in self._pymenus: + data.append(data_to_dict(menu)) + return data + + def _get_info(self, menu): + line = menu.get('CommandURL', '') + line += self._get_submenus(menu['ItemDescriptorContainer']) + return line + + def _get_submenus(self, menu, level=1): + line = '' + for i, v in enumerate(menu): + data = data_to_dict(v) + cmd = data.get('CommandURL', '----------') + line += f'\n{" " * level}├─ ({i}) {cmd}' + submenu = data.get('ItemDescriptorContainer', None) + if not submenu is None: + line += self._get_submenus(submenu, level + 1) + return line + + def __str__(self): + info = '\n'.join([self._get_info(m) for m in self._menus]) + return info + + def _get_index_menu(self, menu, command): + index = -1 + for i, v in enumerate(menu): + data = data_to_dict(v) + cmd = data.get('CommandURL', '') + if cmd == command: + index = i + break + return index + + def insert(self, name, args): + idc = None + replace = False + command = args['CommandURL'] + label = args['Label'] + + self[name] + menu = self._menu['ItemDescriptorContainer'] + submenu = args.get('Submenu', False) + if submenu: + idc = self._ui.createSettings() + + index = self._get_index_menu(menu, command) + if index == -1: + if 'Index' in args: + index = args['Index'] + else: + index = self._get_index_menu(menu, args['After']) + 1 + else: + replace = True + + data = dict ( + CommandURL = command, + Label = label, + Style = 0, + Type = 0, + ItemDescriptorContainer = idc, + ) + self._save(menu, data, index, replace) + self._insert_submenu(idc, submenu) + return + + def _get_command(self, args): + shortcut = args.get('ShortCut', '') + cmd = args['CommandURL'] + if isinstance(cmd, dict): + cmd = _get_url_script(cmd) + if shortcut: + LOShortCut(self._app).add(shortcut, cmd) + return cmd + + def _insert_submenu(self, parent, menus): + for i, v in enumerate(menus): + submenu = v.pop('Submenu', False) + if submenu: + idc = self._ui.createSettings() + v['ItemDescriptorContainer'] = idc + v['Type'] = 0 + if v['Label'] == '-': + v['Type'] = 1 + else: + v['CommandURL'] = self._get_command(v) + self._save(parent, v, i) + if submenu: + self._insert_submenu(idc, submenu) + return + + def remove(self, name, command): + self[name] + menu = self._menu['ItemDescriptorContainer'] + index = self._get_index_menu(menu, command) + if index > -1: + uno.invoke(menu, 'removeByIndex', (index,)) + self._ui.replaceSettings(NODE_MENUBAR, self._pymenus) + self._ui.store() + return + + def _save(self, menu, properties, index, replace=False): + properties = dict_to_property(properties, True) + if replace: + uno.invoke(menu, 'replaceByIndex', (index, properties)) + else: + uno.invoke(menu, 'insertByIndex', (index, properties)) + self._ui.replaceSettings(NODE_MENUBAR, self._pymenus) + self._ui.store() + return + + +class LOMenus(object): + + def __getitem__(self, index): + return LOMenu(index) + + +class classproperty: + def __init__(self, method=None): + self.fget = method + + def __get__(self, instance, cls=None): + return self.fget(cls) + + def getter(self, method): + self.fget = method + return self + + +class Paths(object): + + def __init__(self, path=''): + if path.startswith('file://'): + path = str(Path(uno.fileUrlToSystemPath(path)).resolve()) + self._path = Path(path) + + @property + def path(self): + return str(self._path.parent) + + @property + def file_name(self): + return self._path.name + + @property + def name(self): + return self._path.stem + + @property + def ext(self): + return self._path.suffix + + @property + def info(self): + return self.path, self.file_name, self.name, self.ext + + @property + def url(self): + return self._path.as_uri() + + @classproperty + def home(self): + return str(Path.home()) + + @classmethod + def replace_ext(cls, path, new_ext): + p = Paths(path) + name = f'{p.name}.{new_ext}' + path = cls.join(p.path, name) + return path + + @classmethod + def exists(cls, path): + result = False + if path: + path = cls.to_system(path) + result = Path(path).exists() + return result + + @classmethod + def exists_app(cls, name_app): + return bool(shutil.which(name_app)) + + @classmethod + def open(cls, path): + if IS_WIN: + os.startfile(path) + else: + pid = subprocess.Popen(['xdg-open', path]).pid + return + + @classmethod + def is_dir(cls, path): + return Path(path).is_dir() + + @classmethod + def join(cls, *paths): + return str(Path(paths[0]).joinpath(*paths[1:])) + + @classmethod + def save(cls, path, data, encoding='utf-8'): + result = bool(Path(path).write_text(data, encoding=encoding)) + return result + + @classmethod + def save_bin(cls, path, data): + result = bool(Path(path).write_bytes(data)) + return result + + @classmethod + def to_url(cls, path): + if not path.startswith('file://'): + path = Path(path).as_uri() + return path + + @classmethod + def to_system(cls, path): + if path.startswith('file://'): + path = str(Path(uno.fileUrlToSystemPath(path)).resolve()) + return path + + @classmethod + def walk(cls, path, filters=''): + paths = [] + if filters in ('*', '*.*'): + filters = '' + for folder, _, files in os.walk(path): + if filters: + pattern = re.compile(r'\.(?:{})$'.format(filters), re.IGNORECASE) + paths += [cls.join(folder, f) for f in files if pattern.search(f)] + else: + paths += files + return paths + + @classmethod + def copy(cls, source, target='', name=''): + p, f, n, e = _P(source).info + if target: + p = target + if name: + e = '' + n = name + path_new = cls.join(p, f'{n}{e}') + shutil.copy(source, path_new) + return path_new +_P = Paths + + +def __getattr__(name): + if name == 'active': + return LODocs().active + if name == 'active_sheet': + return LODocs().active.active + if name == 'selection': + return LODocs().active.selection + if name in ('rectangle', 'pos_size'): + return Rectangle() + if name == 'paths': + return Paths + if name == 'docs': + return LODocs() + if name == 'sheets': + return LOSheets() + if name == 'cells': + return LOCells() + if name == 'menus': + return LOMenus() + if name == 'shortcuts': + return LOShortCuts() + raise AttributeError(f"module '{__name__}' has no attribute '{name}'") + + +def create_dialog(args): + return LODialog(args) + + +def inputbox(message, default='', title=TITLE, echochar=''): + + class ControllersInput(object): + + def __init__(self, dlg): + self.d = dlg + + def cmd_ok_action(self, event): + self.d.close(1) + return + + args = { + 'Title': title, + 'Width': 200, + 'Height': 80, + } + dlg = LODialog(args) + dlg.events = ControllersInput + + args = { + 'Type': 'Label', + 'Name': 'lbl_msg', + 'Label': message, + 'Width': 140, + 'Height': 50, + 'X': 5, + 'Y': 5, + 'MultiLine': True, + 'Border': 1, + } + dlg.add_control(args) + + args = { + 'Type': 'Text', + 'Name': 'txt_value', + 'Text': default, + 'Width': 190, + 'Height': 15, + } + if echochar: + args['EchoChar'] = ord(echochar[0]) + dlg.add_control(args) + dlg.txt_value.move(dlg.lbl_msg) + + args = { + 'Type': 'button', + 'Name': 'cmd_ok', + 'Label': _('OK'), + 'Width': 40, + 'Height': 15, + 'DefaultButton': True, + 'PushButtonType': 1, + } + dlg.add_control(args) + dlg.cmd_ok.move(dlg.lbl_msg, 10, 0) + + args = { + 'Type': 'button', + 'Name': 'cmd_cancel', + 'Label': _('Cancel'), + 'Width': 40, + 'Height': 15, + 'PushButtonType': 2, + } + dlg.add_control(args) + dlg.cmd_cancel.move(dlg.cmd_ok) + + if dlg.open(): + return dlg.txt_value.value + + return '' + + +def get_fonts(): + toolkit = create_instance('com.sun.star.awt.Toolkit') + device = toolkit.createScreenCompatibleDevice(0, 0) + return device.FontDescriptors + + +# ~ From request +# ~ https://github.com/psf/requests/blob/master/requests/structures.py#L15 +class CaseInsensitiveDict(MutableMapping): + + def __init__(self, data=None, **kwargs): + self._store = OrderedDict() + if data is None: + data = {} + self.update(data, **kwargs) + + def __setitem__(self, key, value): + # Use the lowercased key for lookups, but store the actual + # key alongside the value. + self._store[key.lower()] = (key, value) + + def __getitem__(self, key): + return self._store[key.lower()][1] + + def __delitem__(self, key): + del self._store[key.lower()] + + def __iter__(self): + return (casedkey for casedkey, mappedvalue in self._store.values()) + + def __len__(self): + return len(self._store) + + def lower_items(self): + """Like iteritems(), but with all lowercase keys.""" + values = ( + (lowerkey, keyval[1]) for (lowerkey, keyval) in self._store.items() + ) + return values + + # Copy is required + def copy(self): + return CaseInsensitiveDict(self._store.values()) + + def __repr__(self): + return str(dict(self.items())) + + +# ~ https://en.wikipedia.org/wiki/Web_colors +def get_color(value): + COLORS = { + 'aliceblue': 15792383, + 'antiquewhite': 16444375, + 'aqua': 65535, + 'aquamarine': 8388564, + 'azure': 15794175, + 'beige': 16119260, + 'bisque': 16770244, + 'black': 0, + 'blanchedalmond': 16772045, + 'blue': 255, + 'blueviolet': 9055202, + 'brown': 10824234, + 'burlywood': 14596231, + 'cadetblue': 6266528, + 'chartreuse': 8388352, + 'chocolate': 13789470, + 'coral': 16744272, + 'cornflowerblue': 6591981, + 'cornsilk': 16775388, + 'crimson': 14423100, + 'cyan': 65535, + 'darkblue': 139, + 'darkcyan': 35723, + 'darkgoldenrod': 12092939, + 'darkgray': 11119017, + 'darkgreen': 25600, + 'darkgrey': 11119017, + 'darkkhaki': 12433259, + 'darkmagenta': 9109643, + 'darkolivegreen': 5597999, + 'darkorange': 16747520, + 'darkorchid': 10040012, + 'darkred': 9109504, + 'darksalmon': 15308410, + 'darkseagreen': 9419919, + 'darkslateblue': 4734347, + 'darkslategray': 3100495, + 'darkslategrey': 3100495, + 'darkturquoise': 52945, + 'darkviolet': 9699539, + 'deeppink': 16716947, + 'deepskyblue': 49151, + 'dimgray': 6908265, + 'dimgrey': 6908265, + 'dodgerblue': 2003199, + 'firebrick': 11674146, + 'floralwhite': 16775920, + 'forestgreen': 2263842, + 'fuchsia': 16711935, + 'gainsboro': 14474460, + 'ghostwhite': 16316671, + 'gold': 16766720, + 'goldenrod': 14329120, + 'gray': 8421504, + 'grey': 8421504, + 'green': 32768, + 'greenyellow': 11403055, + 'honeydew': 15794160, + 'hotpink': 16738740, + 'indianred': 13458524, + 'indigo': 4915330, + 'ivory': 16777200, + 'khaki': 15787660, + 'lavender': 15132410, + 'lavenderblush': 16773365, + 'lawngreen': 8190976, + 'lemonchiffon': 16775885, + 'lightblue': 11393254, + 'lightcoral': 15761536, + 'lightcyan': 14745599, + 'lightgoldenrodyellow': 16448210, + 'lightgray': 13882323, + 'lightgreen': 9498256, + 'lightgrey': 13882323, + 'lightpink': 16758465, + 'lightsalmon': 16752762, + 'lightseagreen': 2142890, + 'lightskyblue': 8900346, + 'lightslategray': 7833753, + 'lightslategrey': 7833753, + 'lightsteelblue': 11584734, + 'lightyellow': 16777184, + 'lime': 65280, + 'limegreen': 3329330, + 'linen': 16445670, + 'magenta': 16711935, + 'maroon': 8388608, + 'mediumaquamarine': 6737322, + 'mediumblue': 205, + 'mediumorchid': 12211667, + 'mediumpurple': 9662683, + 'mediumseagreen': 3978097, + 'mediumslateblue': 8087790, + 'mediumspringgreen': 64154, + 'mediumturquoise': 4772300, + 'mediumvioletred': 13047173, + 'midnightblue': 1644912, + 'mintcream': 16121850, + 'mistyrose': 16770273, + 'moccasin': 16770229, + 'navajowhite': 16768685, + 'navy': 128, + 'oldlace': 16643558, + 'olive': 8421376, + 'olivedrab': 7048739, + 'orange': 16753920, + 'orangered': 16729344, + 'orchid': 14315734, + 'palegoldenrod': 15657130, + 'palegreen': 10025880, + 'paleturquoise': 11529966, + 'palevioletred': 14381203, + 'papayawhip': 16773077, + 'peachpuff': 16767673, + 'peru': 13468991, + 'pink': 16761035, + 'plum': 14524637, + 'powderblue': 11591910, + 'purple': 8388736, + 'red': 16711680, + 'rosybrown': 12357519, + 'royalblue': 4286945, + 'saddlebrown': 9127187, + 'salmon': 16416882, + 'sandybrown': 16032864, + 'seagreen': 3050327, + 'seashell': 16774638, + 'sienna': 10506797, + 'silver': 12632256, + 'skyblue': 8900331, + 'slateblue': 6970061, + 'slategray': 7372944, + 'slategrey': 7372944, + 'snow': 16775930, + 'springgreen': 65407, + 'steelblue': 4620980, + 'tan': 13808780, + 'teal': 32896, + 'thistle': 14204888, + 'tomato': 16737095, + 'turquoise': 4251856, + 'violet': 15631086, + 'wheat': 16113331, + 'white': 16777215, + 'whitesmoke': 16119285, + 'yellow': 16776960, + 'yellowgreen': 10145074, + } + + if isinstance(value, tuple): + color = (value[0] << 16) + (value[1] << 8) + value[2] + else: + if value[0] == '#': + r, g, b = bytes.fromhex(value[1:]) + color = (r << 16) + (g << 8) + b + else: + color = COLORS.get(value.lower(), -1) + return color + + +COLOR_ON_FOCUS = get_color('LightYellow') + + +class LOServer(object): + HOST = 'localhost' + PORT = '8100' + ARG = f'socket,host={HOST},port={PORT};urp;StarOffice.ComponentContext' + CMD = ['soffice', + '-env:SingleAppInstance=false', + '-env:UserInstallation=file:///tmp/LO_Process8100', + '--headless', '--norestore', '--invisible', + f'--accept={ARG}'] + + def __init__(self): + self._server = None + self._ctx = None + self._sm = None + self._start_server() + self._init_values() + + def _init_values(self): + global CTX + global SM + + if not self.is_running: + return + + ctx = uno.getComponentContext() + service = 'com.sun.star.bridge.UnoUrlResolver' + resolver = ctx.ServiceManager.createInstanceWithContext(service, ctx) + self._ctx = resolver.resolve('uno:{}'.format(self.ARG)) + self._sm = self._ctx.getServiceManager() + CTX = self._ctx + SM = self._sm + return + + @property + def is_running(self): + try: + s = socket.create_connection((self.HOST, self.PORT), 5.0) + s.close() + debug('LibreOffice is running...') + return True + except ConnectionRefusedError: + return False + + def _start_server(self): + if self.is_running: + return + + for i in range(3): + self._server = subprocess.Popen(self.CMD, + stdout=subprocess.PIPE, stderr=subprocess.PIPE) + time.sleep(3) + if self.is_running: + break + return + + def stop(self): + if self._server is None: + print('Search pgrep soffice') + else: + self._server.terminate() + debug('LibreOffice is stop...') + return + + def create_instance(self, name, with_context=True): + if with_context: + instance = self._sm.createInstanceWithContext(name, self._ctx) + else: + instance = self._sm.createInstance(name) + return instance + diff --git a/source/registration/license_en.txt b/source/registration/license_en.txt new file mode 100644 index 0000000..04e32b3 --- /dev/null +++ b/source/registration/license_en.txt @@ -0,0 +1,14 @@ +This file is part of ZAZLaTex2SVG. + + ZAZLaTex2SVG is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ZAZLaTex2SVG is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ZAZLaTex2SVG. If not, see . diff --git a/source/registration/license_es.txt b/source/registration/license_es.txt new file mode 100644 index 0000000..04e32b3 --- /dev/null +++ b/source/registration/license_es.txt @@ -0,0 +1,14 @@ +This file is part of ZAZLaTex2SVG. + + ZAZLaTex2SVG is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + ZAZLaTex2SVG is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with ZAZLaTex2SVG. If not, see . diff --git a/zaz.py b/zaz.py new file mode 100755 index 0000000..0953e17 --- /dev/null +++ b/zaz.py @@ -0,0 +1,785 @@ +#!/usr/bin/env python3 + +# == Rapid Develop Macros in LibreOffice == + +# ~ This file is part of ZAZ. + +# ~ ZAZ is free software: you can redistribute it and/or modify +# ~ it under the terms of the GNU General Public License as published by +# ~ the Free Software Foundation, either version 3 of the License, or +# ~ (at your option) any later version. + +# ~ ZAZ is distributed in the hope that it will be useful, +# ~ but WITHOUT ANY WARRANTY; without even the implied warranty of +# ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# ~ GNU General Public License for more details. + +# ~ You should have received a copy of the GNU General Public License +# ~ along with ZAZ. If not, see . + +import argparse +import os +import py_compile +import re +import sys +import zipfile +from datetime import datetime +from pathlib import Path +from shutil import copyfile +from subprocess import call +from xml.etree import ElementTree as ET +from xml.dom.minidom import parseString + + +from conf import ( + DATA, + DIRS, + DOMAIN, + EXTENSION, + FILES, + INFO, + PATHS, + TYPE_EXTENSION, + USE_LOCALES, + log) + + +class LiboXML(object): + CONTEXT = { + 'calc': 'com.sun.star.sheet.SpreadsheetDocument', + 'writer': 'com.sun.star.text.TextDocument', + 'impress': 'com.sun.star.presentation.PresentationDocument', + 'draw': 'com.sun.star.drawing.DrawingDocument', + 'base': 'com.sun.star.sdb.OfficeDatabaseDocument', + 'math': 'com.sun.star.formula.FormulaProperties', + 'basic': 'com.sun.star.script.BasicIDE', + } + TYPES = { + 'py': 'application/vnd.sun.star.uno-component;type=Python', + 'pyc': 'application/binary', + 'zip': 'application/binary', + 'xcu': 'application/vnd.sun.star.configuration-data', + 'rdb': 'application/vnd.sun.star.uno-typelibrary;type=RDB', + 'xcs': 'application/vnd.sun.star.configuration-schema', + 'help': 'application/vnd.sun.star.help', + 'component': 'application/vnd.sun.star.uno-components', + } + NS_MANIFEST = { + 'manifest_version': '1.2', + 'manifest': 'urn:oasis:names:tc:opendocument:xmlns:manifest:1.0', + 'xmlns:loext': 'urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0', + } + NS_DESCRIPTION = { + 'xmlns': 'http://openoffice.org/extensions/description/2006', + 'xmlns:xlink': 'http://www.w3.org/1999/xlink', + 'xmlns:d': 'http://openoffice.org/extensions/description/2006', + } + NS_ADDONS = { + 'xmlns:xs': 'http://www.w3.org/2001/XMLSchema', + 'xmlns:oor': 'http://openoffice.org/2001/registry', + } + NS_UPDATE = { + 'xmlns': 'http://openoffice.org/extensions/update/2006', + 'xmlns:d': 'http://openoffice.org/extensions/description/2006', + 'xmlns:xlink': 'http://www.w3.org/1999/xlink', + } + + def __init__(self): + self._manifest = None + self._paths = [] + self._path_images = '' + self._toolbars = [] + + def _save_path(self, attr): + self._paths.append(attr['{{{}}}full-path'.format(self.NS_MANIFEST['manifest'])]) + return + + def _clean(self, name, nodes): + has_words = re.compile('\\w') + + if not re.search(has_words, str(nodes.tail)): + nodes.tail = '' + if not re.search(has_words, str(nodes.text)): + nodes.text = '' + + for node in nodes: + if name == 'manifest': + self._save_path(node.attrib) + if not re.search(has_words, str(node.tail)): + node.tail = '' + if not re.search(has_words, str(node.text)): + node.text = '' + return + + def new_manifest(self, data): + attr = { + 'manifest:version': self.NS_MANIFEST['manifest_version'], + 'xmlns:manifest': self.NS_MANIFEST['manifest'], + 'xmlns:loext': self.NS_MANIFEST['xmlns:loext'], + } + self._manifest = ET.Element('manifest:manifest', attr) + return self.add_data_manifest(data) + + def parse_manifest(self, data): + ET.register_namespace('manifest', self.NS_MANIFEST['manifest']) + self._manifest = ET.fromstring(data) + attr = {'xmlns:loext': self.NS_MANIFEST['xmlns:loext']} + self._manifest.attrib.update(**attr) + self._clean('manifest', self._manifest) + return + + def add_data_manifest(self, data): + node_name = 'manifest:file-entry' + attr = { + 'manifest:full-path': '', + 'manifest:media-type': '', + } + for path in data: + if path in self._paths: + continue + ext = path.split('.')[-1] + attr['manifest:full-path'] = path + attr['manifest:media-type'] = self.TYPES.get(ext, '') + ET.SubElement(self._manifest, node_name, attr) + return self._get_xml(self._manifest) + + def new_description(self, data): + doc = ET.Element('description', self.NS_DESCRIPTION) + + key = 'identifier' + ET.SubElement(doc, key, data[key]) + + key = 'version' + ET.SubElement(doc, key, data[key]) + + key = 'display-name' + node = ET.SubElement(doc, key) + for k, v in data[key].items(): + sn = ET.SubElement(node, 'name', {'lang': k}) + sn.text = v + + node = ET.SubElement(doc, 'extension-description') + for k in data[key].keys(): + attr = { + 'lang': k, + 'xlink:href': f'description/desc_{k}.txt', + } + ET.SubElement(node, 'src', attr) + + key = 'icon' + node = ET.SubElement(doc, key) + attr = {'xlink:href': f"images/{data[key]}"} + ET.SubElement(node, 'default', attr) + + key = 'publisher' + node = ET.SubElement(doc, key) + for k, v in data[key].items(): + attr = { + 'xlink:href': v['link'], + 'lang': k, + } + sn = ET.SubElement(node, 'name', attr) + sn.text = v['text'] + + key = 'display-name' + node = ET.SubElement(doc, 'registration') + attr = { + 'accept-by': 'user', + 'suppress-on-update': 'true', + } + node = ET.SubElement(node, 'simple-license', attr) + for k in data[key].keys(): + attr = { + 'xlink:href': f"{DIRS['registration']}/license_{k}.txt", + 'lang': k + } + ET.SubElement(node, 'license-text', attr) + + if data['update']: + node = ET.SubElement(doc, 'update-information') + ET.SubElement(node, 'src', {'xlink:href': data['update']}) + + return self._get_xml(doc) + + def _get_context(self, args): + if not args: + return '' + context = ','.join([self.CONTEXT[v] for v in args.split(',')]) + return context + + def _add_node_value(self, node, name, value='_self'): + attr = {'oor:name': name, 'oor:type': 'xs:string'} + sn = ET.SubElement(node, 'prop', attr) + sn = ET.SubElement(sn, 'value') + sn.text = value + return + + def _add_menu(self, id_extension, node, index, menu, in_menu_bar=True): + if in_menu_bar: + attr = { + 'oor:name': index, + 'oor:op': 'replace', + } + subnode = ET.SubElement(node, 'node', attr) + else: + subnode = node + + attr = {'oor:name': 'Title', 'oor:type': 'xs:string'} + sn1 = ET.SubElement(subnode, 'prop', attr) + for k, v in menu['title'].items(): + sn2 = ET.SubElement(sn1, 'value', {'xml:lang': k}) + sn2.text = v + value = self._get_context(menu['context']) + self._add_node_value(subnode, 'Context', value) + + if 'submenu' in menu: + sn = ET.SubElement(subnode, 'node', {'oor:name': 'Submenu'}) + for i, m in enumerate(menu['submenu']): + self._add_menu(id_extension, sn, f'{index}.s{i}', m) + if m.get('toolbar', False): + self._toolbars.append(m) + return + + value = f"service:{id_extension}?{menu['argument']}" + self._add_node_value(subnode, 'URL', value) + self._add_node_value(subnode, 'Target') + value = f"%origin%/{self._path_images}/{menu['icon']}" + self._add_node_value(subnode, 'ImageIdentifier', value) + return + + def new_addons(self, id_extension, data): + in_menu_bar = data['parent'] == 'OfficeMenuBar' + self._path_images = data['images'] + attr = { + 'oor:name': 'Addons', + 'oor:package': 'org.openoffice.Office', + } + attr.update(self.NS_ADDONS) + doc = ET.Element('oor:component-data', attr) + parent = ET.SubElement(doc, 'node', {'oor:name': 'AddonUI'}) + node = ET.SubElement(parent, 'node', {'oor:name': data['parent']}) + + op = 'fuse' + if in_menu_bar: + op = 'replace' + + attr = {'oor:name': id_extension, 'oor:op': op} + node = ET.SubElement(node, 'node', attr) + + if in_menu_bar: + attr = {'oor:name': 'Title', 'oor:type': 'xs:string'} + subnode = ET.SubElement(node, 'prop', attr) + for k, v in data['main'].items(): + sn = ET.SubElement(subnode, 'value', {'xml:lang': k}) + sn.text = v + + self._add_node_value(node, 'Target') + node = ET.SubElement(node, 'node', {'oor:name': 'Submenu'}) + + for i, menu in enumerate(data['menus']): + self._add_menu(id_extension, node, f'm{i}', menu, in_menu_bar) + if menu.get('toolbar', False): + self._toolbars.append(menu) + + if self._toolbars: + attr = {'oor:name': 'OfficeToolBar'} + toolbar = ET.SubElement(parent, 'node', attr) + attr = {'oor:name': id_extension, 'oor:op': 'replace'} + toolbar = ET.SubElement(toolbar, 'node', attr) + for t, menu in enumerate(self._toolbars): + self._add_menu(id_extension, toolbar, f't{t}', menu) + + return self._get_xml(doc) + + def _add_shortcut(self, node, key, id_extension, arg): + attr = {'oor:name': key, 'oor:op': 'fuse'} + subnode = ET.SubElement(node, 'node', attr) + subnode = ET.SubElement(subnode, 'prop', {'oor:name': 'Command'}) + subnode = ET.SubElement(subnode, 'value', {'xml:lang': 'en-US'}) + subnode.text = f"service:{id_extension}?{arg}" + return + + def _get_acceleartors(self, menu): + if 'submenu' in menu: + for m in menu['submenu']: + return self._get_acceleartors(m) + + if not menu.get('shortcut', ''): + return '' + + return menu + + def new_accelerators(self, id_extension, menus): + attr = { + 'oor:name': 'Accelerators', + 'oor:package': 'org.openoffice.Office', + } + attr.update(self.NS_ADDONS) + doc = ET.Element('oor:component-data', attr) + parent = ET.SubElement(doc, 'node', {'oor:name': 'PrimaryKeys'}) + + data = [] + for m in menus: + info = self._get_acceleartors(m) + if info: + data.append(info) + + node_global = None + node_modules = None + for m in data: + if m['context']: + if node_modules is None: + node_modules = ET.SubElement( + parent, 'node', {'oor:name': 'Modules'}) + for app in m['context'].split(','): + node = ET.SubElement( + node_modules, 'node', {'oor:name': self.CONTEXT[app]}) + self._add_shortcut( + node, m['shortcut'], id_extension, m['argument']) + else: + if node_global is None: + node_global = ET.SubElement( + parent, 'node', {'oor:name': 'Global'}) + self._add_shortcut( + node_global, m['shortcut'], id_extension, m['argument']) + + return self._get_xml(doc) + + def new_update(self, extension, url_oxt): + doc = ET.Element('description', self.NS_UPDATE) + ET.SubElement(doc, 'identifier', {'value': extension['id']}) + ET.SubElement(doc, 'version', {'value': extension['version']}) + node = ET.SubElement(doc, 'update-download') + ET.SubElement(node, 'src', {'xlink:href': url_oxt}) + node = ET.SubElement(doc, 'release-notes') + return self._get_xml(doc) + + def _get_xml(self, doc): + xml = parseString(ET.tostring(doc, encoding='utf-8')) + return xml.toprettyxml(indent=' ', encoding='utf-8').decode('utf-8') + + +def _exists(path): + return os.path.exists(path) + + +def _join(*paths): + return os.path.join(*paths) + + +def _mkdir(path): + return Path(path).mkdir(parents=True, exist_ok=True) + + +def _save(path, data): + with open(path, 'w') as f: + f.write(data) + return + + +def _get_files(path, filters=''): + paths = [] + if filters in ('*', '*.*'): + filters = '' + for folder, _, files in os.walk(path): + if filters: + pattern = re.compile(r'\.(?:{})$'.format(filters), re.IGNORECASE) + paths += [_join(folder, f) for f in files if pattern.search(f)] + else: + paths += files + return paths + + +def _compress_oxt(): + log.info('Compress OXT extension...') + + path_oxt = _join(DIRS['files'], FILES['oxt']) + + z = zipfile.ZipFile(path_oxt, 'w', compression=zipfile.ZIP_DEFLATED) + root_len = len(os.path.abspath(DIRS['source'])) + for root, dirs, files in os.walk(DIRS['source']): + relative = os.path.abspath(root)[root_len:] + for f in files: + fullpath = _join(root, f) + file_name = _join(relative, f) + if file_name == FILES['idl']: + continue + z.write(fullpath, file_name, zipfile.ZIP_DEFLATED) + z.close() + + log.info('Extension OXT created sucesfully...') + return + + +def _install_and_test(): + path_oxt = (_join(DIRS['files'], FILES['oxt']),) + call(PATHS['install'] + path_oxt) + log.info('Install extension sucesfully...') + log.info('Start LibreOffice...') + call(PATHS['soffice']) + return + + +def _validate_new(): + path_source = DIRS['source'] + if not _exists(path_source): + return True + + msg = f'Path: {path_source}, exists, delete first' + log.error(msg) + return False + + +def _create_new_directories(): + path_source = DIRS['source'] + _mkdir(path_source) + path = _join(path_source, DIRS['meta']) + _mkdir(path) + path = _join(path_source, DIRS['description']) + _mkdir(path) + path = _join(path_source, DIRS['images']) + _mkdir(path) + path = _join(path_source, DIRS['registration']) + _mkdir(path) + path = _join(path_source, DIRS['office']) + _mkdir(path) + + if FILES['easymacro'] or DIRS['pythonpath']: + path = _join(path_source, 'pythonpath') + _mkdir(path) + + path = DIRS['files'] + if not _exists(path): + _mkdir(path) + + msg = 'Created directories...' + log.info(msg) + return + + +def _create_new_files(): + path_source = DIRS['source'] + + for k, v in INFO.items(): + file_name = f'license_{k}.txt' + path = _join(path_source, DIRS['registration'], file_name) + _save(path, v['license']) + + if TYPE_EXTENSION > 1: + path = _join(path_source, FILES['idl']) + _save(path, DATA['idl']) + + path = _join(path_source, FILES['py']) + _save(path, DATA['py']) + + + msg = 'Created files...' + log.info(msg) + return + + +def _validate_update(): + if TYPE_EXTENSION == 1: + return True + + if not _exists(PATHS['idlc']): + msg = 'Binary: "idlc" not found' + log.error(msg) + return False + + if not _exists(PATHS['include']): + msg = 'Directory: "include" not found' + log.error(msg) + return False + + if not _exists(PATHS['regmerge']): + msg = 'Binary: "regmerge" not found' + log.error(msg) + return False + + path = _join(DIRS['source'], FILES['idl']) + if not _exists(path): + msg = f'File: "{FILES["idl"]}" not found' + log.error(msg) + return False + + return True + + +def _compile_idl(): + if TYPE_EXTENSION == 1: + return + + log.info('Compilate IDL...') + path_rdb = _join(DIRS['source'], FILES['rdb']) + path_urd = _join(DIRS['source'], FILES['urd']) + + path = _join(DIRS['source'], FILES['idl']) + call([PATHS['idlc'], '-I', PATHS['include'], path]) + call([PATHS['regmerge'], path_rdb, '/UCR', path_urd]) + os.remove(path_urd) + + log.info('Compilate IDL sucesfully...') + return + + +def _update_files(): + path_files = DIRS['files'] + if not _exists(path_files): + _mkdir(path_files) + + path_source = DIRS['source'] + + for k, v in INFO.items(): + file_name = FILES['ext_desc'].format(k) + path = _join(path_source, DIRS['description'], file_name) + _save(path, v['description']) + + path_logo = EXTENSION['icon'][0] + if _exists(path_logo): + file_name = EXTENSION['icon'][1] + path = _join(path_source, DIRS['images'], file_name) + copyfile(path_logo, path) + + files = os.listdir(DIRS['images']) + for f in files: + if f[-3:].lower() == 'bmp': + source = _join(DIRS['images'], f) + target = _join(path_source, DIRS['images'], f) + copyfile(source, target) + + if FILES['easymacro']: + source = 'easymacro2.py' + target = _join(path_source, 'pythonpath', source) + copyfile(source, target) + + xml = LiboXML() + + path = _join(path_source, DIRS['meta'], FILES['manifest']) + data = xml.new_manifest(DATA['manifest']) + _save(path, data) + + path = _join(path_source, FILES['description']) + data = xml.new_description(DATA['description']) + _save(path, data) + + if TYPE_EXTENSION == 1: + path = _join(path_source, FILES['addons']) + data = xml.new_addons(EXTENSION['id'], DATA['addons']) + _save(path, data) + + path = _join(path_source, DIRS['office']) + _mkdir(path) + path = _join(path_source, DIRS['office'], FILES['shortcut']) + data = xml.new_accelerators(EXTENSION['id'], DATA['addons']['menus']) + _save(path, data) + + + if TYPE_EXTENSION == 3: + path = _join(path_source, FILES['addin']) + _save(path, DATA['addin']) + + if USE_LOCALES: + msg = "Don't forget generate DOMAIN.pot for locales" + for lang in EXTENSION['languages']: + path = _join(path_source, DIRS['locales'], lang, 'LC_MESSAGES') + Path(path).mkdir(parents=True, exist_ok=True) + log.info(msg) + + if DATA['update']: + path_xml = _join(path_files, FILES['update']) + data = xml.new_update(EXTENSION, DATA['update']) + _save(path_xml, data) + + _compile_idl() + return + + +def _new(): + if not _validate_new(): + return + + _create_new_directories() + _create_new_files() + _update_files() + + msg = f"New extension: {EXTENSION['name']} make sucesfully...\n" + msg += '\tNow, you can install and test: zaz.py -i' + log.info(msg) + return + + +def _get_info_path(path): + path, filename = os.path.split(path) + name, extension = os.path.splitext(filename) + return (path, filename, name, extension) + + +def _zip_embed(source, files): + PATH = 'Scripts/python/' + EASYMACRO = 'easymacro2.py' + FILE_PYC = 'easymacro.pyc' + + p, f, name, e = _get_info_path(source) + now = datetime.now().strftime('_%Y%m%d_%H%M%S') + path_source = _join(p, name + now + e) + copyfile(source, path_source) + target = source + + py_compile.compile(EASYMACRO, FILE_PYC) + xml = LiboXML() + + path_easymacro = PATH + FILE_PYC + names = [f[1] for f in files] + [path_easymacro] + nodes = [] + with zipfile.ZipFile(target, 'w', compression=zipfile.ZIP_DEFLATED) as zt: + with zipfile.ZipFile(path_source, compression=zipfile.ZIP_DEFLATED) as zs: + for name in zs.namelist(): + if FILES['manifest'] in name: + path_manifest = name + xml_manifest = zs.open(name).read() + elif name in names: + continue + else: + zt.writestr(name, zs.open(name).read()) + + data = [] + for path, name in files: + data.append(name) + zt.write(path, name) + + zt.write(FILE_PYC, path_easymacro) + data.append(path_easymacro) + + xml.parse_manifest(xml_manifest) + xml_manifest = xml.add_data_manifest(data) + zt.writestr(path_manifest, xml_manifest) + + os.unlink(FILE_PYC) + return + + +def _embed(args): + PATH = 'Scripts/python' + PYTHONPATH = 'pythonpath' + + doc = args.document + if not doc: + msg = '-d/--document Path file to embed is mandatory' + log.error(msg) + return + if not _exists(doc): + msg = 'Path file not exists' + log.error(msg) + return + + files = [] + if args.files: + files = args.files.split(',') + source = _join(PATHS['profile'], PATH) + content = os.listdir(source) + if PYTHONPATH in content: + content.remove(PYTHONPATH) + + if files: + files = [(_join(source, f), _join(PATH, f)) for f in files if f in content] + else: + files = [(_join(source, f), _join(PATH, f)) for f in content] + + _zip_embed(doc, files) + + log.info('Embedded macros successfully...') + return + + +def _locales(args): + EASYMACRO = 'easymacro2.py' + + if args.files: + files = args.files.split(',') + else: + files = _get_files(DIRS['source'], 'py') + paths = ' '.join([f for f in files if not EASYMACRO in f]) + path_pot = _join(DIRS['source'], DIRS['locales'], '{}.pot'.format(DOMAIN)) + call([PATHS['gettext'], '-o', path_pot, paths]) + log.info('POT generate successfully...') + return + + +def _update(): + path_locales = _join(DIRS['source'], DIRS['locales']) + path_pot = _join(DIRS['source'], DIRS['locales'], '{}.pot'.format(DOMAIN)) + if not _exists(path_pot): + log.error('Not exists file POT...') + return + + files = _get_files(path_locales, 'po') + if not files: + log.error('First, generate files PO...') + return + + for f in files: + call([PATHS['msgmerge'], '-U', f, path_pot]) + log.info('\tUpdate: {}'.format(f)) + + log.info('Locales update successfully...') + return + + + +def main(args): + if args.update: + _update() + return + + if args.locales: + _locales(args) + return + + if args.embed: + _embed(args) + return + + if args.new: + _new() + return + + if not _validate_update(): + return + + if not args.only_compress: + _update_files() + + _compress_oxt() + + if args.install: + _install_and_test() + + log.info('Extension make successfully...') + return + + +def _process_command_line_arguments(): + parser = argparse.ArgumentParser( + description='Make LibreOffice extensions') + parser.add_argument('-i', '--install', dest='install', action='store_true', + default=False, required=False) + parser.add_argument('-n', '--new', dest='new', action='store_true', + default=False, required=False) + parser.add_argument('-e', '--embed', dest='embed', action='store_true', + default=False, required=False) + parser.add_argument('-d', '--document', dest='document', default='') + parser.add_argument('-f', '--files', dest='files', default='') + parser.add_argument('-l', '--locales', dest='locales', action='store_true', + default=False, required=False) + parser.add_argument('-u', '--update', dest='update', action='store_true', + default=False, required=False) + parser.add_argument('-oc', '--only_compress', dest='only_compress', + action='store_true', default=False, required=False) + return parser.parse_args() + + +if __name__ == '__main__': + args = _process_command_line_arguments() + main(args) + From 2fb5cb5f2a8bbe3bc40279891513593c6dfb118e Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Thu, 29 Oct 2020 21:46:30 -0600 Subject: [PATCH 02/20] Update Readme --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index 5d784f0..53eed93 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,16 @@ Requirements: * pdflatex * pdfcrop * pdf2svg + + +## Software libre no gratis. + +This extension have a cost of maintenance of 5 euros every year. + +BCH: `qztd3l00xle5tffdqvh2snvadkuau2ml0uqm4n875d` + +BTC: `3FhiXcXmAesmQzrNEngjHFnvaJRhU1AGWV` + +ETH: `0x61a4f614a30ff686445751ed8328b82b77ecfc69` + +LTC: `MBcgQ3LQJA4W2wsXknTdm2fxRSysLaBJHS` From 9b7f766068ce3c0912bef0edea77bcc3a87c0c79 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Fri, 30 Oct 2020 11:50:24 -0600 Subject: [PATCH 03/20] Add Readme es --- README.es.md | 41 +++++++++++++++++++++++++++++++++++++++++ README.md | 19 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 README.es.md diff --git a/README.es.md b/README.es.md new file mode 100644 index 0000000..909e3fc --- /dev/null +++ b/README.es.md @@ -0,0 +1,41 @@ +# zaz-latex2svg + +Compila ecuaciones Latex a SVG dentro de LibreOffice + +Requerimientos: + +* LibreOffice 7.0+ +* Python 3.7+ +* pdflatex +* pdfcrop +* pdf2svg + + +## Software libre no gratis. + +Esta extensión tiene un costo de mantenimiento de 5 euros al año. + +BCH: `qztd3l00xle5tffdqvh2snvadkuau2ml0uqm4n875d` + +BTC: `3FhiXcXmAesmQzrNEngjHFnvaJRhU1AGWV` + +ETH: `0x61a4f614a30ff686445751ed8328b82b77ecfc69` + +LTC: `MBcgQ3LQJA4W2wsXknTdm2fxRSysLaBJHS` + + +* Para ArchLinux + +``` +sudo pacman -S texlive-core +sudo pacman -S pdf2svg +``` + + +* Para Ubuntu 20.04 + +``` +sudo apt install texlive-latex-base +sudo apt install texlive-extra-utils +sudo apt install pdf2svg +``` diff --git a/README.md b/README.md index 53eed93..0c1833a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # zaz-latex2svg +[Leer en español](README.es.md) + Compile Latex equations to SVG into LibreOffice Requirements: @@ -22,3 +24,20 @@ BTC: `3FhiXcXmAesmQzrNEngjHFnvaJRhU1AGWV` ETH: `0x61a4f614a30ff686445751ed8328b82b77ecfc69` LTC: `MBcgQ3LQJA4W2wsXknTdm2fxRSysLaBJHS` + + +* For ArchLinux + +``` +sudo pacman -S texlive-core +sudo pacman -S pdf2svg +``` + + +* For Ubuntu 20.04 + +``` +sudo apt install texlive-latex-base +sudo apt install texlive-extra-utils +sudo apt install pdf2svg +``` From 6eb11a935e79c26e7b979f117f7180d515d2e4b2 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Fri, 30 Oct 2020 22:22:25 -0600 Subject: [PATCH 04/20] Add locales --- README.md | 2 +- conf.py | 8 ++ files/ZAZLaTex2SVG_v0.1.0.oxt | Bin 52996 -> 57312 bytes source/Addons.xcu | 18 +++ source/ZAZLaTex2SVG.py | 165 +++++++++++++++++++++----- source/locales/en/LC_MESSAGES/base.po | 30 +++++ source/locales/es/LC_MESSAGES/base.po | 32 +++++ source/locales/es/LC_MESSAGES/es.po~ | 30 +++++ source/pythonpath/easymacro2.py | 114 ++++++++++++++++++ 9 files changed, 370 insertions(+), 29 deletions(-) create mode 100644 source/locales/en/LC_MESSAGES/base.po create mode 100644 source/locales/es/LC_MESSAGES/base.po create mode 100644 source/locales/es/LC_MESSAGES/es.po~ diff --git a/README.md b/README.md index 0c1833a..916e186 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ Requirements: * pdf2svg -## Software libre no gratis. +## Free Software, not gratis software This extension have a cost of maintenance of 5 euros every year. diff --git a/conf.py b/conf.py index 01db5ec..534a986 100644 --- a/conf.py +++ b/conf.py @@ -117,6 +117,14 @@ MENUS = ( 'toolbar': False, 'shortcut': '', }, + { + 'title': {'en': 'Insert...', 'es': 'Insertar...'}, + 'argument': 'dlg', + 'context': 'calc,writer,draw,impress', + 'icon': 'icon1', + 'toolbar': False, + 'shortcut': '', + }, { 'title': {'en': 'Validate applications', 'es': 'Validar aplicaciones'}, 'argument': 'app', diff --git a/files/ZAZLaTex2SVG_v0.1.0.oxt b/files/ZAZLaTex2SVG_v0.1.0.oxt index 092f1c2be743edca8ff3029159ba14d32988f79d..e77179a5537cf6023720625f31dbacbb6a447146 100644 GIT binary patch delta 27255 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 diff --git a/source/Addons.xcu b/source/Addons.xcu index 4de1c72..b025717 100644 --- a/source/Addons.xcu +++ b/source/Addons.xcu @@ -30,6 +30,24 @@ + + Insert... + Insertar... + + + com.sun.star.sheet.SpreadsheetDocument,com.sun.star.text.TextDocument,com.sun.star.drawing.DrawingDocument,com.sun.star.presentation.PresentationDocument + + + service:net.elmau.zaz.latex2svg?dlg + + + _self + + + %origin%/images/icon1 + + + Validate applications Validar aplicaciones diff --git a/source/ZAZLaTex2SVG.py b/source/ZAZLaTex2SVG.py index 442884c..fe0a446 100644 --- a/source/ZAZLaTex2SVG.py +++ b/source/ZAZLaTex2SVG.py @@ -6,74 +6,182 @@ 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='pyUNO'): + def trigger(self, args=''): if args == 'app': self._app() return + if args == 'dlg': + self._dlg() + return + self._from_selection() return def _app(self): - result = 'No encontrado' + result = self._msg1 if app.paths.exists_app('pdflatex'): - result = 'Encontrado' + result = self._msg2 msg = f'pdflatex = {result}\n' - result = 'No encontrado' + result = self._msg1 if app.paths.exists_app('pdfcrop'): - result = 'Encontrado' + result = self._msg2 msg += f'pdfcrop = {result}\n' - result = 'No encontrado' + result = self._msg1 if app.paths.exists_app('pdf2svg'): - result = 'Encontrado' + result = self._msg2 msg += f'pdf2svg = {result}\n\n' - msg += 'No continues hasta tener las tres aplicaciones detectadas' + 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): - template = """\documentclass{{article}} - \\usepackage[a5paper, landscape]{{geometry}} - \\usepackage{{xcolor}} - \\usepackage{{amssymb}} - \\usepackage{{amsmath}} - \pagestyle{{empty}} - \\begin{{document}} - - \[ {} \] - - \end{{document}} - """ doc = app.active sel = doc.selection if doc.type == 'writer': sel = sel[0] data = sel.value - data = template.format(data) - path_tmp = '/tmp' - path_tex = '/tmp/test.tex' - path_pdf = '/tmp/test.pdf' - path_svg = '/tmp/test.svg' + 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={path_tmp} {path_tex}' + cmd = f'pdflatex --interaction=batchmode -output-directory="{dt.name}" "{path_tex}"' app.run(cmd) - cmd = f'pdfcrop {path_pdf} {path_pdf}' + cmd = f'pdfcrop "{path_pdf}" "{path_pdf}"' app.run(cmd) - cmd = f'pdf2svg {path_pdf} {path_svg}' + cmd = f'pdf2svg "{path_pdf}" "{path_svg}"' app.run(cmd) sel = sel.offset() @@ -82,6 +190,7 @@ class ZAZLaTex2SVG(unohelper.Base, XJobExecutor): args = {'Width': 5000, 'Height': 2000} sel.insert_image(path_svg, args) + dt.cleanup() return diff --git a/source/locales/en/LC_MESSAGES/base.po b/source/locales/en/LC_MESSAGES/base.po new file mode 100644 index 0000000..3b984cd --- /dev/null +++ b/source/locales/en/LC_MESSAGES/base.po @@ -0,0 +1,30 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: 2020-10-30 12:59-0600\n" +"PO-Revision-Date: 2020-10-30 13:03-0600\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" +"X-Generator: Poedit 2.4.1\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: en\n" + +#: source/ZAZLaTex2SVG.py:15 +msgid "Not found" +msgstr "" + +#: source/ZAZLaTex2SVG.py:16 +msgid "Found" +msgstr "" + +#: source/ZAZLaTex2SVG.py:45 +msgid "Not used, if not found some application." +msgstr "" diff --git a/source/locales/es/LC_MESSAGES/base.po b/source/locales/es/LC_MESSAGES/base.po new file mode 100644 index 0000000..dfe7951 --- /dev/null +++ b/source/locales/es/LC_MESSAGES/base.po @@ -0,0 +1,32 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: 2020-10-30 12:59-0600\n" +"PO-Revision-Date: 2020-10-30 13:01-0600\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" +"X-Generator: Poedit 2.4.1\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: source/ZAZLaTex2SVG.py:15 +msgid "Not found" +msgstr "No encontrado" + +#: source/ZAZLaTex2SVG.py:16 +msgid "Found" +msgstr "Encontrado" + +#: source/ZAZLaTex2SVG.py:45 +#, fuzzy +#| msgid "Not used, if not found some application" +msgid "Not used, if not found some application." +msgstr "No use, si no se encuentra alguna aplicación." diff --git a/source/locales/es/LC_MESSAGES/es.po~ b/source/locales/es/LC_MESSAGES/es.po~ new file mode 100644 index 0000000..c14f498 --- /dev/null +++ b/source/locales/es/LC_MESSAGES/es.po~ @@ -0,0 +1,30 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR ORGANIZATION +# FIRST AUTHOR , YEAR. +# +msgid "" +msgstr "" +"Project-Id-Version: \n" +"POT-Creation-Date: 2020-10-30 12:34-0600\n" +"PO-Revision-Date: 2020-10-30 12:58-0600\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: pygettext.py 1.5\n" +"X-Generator: Poedit 2.4.1\n" +"Last-Translator: \n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"Language: es\n" + +#: source/ZAZLaTex2SVG.py:15 +msgid "Not found" +msgstr "No encontrado" + +#: source/ZAZLaTex2SVG.py:16 +msgid "Found" +msgstr "Encontrado" + +#: source/ZAZLaTex2SVG.py:45 +msgid "Not used, if not found some application" +msgstr "No use, si no se encuentra alguna aplicación." diff --git a/source/pythonpath/easymacro2.py b/source/pythonpath/easymacro2.py index df892ef..8777491 100644 --- a/source/pythonpath/easymacro2.py +++ b/source/pythonpath/easymacro2.py @@ -33,6 +33,7 @@ import shutil import socket import subprocess import sys +import tempfile import threading import time @@ -2618,6 +2619,7 @@ UNO_CLASSES = { class LODialog(object): + SEPARATION = 5 MODELS = { 'label': 'com.sun.star.awt.UnoControlFixedTextModel', 'link': 'com.sun.star.awt.UnoControlFixedHyperlinkModel', @@ -2642,6 +2644,8 @@ class LODialog(object): self._modal = True self._controls = {} self._color_on_focus = COLOR_ON_FOCUS + self._id = '' + self._path = '' def _create(self, args): service = 'com.sun.star.awt.DialogProvider' @@ -2688,6 +2692,28 @@ class LODialog(object): def controls(self): return self._controls + @property + def id(self): + return self._id + @id.setter + def id(self, value): + self._id = value + self._path = _P.from_id(value) + + @property + def height(self): + return self.model.Height + @height.setter + def height(self, value): + self.model.Height = value + + @property + def width(self): + return self.model.Width + @width.setter + def width(self, value): + self.model.Width = value + @property def visible(self): return self.obj.Visible @@ -2715,6 +2741,13 @@ class LODialog(object): _add_listeners(self.events, control, control.Model.Name) return + def _set_image_url(self, image): + if _P.exists(image): + return _P.to_url(image) + + path = _P.join(self._path, DIR['images'], image) + return _P.to_url(path) + def _special_properties(self, tipo, args): columns = args.pop('Columns', ()) @@ -2764,6 +2797,32 @@ class LODialog(object): self._controls[name] = control return control + def center(self, control, x=0, y=0): + w = self.width + h = self.height + + if isinstance(control, tuple): + wt = self.SEPARATION * -1 + for c in control: + wt += c.width + self.SEPARATION + x = w / 2 - wt / 2 + for c in control: + c.x = x + x = c.x + c.width + self.SEPARATION + return + + if x < 0: + x = w + x - control.width + elif x == 0: + x = w / 2 - control.width / 2 + if y < 0: + y = h + y - control.height + elif y == 0: + y = h / 2 - control.height / 2 + control.x = x + control.y = y + return + def open(self, modal=True): self._modal = modal if modal: @@ -3078,6 +3137,35 @@ class Paths(object): def home(self): return str(Path.home()) + @classproperty + def temp_dir(self): + return tempfile.gettempdir() + + @classmethod + def dir_tmp(self, only_name=False): + dt = tempfile.TemporaryDirectory() + if only_name: + dt = dt.name + return dt + + @classmethod + def tmp(cls, ext=''): + tmp = tempfile.NamedTemporaryFile(suffix=ext) + return tmp.name + + @classproperty + def python(self): + return sys.executable + + @classmethod + def config(cls, name='Work'): + """ + Return de path name in config + http://api.libreoffice.org/docs/idl/ref/interfacecom_1_1sun_1_1star_1_1util_1_1XPathSettings.html + """ + path = create_instance('com.sun.star.util.PathSettings') + return cls.to_system(getattr(path, name)) + @classmethod def replace_ext(cls, path, new_ext): p = Paths(path) @@ -3109,6 +3197,10 @@ class Paths(object): def is_dir(cls, path): return Path(path).is_dir() + @classmethod + def is_file(cls, path): + return Path(path).is_file() + @classmethod def join(cls, *paths): return str(Path(paths[0]).joinpath(*paths[1:])) @@ -3135,6 +3227,22 @@ class Paths(object): path = str(Path(uno.fileUrlToSystemPath(path)).resolve()) return path + @classmethod + def kill(cls, path): + result = True + p = Path(path) + + try: + if p.is_file(): + p.unlink() + elif p.is_dir(): + shutil.rmtree(path) + except OSError as e: + log.error(e) + result = False + + return result + @classmethod def walk(cls, path, filters=''): paths = [] @@ -3148,6 +3256,12 @@ class Paths(object): paths += files return paths + @classmethod + def from_id(cls, id_ext): + pip = CTX.getValueByName('/singletons/com.sun.star.deployment.PackageInformationProvider') + path = _P.to_system(pip.getPackageLocation(id_ext)) + return path + @classmethod def copy(cls, source, target='', name=''): p, f, n, e = _P(source).info From e024c17de9aef83d55ea270d9b98c28311305126 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Sat, 31 Oct 2020 22:45:30 -0600 Subject: [PATCH 05/20] Add dialog for insert --- README.es.md | 6 +++--- files/ZAZLaTex2SVG_v0.1.0.oxt | Bin 57312 -> 57365 bytes source/ZAZLaTex2SVG.py | 12 ++++++++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/README.es.md b/README.es.md index 909e3fc..d80cfe5 100644 --- a/README.es.md +++ b/README.es.md @@ -11,7 +11,7 @@ Requerimientos: * pdf2svg -## Software libre no gratis. +## Software libre, no gratis. Esta extensión tiene un costo de mantenimiento de 5 euros al año. @@ -24,7 +24,7 @@ ETH: `0x61a4f614a30ff686445751ed8328b82b77ecfc69` LTC: `MBcgQ3LQJA4W2wsXknTdm2fxRSysLaBJHS` -* Para ArchLinux +* En ArchLinux ``` sudo pacman -S texlive-core @@ -32,7 +32,7 @@ sudo pacman -S pdf2svg ``` -* Para Ubuntu 20.04 +* En Ubuntu 20.04 ``` sudo apt install texlive-latex-base diff --git a/files/ZAZLaTex2SVG_v0.1.0.oxt b/files/ZAZLaTex2SVG_v0.1.0.oxt index e77179a5537cf6023720625f31dbacbb6a447146..cde03fdf56f45d81f8c7593edc495187c9a967b4 100644 GIT binary patch delta 1873 zcmZ9Nc{JPU9>ycKD>Q^mOVh;G3?ii%tx`)YrLC%^(jYTT#8Su7v4r6IQR`Hx`q>%n zHB8&oQnA+-YOSSq+90%+ST3sCP)kS6z2}}g?>X-|&+~cT^L*dG-e;znKb^%7SYPEA zKtdppe?YRUoNcV6PGWNfArPh%1R{P&9SM$>Ki_Z*(X=C)tKFtok$n8vI${TF&hm4K zXtGzJ;9WjJ7`bL;%D?Lcr7y@2E!OTX>BF4A?4Q}+1sGnbmg=G33eKE2d5{vWoT{M0 z#P`LH6n4dQ5}g-W0V&frfV*jJ3digp#9pzJ@nSTkI=?5ECwR)Of4 zIqlO{pz?w-!PK?SlxQ-Gc|8q@Cu(xbx+DYTwQf48&E~i8_Pdy-n z3rwU@jh*VWUxnLho46pi*G~@{A*ZGP2!KX#5L%b{Z2{N?L?T2(t;Q!ZS)3pZAC;>ht*OP6H$0>mVjNX!RF71G_?D^*X6wrN!Lr_N5k4UA547r(SsrzrS;d&ZpWB^c39p}9mwuR z>v2c?#*dgP z_e_KR$-K2d9(_Dfg9_zlcZejQ(I!qgC^Ydd4eKN11X{i00IKgLV!Puj(E4MMEs9 z+kJ6j-5r~n`@6TcOt|hrgWFdIuT<@^1LNh>l-eHJSb^zy2Qm6)E46U=bDIy>M%(pd zIaha2fpq+|Ztq#1unsjHpb<54J2We!ixb;rR&SAztCVMN{w+e%lY0^EFrQM8rJf|t z|4#S*(oFxLxp^z_t4WfFu+s_ z6ZRUtQ4(WeI$CE`J-y40chJrc)uQ?P?uN4?E+)p^>TlV5+zwwZTXnw|S6nma1AXG9 zH?(DziK)z7kJ9=TZn4iPZ{n%{?@Q0Ea;|tJILycYP0)n>phto$V(=GH5l!&?M!?Dd z($R@{-~#^<*bZJf0t+ET3jF_z0ldOiKe`jnM)7rlS!~Rat7D_k`N9wgflBrB4Nwbl z4YIz<2SxJ#)h*wKd|;!X5-<=xsVIABZDOIG*NC1Fh~?ovaac9~U4>CLp!MYUN1^md z6yGG6{vX#giGrRF1Tld!;MOFLFBO!XvVc0!KqDF&|F>Z_hA?J+-C?9C-`~^aLO|ve z_9*`C6bcHbgS;tIC}I%QpS}p47y_Gzb1MJ< delta 1824 zcmY+Fc{JN;7sr1|gs8PeBVw778cS$It7>1{dKp{oREby{qxPVhG1Ss(EWc64Hbu~; zwM53gmbSLiRnbJknATQdP@}c;J_~>YK+O>V5Zk97rXDuFPX1*41($Q0SK=Do9Ku+-!q@(-!>tjJ`7#%i z2qsC;@sAPBvJKvh_ida)GkenUF=fwGOzcAD&c90j`ix@QG7oRer!$zPsG3{e`^rmg z7WwUjAAc(<$MUVc6pG&cxskp6M}(eReGAUl7yjdSJS&l& zSU6WYCqhw5X8kk07QZ!KNqH}T(mpJqs!_hOk$}1Dd(&@MSFB^{VSmxgV}RJ}<2QzI z5&A5^A?wPQonQU5!!&M~UMez%x}^b9E}3NhAC9GGYf0IpQBt0^_@v1G@|3(f6B1=~ z7T)O{mOIdL-aUX|+Nfzw7tVrvYIY9No@1;3an%cq-N00fQ@c(C-JX}`tPDqt5{EM5 z7ZLgI6mOf+MeskJN(pGYRqD9@%Z4oCt%2a3hLflB7FCPZA7IheN$-E+?L;it@n&xM zXY|3Ud#snJ6v{E}3Yxghg1v2b{e*0Be5sgSZ-CJ;gW1$XMDx#IjXXAEdI($m?CcG?iH@VM!bO}XUe3hHrjmopJec5^;hKpFa_F@9+8&ak9TN zkHqVvsL2N*2_8I^Dk0y(2MtLvnJI>&Wz?ugN4?OY&U|rr=5D22{_+sjbw>>zsE)n* zTi#AYE}Zj42T|y^SFyR{h)$VEWcekmQ2rEPPz|Y;jl_$>&o^?fUHH_5r?2tr^JS@4 zS-h5n8`aRG)jCSB-R0swvjV+GwT2xA^=?vdC-mLeg2DzuJu?}?1HlLFlO?WaV#_#^4#+!!O zT9I5ooX5Q0QwFQqE+p+T+TinRy$c=49XaE7Z@7m`@Gqj91yc(S5w;W3E+yG&#eSfm zE-66up-g?vFk8K1PfX0?FA#$3YU&KmFLD}3$7KRN5 z%uR%mo9&A#NT*P2xv8+$f!D|a&FWUWv)cEjWyV`CVXAbRWIB%2rdzQjPQSD|Gg~Z{J^e}uzO{R^J*0%^TQ8I1YiCHxubmT6Cp7P@He9AJRg@cG}XVYXU(~> zC23Jt=H~m%slVG#$v&&nZKPCYFYlFMZM+N25n`lbC%eGTh9=_VdV)W*rva&}b5~Kw zH>XDZt!Zm&@0>^0F1b@)fBNTFu#J*pGgpf06;nv0HpT!#rH!?VhMugY^4L4U^W^m zD+GoLp};@b!Uw2!A5}+!;!~0!mwi~_`-heH>oNNm`CVt<(vqN{*pvnIViZ^#B?m@K zsX;Jc$&}iG&d?MZx)ci-VmTI2_H!_TV*sfD>p0d>@@uf3BM-`O nvCyV5kjs?^M>(Qk6jvTPIKCgEz#1+N(g$+5TKqWH*Y^JfZW&Fp diff --git a/source/ZAZLaTex2SVG.py b/source/ZAZLaTex2SVG.py index fe0a446..a9f172b 100644 --- a/source/ZAZLaTex2SVG.py +++ b/source/ZAZLaTex2SVG.py @@ -31,6 +31,10 @@ class Controllers(object): def __init__(self, dlg): self.d = dlg + def cmd_close_action(self, event): + self.d.close() + return + def cmd_preview_action(self, event): data = self.d.text.value if not data: @@ -41,6 +45,14 @@ class Controllers(object): app.msgbox(data) return + def cmd_insert_action(self, event): + msg = _('You shure insert this equation') + if not app.question(msg): + return + + self.d.close() + return + class ZAZLaTex2SVG(unohelper.Base, XJobExecutor): NAME = 'temp' From e435520edefcaf437de37050ebe32514e2d65a4e Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Sat, 31 Oct 2020 22:48:02 -0600 Subject: [PATCH 06/20] Add validate before insert --- files/ZAZLaTex2SVG_v0.1.0.oxt | Bin 57365 -> 57367 bytes source/ZAZLaTex2SVG.py | 6 ++++++ 2 files changed, 6 insertions(+) diff --git a/files/ZAZLaTex2SVG_v0.1.0.oxt b/files/ZAZLaTex2SVG_v0.1.0.oxt index cde03fdf56f45d81f8c7593edc495187c9a967b4..01b626d3c82f397033ed6457ce4ef1c236bf8cbc 100644 GIT binary patch delta 1823 zcmV+)2jKXXzyp`S1AkCU0|XQR000O8>a|}{1#_%Aodo~@K@E=F64~BH#cRZ56Gf#7=3@I|{@zv{`iJU2Ks()lkVwr}z$U<$X3Juj? zNGFvkQraTz8+nS(Lk@)yGvwTq%1SBpjwwDRfflcEtlTiU7=Y{ z<1ci^KGM^iLOBLR&@9n0yniao8Ivh9>Y*cCmWx;lsW!+o)lizrHhN0U9O*d_w0RIf zWod3I(-Su1Sy?ub0?oVoNXjL-`vh++OB@~~1zFm3$bU4m=6M93 zgiT2l@r;`&3N#bb0ZGIRxTJoN7A8<6Ag@*8G>Kv%HH&C$xXfx*b`QQcltU{S^jBoX zOrbK@TCUhVXW#bQOQ@j`N^KSv+=Ta36l^8HrzDfc%B{8VN%agAqriWwxM4)Yia|Rk z%YBq3ApxWEj#cO*y7}!C+ zr9=?Qvnr!2h;k~6EUAM>)=9VF@2xMEx(c!)2iJ1fM(zQi$0>%j4ggM^8ZS>@D z?KOfqweETEk$lGwxy^S(CrotHZHgf#BC@wghhHh3VeeSnRbMqb3bVT|&rUm>cS!7t zzXxJh@RlJ!qvAsFS%ykG>KoDokV;jSx~@+w4BRwkS6$2&-l`2wcc%Nio5gF`mVbQ2 zGuv9KVBI8dVqDD)=7BPNQ5XZa_l_J}plr|bU)K@`So>iLp!e@LBXo{7!#vyAhgRlV zYHo4I&sg@yi&87 zVd$RBt!=UvMMVILa4Iu(j(c}gr+;3~l}gLbrf`+%e%U$?T*kn4GH~s5%-bM?M!Vle zEO@KBb6*!EcJFT)*B2U&Irr|sqlySJyZKEG#7-%+&W53}9qc)*zg$zC(f7&uG z)nihZ)6DqcR4N#)J5yR>>R>D2m2efAw2iot9#t3<#iHx*v*cNjm@tFhAAbPIDlJyQ zNn;sWAnWP^278(=2zGTV?Dhm*3lLpkRwbk<^h=Y&fVjy+JGeOd=!jz{RP*Wi1W{WG z-A;~VVe-NpL3v=|qLNb6NrKlkwaWllpTK zvuAX}0|D=oD|qbz@3R?sSYi(9wO>&MbF4a@1poj+6qA43F9Gk9uiG5~%9G989s%!@ z?AskVpa%c|L1biaZgVbpV|7qV0Rj{Q6aWAK2mtT3Ur|!WvtkYb004*r000#L00000 z00000005+c5|cvQBmwV}XWShEQwx)A3mKE2+zbKlldRkw0^W0z5Zx4$-`o)a@00P| z9RWF$58XrplysA>bRCm&-6{cFlbziv0q>K@-5mlVc#}MM8Is-%0q>Iy-W>rDlPlgu z0TYvP-aP@@lds-O0XWIY(003SBQUU+~ delta 1844 zcmZ8ic{JPU8ct&A2tv@JX`+_YPBB`gwxD#VS}F}P!=$kuOKab*(Ab7j^|Qw?W0UEIH*mwc*6c zvi^iVtlKIhIFogUl$zZwC+zej@drm~Uut`n%hm~-5cDFhc@%R6_uIN`IZZ+_K?U<+ z?nCRM%-HhL`{k+Oo#C_B6l3}Id5g#8j!j7kMZUPAXGaCw^Z52QWP7W50fVil+dXk? z%0`Iv$;-bbwH{dAI2RLql=pbm+^R?1ELS$=LrPkHke#Un>6Ub|()u4m2fH6XatMAB zdr@sI=G_+1f{bfURJG@mYAdz)sPOQ_hef?^YeGh26Ga3){)7oNd#%_n_*@-PW$(jL zxW=G`T5~3XSg0a2Ohg!#M+I=MiDkzwSS5Zxld~=`gu~{hms@?j{^yM4W0(l(rEGzmruvsm@aB&n+{oI zM!h1bsv4&}d=@Dif9G=Pstx=AYex={{?Wis?GWq!T57&`i{6%G9HbdK?e3h;X{J)$ zr=XpZcRCo#ho9>!(qAz5s0=UMt=#26tBO+PtbN}JZOIPq%?hp;?OJYu*SW}-ojIy$t>RN9RGcd_E-lZ}G1Tp> zu`BQ1+M|U@+YBNFs0%NZ`4QfIRyHXYD8E2|?#RYs6H62wnZ%RyV~&c!+R{=;Vvmdm z`c>;-%r*&;plNS)0L(ttA= zIFrHH%owCkz*gI2!+MM_(o`b^J>^P|AJUyYO$^>5#(6EtDr%wl5-F(|pS|j4j(V%p z`J%0m{m7ZL8CHJ4jucl7T&2Aj7G88`?%O4rw8!qnXwhA2|C()JhkuTjEKXu{n zEuggTe+-#)l_&Gh2i{g&aSD~J+RB{$*DDLWvA1VUvzsPH$t&y%JXzH*`m>f$`he%^ z?6xO5i}Ht`u5^t4X{*N<>VCDxQ)g<|^UUVKu<26snO-dUZYQy9;#0Rj$6oi|c^XIm zSPpkiL4WA-{uw=D4k-+)Md{V9Cs(HRNN@V!BsK{Z|NdJ5XK?W)*?Bp$G+#4agy*gP zSx97BuT1uf>^<-s6qCNZv>MWx?f*EzI23Pv!1a~s4 z6#p`Pk@WUW1M2AATGVD-%Po=d@bxu?@&T0AuPUP*p2ql7{7<=8YMs0c42_IX^=C|v z+x!rs)6sf5>Z;y;HRpQ6u8ub&d4^MCn6cN>l6*!wj-U3x)@wFBA0<^bE%`&9`5KJx zS>&PW^S0x4et}t?uxai4n*Uwt6oAGQr*rr^!C(r#;>-gG7m!esuh~z6sor1;uomp{ z9fiC2F=TKMuoH};`-F7yaO>(3e{+WrkvIbEe{}(fXKHf$G$s<<54>TbxbYS@E(V0= zq%VGDa_FNIU|V_Ac%fD@KAWMc|gWTSvl77Peuqadd<+*BH< SVP6Ix01Ip_eh=o?$NvFO?_X>H diff --git a/source/ZAZLaTex2SVG.py b/source/ZAZLaTex2SVG.py index a9f172b..c22f4e1 100644 --- a/source/ZAZLaTex2SVG.py +++ b/source/ZAZLaTex2SVG.py @@ -46,6 +46,12 @@ class Controllers(object): return def cmd_insert_action(self, event): + data = self.d.text.value + if not data: + msg = _('Write some code') + app.errorbox(msg) + return + msg = _('You shure insert this equation') if not app.question(msg): return From 5534dc5fbdf2447d2e506eb6cd58cc46e263864f Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Sun, 1 Nov 2020 11:57:14 -0600 Subject: [PATCH 07/20] Update Readme es --- README.es.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.es.md b/README.es.md index d80cfe5..d2229d1 100644 --- a/README.es.md +++ b/README.es.md @@ -13,6 +13,12 @@ Requerimientos: ## Software libre, no gratis. +### Si no tienes dinero, no es problema, mandame una postal de tu ciudad. :) + +pero, no cometas el error de muchos de *pensar solo en software gratis* que +tanto daño a hecho al **Software Libre**. + + Esta extensión tiene un costo de mantenimiento de 5 euros al año. BCH: `qztd3l00xle5tffdqvh2snvadkuau2ml0uqm4n875d` From a10265ce050f2f43f1ba97310bb680e7c03a4a72 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Sun, 1 Nov 2020 11:59:05 -0600 Subject: [PATCH 08/20] Update Readme es --- README.es.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.es.md b/README.es.md index d2229d1..cea3d79 100644 --- a/README.es.md +++ b/README.es.md @@ -15,7 +15,7 @@ Requerimientos: ### Si no tienes dinero, no es problema, mandame una postal de tu ciudad. :) -pero, no cometas el error de muchos de *pensar solo en software gratis* que +#### pero, no cometas el error de muchos de *pensar solo en software gratis* que tanto daño a hecho al **Software Libre**. From 6dcff556647c2e719849966cca56887fca727cd6 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Sun, 1 Nov 2020 11:59:54 -0600 Subject: [PATCH 09/20] Update Readme es --- README.es.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.es.md b/README.es.md index cea3d79..061214e 100644 --- a/README.es.md +++ b/README.es.md @@ -13,10 +13,9 @@ Requerimientos: ## Software libre, no gratis. -### Si no tienes dinero, no es problema, mandame una postal de tu ciudad. :) +### Si no tienes dinero, no es problema, mandame una postal de tu ciudad :) -#### pero, no cometas el error de muchos de *pensar solo en software gratis* que -tanto daño a hecho al **Software Libre**. +#### pero, no cometas el error de muchos de *pensar solo en software gratis* que tanto daño a hecho al **Software Libre**. Esta extensión tiene un costo de mantenimiento de 5 euros al año. From c5efb5e1e85ad93dd7fc8164c09382d0ca126d87 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Sun, 1 Nov 2020 19:18:19 -0600 Subject: [PATCH 10/20] Update easymacro --- files/ZAZLaTex2SVG_v0.1.0.oxt | Bin 57367 -> 57618 bytes source/ZAZLaTex2SVG.py | 16 ++++++++++++++++ source/pythonpath/easymacro2.py | 25 +++++++++++++++++++++++++ 3 files changed, 41 insertions(+) diff --git a/files/ZAZLaTex2SVG_v0.1.0.oxt b/files/ZAZLaTex2SVG_v0.1.0.oxt index 01b626d3c82f397033ed6457ce4ef1c236bf8cbc..a1cdec1696b40ba85349d44dec3d26b4ebf5449c 100644 GIT binary patch delta 21153 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 L;v|ks|8o03n5W;S delta 20977 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 Date: Sun, 1 Nov 2020 19:20:11 -0600 Subject: [PATCH 11/20] Remove local copy for test --- source/ZAZLaTex2SVG.py | 1 - 1 file changed, 1 deletion(-) diff --git a/source/ZAZLaTex2SVG.py b/source/ZAZLaTex2SVG.py index a0a5b3a..d8bcd89 100644 --- a/source/ZAZLaTex2SVG.py +++ b/source/ZAZLaTex2SVG.py @@ -214,7 +214,6 @@ class ZAZLaTex2SVG(unohelper.Base, XJobExecutor): app.run(cmd) cmd = f'pdfcrop "{path_pdf}" "{path_pdf}"' app.run(cmd) - app.paths.copy(path_pdf, '/home/mau/') cmd = f'pdf2svg "{path_pdf}" "{path_svg}"' app.run(cmd) From 5c1c45b06902373dcfaf265ec0ca0c8fbc4eeaa1 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Sun, 1 Nov 2020 19:29:17 -0600 Subject: [PATCH 12/20] Remove local copy for test --- README.md | 6 ++++++ files/ZAZLaTex2SVG_v0.1.0.oxt | Bin 57618 -> 57650 bytes source/ZAZLaTex2SVG.py | 7 +++++++ 3 files changed, 13 insertions(+) diff --git a/README.md b/README.md index 916e186..c755fb2 100644 --- a/README.md +++ b/README.md @@ -41,3 +41,9 @@ sudo apt install texlive-latex-base sudo apt install texlive-extra-utils sudo apt install pdf2svg ``` + +* For OSx + +``` +brew install pdf2svg +``` diff --git a/files/ZAZLaTex2SVG_v0.1.0.oxt b/files/ZAZLaTex2SVG_v0.1.0.oxt index a1cdec1696b40ba85349d44dec3d26b4ebf5449c..bfda184c574f9b93274e8d56aa3c5a32b31a71ef 100644 GIT binary patch delta 2004 zcmY*ac{J2}AD$W8Tq8@2Z3ZJ67c+!hbS=r=$TGMR$`;~{n=Pcq!bD1NA@*pMYAzc7oYfxr zD8p*&b_`BwCKY8mn=spBu~HUy7kAM%$Bx{%ua*C*U?uQ$g(~IJqYTV&O4Xp#Zq9Jb zAN$!uL!Qzy)>VS^NA0*vHEeLn-9h6`}|1Y)J|~VOyonO!eYtiEoC68#vC^<*4N1|jqKL6rJ|iN4+14Jbw=d-!ccqihR-M+wQxEtxgW6q!Anj#IoFOR4%nhI>pe@BfO#WO*$YB>ldomhc!$KDV}!Z< zY3rcVcKW%EU>~o`2Am#w(x9};S1s|kVij-ptJ+6DBRs_05{W8q@NP^Kx}O^3H@xMW z?YO8YhT!kVBr_j?bRg71JX8rkK8MWCBOM}|h>ze7P++H^; zne0#Y(jIs(j@mvx@mzdJ-A2b7I`rnr+|#u?}od!I;6hRHSEmLDp3v#+81)xxvn%Grz?1STCZ99;@)U&APVYtqEt+ zg~QfrTrYa3F1Z^~7?@U>wt#&<XH*9`d_H|s9PrkltfLcJb2iOv- zDh(wPij;$K1dF>Mm&y!#pFt*LREB0gmenym8gYNE+A#I<>w(xn8yvjm0^5yL z-CU7SEPP+O=fz@Md5@_2#M7O;`j>n)yM_X%_Qo>wM6yh~j6Ek(M`!RMVR5~iXE(MB z@y^8xCUWkAV$9nb3w#EjO5*)0C$b0>V;WcJYuX`hTLu3JCGp`(iomzWMk13yGwsZ8 z6;S?C=tEtX-lnT#I_nV)*;)6a|E_vJ*$}PJL?R*r*xb*}jdp^E;>RyyVyjy??WT4M zESByQ?c)hE%$g~zPpYG>Tq?GKe#6PvXB^wE&N_;ro7VElKGb}(o3a1s?E>KQXZbS%t97kce0Zi zNgFRZ?V_(5|NOOa@fVUFo`IH%DGZ6i|H?YSig)Nsxg6yZEkMbc+W#wd6WE| z+*JOoRIfqyc@v%1**xOr@iLE`@ObBevMYCCDP}SrA^Xhsa^;+n)}!$Nxak9_8yL3G9e9!iUV%N$paQF4X_pv#xjAd4*|g delta 1972 zcmY*adpOg5AKrd5WEzDWnvh6h<$OraU8&)9KBPQOV^|}$SfyDGDVq4z9wxcUDasPz z5kk&1dYsP_Ha#s8k5h~1o!+-Up6_*iulsXf_kG=;&wqEtJ6PsBn4A*^CL|4kKtv(R z41eb&S9mNR4uSN@WXP#fvhs_dw*V-hwOBEfkORLr5-vui<8rjsN{>7=m8oaHjn?Qo zz`=~O;0ebC6x>+)(sGl{4z6-+ng&92^3g`L9N=*5lANQWA*shAiMVO(|KeSR}zR}XOHn~Gz&0FtSitV#`47E$K z>&y}>O3+|LH9vhOVK~<#JCdKOWBO_BTFsrb)CXAg18%&Eg6?Ina!!9;gSLK8=#M+S zqt~x7TyY)oq6{@tN-|riJE}dXJMGO^x!*a5>DHxtbsP*{2Uj>ecF{XaMgo_Y;C9}O zobI(mR;&lzp-6d^zy_nv5iFWc(A8+jyDK*jQ^0MKHKig^EZe^Xw{wYe6 z&Wl8?WV97gxMU&oJvo^gv+_pH(m3@ZSZ0bm?%cMOcUIGN=r@J^#pk3ECEm7yEm#km zF~wFkbU5PPn(s*oB@e#0nyv%v?+?sg2 z^Gu`1I%yTj1 z<@%njdlTz#D9Z!uF?(K4WSEAIv4!_)wN z)!P0!s*R{(uUA+7r(@KMyQ_@j1J zes+Jo9&CJiY_-o%#yia-vMP`uRH~iB`$X|wZGCSQvoiljKDl=jPjDiQyJ(-{jH{dM z2}~w5qy95vs6%?aF4xSsuu#8Y*)YeS96t3_O8pJTkR>U#Z_KqI|D|P!@hN)$@L3kE z{mW9%+yITcSFDa3VKr)SqwPN5<%-Itmdyv+PO?6<$fc@qiDzUe?5I%r{6ugn!GI!M ze5xm|zibw+g)yJaR@8PcCuA7uyk+g>P&IE{kb@O(&=hGrW@Zlf>l zr15w0ReYf0g`Dt`T8^T{Y?a02gS)`uUtQ(8#*vuPauGuJlWPGb6OZX;mEU18t-{;R zuD8N4O|Ik);6|9CO-u+u8>~78P^cR3nC}Nom{Sh++oqoP>3I%wrTyF0B*jeym{Dib z+Q5|vP+Wo7$nsitBYlm#lsS635qnVy7t5;kVf!>8U*6Y6dX5_Mt&*tzm1gURX}>}B zhhaWOtK#f6td!r_YA(tx11=d9Zi{&ku3^U9 z9=$E{;{_rOds9jO4=ClE5{vrE{Cw!QPPW4E%E!z8R&Vw2A<0)p=ZU4+dkky(I2(IO zFrUkb#T^|T35F4g3)oZC@*P>~98y-l)^nq0or|5(W#K&LCzu13xGe6ikCZd?5sMnx zP`jYGlIdUwvs(4aK@!J`&oqxr;l&S9a@HFtkpFiATu=&VMx~qZAQTXwrf4Lvi;u)C ze)1{A9h`uJIHI>GTF@QV3D78zKs;2rKx~2S3NK>6?D`qxzXOo}E*J38 Date: Sun, 1 Nov 2020 23:30:58 -0600 Subject: [PATCH 13/20] Insert with dialog --- README.md | 1 + files/ZAZLaTex2SVG_v0.1.0.oxt | Bin 57650 -> 57891 bytes source/ZAZLaTex2SVG.py | 51 +++++++++++++++++++++++++++----- source/pythonpath/easymacro2.py | 21 ++++++++++++- 4 files changed, 65 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index c755fb2..831e26e 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ sudo apt install texlive-extra-utils sudo apt install pdf2svg ``` + * For OSx ``` diff --git a/files/ZAZLaTex2SVG_v0.1.0.oxt b/files/ZAZLaTex2SVG_v0.1.0.oxt index bfda184c574f9b93274e8d56aa3c5a32b31a71ef..1fb7e3d0124232107e2670ea59dbc34ebbebf342 100644 GIT binary patch delta 9570 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�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 Ofyj2S5WP13L;pVzvpu%} delta 9323 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 PIII6ycDQeA|7rg}j!Nxw diff --git a/source/ZAZLaTex2SVG.py b/source/ZAZLaTex2SVG.py index 5a49d49..5a26e6b 100644 --- a/source/ZAZLaTex2SVG.py +++ b/source/ZAZLaTex2SVG.py @@ -19,9 +19,12 @@ TEMPLATE = """\documentclass{{article}} \\usepackage{{amsmath}} \pagestyle{{empty}} \\begin{{document}} +\\begingroup +\huge \[ {} \] +\endgroup \end{{document}} """ # ~ TEMPLATE = """\documentclass{{standalone}} @@ -51,19 +54,22 @@ class Controllers(object): def __init__(self, dlg): self.d = dlg + self._path = '' def cmd_close_action(self, event): self.d.close() return + @app.catch_exception def cmd_preview_action(self, event): - data = self.d.text.value - if not data: + code = self.d.text.value + if not code: msg = _('Write some code') app.errorbox(msg) return - app.msgbox(data) + self._path = _latex_to_svg(code) + self.d.image.value = self._path return def cmd_insert_action(self, event): @@ -77,10 +83,33 @@ class Controllers(object): if not app.question(msg): return + app.selection.insert_image(self._path, {}) 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') @@ -122,7 +151,6 @@ class ZAZLaTex2SVG(unohelper.Base, XJobExecutor): app.msgbox(msg) return - @app.catch_exception def _dlg(self): dlg = self._create_dialog() dlg.open() @@ -144,7 +172,7 @@ class ZAZLaTex2SVG(unohelper.Base, XJobExecutor): 'Name': 'lbl_code', 'Label': _('Latex code'), 'Width': 70, - 'Height': 15, + 'Height': 10, 'X': 10, 'Y': 5, 'VerticalAlign': 1, @@ -172,6 +200,14 @@ class ZAZLaTex2SVG(unohelper.Base, XJobExecutor): } dlg.add_control(args) + args = { + 'Type': 'Image', + 'Name': 'image', + 'Width': 250, + 'Height': 100, + } + dlg.add_control(args) + args = { 'Type': 'Button', 'Name': 'cmd_insert', @@ -195,8 +231,9 @@ class ZAZLaTex2SVG(unohelper.Base, XJobExecutor): 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) + 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) diff --git a/source/pythonpath/easymacro2.py b/source/pythonpath/easymacro2.py index 580bca5..52d5dad 100644 --- a/source/pythonpath/easymacro2.py +++ b/source/pythonpath/easymacro2.py @@ -2633,6 +2633,24 @@ class UnoText(UnoBaseObject): self.model.Text = value +class UnoImage(UnoBaseObject): + + def __init__(self, obj): + super().__init__(obj) + + @property + def type(self): + return 'image' + + @property + def value(self): + return self.m.ImageURL + @value.setter + def value(self, value): + self.m.ImageURL = None + self.m.ImageURL = _P.to_url(value) + + UNO_CLASSES = { 'label': UnoLabel, 'link': UnoLabelLink, @@ -2640,6 +2658,7 @@ UNO_CLASSES = { 'radio': UnoRadio, 'check': UnoCheck, 'text': UnoText, + 'image': UnoImage, } @@ -2652,13 +2671,13 @@ class LODialog(object): 'radio': 'com.sun.star.awt.UnoControlRadioButtonModel', 'check': 'com.sun.star.awt.UnoControlCheckBoxModel', 'text': 'com.sun.star.awt.UnoControlEditModel', + 'image': 'com.sun.star.awt.UnoControlImageControlModel', # ~ 'grid': 'com.sun.star.awt.grid.UnoControlGridModel', # ~ 'groupbox': 'com.sun.star.awt.UnoControlGroupBoxModel', # ~ 'listbox': 'com.sun.star.awt.UnoControlListBoxModel', # ~ 'roadmap': 'com.sun.star.awt.UnoControlRoadmapModel', # ~ 'tree': 'com.sun.star.awt.tree.TreeControlModel', # ~ 'groupbox': 'com.sun.star.awt.UnoControlGroupBoxModel', - # ~ 'image': 'com.sun.star.awt.UnoControlImageControlModel', # ~ 'pages': 'com.sun.star.awt.UnoMultiPageModel', } From 2df7ed5d0adf1ea205912fe58abc5eacc202c276 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Tue, 3 Nov 2020 18:26:04 -0600 Subject: [PATCH 14/20] Replace equations --- files/ZAZLaTex2SVG_v0.1.0.oxt | Bin 57891 -> 58084 bytes source/ZAZLaTex2SVG.py | 46 ++++++++++++------------------ source/pythonpath/easymacro2.py | 49 ++++++++++++++++++++++++++++++-- 3 files changed, 65 insertions(+), 30 deletions(-) diff --git a/files/ZAZLaTex2SVG_v0.1.0.oxt b/files/ZAZLaTex2SVG_v0.1.0.oxt index 1fb7e3d0124232107e2670ea59dbc34ebbebf342..733fbd2e9f91b3cc4e5b3b89a500097abb23d048 100644 GIT binary patch delta 24573 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

V=Y@{)lkGt3R0as9qKx3LYsKJFT3gUk< zaD=pU;X|8`um@m1(^V)GpcT6wkz=S?B@$n&WZ2iB`j$ya)KyC?8YCk!T{;a*8j*1{ zj?kLl@=lIVkFUH^QsXq6u)6}5vDo%kI+*%3E~8-n4MgeaP3w8`(t6W@-GV+7xE7qU zzs7Zl@<|*OZGv31pHOsE*F8EpI=FwrI>k@#-SK7j%6n#V@e19G<5cNaEo_1jb=uuM z=U}U`y~C>GR%S5`7SFP{#k}OVmnX8IdlPg@f?oAgiCb3i5O(GAH$LzgHjc8dZ@8!;+stWOwvMql))*{h6 zozT0-RX;2?Nw$Hyf`U*Oh_8!Jmck*o{KmZ!9UL(^VsuzGRAqN<;5YHir;BG?S4&LD z*K@5p%oBHP1c_|cw4xQdn5(AzhY49JTo?9j-CG+!!W-q z(ur3MrmvAuRpC@AvUl;9HaJ|B4ri2mjnSE}BpI=Sgm}lCs*kR$!#{sW#}g=(6nS-v z>vr4mf@J7L4KBA#i{|Ho{;hPK$%ZstZSl_zBqZN2EHbVa9Y3$4B5rc|{oMMcCD6Rr zHEXw723WtwoXYM7#SV=@Uge#pQ-IGu0njKCxQyT;8Zoc7@jLDNR);y?w-U_Q`z%(Z zQ$4HFh+-So>=_&1(6)aV!=$0~ol?{&2deL>&^Rn^(_y*)4A-bc{wH_Iqjp&?tZ<85Y>(4%SdvKU{wkufG3)ri44N&WY>I zn>XG$Kp~~H2Jn`rxHUTOLp}}S_(}R2RHefEXgCa$UD_w(wSsD(9Q@nQufj2GV9@^D z40#y_!}BD5ngw?OZGK3z;Vv&py*vc%zNmnm27@d;A}s;v#{e$7-a1~SMOMZb&0_?} ztLU>3ZyMTE7;t~LMKRf3S_&qSA4eeb($OdygnpXcEJ2^oQ z+*|3bOSro}Io|mDG#o}j87;`HQTL;l zW?%f*;okcPPl-lxYeiL?HGTMUMd_)-Gsfi-s>zRMHjsbs66_1=awMdK;gEutg-Mv@ z?eHFjE*|62%b9GDDuWR!K+|IaaO{(f_C(}EEk}gu?X)P;q+@`drqevEKvJp+NN0-)q*Vd0f_?=M()5!g&39k*neDw_K87nFPL(GqrO%Db zsk=lM<-LEKEE;M!YOXcolo>|%{#BaBcM)FdkA~tM)Rx2)N6FpmF?~qVchO@wd=JY@ zhA3>b8O)4vF!?OZmt0n%B%Bl&PlbX+VXqjl8YIs(5*V@4q04etq7n%JL{XJ3E8s)Ya&dCY?m`rjQQM@ zxeYz~Shp2_T*K!l8?%~oB^Q|fZv*u>HA*<9v^u7)BG}BX^nh1w)$qAX;p!gK97Uru ze*q?$P>)F6HdQe|#R?WlFGg4tREn4c(CpUFEmE3PR@nh%+I36bYT=k*WsX0AZ7bkd zRQP{Bz6#$*C%%sYAB-9HJ3A(5K$tF17TKl31*M!V2#)%|w@<@!3@w|hrv%Kdy=FImt14xw^YgQ=yr5J5YbII$V<^HUt@E2pqUm*d4wNGE!d_t>GcD z)~*f}jEx}$<@af-&&yYgSd$&80$XAoW2F~(T|qg;+Wkh~ax`1dFQDl~gS(c`!6e(| zP#8KSmGTb|l)M~K7_XZBSV25Yr~Npb55KyIXpL$|Lu)Omrk7n!5tg9!r(o1!mmq&Y zgZdsb-zB6HM@f0yJzs&xsF(vDWweWPOk@~f^A&X;X2H$Pi~?0Ir^Q?Q{@s|@oQDOy zP?5$dKiv76ZYR+TrI=T{=`@24AFXXob+EwZI9r$k|G#Xa)H2zQN=4hPJ_ebc!CH;u zJ_o^70_-MK>NkdxH$rZSW$vARf8l==P< zU-r(=dhgB;K6Gm*Fm=aCssgNktH!!VOjf1|W_z!4NFOWX

~@?k=Z@!w)jTYlV-&5?n!ms?kO*unJXYM~C_P8X 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 Date: Tue, 3 Nov 2020 21:31:59 -0600 Subject: [PATCH 15/20] Update readmes --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 831e26e..c836594 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,11 @@ Requirements: ## Free Software, not gratis software +### If you don't have money, no problem, send me a postcard from your city :) + +#### but, don't make the mistake of many of *thinking only in gratis software* that so much damage has done to **Free Software**. + + This extension have a cost of maintenance of 5 euros every year. BCH: `qztd3l00xle5tffdqvh2snvadkuau2ml0uqm4n875d` From 3fc8f94ea47014814f33b3300b91721a715448a4 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Tue, 3 Nov 2020 21:38:26 -0600 Subject: [PATCH 16/20] Update translation to spanish --- source/locales/es/LC_MESSAGES/base.po | 34 +++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/source/locales/es/LC_MESSAGES/base.po b/source/locales/es/LC_MESSAGES/base.po index dfe7951..f385be4 100644 --- a/source/locales/es/LC_MESSAGES/base.po +++ b/source/locales/es/LC_MESSAGES/base.po @@ -5,8 +5,8 @@ msgid "" msgstr "" "Project-Id-Version: \n" -"POT-Creation-Date: 2020-10-30 12:59-0600\n" -"PO-Revision-Date: 2020-10-30 13:01-0600\n" +"POT-Creation-Date: 2020-11-03 21:36-0600\n" +"PO-Revision-Date: 2020-11-03 21:37-0600\n" "Last-Translator: \n" "Language-Team: \n" "Language: es\n" @@ -17,16 +17,40 @@ msgstr "" "X-Generator: Poedit 2.4.1\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: source/ZAZLaTex2SVG.py:15 +#: source/ZAZLaTex2SVG.py:66 +msgid "Write some code" +msgstr "Escribe algo de código" + +#: source/ZAZLaTex2SVG.py:76 +msgid "First, generate preview" +msgstr "Primero, genera la vista previa" + +#: source/ZAZLaTex2SVG.py:116 msgid "Not found" msgstr "No encontrado" -#: source/ZAZLaTex2SVG.py:16 +#: source/ZAZLaTex2SVG.py:117 msgid "Found" msgstr "Encontrado" -#: source/ZAZLaTex2SVG.py:45 +#: source/ZAZLaTex2SVG.py:150 #, fuzzy #| msgid "Not used, if not found some application" msgid "Not used, if not found some application." msgstr "No use, si no se encuentra alguna aplicación." + +#: source/ZAZLaTex2SVG.py:177 +msgid "Latex code" +msgstr "Código LaTex" + +#: source/ZAZLaTex2SVG.py:199 +msgid "Preview" +msgstr "Vista Previa" + +#: source/ZAZLaTex2SVG.py:218 +msgid "Insert" +msgstr "Insertar" + +#: source/ZAZLaTex2SVG.py:228 +msgid "Close" +msgstr "Cerrar" From e0f484cdaae2c00b330ad3ad43d7fc1617fc7f16 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Wed, 4 Nov 2020 16:11:44 -0600 Subject: [PATCH 17/20] Support for Calc and Writer --- README.md | 3 ++ files/ZAZLaTex2SVG_v0.1.0.oxt | Bin 58084 -> 58628 bytes source/ZAZLaTex2SVG.py | 38 +++++++++++----------- source/pythonpath/easymacro2.py | 55 ++++++++++++++++++++++++++++---- 4 files changed, 72 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index c836594..16e7d3a 100644 --- a/README.md +++ b/README.md @@ -51,5 +51,8 @@ sudo apt install pdf2svg * For OSx ``` +brew install mactex +brew install tex-live-utility +sudo tlmgr install --reinstall pdfcrop brew install pdf2svg ``` diff --git a/files/ZAZLaTex2SVG_v0.1.0.oxt b/files/ZAZLaTex2SVG_v0.1.0.oxt index 733fbd2e9f91b3cc4e5b3b89a500097abb23d048..007cdfd743b083c98ceafe3ee6d18a6167e62754 100644 GIT binary patch delta 26531 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 delta 26028 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 X|EoK){(p6$lh5}tU^qAbvHX7k_-$3A diff --git a/source/ZAZLaTex2SVG.py b/source/ZAZLaTex2SVG.py index ce704ff..187569f 100644 --- a/source/ZAZLaTex2SVG.py +++ b/source/ZAZLaTex2SVG.py @@ -71,19 +71,22 @@ class Controllers(object): self.d.image.url = self._path return + @app.catch_exception 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, {}) + image = sel.insert_image(self._path, attr) image.description = self.d.text.value self.d.close() return @@ -152,6 +155,22 @@ class ZAZLaTex2SVG(unohelper.Base, XJobExecutor): app.msgbox(msg) return + @app.catch_exception + 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 @@ -243,23 +262,6 @@ class ZAZLaTex2SVG(unohelper.Base, XJobExecutor): return dlg - def _from_selection(self): - doc = app.active - sel = doc.selection - if doc.type == 'writer': - sel = sel[0] - - 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 - g_ImplementationHelper = unohelper.ImplementationHelper() g_ImplementationHelper.addImplementation(ZAZLaTex2SVG, ID_EXTENSION, SERVICE) diff --git a/source/pythonpath/easymacro2.py b/source/pythonpath/easymacro2.py index 14ef6a2..d11c7e2 100644 --- a/source/pythonpath/easymacro2.py +++ b/source/pythonpath/easymacro2.py @@ -119,7 +119,10 @@ TYPE_RANGES = (OBJ_CELL, OBJ_RANGE, OBJ_RANGES) OBJ_SHAPES = 'com.sun.star.drawing.SvxShapeCollection' OBJ_SHAPE = 'com.sun.star.comp.sc.ScShapeObj' +OBJ_GRAPHIC = 'SwXTextGraphicObject' +OBJ_TEXTS = 'SwXTextRanges' +OBJ_TEXT = 'SwXTextRange' # ~ from com.sun.star.sheet.FilterOperator import EMPTY, NO_EMPTY, EQUAL, NOT_EQUAL class FilterOperator(IntEnum): @@ -767,7 +770,8 @@ class LODocument(object): @property def selection(self): sel = self.obj.CurrentSelection - return _get_class_uno(sel) + # ~ return _get_class_uno(sel) + return sel def create_instance(self, name): obj = self.obj.createInstance(name) @@ -1535,6 +1539,10 @@ class LOWriterTextRange(object): def cursor(self): return self.text.createTextCursorByRange(self.obj) + @property + def dp(self): + return self._doc.dp + def offset(self): cursor = self.cursor.getEnd() return LOWriterTextRange(cursor, self._doc) @@ -1554,7 +1562,7 @@ class LOWriterTextRange(object): image.Width = w image.Height = h self.insert_content(image) - return + return self._doc.dp.last class LOWriterTextRanges(object): @@ -1580,11 +1588,33 @@ class LOWriter(LODocument): @property def selection(self): sel = self.obj.CurrentSelection - # ~ print(sel.ImplementationName) - if sel.ImplementationName == 'SwXTextRanges': - sel = LOWriterTextRanges(sel, self) + if sel.ImplementationName == OBJ_TEXTS: + if len(sel) == 1: + sel = LOWriterTextRanges(sel, self)[0] + else: + sel = LOWriterTextRanges(sel, self) + return sel + + if sel.ImplementationName == OBJ_SHAPES: + if len(sel) == 1: + sel = sel[0] + sel = LODrawPage(sel.Parent)[sel.Name] + return sel + + if sel.ImplementationName == OBJ_GRAPHIC: + sel = self.dp[sel.Name] + else: + debug(sel.ImplementationName) + return sel + @property + def dp(self): + return self.draw_page + @property + def draw_page(self): + return LODrawPage(self.obj.DrawPage) + @property def view_cursor(self): return self._cc.ViewCursor @@ -1620,6 +1650,12 @@ class LOShape(LOBaseObject): def index(self): return self._index + @property + def size(self): + s = self.obj.Size + a = dict(Width=s.Width, Height=s.Height) + return a + @property def string(self): return self.obj.String @@ -1637,11 +1673,14 @@ class LOShape(LOBaseObject): @property def cell(self): return self.anchor + @property def anchor(self): obj = self.obj.Anchor if obj.ImplementationName == OBJ_CELL: obj = LOCalcRange(obj) + elif obj.ImplementationName == OBJ_TEXT: + obj = LOWriterTextRange(obj, LODocs().active) else: debug('Anchor', obj.ImplementationName) return obj @@ -1693,6 +1732,10 @@ class LODrawPage(LOBaseObject): def count(self): return self.obj.Count + @property + def last(self): + return self[self.count - 1] + def create_instance(self, name): return self.doc.createInstance(name) @@ -3342,7 +3385,7 @@ class Paths(object): pattern = re.compile(r'\.(?:{})$'.format(filters), re.IGNORECASE) paths += [cls.join(folder, f) for f in files if pattern.search(f)] else: - paths += files + paths += [cls.join(folder, f) for f in files] return paths @classmethod From f33ac2a44a0dd01e862312b94fefdd1a73bfb61c Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Wed, 4 Nov 2020 16:44:54 -0600 Subject: [PATCH 18/20] Update readme es --- README.es.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.es.md b/README.es.md index 061214e..db25754 100644 --- a/README.es.md +++ b/README.es.md @@ -44,3 +44,13 @@ sudo apt install texlive-latex-base sudo apt install texlive-extra-utils sudo apt install pdf2svg ``` + + +* En OSx + +``` +brew install mactex +brew install tex-live-utility +sudo tlmgr install --reinstall pdfcrop +brew install pdf2svg +``` From b897e31cb2eeeb49c0a9644b8050da9367369563 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Wed, 4 Nov 2020 21:40:12 -0600 Subject: [PATCH 19/20] Remove lines for debug --- README.md | 12 +----------- source/ZAZLaTex2SVG.py | 2 -- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/README.md b/README.md index 16e7d3a..3879342 100644 --- a/README.md +++ b/README.md @@ -39,20 +39,10 @@ sudo pacman -S pdf2svg ``` -* For Ubuntu 20.04 +* For Ubuntu 20.04+ ``` sudo apt install texlive-latex-base sudo apt install texlive-extra-utils sudo apt install pdf2svg ``` - - -* For OSx - -``` -brew install mactex -brew install tex-live-utility -sudo tlmgr install --reinstall pdfcrop -brew install pdf2svg -``` diff --git a/source/ZAZLaTex2SVG.py b/source/ZAZLaTex2SVG.py index 187569f..a787c96 100644 --- a/source/ZAZLaTex2SVG.py +++ b/source/ZAZLaTex2SVG.py @@ -71,7 +71,6 @@ class Controllers(object): self.d.image.url = self._path return - @app.catch_exception def cmd_insert_action(self, event): if not self._path: msg = _('First, generate preview') @@ -155,7 +154,6 @@ class ZAZLaTex2SVG(unohelper.Base, XJobExecutor): app.msgbox(msg) return - @app.catch_exception def _from_selection(self): doc = app.active sel = doc.selection From 73c0a8e2585c36c6356c4e5e0e564c3144e0d501 Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Wed, 4 Nov 2020 21:45:48 -0600 Subject: [PATCH 20/20] Deploy OXT --- files/ZAZLaTex2SVG_v0.1.0.oxt | Bin 58628 -> 58610 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/files/ZAZLaTex2SVG_v0.1.0.oxt b/files/ZAZLaTex2SVG_v0.1.0.oxt index 007cdfd743b083c98ceafe3ee6d18a6167e62754..caf2286ed379fb0311ae891fb8dc7eaf70f01cb5 100644 GIT binary patch delta 2226 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