Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-04-2005
Elfoscuro Elfoscuro is offline
Miembro
 
Registrado: mar 2005
Posts: 59
Poder: 20
Elfoscuro Va por buen camino
Yo lo que haría sería:

Lees y si encuentras un '<', avanzas hasta que encuentres un '>'.

Empiezas a pasar chars a una string temporal hasta que vuelvas a encontrar un '<'.

Si la cadena es diferente de '', entonces miro el primer char, y si es espacio, lo sustituyo.

******** Pregunta: la cadena '&nbsp; algo' ¿ya serviría? Es decir, que si el primer char no es un espacio, ¿el HTML muestra lo que haya, íntegro?

Después añades a la salida la cadena temporal y sigues.

Un saludo
Responder Con Cita
  #2  
Antiguo 25-04-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile Interesante

¡Hola a todos!

Sin duda un asunto relativamente complejo, más no debemos complicarnos.

Cita:
Empezado por Elfoscuro
...Pregunta: la cadena '&nbsp; algo' ¿ya serviría? Es decir, que si el primer char no es un espacio, ¿el HTML muestra lo que haya, íntegro?...
Tengo esa misma duda, es decir, si tenemos una expresión HTML como:

<Etiqueta> Cien Años De Soledad </Etiqueta>

cuyo valor interno, « Cien Años De Soledad », tiene dos espacios de prefijo y dos de sufijo, ¿bastaría dejarla así?:

<Etiqueta>&nbsp; Cien Años De Soledad &nbsp;</Etiqueta>

¿o sería necesario dejarla así?:

<Etiqueta>&nbsp;&nbsp;Cien Años De Soledad&nbsp;&nbsp;</Etiqueta>

Me inclino a pensar que con un sólo «&nbsp;» de cada lado bastaría, como en la primera opción.

Haré una prueba y enseguida regreso.

Un favor: ¿podrían insertar algunos saltos de línea en sus mensajes para mejor apreciación del tema en resolución de 800 X 600 pixeles? Gracias.

Al González.

Última edición por Al González fecha: 25-04-2005 a las 03:48:45.
Responder Con Cita
  #3  
Antiguo 25-04-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile HTMLEspaciado

¡Hola de nuevo!

Comprobé que si es necesario un «&nbsp;» por cada espacio del prefijo y del sufijo del valor String que se encuentra entre etiquetas.

Juan:

Desarrollé una función de nombre HTMLEspaciado que nos permite solucionar este tipo de casos. He aquí el código:
Código Delphi [-]
...
implementation

{$R *.dfm}

Uses
  StrUtils;

