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" } }