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