Function HTMLEspaciado (Const Cadena :String;
  Const IndicadorTemporal :Char = #255) :String;
Var
  Incremento, Indice, Ultimo :Integer;
  CaracterEtiqueta :Char;  { Carácter de Etiqueta }

  Procedure Espaciar;
  Var
    CaracterBuscado :Char;  { Carácter Buscado }
  Begin
    CaracterBuscado := CaracterEtiqueta;

    Repeat
      If Result [Indice] = CaracterBuscado Then
        If CaracterBuscado = CaracterEtiqueta Then
          CaracterBuscado := ' '
        Else
          Result [Indice] := IndicadorTemporal
      Else
        If CaracterBuscado = ' ' Then
          CaracterBuscado := CaracterEtiqueta;

      Inc (Indice, Incremento);
    Until Indice = Ultimo;
  End;
Begin
  Result := Cadena;

  If Result = '' Then
    Exit;

  CaracterEtiqueta := '>';
  Indice := 1;
  Incremento := 1;
  Ultimo := Length (Cadena);
  Espaciar;
  CaracterEtiqueta := '<';
  Indice := Length (Cadena);
  Incremento := -1;
  Ultimo := 1;
  Espaciar;
  Result := ANSIReplaceStr (Result, IndicadorTemporal, '&' + 'nbsp;');
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit2.Text := HTMLEspaciado (Edit1.Text);
end;
...
NOTA: En la línea «Result := ANSIReplaceStr...» separé la expresión '&nbsp;' en dos partes, para evitar un problema de interpretación HTML encontrado al exponer dicha expresión en formato de código Delphi. Para su utilización real no es necesario que dicha expresión esté separada.

La función HTMLEspaciado asume que todos los símbolos de menor que (<) y mayor que (>) de la cadena dada son delimitadores de etiquetas HTML, y ninguno de ellos parte de un valor que literalmente contenga esos símbolos, ya que para ello se utilizan los códigos especiales «&lt;» y «&gt;».

Realicé varias pruebas. En una de ellas introduzco la cadena '<Etiqueta de prueba> Cien Años De Soledad </Etiqueta de prueba>' en Edit1, con dos espacios a cada lado de la subcadena 'Cien Años De Soledad'. Al oprimir el botón Button1, queda en Edit2 la cadena resultante '<Etiqueta de prueba>&nbsp;&nbsp;Cien Años De Soledad&nbsp;&nbsp;</Etiqueta de prueba>'.

Es posible que tengamos que hacer más pruebas, o añadir funcionalidad extra a la rutina, pero creo que por lo pronto tenemos un avance importante.

Estoy considerando incluir esta función en la biblioteca Interfaz GH, porque me parece una necesidad relativamente común esto de "espaciar" valores HTML.

Espero esto sea de utilidad, seguimos en contacto.

Al González.
Responder Con Cita
  #4  
Antiguo 28-04-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile Continuidad al caso

¡Hola a todos!

Juan:

Me quedé con la duda de si te sirvió la función que escribí, o de qué forma solucionaste el problema planteado. ¿Podrías compartir con nosotros tus avances al respecto? Por favor.

Gracias.

Seguimos en contacto.

Al González.
Responder Con Cita
  #5  
Antiguo 29-04-2005
Avatar de JuanBCT
JuanBCT JuanBCT is offline
Miembro
 
Registrado: ago 2004
Ubicación: Campana, Argentina
Posts: 57
Poder: 20
JuanBCT Va por buen camino
Hola Al! Ante todo, mil disculpas a todos por lo que demoré en responder.
Traté de usar tu función pero no me funcionó, creo que porque uso Delphi 5 (no me encontraba la librería strutils; la q descubrí que se halla en las librerías rxlib - pero la versión de Delphi 5 de estas no traían la procedure de ANSIReplaceStr).
Igualmente, gracias a las ideas q uds. aportaron, se me ocurrió hacerlo de esta forma:

1) Leo cada línea del HTML con un for, y busco caracter='>' y caracter[i+1]=' '.
2) En una variable guardo la posición donde se encuentra el primer ' ' (la llamé istart) y voy buscando a ver si los siguientes también son espacio, cada vez q pasa guardo la posición en iend (al final va a tener la posición del último espacio antes de la primer letra).
3) Corto el string en dos, y los guardo en archivos temporales: Uno es desde el principio del string hasta la posición del último caracter antes del espacio, otro es desde el último espacio hasta el final del string ( Length(String) ).
4) Me olvidé de decir antes que guardé la cantidad de espacios en otra variable, asi que hago lo siguiente: En otro string mas [i]pego la primer parte, luego inserto tantos '&nbsp' como el contador de espacios tenga, luego pego la segunda parte que tenía cortada.

Es básicamente eso. Seguramente se puede hacer de forma más eficiente, sin tantos strings temporales y código; pero bueno, lo fuí haciendo sobre la marcha, funciona bastante rápido.... aparte soy medio cavernícola para programar!!!

Bueno, les muestro la parte del código que hice, les agradezco infinitamente a todos por su tiempo.
Aquí va:

Código Delphi [-]
 //Archiv es el stringlist en donde cargué el HTML
