diff --git a/gemtext2html-clean.awk b/gemtext2html-clean.awk new file mode 100644 index 00000000..d4da2e53 --- /dev/null +++ b/gemtext2html-clean.awk @@ -0,0 +1,339 @@ +# gemtext2html-clean +# convierte un archivo en gemtext a html de acuerdo a la spec +# excepción: enlaces a imagen (jpg, png, gif) se vuelven +# +# importante: solo un {wikilink} (con o sin espacios) por línea +# +# modo de uso: +# awk -f gemtext2html-clean.awk archivo.gmo > archivo.html +# + +BEGIN{ + sitio = "compudanzas" + descripcion = "explorations of computing at a human scale" + # para poder abrir y cerrar
,: + modo_lista = 0 + modo_pre = 0 + modo_parrafo = 0 + modo_galeria = 0 + + en_section = 1 #empezamos abriendo una
" ) + } + else if( modo_galeria ){ + modo_galeria = 0 + appendContenido( "" ) + } +# else +# appendContenido( "sin h1 + + navcount = 0 + + bloque = 0 # para no agregar
después de headers y blockquotes + + print "" + print "" + print "" + print "" + print "" + contenido = "" + nav = "
" ) + if( bloque ) # si lo previo fue header o blockquote + bloque = 0; + + } + else + appendContenido( $0 ) + next +} + +/^=>/{ # link + if(!modo_pre){ + if( modo_lista ){ # cierra la lista + modo_lista = 0 + appendContenido( "" ) + } + else if( modo_parrafo ){ # cierra el párrafo + modo_parrafo = 0 + appendContenido( "" ) + } + + bloque = 1 #empieza bloque porque es+ + # 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 + } + + if( match($1, /^\.\//)) { # si es link local + # si el path es imagen + if( match($1, /(png|jpg|gif)$/) ){ + # crea imagen + if( !modo_galeria ){ + appendContenido("
" ) + } + modo_lista = 1 + appendContenido( "") + modo_galeria = 1 + } + appendContenido("") + } + # si el path no es imagen y es .gmi + else if( match($1, /gmi$/) ){ + # convierte enlace de .gmi a .html ! + sub(".gmi$",".html",$1) + + # quita { } + sub("{","",texto) + sub("}","",texto) + + # crea link + appendContenido("") + } + else{ + appendContenido("") + } + } + else{ # link externo + appendContenido("") + } + } + else{ + appendContenido( $0 ) + } + next +} + +/^* /{ # lista + if(!modo_pre){ + if(!modo_lista){ # inicia la lista + if(modo_parrafo){ + modo_parrafo = 0 + appendContenido( "
" ) + } + next +} + +/^> /{ # blockquote + if(!modo_pre){ + sub(">[[:blank:]]+","" + else if(modo_parrafo) + print "" + else if(modo_lista) + print "" + + # finaliza... + print "" + print "" + print "" + print "" + print "" +}",$0) + sub("$","",$0) + bloque = 1 + } + appendContenido( $0 ) + next +} + +/^# /{ # h1 + if(!modo_pre){ + sub("#[[:blank:]]+","",$0) #prefijo + sub("$","",$0) #sufijo + bloque = 1 + + if( !en_section ){ # si no se ha iniciado una sección antes + appendContenido( "" ) + en_section = 1 + } + else{ + appendContenido( " " ) + } + + # crea header con id + appendContenido( " "$0"
" ) + + # agrega header a navegación + appendNav( ""$0" " ) + } + else{ + appendContenido( $0 ) + } + next + +} + +/^## /{ # h2 + if(!modo_pre){ + sub("##[[:blank:]]+","",$0) + sub("$","",$0) + # crea header con id + appendContenido( ""$0"
" ) + bloque = 1 + } + else{ + appendContenido( $0 ) + } + next +} + +/^### /{ # h3 + if(!modo_pre){ + sub("###[[:blank:]]+","",$0) + sub("$","",$0) + appendContenido( ""$0"
" ) + bloque = 1 + } + else{ + appendContenido( $0 ) + } + next +} + +#$0 !~ /^(=>|```|#{1,3} |* |\+|>|[[:blank:]]*$)/{ # líneas de texto (no "especiales") +{ # cualquier otra línea de texto + if(!modo_pre){ + if(!modo_parrafo){ + modo_parrafo = 1 + appendContenido( "" ) + } + else # nueva línea en el mismo párrafo + appendContenido( "
" ) + + # busca y convierte wikiLink (máx uno por línea) + appendContenido( wikiLink($0) ) + } + else{ + gsub("<","\\<",$0) + gsub(">","\\>",$0) + appendContenido( $0 ) + } +} + +END{ + # imprime y cierra nav + if(navcount){ + print nav + print "" + } + + # imprime contenido + print contenido + # cierra tags que pudieron haber quedado abiertas + if(modo_pre) + print "