Hola a todos,
Se puede crear una herramienta que nos sirva para buscar palabras y resaltar en Power Apps. La idea es utilizar SharePoint como repositorio de los textos y mostrar la información en Power Apps directamente.
Por ejemplo:

Ahora vamos a trasladar esta funcionalidad a Power Apps. Para ello, he creado el siguiente diseño:
Añadimos un cuadro de entrada de texto (TextInputBuscar) para introducir la palabra que queremos buscar, una casilla de verificación (chkCoincidenciaExacta) para activar o desactivar la búsqueda exacta, una galería vertical (galDocumentos) conectada a nuestra lista de SharePoint, un botón (btnReset) para limpiar los valores y un control HTML (HTMLResultado) para mostrar el documento con las coincidencias resaltadas.
Dentro de la galería, incorporamos una etiqueta (lblTitulo) para mostrar el título de cada documento y un icono de flecha (icoCargar) para seleccionarlo.
Al pulsar la flecha de un registro de la galería, cargaremos su contenido en el control HTML, donde podremos realizar las búsquedas sin modificar el texto original.

El resultado va a ser el siguiente, por ejemplo si queremos buscar en el texto la palabra fracaso, pero sin que la búsqueda sea exacta:

Y ahora os dejo los códigos:
En la flecha de la galería:
Set(
varTexto;
ThisItem.Documento
);;
Set(
varTitulo;
ThisItem.Title
);;
Reset(TextInputBuscar)
En el html:
With(
{
texto: Coalesce(varTexto; "");
buscar: Trim(TextInputBuscar.Text);
exacta: chkCoincidenciaExacta.Value
};
If(
IsBlank(texto);
"";
If(
IsBlank(buscar);
"<div style='white-space:pre-wrap;
font-family:Segoe UI;
font-size:15px;
line-height:1.6;'>" &
EncodeHTML(texto) &
"</div>";
With(
{
textoNormalizado:
If(
exacta;
texto;
Concat(
Split(Lower(texto); "");
Switch(
Value;
"á"; "a";
"à"; "a";
"ä"; "a";
"â"; "a";
"é"; "e";
"è"; "e";
"ë"; "e";
"ê"; "e";
"í"; "i";
"ì"; "i";
"ï"; "i";
"î"; "i";
"ó"; "o";
"ò"; "o";
"ö"; "o";
"ô"; "o";
"ú"; "u";
"ù"; "u";
"ü"; "u";
"û"; "u";
Value
)
)
);
buscarNormalizado:
If(
exacta;
buscar;
Concat(
Split(Lower(buscar); "");
Switch(
Value;
"á"; "a";
"à"; "a";
"ä"; "a";
"â"; "a";
"é"; "e";
"è"; "e";
"ë"; "e";
"ê"; "e";
"í"; "i";
"ì"; "i";
"ï"; "i";
"î"; "i";
"ó"; "o";
"ò"; "o";
"ö"; "o";
"ô"; "o";
"ú"; "u";
"ù"; "u";
"ü"; "u";
"û"; "u";
Value
)
)
)
};
With(
{
partes: Split(
textoNormalizado;
buscarNormalizado
)
};
"<div style='white-space:pre-wrap;
font-family:Segoe UI;
font-size:15px;
line-height:1.6;'>" &
Concat(
Sequence(CountRows(partes)) As fila;
With(
{
segmento: Coalesce(
Index(partes; fila.Value).Value;
""
);
inicio:
Len(
Concat(
FirstN(
partes;
fila.Value - 1
);
Value
)
) +
(fila.Value - 1) *
Len(buscarNormalizado) + 1
};
EncodeHTML(
Mid(
texto;
inicio;
Len(segmento)
)
) &
If(
fila.Value < CountRows(partes);
"<span style='background-color:#FFEB3B;
font-weight:bold;'>" &
EncodeHTML(
Mid(
texto;
inicio + Len(segmento);
Len(buscarNormalizado)
)
) &
"</span>";
""
)
)
) &
"</div>"
)
)
)
)
)
En el reset:
Set(varTexto; Blank());;
Set(varTitulo; Blank());;
Reset(TextInputBuscar);;
Reset(galDocumentos)
Y esto ha sido todo por hoy, espero que sea de utilidad.
