From 0392d8acb52dde936c2918441d878514067c2bcc Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Tue, 16 Aug 2022 22:45:11 -0500 Subject: [PATCH] Completed document tools in spanish --- doc/content/es/calc/_index.md | 2 +- doc/content/es/dialog/_index.md | 2 +- doc/content/es/documents/_index.md | 12 + doc/content/es/tools/macros/_index.md | 65 + doc/content/es/tools/threads/_index.md | 50 + doc/content/es/tools/timer/_index.md | 116 ++ doc/content/es/tools/url/_index.md | 42 + doc/content/es/tools/utils/_index.md | 198 +++ doc/public/404.html | 16 +- doc/public/categories/index.html | 52 +- doc/public/en/sitemap.xml | 10 + doc/public/es/404.html | 16 +- doc/public/es/application/index.html | 1037 +++++++++++++ doc/public/es/application/index.xml | 10 + doc/public/es/calc/index.html | 1039 +++++++++++++ doc/public/es/calc/index.xml | 10 + doc/public/es/categories/index.html | 688 ++++++++- doc/public/es/dialog/index.html | 1080 +++++++++++++ doc/public/es/dialog/index.xml | 10 + doc/public/es/documents/index.html | 1039 +++++++++++++ doc/public/es/documents/index.xml | 10 + doc/public/es/index.html | 688 ++++++++- doc/public/es/index.json | 105 ++ doc/public/es/installation/index.html | 693 ++++++++- doc/public/es/sitemap.xml | 40 + doc/public/es/tags/index.html | 688 ++++++++- doc/public/es/tools/dates_and_time/index.html | 1133 ++++++++++++++ doc/public/es/tools/dates_and_time/index.xml | 10 + doc/public/es/tools/email/index.html | 1124 ++++++++++++++ doc/public/es/tools/email/index.xml | 10 + doc/public/es/tools/index.html | 1080 +++++++++++++ doc/public/es/tools/index.xml | 10 + doc/public/es/tools/macros/index.html | 1075 +++++++++++++ doc/public/es/tools/macros/index.xml | 10 + doc/public/es/tools/messages/index.html | 1080 +++++++++++++ doc/public/es/tools/messages/index.xml | 10 + doc/public/es/tools/paths/index.html | 1376 +++++++++++++++++ doc/public/es/tools/paths/index.xml | 10 + doc/public/es/tools/threads/index.html | 1080 +++++++++++++ doc/public/es/tools/threads/index.xml | 10 + doc/public/es/tools/timer/index.html | 1131 ++++++++++++++ doc/public/es/tools/timer/index.xml | 10 + doc/public/es/tools/tools_01.png | Bin 0 -> 52339 bytes doc/public/es/tools/url/index.html | 1072 +++++++++++++ doc/public/es/tools/url/index.xml | 10 + doc/public/es/tools/utils/index.html | 1168 ++++++++++++++ doc/public/es/tools/utils/index.xml | 10 + doc/public/es/tools_debug/index.html | 1163 ++++++++++++++ doc/public/es/tools_debug/index.xml | 10 + doc/public/es/tools_debug/tools_01.png | Bin 0 -> 52339 bytes doc/public/fr/404.html | 16 +- doc/public/fr/categories/index.html | 52 +- doc/public/fr/index.html | 52 +- doc/public/fr/tags/index.html | 52 +- doc/public/index.html | 52 +- doc/public/installation/index.html | 52 +- doc/public/pt/404.html | 16 +- doc/public/pt/categories/index.html | 52 +- doc/public/pt/index.html | 52 +- doc/public/pt/installation/index.html | 52 +- doc/public/pt/tags/index.html | 52 +- doc/public/tags/index.html | 52 +- doc/public/tools_debug/index.html | 68 +- doc/public/tools_debug/tools_01.png | Bin 0 -> 52339 bytes source/easymacro.py | 626 -------- source/easymacro/__init__.py | 7 + source/easymacro/easydialog.py | 3 +- source/easymacro/easymain.py | 24 +- source/easymacro/easytools.py | 525 ++++++- source/easymacro/zazplus/__init__.py | 2 + source/easymacro/zazplus/mureq.py | 393 +++++ 71 files changed, 21420 insertions(+), 1090 deletions(-) create mode 100644 doc/content/es/documents/_index.md create mode 100644 doc/content/es/tools/macros/_index.md create mode 100644 doc/content/es/tools/threads/_index.md create mode 100644 doc/content/es/tools/timer/_index.md create mode 100644 doc/content/es/tools/url/_index.md create mode 100644 doc/content/es/tools/utils/_index.md create mode 100644 doc/public/es/application/index.html create mode 100644 doc/public/es/application/index.xml create mode 100644 doc/public/es/calc/index.html create mode 100644 doc/public/es/calc/index.xml create mode 100644 doc/public/es/dialog/index.html create mode 100644 doc/public/es/dialog/index.xml create mode 100644 doc/public/es/documents/index.html create mode 100644 doc/public/es/documents/index.xml create mode 100644 doc/public/es/tools/dates_and_time/index.html create mode 100644 doc/public/es/tools/dates_and_time/index.xml create mode 100644 doc/public/es/tools/email/index.html create mode 100644 doc/public/es/tools/email/index.xml create mode 100644 doc/public/es/tools/index.html create mode 100644 doc/public/es/tools/index.xml create mode 100644 doc/public/es/tools/macros/index.html create mode 100644 doc/public/es/tools/macros/index.xml create mode 100644 doc/public/es/tools/messages/index.html create mode 100644 doc/public/es/tools/messages/index.xml create mode 100644 doc/public/es/tools/paths/index.html create mode 100644 doc/public/es/tools/paths/index.xml create mode 100644 doc/public/es/tools/threads/index.html create mode 100644 doc/public/es/tools/threads/index.xml create mode 100644 doc/public/es/tools/timer/index.html create mode 100644 doc/public/es/tools/timer/index.xml create mode 100644 doc/public/es/tools/tools_01.png create mode 100644 doc/public/es/tools/url/index.html create mode 100644 doc/public/es/tools/url/index.xml create mode 100644 doc/public/es/tools/utils/index.html create mode 100644 doc/public/es/tools/utils/index.xml create mode 100644 doc/public/es/tools_debug/index.html create mode 100644 doc/public/es/tools_debug/index.xml create mode 100644 doc/public/es/tools_debug/tools_01.png create mode 100644 doc/public/tools_debug/tools_01.png create mode 100644 source/easymacro/zazplus/__init__.py create mode 100644 source/easymacro/zazplus/mureq.py diff --git a/doc/content/es/calc/_index.md b/doc/content/es/calc/_index.md index a9c1069..8e09b8b 100644 --- a/doc/content/es/calc/_index.md +++ b/doc/content/es/calc/_index.md @@ -1,6 +1,6 @@ +++ title = "Calc" -weight = 5 +weight = 6 +++ #### Trabajar con Calc diff --git a/doc/content/es/dialog/_index.md b/doc/content/es/dialog/_index.md index 7934e68..0360246 100644 --- a/doc/content/es/dialog/_index.md +++ b/doc/content/es/dialog/_index.md @@ -1,6 +1,6 @@ +++ title = "Cuadros de diálogo" -weight = 6 +weight = 20 +++ #### Trabajar con cuadros de diálogo diff --git a/doc/content/es/documents/_index.md b/doc/content/es/documents/_index.md new file mode 100644 index 0000000..68b5b6b --- /dev/null +++ b/doc/content/es/documents/_index.md @@ -0,0 +1,12 @@ ++++ +title = "Documentos" +weight = 5 ++++ + +#### Trabajar con Documentos + +### active + + +```python +``` diff --git a/doc/content/es/tools/macros/_index.md b/doc/content/es/tools/macros/_index.md new file mode 100644 index 0000000..1cd0c2d --- /dev/null +++ b/doc/content/es/tools/macros/_index.md @@ -0,0 +1,65 @@ ++++ +title = "Ejecutar macros" +weight = 6 ++++ + +Ejecutar cualquier macro, de forma predeterminada se llaman a las macros en Python localizadas en el perfil de usuario. + +```python +import easymacro as app + + +def mostrar_info(): + app.msgbox(app.INFO_DEBUG) + return + + +def main(args=None): + macro = { + 'library': 'test', + 'name': 'mostrar_info', + } + app.macro.call(macro) + return +``` + +Ejecutar una macro compartida en LibreOffice Macros. + +```python +macro = { + 'library': 'HelloWorld', + 'name': 'HelloWorldPython', + 'location': 'share', +} +app.macro.call(macro) +``` + +Ejecutar una macro Basic. + +```vb +Sub mostrar_info() + MsgBox "Mejor usa Python :)" +End Sub +``` + +```python +macro = { + 'language': 'Basic', + 'library': 'Standard', + 'module': 'Module1', + 'name': 'mostrar_info', +} +app.macro.call(macro) +``` + +Cualquier macro se puede ejecutar en otro hilo. + +```python +app.macro.call(macro, True) +``` + + +Más información en: [Scripting Framework URI Specification][1] + + +[1]: https://wiki.documentfoundation.org/Documentation/DevGuide/Scripting_Framework#Scripting_Framework_URI_Specification diff --git a/doc/content/es/tools/threads/_index.md b/doc/content/es/tools/threads/_index.md new file mode 100644 index 0000000..b78ac01 --- /dev/null +++ b/doc/content/es/tools/threads/_index.md @@ -0,0 +1,50 @@ ++++ +title = "Hilos" +weight = 5 ++++ + +#### Ejecutar macros en otros hilos. + +Las macros se ejecutan en un hilo que bloquea cualquier otro proceso dentro de la aplicación. + +Si ejecutas la siguiente macro `main`, nota que no puedes hacer algo más dentro de LibreOffice durante los 5 segundos que dura el proceso. + +```python +import easymacro as app + + +def hacer_pausa(segundos): + app.sleep(segundos) + app.debug('He terminado') + return + +def main(): + hacer_pausa(5) + app.msgbox('Fin...') + return +``` + +Hasta que aparece el cuadro de mensaje con la palabra `Fin` y lo cierras, el usuario puede seguir usando la aplicación. + +### run_in_thread + +Ahora ejecutamos la macro en otro hilo, "decorando" cualquier macro con `run_in_thread` + +```python +@app.run_in_thread +def hacer_pausa(segundos): + app.sleep(segundos) + app.debug('He terminado') + return + +def main(): + hacer_pausa(5) + app.msgbox('Fin...') + return +``` + +Nota que ahora el mensaje aparece inmediatamente y no tras los 5 segundos. + +{{% notice warning %}} +Ponga mucha atención en **no ejecutar macros en otros hilo** que dependen de algo suceptible de ser cambiado o interceptado por el usuario, por ejemplo, la celda activa. +{{% /notice %}} diff --git a/doc/content/es/tools/timer/_index.md b/doc/content/es/tools/timer/_index.md new file mode 100644 index 0000000..6d32858 --- /dev/null +++ b/doc/content/es/tools/timer/_index.md @@ -0,0 +1,116 @@ ++++ +title = "Timer" +weight = 7 ++++ + +El `timer` siempre se ejecuta en otro hilo. + +### once + +Ejecutar macro una sola vez en X segundos. + + +```python +import easymacro as app + + +NOMBRE = 'reloj' + + +def mostrar_hora(): + app.debug(app.dates.now_time) + return + + +def iniciar_conteo(): + segundos = 5 + macro = { + 'library': 'test', + 'name': 'mostrar_hora', + } + app.timer.once(NOMBRE, segundos, macro) + return + + +def main(args=None): + iniciar_conteo() + return +``` + +### cancel + +Cancelar ejecución, antes del tiempo establecido. + +```python +def main(args=None): + iniciar_conteo() + app.sleep(3) + detener_conteo() + return + +def detener_conteo(): + app.timer.cancel(NOMBRE) + return +``` + +``` +16/08/2022 21:18:50 - INFO - Event: "reloj", started... execute in 60 seconds +16/08/2022 21:18:55 - INFO - Cancel event: "reloj", ok... +``` + +### start + +Ejecutar macro cada X segundos. + +```python +NOMBRE = 'reloj' + + +def mostrar_hora(): + app.debug(app.dates.now_time) + return + + +def iniciar_reloj(): + segundos = 1 + macro = { + 'library': 'test', + 'name': 'mostrar_hora', + } + app.timer.start(NOMBRE, segundos, macro) + return + +def main(args=None): + iniciar_reloj() + return +``` + +### stop + +Detener timer. + +```python +def detener_reloj(): + app.timer.stop(NOMBRE) + return +``` + +``` +16/08/2022 21:25:37 - INFO - Timer 'reloj' started, execute macro: 'mostrar_hora' +16/08/2022 21:25:38 - DEBUG - 21:25:38 +16/08/2022 21:25:39 - DEBUG - 21:25:39 +... +16/08/2022 21:25:47 - DEBUG - 21:25:47 +16/08/2022 21:25:48 - DEBUG - 21:25:48 +16/08/2022 21:25:48 - INFO - Timer stopped... +``` + + +{{% notice tip %}} +Asegurese siempre de establecer un nombre único para cada timer. +{{% /notice %}} + + +{{% notice warning %}} +Asegurese siempre de ejecutar macros que NO bloqueen la interfaz del usuario. +{{% /notice %}} diff --git a/doc/content/es/tools/url/_index.md b/doc/content/es/tools/url/_index.md new file mode 100644 index 0000000..776a1a6 --- /dev/null +++ b/doc/content/es/tools/url/_index.md @@ -0,0 +1,42 @@ ++++ +title = "URL" +weight = 8 ++++ + +### get + +Método `get`. + +```python +def prueba_get(): + + url = 'https://api.ipify.org' + respuesta = app.url.get(url) + if respuesta.status_code == 200: + mi_ip = respuesta.body.decode() + app.debug(f'IP: {mi_ip}') + else: + app.debug(respuesta.status_code) + + return +``` + +``` +16/08/2022 22:14:13 - DEBUG - IP: 199.203.174.159 +``` + +Respuestas en formato json. + +```python +def prueba_get(): + + url = 'https://api.ipify.org/?format=json' + respuesta = app.url.get(url) + if respuesta.status_code == 200: + datos = respuesta.json() + app.debug(f'IP: {datos["ip"]}') + else: + app.debug(respuesta.status_code) + + return +``` diff --git a/doc/content/es/tools/utils/_index.md b/doc/content/es/tools/utils/_index.md new file mode 100644 index 0000000..23d975b --- /dev/null +++ b/doc/content/es/tools/utils/_index.md @@ -0,0 +1,198 @@ ++++ +title = "Utilidades" +weight = 9 ++++ + +### dict_to_property + +Convertir diccionarios en PropertyValue + + +```python +datos = { + 'Hidden': True, + 'Password': 'letmein', +} +propiedades = app.dict_to_property(datos) + +app.msgbox(propiedades) +``` + + +### data_to_dict + +Convertir `PropertyValue` en diccionarios + +```python +datos = app.data_to_dict(propiedades) +app.msgbox(datos) +``` + +Convertir `tuplas` a diccionario. + +```python +tupla_de_tuplas = ( + ('Hidden', True), + ('Password', 'letmein'), +) +datos = app.data_to_dict(tupla_de_tuplas) +app.msgbox(datos) +``` + +Convertir `listas` a diccionario. + +```python +lista_de_listas = [ + ['Hidden', True], + ['Password', 'letmein'], +] +datos = app.data_to_dict(lista_de_listas) +app.msgbox(datos) +``` + +### sleep + +Hacer una pausa de X segundos. + +```python +app.sleep(5) +``` + +### render + +Reemplazar variables en cadenas de texto. + +```python +plantilla = """Hola $nombre + +Te envío este archivo: $archivo + +Saludos cordiales +""" + +datos = { + 'nombre': 'Ingrid Bergman', + 'archivo': 'carta_de_amor.odt' +} + +resultado = app.render(plantilla, datos) + +app.msgbox(resultado) +``` + +### run + +Ejecutar un programa. + +```python +nombre_aplicacion = 'gnome-calculator' +app.shell.run(nombre_aplicacion) +``` + +Ejecutar comandos shell y capturar la salida. + +```python +comandos = 'ls -lh ~' +resultado = app.shell.run(comandos, True) +app.debug(resultado) +``` + +``` +drwxr-xr-x 4 mau mau 4.0K Aug 15 23:36 Desktop +drwxr-xr-x 6 mau mau 4.0K Jun 9 23:32 Documents +drwxr-xr-x 5 mau mau 4.0K Aug 16 13:09 Downloads +drwxr-xr-x 3 mau mau 4.0K Aug 14 15:19 Pictures +drwxr-xr-x 10 mau mau 4.0K Jun 19 19:36 Projects +drwxr-xr-x 2 mau mau 4.0K May 11 22:36 Templates +drwxr-xr-x 2 mau mau 4.0K Jul 19 13:37 Videos +``` + +Ejectuar comandos y capturar la salida línea a línea. + +```python +comandos = 'ls -lh /home/mau' +for line in app.shell.popen(comandos): + app.debug(line) +``` + +### digest + +Obtener hash. Por default se regresa en hexadecimal. + +```python + datos = 'LibreOffice con Python' + + digest = app.hash.digest('md5', datos) + app.debug('MD5 = ', digest) + + digest = app.hash.digest('sha1', datos) + app.debug('SHA1 = ', digest) + + digest = app.hash.digest('sha256', datos) + app.debug('SHA256 = ', digest) + + digest = app.hash.digest('sha512', datos) + app.debug('SHA512 = ', digest) +``` + +``` +16/08/2022 18:48:07 - DEBUG - MD5 = 3801759ead20abc3ce0d0095289bdcfd +16/08/2022 18:48:07 - DEBUG - SHA1 = 1df74aaae9658c21074aa5a2d4c2055dcf79f0db +16/08/2022 18:48:07 - DEBUG - SHA256 = 228e90b15b6259307e580677939b1f2f45e9317461e98f603af8fcac0f9a598f +16/08/2022 18:48:07 - DEBUG - SHA512 = 3ef45f79f3bfd2b251d250489c91b631306456405510397fb1a7ee37005d196376b7d6ca86a9895f4eb97eb74813965c24d6564a383f4bdb1360665c8fbb192a +``` + +Para obtener bytes. + +``` +digest = app.hash.digest('md5', datos, False) +app.debug('MD5 = ', digest) +``` + +``` +16/08/2022 18:48:07 - DEBUG - MD5 = b'8\x01u\x9e\xad \xab\xc3\xce\r\x00\x95(\x9b\xdc\xfd' +``` + + +### config + +Puede guardar datos de configuración de su macro o extensión dentro del perfil de usuario. + +```python +nombre = 'mi_extension' +datos = { + 'ruta': '/home/mau/pruebas', + 'guardar': True, +} + +if app.config.set(nombre, datos): + app.debug('Configuración guardada...') +``` + +Y recuperarlos en cualquier momento. + +``` +datos = app.config.get(nombre) +app.debug(datos) +``` + + +### color + +Puede ver los colores que puede usar en Wikipedia [Colores Web][1] + +```python +color_nombre = 'darkblue' +color = app.color(color_nombre) +app.debug(color) + +color_rgb = (125, 200, 10) +color = app.color(color_rgb) +app.debug(color) + +color_html = '#008080' +color = app.color(color_html) +app.debug(color) +``` + +[1]: https://es.wikipedia.org/wiki/Colores_web diff --git a/doc/public/404.html b/doc/public/404.html index e86b9a8..1f806c8 100644 --- a/doc/public/404.html +++ b/doc/public/404.html @@ -9,15 +9,15 @@ 404 Page not found - - - - - - - + + + + + + + - + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + LibreOffice +

