Pacoideas - Marcar texto buscado

Hola.

imagen

A veces realizamos búsquedas por Índice de trozos y palabras sobre campos de tipo Texto que tienen una longitud grande. Localizar visualmente dónde está el texto encontrado es muchas veces complicado.

Como en muchas aplicaciones que usamos diariamente se me ocurre la Idea de marcar el texto encontrado para facilitar la vida al usuario.

Usaremos un campo de tipo Texto enriquecido para mostrar el texto e insertaremos unas marcas HTML para destacar visualmente los trozos y palabras encontrados.

Esta es la función que obra el milagro:

FUN_TXT_MARCAR_TEXTO(CTEXTO,CTROZOS,CAÑADIR_PRE,CAÑADIR_POS)

Rem ( Marca Trozos de Texto con una cadena PRE y otra POS )
Rem ( CTEXTO: Texto original a procesar )
Rem ( CTROZOS: Cadena de texto con los Trozos a buscar )
Rem ( CAÑADIR_PRE: Texto que se añade ANTES de cada Trozo )
Rem ( CAÑADIR_POS: Texto que se añade DESPUÉS de cada Trozo )
Rem ( Ejem para poner en negrita: FUN_TXT_MARCAR_TEXTO(#CAMPO_TEXTO, "Madrid IVA", "<b>","</b>") )
Rem ( Obtenemos el Nº de Trozos de texto a buscar )
Set ( NNUM_TROZOS, countString(_CTROZOS + " ", " ") )
Set ( CTEXTO_SIN, removeAccents(toLower(_CTEXTO)) )
For ( NTROZO, 0, NTROZO < NNUM_TROZOS, 1 )
	Set ( LSALIR, 0 )
	Set ( CTROZO_NUM, stringSection(_CTROZOS, " ", NTROZO, 0, 0) )
	Rem ( Solo comprobamos los trozos de más de 2 caracteres )
	If ( len(CTROZO_NUM) > 2 )
		Set ( CTROZO_NUM, removeAccents(toLower(CTROZO_NUM)) )
		Set ( NINDEX, -1 )
		Set ( NLONG_TROZO, len(CTROZO_NUM) )
		Libre
		Rem ( Recorremos las ocurrencias )
		Rem ( Tenemos que buscar todos los Trozos porque puede haber algunos con acentos o mayúsculas )
		For ( NOCURRENCIAS, 0, LSALIR = 0, 1 )
			Set ( NINDEX, indexOfString(CTEXTO_SIN, CTROZO_NUM, (NINDEX + 1), 0) )
			If ( NINDEX > -1 )
				Set ( CCADENA_ANTES, mid(_CTEXTO, NINDEX, NLONG_TROZO) )
				Set ( CCADENA_MARCADA, _CAÑADIR_PRE + CCADENA_ANTES + _CAÑADIR_POS )
				Set ( _CTEXTO, replaceString(_CTEXTO, CCADENA_ANTES, CCADENA_MARCADA) )
				Rem ( Desplazamos el INDEX saltando lo insertado para seguir buscando en el texto )
				Set ( NINDEX, NINDEX + len(_CAÑADIR_PRE + CCADENA_ANTES + _CAÑADIR_POS) )
				Set ( CTEXTO_SIN, removeAccents(toLower(_CTEXTO)) )
				Rem ( Limitamos la búsqueda para evitar retardos )
				If ( (NOCURRENCIAS > 10) | (NINDEX > 1000) )
					Set ( LSALIR, 1 )
			Else
				Set ( LSALIR, 1 )
Set dato de retorno ( _CTEXTO )
Libre

Saludos
Paco Satué

2 Me gusta

Como siempre, muy buena aportación Paco

1 me gusta

Paco un 10, mira que hace tiempo se me paso por la cabeza la idea de como hacerlo pero como no era una cosa crucial y no tenia ni idea de como empezar la deje por ahi, pero ahora ya la tienes resuelta. Gracias de nuevo.

1 me gusta

Gracias Paco por acordarte de los demás y regalarnos esta función tan práctica.

Gracias por el aporte. funciona perfecto.

Solo hice algunas pequeñas modificaciones para poder especificar el color del background y color del texto en la misma función.

Comparto lo que modifique por si a alguien le sirve.

FUN_TXT_MARCAR_TEXTO(CAMPO_TEXTO, TEXTO_TROZO, COLOR_TEXTO,COLOR_BACKGROUND) )
Rem ( Ejem para poner en negrita: FUN_TXT_MARCAR_TEXTO(#CAMPO_TEXTO, “Madrid IVA”, “red”,“yellow”) )

Rem ( Se modifica las variables _CAÑADIR_PRE y _CAÑADIR_POS)

Set ( _CAÑADIR_PRE, "<span style='background:" + _CFONDO + ";" + "color:" + _CCOLOR + "'><b>") )
Set ( _CAÑADIR_POS, "</b></span>") )

El resto del codigo queda exactamente igual.Texto preformateado