Hugo Y Gopher Con Drone
=======================
19 de Diciembre, 2020
En mi post anterior expliqué como montar un blog que se publica
automáticamente usando Hugo, git, y Drone CI.
Ahora voy a explicar como hacer que ese blog también se publique en
gopher.
Cuando (re)descubrí gopher gracias al tildeverse, decidí intentar
usarlo. Pero como no tengo ganas de escribir contenido 2 veces, o
de tener que inventarme algo exclusivamente para poner ahí (ya
tengo suficiente con 4 blogs...), me puse a buscar alguna forma de
convertir mis posts de Hugo en formato gopher, lo cual no debería
ser muy difícil ya que son archivos de texto comunes.
Así fue como encontré el blog de JFM[1] quien describe una manera
simple y efectiva de lograr este propósito. Naturalmente tuve que
hacerle algunos ajustes para mejor integración con mi manera de
usar todo esto.
Parte Uno
---------
Editamos nuestro `config.toml` y agregamos las siguientes lineas
```
[outputs]
section = ["HTML", "gopher"]
page = ["HTML", "gopher"]
[outputFormats.gopher]
mediaType = "text/plain"
path = "/~r00t/phlog"
baseName = "gophermap"
protocol = "gopher://"
isPlainText = true
[outputFormats.HTML]
noUgly = true
```
Lo que pongamos en `outputs`[2] va variar según nos convenga,
claramente, pero esta es la configuración mínima para tener un
listado de artículos y los artículos propiamente dichos.
Lo principal del asunto se encuentra en `[outputFormats.gopher]`.
Según la documentación de Hugo[3], especificamos el tipo de
protocolo y el formato de los archivos. La opción `path` no suele
ser necesaria, pero yo quería que mi phlog (así se llaman los blogs
de gopher) existiera en un subdirectorio así que tuve que agregarla
para poder usarla luego durante la generación automática.
Puse estos agregados al final de mi archivo de configuración, y
cerca del principio agregue `uglyURLs = true`. Esta opción,
combinada con `[outputFormats.HTML]` hace que los permalinks a los
archivos de texto para gopher sean directos, mientras que preserva
los permalinks bonitos para la web.
Parte Dos
---------
Ahora tenemos que crear las plantillas para nuestro contenido. En
la carpeta `layouts/_default` crearemos `list.gopher.txt` para
nuestro gophermap y `single.gopher.txt` para los artículos
individuales.
layouts/_default/list.gopher.txt
```
1Volver /usuario
{{ range .Pages.ByPublishDate.Reverse }}
0{{ .Date.Format "2006-01-02" }} {{ .Title }} {{ with .OutputFormats.Get "gopher" -}} {{ .RelPermalink }}{{ end -}}
{{ end }}
```
layouts/_default/single.gopher.txt
```
{{ .Title }}
{{ .Date.Format "2006-01-02" }}
{{ .RawContent }}
```
Pero, si creamos nuestros artículos con sumarios manuales, hay que
reemplazar `{{ .RawContent }}` con lo siguiente:
```
{{ $content := .RawContent -}}
{{ $content := $content | replaceRE "(?s:<!--more-->)" "" -}}
{{ $content }}
```
Y de esta manera el `<!--more-->` no aparecerá en nuestros posts de
gopher.
Parte Tres
----------
Ahora incorporamos todo esto a nuestro pipeline de Drone. Siguiendo
con el ejemplo del post anterior agregamos estos comandos a nuestro
`.drone.yml`:
```
---
(resto del archivo)
steps:
- name: deploy
commands:
(comandos anteriores)
- cp -Rf /home/r00t/public_html/articulos/~r00t/phlog.txt
/home/r00t/public_gopher/phlog/gophermap
- cp -Rf /home/r00t/public_html/~r00t/phlog/articulos/*.txt
/home/r00t/public_gopher/phlog/articulos
- rm -r public
```
Las rutas usadas para el copiado de los archivos son bastante
engorrosas, pero luego de pruebas y errores he logrado mi cometido
de tener un gophermap "principal" bajo el directorio
`public_gopher` y luego el phlog en un subdirectorio.
[1]
https://jfm.carcosa.net/blog/computing/hugo-gopher/
[2]
https://gohugo.io/templates/output-formats#output-formats-for-pages
[3]
https://gohugo.io/templates/output-formats#configure-output-formats