+ + + + + + +

create_instance

+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/application/index.xml b/doc/public/es/application/index.xml new file mode 100644 index 0000000..d53a722 --- /dev/null +++ b/doc/public/es/application/index.xml @@ -0,0 +1,10 @@ + + + + LibreOffice on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/application/ + Recent content in LibreOffice on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/calc/index.html b/doc/public/es/calc/index.html new file mode 100644 index 0000000..78833b4 --- /dev/null +++ b/doc/public/es/calc/index.html @@ -0,0 +1,1039 @@ + + + + + + + + + + + + Calc :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Calc +

+ + + + + + +

Trabajar con Calc

+

active

+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/calc/index.xml b/doc/public/es/calc/index.xml new file mode 100644 index 0000000..a00c072 --- /dev/null +++ b/doc/public/es/calc/index.xml @@ -0,0 +1,10 @@ + + + + Calc on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/calc/ + Recent content in Calc on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/categories/index.html b/doc/public/es/categories/index.html index afe65d7..066ee8c 100644 --- a/doc/public/es/categories/index.html +++ b/doc/public/es/categories/index.html @@ -12,22 +12,22 @@ Categories :: Documentación para EasyMacro - - - - - - - - - - + + + + + + + + + + - + - + - + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Cuadros de diálogo +

