Memorias de un Técnico Ligero

Ver más publicaciones del año 2026

Script de Python3 para convertir txt a html y hacer un listado de entradas

Este script es diferente al de la publicación anterior. Como quería hacer algo como Pelican, pero mucho, muchísimo más sencillo seguí avanzando con la intención de crearme algo para mis narrativas y si dependiendo de mi humor, lavarle la cara de vez en cuando.

#Creador de sitios desde archivos de texto
#Por HI7903b

import os
import subprocess
from datetime import datetime
import unicodedata
import re


anio = datetime.now().year

print ("Conversor de archivos de texto a HTML")
print ("mini generador de sitios web")
print ("Poné un archivo con nombre 'inicio' para la pagina principal")

temas = {
    "1": "bosque_lectura.css",
    "2": "cuaderno_indie.css",
    "3": "noches_de_synte.css",
    "4": "taller_matutino.css",
    "5": "terminal_papel.css",
    "6": "vinilo_medianoche.css"
}

eleccion = input("""Elegí un tema para el sitio:
    "1": "bosque_lectura.css",
    "2": "cuaderno_indie.css",
    "3": "noches_de_synte.css",
    "4": "taller_matutino.css",
    "5": "terminal_papel.css",
    "6": "vinilo_medianoche.css"
Si ponés otra cosa, en el HTML va salir "NONE"
""")

css = temas.get(eleccion)

print (f"El tema seleccionado es el {css}")

#Función que le pone guiones y junta el texto si hay espacios
def limpiar_slug(texto):
    # Normaliza (separa acentos)
    texto = unicodedata.normalize('NFD', texto)
    # Elimina acentos
    texto = texto.encode('ascii', 'ignore').decode('utf-8')
    # Reemplaza espacios por guiones
    texto = texto.lower().replace(" ", "-")
    # Elimina cualquier cosa rara
    texto = re.sub(r'[^a-z0-9\-]', '', texto)
    # Evita guiones duplicados
    texto = re.sub(r'-+', '-', texto)
    return texto

#Nombre para el sitio, y el subtítulo para la página principal
#titulo_sitio = input ("Nombre del sitio: ")
titulo_sitio = "Narrativa"
#subtitulo_sitio = input ("Algún subtitulo: ")
subtitulo_sitio = "Espacio para la memoria no lineal"
#contacto = input ("Correo de contacto: ")
contacto = "hi7903b@envs.net"

el_directorio = os.getcwd()
#archivos_de_texto = el_directorio+"/textos"
archivos_de_texto = input ("ruta completa a los archivos de texto: ")
que_archivo = "txt" #esto se puede cambiar por el archivo que se desee, pero en Gopher yo pongo solo txt
lista_ordenada = []

#Primero busco si hay algun archivo que no tenga fecha 
for ruta, directorio, archivos in os.walk (archivos_de_texto):
    for archivo in archivos:

        #Si el archivo no tiene fecha de creación
        if archivo.endswith (".txt") and not archivo.startswith ("inicio") and not archivo.startswith ("20"):

            encontrado = os.path.join (ruta, archivo)
            fecha_mod = os.path.getmtime(encontrado)
            fechita = datetime.fromtimestamp(fecha_mod).strftime("%Y-%m-%d")

            #Nuevo nombre con fecha
            nuevo_nombre = fechita + "-"+archivo
            antiguo = os.path.join(ruta, archivo)
            nuevo = os.path.join(ruta, nuevo_nombre)
            os.rename(antiguo, nuevo)
            print(f"Renombrado: {antiguo}{nuevo}")

nombre_corto = ""
lista_archivos_index = []

for ruta, directorio, archivos in os.walk (archivos_de_texto):
    for archivo in archivos:

        #Busco los archivos de texto que no se llamen inicio (ese va a ser el index)
        if archivo.endswith (".txt") and not archivo.startswith ("inicio"):
            ruta_archivo = os.path.join(ruta, archivo)
            with open(ruta_archivo, "r") as archivo1:
                texto_archivo = archivo1.read()
                texto_archivo = texto_archivo.replace("\n", "<br>\n")
                ruta_archivo_nuevo = os.path.join(el_directorio, archivo)
                with open(ruta_archivo_nuevo[:-4]+".html", "w") as archivo2:

                    nombre_corto = limpiar_slug(archivo[11:])
                    lista_archivos_index.append(archivo[:-4]+".html")
                    #print (f"El nombre del archivo creado es: {nombre_corto}")
                    archivo2.write(f"""<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{titulo_sitio}</title>
    <link rel="stylesheet" href=" css/{css}">

</head>
<body>
<h1>{titulo_sitio}</h1>

<br><br>

{texto_archivo}

<br><br>

<nav>
<a href='index.html'>Volver al inicio</a>
</nav>


<footer>
Copyleft {anio} por {titulo_sitio} <br>
<a href="mailto:{contacto}">Contacto</a> <br>
    Esta página fue generada a partir de un archivo de texto con Python.
    <br>
    <a href="generador.py">Descargar el generador</a>
</footer>


</body>
</html>
""")



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

#Esto hay que hacerlo de esta manera porque si no no carga todos los documentos en la lista                
for ruta, directorio, archivos in os.walk (archivos_de_texto):
    for archivo in archivos:


        #Para crear el index HTML (lo que está entre comillas se puede cambiar por lo más conveniente):
        if not archivo.endswith (".txt") and archivo.startswith ("inicio"):
            ruta_archivo = os.path.join(ruta, archivo)

            #Armo los enlaces con los archivos
            lista_archivos_index.sort(reverse=True)
            menu = ""
            for pagina in lista_archivos_index:
                fecha = pagina[:10]
                titulo = pagina[11:-5]
                titulo = titulo.replace("-", " ").title()
                titulo_visible = f"{fecha} - {titulo}"
                menu += f'<li><a href="{pagina}">{titulo_visible}</a></li>'

            #escribo el index    
            with open(ruta_archivo, "r") as archivo1:
                texto_archivo = archivo1.read()
                texto_archivo = texto_archivo.replace("\n", "<br>\n")
                ruta_archivo_nuevo = os.path.join(el_directorio, "index.html")
                print("Cantidad de artículos:", len(lista_archivos_index))
                with open(ruta_archivo_nuevo, "w") as archivo3:
                    archivo3.write(f"""<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{titulo_sitio}</title>
    <link rel="stylesheet" href=" css/{css}">

</head>
<body>
<h1>{titulo_sitio}</h1>

<br>

<h3><i>{subtitulo_sitio}</i></h3>
<hr>
<br><br>
{texto_archivo}
<br><br>

<nav>
<ul>
{menu}
</ul>
</nav>


<footer>
Copyleft {anio} por {titulo_sitio} <br>
<a href="mailto:{contacto}">Contacto</a> <br>
    Esta página fue generada a partir de un archivo de texto con Python.
    <br>
    <a href="generador4-texto-a-html.py">Descargar el generador</a>
</footer>


</body>
</html>
""")




print ("Todo creado. ¡A disfrutar!")

Todo lo que está en las variables iniciales se pueden cambiar lógicamente. Báh, todo en definitiva. Lo que quiero expresar es que con esto más el asrchivo de los CSS que dejo para descargar y un puñado de textos se puede tener un sitio completamente sencillo y funcional en minutos.

Descargar los CSS y descomprimir en el mismo lugar del generador

Descargar el generador

Arriba


Escrito por: HI7903B , el día: