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