+ + + + + + + +

create

+
Desde archivo
+

Crear un cuadro de diálogo desde un archivo xdl previamente creado desde el editor de cuadros de diálogo dentro de LibreOffice y exportado a un archivo.

+
def crear_cuadro_de_dialogo():
+    path = '/home/mau/Desktop/Dialog1.xdl'
+    propiedades = {'Path': path}
+
+    dialog = app.dialog.create(propiedades)
+    dialog.open()
+    return
+
Desde mis macros
+

Si el cuadro de diálogo esta en la librería Standard.

+
def crear_cuadro_de_dialogo():
+    propiedades = {
+        'Location': 'user',
+        'Name': 'Dialog1',
+    }
+    dialog = app.dialog.create(propiedades)
+    dialog.open()
+    return
+

Si el cuadro de diálogo esta en otra librería.

+
def crear_cuadro_de_dialogo():
+    propiedades = {
+        'Location': 'user',
+        'Library': 'MiAplicacion',
+        'Name': 'Dialog2',
+    }
+    dialog = app.dialog.create(propiedades)
+    dialog.open()
+    return
+

Si el cuadro de diálogo esta en el documento activo en la librería Standard.

+
def crear_cuadro_de_dialogo():
+    propiedades = {
+        'Location': 'document',
+        'Name': 'miApp',
+    }
+    dialog = app.dialog.create(propiedades)
+    dialog.open()
+    return
+
Crear dinámicamente
+

Crear un cuadro de diálogo vacío.

+
def crear_cuadro_de_dialogo():
+    dialog = app.dialog.create()
+    dialog.open()
+    return
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/dialog/index.xml b/doc/public/es/dialog/index.xml new file mode 100644 index 0000000..27ff43b --- /dev/null +++ b/doc/public/es/dialog/index.xml @@ -0,0 +1,10 @@ + + + + Cuadros de diálogo on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/dialog/ + Recent content in Cuadros de diálogo on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/documents/index.html b/doc/public/es/documents/index.html new file mode 100644 index 0000000..106a0f4 --- /dev/null +++ b/doc/public/es/documents/index.html @@ -0,0 +1,1039 @@ + + + + + + + + + + + + Documentos :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Documentos +

+ + + + + + +

Trabajar con Documentos

+

active

+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/documents/index.xml b/doc/public/es/documents/index.xml new file mode 100644 index 0000000..7bba374 --- /dev/null +++ b/doc/public/es/documents/index.xml @@ -0,0 +1,10 @@ + + + + Documentos on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/documents/ + Recent content in Documentos on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/index.html b/doc/public/es/index.html index ca834e1..02bddb0 100644 --- a/doc/public/es/index.html +++ b/doc/public/es/index.html @@ -12,22 +12,22 @@ :: Documentación para EasyMacro - - - - - - - - - - + + + + + + + + + + - + - + - + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Fechas y tiempo +

+ + + + + + + +

La fecha inicial en Calc y en Python es diferente.

+
+ +

today

+

Obtener la fecha de hoy.

+
d = app.dates
+app.msgbox(d.today)
+

