BashBlog: Un script en Bash para crear blogs

En 2020 leí un artículo de [Victorhck](https://victorhckinthefreeworld.com/2020/03/20/crea-blog-web-script-bash/) donde mostraba el uso de una herramienta para crear blogs utilizando un script en Bash, y desde ese entonces siempre me pareció interesante. Durante ese tiempo me daba vueltas en mi mente la idea de abrir un blog personal donde pudiera escribir y guardar simplemente mis notas o bitácoras de herramientas que voy descubriendo y aprendiendo a utilizar en Linux. Hasta este año, por fin me animé a dar el paso y crear este blog para que de alguna manera, ir organizando en este espacio todas esas lluvias de notas que he ido escribiendo, y se me ocurrió comenzar publicando mis notas sobre esta misma herramienta que me permitió abrir mi blog. 

---

## Instalación

Clona el repositorio:

```bash
git clone https://github.com/cfenollosa/bashblog.git
cd bashblog
```

Otorga permisos de ejecución y cópialo para tenerlo disponible en todo el sistema:

```bash
chmod 755 bb.sh
sudo cp bb.sh /usr/local/bin
```

> Si tienes en mente escribir todas tus publicaciones en Markdown, debes instalar un programa que convierta Markdown a HTML (por ejemplo: `Markdown.pl`, `markdown`, `smu`).

## Configuración

Puedes modificar directamente las variables de configuración dentro de la función `global_variables()` en el script, o crear un archivo `.config` en el directorio donde vivirán todas las publicaciones de tu blog.

Aquí se listan y explican las variables que puedes configurar:

| Variable | Descripción |
| -------- | ----------- |
| `global_title` | Título del blog. |
| `global_description` | Descripción o subtítulo del blog. |
| `global_url` | URL pública del blog (sin barra al final). |
| `global_author` | Nombre del autor principal del blog. |
| `global_author_url` | URL del perfil, repositorio o sitio web del autor. |
| `global_email` | Correo electrónico del autor. |
| `global_license` | Licencia del contenido del blog. |
| `global_analytics` | ID de Google Analytics (ej. `UA-XXXXX`). |
| `global_analytics_file` | Archivo con código personalizado para otros sistemas de analíticas o para el código Universal de Google Analytics. |
| `global_feedburner` | URL de Feedburner para redirigir el feed RSS. Déjalo vacío para usar el feed local. |
| `global_twitter_username` | Nombre de usuario de Twitter (sin la `@`) para el enlace de compartir y las menciones. |
| `global_twitter_card_image` | URL absoluta de la imagen por defecto para las vistas previas (Twitter Cards) de los enlaces del blog. |
| `global_twitter_cookieless` | Si es `true`, muestra un enlace simple para compartir (sin cookies ni scripts). Si es `false`, carga el widget oficial de Twitter con el contador de tweets. |
| `global_disqus_username` | Nombre de usuario de tu cuenta de Disqus para habilitar los comentarios. |
| `index_file` | Nombre del archivo de la página principal. |
| `number_of_index_articles` | Número de posts que se mostrarán en la página principal. |
| `archive_index` | Nombre del archivo que lista todos los posts. |
| `tags_index` | Nombre del archivo que lista todas las etiquetas (tags). |
| `non_blogpost_files` | Array de archivos HTML que BashBlog ignorará al generar la página principal y los feeds. Orientado a páginas estáticas que no son posts (ej. (`about.html` `contact.html`)). |
| `blog_feed` | Nombre del archivo del feed RSS. |
| `number_of_feed_articles` | Número de posts que se incluirán en el feed RSS. |
| `cut_do` | Si es `cut`, se mostrará el contenido del post solo hasta la primera línea horizontal en la página principal y en el feed RSS. Si se deja vacío (`""`), se muestra el post completo. |
| `cut_tags` | Si es `yes` y la opción anterior es `cut`, oculta las etiquetas del post en la página principal. Si es `no`, las etiquetas seguirán visibles aunque el texto esté cortado. |
| `cut_line` | Expresión regular que indica la línea HTML donde se debe cortar el post. |
| `save_markdown` | Si es `yes`, guarda el archivo Markdown (`.md`) original junto al archivo HTML (`.html`) generado. Si se deja vacío (`""`), se descarta el `.md` y solo se conserva el `.html`. |
| `prefix_tags` | Prefijo de los archivos HTML generados para cada etiqueta (tag). |
| `header_file` | Ruta a un archivo HTML con una cabecera `<head>` personalizada. Déjalo vacío para que BashBlog la genere automáticamente. |
| `footer_file` | Ruta a un archivo HTML con un pie de página (footer) personalizado. Déjalo vacío para que BashBlog lo genere automáticamente. |
| `body_begin_file` | Archivo HTML cuyo contenido se incrustará justo después de abrir la etiqueta `<body>`. |
| `body_end_file` | Archivo HTML cuyo contenido se incrustará justo antes de cerrar la etiqueta `</body>`. |
| `body_begin_file_index` | Similar a `body_begin_file`, pero su contenido solo se incrusta en la página principal (`index.html`). |
| `css_include` | Array de archivos CSS que se enlazarán en todas las páginas (ej. (`main.css` `blog.css`)). Si se deja vacío, BashBlog generará uno por defecto. |
| `html_exclude` | Array de archivos HTML que se excluirán de la página principal, del feed RSS y de los conteos de etiquetas. Útil para posts antiguos u obsoletos que no quieres que aparezcan en la portada. |
| `template_comments` | Texto que aparece junto al enlace de Twitter (ej. `¿Comentarios?`). |
| `template_read_more` | Texto del enlace `Leer más...` que aparece cuando un post se corta en la página principal o en las páginas de etiquetas. |
| `template_archive` | Texto del enlace para ir a la página de todos los posts al final de la página principal. |
| `template_archive_title` | Título de la página que lista todos los posts. |
| `template_tags_title` | Título de la página que lista todas las etiquetas. |
| `template_tags_posts` | Palabra en plural para referirse a los posts (ej. `artículos` o `posts`). |
| `template_tags_posts_2_4` | Palabra en plural especial para lenguas eslavas (usada cuando hay entre 2 y 4 posts). |
| `template_tags_posts_singular` | Palabra en singular para referirse a los posts (ej. `artículo` o `post`). |
| `template_tag_title` | Texto para el `<title>` de las páginas de una etiqueta específica (ej. `Artículos etiquetados con`). |
| `template_tags_line_header` | Texto que precede a la lista de etiquetas en un post (ej. `Etiquetas:`). |
| `template_archive_index_page` | Texto del enlace para volver a la página principal desde las páginas de todos los posts y etiquetas. |
| `template_subscribe` | Texto del enlace visible para suscribirse al feed RSS al final de la página principal. |
| `template_subscribe_browser_button` | Texto interno (atributo `title`) que utilizan los navegadores o lectores de RSS para identificar el feed al detectarlo automáticamente. |
| `template_twitter_button` | Texto visible del enlace para compartir el post en Twitter. |
| `template_twitter_comment` | Texto predeterminado que aparece al compartir un post en Twitter. |
| `date_format` | Formato para mostrar la fecha de publicación de los posts en las páginas. |
| `date_locale` | Configuración regional (locale) para traducir los nombres de meses y días en las fechas (ej. `es_MX.UTF-8`). |
| `preview_url` | URL para previsualizar el post mientras se edita. Por defecto utiliza el valor de `global_url`. Útil si escribes posts en local antes de subirlos al servidor. |
| `markdown_bin` | Ruta al ejecutable del programa que convierte Markdown a HTML (ej. `markdown` o `Markdown.pl`). Déjalo vacío para que el script lo detecte automáticamente. |

## Uso

Mostrar un mensaje de ayuda con los comandos disponibles:

```bash
bb.sh
```

Comenzar a crear una publicación en Markdown (por defecto) o en HTML si no se encuentra un convertidor:

```bash
bb.sh post
```

Comenzar a crear una publicación en HTML:

```bash
bb.sh post -html
```

> Al comenzar la creación de una publicación, se abrirá el editor de textos configurado en la variable de entorno `$EDITOR`, que será el espacio donde comenzarás a escribir.
>
> El primer párrafo de una publicación se tomará como título (también se utilizará como nombre del archivo separado por guiones), y el último párrafo se utilizará para definir las etiquetas o categorías a las que pertenecerá (separadas por comas).
>
> Al guardar y salir del editor de textos, se te preguntará qué acción realizar, ya sea publicar, editar o guardar como borrador:
> `[P]ost this entry, [E]dit again, [D]raft for later? (p/E/d)`
>
> Cada vez que realices una publicación, el script generará un respaldo del blog en un archivo `.backup.tar.gz` y un respaldo diario llamado `.yesterday.tar.gz`.

Editar una publicación que se guardó como borrador (opción `[D]raft`):

```bash
bb.sh post drafts/archivo.md
```

Editar una publicación ya publicada (mantiene el mismo nombre de archivo):

```bash
bb.sh edit archivo.md
```

Editar una publicación ya publicada y cambiar el nombre del archivo si se modifica el título:

```bash
bb.sh edit -n archivo.md
```

Editar el HTML completo de una publicación ya publicada (mantiene el mismo nombre de archivo):

```bash
bb.sh edit -f archivo.md
```

> Los archivos de las publicaciones NUNCA se deben editar directamente.

Eliminar una publicación y reconstruir el blog:

```bash
bb.sh delete archivo.md
```

Reconstruir todas las páginas y publicaciones del blog manteniendo su contenido:

```bash
bb.sh rebuild
```

> La acción de reconstruir es útil cuando modificas la configuración o los estilos CSS de tu blog.

Eliminar todos los archivos asociados al blog:

```bash
bb.sh reset
```

> Para confirmar la acción, debes escribir `Yes, I am!`. Y antes de eliminar todo, el script generará un respaldo del blog.

Listar todas las publicaciones:

```bash
bb.sh list
```

Listar todas las etiquetas en orden alfabético:

```bash
bb.sh tags
```

Listar todas las etiquetas ordenadas por número de publicaciones:

```bash
bb.sh tags -n
```

## Conclusión

Si eres un fanático de la terminal, BashBlog es una herramienta simple y rápida para comenzar a crear tu blog. Aunque carece de un sistema de organización por carpetas para las publicaciones, te permite adjuntar recursos estáticos como imágenes, videos o archivos en tus publicaciones, organizándolos como los necesites.

## Referencias

* <https://victorhckinthefreeworld.com/2020/03/20/crea-blog-web-script-bash/>
* <https://github.com/cfenollosa/bashblog>

Etiquetas: herramientas
