Estaba escribiendo y me vino a la mente: Puedo automatizar el title y el slug usando live templates? TL;DR; SI!.
Trabajando con Hugo en contenido y mejoras para este blog usando los IDEs de Jebtrains y usando page bundles de Hugo.
Estructura de archivos
Para este ejemplo vamos a utilizar esta estructura de archivos:
📁 contents
📁 posts
📁 2023-01-15-quick-description-of-this-article
index.en.md
Crear el live template
Para abrir el diálogo de live templates: Settings > Editor > Live Templates
Creá un nuevo grupo (opcional) llamado “Hugo”, para ello hay que hacer click en el signo +
arriba a la derecha.
Luego creá el live template haciendo click en icono +
nuevamente.
Se debe definir un nombre (Abbreviation), este nombre va a ser utilizado para cuando quieras llamar
el live template desde el editor.
Definir el contenido del template
Defino los contenidos del template para esta demostración:
---
title: "$TITLE$"
slug: "$SLUG$"
---
Los contenidos de este template se agregan en el text-area “Template text”, después se hace click en “Edit variables”.
En este diálogo vas a encontrar tus dos variables, el próximo paso es definir las expresiones para estas variables.
Variable expressions
Live templates tienen una considerable cantidad de funciones builtin, pero no existe nada como “basepath” or “folder”, tengo que crear mi manera de llegar a ese valor usando regex.
El código para esas variables son:
variable: title
expression:
regularExpression(regularExpression(regularExpression( filePath(), ".*\\d{4}-\\d{2}-\\d{2}-", ""), "\/index.*", ""), "-", " ")
variable: slug
expression:
regularExpression(regularExpression( filePath(), ".*\\d{4}-\\d{2}-\\d{2}-", ""), "\/index.*", ""))
Copiá y pegá la expresión, (Todavía no implementé el botón copiar, disculpas, usa triple-click) y con eso ya está listo. Aplicá los cambios, y en el editor escribí el nombre definido previamente (Abbreviation), deberías obtener el title y el slug instantáneamente.
¿Qué demonios hacen esas llamadas usando regulares?
Gracias por preguntar, title tiene 3 llamados a regex, vamos a desglosarlo:
Primer llamado
El primer llamado usa filePath() para obtener el path absoluto, y remueve todo lo que está antes de la fecha y la fecha.
regularExpression( filePath(), ".*\\d{4}-\\d{2}-\\d{2}-", "")
\d
busca números,{4}
y{2}
definen la cantidad de números esperados.- Las barras adicionales
\\
están para escapar la primera barra. .*
esto busca todo lo que está antes de la fecha.
Usando la carpeta de ejemplo, el input sería:
[...]/contents/posts/2023-01-15-quick-description-of-this-article/index.en.md
Y el output sería:
quick-description-of-this-article/index.en.md
Segundo llamado
El segundo llamado usa el valor que retorna la primera, y remueve /index
regularExpression( prevCallInput , "\/index.*", "")
Tercer llamado
Y el tercer llamado, reemplaza los guiones por espacios.
regularExpression( "-", " ")
Palabras finales
Espero que esto haga tu experiencia más sencilla con Hugo, haciendo uso de esta herramienta poderosa que provee Intellij. Muchas personas salen corriendo al ver las expresiones regulares, pero no es tan difícil, vos podes.
Gracias por leer!
Namaste.