zoukankan      html  css  js  c++  java
  • 用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('转换完成')
    
  • 相关阅读:
    体温单时间控件
    搭建Android 开发环境(精华)
    即时通讯
    车牌识别系统
    JSON 生成 C# Model
    Arduino 视频教程
    .Net主线程扑捉子线程中的异常
    用C#操作IIS创建虚拟目录和网站
    C#中简单的this与get的用法(string,decimal)
    c#读取Excel数据到Gridview
  • 原文地址:https://www.cnblogs.com/bpf-1024/p/14118167.html
Copyright © 2011-2022 走看看