Title: Minimalistic markdown subset to html converter using awk
       Author: Solène
       Date: 26 August 2019
       Tags: unix awk
       Description: 
       
       Hello
       
       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.
       
       **16 December 2019 UPDATE**: adc sent me a patch to add ordered and
       unordered list.
       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);
       
                   if(! match($0,/^    /)) {
                           if(in_code) {
                                   in_code=0
                                   printf "</code></pre>\n"
                           }
                   }
       
                   if(! match($0,/^- /)) {
                           if(in_list_unordered) {
                                   in_list_unordered=0
                                   printf "</ul>\n"
                           }
                   }
       
                   if(! match($0,/^[0-9]+\. /)) {
                           if(in_list_ordered) {
                                   in_list_ordered=0
                                   printf "</ol>\n"
                           }
                   }
       
                   if(match($0,/^#/)) {
                           if(match($0,/^(#+)/)) {
                                   printf "<h%i>%s</h%i>\n", RLENGTH,
       substr($0,index($0,$2)), RLENGTH
                           }
       
                   } else if(match($0,/^    /)) {
                           if(in_code==0) {
                                   in_code=1
                                   printf "<pre><code>"
                                   print substr($0,5)
                           } else {
                                   print substr($0,5)
                           }
       
                   } 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)
                           }
       
                   } 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)
                           }
       
                   } 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
           }
       
                   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"
                   }
           }