now

+

Obtener la fecha y hora actuales.

+
d = app.dates
+app.msgbox(d.now)
+

time

+

Obtener la hora actual.

+
d = app.dates
+app.msgbox(d.now.time())
+

epoch

+

Obtener el tiempo Unix

+
d = app.dates
+app.msgbox(d.epoch)
+

date

+

Devolver una fecha

+
d = app.dates
+
+date = d.date(1974, 1, 15)
+app.msgbox(date)
+

time

+

Devolver un tiempo

+
d = app.dates
+
+time = d.time(10, 20, 15)
+app.msgbox(time)
+

datetime

+

Devolver fecha y hora

+
d = app.dates
+
+dt = d.datetime(1974, 1, 15, 10, 11, 12)
+app.msgbox(dt)
+

str_to_date

+

Convertir una cadena en fecha. Mira este excelente recurso

+
d = app.dates
+
+cadena = '1974-01-15'
+plantilla = '%Y-%m-%d'
+fecha = d.str_to_date(cadena, plantilla)
+app.msgbox(fecha)
+app.msgbox(type(fecha))
+

Para obtener un valor válido para establecer en una celda de Calc.

+
d = app.dates
+
+cadena = '1974-01-15'
+plantilla = '%Y-%m-%d'
+fecha = d.str_to_date(cadena, plantilla, True)
+app.msgbox(fecha)
+app.msgbox(type(fecha))
+

calc_to_date

+

Convierte el valor de una celda en una fecha Python, por ejemplo, la fecha inicial configurada en Calc.

+
d = app.dates
+
+value_from_cell = 1
+fecha = d.calc_to_date(value_from_cell)
+app.msgbox(fecha)
+app.msgbox(type(fecha))
+

start y end

+

Medir tiempo en segundos.

+
d = app.dates
+
+d.start()
+app.sleep(5)
+seconds = d.end()
+app.msgbox(seconds)
+

Regresar timedelta en vez de segundos.

+
d = app.dates
+
+d.start()
+app.sleep(5)
+td = d.end(False)
+app.msgbox(td)
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/dates_and_time/index.xml b/doc/public/es/tools/dates_and_time/index.xml new file mode 100644 index 0000000..96593af --- /dev/null +++ b/doc/public/es/tools/dates_and_time/index.xml @@ -0,0 +1,10 @@ + + + + Fechas y tiempo on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/dates_and_time/ + Recent content in Fechas y tiempo on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/email/index.html b/doc/public/es/tools/email/index.html new file mode 100644 index 0000000..fd149a9 --- /dev/null +++ b/doc/public/es/tools/email/index.html @@ -0,0 +1,1124 @@ + + + + + + + + + + + + Correo electrónico :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Correo electrónico +

+ + + + + + +

Enviar correo electrónico.

+ +

Siempre guarda las contraseñas de la forma más segura posible.

+
+ +

send

+

Enviar un correo electrónico.

+
from conf import PASSWORD
+
+SERVER = dict(
+    server = 'mail.correo.net' ,
+    port = 405,
+    ssl = True,
+    user = 'no-responder@pruebas.mx',
+    password = PASSWORD,
+)
+
+body = "Hola Ingrid\n\n¿Como estas?\n\nSaludos cordiales"
+
+message = dict(
+    to = 'ingrid@bergman.mx',
+    subject = 'Te amo...',
+    body = body,
+)
+
+app.email.send(SERVER, message)
+

Puede usar los campos cc (Con Copia) y bcc (Con Copia Oculta), así como separar por comas las direcciones destino para enviar a más de un correo.

+
to = 'mail1@correo.com,mail2@correo.com,mail3@correo.com'
+cc = 'otro@correo.com'
+bcc = 'oculto@correo.com'
+

Podemos enviar más de un mensaje.

+
mensaje1 = dict(
+    to = 'ingrid@correo.net',
+    subject = 'Te amo...',
+    body = "Hola Ingrid\n\n¿Como estas?\n\nSaludos cordiales",
+)
+mensaje2 = dict(
+    to = 'sophia@correo.net',
+    subject = 'A ti también...',
+    body = "Hola Sophia\n\n¿Como estas?\n\nSaludos cordiales",
+)
+mensajes = (mensaje1, mensaje2)
+
+app.email.send(SERVER, mensajes)
+
16/08/2022 13:01:49 - DEBUG - Connect to: mail.server.net
+16/08/2022 13:01:50 - DEBUG - Email sent...
+16/08/2022 13:01:51 - DEBUG - Email sent...
+16/08/2022 13:01:51 - DEBUG - Close connection...
+

Enviar un archivo adjunto.

+
archivo = '/home/mau/temp.txt'
+mensaje = dict(
+    to = 'ingrid@bergman.mx',
+    subject = 'Te amo...',
+    body = "Hola Ingrid\n\n¿Como estas?\n\nSaludos cordiales",
+    files = archivo,
+)
+
+app.email.send(SERVER, mensaje)
+

O varios.

+
archivos = (
+    '/home/mau/temp.txt',
+    '/home/mau/datos.csv',
+)
+

Si tu cliente de correo usa el formato mbox, puede guardar los correos enviados en una carpeta dentro de la configuración de su cliente de correo.

+
ruta = '/home/mau/.thunderbird/7iznrbyw.default/Mail/Local Folders/LibreOffice'
+mensaje = dict(
+    to = 'ingrid@bergman.mx',
+    subject = 'Te amo...',
+    body = "Hola Ingrid\n\n¿Como estas?\n\nSaludos cordiales",
+    path = ruta,
+)
+
+app.email.send(SERVER, mensaje)
+
+

Todos los correos se envían siempre en otro hilo de ejecución.

+
+ + + + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/email/index.xml b/doc/public/es/tools/email/index.xml new file mode 100644 index 0000000..e68463e --- /dev/null +++ b/doc/public/es/tools/email/index.xml @@ -0,0 +1,10 @@ + + + + Correo electrónico on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/email/ + Recent content in Correo electrónico on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/index.html b/doc/public/es/tools/index.html new file mode 100644 index 0000000..d3b514d --- /dev/null +++ b/doc/public/es/tools/index.html @@ -0,0 +1,1080 @@ + + + + + + + + + + + + Herramientas :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Herramientas +

+ + + + + + +

Recuerda, es necesario importar la librería.

+
import easymacro as app
+

Información sobre la PC

+

OS

+

Obtener el sistema operativo.

+
app.msgbox(app.OS)
+

DESKTOP

+

Obtener el tipo de escritorio, solo en GNU/Linux.

+
app.msgbox(app.DESKTOP)
+

PC

+

Obtener el nombre de la computadora.

+
app.msgbox(app.PC)
+

USER

+

Obtener el nombre de usuario.

+
app.msgbox(app.USER)
+

IS_WIN

+

Saber si estamos en Windows.

+
app.msgbox(app.IS_WIN)
+

IS_MAC

+

Saber si estamos en OSX.

+
app.msgbox(app.IS_MAC)
+

Información sobre LibreOffice

+

NAME

+

Nombre de la aplicación.

+
app.msgbox(app.NAME)
+

VERSION

+

Versión de la aplicación.

+
app.msgbox(app.VERSION)
+

LANG

+

Lenguaje de la aplicación.

+
app.msgbox(app.LANG)
+

LANGUAGE

+

Lenguaje con variante.

+
app.msgbox(app.LANGUAGE)
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/index.xml b/doc/public/es/tools/index.xml new file mode 100644 index 0000000..c5e10ff --- /dev/null +++ b/doc/public/es/tools/index.xml @@ -0,0 +1,10 @@ + + + + Herramientas on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/ + Recent content in Herramientas on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/macros/index.html b/doc/public/es/tools/macros/index.html new file mode 100644 index 0000000..f7aa28f --- /dev/null +++ b/doc/public/es/tools/macros/index.html @@ -0,0 +1,1075 @@ + + + + + + + + + + + + Ejecutar macros :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Ejecutar macros +

+ + + + + + +

Ejecutar cualquier macro, de forma predeterminada se llaman a las macros en Python localizadas en el perfil de usuario.

