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"

}

}