| 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) { | |
| } # 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" | |
| } | |
| } |