Buscar desde Emacs un término en Logeion (y mostrar los resultados en Org Mode)
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:
- Desde Emacs se hace búsqueda en Logeion,
- Emacs llama a Selenium,
- Selenium hace la búsqueda «descabezada» (headless) y descarga la página con los resultados de Logeion en un directorio temporal,
- Pandoc convierte la página (
HTML
) a Org, - 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:
∞
Publicado: 11/10/2019
Última actualización: 16/08/23
Esta obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial 4.0 Internacional.