aboutsummaryrefslogblamecommitdiffstats
path: root/gemtext2html.awk
blob: fd45139a15e403a539852e45145510d6176bb4cc (plain) (tree)
























































































































































































                                                                                                                                         
# 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