#!/bin/awk -f function eschtml(t) { gsub("<", "\\<", t); gsub("%", "\\%", t); return t; } function oprint(t) { if(nr == 0) otext = otext t; else otext = otext t; } function nextil(t) { if(!match(t, /[`<\[*_\\]|(\!\[)/)) return t t1 = substr(t, 1, RSTART - 1) tag = substr(t, RSTART, RLENGTH) t2 = substr(t, RSTART + RLENGTH) if(ilcode && tag != "`") return eschtml(t1 tag) nextil(t2); if(tag == "`"){ if(sub(/^`/, "", t2)){ if(!match(t2, /``/)) return t1 "”" nextil(t2); ilcode2 = !ilcode2; } else if(ilcode2) return t1 tag nextil(t2); tag = "
"; if(ilcode){ # t1 = eschtml(t1); tag = ""; } ilcode = !ilcode; return t1 tag nextil(t2); } if(tag == "\\"){ if(match(t2, /^[\\*_{}\[\]()#+\-\.!]/)){ tag = substr(t2, 1, 1) t2 = substr(t2, 2); } return t1 tag nextil(t2); } if(tag == "<"){ if(match(t2, /^[A-Za-z\/!][^>]*>/)){ tag = tag substr(t2, RSTART, RLENGTH) t2 = substr(t2, RLENGTH + 1) return t1 tag nextil(t2); } return t1 "<" nextil(t2); } if(tag == "["){ if(!match(t2, /(\[.*\])|(\(.*\))/)) return t1 tag nextil(t2); match(t2, /^[^\]]*(\[[^\]]*\][^\]]*)*/) linktext = substr(t2, 1, RLENGTH) t2 = substr(t2, RLENGTH + 2); if(match(t2, /^\(/)){ match(t2, /^[^\)]+(\([^\)]+\)[^\)]*)*/) url = substr(t2, 2, RLENGTH - 1) pt2 = substr(t2, RLENGTH + 2) title = "" if(match(url, /[ ]+\".*\"[ ]*$/)){ title = substr(url, RSTART, RLENGTH) url = substr(url, 1, RSTART - 1) match(title, /\".*\"/) title = " title=\"" substr(title, RSTART + 1, RLENGTH - 2) "\""; } if(match(url, /^<.*>$/)) url = substr(url, 2, RLENGTH - 2) # url = eschtml(url) return t1 ""nextil(linktext)"" nextil(pt2); } } if(match(tag, /[*_]/)){ ntag = tag; if(sub("^" tag, "", t2)){ if(stag[ns] == tag && match(t2, "^" tag)) t2 = tag t2; else ntag = tag tag; } n = length(ntag) tag = (n == 2) ? "b" : "i" if(match(t1, / $/) && match(t2, /^ /)) return t1 tag nextil(t2) if(stag[ns] == ntag){ tag = "/" tag; ns--; } else stag[++ns] = ntag tag = "<" tag ">" return t1 tag nextil(t2); } } function inline(t){ ilcode = 0; ilcode2 = 0; ns = 0; return nextil(t); } function printp(tag){ if(!match(text, /^[ ]*$/)){ text = inline(text);if(tag != "") oprint("<" tag ">" text "" tag ">"); else oprint(text); } text = ""; } # function printp(tag){if(match(text,/^[ ]*$/)){text="";return}text=inline(text);if(tag=="p"){oprint("<"tag">"text)}else{oprint("<"tag">"text""tag">")};text=""} # ELSE function printp(tag){if(!match(text,/^[ ]*$/)){text=inline(text);if(tag=="p"){oprint("<"tag">"text)}else{oprint("<"tag">"text""tag">")}}text=""} BEGIN{blank=0;hr=0;nl=0;nr=0;text="";par="p";} { for(nnl = 0; nnl < nl; nnl++) if((match(block[nnl + 1], /[ou]l/) && !sub(/^( | )/, "")) || \ (block[nnl + 1] == "blockquote" && !sub(/^> ?/, ""))) break; } nnl < nl && !blank && text && ! /^ ? ? ?([*+-]|([0-9]+\.)+)( +| )/ { nnl = nl; } { hr = 0; } block[nl] ~ /[ou]l/ && /^$/ { blank = 1; next; } { newli = 0; } !hr && (nnl != nl || !text || block[nl] ~ /[ou]l/) && /^ ? ? ?[*+-]( +| )/ { sub(/^ ? ? ?[*+-]( +| )/, ""); nnl++; nblock[nnl] = "ul"; newli = 1; } newli { if(blank && nnl == nl && !par) par = "p"; blank = 0; printp(par); if(nnl == nl && block[nl] == nblock[nl]) oprint("