用python實現markdown轉html


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('轉換完成')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM