diff options
author | sejo <sejo@texto-plano.xyz> | 2021-05-19 19:06:21 -0500 |
---|---|---|
committer | sejo <sejo@texto-plano.xyz> | 2021-05-19 19:06:21 -0500 |
commit | 82b994447214af187f05083f1fff33a78f92b1a8 (patch) | |
tree | 20b9ae4b554b83cd43a4e9b1f567d8b39e19c5cc /gemtext2html.awk | |
download | sitio-82b994447214af187f05083f1fff33a78f92b1a8.tar.gz |
archivos iniciales
Diffstat (limited to 'gemtext2html.awk')
-rw-r--r-- | gemtext2html.awk | 185 |
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>" +} |