RAE Search, soft [PERL]

Iniciado por leogtz, 6 Abril 2010, 01:59 AM

0 Miembros y 1 Visitante están viendo este tema.

leogtz

Hola, aquí les dejo este pequeño programita que hice para buscar entradas en la Real Academia Española, le puse interfaz gráfica con Gtk2:



Aquí está el código:

Código (perl) [Seleccionar]
#!/usr/bin/perl
use warnings;
use strict;
use LWP::Simple;
use Gtk2 '-init';
use constant TRUE => 1;
use constant FALSE => 0;

binmode STDOUT, ":encoding(UTF-8)";

sub raeSearch()
{
       my $rae = get("http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=$_[0]");
my $resultado;
       while ($rae =~ m/name="[\d_]+"> (.*?) <\/p/smgix)
       {
               my $desc = $1;
               # Quitar las marcas HTML
               $desc =~ s/<.*?>//gsm;
               # Quitar los espacios a los lados
               $desc =~ s/^\s+//sm;
               $desc =~ s/\s+$//sm;
               # Quitar espacios excesivos
               $desc =~ s/\s+/ /gsm;
$resultado .= "$desc\n";
       }
return $resultado;
}

# Propiedades de ventana:
my $window = Gtk2::Window->new();
$window->set_title("Rae Search");
$window->set_border_width(3);
$window->signal_connect(destroy => sub{Gtk2->main_quit});
$window->set_auto_startup_notification(TRUE);
$window->set_decorated(TRUE);
$window->set_default_icon_from_file("camel.ico");
$window->move(0, 0);
$window->resize(700, 100);
$window->set_resizable(TRUE);

# Frame:
my $frame = Gtk2::Frame->new("Entrada");

# VBox:
my $vbox = Gtk2::VBox->new(FALSE, 10);
$vbox->pack_start($frame, TRUE, TRUE, 0);

# HBox:
my $hbox = Gtk2::HBox->new(FALSE, 6);

# Entry:
my $dir_entry = Gtk2::Entry->new_with_max_length(30);
$dir_entry->set_text("encono");
$dir_entry->set_activates_default(FALSE);
$dir_entry->set_position(100);

# Button:
my $button = Gtk2::Button->new("_Buscar");
$button->set_focus_on_click(TRUE);
my $rae;

# TextView  :
my $textview = Gtk2::TextView->new();
$textview->set_border_window_size('top', 1);
my $buffer = $textview->get_buffer;

$button->signal_connect(clicked => sub
{
$buffer->set_text(&raeSearch($dir_entry->get_text));
}
);

# Scroll Window :

my $scroll = Gtk2::ScrolledWindow->new();
$scroll->set_policy('automatic', 'automatic');
$scroll->set_shadow_type('out');
$scroll->add($textview);
$vbox->pack_end($scroll, TRUE, TRUE, 0);
$frame->add($hbox);
$hbox->pack_start($dir_entry, FALSE, FALSE, 0);
$hbox->pack_start($button, FALSE, FALSE, 0);
$window->add($vbox);
$window->show_all;
Gtk2->main;


Agradezco a explorer de perlenespanol.com por la ayuda brindada.

El programa es sencillo, pero me sirvió mucho, aprendí bastantes cosas con este proyectito.

El código necesita este icono para funcionar:
http://icone.goldenweb.it/download_file/d2/animals/c/jenanimals/file/camel/ext/.ico/default.html

O sino quieren  descargar el icono, solo quiten esta línea:
Código (perl) [Seleccionar]
$window->set_default_icon_from_file("camel.ico");

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

xassiz_

Lo portaste a Perl ;D ;D

Esta bueno, nunca viera una interfaz gráfica así con Perl ;-)



YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE

leogtz

Gracias, lo he actualizado ya, quedó algo así:


También le agregué un botón para copiar todo al portapapeles.



Y por supuesto la licencia GPL:


El código queda así:

Código (perl) [Seleccionar]
#!/usr/bin/perl
use warnings;
use strict;
use LWP::Simple;
use Gtk2 '-init';
use constant TRUE => 1;
use constant FALSE => 0;
use utf8;

binmode STDOUT, ":encoding(UTF-8)";

sub raeSearch()
{
        my $rae = get("http://buscon.rae.es/draeI/SrvltGUIBusUsual?LEMA=$_[0]");
my $resultado;
        while ($rae =~ m/name="[\d_]+"> (.*?) <\/p/smgix)
        {
                my $desc = $1;
                # Quitar las marcas HTML
                $desc =~ s/<.*?>//gsm;
                # Quitar los espacios a los lados
                $desc =~ s/^\s+//sm;
                $desc =~ s/\s+$//sm;
                # Quitar espacios excesivos
                $desc =~ s/\s+/ /gsm;
$resultado .= "$desc\n";
        }
# Saber si $resultado está vacio:
if(!defined($resultado))
{
return "La palabra \"$_[0]\" no se encuentra en el diccionario. RAE\n";
} else {
return $resultado;
}
}

