Comunidad Gambas-es
Solicitando una función sobre TextEdit y Richtext - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: Controles/Librerías/Componentes (https://gambas-es.org/forum-7.html)
+--- Tema: Solicitando una función sobre TextEdit y Richtext (/thread-1639.html)

Páginas: 1 2


Solicitando una función sobre TextEdit y Richtext - Shordi - 19-03-2024

Necesito una función que me diga la posición del cursor a partir del RichText.

Me explico: Un control TextEdit tiene una propiedad .Text que nos da el texto puro y duro que contenga y una propiedad .RichText que nos muestra el texto enriquecido que hay debajo. También dispone de una propiedad .Pos que establece/devuelve la posición del cursor dentro del texto, así como métodos para manejar esa posición.

Bien, yo necesito algo que dada la ubicación de una etiqueta HTML me devuelva la ubicación del texto que hay dentro de esa etiqueta.

Ejemplo:

Supongamos que dentro de un Textedit tenemos un texto así:

        Este es un texto con una palabra en negrita.

la propiedad .text será:

        Este es un texto con una palabra en negrita

y la propiedad .RichText será:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'default'; font-size:10pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:44px;">Este es un texto con una <span style=" font-weight:600;">palabra</span> en negrita..</p></body></html>


Bien supongamos que buscamos la palabra que está en negrita, o sea: "palabra" a partir del Richtext, no del text.

Dentro del .Richtext, "palabra" empieza en el carácter 550.

Dentro del .text "palabra" empieza en el carácter 26

Necesito una función que me traduzca ese 550 a 26... y viceversa si es posible, claro.

Llevo dos días comiéndome el coco con ello y no encuentro la manera correcta. Os diría lo que he intentado... pero eso podría llevaros a callejones sin salida, como a mí.

Venga, se me animen.


Saludos



RE: Solicitando una función sobre TextEdit y Richtext - Grandamakulo - 19-03-2024

No sé si esto es lo que buscas. Digamos que de 550 a 26 lo clava, pero al revés no es del todo exacto. Además, hay cosas que quizá convenga detallar.
  1. Una ocurrencia o todas.
  2. Realmente quieres buscar esa palabra o quieres etiquetar esa palabra y luego quitar esa etiqueta —me refiero a poner <span> para hacer un marcado provisional, que luego deje el texto tal cual; para eso ya tengo hecho un par de funciones—.
  3. La entrada a la función sería una palabra, una posición de cursor...
  4. Y tenía otra pregunta, pero conforme escribía se me ha olvidado, no sería importante.
En fin, en el ejemplo puedes buscar la primera ocurrencia con el cuadro de texto o una ocurrencia cualquiera haciendo doble click sobre una palabra. Y sí, el código es farragoso por estar medio improvisado, o improvisado y medio. Sí, soy yo, jajaja.
Ya me dices.


RE: Solicitando una función sobre TextEdit y Richtext - Shordi - 19-03-2024

Por orden.
Cita: Una ocurrencia o todas.

Eso lo tengo como parámetro configurable. En principio todas.
Cita:Realmente quieres buscar esa palabra o quieres etiquetar esa palabra y luego quitar esa etiqueta —me refiero a poner <span> para hacer un marcado provisional, que luego deje el texto tal cual; para eso ya tengo hecho un par de funciones—.
Quiero buscar esa palabra, mejor dicho cadena, siempre y cuando esté etiquetada de una forma concreta. Digamos un color (en el ejemplo de más arriba era la negrita). No me interesan las que no lo estén.

En realidad busco la etiqueta html y dentro de ella la cadena y entonces ubicar sobre ella el cursor.

El caso concreto, es para Soprano. Ya tengo solucionada la cuestión de elegir una palabra, pulsar sobre el color elegido y marcar todas las ocurrencias con ese color. Lo que no consigo es, desde cualquier lugar del texto, pulsar sobre el color elegido y ubicarme en la siguiente palabra marcada.
Cita: 
La entrada a la función sería una palabra, una posición de cursor...

el Richtext, el código de color y la posición actual. Retorna la nueva posición.
Si está dentro del formulario donde el Richtext está contenido en el textEdit y la posición también, con el código de color sería suficiente.

Te adjunto el "Quijote I" de tu ejemplo con la cadena "de" marcada en amarillo. La idea sería ubicarse sobre una de las marcas amarillas, pulsar doble click (o lo que sea) y que el cursor se posicione sobre la marca siguiente (para sacar nota que se pudiese elegir entre la siguiente o la anterior).

Gracias por tu interés.

Saludos.


RE: Solicitando una función sobre TextEdit y Richtext - Grandamakulo - 19-03-2024

Vale, ¿y generar una matriz de ocurrencias con RegExp.FindAll sobre "<(|/)span:" & sEtiqueta & "(.*?)>" (*) y avanzar o retroceder sobre esa matriz? Ahora sólo es cuestión de buscar el índice del elemento que se está pulsando, lo que es mucho más sencillo.
Le doy una vuelta, si quieres.

(*)

[code]

Sería añadir el elemento background-color:#ffffc0 en la cadena de búsqueda. Pero, ¿no has pensado en usar una etiqueta en particular para marcar esas ocurrencias, del tipo <span: DEMIURGIA aquírestodeatributos>?


RE: Solicitando una función sobre TextEdit y Richtext - tincho - 19-03-2024

No creo que el enfoque adecuado sea la posición del carácter, en su lugar conviene trabajar con el html y sus nodos para acceder a sus atributos, si es que existen, para alterarlos o para quitarlos o agregarlos.
Dejo un ejemplo.

Código:
'' Return a Html text with the color changed where the string match with the first prameter "s"

Public Function Color(s As String, htx As String) As String

  Dim htm As New HtmlDocument
  Dim ele As XmlElement
  Dim att As XmlNode

  htm.FromString(htx)

  For Each ele In htm.Body.GetChildrenByTagName("span")
    If ele.Value = s Then
      If ele.Attributes.Count > 0 Then
        For Each att In ele.Attributes
          If att.Value = " font-weight:600;" Then
            att.Value = " font-weight:666;"
          Endif
        Next
      Endif
    Endif
  Next

  Return htm.ToString()

End



RE: Solicitando una función sobre TextEdit y Richtext - Grandamakulo - 20-03-2024

Sí, peeeero, la gestión de XML/HTML de forma masiva por nodos suele ser muy lenta. De ahí el uso de RegExp para cambiar rápidamente los nodos <span>. Precisamente por eso le sugiero un marcado especial por función —que, además, para eso está—, porque es mucho más rápido de encontrar. cuanto menor es el número de ocurrencias —i.e., cuanto más específica sea la etiqueta— más rápido se pueden encontrar por el método que sea.


RE: Solicitando una función sobre TextEdit y Richtext - Shordi - 20-03-2024

Probando estoy las sugerencias... pero esta noche vienen invitados a casa hasta el domingo, o sea, nada de ordenata y mucho de cocina. Ya os diré cómo va el tema.

Saludos


RE: Solicitando una función sobre TextEdit y Richtext - Grandamakulo - 20-03-2024

¿Te refieres al tema de la cocina?
No hay nada que un buen bellota —al precio que va es lo menos que se le puede pedir— y una tortilla de patatas no puedan hacer. Para lo demás, saca primero el vino bueno y, después de un par de copas, el «Don Simón» que ya nade se dará cuenta.
¿O te refieres al tema ordenador?


RE: Solicitando una función sobre TextEdit y Richtext - Harpo - 20-03-2024

Me interesa el tema de RegExp, ¿se puede usar para ficheros SVG?. Estoy trasteando con ellos y no me convence XML, me he creado un parser propio pero es más lento, no me sirve para lo que quiero.

Un saludo, Harpo.


RE: Solicitando una función sobre TextEdit y Richtext - Grandamakulo - 21-03-2024

Ni caso en mis respuestas. Resulta que siempre trabajo con los HTML si pasarlos por TextEditor. Pero, claro, este componente tiene vida propia.
Así es como le mando un texto:
Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Ubuntu'; font-size:12pt; font-weight:456; font-style:normal;"><p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">En un lugar de La <span:buscar style="background-color:#FFFF00; text-decoration-line:overline underline; text-decoration-color:#A00000; text-decoration-style:solid; color:#A00000;">M</span:buscar>ancha, de cuyo nombre no quiero acordarme...</p></body></html>
Y así es como lo interpreta:
Código:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Ubuntu'; font-size:12pt; font-weight:456; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">En un lugar de La <span style=" color:#a00000; background-color:#ffff00;">M</span>ancha, de cuyo nombre no quiero acordarme...</p></body></html>
Por tanto, lo que me funciona directamente en un HTML no vale para TextEditor.
Pero no pasa nada, prometo una respuesta más prolija con soluciones.
Más o menos.
Así le doy tiempo a Shordi a preparar una fideguá de marisco, una porchetta o un potaje en condiciones para sus comensales —entre los que no me encuentro porque no quiera, porque soy superagradecido y me callo los defectos del cocinero siempre ;P—.

(20-03-2024, 21:10)Harpo escribió: Me interesa el tema de RegExp, ¿se puede usar para ficheros SVG?. Estoy trasteando con ellos y no me convence XML, me he creado un parser propio pero es más lento, no me sirve para lo que quiero.

Un saludo, Harpo.

Nunca lo he probado como tal, pero supongo que sí. si me dices qué buscas, podemos verlo.