From 8c69515f0695e15737cf34437c26775bfea7f7ff Mon Sep 17 00:00:00 2001 From: Mauricio Baeza Date: Sat, 9 Oct 2021 21:09:19 -0500 Subject: [PATCH] Add function zxlookup --- CHANGELOG | 8 +- VERSION | 2 +- conf.py | 64 ++++++++-- .../ZAZFunctions_v0.2.0.oxt | Bin 53347 -> 54331 bytes source/CalcAddIn.xcu | 117 ++++++++++++++++++ source/XZAZFunctions.idl | 12 ++ source/XZAZFunctions.rdb | Bin 16384 -> 17408 bytes source/ZAZFunctions.py | 41 ++++++ source/description.xml | 6 +- source/description/desc_en.txt | 2 +- source/description/desc_es.txt | 2 +- 11 files changed, 239 insertions(+), 15 deletions(-) rename files/ZAZFunctions_v0.1.0.oxt => extension/ZAZFunctions_v0.2.0.oxt (91%) diff --git a/CHANGELOG b/CHANGELOG index 507ee82..0e4469a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,8 @@ +v 0.2.0 [03-oct-2021] + - Add function `zxlookup` + + v 0.1.0 [27-jun-2021] - Initial version - - Function `reverse` - - Function `eval` + - Function `zreverse` + - Function `zeval` diff --git a/VERSION b/VERSION index 6c6aa7c..341cf11 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.0 \ No newline at end of file +0.2.0 \ No newline at end of file diff --git a/conf.py b/conf.py index 1e7af85..e3f61e3 100644 --- a/conf.py +++ b/conf.py @@ -29,7 +29,7 @@ TYPE_EXTENSION = 3 NAME = 'ZAZFunctions' # ~ https://semver.org/ -VERSION = '0.1.0' +VERSION = '0.2.0' # ~ Should be unique, used URL inverse @@ -80,13 +80,13 @@ LICENSE_ES = LICENSE_EN INFO = { 'en': { - 'display_name': 'My first extension', - 'description': 'My great extension', + 'display_name': 'ZAZ Functions', + 'description': 'Utils functions for Calc', 'license': LICENSE_EN, }, 'es': { - 'display_name': 'Mi primer extensión', - 'description': 'Mi gran extensión', + 'display_name': 'ZAZ Funciones', + 'description': 'Funciones utiles para Calc', 'license': LICENSE_ES, }, } @@ -156,6 +156,56 @@ FUNCTIONS = { }, }, }, + 'zxlookup': { + 'displayname': {'en': 'zxlookup', 'es': 'zbuscarx'}, + 'description': {'en': 'Find things in a range by row', 'es': 'Buscar en un rango por fila'}, + 'parameters': { + 'lookup_value': { + 'displayname': {'en': 'lookup_value', 'es': 'valor_buscado'}, + 'description': {'en': 'Value to search', 'es': 'Valor buscado'}, + }, + 'lookup_array': { + 'displayname': {'en': 'lookup_array', 'es': 'buscar_en'}, + 'description': {'en': 'Range to search', 'es': 'Rango en donde buscar'}, + }, + 'return_array': { + 'displayname': {'en': 'return_array', 'es': 'devolver_desde'}, + 'description': {'en': 'Range to return', 'es': 'Rango a devolver'}, + }, + 'if_not_found': { + 'displayname': {'en': 'if_not_found', 'es': 'si_no_se_encuentra'}, + 'description': {'en': 'Return if not found', 'es': 'Valor devuelto si no se encuentra'}, + }, + 'match_mode': { + 'displayname': {'en': 'match_mode', 'es': 'tipo_busqueda'}, + 'description': {'en': 'The macht type', 'es': 'El tipo de búsqueda'}, + }, + 'search_mode': { + 'displayname': {'en': 'search_mode', 'es': 'mode_de_busqueda'}, + 'description': {'en': 'The search mode', 'es': 'El modo de búsqueda'}, + }, + }, + }, + 'zxylookup': { + 'displayname': {'en': 'zxylookup', 'es': 'zbuscarxy'}, + 'description': { + 'en': 'Find things in a range in first row and first column, get intersection', + 'es': 'Busca en un rango en la primer fila y columna y devuelve la intersección'}, + 'parameters': { + 'lookup_value_x': { + 'displayname': {'en': 'lookup_value_x', 'es': 'valor_buscado_x'}, + 'description': {'en': 'Value to search in first row', 'es': 'Valor buscado en la primer fila'}, + }, + 'lookup_value_y': { + 'displayname': {'en': 'lookup_value_y', 'es': 'valor_buscado_y'}, + 'description': {'en': 'Value to search in first column', 'es': 'Valor buscado en la primer columna'}, + }, + 'return_array': { + 'displayname': {'en': 'return_array', 'es': 'devolver_desde'}, + 'description': {'en': 'Range to return', 'es': 'Rango a devolver'}, + }, + }, + }, } # ~ FUNCTIONS = {} @@ -176,7 +226,7 @@ DIRS = { 'description': 'description', 'images': 'images', 'registration': 'registration', - 'files': 'files', + 'files': 'extension', 'office': 'Office', 'locales': PATH_LOCALES, 'pythonpath': True, @@ -209,7 +259,7 @@ URL_OXT = '' # ~ Default program for test: --calc, --writer, --draw PROGRAM = '--calc' # ~ Path to file for test -FILE_TEST = '' +FILE_TEST = '/home/mau/test_zfunctions.ods' PATHS = { 'idlc': '/usr/lib/libreoffice/sdk/bin/idlc', diff --git a/files/ZAZFunctions_v0.1.0.oxt b/extension/ZAZFunctions_v0.2.0.oxt similarity index 91% rename from files/ZAZFunctions_v0.1.0.oxt rename to extension/ZAZFunctions_v0.2.0.oxt index 6eea86da4eb33f22cff95b26e5fe0293da8c30d7..40eca132e9a398d7b9a598962987fd9e928e7e1c 100644 GIT binary patch delta 3940 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 Oggr1U&Js%6>-t{<(i!&v diff --git a/source/CalcAddIn.xcu b/source/CalcAddIn.xcu index 663e079..b37e440 100644 --- a/source/CalcAddIn.xcu +++ b/source/CalcAddIn.xcu @@ -57,6 +57,123 @@ + + + zxlookup + zbuscarx + + + Find things in a range by row + Buscar en un rango por fila + + + Add-In + + + AutoAddIn.zxlookup + + + + + lookup_value + valor_buscado + + + Value to search + Valor buscado + + + + lookup_array + buscar_en + + + Range to search + Rango en donde buscar + + + + return_array + devolver_desde + + + Range to return + Rango a devolver + + + + if_not_found + si_no_se_encuentra + + + Return if not found + Valor devuelto si no se encuentra + + + + match_mode + tipo_busqueda + + + The macht type + El tipo de búsqueda + + + + search_mode + mode_de_busqueda + + + The search mode + El modo de búsqueda + + + + + + zxylookup + zbuscarxy + + + Find things in a range in first row and first column, get intersection + Busca en un rango en la primer fila y columna y devuelve la intersección + + + Add-In + + + AutoAddIn.zxylookup + + + + + lookup_value_x + valor_buscado_x + + + Value to search in first row + Valor buscado en la primer fila + + + + lookup_value_y + valor_buscado_y + + + Value to search in first column + Valor buscado en la primer columna + + + + return_array + devolver_desde + + + Range to return + Rango a devolver + + + diff --git a/source/XZAZFunctions.idl b/source/XZAZFunctions.idl index 7c76461..91bf78c 100644 --- a/source/XZAZFunctions.idl +++ b/source/XZAZFunctions.idl @@ -9,6 +9,18 @@ module net { module elmau { module zaz { module functions { { string zreverse([in] string value); any zeval([in] string value); + sequence< sequence< any > > zxlookup( + [in] any lookup_value, + [in] any lookup_array, + [in] any return_array, + [in] any if_not_found, + [in] any match_mode, + [in] any search_mode); + any zxylookup( + [in] any lookup_value_x, + [in] any lookup_value_y, + [in] any return_array, + [in] any if_not_found); }; service functions { diff --git a/source/XZAZFunctions.rdb b/source/XZAZFunctions.rdb index 3ef71ac3d53019f398b83218efb81299b565a7ff..f87157b12d8500b7635d947bdae8cb3b00d0cc91 100644 GIT binary patch delta 531 zcmZo@U~K4M++d)~k^P_1lEHz2VX`A<^yC0ePQl$w3=Av`3{2aEOu{Na^yIa=;*3g@ zU#sd*{-WDf&(FY9RgsgQpIutO00evtJkhbyv59$=ARZS350oX$zynbfUzV6tnu<#@ zv8X5!Q)f|XNoi4DJT}RC2A<5c_`Lj*__X}eycAS(1sQm96HAga;&by;(5w_<;3-Z` zEJBhK0C}Vm;S+@05iC(uU&L21#G?2TU7jSbVETk*aMqv2!14#h}K_Dr_APgi$7({`j7=t*FlmMzz1L}}u fkOCRRAPp3gVUPuqat!i7Qh`AcNGfeKoX89SNGWgW delta 72 zcmZqZU~Fh$++d)~QX>BC_hd)T=*a<`yn>vJ3=Av`42CSesIdh%LbaYnAmuT}LY af6;AYWSV?cUwflb6yqcwmdz{%fA|5@SQIz_ diff --git a/source/ZAZFunctions.py b/source/ZAZFunctions.py index 6921502..847aa1a 100644 --- a/source/ZAZFunctions.py +++ b/source/ZAZFunctions.py @@ -1,3 +1,4 @@ +import bisect import uno import unohelper from net.elmau.zaz.functions import XZAZFunctions @@ -20,6 +21,46 @@ class ZAZFunctions(unohelper.Base, XZAZFunctions): result = eval(value) return result + def zxylookup(self, lookup_value_x, lookup_value_y, return_array, if_not_found): + + return + + def zxlookup(self, lookup_value, lookup_array, return_array, if_not_found, + match_mode, search_mode): + + # The python default value not get in custom functions + if match_mode is None: + match_mode = 0 + else: + match_mode = int(match_mode) + if search_mode is None: + search_mode = 1 + + value = None + if len(lookup_array[0]) == 1: + source = [r[0] for r in lookup_array] + else: + source = lookup_array[0] + + if lookup_value in source: + index = source.index(lookup_value) + value = (return_array[index],) + + if value is None: + if match_mode == -1: + index = bisect.bisect_right(source, lookup_value) + value = (return_array[index],) + elif match_mode == 1: + index = bisect.bisect_left(source, lookup_value) + value = (return_array[index],) + elif match_mode == 2: + pass + + if value is None and not if_not_found is None: + value = ((if_not_found,),) + + return value + g_ImplementationHelper = unohelper.ImplementationHelper() g_ImplementationHelper.addImplementation(ZAZFunctions, ID_EXTENSION, SERVICE) diff --git a/source/description.xml b/source/description.xml index 3c10a2f..efd4aed 100644 --- a/source/description.xml +++ b/source/description.xml @@ -1,10 +1,10 @@ - + - My first extension - Mi primer extensión + ZAZ Functions + ZAZ Funciones diff --git a/source/description/desc_en.txt b/source/description/desc_en.txt index b667a4b..b76304a 100644 --- a/source/description/desc_en.txt +++ b/source/description/desc_en.txt @@ -1 +1 @@ -My great extension \ No newline at end of file +Utils functions for Calc \ No newline at end of file diff --git a/source/description/desc_es.txt b/source/description/desc_es.txt index d8d8fdc..429acf5 100644 --- a/source/description/desc_es.txt +++ b/source/description/desc_es.txt @@ -1 +1 @@ -Mi gran extensión \ No newline at end of file +Funciones utiles para Calc \ No newline at end of file