+
import easymacro as app
+
+
+def mostrar_info():
+    app.msgbox(app.INFO_DEBUG)
+    return
+
+
+def main(args=None):
+    macro = {
+        'library': 'test',
+        'name': 'mostrar_info',
+    }
+    app.macro.call(macro)
+    return
+

Ejecutar una macro compartida en LibreOffice Macros.

+
macro = {
+    'library': 'HelloWorld',
+    'name': 'HelloWorldPython',
+    'location': 'share',
+}
+app.macro.call(macro)
+

Ejecutar una macro Basic.

+
Sub mostrar_info()
+    MsgBox "Mejor usa Python :)"
+End Sub
+
macro = {
+    'language': 'Basic',
+    'library': 'Standard',
+    'module': 'Module1',
+    'name': 'mostrar_info',
+}
+app.macro.call(macro)
+

Cualquier macro se puede ejecutar en otro hilo.

+
app.macro.call(macro, True)
+

Más información en: Scripting Framework URI Specification

+ + + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/macros/index.xml b/doc/public/es/tools/macros/index.xml new file mode 100644 index 0000000..8b3be1a --- /dev/null +++ b/doc/public/es/tools/macros/index.xml @@ -0,0 +1,10 @@ + + + + Ejecutar macros on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/macros/ + Recent content in Ejecutar macros on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/messages/index.html b/doc/public/es/tools/messages/index.html new file mode 100644 index 0000000..9b0f73a --- /dev/null +++ b/doc/public/es/tools/messages/index.html @@ -0,0 +1,1080 @@ + + + + + + + + + + + + Mensajes :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Mensajes +

+ + + + + + +

Cuadros de mensaje

+

msgbox

+

Mostrar mensaje estandar.

+
mensaje = 'Maldito Mundo'
+titulo = 'Mi Macro'
+app.msgbox(mensaje, titulo)
+

warning

+

Mostrar mensaje con icono de advertencia.

+
mensaje = 'Cuidado, esta acción es peligrosa'
+titulo = 'Mi Macro'
+app.warning(mensaje, titulo)
+

errorbox

+

Mostrar mensaje con icono de error.

+
mensaje = 'ERROR: contacte a soporte'
+titulo = 'Mi Macro'
+app.errorbox(mensaje, titulo)
+

question

+

Hacer una pregunta mostrando el icono de interrogación y mostrando los botones de comando Si y No. La respuesta siempre es verdadera (True) si el usuario selecciona si y falsa (False) en caso contrario.

+
mensaje = '¿Es fácil Python?'
+titulo = 'Mi Macro'
+resultado = app.question(mensaje, titulo)
+app.msgbox(resultado)
+

inputbox

+

Muestra un mensaje al usuario, permitiendo capturar una respuesta.

+
mensaje = 'Escribe tu nombre'
+nombre = app.inputbox(mensaje)
+app.msgbox(nombre)
+

Para ocultar solo en pantalla lo que captura el usuario, como contraseñas.

+
mensaje = 'Captura la contraseña'
+echochar = '*'
+contraseña = app.inputbox(mensaje, echochar=echochar)
+app.msgbox(contraseña)
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/messages/index.xml b/doc/public/es/tools/messages/index.xml new file mode 100644 index 0000000..572ede1 --- /dev/null +++ b/doc/public/es/tools/messages/index.xml @@ -0,0 +1,10 @@ + + + + Mensajes on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/messages/ + Recent content in Mensajes on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/paths/index.html b/doc/public/es/tools/paths/index.html new file mode 100644 index 0000000..d306874 --- /dev/null +++ b/doc/public/es/tools/paths/index.html @@ -0,0 +1,1376 @@ + + + + + + + + + + + + Rutas y archivos :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + + + + +
+
+ +
+ +
+ +
+ +

+ + Rutas y archivos +

+ + + + + + +

Trabajar con rutas y archivos.

+

path

+

Obtener información de una ruta.

+
ruta_archivo = '/home/mau/mi_archivo.ods'
+p = app.paths(ruta_archivo)
+
+app.debug(p.path)
+app.debug(p.file_name)
+app.debug(p.name)
+app.debug(p.ext)
+app.debug(p.size)
+app.debug(p.url)
+
15/08/2022 14:40:08 - DEBUG - /home/mau
+15/08/2022 14:40:08 - DEBUG - mi_archivo.ods
+15/08/2022 14:40:08 - DEBUG - mi_archivo
+15/08/2022 14:40:08 - DEBUG - ods
+15/08/2022 14:40:08 - DEBUG - 7011
+15/08/2022 14:40:08 - DEBUG - file:///home/mau/mi_archivo.ods
+

Obtener la misma información como un tupla.

+
ruta_archivo = '/home/mau/mi_archivo.ods'
+p = app.paths(ruta_archivo)
+app.debug(p.info)
+
15/08/2022 14:43:01 - DEBUG - ('/home/mau', 'mi_archivo.ods', 'mi_archivo', 'ods', 7011, 'file:///home/mau/mi_archivo.ods')
+

O como diccionario.

+
ruta_archivo = '/home/mau/mi_archivo.ods'
+p = app.paths(ruta_archivo)
+app.debug(p.dict)
+
15/08/2022 14:43:01 - DEBUG - {'path': '/home/mau', 'file_name': 'mi_archivo.ods', 'name': 'mi_archivo', 'ext': 'ods', 'size': 7011, 'url': 'file:///home/mau/mi_archivo.ods'}
+

home

+

Obtener la carpeta de inicio del usuario.

+
p = app.paths
+app.debug(p.home)
+

documents

+

Obtener la carpeta Documentos del usuario.

+
p = app.paths
+app.debug(p.documents)
+

user_profile

+

Obtener la ruta del perfil de usuario.

+
p = app.paths
+app.debug(p.user_profile)
+

user_config

+

Obtener la ruta de la carpeta config en el perfil de usuario.

+
p = app.paths
+app.debug(p.user_config)
+

python

+

Obtener la ruta del ejecutable python

+
p = app.paths
+app.debug(p.python)
+

to_system

+

Pasar una ruta en formato URL al formato del sistema de archivos del SO.

+
p = app.paths
+ruta_url = 'file:///home/mau/mi_archivo.ods'
+ruta = p.to_system(ruta_url)
+app.debug(ruta)
+

to_url

+

Pasar una ruta del sistema de archivos del SO al formato URL.

+
p = app.paths
+ruta = '/home/mau/mi_archivo.ods'
+ruta_url = p.to_url(ruta)
+app.debug(ruta_url)
+

config

+

Obtener rutas de la configuración de LibreOffice. Por default obtiene la ruta de Documentos, para otras ruta mire Api XPathSettings

+
p = app.paths
+ruta = p.config()
+app.debug(ruta)
+
+ruta = p.config('UserConfig')
+app.debug(ruta)
+
+

Algunas rutas pueden ser más de una, separados por ;, en este caso, el resultado es una lista con las rutas.

+
+ +

join

+

Concatenar rutas.

+
p = app.paths
+ruta = p.join('/home/mau', 'pruebas', 'archivo.ods')
+app.debug(ruta)
+

exists

+

Verificar si una ruta existe.

+
p = app.paths
+resultado = p.exists('/home/mau/test/archivo.ods')
+app.debug(resultado)
+

exists_app

+

Verificar si una aplicación existe.

+
p = app.paths
+
+resultado = p.exists_app('noexiste')
+app.debug(resultado)
+
+resultado = p.exists_app('soffice')
+app.debug(resultado)
+

is_dir

+

Verificar si la ruta es un directorio.

+
p = app.paths
+resultado = p.is_dir('/home/mau')
+app.debug(resultado)
+

is_file

+

Verificar si la ruta es un archivo.

+
p = app.paths
+resultado = p.is_file('/home/mau/mi_archivo.ods')
+app.debug(resultado)
+

temp_file

+

Crear un archivo temporal, es borrado automáticamente al cerrarse.

+
p = app.paths
+
+f = p.temp_file()
+f.write(app.INFO_DEBUG)
+f.close()
+

Usado en contexto, se cierra automáticamente.

+
with p.temp_file() as f:
+    app.debug(f.name)
+    f.write('test')
+

temp_dir

+

Crear un directorio temporal, al salir del contexto, es eliminado junto con todo su contenido del sistema de archivos.

+
p = app.paths
+
+with p.temp_dir() as d:
+    app.debug(p.exists(d))
+    app.debug(d)
+
+app.debug(p.exists(d))
+

get

+

Permitir al usuario seleccionar archivos, devuelve solo la ruta. De forma predeterminada abre en la carpeta Documentos.

+
p = app.paths
+ruta = p.get()
+app.debug(ruta)
+

Establecer que abra en otro directorio.

+
ruta = p.get('/tmp')
+app.debug(ruta)
+

Agregar un filtro.

+
ruta = p.get(filters='ods')
+app.debug(ruta)
+

Agregar multiples filtros.

+
ruta = p.get(filters='xml,txt')
+app.debug(ruta)
+

Permitir selecciones multiples.

+
ruta = p.get(filters='xml,txt', multiple=True)
+app.debug(ruta)
+

get_dir

+

Permitir al usuario seleccionar un directorio, devuelve solo la ruta. De forma predeterminada abre en la carpeta Documentos.

+
p = app.paths
+ruta = p.get_dir()
+app.debug(ruta)
+

Establecer que abra en otro directorio.

+
ruta = p.get_dir('/tmp')
+app.debug(ruta)
+

get_for_save

+

Permitir seleccionar un directorio y capturar el nombre del archivo, devuelve la ruta completa.

+
p = app.paths
+ruta = p.get_for_save()
+app.debug(ruta)
+

Establecer que inicie en otro directorio.

+
ruta = p.get_for_save('/tmp')
+app.debug(ruta)
+

Si se establece un filtro, automáticamente se agrega la extensión.

+
ruta = p.get_for_save(filters='txt')
+app.debug(ruta)
+

files

+

Obtener archivos de una ruta, no recursivamente. De forma predeterminada regresa todos, incluyendo archivos ocultos.

+
ruta = '/home/mau'
+
+p = app.paths
+archivos = p.files(ruta)
+for a in archivos:
+    app.debug(a)
+

Filtrar por tipo de archivo.

+
p = app.paths
+archivos = p.files(ruta, '*.pdf')
+

Obtener archivos de forma recursiva.

+
p = app.paths
+archivos = p.files(ruta, '**/*.xml')
+

walk

+

Obtener archivos de forma recursiva.

+
p = app.paths
+ruta = '/home/mau/Documents'
+archivos = p.walk(ruta)
+for a in archivos:
+    app.debug(a)
+

Con filtro.

+
archivos = p.walk(ruta, 'ods')
+

Con filtros.

+
archivos = p.walk(ruta, 'ods|odt')
+

dirs

+

Obtener los directorios de una ruta, no recursivamente.

+
p = app.paths
+ruta = '/home/mau/Documents'
+folders = p.dirs(ruta)
+for f in folders:
+    app.debug(f)
+

walk_dirs

+

Obtener los directorios de una ruta, no recursivamente.

+
p = app.paths
+ruta = '/home/mau/Documents'
+folders = p.walk_dirs(ruta)
+for f in folders:
+    app.debug(f)
+

Obtener información en una lista de tuplas: (ID_FOLDER, ID_PADRE, NOMBRE)

+
folders = p.walk_dirs(ruta, True)
+

extension

+

Obtener la ruta de instalación de una extensión a partir de su ID.

+
p = app.paths
+id_ext = 'net.elmau.zaz.talk'
+ruta = p.extension(id_ext)
+app.debug(ruta)
+

replace_ext

+

Reemplazar extensión de un archivo.

+
p = app.paths
+ruta = '/home/mau/mi_archivo.ods'
+ruta_nueva = p.replace_ext(ruta, 'pdf')
+app.debug(ruta_nueva)
+

open

+

Abrir cualquier archivo con el programas predeterminado del SO.

+
p = app.paths
+ruta = '/home/mau/archivo.pdf'
+p.open(ruta)
+
+ruta = '/home/mau/index.html'
+p.open(ruta)
+

save y read

+

Guardar y leer datos, el encoding predeterminado es UTF8.

+
p = app.paths
+datos = """¿Quieres saber quién eres? No preguntes. Actúa.
+La acción te delineará y definirá.
+
+Thomas Jefferson
+"""
+
+ruta = '/home/mau/temp.txt'
+p.save(ruta, datos)
+
+datos = p.read(ruta)
+app.msgbox(datos)
+

Cambiar el encoding.

+
app.paths.save(ruta, datos, 'iso-8859-1')
+

save_bin y read_bin

+

Guardar y leer datos binarios.

+
p = app.paths
+datos = b'Datos binarios'
+
+ruta = '/home/mau/temp.bin'
+p.save_bin(ruta, datos)
+
+datos = p.read_bin(ruta)
+app.msgbox(datos)
+

save_json y read_json

+

Guardar y leer en formato json.

+
p = app.paths
+
+ruta = '/home/mau/datos.json'
+datos = {
+    'tipo': 'calc',
+    'nombre': 'miarchivo.ods',
+}
+p.save_json(ruta, datos)
+
+datos = p.read_json(ruta)
+app.msgbox(datos)
+

save_csv y read_csv

+

Exportar e importar datos en formato CSV. Vea la documentación CSV para los argumentos que puede usar.

+
p = app.paths
+
+ruta = '/home/mau/datos.csv'
+ahora = app.dates.now
+datos = (
+    (1, 'uno', ahora),
+    (2, 'dos', ahora),
+    (3, 'tres', ahora),
+)
+p.save_csv(ruta, datos)
+
+datos = p.read_csv(ruta)
+app.msgbox(datos)
+

kill

+

Borra archivos o directorios con todo su contenido. Devuelve verdadero (True) en caso de exito y falso (Falso) en cualquier otro caso.

+ +

Este proceso es destructivo, es buena practica siempre solicitar confirmación al usuario.

+
+ +
p = app.paths
+
+ruta = '/home/mau/temp.bin'
+resultado = p.kill(ruta)
+app.msgbox(resultado)
+

copy

+

Copiar archivos. Devuelve la ruta completa final destino.

+

De un origen a una carpeta destino

+
p = app.paths
+
+ruta_origen = '/home/mau/temp.txt'
+ruta_destino = '/home/mau/Desktop'
+ruta = p.copy(ruta_origen, ruta_destino)
+app.debug(ruta)
+

Cambiar el nombre destino.

+
ruta_origen = '/home/mau/temp.txt'
+ruta_destino = '/home/mau/Desktop'
+nuevo_nombre = 'datos.csv'
+ruta = p.copy(ruta_origen, ruta_destino, nuevo_nombre)
+app.debug(ruta)
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/paths/index.xml b/doc/public/es/tools/paths/index.xml new file mode 100644 index 0000000..75f6ead --- /dev/null +++ b/doc/public/es/tools/paths/index.xml @@ -0,0 +1,10 @@ + + + + Rutas y archivos on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/paths/ + Recent content in Rutas y archivos on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/threads/index.html b/doc/public/es/tools/threads/index.html new file mode 100644 index 0000000..f606468 --- /dev/null +++ b/doc/public/es/tools/threads/index.html @@ -0,0 +1,1080 @@ + + + + + + + + + + + + Hilos :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Hilos +

+ + + + + + +

Ejecutar macros en otros hilos.

+

Las macros se ejecutan en un hilo que bloquea cualquier otro proceso dentro de la aplicación.

+

Si ejecutas la siguiente macro main, nota que no puedes hacer algo más dentro de LibreOffice durante los 5 segundos que dura el proceso.

+
import easymacro as app
+
+
+def hacer_pausa(segundos):
+    app.sleep(segundos)
+    app.debug('He terminado')
+    return
+
+def main():
+    hacer_pausa(5)
+    app.msgbox('Fin...')
+    return
+

Hasta que aparece el cuadro de mensaje con la palabra Fin y lo cierras, el usuario puede seguir usando la aplicación.

