# gemtext2html # convierte un archivo en gemtext a html de acuerdo a la spec # excepción: enlaces a imagen (jpg, png, gif) se vuelven # TODO actualizar descripción # TODO h2 en nav? # # importante: solo un {wikilink} (con o sin espacios) por línea # # modo de uso: # awk -f gemtext2html.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 "" # print "" print "" print "" print "" 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 "