使Python-Markdown自动生成的目录(TOC)支持中文标题¶
Python-Markdown
可以通过toc
扩展抽取文章中的各级标题并自动生成目录。但是默认情况下,它只支持英文标题,处理中文标题时会忽略中文,产生奇怪的id
。
问题复现¶
我们通常使用类似如下的代码来生成toc:
import markdown
# markdown文本示例,包含了若干中文标题
txt = '''
# 大标题demo
## 章节a
## 章节b
'''
md = markdown.Markdown(extensions=['toc']) # 使用toc扩展
html = md.convert(txt)
toc = md.toc
print(html) # 输出从markdown文本生成的html
print()
print(toc) # 输出从markdown文本生成的目录
上述脚本输出的内容如下(为方便查看,美化了下缩进):
<h1 id="demo">大标题demo</h1>
<h2 id="a">章节a</h2>
<h2 id="b">章节b</h2>
<div class="toc">
<ul>
<li><a href="#demo">大标题demo</a>
<ul>
<li><a href="#a">章节a</a></li>
<li><a href="#b">章节b</a></li>
</ul>
</li>
</ul>
</div>
从输出可以看出,toc插件为各个标题自动产生的id
很奇怪,只留下了英文,丢失了中文。
解决方案¶
toc插件将生成标题id的功能叫做slugify
,我们可以修改slugify
行为。示例代码:
import markdown
from markdown.extensions.toc import TocExtension, slugify_unicode
# markdown文本示例,包含了若干中文标题
txt = '''
# 大标题demo
## 章节a
## 章节b
'''
md = markdown.Markdown(extensions=[TocExtension(slugify=slugify_unicode)]) # 使用支持中文的toc扩展
html = md.convert(txt)
toc = md.toc
print(html) # 输出从markdown文本生成的html
print()
print(toc) # 输出从markdown文本生成的目录
注意上述代码中的md = markdown.Markdown(extensions=[TocExtension(slugify=slugify_unicode)])
,老代码里的'toc'
被换为TocExtension(slugify=slugify_unicode)
,后者修改了toc插件的slugify
函数。
输出:
<h1 id="大标题demo">大标题demo</h1>
<h2 id="章节a">章节a</h2>
<h2 id="章节b">章节b</h2>
<div class="toc">
<ul>
<li><a href="#大标题demo">大标题demo</a>
<ul>
<li><a href="#章节a">章节a</a></li>
<li><a href="#章节b">章节b</a></li>
</ul>
</li>
</ul>
</div>
可以看到,这里的标题id
是包含中文的。
本文为kyleblog.cn原创,转载请注明出处:https://www.kyleblog.cn/posts/python_markdown_toc_chinese
发布日期:2022-08-14 联系作者