sub hide_on_delete
{
my ($widget) = @_;
$widget->hide;
return 1;
}

# Propiedades de ventana:
my $window = Gtk2::Window->new();
$window->set_title("RAE Search");
$window->set_border_width(3);
$window->signal_connect(destroy => sub{Gtk2->main_quit});
$window->set_auto_startup_notification(TRUE);
$window->set_decorated(TRUE);
$window->set_default_icon_from_file("camel.ico");
$window->move(0, 0);
$window->resize(700, 100);
$window->set_resizable(TRUE);

# Frame :

my $frame = Gtk2::Frame->new("Entrada");

# VBox :

my $vbox = Gtk2::VBox->new(FALSE, 10);
$vbox->pack_start($frame, TRUE, TRUE, 0);

# HBox :

my $hbox = Gtk2::HBox->new(FALSE, 6);

# Entry:

my $dir_entry = Gtk2::Entry->new_with_max_length(30);
$dir_entry->set_text("encono");
$dir_entry->set_activates_default(FALSE);
$dir_entry->set_position(100);

# Button :

my $button = Gtk2::Button->new("_Buscar");
$button->set_alignment(2.6, 4.5);
$button->set_focus_on_click(TRUE);

# TextView :

my $textview = Gtk2::TextView->new();
$textview->set_border_window_size('top', 1);
my $buffer = $textview->get_buffer;

# Button (button and clipboard widget) :

my $button_clipboard = Gtk2::Button->new("_Clipboard");
$button_clipboard->set_focus_on_click(TRUE);
my $clipboard = Gtk2::Clipboard->get(Gtk2::Gdk->SELECTION_CLIPBOARD);

$button->signal_connect(clicked => sub
{
$buffer->set_text(&raeSearch($dir_entry->get_text));
}
);

$button_clipboard->signal_connect(clicked => sub
{
$clipboard->set_text(&raeSearch($dir_entry->get_text));
}
);

# Button (Quit) :

my $button_quit = Gtk2::Button->new("_Salir");
$button_quit->set_alignment(3.5, 4.5);
$button_quit->set_focus_on_click(TRUE);
$button_quit->signal_connect(clicked => sub
{
Gtk2->main_quit;
}
);

# AboutDialog :

my $about = Gtk2::AboutDialog->new;
$about->set_comments("Un buscador de palabras en el diccionario de la Real Academia Española");
$about->set_website("leorocko13\@hotmail.com");
$about->set_authors("Leo Gutierrez Ramirez");
$about->set_copyright("(c) Leo Gutiérrez Ramírez");
$about->set_program_name("RAE Search");
$about->set_version("1.0");
$about->set_website_label("leorocko13\@hotmail.com");
open(my $file, q[<], "./licencia.txt") or die("No se pudo abrir el archivo \"licencia.txt\". _$!");
my $license;
while(<$file>)
{
$license .= $_;
}
close($file) or warn("Error cerrando el archivo \"licencia.txt\"");
$about->set_license($license);

# Button (about) :

my $button_about = Gtk2::Button->new("_About ...");
$button_about->set_focus_on_click(TRUE);
$button_about->signal_connect(clicked => sub {
$about->run;
&hide_on_delete($about);
}
);

# Scroll Window :

my $scroll = Gtk2::ScrolledWindow->new();
$scroll->set_policy('automatic', 'automatic');
$scroll->set_shadow_type('out');
$scroll->add($textview);

$vbox->pack_start($scroll, TRUE, TRUE, 0);
$vbox->pack_start($button_clipboard, TRUE, TRUE, 2);
$frame->add($hbox);
$hbox->pack_start($dir_entry, FALSE, FALSE, 0);
$hbox->pack_start($button, FALSE, FALSE, 0);
$hbox->pack_end($button_about, FALSE, FALSE, 0);
$hbox->pack_end($button_quit, FALSE, FALSE, 0);
$window->add($vbox);
$window->show_all;
Gtk2->main;



Con perl se pueden hacer muchísimas cosas, en cpan hay más de 8000 módulos que te permiten hacer lo que quieras, está gtk, gtk2, tk, Qt, etc, etc.

Por cierto, he visto que en los repositorios hay un software llamada lemurae, hecho en python, parecido al que yo hice, ¿alguno sabe como poner un programita simple como este en los repositorios?
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com