Yretek 🍃 Geminator.lua

¡Extra, extra! Acabo de crear mi nuevo script para generar los artículos en esta mi cápsula. Y como soy un ansioso aquí os comparto el resultado. Hace, aburridamente, casi lo mismo que mi anterior script en BASH, pero éste es en lua. El lua me permite usar también llamdas al sistema operativo. Aquí uso Linux por lo que no funcionará en windows. (Habría que adaptar las líneas que contengan «os.execute("lo que sea")».

La idea es que toma un archivo de borrador, le pone su cabecera y su pie de página y modifica los índices (index.gmi) para que se incluya el enlace "suscribible" tipo «=> gemini://ejemplo.org/ 2022-02-02 Ejemplo»

No he querido, al menos de momento, que mueva los archivos de índice al directorio hasta asegurarme que todo va bien y eso.

-- Lua Geminator
--[[(es) 
  Partiendo de un archivo en formato Gemini sin
  extensión (.gmi) que contiene solo el artículo,
  Geminator le añade la cabecera, el pie de página
  lo incluye en el directorio "artículos" y crea
  las entradas en el índice general y de artículos
]]
--
-- Funciones
function read_text_file(i_str)
-- Lee un archivo de texto de nombre i_str
-- Devuelve una string con el texto
  local f_ile = io.open(i_str, 'r')
  local t_str = f_ile:read('*all')
  f_ile:close()
  return t_str
end

function write_text_file(o_str, t_str)
  -- Escribe t_str en el archivo de nombre o_str
  local f_ile = io.open(o_str, 'w')
  io.output(f_ile)
  io.write(t_str)
  io.close(f_ile)
end

function ask_user(prompt_str)
-- pregunta al usuario en prompt_str
   io.stdout:write(prompt_str .. " > ")
   local answer_str = io.stdin:read()
   return answer_str
end

function is_file_here(i_file_str)
  local was_found = false
  i_file = io.open(i_file_str, i)
  if i_file~=nil then 
    io.close(i_file) 
    was_found = true 
  end
  return was_found
end

function make_link(article_url, pub_date, title_str)
  -- Crea enlace subscribible en gemini
  folder_url  = "gemini://yretek.com/articulos/" 
  full_url = folder_url .. output_file_str
  return "=> " .. full_url .. " " .. pub_date .. " " .. title_str
end

function insert_in_str(target_str, mark_str, insert_str)
-- Inserta "insert_str" en "target_str" 
-- "mark_str" marca dónde se hace la inserción.
-- "mark_str" se mantiene
  return string.gsub(target_str, 
                     mark_str,
                     mark_str..link_str,
                             1)
end

-- Principal —-----------------------------------------------
-- Obtener la fecha actual en "formato gemini" :)
-- No quiero liarme con fechas futuras por ahora
today_str = os.date('%Y-%m-%d')
-- Obtener nombre del borrador y título
prompt_str = "¿Cuál es el archivo de borrador?"
repeat
  draft_file_str = ask_user(prompt_str)
  prompt_str = "Fichero no encontrado.\nUse otro nombre."
until is_file_here(draft_file_str)

prompt_str = "¿Título?"
title_str = ask_user(prompt_str)
-- Si el título está vacío se usa la fecha como título
if title_str == "" then title_str = today_str end
draft_text_str = read_text_file(draft_file_str)

-- cuenta las palabras del borrador y almacena en words.txt
os.execute("wc -w " .. draft_file_str .. " > words.txt")

raw_str = read_text_file("words.txt")
word_count_str = "* Palabras: "..string.sub(raw_str, string.find(raw_str, "%d+%s")).."\n"

header_str = "# Yretek 🍃 " .. title_str .. "\n\n"
footer_title_str = "\n### Pie de página" .. "\n"
date_field_str = "* Fecha: " .. today_str .. "\n"
author_str = [[
~ Miguel de Luis Espinosa
=> mailto:yretek@proton.me yretek@proton.me

]]
footer_str = footer_title_str .. date_field_str .. word_count_str .. author_str

to_write_str = header_str .. draft_text_str .. footer_str

-- Por ahora suponemos archivo con extensión .gmi
output_file_str = today_str .. "_" .. draft_file_str 

write_text_file(output_file_str, to_write_str)
os.execute("vim "..output_file_str)
os.execute("mv "..output_file_str.." ../articulos/") 
os.execute("cp ../index.gmi index_principal.bak")
os.execute("cp ../articulos/index.gmi index_articulos.bak")

link_str =  make_link(output_file_str, today_str, title_str).."\n"

-- index principal
old_main_index = read_text_file("../index.gmi")
new_main_index = insert_in_str(old_main_index, 
                               "## Artículos\n", 
                               link_str )
write_text_file("index_principal.gmi", new_main_index)

-- index articulos
old_artcl_index = read_text_file("../articulos/index.gmi")
new_artcl_index = insert_in_str(old_artcl_index, 
                               "·\n", 
                               link_str )
write_text_file("index_artcl.gmi", new_artcl_index)

-- Ta da!

Pie de página

~ Miguel de Luis Espinosa

yretek@proton.me