jueves, 2 de enero de 2014

Diccionario de la RAE en tu línea de comandos

Comienzo el nuevo año bloguero presentando un script para Bash que llevo usando más de un año y espero que, con los remiendos y mejoras introducidas durante este tiempo de uso cotidiano, esté listo para ser compartido con todo aquel usuario de Linux interesado. Se trata de una sencilla interfaz de línea de comandos (p. ej. drae palabra) para buscar cómodamente desde la terminal cualquier palabra en el diccionario de la lengua española de la RAE. Como en otros scripts de "raspado de datos web" o web scraping, se trata de usar un navegador web no interactivo en modo texto (en este caso Lynx) o un cliente HTTP de consola (como Wget o cURL) para simular una búsqueda en la aplicación web, obtener el documento con los resultados y filtrarlos y formatearlos convenientemente para presentarlos en la terminal, en este caso usando filtros habituales como grep y cut y el potente editor de flujos de texto sed. Una de las mejoras introducidas tiene que ver con seguir hipervínculos cuando la página de resultados no muestra directamente las acepciones de la palabra buscada y otra es la paginación por la lista de acepciones cuando se excede el número de líneas de la terminal. El código queda (de momento ;) así:

#!/bin/bash

## drae - Consulta palabra usando el diccionario de la RAE online ##
##        v0.3 por Rodia (daltonico.net) 2013                     ##

raeserver="http://lema.rae.es"
ua="-useragent='Mozilla/4.0'"

browser=$(which lynx)
if [ -z "$browser" ]; then
   echo "$(basename $0): error: falta 'lynx' y no se puede seguir"
   exit 1
fi

case $# in
     1) palabra=$1
        query=$(echo $palabra| iconv -f UTF-8 -t LATIN1);;
     *) echo "Uso: $(basename $0) PALABRA"
        exit 1;;
esac

$browser "$ua" -dump "$raeserver/drae/srv/search?val=$query" \
         > /tmp/drae.tmp 2> /dev/null

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

# Puede que haya un enlace a seguir hasta la definición
n_enlace=$(egrep " +\* \[[1-9]\]$palabra[^a-z]" /tmp/drae.tmp | \
           grep -o '\[[1-9]\]' | tr -d '[]')
if [ -n "$n_enlace" ]; then
    enlace=$(egrep " +$n_enlace\." /tmp/drae.tmp|awk '{print $2}')
    $browser "$ua" -dump "$enlace" > /tmp/drae.tmp 2> /dev/null
fi

# Extraemos acepciones limpiando líneas no deseadas
lista_acepciones=$(cat /tmp/drae.tmp | sed '{
                            /□ V./,$d
                            /¶$/,$d
                            /Ver art/d
                            /Real Academia/d
                            /___/d
                            /References/d
                            /http/d
                            s/\[[1-9][0-9]*\]//
}' | sed "/  *$palabra\./d" | cut -b 3-)

if [ -z "$lista_acepciones" ]; then
   exit 1
fi

echo -e "\n$lista_acepciones\n" | cat -s | less -e -F -X

exit 0