martes, 31 de enero de 2012

Diccionario de Inglés en la consola de Linux

Mientras la situación económica y social se deteriora en este comienzo de año, he vuelto a retomar la programación de shell scripts. No es que me sienta alegre y despreocupado; soy plenamente consciente de la frivolidad que puede suponer casi cualquier forma de ocio hoy día, pero como los sudoku me aburren tengo que buscarme alternativas para mis ratos libres ante el PC con Linux. Además, ¿no dicen que los músicos del Titanic siguieron tocando como si nada?

La penúltima idea surgió hace unos días mientras usaba Google Translate. Me fijé en el URL del enlace titulado Turn off instant translation que aparece en la parte inferior izquierda de dicha web y se me encendió la bombilla: ¿por qué no usar un navegador en modo texto para llevar a la consola parte de la potencia de dicho servicio web? Después de trastear un rato con Lynx en modo "volcado a pantalla" (opción -dump) y unos cuantos filtros clásicos de Unix como grep, sed y cut la cosa tomó forma. Acabé añadiendo algunas comprobaciones y mensajes de ayuda/error para que sea utilizable por cualquiera y en poco tiempo tenía lista la primera versión de gtr, de momento limitada a traducir palabras del Inglés al Español y viceversa (usando la opción -r de "reverse") de forma rápida (gracias a la velocidad de los servidores del dios Google) y cómoda sin abandonar la línea de comandos.

Más abajo pego el código, que no habrá más que copiar y pegar a un editor de texto como gedit, guardar con el nombre "gtr" en un directorio de programas como /usr/local/bin y darle permisos de ejecución (también puedes descargar el script comprimido con gzip aquí). Listos para traducir "palabros raros" ;-)

#!/bin/bash

## gtr - Traduce palabras usando Google Translate
## v0.1 por Rodia (daltonico.net) 2012

gtserver="http://translate.google.com"

browser=$(which lynx)
if [ -z "$browser" ]; then
echo "$(basename $0): error: falta el navegador 'lynx'"
exit 1
fi

case $# in
1) query=$1;sl="en";tl="es";;
2) if [ "$1" == "-r" ]; then
sl="es"
tl="en"
query=$2
else
echo "Uso: $(basename $0) [-r] palabra"
exit 1
fi;;
*) echo "Uso: $(basename $0) [-r] palabra"
exit 1;;
esac

$browser -dump -nolist "$gtserver/?hl=en&eotf=0&sl=$sl&tl=$tl&q=$query"\
> /tmp/gtr.tmp 2> /dev/null

if [ "$?" -ne "0" ]; then
echo "$(basename $0): error: no se pudo conectar a $gtserver"
exit 1
fi

entrada_unica=$(grep -A1 'Alpha' /tmp/gtr.tmp | sed -n 2p | cut -b 4-)
mas_entradas=$(sed -n '/1\./,/^$/p' /tmp/gtr.tmp | cut -b 4-)

if [ -z "$mas_entradas" ]; then
if [ -z "$entrada_unica" ] || [ "$entrada_unica" == "$query" ]; then
exit 0
else
mas_entradas=" $entrada_unica"
fi
fi

echo -e "\n$mas_entradas\n"

exit 0