Smolwebtor.py

Convierte gemtext a html simple

Pues me he creado un pequeño script que traduce gemtext a marcado html, y que he llamado smolwebtor. Eso sí no genera una página independiente sino que simplemente traduce “literalmente” lo que hay en el archivo de entrada en su equivalente html. Para terminar el archivo html habría que insertarle una cabecera, y el resto de los elementos necesarios o convenientes.

Funcionamiento

En linux, en el terminal

python3 smolwebtor fichero_ejemplo.gmi > fichero_ejemplo.html

Explicación del algoritmo

Disculpadme los veteranos, prefieros pecar de explicar mucho a demasiado poco. Nunca se sabe si alguien novato está leyendo esto.

(Todos los números de líneas contados desde el principio del código, esto es la línea import sys)

Línea 29 Carga el archivo de entrada

Línea 30 Carga lo que contenga el archivo de entrada en una lista, cada elemento de la lista es una línea.

Línea 31 Llama a la función extract_preformated(text) que devuelve una tupla cuyo primer elemento es el texto normal del archivo (ordinary lines), quitando los textos preformateados (o texto plano) y añadiendo una marca de inserción {{{-}}} donde estaba cada uno de los textos preformateados que contenía el docuemnto. El segundo elementos de la tupla es precisamente una lista de los textos preformateado.

Líneas 35 a 70 Se trata de un bucle que va línea por línea, examinado su primera "palabra". Si esta palabra resulta ser una etiqueta de gemtext, aplica las etiquetas html equivalentes a la etiqueta de gemtext

Línea 72 a 75 Va insertando cada texto preformateado en su lugar. Para ello va por orden sustituyendo cada etiqueta de inserción del texto normal (aquello de {{{-}}} ) por el texto preformateado que toque.

#!/usr/bin/python3
# *****************************************************************
#    smolwebtor BY MIGUEL DE LUIS ESPINOSA 
#    YRETEK
#    --------------------------------------------------------------
#    (c) 2023 Miguel de Luis 
#    This is Free Software licesed under the GPL 3 license terms
#    See https://www.gnu.org/licenses/gpl-3.0.html
# *****************************************************************

# usage python3 smolwebtor.py in.gmi > out.html
# chmod +x smolwebtor.py will make it executable so you could just do
# gmi2html.py in.gmi > out.html

import sys

FILENAME = sys.argv[1]

def extract_preformated(text_lines):
  ordinary_lines = []
  preformated_texts = []
  started_preformated_text = False
  this_preformated_text = ""
  for line in text_lines:
    stripped_line = line.strip()
    if stripped_line == "":
      continue
    if stripped_line == "```":
      if started_preformated_text:
        ordinary_lines.append("{{{-}}}")
        preformated_texts.append(this_preformated_text)
        started_preformated_text = False
      else:
        started_preformated_text = True
    elif started_preformated_text:
      this_preformated_text += line #must not be stripped but be verbatim
    else:
      ordinary_lines.append(stripped_line)
  return (ordinary_lines, preformated_texts)

with open (FILENAME, 'r') as reader:
  text_lines = reader.readlines()
  ordinary_lines, preformated_texts = extract_preformated(text_lines)

output = ""

for line in ordinary_lines:
  out_line = line.strip()
  if out_line == "\n{{{-}}}":
    output += out_line
    continue
  candidate_content = ""
  candidate_gemini_tag = ""
  words = line.split()
  if len(words) > 1: 
    candidate_gemini_tag = words[0]
    candidate_content = " ".join(words[1:])
  print(candidate_gemini_tag)
  match candidate_gemini_tag.strip():
    case "#":
      out_line = "\n

\n" + candidate_content + "\n

" case "##": out_line = "\n

\n" + candidate_content + "\n

" case "###": out_line = "\n

\n" + candidate_content + "\n