SS:=archiv.Strings[A];
//==========================================================================
// :: RUTINA - AGREGADO DE "&nbsp"
//Busco los primeros espacios luego del > que no tenga como próximo un <, y
//reemplazo por &nbsp
//==========================================================================
//1) Voy a tener dos variables integer: istart, iend. Ahí voy a guardar las
// posiciones dentro del string donde empiezan los espacios en la línea
// y donde terminan.
// Entonces: Leo y pregunto si el caracter es ">":
//==========================================================================
for indicess:=0 to Length(SS) -1 do
  begin
  if (SS[indicess]='>') then
    begin
    if (SS[indicess+1]=' ') then
     begin
     istart:=indicess;
     indice2:=indicess;
     //Paso a usar otro indice, "indice2" para localizar donde empieza el caracter
    while indice2<>iend do
    begin
      indice2:=indice2 + 1;
        if (SS[indice2]<>' ') then
          begin
            iend:=indice2;
          end;
    end;
end;
//Ahora, a partir de que encontré el primer espacio y grabé el comienzo;
//sigo leyendo y grabo el final cada vez que encuentre otro espacio...
end;
end;
//==========================================================================
//2)Ok, después de todo esto me quedo con dos valores, ISTART e IEND.
//LA CANTIDAD DE ESPACIOS QUE TENGO QUE INSERTAR ES (IEND-ISTART-1)
//Calculemosla:
cantinst:=(iend-istart-1);
//Bien, ahora insertemos a partir del istart la cantidad cantinst de &nbsp
//O más facil aún: Copio el string desde el principio hasta ISTART y la
//grabo en un string temporal, STA. También copio el string desde IEND hasta
//Length(SS) y la paso a STB.
//Ahora, armo STFINAL así: Copio STA
// Concateno '&nbsp' CANTINST veces
// Concateno STB
// Y listo!
// Entonces:
sta:=Copy(SS,0,istart);
stb:=Copy(SS,iend,Length(SS));
stfinal:=sta;
for indice3:=0 to cantinst -1 do
  begin
    stfinal:=stfinal+'&nbsp';
  end;
stfinal:=stfinal + stb;
SS:=stfinal;

Saludos!!!!!!

Última edición por JuanBCT fecha: 29-04-2005 a las 22:26:04. Razón: 'horror' ortográfico
Responder Con Cita
  #6  
Antiguo 29-04-2005
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Buen día a todos!

Cita:
Empezado por JuanBCT
...Traté de usar tu función pero no me funcionó, creo que porque uso Delphi 5 (no me encontraba la librería strutils; la q descubrí que se halla en las librerías rxlib - pero la versión de Delphi 5 de estas no traían la procedure de ANSIReplaceStr).
Hice la función HTMLEspaciado utilizando Delphi 7, versión donde se encuentra de forma nativa una unidad llamada StrUils, la cual contiene a la función ANSIReplaceStr.

Para compilarlo en Delphi 5, creo que bastaría susituir la llamada a ANSIReplaceStr por alguna otra función que sirva para reemplazar subcadenas, como StringReplace (no recuerdo si viene en Delphi 5) o alguna otra.

Cita:
Empezado por JuanBCT
...Seguramente se puede hacer de forma más eficiente, sin tantos strings temporales y código...
Así es, con HTMLEspaciado (con las adaptaciones necesarias para Delphi 5, si son tan amables de ayudarnos los demás compañeros del foro ), por poner un ejemplo.

Gracias por mantenernos informado.

¡Un abrazo!

Al González.

P.D. ¿Podrían insertar algunos saltos de línea para leer adecuadamente este hilo en resolución de 800 X 600 pixeles? Gracias.
Responder Con Cita
  #7  
Antiguo 29-04-2005
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.913
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Te resulto muy dificil lo de las expresiones regulares? Era solo cuestion de bajar un componente y dos lineas/tres a lo sumo de codigo.... y cubre mas casos que las funciones a mano expuestas...
__________________
El malabarista.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 11:30:13.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi