Memorias de un Técnico Ligero

Ver más publicaciones del año 2025

Sigo scripteando a lo loco con el publicador de sitios estánticos Pelican para automatizar lo que escribo

Los generadores de sitios estáticos son muy lindos y todo eso, pero qué pasa, cuando tenés que generar las publicaciones, estructurarlas y demás, a la larga se me hace pesado copiar y pegar, prefiero un script que me automatice algunas cosas.

Como vengo publicando en una cápsula gemini autoalojada y también en texto-plano, y en otros servidores tildes también, me hice un script publicador que también quise trasladar acá, pero con algunas modificaciones, ya que acá hay imágenes y claro, los benditos títulos que tanto molestan, title, slug, autor, etiquetas y esas mierdecillas. Además yo tengo las publicaciones separadas por directorios anuales y por números (sí, si el directorio está vacío arranca por el 01 y cagaste, hay que hacer el primero correlativo a manopla).

En definitiva, si publicás con Pelican, la mano viene más o menos así:

  • El script primero busca en content/posts/año actual
  • Al ultmo archivo 95-publicacion.md le saca todo y deja el número más grande. Después le suma 1.
  • Después de preguntarte todo lo que desea, si tenés una foto en content/images (que es lo que pide Pelican para publicar), te la reduce a 600x400. Más o menos te va a quedar bien, acá hacemos todo a ojo. Si no tenés foto apretás enter y no escribe nada.
  • Después, si arrancaste como un técnico que se respeta desde la terminal, te genera el archivo y te abre Neovim, aplicación que se usa en la base de la resitencia antiobsolescente de los téncicos ligeros.

He aquí el código:

from PIL import Image
from datetime import datetime
import os
import subprocess

anio = datetime.now().year

print("🚀 El mega publicador de sitios estáticos. :P")
print("🖼 Para insertar una foto:")
print("<img src='' alt='foto' class='img-fluid text-center'>")
print("=======================================================")

# Ruta al directorio de publicaciones
ruta = os.path.join(os.getcwd(), "content", "posts", str(anio))
print("📂 Ruta actual: " + ruta)

# Buscar el número más alto de publicación y sumar 1
ultimo_nro = 0
for _, _, archivos in os.walk(ruta):
    for archivo in archivos:
        if archivo.endswith(".md"):
            numero = archivo[0:2]
            if numero.isdigit() and int(numero) > int(ultimo_nro):
                ultimo_nro = int(numero)

ultimo_nro += 1
ultimo_nro = f"{ultimo_nro:02}"
print("🆕 Número de la publicación: " + str(ultimo_nro))

# Función para reducir imagen
def reduce_imagen(ruta, fotito):
    path = os.path.join(ruta, fotito)
    img = Image.open(path)
    width, height = img.size
    print(f"📏 Tamaño original: {width}x{height}")
    img.thumbnail((600, 400), Image.LANCZOS)
    img.save(path, "JPEG")
    return fotito

# Ingreso de datos
hoy = str(datetime.today())

titulo = input("📌 Título de la publicación: ")
nombre_corto = input("📎 Nombre corto (slug): ")
categoria = input("📚 Categoría: ")
etiquetas = input("🏷️ Etiquetas (separadas por coma): ")
resumen = input("📝 Resumen breve: ")
foto_interior = input("🖼 Nombre de la foto interior (debe estar en content/images): ")

# Procesar imagen si existe
ruta_foto = os.path.join(os.getcwd(), "content", "images")
if foto_interior != "":
    path_imagen = os.path.join(ruta_foto, foto_interior)
    if os.path.exists(path_imagen):
        reduce_imagen(ruta_foto, foto_interior)
        linea_imagen = f"<img src='/images/{foto_interior}' alt='foto' class='img-fluid text-center'>\n"
    else:
        print("⚠️ No se encontró la imagen. Se omite.")
        linea_imagen = ""
else:
    linea_imagen = ""

# Crear archivo markdown
nombre_archivo_final = f"{ultimo_nro}-{nombre_corto}.md"
ruta_archivo_nuevo = os.path.join(ruta, nombre_archivo_final)

with open(ruta_archivo_nuevo, "w") as archivo:
    archivo.write(f"""Title: {titulo}
Date: {hoy}
Autor: Hi7903b 
Slug: {nombre_corto}
Lang: es
Tags: {etiquetas}
Category: {categoria}
Summary: {resumen}

{linea_imagen}
""")

print("✅ ¡Archivo para publicación creado!")
print("📄 Ruta del nuevo archivo: " + ruta_archivo_nuevo)

# Abrir el archivo en nvim
subprocess.run(["nvim", ruta_archivo_nuevo])

Esta es una escritura como me gusta mí, absolutamente estructurada y con alguna función pero bien rústica. Lo único que me permití como buen talibán del script y de no dejarme llevar por las IA es corregir algunas cosillas de estilo con chatgpt, como los iconos para que sea más ameno. El chabón usa el f""" lo cual le encanta, lo vi en varias correcciones que me hizo y me parece bien, yo soy más animal. Después cambió los path.join (yo usaba la salvajada de unir todo "/"+"ruta"+ y así... Quedó mejor pero mantiene la esencia de lo que escribí, que es lo que quiero.

Si te sirve lo podés modificar para vos. :)

¡Lo ponés en la raíz de tu proyecto pelican y a escribir!

Arriba


Escrito por: Hi7903b, el día: