aboutsummaryrefslogtreecommitdiffstats
path: root/gemtext2html.awk
diff options
context:
space:
mode:
authorsejo <sejo@texto-plano.xyz>2021-05-19 19:06:21 -0500
committersejo <sejo@texto-plano.xyz>2021-05-19 19:06:21 -0500
commit82b994447214af187f05083f1fff33a78f92b1a8 (patch)
tree20b9ae4b554b83cd43a4e9b1f567d8b39e19c5cc /gemtext2html.awk
downloadsitio-82b994447214af187f05083f1fff33a78f92b1a8.tar.gz
archivos iniciales
Diffstat (limited to 'gemtext2html.awk')
-rw-r--r--gemtext2html.awk185
1 files changed, 185 insertions, 0 deletions
diff --git a/gemtext2html.awk b/gemtext2html.awk
new file mode 100644
index 0000000..fd45139
--- /dev/null
+++ b/gemtext2html.awk
@@ -0,0 +1,185 @@
+# gemtext2html
+# convierte un archivo en gemtext a html de acuerdo a la spec
+# excepción: enlaces a imagen (jpg, png, gif) se vuelven <img>
+#
+# modo de uso:
+# awk -f gemtext2html.awk archivo.gmi > archivo.html
+#
+BEGIN{
+ # para poder abrir y cerrar <ul>, <pre>, <p>:
+ modo_lista = 0
+ modo_pre = 0
+ modo_parrafo = 0
+
+ bloque = 0 # para no agregar <br/> después de headers y blockquotes
+
+ print "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>"
+ print "<html xmlns='http://www.w3.org/1999/xhtml' lang='es-MX'>"
+ print "<head>"
+ print "<meta http-equiv='Content-Type' content='text/html; charset=utf-8' />"
+ print "<meta content='initial-scale=1.0, maximum-scale=1.0, user-scalable=yes' name='viewport'/>"
+}
+NR == 1{
+ titulo = $0
+ sub("#[[:blank:]]+","",titulo) #prefijo
+ print "<title>"titulo" - codeVGA</title>"
+ print "</head>"
+ print "<body>"
+}
+
+$0 !~ /^(=>|```|#{1,3} |* |>|[[:blank:]]*$)/{ # líneas de texto (no "especiales")
+ if(!modo_pre){
+ if(!modo_parrafo){
+ modo_parrafo = 1
+ print "<p>"
+ }
+ else # nueva línea en el mismo párrafo
+ print "<br/>"
+
+ }
+ print $0
+}
+
+/^[[:blank:]]*$/ { # línea vacía
+ if( !modo_pre ) {
+ if( modo_lista ){ # cierra la lista
+ modo_lista = 0
+ print "</ul>"
+ }
+ else if( modo_parrafo ){ # cierra el párrafo
+ modo_parrafo = 0
+ print "</p>"
+ }
+ else if( bloque ) # si lo previo fue header o blockquote
+ bloque = 0;
+ else
+ print "<br/>"
+ }
+ else
+ print $0
+
+}
+
+/^=>/{ # link
+ if(!modo_pre){
+ if( modo_lista ){ # cierra la lista
+ modo_lista = 0
+ print "</ul>"
+ }
+ else if( modo_parrafo ){ # cierra el párrafo
+ modo_parrafo = 0
+ print "</p>"
+ }
+ # borra flecha del inicio
+ sub("^=>","",$0)
+ # ahora $1 es el path, $2 a $NF el texto
+
+ # concatena todo el texto
+ texto = $2
+ for(i=3; i<=NF; i++){
+ texto = texto" "$i
+ }
+
+ # si el path es imagen
+ if( match($1, /(png|jpg|gif)$/) ){
+ # crea imagen <img>
+ $0="<img src='"$1"' alt='"texto"'/>"
+ }
+ # si el path no es imagen
+ else{
+ # convierte enlace de .gmi a .html !
+ sub(".gmi$",".html",$1)
+
+ # crea link <a>
+ $0="<a href='"$1"'>"texto"</a><br/>"
+ }
+ }
+ print $0
+}
+
+/^* /{ # lista
+ if(!modo_pre){
+ if(!modo_lista){ # inicia la lista
+ if(modo_parrafo){
+ modo_parrafo = 0
+ print "</p>"
+ }
+ modo_lista = 1
+ print "<ul>"
+ }
+ sub("*[[:blank:]]+","<li>",$0)
+ sub("$","</li>",$0)
+ }
+ print $0
+}
+
+/^```/{ # preformatted
+ if(modo_pre){
+ # cierra preformatted
+ modo_pre = 0
+ print "</pre>"
+ }
+ else{
+ if( modo_lista ){ # cierra la lista
+ modo_lista = 0
+ print "</ul>"
+ }
+ else if( modo_parrafo ){ # cierra el párrafo
+ modo_parrafo = 0
+ print "</p>"
+ }
+
+ # abre preformatted
+ modo_pre = 1
+ print "<pre>"
+ }
+}
+
+/^> /{ # blockquote
+ if(!modo_pre){
+ sub(">[[:blank:]]+","<blockquote>",$0)
+ sub("$","</blockquote>",$0)
+ bloque = 1
+ }
+ print $0
+}
+
+/^# /{ # h1
+ if(!modo_pre){
+ sub("#[[:blank:]]+","<h1>",$0) #prefijo
+ sub("$","</h1>",$0) #sufijo
+ bloque = 1
+ }
+ print $0
+}
+
+/^## /{ # h2
+ if(!modo_pre){
+ sub("##[[:blank:]]+","<h2>",$0)
+ sub("$","</h2>",$0)
+ bloque = 1
+ }
+ print $0
+}
+
+/^### /{ # h3
+ if(!modo_pre){
+ sub("###[[:blank:]]+","<h3>",$0)
+ sub("$","</h3>",$0)
+ bloque = 1
+ }
+ print $0
+}
+
+END{
+ # cierra tags que pudiero n haber quedado abiertas
+ if(modo_pre)
+ print "</pre>"
+ else if(modo_parrafo)
+ print "</p>"
+ else if(modo_lista)
+ print "</ul>"
+
+ print "</body>"
+ print "</html>"
+}
Un proyecto texto-plano.xyz