" case ">": out_line = "\n
\n" + candidate_content + "\n
" case "*": out_line = "\n
  • \n" + candidate_content + "\n
  • " case "=>": url = "" link_text = "" if len(words) > 1: url = words[1] if len(words) > 2: link_text = " ".join(words[2:]) out_line = "\n
  • " + link_text + "\n<\li>" else: out_line = "\n

    \n => \n

    " case _: out_line = "\n

    \n" + out_line + "\n

    " # Todos estos "\n" son innecesarios, pero a mí me gusta añadir # espaciado y líneas en blanco para que se vea mejor. Preferencia # personal output += out_line for text in preformated_texts: out_text = "\n
    \n" + text + "\n
    " output = output.replace("{{{-}}}", out_text, 1) # El ,1 final limita las sustituciones a la primera que encuentre print(output)
  • Smolwebtor.py

    Pues me he creado un pequeño script que traduce gemtext a marcado html, y que he llamado smolwebtor. Eso sí no genera una página independiente sino que simplemente traduce “literalmente” lo que hay en el archivo de entrada en su equivalente html. Para terminar el archivo html habría que insertarle una cabecera, y el resto de los elementos necesarios o convenientes.

    Funcionamiento

    En linux, en el terminal

    python3 smolwebtor fichero_ejemplo.gmi > fichero_ejemplo.html

    Explicación del algoritmo

    Disculpadme los veteranos, prefieros pecar de explicar mucho a demasiado poco. Nunca se sabe si alguien novato está leyendo esto.

    (Todos los números de líneas contados desde el principio del código, esto es la línea import sys)

    Línea 29 Carga el archivo de entrada

    Línea 30 Carga lo que contenga el archivo de entrada en una lista, cada elemento de la lista es una línea.

    Línea 31 Llama a la función extract_preformated(text) que devuelve una tupla cuyo primer elemento es el texto normal del archivo (ordinary lines), quitando los textos preformateados (o texto plano) y añadiendo una marca de inserción {{{-}}} donde estaba cada uno de los textos preformateados que contenía el docuemnto. El segundo elementos de la tupla es precisamente una lista de los textos preformateado.

    Líneas 35 a 70 Se trata de un bucle que va línea por línea, examinado su primera "palabra". Si esta palabra resulta ser una etiqueta de gemtext, aplica las etiquetas html equivalentes a la etiqueta de gemtext

    Línea 72 a 75 Va insertando cada texto preformateado en su lugar. Para ello va por orden sustituyendo cada etiqueta de inserción del texto normal (aquello de {{{-}}} ) por el texto preformateado que toque.

    #!/usr/bin/python3
    # *****************************************************************
    #    smolwebtor BY MIGUEL DE LUIS ESPINOSA 
    #    YRETEK
    #    --------------------------------------------------------------
    #    (c) 2023 Miguel de Luis 
    #    This is Free Software licesed under the GPL 3 license terms
    #    See https://www.gnu.org/licenses/gpl-3.0.html
    # *****************************************************************
    
    # usage python3 smolwebtor.py in.gmi > out.html
    # chmod +x smolwebtor.py will make it executable so you could just do
    # gmi2html.py in.gmi > out.html
    
    import sys
    
    FILENAME = sys.argv[1]
    
    def extract_preformated(text_lines):
      ordinary_lines = []
      preformated_texts = []
      started_preformated_text = False
      this_preformated_text = ""
      for line in text_lines:
        stripped_line = line.strip()
        if stripped_line == "":
          continue
        if stripped_line == "```":
          if started_preformated_text:
            ordinary_lines.append("{{{-}}}")
            preformated_texts.append(this_preformated_text)
            started_preformated_text = False
          else:
            started_preformated_text = True
        elif started_preformated_text:
          this_preformated_text += line #must not be stripped but be verbatim
        else:
          ordinary_lines.append(stripped_line)
      return (ordinary_lines, preformated_texts)
    
    with open (FILENAME, 'r') as reader:
      text_lines = reader.readlines()
      ordinary_lines, preformated_texts = extract_preformated(text_lines)
    
    output = ""
    
    for line in ordinary_lines:
      out_line = line.strip()
      if out_line == "\n{{{-}}}":
        output += out_line
        continue
      candidate_content = ""
      candidate_gemini_tag = ""
      words = line.split()
      if len(words) > 1: 
        candidate_gemini_tag = words[0]
        candidate_content = " ".join(words[1:])
      print(candidate_gemini_tag)
      match candidate_gemini_tag.strip():
        case "#":
          out_line = "\n

    \n" + candidate_content + "\n

    " case "##": out_line = "\n

    \n" + candidate_content + "\n

    " case "###": out_line = "\n

    \n" + candidate_content + "\n

    " case ">": out_line = "\n
    \n" + candidate_content + "\n
    " case "*": out_line = "\n
  • \n" + candidate_content + "\n
  • " case "=>": url = "" link_text = "" if len(words) > 1: url = words[1] if len(words) > 2: link_text = " ".join(words[2:]) out_line = "\n
  • " + link_text + "\n<\li>" else: out_line = "\n

    \n => \n

    " case _: out_line = "\n

    \n" + out_line + "\n

    " # Todos estos "\n" son innecesarios, pero a mí me gusta añadir # espaciado y líneas en blanco para que se vea mejor. Preferencia # personal output += out_line for text in preformated_texts: out_text = "\n
    \n" + text + "\n
    " output = output.replace("{{{-}}}", out_text, 1) # El ,1 final limita las sustituciones a la primera que encuentre print(output)
  • Proxy Information
    Original URL
    gemini://bosque-protector.com/codigo/smolwebtor.gmi
    Status Code
    Success (20)
    Meta
    text/gemini;lang=es
    Capsule Response Time
    252.963101 milliseconds
    Gemini-to-HTML Time
    1.861817 milliseconds

    This content has been proxied by September (ba2dc).