1. 前言
現在markdown已經是非常常用的記錄工具了,整齊的排版、代碼高亮、圖片表格樣樣齊全,同時也支持html標簽,是非常好用的一種工具(語法)。
那么今天來分享一下使用python實現markdown文件轉為html,而且也能很好顯示代碼和整齊的排版。
2. 正文
2.1 使用到的庫
markdown
python-markdown-math
markdown_checklist
pymdown-extensions
2.2 文章思路
首先找了一些參考資料,發現有很多人也實現了這個功能,但最全面的非XerCis莫屬了,講的非常全面,轉換也很到位。
本文的主要功能是講markdown轉為html,在上述博客中還帶有轉換為pdf的功能,但個人覺得轉為pdf沒什么必要,在此就沒添加上了。除此之外,在原有的基礎上添加了文章目錄的小模塊,算是一點小小的改進吧。
2.3 功能代碼
這里就直接上代碼了>>>
import os
try:
from markdown import markdown
except ModuleNotFoundError as e:
os.system("pip install markdown")
os.system("pip install python-markdown-math")
os.system("pip install markdown_checklist")
from markdown import markdown
try:
from pymdownx import superfences
except ModuleNotFoundError as e:
os.system("pip install pymdown-extensions")
from pymdownx import superfences
class mdtox:
def __init__(self, md_filename, encoding='utf-8'):
self.md_filename = md_filename
self.encoding = encoding
self.__args()
def __args(self):
self.html = '''
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, minimal-ui">
<title>{}</title>
<link rel="stylesheet" href="https://files.cnblogs.com/files/bpf-1024/linenum.css">
<link rel="stylesheet" href="https://files.cnblogs.com/files/bpf-1024/markdown.css">
<link rel="stylesheet" href="https://files.cnblogs.com/files/bpf-1024/tasklist.css">
<link rel="stylesheet" href="https://files.cnblogs.com/files/bpf-1024/codehighlight.css">
<link rel="stylesheet" href="https://files.cnblogs.com/files/bpf-1024/directory.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex/dist/katex.min.css" crossorigin="anonymous">
<script src="https://files.cnblogs.com/files/bpf-1024/directory.js"></script>
<script src="https://unpkg.com/mermaid@8.7.0/dist/mermaid.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/katex/dist/katex.min.js" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/katex/dist/contrib/mathtex-script-type.min.js" defer></script>
</head>
<body>
<article class="markdown-body" id="markdown-body">
{}
</article>
</body>
</html>
'''
# 擴展配置
self.extensions = [
'toc', # 目錄,[toc]
'extra', # 縮寫詞、屬性列表、釋義列表、圍欄式代碼塊、腳注、在HTML的Markdown、表格
]
third_party_extensions = [
'mdx_math', # KaTeX數學公式,$E=mc^2$和$$E=mc^2$$
'markdown_checklist.extension', # checklist,- [ ]和- [x]
'pymdownx.magiclink', # 自動轉超鏈接,
'pymdownx.caret', # 上標下標,
'pymdownx.superfences', # 多種塊功能允許嵌套,各種圖表
'pymdownx.betterem', # 改善強調的處理(粗體和斜體)
'pymdownx.mark', # 亮色突出文本
'pymdownx.highlight', # 高亮顯示代碼
'pymdownx.tasklist', # 任務列表
'pymdownx.tilde', # 刪除線
]
self.extensions.extend(third_party_extensions)
self.extension_configs = {
'mdx_math': {
'enable_dollar_delimiter': True # 允許單個$
},
'pymdownx.superfences': {
"custom_fences": [
{
'name': 'mermaid', # 開啟流程圖等圖
'class': 'mermaid',
'format': superfences.fence_div_format
}
]
},
'pymdownx.highlight': {
'linenums': True, # 顯示行號
'linenums_style': 'pymdownx-inline' # 代碼和行號分開
},
'pymdownx.tasklist': {
'clickable_checkbox': True, # 任務列表可點擊
}
}
def to_html(self, html_name):
try:
with open(self.md_filename, "r", encoding=self.encoding) as file_md:
md_text = file_md.read()
except Exception as e:
print("<Error>", e)
return False
title = '.'.join(os.path.basename(self.md_filename).split('.')[:-1])
html_text = markdown(md_text, output_format='html', extensions=self.extensions, extension_configs=self.extension_configs) # MarkDown轉HTML
self.html = self.html.format(title, html_text)
try:
with open(html_name, 'w', encoding=self.encoding) as file_html:
file_html.write(self.html)
except Exception as e:
print("<Error>", e)
return False
return True
2.4 使用方法
這里我封裝了下載依賴庫,所以只要運行python代碼即可。其中的js文件、css文件都在我的博客文件中,所以只要有網都可以輕松訪問生成的html文件,若想離線使用,就把需要的文件下載到本地,然后引入即可。
或者你可以選擇創建一個虛擬環境:博客園
# 本測試與上述代碼在同個文件中
if __name__ == '__main__':
md_name = "E:/java.md"
html_name = "E:/java.html"
if(mdtox(md_name).to_html(html_name)):
print('轉換完成')