使用Python批量转换md为html

作者 by Doubt-Fact /

如果你手头有大量的Markdown文件需要转换为HTML,手动一个个转换显然是非常低效的。幸运的是,Python提供了强大的库和工具,可以帮助我们自动化这个过程。

以下是一个将指定目录下的Markdown文件转换为HTML文件的简单脚本,使用markdown库和highlightjs

markdown库

安装命令:

pip install markdown

使用清华源安装:

pip install markdown -i https://pypi.tuna.tsinghua.edu.cn/simple

需要注意的是这个库的一些拓展需要我们手动开启

例如,开启markdown拓展:

markdown.markdown(text, extensions=['markdown.extensions.extra'])

更多信息可以参考:

https://www.osgeo.cn/python-tutorial/text-markdown.html

这里给出一个示例代码,开启了拓展模块

import os  
import markdown  
  
def markdown_to_html(markdown_dir, html_dir):  
    if not os.path.exists(html_dir):  
        os.makedirs(html_dir)  
  
    # 扩展  
    extensions = ['markdown.extensions.extra']  
  
    for filename in os.listdir(markdown_dir):  
        if filename.endswith(".md"):  
            markdown_path = os.path.join(markdown_dir, filename)  
            html_path = os.path.join(html_dir, filename.replace(".md", ".html"))  
  
            try:  
                with open(markdown_path, 'r', encoding='utf-8') as md_file:  
                    md_content = md_file.read()  
                    # 使用扩展进行转换  
                    html_content = markdown.markdown(md_content, extensions=extensions)  
  
                with open(html_path, 'w', encoding='utf-8') as html_file:  
                    html_file.write(html_content)  
  
                print(f"Converted {markdown_path} to {html_path}")  
  
            except Exception as e:  
                print(f"Error converting {markdown_path}: {e}")  
  
# 调用函数进行转换  
markdown_directory = './ 
html_directory = './' 
markdown_to_html(markdown_directory, html_directory)

但是,我们发现,这样操作之后并没有开启代码高亮的效果并没有被有效触发。但检查生成的html代码发现代码部分已经被转换为了<pre><code>内联的代码。

面对这种情况,我们可以引入highlight.js来解决。

highlight.js

highlight.js是一个基于JavaScript的语法高亮工具,我们可以直接通过CDN引入(这里使用国内托管网站加速,同时引入了highlightjs-line-numbers.js用来显示行号)。

代码

import os  
import markdown  
  
def markdown_to_html(markdown_dir, html_dir):  
    if not os.path.exists(html_dir):  
        os.makedirs(html_dir)  
  
    # 扩展  
    extensions = ['markdown.extensions.extra']  
    # 头部和尾部要插入的内容  
    head_content = """  
    <link href="https://cdn.bootcdn.net/ajax/libs/highlight.js/11.9.0/styles/github.min.css" rel="stylesheet">  
    <style>  
        .codehilite {  
            padding: 0;  
        }  
        /* for block of numbers */  
        .hljs-ln-numbers {  
            -webkit-touch-callout: none;  
            -webkit-user-select: none;  
            -khtml-user-select: none;  
            -moz-user-select: none;  
            -ms-user-select: none;  
            user-select: none;  
            text-align: center;  
            color: #ccc;  
            border-right: 1px solid #CCC;  
            vertical-align: top;  
            padding-right: 5px;  
        }  
        .hljs-ln-n {  
            width: 30px;  
        }  
        /* for block of code */  
        .hljs-ln .hljs-ln-code {  
            padding-left: 10px;  
            white-space: pre;  
        }  
    </style>  
    """  
  
    body_content = """  
    <script src="https://cdn.bootcdn.net/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>  
    <script src="https://cdn.bootcdn.net/ajax/libs/highlightjs-line-numbers.js/2.8.0/highlightjs-line-numbers.min.js"></script>  
    <script>  
        hljs.initHighlightingOnLoad();  
        hljs.initLineNumbersOnLoad();  
    </script>  
    """  
  
    for filename in os.listdir(markdown_dir):  
        if filename.endswith(".md"):  
            markdown_path = os.path.join(markdown_dir, filename)  
            html_path = os.path.join(html_dir, filename.replace(".md", ".html"))  
  
            try:  
                with open(markdown_path, 'r', encoding='utf-8') as md_file:  
                    md_content = md_file.read()  
                    # 转换  
                    html_content = markdown.markdown(md_content, extensions=extensions)  
  
                title = filename.replace(".md", "")
                # 添加头部和尾部内容  
                html_content = f"<html>\n<head>\n<title>{title}</title>{head_content}</head>\n{html_content}\n<body>{body_content}</body>\n</html>"  
  
                with open(html_path, 'w', encoding='utf-8') as html_file:  
                    html_file.write(html_content)  
  
                print(f"Converted {markdown_path} to {html_path}")  
  
            except Exception as e:  
                print(f"Error converting {markdown_path}: {e}")  
  
# 调用函数进行转换  
markdown_directory = './'  
html_directory = './'  
markdown_to_html(markdown_directory, html_directory)

效果

效果图

评论已关闭