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.
En linux, en el terminal
python3 smolwebtor fichero_ejemplo.gmi > fichero_ejemplo.html
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 => \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)
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.
En linux, en el terminal
python3 smolwebtor fichero_ejemplo.gmi > fichero_ejemplo.html
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 => \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)
text/gemini;lang=es
This content has been proxied by September (ba2dc).