Cuaderno de GNUtas

Buscar desde Emacs un término en Logeion (y mostrar los resultados en Org Mode)

Liddell_Scott.jpg

El sitio web Logeion, auspiciado por la Universidad de Chicago, ofrece una serie de recursos importantes para estudiosos de las lenguas clásicas, tales como las búsquedas interactivas en las versiones digitalizadas de los venerables diccionarios Liddell-Scott (griego antiguo) o Lewis & Short (latín). Una búsqueda concreta de una palabra devuelve por norma gran cantidad de jugosos datos muy bien ordenados, no sólo en lo que hace al léxico, sino también a referencias, loci similes, etc. Una web, en suma, muy interesante y práctica, pero comparte el problema de otros lugares internetiles relacionados con las Humanidades: buenos recursos, mas una forma horrible, incómoda, inflada de presentarlos. Logeion es una página sobrecargada de colesterol y esteroides, y es imposible acceder a ella y a su motor de búsqueda desde un navegador en modo texto o desde el eww de Emacs. Y si una web no la podemos abrir en un simple navegador de consola (cuando a lo que queremos acceder es a mero contenido textual, no fuegos artificiales, no florituras ni volutas varias), entonces a esa web le sobra pero mucho peso.

En las antípodas de la rolliza y fofa Logeion se encuentra la web (pionera en estas cosas y ejemplar en su respeto hacia el usuario) que alberga el proyecto Perseus Hopper. Ya hablé aquí en estas GNUtas de una sencilla función que escribí para buscar un término griego (de un texto, donde tenemos situado el cursor) en el Liddell-Scott de Perseus desde Emacs. Los resultados se devuelven rápidamente, además, en el propio navegador emacsiano, el eww-mode. El caso es que con Logeion me gustaría poder hacer lo mismo, pues no tengo por qué verme obligado a salir de Emacs y abrir el pesado firefox para hacer algo que es tecnológicamente posible dentro de Emacs y que, si se me hace imposible, se debe principalmente a los desarrolladores de Logeion y a su pésimo concepto de producto.

Después de mucho buscar y buscar, ya que seguía en mis XIII, encontré al fin una forma de salir del paso, que ni por asomo resulta la más elegante ni la más ágil, pero bueno, es lo que hay. La solución, en principio, estaría en echar mano de una herramienta ajena a Emacs, Selenium, que viene a ser una suerte de «navegador descabezado» o una forma de controlar un navegador (en mi caso Firefox) en segundo plano, sin necesidad de abrirlo en modo gráfico. En algún lugar del proceso también entraría en juego la siempre útil navaja suiza Pandoc. Partiendo de ese presupuesto, ya podría esbozar este mapa de ruta:

  1. Desde Emacs se hace búsqueda en Logeion,
  2. Emacs llama a Selenium,
  3. Selenium hace la búsqueda «descabezada» (headless) y descarga la página con los resultados de Logeion en un directorio temporal,
  4. Pandoc convierte la página (HTML) a Org,
  5. El resultado se me muestra en un búfer temporal.

Lo bueno de poder acceder al resultado en Org es, claro, la confortabilidad de Org Mode, además de poder exportar a otros formatos como LaTeX. Veamos cómo fui poniendo en práctica este itinerario.

Selenium y Python

Para empezar, conviene tener en cuenta que Selenium es un ecosistema vasto y complejo, normalmente empleado por desarrolladores web para poder controlar y auditar sus sitios de forma ágil y «a distancia». Por otra parte, puede manejarse mediante scripts en diversos lenguajes. Yo escogí Python, por una familiaridad que —dicho sea de paso— tampoco es para tirar cohetes. Pero para lo que pretendía me sería suficiente un previo estudio muy a nivel de superficie. Sospecho que no usaré Selenium para cosas más esotéricas.

Por supuesto, es necesario instalar antes una serie de paquetes. Desde los repositorios de Arch (la distro que suelo usar para trabajo) instalé lo siguiente:

  • python-selenium
  • python-xvfbwrapper
  • geckodriver (para que funcione con Firefox)

Y a través del gestor de paquetes de Python (si no lo tenemos instalado, en Arch basta con llamar a un sudo pacman -S python-pi), instalé pyvirtualdisplay de esta forma

sudo pip install pyvirtualdisplay

A continuación, debemos escribir un simple script en Python para que Selenium nos abra la web de Logeion con el término a buscar, y descargue el correspondiente archivo .html. El script que ensayé aquí toma como parámetrola palabra buscada. Para dar tiempo a que Logeion abra y despliegue la página con los resultados de la búsqueda, necesité añadir un pequeño margen de tiempo (time.sleep(2)):

#!/usr/bin/env python
import time
import sys
from pyvirtualdisplay import Display
from selenium import webdriver

display = Display(visible=0, size=(1920, 1080))
display.start()

palabra = "https://logeion.uchicago.edu/%s" % (sys.argv[1])

driver = webdriver.Firefox()
driver.get(palabra)
time.sleep(2)
page = driver.page_source
file_ = open('temp-logeion.html', 'w')
file_.write(page)
file_.close()
driver.quit()
display.stop()

Le damos permisos de ejecución y guardamos el script (por ejemplo selenium-logeion.py) en un lugar accesible. Y ya sólo nos queda escribir una simple función en Elisp para que desde Emacs se haga el resto.

La función en Elisp (con Pandoc de por medio)

Teniendo en cuenta que yo suelo guardar mis scripts en una carpeta ad hoc y no en un bin local, la función quedaría así:

(defun logeion-a-org ()
  (interactive)
  (let
      ((palabra (read-from-minibuffer "Buscar en Logeion: ")))
    (shell-command (concat "~/Scripts/./selenium-logeion.py "
			   (format "%s" palabra)))
    (shell-command "pandoc temp-logeion.html -o temp-logeion.org")
    (shell-command "rm temp-logeion.html")
    (when (get-buffer "*logeion resultado*")
      (kill-buffer "*logeion resultado*"))
    (get-buffer-create "*logeion resultado*")
    (set-buffer "*logeion resultado*")
    (insert-file-contents "temp-logeion.org")
    (shell-command "rm temp-logeion.org")
    (org-mode)
    (temp-buffer-window-show "*logeion resultado*")))

Y un pantallazo final:

logeion.png

logeion2.png

Publicado: 11/10/2019

Última actualización: 11/10/2019


Índice general

Acerca de...

Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.

© Juan Manuel Macías
Creado con esmero en
GNU Emacs