文章目录

  • 0.思路引导
  • 1.在文中插入目录
  • 2.在页面的任何地方插入目录
  • 3.美化标题的锚点 URL

0.思路引导

Markdown 在解析内容的同时还可以自动提取整个内容的目录结构,本文内容将从以下几个方面展开:
1)在文中插入目录;
2)在页面的任何地方插入目录;
3)美化标题的锚点 URL。

1.在文中插入目录

博客的 Post(文章)模型,其中 body 是我们存储 Markdown 文本的字段:

文件位置:blog/models.py

from django.db import modelsclass Post(models.Model):# Other fields ...body = models.TextField()

再来回顾一下文章详情页的视图,我们在 detail 视图函数中将 post 的 body 字段中的 Markdown 文本解析成了 HTML 文本,然后传递给模板显示
文件位置:blog/views.py

def detail(request, pk):post = get_object_or_404(Post, pk=pk)post.body = markdown.markdown(post.body,extensions=['markdown.extensions.extra','markdown.extensions.codehilite','markdown.extensions.toc',])return render(request, 'blog/detail.html', context={'post': post})

markdown.markdown() 方法把 post.body 中的 Markdown 文本解析成了 HTML 文本。同时我们还给该方法提供了一个 extensions 的额外参数。其中 markdown.extensions.toc 就是自动生成目录的拓展。

在渲染 Markdown 文本时加入了 toc 拓展后,就可以在文中插入目录了。方法是在书写 Markdown 文本时,在你想生成目录的地方插入 [TOC] 标记即可。

后台输入如下:

效果展示如下:

2.在页面的任何地方插入目录

上述方式的一个局限性就是只能通过 [TOC] 标记在文章内容中插入目录。如果想在页面的其它地方,比如侧边栏插入一个目录该怎么做呢?只需要稍微改动一下解析 Markdown 文本内容的方式即可。

以detail.py中的模板标签{% block toc %}为例,其渲染的位置位于详情页的侧边栏,现在想要在侧边栏中生成目录。

{% block toc %}
...
{% endblock toc %}

需要修改的代码如下:

文件位置:blog/views.py

def detail(request, pk):post = get_object_or_404(Post, pk=pk)md = markdown.Markdown(extensions=['markdown.extensions.extra','markdown.extensions.codehilite','markdown.extensions.toc',])post.body = md.convert(post.body)m = re.search(r'<div class="toc">\s*<ul>(.*)</ul>\s*</div>', md.toc, re.S)post.toc = m.group(1) if m is not None else ''return render(request, 'blog/detail.html', context={'post': post})

文件位置:detail.html

{% block toc %}{% if post.toc %}<div class="widget widget-content"><h3 class="widget-title">文章目录</h3><div class="toc"><ul>{{ post.toc|safe }}</ul></div></div>{% endif %}
{% endblock toc %}

在这里,我们没有直接用 markdown.markdown() 方法来渲染 post.body 中的内容,而是先实例化了一个 markdown.Markdown 对象 md,和 markdown.markdown() 方法一样,也传入了 extensions 参数。

接着我们便使用该实例的 convert 方法将 post.body 中的 Markdown 文本解析成 HTML 文本。而一旦调用该方法后,实例 md 就会多出一个 toc 属性,这个属性的值就是内容的目录,我们把 md.toc 的值通过整个表达式的处理,赋给 post.toc 。

注意:为了防止文章目录为空的情况,使用正则表达式来测试 ul 标签中是否包裹有元素,从而来确定是否存在目录。并使用新的模板标签 {% if %},来对post.toc做条件判断。

效果展示如下:

3.美化标题的锚点 URL

文章内容的标题被设置了锚点,点击目录中的某个标题,页面就会跳到该文章内容中标题所在的位置,这时候浏览器的 URL 显示的值可能不太美观,比如像下面的样子:

#1_1 就是锚点,Markdown 在设置锚点时利用的是标题的值,由于通常我们的标题都是中文,Markdown 没法处理,所以它就忽略的标题的值,而是简单地在后面加了个1 _1 这样的锚点值。为了解决这一个问题,需要修改一下传给 extentions 的参数,其具体做法如下:

文件位置:blog/views.py

