今天心血來潮,寫了一個 Markdown 轉換器。
import os, re,webbrowser text = """ # TextHeader ## Header1 List - 1 - 2 - 3 > **quote** 》 quote2 ## Header2 1. *斜體* 2. [@以茄之名](https://www.zhihu.com/people/e4f87c3476a926c1e2ef51b4fcd18fa3) 3、 ![](https://pic4.zhimg.com/v2-8560440c136c746730a63813ed701f52_is.jpg) ## Header3 `*[文章地址](https://zhuanlan.zhihu.com/p/39742445)*` ·**code1**· - [x]是否點贊 """
程序開頭先處理一些行內的語法,比如 code、strong、i 等,用正則直接替換:
text = re.sub(re.compile("([`·])([^`·]+)[`·]"), r"2
", text)
text = re.sub(re.compile("**([^*]+)**"), r"1", text)
text = re.sub(re.compile("([^*])*([^*]+)*"), r"12", text)
接著是復雜一點的圖片和鏈接:
text = re.sub(re.compile("([^!])[([^]]+)](([^)]+))"), r"12", text) text = re.sub(re.compile("![([^]]*)](([^)]+))"), r" %s """ % (p_html, line)
因為有序列表和無序列表的區別是頭尾的ol和ul,所以要用 list_flag 變量來判斷
elif re.match("[+-*] ", line): if list_flag == "": html += "
處理完后處理其他的語法:
else: if list_flag != "": html += "%s> " % list_flag list_flag = "" if re.match("#+", line): well = re.match("#+", line).group().count("#") line = re.sub("#+", "", line) html += "%s " % (well, line, well) elif re.match("[>》 ]", line): line = re.sub("^s*[>》 ]", "", line) html += "%s" % (line) # elif re.match("[>》 ]", line): # line = re.sub("^s*[>》 ]", "", line) # html += "%s" % (line) else: html += line
這里我稍微修改了一點,讓 > 和 》 都可以轉換成引用,主要是切換中英文標點太難了。
然后就是添加 CSS,自己改了一點馬克飛象的進去,因為他的引用做得很漂亮:
with open("markdown.html", "w", encoding="utf-8")as f: f.write("""