使用Python从Markdown文档中自动生成标题导航
概述###
Markdown 很适合于技术写作,因为技术写作并不需要花哨的排版和内容, 只要内容生动而严谨,文笔朴实而优美。
为了编写对读者更友好的文章,有必要生成文章的标题导航,让读者有个预期的阅读概览。当文章标题比较多时,手工去编写导航锚点比较费时,因此决定使用Python解析Markdown文档自动生成标题导航。
知识与思路###
写过Markdown的人知道,Markdown的标题是使用一到六个# 左右包围住标题文字,而锚点是 [标题](#标题)。 比如 ## 知识与思路 ## ,锚点连接是 [知识与思路](#知识与思路)。标题文字允许包含空格,不过最好不要用空格或特殊不可打印字符,因为在网页上点击带锚点的链接时可能失效,并且网站对Markdown锚点的支持可能有特殊规则,比如博客园会将标题中的大写字母自动转成小写字母,并且对于有空格的标题可能无法链接到锚点。
这样,就需要解析标题行,从中提取出标题并生成锚点链接。通常使用正则表达式来匹配和提取文本内容。此外,为了排版,也要根据标题的级别生成相应的缩进。考虑到段落中很可能含有#字符,因此标题最好从第二级开始,不超过四级。
标题行的正则表达式是:
\s*(#{2,6})\s*(.*?)\s*(?:\1)\s+
知识点:
- 2-6 个#号使用 #{2,6} 匹配;
- 由于行起始和标题前后都可能含有空格,因此需要使用\s*来兼容;行末尾至少有个换行符,因此要使用 \s+;
- 使用(subregex)捕获 subregex 匹配的文本, 使用 \1 表示后面与前面对应的被匹配的分组文本, 使用 (?:subregex) 表示匹配 subregex 的文本,但在捕获分组时忽略,不作为提取内容;
- 使用 (.*?) 匹配标题内容, ? 表示非贪婪模式,避免将 # 也包含到标题中;
- 标题的缩进比较简单,第二级的不缩进,第N级缩进 (N-2)个指定字符,这里字符选定为中文空格
 
- 程序会接受一系列 Markdown 文档的文件路径参数,并输出对应于每个文件的导航文本;由于参数比较简单,就不使用 argparse 这样的参数解析模块了;
- 使用: python mdnav.py filename1 filename2 ... filenameN
代码实现###
#!/usr/bin/python
#_*_encoding:utf-8_*_
##########################################################################
# mdnav.py: Generate nav anchors for given markdown files
# usage: python mdnav.py md_filename1 md_filename2 ... md_filenameN
##########################################################################
import re
import sys
mdTitleRegex = r'\s*(#{2,6})\s*(.*?)\s*(?:\1)\s+'
mdTitlePatt = re.compile(mdTitleRegex)
def parseLineByRegex(line, regex_patt):
m = regex_patt.match(line)
return m.groups() if m else ()
def outputAnchor(titleTuple):
if len(titleTuple) == 2:
intents = ' ' * (len(titleTuple[0])-2)
title = titleTuple[1]
anchor = '[%s](#%s)' % (title, title)
print intents,anchor
def procLine(line):
outputAnchor(parseLineByRegex(line, mdTitlePatt))
def help():
print '%s usage: need at least one param as markdown filename' % sys.argv[0]
print 'python %s filename1 filename2 ... filenameN' % sys.argv[0]
if __name__ == '__main__':
if len(sys.argv) < 2:
help()
exit(1)
for ind in range(1, len(sys.argv)):
filename = sys.argv[ind]
print 'file: ', filename
with open(filename) as mdtext:
map(procLine, mdtext.readlines())
使用Python从Markdown文档中自动生成标题导航的更多相关文章
- 【技术博客】利用Python将markdown文档转为html文档
利用Python将markdown文档转为html文档 v1.0 作者:FZK 元素简单的md文件 Python中自带有一个markdown库,你可以直接这样使用 md_file = open(&qu ...
- 如何在Markdown文档中插入空格?
简单说 在 Markdown 文档中,可以直接采用 HTML 标记插入空格(blank space),而且无需任何其他前缀或分隔符.具体如下所示: 插入一个空格 (non-breaking space ...
- 01将图片嵌入到Markdown文档中
将图片内嵌入Markdown文档中 将图片嵌入Markdown文档中一直是一个比较麻烦的事情.通常的做法是将图片存入本地某个路径或者网络存储空间,使用URL链接的形式插入图片: ![image][ur ...
- python实现解析markdown文档中的图片,并且保存到本地~
背景 前阵子简书好像说是凉了,搞得我有点小慌,毕竟我的大部分博客都是放在简书上面的,虽然简书提供了打包导出功能,但是只能导出文字,图片的话还是存在简书服务器上面,再加上我一直想要重新做一个个人博客,于 ...
- 2018-10-04 [日常]用Python读取word文档中的表格并比较
最近想对某些word文档(docx)的表格内容作比较, 于是找了一下相关工具. 参考Automate the Boring Stuff with Python中的word部分, 试用了python-d ...
- 用python把技术文档中,每个模块系列截图生成一个动态GIF
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 最近在写技术文档的时候,发现一个问题.对于每个技术步骤,都需要一个截图,这 ...
- 第一节:python提取PDF文档中的图片
由于项目需要将PDF文档当中的图片转换成图片,所以参考了这篇文章https://blog.csdn.net/qq_15969343/article/details/81673302后项目得以解决. 1 ...
- 如何制作dll库的API文档,自动生成微软风格的chm文件 Sandcastle Help File Builder 使用方法
当你开发了一个库的时候,就需要给库开发一个api文档,微软提供了一个C#库的自动生成工具.我在使用的过程中记录了相关的信息,以供大家学习和查阅,如有不正之处,欢迎指出. 首先先下载一个软件,下载地址在 ...
- 吴裕雄--天生自然python学习笔记:python文档操作自动生成菜单 Word 文件
许多学校营养午餐的菜单是由教师来轮流制作 ,这是一个 比较烦锁的工作,如 果能自动用教师最熟悉的 Word 文件来生成一个菜单文件,使教师对生成的菜单稍作 修改即可使用,那将是一个不错的主意. 案例要 ...
随机推荐
- 大端小端系统_union_栈的增长方向
一道题引发的思考: 1.看一下之前写的union的特点,理解一下共享内存的概念 2.栈的增长方向是从高地址向低地址增长(数组比较特别,a[0]在低地址,a[n-1]在高地址)(堆由低地址到高地址存储) ...
- 百度地图 获取两点坐标之间的驾车距离(非直线距离) c#
百度接口了解: http://lbsyun.baidu.com/index.php?title=webapi/route-matrix-api-v2 起点与终点为多对多关系,如果你只想取两个坐标,那就 ...
- mvc ef LINQ to Entities 不识别方法“Int32 Parse(System.String)”,因此该方法无法转换为存储表达式。
private sys_User GetUserInfo() { sys_User model = null; var userId = Convert.ToInt32(AccountHelper.G ...
- 《项目经验》--通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中
先看一下我要实现的功能界面: 这个界面的功能在图中已有展现,课程分配(教师教授哪门课程)在之前的页面中已做好.这个页面主要实现的是授课,即给老师教授的课程分配学生.此页面实现功能的步骤已在页面 ...
- yii2 model层中配置常量与list
- CSS技巧和经验:
1. 如何清除图片下方出现几像素的空白间隙 方法1 img { display: block; } 方法2 img { vertical-align: top; } // 除了top值,还可以设置为t ...
- JAVASE02-Unit010: 多线程基础 、 TCP通信
多线程基础 . TCP通信 * 当一个方法被synchronized修饰后,那么 * 该方法称为同步方法,即:多个线程不能同时 * 进入到方法内部执行. package day10; /** * 当多 ...
- ubuntu server 12.04U盘安装,提示无法挂载安装光盘或光盘读取数据出错
今天用Ultraiso将Ubuntu server 12.04 刻入U盘中安装系统,中间提示错误:1.检测不到cdrom(即U盘没有挂载上):2.从光盘中读取数据出错.问题如下图所示: 上网搜了下解决 ...
- Hibernate操作指南-实体之间的关联关系(基于注解)
- C#读取Excel表格数据到DataGridView中和导出DataGridView中的数据到Excel
其实想在datagridview中显示excel表格中的数据跟读取数据库中的数据没什么差别,只不过是创建数据库连接的时候连接字段稍有差别. private void btnShow_Click(obj ...