• Publicidad

Necesito que me corrijan por favor

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Necesito que me corrijan por favor

Notapor nopi:) » 2005-06-28 01:51 @118

Saludos a todos!!
Aunque ya entregué esto :( pero aún me quedo con la curiosidad
de hacerlo funcionar (respóndamne cuando puedan, ya lo entregué y no hay apuro)

Mi programa debe leer un archivo html y entregar una salida
archivo_cargado.spam si encuentra "tinta invisible" (texto con igual color que el fondo) y cambiar el color del texto por cualquier otro que se vea en el archivo de salida(o sea debe entregar un archivo de salida igual que el de entrada, pero con el texto cambiado de color si lo encuentra igual que el fondo).

aqui va mi código(todo comentado):
Código: Seleccionar todo
#!/usr/local/bin/perl
print "Nombre del Archivo:";     #abre archivo
$archivo = <STDIN>;
open(FHANDLE,$archivo) || die "$!";
$out = "${archivo}.spam";  #nombre arch salida=nombre entrada.spam
open(OUT,>$out)|| die "$!";
while (<FHANDLE>){       #primero: recorre el archivo y busca color de fondo
        if ($_ =/bgcolor=["]*(.*\s)["]*/$1/i){  #asigno "color" a $1
                $fondo=$1;   #$fondo es el color de fondo
                next;
        }else{           #si no existe bgcolor, por defecto blanco
                $fondo="white";
                next;
        }
}
while (<FHANDLE>){  #recorre el archivo
      if (($fondo=="white")||($fondo=="#FFFFFF")){#segundo:analiza fondo blanco,
                if (($_==/\scolor=["]*(white)["]*/i)||          #letras blancas
                    ($_==/\scolor=["]*(#FFFFFF)["]*/i) ||  #y pone letras negras
                    ($_==/text=["]*(white)["]*/i) ||
                    ($_==/text=["]#FFFFFF["]*/i)){
                        $_=~s/\scolor=["]*(white)["]*/black/i;   #para cada caso
                        $_=~s/\scolor=["]*(#FFFFFF)["]*/black/i;
                        $_=~s/text=["]*(white)["]*/black/i; #color cadena o hex
                        $_=~s/text=["]#FFFFFF["]*/black/i;  #para text= o color=
                        next;
                 }
                 next;
       }
        if (($fondo!="white")||($fondo!="#FFFFFF")){#tercero:analiza otros casos
                if (($_==/\scolor=["]*(.*)["]*/$2/i) ||     #pone letras blancas
                    ($_==/text=["]*(.*)["]*/$2/i)){#asigna color encontrado a $2
                    if ($fondo==$2){        #si color fondo == color encontrado
                        $_=~s/\scolor=["]*(#FFFFFF)["]*/white/i; #cambia letras
                        $_=~s/text=["]*(white)["]*/white/i;      #a blanco
                        next;
                    }
                 next;
                }
         next;
        }
        print OUT "$_\n"; #agrega la fila al archivo de salida
}
close(FHANDLE); #cierra los archivos
close(OUT);

por su atención, gracias
y muchos saludos!! :)
nopi:)
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2005-06-28 01:42 @112

Publicidad

Notapor eiial » 2005-07-06 13:49 @618

Yo lo haria distino:

Código: Seleccionar todo
my $archivo = chop(<STDIN>);

open(LECTURA,$archivo) or die $!;
read(LECTURA,$_,-s $archivo); # cargamos todo el archivo
close(LECTURA);

# cargamos todo el archivo, ahora analizamos suponiendo que es con palabra o que es hexadecimal, no rgb

if (/<body[^>]*bgcolor\s*=\s*(?:"\s*([^"]*)\s*"|'\s*([^']*)\s*'|\s*([^ >]*))/ims) { # buscamos la etiqueta body y el color de fondo

my $busqueda = $1=~/white|#ffffff/i?'white|#ffffff':'black|#000000';  # complementamos las opciones

my %opuesto =('white'=>'black','black'=>'white','#ffffff'=>'#000000','#000000'=>'#ffffff'); # establecemos los opuestos

if (s/(text:|color\s*=\s*["']?|color:)\s*(${busqueda})/$1.$opuesto{lc($2)}/geims) { # buscamos las opciones y reemplazamos por opuesto

open(ESCRITURA,'>',$archivo.'.spam') or die $!;
print ESCRITURA;
close(ESCRITURA);

} else {
  print 'No hay colores "transparentes"';
}

} else {
     print 'No existe color de fondo'; # el color predeterminado varia según la configuracion del navegador
}


más o menos deberia funcionar

Saludos
eiial
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2003-11-21 00:51 @077

Notapor eiial » 2005-07-06 13:52 @619

faa q bala no checkee que fuera negro en busqueda, pero bue' mas o menos esa es la idea
eiial
Perlero nuevo
Perlero nuevo
 
Mensajes: 19
Registrado: 2003-11-21 00:51 @077

Re: Necesito que me corrijan por favor

Notapor explorer » 2005-07-24 20:20 @889

Hay otro problema más "gordo". El script no te vale si la definición de los colores está en otra parte, por ejemplo en una hoja de estilos css.

Actualización: Tampoco funcionará si los colores están definidos como "palabras":
<font color="red">
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados