#!/usr/bin/env python #-*- coding: iso8859-15 -*- ########################################################## # LIBRERIA DE FILTROS v1.0 # ########################################################## # Autor: Juan Miguel Taboada Godoy # # Fecha: Malaga, 16 de noviembre de 2006 # # Descripcion: Contiene todos las funciones de filtros # # Version: 2006111600 # # # # Codigo fuente bajo licencia GNU/GPL # # Centrologic (Computational Logistic Center) # # http://www.centrologic.com - info@centrologic.com # ########################################################## ## \defgroup FILTER FILTER: Libreria de filtros ## \version 16/11/2006 1058 Szczecin # Librerias necesarias {{{1 import time import datetime from MATH_GRA import digitos # }}}1 # Genera una cadena REGEX compatible de un texto dado {{{1 ## \ingroup FILTER ## Devuelve un filtro REGEX de la cadena dada ## - \%fechatexto -> NUMERO(1 o 2 digitos) de %mes de NUMERO(4 digitos) ## - \%fechatextoayer -> NUMERO(1 o 2 digitos) de %mesayer de NUMERO(4 digitos) ## - \%fecha -> NUMERO(2 digitos)-NUMERO(2 digitos)-NUMERO(4 digitos) ## - \%ayer -> NUMERO(2 digitos)-NUMERO(2 digitos)-NUMERO(4 digitos) ## - \%ifecha -> NUMERO(4 digitos)-NUMERO(2 digitos)-NUMERO(2 digitos) ## - \%iayer -> NUMERO(4 digitos)-NUMERO(2 digitos)-NUMERO(2 digitos) ## - \%mes -> PALABRA ## - \%mesayer -> PALABRA ## - \%semana -> PALABRA ## - \%semanaayer -> PALABRA ## - \%hora -> NUMERO(2 digitos)-NUMERO(2 digitos) ## - \%epoch -> NUMERO(con o sin punto) ## - \%now -> NUMERO(con o sin punto) ## - \%d -> DIGITO o NUMERO(1 digito) ## - \%l -> LETRA ## - \%* -> TEXTO ## \param [in] texto Texto a procesar ## \return Texto modificado def filtro_regex(texto): # Filtro de fechatexto texto=texto.replace("%fechatexto","([0-9]|([1-3][0-9])) de %mes de ([1-3][0-9][0-9][0-9])") texto=texto.replace("%fechatextoayer","([0-9]|([1-3][0-9])) de %mesayer de ([1-3][0-9][0-9][0-9])") # Filtro de fecha texto=texto.replace("%fecha","([0-3][0-9]-[0-1][0-9]-[0-3][0-9]") texto=texto.replace("%ayer","([0-3][0-9]-[0-1][0-9]-[0-3][0-9]") texto=texto.replace("%ifecha","([1-3][0-9][0-9][0-9])-[0-1][0-9]-[0-3][0-9]") texto=texto.replace("%iayer","([1-3][0-9][0-9][0-9])-[0-1][0-9]-[0-3][0-9]") # Filtro de mes texto=texto.replace("%mes","[a-zA-Z]+") texto=texto.replace("%mesayer","[a-zA-Z]+") # Filtro de semana texto=texto.replace("%semana","[a-zA-Z]+") texto=texto.replace("%semanaayer","[a-zA-Z]+") # Filtro de hora texto=texto.replace("%hora","[0-2][0-9]:[0-5][0-9]") texto=texto.replace("%epoch","*[0-9.]") texto=texto.replace("%now","*[0-9.]") # Digito texto=texto.replace("%d","[0-9]") # Letra texto=texto.replace("%l","[a-zA-Z]") # Filtro de todo texto=texto.replace("%*",".*") # ### Devuelvo el resultado ### #################### return "^%s$" % (texto) # }}}1 # Filtra texto {{{1 ## \ingroup FILTER ## Funcion que filtra el texto dado segun varios tipos de filtros. ## - \%fechatexto -> 01 de septiembre ## - \%fechatextoayer -> 31 de agosto ## - \%fecha -> 01-09-1980 ## - \%ayer -> 31-08-1980 ## - \%ifecha -> 1980-09-01 ## - \%iayer -> 1980-08-31 ## - \%mes -> septiembre ## - \%mesayer -> agosto ## - \%semanasigla -> L ## - \%semanasiglaayer -> D ## - \%semana -> lunes ## - \%semanaayer -> domingo ## - \%hora -> 19:44 ## - \%epoch -> 1138239883 ## - \%now -> 1138239883 ## \param [in] texto Texto que va a ser procesado ## \param [in] viaje_temporal Variable para traslacion temporal, usada en la generacion de historicos ## \return Texto modificado def filtrar_texto(texto,viaje_temporal=None): # TEXTOS {{{2 lista_dias_semana=["Lunes","Martes","Miercoles","Jueves","Viernes","Sabado","Domingo"] lista_dias_semana_siglas=["L","M","X","J","V","S","D"] lista_meses=["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"] # }}}2 # ### FECHA-HORA ### ############################### {{{2 # Obtiene los datos de la fecha formato normal if (viaje_temporal==None): ahora=time.time() else: ahora=viaje_temporal # Genero la fecha de hoy en una tupla hoy=datetime.datetime.fromtimestamp(ahora) ayer=datetime.datetime.fromtimestamp(ahora-86400) fecha_hoy=hoy.timetuple() fecha_ayer=ayer.timetuple() # Dias de la semana semana=fecha_hoy[6] if ((semana<0) or (semana>6)): semana_texto="?" semana_sigla="?" else: semana_texto=lista_dias_semana[semana] semana_sigla=lista_dias_semana_siglas[semana] semana_ayer=fecha_ayer[6] if ((semana_ayer<0) or (semana_ayer>6)): semana_ayer_texto="?" semana_ayer_sigla="?" else: semana_ayer_texto=lista_dias_semana[semana_ayer] semana_ayer_sigla=lista_dias_semana_siglas[semana_ayer] # Texto del mes mes=fecha_hoy[1] if ((mes<1) or (mes>12)): mes_texto="?" else: mes_texto=lista_meses[mes-1] mes_ayer=fecha_ayer[1] if ((mes_ayer<1) or (mes_ayer>12)): mes_ayer_texto="?" else: mes_ayer_texto=lista_meses[mes_ayer-1] # Filtro de fecha texto=texto.replace("%fechatextoayer","%s de %s" % (digitos("%s" % fecha_ayer[2],2),mes_ayer_texto)) texto=texto.replace("%fechatexto","%s de %s" % (digitos("%s" % fecha_hoy[2],2),mes_texto)) texto=texto.replace("%fecha","%s-%s-%s" % (digitos("%s" % fecha_hoy[2],2),digitos("%s" % fecha_hoy[1],2),fecha_hoy[0])) texto=texto.replace("%ayer","%s-%s-%s" % (digitos("%s" % fecha_ayer[2],2),digitos("%s" % fecha_ayer[1],2),fecha_ayer[0])) # Filtro de fecha invertida texto=texto.replace("%ifecha","%s-%s-%s" % (fecha_hoy[0],digitos("%s" % fecha_hoy[1],2),digitos("%s" % fecha_hoy[2],2))) texto=texto.replace("%iayer","%s-%s-%s" % (fecha_ayer[0],digitos("%s" % fecha_ayer[1],2),digitos("%s" % fecha_ayer[2],2))) # Filtro del mes texto=texto.replace("%mesayer","%s" % (mes_ayer_texto)) texto=texto.replace("%mes","%s" % (mes_texto)) # Filtro del dia de la semana texto=texto.replace("%semanasiglaayer","%s" % (semana_ayer_sigla)) texto=texto.replace("%semanasigla","%s" % (semana_sigla)) texto=texto.replace("%semanaayer","%s" % (semana_ayer_texto)) texto=texto.replace("%semana","%s" % (semana_texto)) # Filtro de hora texto=texto.replace("%hora","%s:%s" % (digitos("%s" % fecha_hoy[3],2),digitos("%s" % fecha_hoy[4],2))) # Filtro de epoch texto=texto.replace("%epoch","%s" % (hoy)) texto=texto.replace("%now","%s" % (hoy)) # }}}2 # ### Devuelvo el resultado ### #################### return texto # }}}1 # Intercambia las comas por puntos {{{1 ## \ingroup FILTER ## \internal ## Funcion que intercambia las comas de una cadena por puntos ## \param [in] cadena Texto que va a ser procesado ## \return Texto modificado def coma2point(cadena): cad='' for caracter in cadena: if caracter==',': caracter='.' cad=cad+caracter return cad #}}}1 # Separar los operadores del resto de informacion con un espacio {{{1 # Indica si un operador es conocido o no {{{3 def operador_conocidos(caracter): if (caracter=='+'): return True elif (caracter=='-'): return True elif (caracter=='*'): return True elif (caracter=='/'): return True elif (caracter=='^'): return True else: return False # }}}3 ## \ingroup FILTER ## \internal ## Separa con espacios los operadores que se reconozcan en una cadena, es decir, ## dato el texto "378+421*33/05" obtendremos como resultado "378 + 421 * 33 / 05" ## \param [in] cadena Texto que va a ser procesado ## \return Cadena cuyos operadores estan separados de los operandos mediante espacios def separar_operadores(cadena): resultado="" for i in range(0,len(cadena)): if (operador_conocidos(cadena[i])): resultado="%s %s " % (resultado,cadena[i]) else: resultado="%s%s" % (resultado,cadena[i]) return resultado # }}}1 # Calculator for extended values {{{1 ## \ingroup FILTER ## Extende the given value if it is possible ## \param value Normal value or extended def extendvalue(value): # Try to make it a float straight try: return float(value) except: pass # It was not possible, I check if is an string if (type(value)==type("abc")): # Get the information we need try: number=float(value[0:-1]) extension=value[-1] except: raise IOError,"The given value is not a number. I tried to break it like %s with extension %s but there is no number on it." % (value[0:-1],value[-1]) # Process the number if (extension=='k'): return number*1000 if (extension=='M'): return number*1000000 if (extension=='G'): return number*1000000000 if (extension=='T'): return number*1000000000000 if (extension=='s'): return number if (extension=='m'): return number*60 if (extension=='h'): return number*60*60 if (extension=='D'): return number*60*60*24 if (extension=='W'): return number*60*60*24*7 raise IOError,"The given value is right extended number. I tried to break it like %s with extension %s but I don not understand the given extension." % (value[0:-1],value[-1]) # }}}1