+

run_in_thread

+

Ahora ejecutamos la macro en otro hilo, “decorando” cualquier macro con run_in_thread

+
@app.run_in_thread
+def hacer_pausa(segundos):
+    app.sleep(segundos)
+    app.debug('He terminado')
+    return
+
+def main():
+    hacer_pausa(5)
+    app.msgbox('Fin...')
+    return
+

Nota que ahora el mensaje aparece inmediatamente y no tras los 5 segundos.

+ +

Ponga mucha atención en no ejecutar macros en otros hilo que dependen de algo suceptible de ser cambiado o interceptado por el usuario, por ejemplo, la celda activa.

+
+ + + + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/threads/index.xml b/doc/public/es/tools/threads/index.xml new file mode 100644 index 0000000..33bffd1 --- /dev/null +++ b/doc/public/es/tools/threads/index.xml @@ -0,0 +1,10 @@ + + + + Hilos on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/threads/ + Recent content in Hilos on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/timer/index.html b/doc/public/es/tools/timer/index.html new file mode 100644 index 0000000..8e8c18a --- /dev/null +++ b/doc/public/es/tools/timer/index.html @@ -0,0 +1,1131 @@ + + + + + + + + + + + + Timer :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Timer +

+ + + + + + +

El timer siempre se ejecuta en otro hilo.

+

once

+

Ejecutar macro una sola vez en X segundos.

+
import easymacro as app
+
+
+NOMBRE = 'reloj'
+
+
+def mostrar_hora():
+    app.debug(app.dates.now_time)
+    return
+
+
+def iniciar_conteo():
+    segundos = 5
+    macro = {
+        'library': 'test',
+        'name': 'mostrar_hora',
+    }
+    app.timer.once(NOMBRE, segundos, macro)
+    return
+
+
+def main(args=None):
+    iniciar_conteo()
+    return
+

cancel

+

Cancelar ejecución, antes del tiempo establecido.

+
def main(args=None):
+    iniciar_conteo()
+    app.sleep(3)
+    detener_conteo()
+    return
+
+def detener_conteo():
+    app.timer.cancel(NOMBRE)
+    return
+
16/08/2022 21:18:50 - INFO - Event: "reloj", started... execute in 60 seconds
+16/08/2022 21:18:55 - INFO - Cancel event: "reloj", ok...
+

start

+

Ejecutar macro cada X segundos.

+
NOMBRE = 'reloj'
+
+
+def mostrar_hora():
+    app.debug(app.dates.now_time)
+    return
+
+
+def iniciar_reloj():
+    segundos = 1
+    macro = {
+        'library': 'test',
+        'name': 'mostrar_hora',
+    }
+    app.timer.start(NOMBRE, segundos, macro)
+    return
+
+def main(args=None):
+    iniciar_reloj()
+    return
+

stop

+

Detener timer.

+
def detener_reloj():
+    app.timer.stop(NOMBRE)
+    return
+
16/08/2022 21:25:37 - INFO - Timer 'reloj' started, execute macro: 'mostrar_hora'
+16/08/2022 21:25:38 - DEBUG - 21:25:38
+16/08/2022 21:25:39 - DEBUG - 21:25:39
+...
+16/08/2022 21:25:47 - DEBUG - 21:25:47
+16/08/2022 21:25:48 - DEBUG - 21:25:48
+16/08/2022 21:25:48 - INFO -    Timer stopped...
+
+

Asegurese siempre de establecer un nombre único para cada timer.

+
+ + +

Asegurese siempre de ejecutar macros que NO bloqueen la interfaz del usuario.

+
+ + + + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/timer/index.xml b/doc/public/es/tools/timer/index.xml new file mode 100644 index 0000000..da632cc --- /dev/null +++ b/doc/public/es/tools/timer/index.xml @@ -0,0 +1,10 @@ + + + + Timer on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/timer/ + Recent content in Timer on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/tools_01.png b/doc/public/es/tools/tools_01.png new file mode 100644 index 0000000000000000000000000000000000000000..6395bb46356997dcdc324d976fcadfeee9b6fdb3 GIT binary patch literal 52339 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 bl$;28hqjx_or|)=fPa!=a-uoHPhbBp_rg0= literal 0 HcmV?d00001 diff --git a/doc/public/es/tools/url/index.html b/doc/public/es/tools/url/index.html new file mode 100644 index 0000000..6632a39 --- /dev/null +++ b/doc/public/es/tools/url/index.html @@ -0,0 +1,1072 @@ + + + + + + + + + + + + URL :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + URL +

+ + + + + + +

get

+

Método get.

+
def prueba_get():
+
+    url = 'https://api.ipify.org'
+    respuesta = app.url.get(url)
+    if respuesta.status_code == 200:
+        mi_ip = respuesta.body.decode()
+        app.debug(f'IP: {mi_ip}')
+    else:
+        app.debug(respuesta.status_code)
+
+    return
+
16/08/2022 22:14:13 - DEBUG - IP: 199.203.174.159
+

Respuestas en formato json.

+
def prueba_get():
+
+    url = 'https://api.ipify.org/?format=json'
+    respuesta = app.url.get(url)
+    if respuesta.status_code == 200:
+        datos = respuesta.json()
+        app.debug(f'IP: {datos["ip"]}')
+    else:
+        app.debug(respuesta.status_code)
+
+    return
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/url/index.xml b/doc/public/es/tools/url/index.xml new file mode 100644 index 0000000..09585f0 --- /dev/null +++ b/doc/public/es/tools/url/index.xml @@ -0,0 +1,10 @@ + + + + URL on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/url/ + Recent content in URL on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools/utils/index.html b/doc/public/es/tools/utils/index.html new file mode 100644 index 0000000..74c2b91 --- /dev/null +++ b/doc/public/es/tools/utils/index.html @@ -0,0 +1,1168 @@ + + + + + + + + + + + + Utilidades :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Utilidades +

+ + + + + + +

dict_to_property

+

Convertir diccionarios en PropertyValue

+
datos = {
+    'Hidden': True,
+    'Password': 'letmein',
+}
+propiedades = app.dict_to_property(datos)
+
+app.msgbox(propiedades)
+

data_to_dict

+

Convertir PropertyValue en diccionarios

+
datos = app.data_to_dict(propiedades)
+app.msgbox(datos)
+

Convertir tuplas a diccionario.

+
tupla_de_tuplas = (
+    ('Hidden', True),
+    ('Password', 'letmein'),
+)
+datos = app.data_to_dict(tupla_de_tuplas)
+app.msgbox(datos)
+

Convertir listas a diccionario.

+
lista_de_listas = [
+    ['Hidden', True],
+    ['Password', 'letmein'],
+]
+datos = app.data_to_dict(lista_de_listas)
+app.msgbox(datos)
+

sleep

+

Hacer una pausa de X segundos.

+
app.sleep(5)
+

render

+

Reemplazar variables en cadenas de texto.

+
plantilla = """Hola $nombre
+
+Te envío este archivo: $archivo
+
+Saludos cordiales
+"""
+
+datos = {
+    'nombre': 'Ingrid Bergman',
+    'archivo': 'carta_de_amor.odt'
+}
+
+resultado = app.render(plantilla, datos)
+
+app.msgbox(resultado)
+

run

+

Ejecutar un programa.

+
nombre_aplicacion = 'gnome-calculator'
+app.shell.run(nombre_aplicacion)
+

Ejecutar comandos shell y capturar la salida.

+
comandos = 'ls -lh ~'
+resultado = app.shell.run(comandos, True)
+app.debug(resultado)
+
drwxr-xr-x  4 mau mau 4.0K Aug 15 23:36 Desktop
+drwxr-xr-x  6 mau mau 4.0K Jun  9 23:32 Documents
+drwxr-xr-x  5 mau mau 4.0K Aug 16 13:09 Downloads
+drwxr-xr-x  3 mau mau 4.0K Aug 14 15:19 Pictures
+drwxr-xr-x 10 mau mau 4.0K Jun 19 19:36 Projects
+drwxr-xr-x  2 mau mau 4.0K May 11 22:36 Templates
+drwxr-xr-x  2 mau mau 4.0K Jul 19 13:37 Videos
+

