Minimalistic markdown subset to html converter using awk

NILHello

As on my blog I use different markup languages I would like to use a simpler

markup language not requiring an extra package. To do so, I wrote an awk

script handling titles, paragraphs and code blocks the same way markdown does.

Code below contain the addition.

It is very easy to use, like: awk -f mmd file.mmd > output.html

The script is the following:

BEGIN {

	in_code=0

	in_list_unordered=0

	in_list_ordered=0

	in_paragraph=0

}

{

	# escape < > characters

	gsub(/</,"\<",$0);

	gsub(/>/,"\>",$0);

	# close code blocks

	if(! match($0,/^    /)) {

		if(in_code) {

			in_code=0

			printf "</code></pre>\n"

		}

	}

	# close unordered list

	if(! match($0,/^- /)) {

		if(in_list_unordered) {

			in_list_unordered=0

			printf "</ul>\n"

		}

	}

	# close ordered list

	if(! match($0,/^[0-9]+\. /)) {

		if(in_list_ordered) {

			in_list_ordered=0

			printf "</ol>\n"

		}

	}

	# display titles

	if(match($0,/^#/)) {

		if(match($0,/^(#+)/)) {

			printf "<h%i>%s</h%i>\n", RLENGTH, substr($0,index($0,$2)), RLENGTH

		}

	# display code blocks

	} else if(match($0,/^    /)) {

		if(in_code==0) {

			in_code=1

			printf "<pre><code>"

			print substr($0,5)

		} else {

			print substr($0,5)

		}

	# display unordered lists

	} else if(match($0,/^- /)) {

		if(in_list_unordered==0) {

			in_list_unordered=1

			printf "<ul>\n"

			printf "<li>%s</li>\n", substr($0,3)

		} else {

			printf "<li>%s</li>\n", substr($0,3)

		}

	# display ordered lists

	} else if(match($0,/^[0-9]+\. /)) {

		n=index($0," ")+1

		if(in_list_ordered==0) {

			in_list_ordered=1

			printf "<ol>\n"

			printf "<li>%s</li>\n", substr($0,n)

		} else {

			printf "<li>%s</li>\n", substr($0,n)

		}

	# close p if current line is empty

	} else {

		if(length($0) == 0 && in_paragraph == 1 && in_code == 0) {

			in_paragraph=0

			printf "</p>"

		} # we are still in a paragraph

		if(length($0) != 0 && in_paragraph == 1) {

			print

		} # open a p tag if previous line is empty

		if(length(previous_line)==0 && in_paragraph==0) {

			in_paragraph=1

			printf "<p>%s\n", $0

		}

	}

	previous_line = $0

}

END {

	if(in_code==1) {

		printf "</code></pre>\n"

	}

	if(in_list_unordered==1) {

		printf "</ul>\n"

	}

	if(in_list_ordered==1) {

		printf "</ol>\n"

	}

	if(in_paragraph==1) {

		printf "</p>\n"

	}

}

Proxy Information
Original URL
gemini://perso.pw/blog//articles/minimal-markdown.gmi
Status Code
Success (20)
Meta
text/gemini
Capsule Response Time
140.998709 milliseconds
Gemini-to-HTML Time
0.936398 milliseconds

This content has been proxied by September (ba2dc).