作者 by Doubt-Fact /
如果你手头有大量的Markdown文件需要转换为HTML,手动一个个转换显然是非常低效的。幸运的是,Python提供了强大的库和工具,可以帮助我们自动化这个过程。
以下是一个将指定目录下的Markdown文件转换为HTML文件的简单脚本,使用markdown
库和highlightjs
。
安装命令:
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
是一个基于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)
评论已关闭