Ejectuar comandos y capturar la salida línea a línea.

+
comandos = 'ls -lh /home/mau'
+for line in app.shell.popen(comandos):
+    app.debug(line)
+

digest

+

Obtener hash. Por default se regresa en hexadecimal.

+
    datos = 'LibreOffice con Python'
+
+    digest = app.hash.digest('md5', datos)
+    app.debug('MD5 = ', digest)
+
+    digest = app.hash.digest('sha1', datos)
+    app.debug('SHA1 = ', digest)
+
+    digest = app.hash.digest('sha256', datos)
+    app.debug('SHA256 = ', digest)
+
+    digest = app.hash.digest('sha512', datos)
+    app.debug('SHA512 = ', digest)
+
16/08/2022 18:48:07 - DEBUG - MD5 =     3801759ead20abc3ce0d0095289bdcfd
+16/08/2022 18:48:07 - DEBUG - SHA1 =    1df74aaae9658c21074aa5a2d4c2055dcf79f0db
+16/08/2022 18:48:07 - DEBUG - SHA256 =  228e90b15b6259307e580677939b1f2f45e9317461e98f603af8fcac0f9a598f
+16/08/2022 18:48:07 - DEBUG - SHA512 =  3ef45f79f3bfd2b251d250489c91b631306456405510397fb1a7ee37005d196376b7d6ca86a9895f4eb97eb74813965c24d6564a383f4bdb1360665c8fbb192a
+

Para obtener bytes.

+
digest = app.hash.digest('md5', datos, False)
+app.debug('MD5 = ', digest)
+
16/08/2022 18:48:07 - DEBUG - MD5 =     b'8\x01u\x9e\xad \xab\xc3\xce\r\x00\x95(\x9b\xdc\xfd'
+

config

+

Puede guardar datos de configuración de su macro o extensión dentro del perfil de usuario.

+
nombre = 'mi_extension'
+datos = {
+    'ruta': '/home/mau/pruebas',
+    'guardar': True,
+}
+
+if app.config.set(nombre, datos):
+    app.debug('Configuración guardada...')
+

Y recuperarlos en cualquier momento.

+
datos = app.config.get(nombre)
+app.debug(datos)
+

color

+

Puede ver los colores que puede usar en Wikipedia Colores Web

+
color_nombre = 'darkblue'
+color = app.color(color_nombre)
+app.debug(color)
+
+color_rgb = (125, 200, 10)
+color = app.color(color_rgb)
+app.debug(color)
+
+color_html = '#008080'
+color = app.color(color_html)
+app.debug(color)
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools/utils/index.xml b/doc/public/es/tools/utils/index.xml new file mode 100644 index 0000000..144e8a6 --- /dev/null +++ b/doc/public/es/tools/utils/index.xml @@ -0,0 +1,10 @@ + + + + Utilidades on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools/utils/ + Recent content in Utilidades on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools_debug/index.html b/doc/public/es/tools_debug/index.html new file mode 100644 index 0000000..3a37935 --- /dev/null +++ b/doc/public/es/tools_debug/index.html @@ -0,0 +1,1163 @@ + + + + + + + + + + + + Herramientas para depurar :: Documentación para EasyMacro + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+
+ +
+
+ + +
+
+ +
+ +
+ +
+ +

+ + Herramientas para depurar +

+ + + + + + +

INFO_DEBUG

+

Mostrar información de depuración en un cuadro de mensaje.

+

Si tiene cualquier problema en su código durante el desarrollo de sus macros, puede abrir un ticket de soporte en el sistema de ticket de este proyecto. Siempre copie la información de depuración mostrada en este mensaje.

+
import easymacro as app
+
+def info():
+    app.msgbox(app.INFO_DEBUG)
+    return
+

Info debug

+

debug

+

Mostrar información en la terminal.

+
import easymacro as app
+
+def test_debug():
+    msg = 'Verificar esta información...'
+    app.debug(msg)
+    return
+
11/08/2022 18:15:45 - DEBUG - Verificar esta información...
+

info

+

Mostrar mensajes informativos en la terminal.

+
import easymacro as app
+
+def test_info():
+    msg = 'Iniciando proceso...'
+    app.info(msg)
+    return
+
11/08/2022 18:23:53 - INFO - Iniciando proceso...
+

error

+

Mostrar mensajes de error en la terminal.

+
import easymacro as app
+
+def test_error():
+    msg = 'Error 505'
+    app.error(msg)
+    return
+
11/08/2022 18:27:34 - ERROR - Error 505
+

save_log

+

Guardar registro en un archivo, automáticamente se agrega la fecha y hora.

+
import easymacro as app
+
+def test_save_log():
+
+    app.save_log('/home/mau/log.txt', 'PyUNO')
+    app.save_log('/home/mau/log.txt', 'Maldito Mundo')
+
+    return
+
cat ~/log.txt
+2022-08-11 18:30:11 - 'PyUNO'
+2022-08-11 18:30:11 - 'Maldito Mundo'
+

msgbox

+

Mostrar cualquier información en un cuadro de mensaje.

+
def message():
+
+    msg = 'Por favor, consume menos.'
+    app.msgbox(msg)
+
+    msg = ('uno', 2, 'tres')
+    app.msgbox(msg)
+
+    msg = {'nombre': 'Teresa'}
+    app.msgbox(msg)
+
+    app.msgbox(app)
+
+    return
+

catch_exception

+

Capturar cualquier error que se produzca al ejecutar una macro.

+
@app.catch_exception
+def test_capturar_error():
+    r = 1 / 0
+    return
+
11/08/2022 18:44:36 - ERROR - test_capturar_error
+Traceback (most recent call last):
+  File "/home/mau/.config/libreoffice/4/user/Scripts/python/pythonpath/easymacro/easytools.py", line 115, in func
+    return f(*args, **kwargs)
+  File "/home/mau/.config/libreoffice/4/user/Scripts/python/test.py", line 18, in test_capturar_error
+    r = 1 / 0
+ZeroDivisionError: division by zero
+
+

Usa este método solo en tiempo de desarrollo. No la uses en producción.

+
+ +

mri

+

MRI es la mejor extensión para inspeccionar cualquier objeto UNO de LibreOffice. Necesita instalarla primero para poder llamarla.

+
def inspeccionar_objeto():
+    obj = app.active
+    app.mri(obj)
+    return
+

inspect

+

Inspeccionar un objeto.

+
def inspeccionar_objeto():
+    doc = app.active
+    data = app.inspect(doc)
+    for p in data.properties:
+        app.debug(p)
+    for m in data.methods:
+        app.debug(m)
+    return
+

Vaciar en una hoja de calculo.

+
def inspeccionar_objeto():
+    doc = app.active
+    app.inspect(doc, True)
+    return
+
+ + + + +
+ +
+ + +
+ + +
+ + + +
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/doc/public/es/tools_debug/index.xml b/doc/public/es/tools_debug/index.xml new file mode 100644 index 0000000..c71f78b --- /dev/null +++ b/doc/public/es/tools_debug/index.xml @@ -0,0 +1,10 @@ + + + + Herramientas para depurar on Documentación para EasyMacro + https://doc.cuates.net/easymacro/es/tools_debug/ + Recent content in Herramientas para depurar on Documentación para EasyMacro + Hugo -- gohugo.io + en-us + + diff --git a/doc/public/es/tools_debug/tools_01.png b/doc/public/es/tools_debug/tools_01.png new file mode 100644 index 0000000000000000000000000000000000000000..6395bb46356997dcdc324d976fcadfeee9b6fdb3 GIT binary patch literal 52339 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 bl$;28hqjx_or|)=fPa!=a-uoHPhbBp_rg0= literal 0 HcmV?d00001 diff --git a/doc/public/fr/404.html b/doc/public/fr/404.html index 089aa59..21bd4ae 100644 --- a/doc/public/fr/404.html +++ b/doc/public/fr/404.html @@ -9,15 +9,15 @@ 404 Page not found - - - - - - - + + + + + + + - +