KyleBlog.cn 文章 标签 关于
文章 标签 关于

使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 联系作者