from django.utils.text import slugify
from markdown.extensions.toc import TocExtensiondef detail(request, pk):post = get_object_or_404(Post, pk=pk)md = markdown.Markdown(extensions=['markdown.extensions.extra','markdown.extensions.codehilite',# 记得在顶部引入 TocExtension 和 slugifyTocExtension(slugify=slugify),])post.body = md.convert(post.body)m = re.search(r'<div class="toc">\s*<ul>(.*)</ul>\s*</div>', md.toc, re.S)post.toc = m.group(1) if m is not None else ''return render(request, 'blog/detail.html', context={'post': post})

和之前不同的是,extensions 中的 toc 拓展不再是字符串 markdown.extensions.toc ,而是 TocExtension 的实例。

TocExtension 在实例化时其 slugify 参数可以接受一个函数,这个函数将被用于处理标题的锚点值。

Markdown 内置的处理方法不能处理中文标题,所以我们使用了 django.utils.text 中的 slugify 方法,该方法可以很好地处理中文。

效果展示如下:

Diango博客--6.Markdown 文章自动生成目录相关推荐

  1. HelloDjango 第 10 篇:小细节 Markdown 文章自动生成目录,提升阅读体验

    目录 在文中插入目录 在页面的任何地方插入目录 处理空目录 美化标题的锚点 URL 作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 上 ...

  2. 计算机目录排版的文章,自动生成目录,论文排版看这一篇就够了

    很多同学写论文时候,对于排版比较纠结.一般各大高校对版面要求都大同小异,下面塔尖君就给大家介绍一下,论文排版的注意事项: 自动生成目录 因为本人使用的是wps软件,而不是word.主要原因是wps体积 ...

  3. 给博客园添加文章自动目录

    设置页脚 设置侧边栏 以上目录都是从h2开始生成 转载于:https://www.cnblogs.com/helloworld0604/p/9370222.html

  4. word生成html包含目录,word2007自动生成目录,目录里包含有正文,怎么办

    word2007自动生成目录,目录里包含有正文,怎么办 相关说明: 请看,显示级别那项,1级,2级,3级文本显示的都没有正文的,可是目录生成出来就是有 大刚视图中确认大刚级别为"正文文本&q ...

  5. csdn博客页面内任意自动跳转(附编写截图),自动目录,超链接跳转,MarkDown编辑器(默认编辑器)

    文章目录 1.跳转方式 1.1 使用自动目录跳转 1.2 使用超链接跳转 1.2.1 跳转站外网址 1.2.2 跳转本页面任意地方 1.3使用html方式跳转(只能实现预览页跳转,实际跳转会失败) 1 ...

  6. activiti高亮显示图片_第 09 篇:让博客支持 Markdown 语法和代码高亮

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到HelloGitHub-Team 仓库[1] 为了让博客文章具有良好的排版,显示更加丰富的格式,我们使用 Markdown 语法 ...

  7. Django博客--5.让博客支持 Markdown 语法和代码高亮

    文章目录 0.前言 1.安装 Python Markdown 2.在 detail 视图中解析 Markdown 3.safe 标签 4.代码高亮 5.效果展示 0.前言 Markdown 是一种 H ...

  8. markdown引入代码_第 09 篇:让博客支持 Markdown 语法和代码高亮

    作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到HelloGitHub-Team 仓库[1] 为了让博客文章具有良好的排版,显示更加丰富的格式,我们使用 Markdown 语法 ...

  9. 改进博客园Markdown显示功能(加代码行号、显示代码所用编程语言)

    博客园的markdown模式下的代码高亮功能使用的是highlight.js,没有行号和显示相应编程语言的功能,只好自己将其改造了一下(将这两种功能一并实现了)~ 先看一下效果,再详细介绍方法~ 查看 ...

最新文章

  1. mysql中获取一天、一周、一月时间数据的各种sql语句写法
  2. 5g理论速度_5G时代手机基带厂商实力比拼
  3. 136. Leetcode 47. 全排列 II (回溯算法-排列问题)
  4. IsWindow函数的作用
  5. nodejs 定时 mysql_nodejs 使用 mysql
  6. Codeforces Round #674 (Div. 3)
  7. centos6.5 rpm安装mysql_CentOS6.5系统下RPM包安装MySQL5.6(转)
  8. 和bmc_热固性BMC的注塑成型介绍
  9. swoole task MySQL连接池
  10. C 语言 —— ! 和 ~(感叹号和波浪号)
  11. 《深度学习Python实践》第13章——审查回归算法
  12. 网易云音乐云盘存歌曲加歌词
  13. VS2015 C#程序打包成.exe之installshield使用教程
  14. 树莓派4b--红外遥控模块
  15. 自动控制原理学习笔记(二)线性定常连续控制系统的数学模型
  16. AI 可靠性论文整理
  17. 18款最佳Bug跟踪管理系统
  18. 如何构建关系型数据库
  19. UVa 紫书50题留念
  20. 运放稳定性连载12:RO何时转变为ZO?(1)

热门文章

  1. 牛人学习h264运动估计的方法
  2. IDEA 中的.iml文件和.idea文件夹 ( 隐藏方式 )
  3. protocol buffer使用小例
  4. MAC 安装 pygraphviz 找不到头文件
  5. CSS实现树形结构 + js加载数据
  6. Apache - Storm
  7. apache.commons.lang.StringUtils 使用心得
  8. redhat 6.6 安装 (LVM)
  9. 组建内存双通道的条件
  10. .NET高级代码审计(第三课)Fastjson反序列化漏洞