De Sinatra a Jekyll
Llevo la mayor parte del año acumulando notas de mi día a día en archivos markdown gestionados por un repositorio git. Configuré una aplicación de Sinatra para generar un blog rudimentario con la habilidad de buscar archivos y mostrar una versión HTML de cada documento con RedCarpet y Webrick. Estaba inventando el hilo negro. Jekyll ya tiene todas estas funciones por defecto, así que me propuse consolidar todo ese conjunto de carpetas y scripts en un sólo proyecto Jekyll.
La estructura del repositorio antes de Jekyll:
$ tree ~/Documents/Notas2024/ -I stage/
.
├── 404.md
├── Gemfile
├── Gemfile.lock
├── README.md
├── app.rb
├── bin
│ ├── new
│ ├── preview
│ ├── run
│ └── spell
├── enero
│ ├── 2024\ Notas.txt
│ ├── Galette\ des\ rois.txt
│ ├── Gatos.txt
│ ├── Jueves\ 25\ enero.txt
│ ├── La\ chica\ del\ cumpleaños.txt
│ ├── Lunes\ 22\ ene.txt
│ ├── Martes\ 23\ enero.txt
│ └── Sunday\ January\ 21.txt
├── febrero
│ ├── Breaking\ in\ Brooklyn.txt
│ ├── Carnegie\ Council.txt
│ ├── Domingo\ 4\ febrero.txt
│ ├── Jueves\ 8\ febrero.txt
│ ├── Jueves\ febrero\ 1.txt
│ ├── Lunes\ 12\ febrero.txt
│ ├── Lunes\ 19\ febrero.txt
│ ├── Martes\ 13\ febrero.txt
│ ├── Martes\ 6\ febrero.txt
│ ├── Miércoles\ 14\ febrero.txt
│ ├── Miércoles\ 28\ febrero.txt
│ ├── Miércoles\ 7\ febrero.txt
│ ├── Sábado\ 10\ febrero.txt
│ ├── Sábado\ 17\ febrero.txt
│ ├── Sábado\ 24\ febrero.txt
│ ├── Sábado\ 3\ febrero.pages
│ ├── Sábado\ 3\ febrero.txt
│ ├── Viernes\ 16\ febrero.txt
│ ├── Viernes\ 2\ febrero.txt
│ └── Viernes\ 9\ febrero.txt
├── index.html
├── index.md
├── marzo
│ ├── 03-domingo.md
│ ├── 04-lunes.md
│ ├── Jueves\ 14\ marzo.txt
│ ├── Lunes\ 11\ marzo.txt
│ ├── Martes\ 12\ marzo.txt
│ ├── Martes\ 12\ resumen\ .txt
│ ├── Martes\ 5\ marzo.txt
│ ├── Miércoles\ 13\ marzo.txt
│ ├── Miércoles\ 6\ marzo.txt
│ ├── Sábado\ 2\ marzo\ FINAL.txt
│ ├── Viernes\ 1\ marzo.txt
│ ├── Viernes\ 22\ marzo.txt
│ ├── Viernes\ 8.txt
│ └── marzo.md
├── misc
│ ├── Bisiesto.md
│ ├── Clara.md
│ ├── Clara.md.bak
│ ├── El\ traductor.md
│ ├── Extensión\ .txt
│ ├── Metamorfosis.md
│ ├── Seattle.txt
│ ├── Silencio.md
│ ├── TEST\ FILE.txt
│ ├── Vida_Anne_Moore.md
│ ├── Vida_Anne_Moore.md.bak
│ ├── preview.rb
│ └── spellcheck.rb
├── pdfs
│ ├── Bolaño.pdf
│ ├── Clara.pdf
│ ├── Silencio.pdf
│ ├── Vida_Anne_Moore.pdf
│ └── index.md
├── public
│ ├── css
│ │ ├── epub-style.css
│ │ ├── normalize.css
│ │ ├── skeleton.css
│ │ └── style.css
│ └── images
│ └── Bisiesto.png
├── rails.md
├── recordatorios.md
└── views
├── _form.erb
├── _navbar.erb
├── _results.erb
├── index.erb
├── layout.erb
├── month.erb
├── page.erb
├── search.erb
└── year.erb
14 directories, 106 files
Mi rutina durante este tiempo consistió en el uso de los siguientes comandos:
$ bin/new hoy
Esto genera un archivo con el formato
mayo/29-miércoles.md
.
Para editar y escribir uso una combinación de nano y vim, nano para redactar y vim para editar, en especial si un documento necesita ediciones precisas o repetitivas.
Antes de convertir el archivo en HTML para verlo en un
servidor local ejecuto $ bin/spell [archivo]
:
#!/usr/bin/env ruby
input_filename = ARGV[0] || 'input.md'
system("aspell -c -d es #{input_filename}")
Con bin/preview [archivo]
el documento queda confirmado en
el repositorio con un mensaje de autoguardado y se abre en
el navegador, pero solo funciona con un archivo a la vez.
Para ver todos los documentos, usaba bin/run
para iniciar
la aplicación de Sinatra. En ocasiones usaba
glow para leer los
documentos sin tener que iniciar un servidor, ya que todo el
proceso anterior me resultaba engorroso para cambios
pequeños o para leer un determinado documento. La idea ahora
es enfocarse en el contenido y dejar su procesamiento y
distribución a Jekyll.
Creación de Sitio Jekyll
La guía de inicio de la documentación explica cómo crear un blog. También escribí una guía para publicar un projecto de Jekyll en Github Pages.
$ jekyll new stage
Los primeros archivos que pasé a _posts
fueron los del mes
de mayo, así que renombré los archivos markdown dentro de la
carpeta mayo/
anteponiendo la cadena "2024-05-"
(e.g.,
de mayo/29-miércoles.md
a mayo/2024-05-29-miércoles.md
con el siguiente comando:
$ for file in *.md do mv "$file" "2024-05-$file"; done
Luego moví la carpeta a _posts
y pude ver todos los
archivos con bundle exec jekyll serve
.
Como tuve que repetir este proceso y también debía incluir
el Front Matter
en los documentos existentes, fue más
conveniente hacer un Bash script prepend.sh
dentro de la
carpeta de abril.
#!/bin/bash
for file in *.md; do
echo "---" > temp
echo "layout: post" >> temp
echo "---" >> temp
echo "" >> temp
cat "$file" >> temp
mv temp "$file"
mv "$file" "2024-04-$file"
done
Para ejecutar el script: $ chmod +x prepend.sh
y
después $ ./prepend.sh
.
Cambio de tema
Para el tipo de contenido que pienso alojar en este sitio,
decidí instalar el tema
Persephone
en el Gemfile
con bundle install
.
Scripts de gestión de contenido
Nuevo Post
./new_post
:
#!/usr/bin/env ruby
print "Título: "
title = gets.chomp
slug = title.downcase.strip.gsub(' ', '-').gsub(/[^\w-]/, '')
date = Time.now.strftime("%Y-%m-%d")
filename = "_posts/#{date}-#{slug}.md"
content = <<~HEREDOC
---
title: #{title}
date: #{date}
layout: post
published: false
---
HEREDOC
File.write(filename, content)
puts "Post created: #{filename}"
Chequeo de ortografía
./spell [archivo]
:
#!/usr/bin/env ruby
filename = ARGV[0]
system("aspell -c -d es #{filename}")
Previsualización de archivos
pvw
es un alias en mi ~/.zshrc
:
alias pvw='bundle exec jekyll serve'
y después: source ~/.zshrc
.
Nota sobre PATH
Para poder usar los scripts desde cualquier directorio se
necesita copiar (o mover) el script al directorio ~/bin
:
cp spell ~/bin
Directorio ~/bin
Este directorio contiene los archivos binarios del sistema,
personalizados al usuario actual. También existe /bin
y
/usr/bin
, el primero contiene los programas necesarios
durante el proceso de arranque y están disponibles para
todos los usuarios, y el último los que no son críticos.
$ mkdir ~/bin
$ echo 'export PATH="$HOME/bin:$PATH"' >> ~/.zshrc
$ source ~/.zshrc
Al agregar ~/bin
a la variable PATH
, mi terminal zsh
sabrá que allí puede encontrar los scripts.