概述###

Markdown 很适合于技术写作,因为技术写作并不需要花哨的排版和内容, 只要内容生动而严谨,文笔朴实而优美。

为了编写对读者更友好的文章,有必要生成文章的标题导航,让读者有个预期的阅读概览。当文章标题比较多时,手工去编写导航锚点比较费时,因此决定使用Python解析Markdown文档自动生成标题导航。

知识与思路###

写过Markdown的人知道,Markdown的标题是使用一到六个# 左右包围住标题文字,而锚点是 [标题](#标题)。 比如 ## 知识与思路 ## ,锚点连接是 [知识与思路](#知识与思路)。标题文字允许包含空格,不过最好不要用空格或特殊不可打印字符,因为在网页上点击带锚点的链接时可能失效,并且网站对Markdown锚点的支持可能有特殊规则,比如博客园会将标题中的大写字母自动转成小写字母,并且对于有空格的标题可能无法链接到锚点。

这样,就需要解析标题行,从中提取出标题并生成锚点链接。通常使用正则表达式来匹配和提取文本内容。此外,为了排版,也要根据标题的级别生成相应的缩进。考虑到段落中很可能含有#字符,因此标题最好从第二级开始,不超过四级。

标题行的正则表达式是:

\s*(#{2,6})\s*(.*?)\s*(?:\1)\s+

知识点:

  1. 2-6 个#号使用 #{2,6} 匹配;
  2. 由于行起始和标题前后都可能含有空格,因此需要使用\s*来兼容;行末尾至少有个换行符,因此要使用 \s+;
  3. 使用(subregex)捕获 subregex 匹配的文本, 使用 \1 表示后面与前面对应的被匹配的分组文本, 使用 (?:subregex) 表示匹配 subregex 的文本,但在捕获分组时忽略,不作为提取内容;
  4. 使用 (.*?) 匹配标题内容, ? 表示非贪婪模式,避免将 # 也包含到标题中;
  5. 标题的缩进比较简单,第二级的不缩进,第N级缩进 (N-2)个指定字符,这里字符选定为中文空格  
  6. 程序会接受一系列 Markdown 文档的文件路径参数,并输出对应于每个文件的导航文本;由于参数比较简单,就不使用 argparse 这样的参数解析模块了;
  7. 使用: 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文档中自动生成标题导航的更多相关文章

  1. 【技术博客】利用Python将markdown文档转为html文档

    利用Python将markdown文档转为html文档 v1.0 作者:FZK 元素简单的md文件 Python中自带有一个markdown库,你可以直接这样使用 md_file = open(&qu ...

  2. 如何在Markdown文档中插入空格?

    简单说 在 Markdown 文档中,可以直接采用 HTML 标记插入空格(blank space),而且无需任何其他前缀或分隔符.具体如下所示: 插入一个空格 (non-breaking space ...

  3. 01将图片嵌入到Markdown文档中

    将图片内嵌入Markdown文档中 将图片嵌入Markdown文档中一直是一个比较麻烦的事情.通常的做法是将图片存入本地某个路径或者网络存储空间,使用URL链接的形式插入图片: ![image][ur ...

  4. python实现解析markdown文档中的图片,并且保存到本地~

    背景 前阵子简书好像说是凉了,搞得我有点小慌,毕竟我的大部分博客都是放在简书上面的,虽然简书提供了打包导出功能,但是只能导出文字,图片的话还是存在简书服务器上面,再加上我一直想要重新做一个个人博客,于 ...

  5. 2018-10-04 [日常]用Python读取word文档中的表格并比较

    最近想对某些word文档(docx)的表格内容作比较, 于是找了一下相关工具. 参考Automate the Boring Stuff with Python中的word部分, 试用了python-d ...

  6. 用python把技术文档中,每个模块系列截图生成一个动态GIF

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 最近在写技术文档的时候,发现一个问题.对于每个技术步骤,都需要一个截图,这 ...

  7. 第一节:python提取PDF文档中的图片

    由于项目需要将PDF文档当中的图片转换成图片,所以参考了这篇文章https://blog.csdn.net/qq_15969343/article/details/81673302后项目得以解决. 1 ...

  8. 如何制作dll库的API文档,自动生成微软风格的chm文件 Sandcastle Help File Builder 使用方法

    当你开发了一个库的时候,就需要给库开发一个api文档,微软提供了一个C#库的自动生成工具.我在使用的过程中记录了相关的信息,以供大家学习和查阅,如有不正之处,欢迎指出. 首先先下载一个软件,下载地址在 ...

  9. 吴裕雄--天生自然python学习笔记:python文档操作自动生成菜单 Word 文件

    许多学校营养午餐的菜单是由教师来轮流制作 ,这是一个 比较烦锁的工作,如 果能自动用教师最熟悉的 Word 文件来生成一个菜单文件,使教师对生成的菜单稍作 修改即可使用,那将是一个不错的主意. 案例要 ...

随机推荐

  1. ecmall源码中的 function _config_view()-关于重写

    ecmall中类库的继承过程: defaultAPP->MallbaseApp->FrontendApp->EcBaseApp->BaseApp->Object 在bas ...

  2. 2017技术核心——Spring

    从毕业从事Java WEB开始到现在已差不多快5年时间了,一直使用的Spring相关的技术,其实最主要的是SpringMVC这一块.其实,一直停留在用的地步,并不知晓其原理,真正耐下心来去研究Spri ...

  3. c++代码中,使用svn版本号作为程序版本号的实现方法

    1.编写版本模板文件 #ifndef _VERSIONSVN_H_#define _VERSIONSVN_H_#define VER_REVISIONSVN $WCREV$#endif //!_VER ...

  4. mysql中影响myisam引擎写入性能的三项设置

    一.LOW_PRIORITY1.对于myisam默认是写操作优先,读操作滞后.通过该项更改,可以使读操作优先,写操作在有空闲的时候再写入.但该项可能在理论上造成,写被永远阻塞. SQL语句中使用示例: ...

  5. git学习手册

    #git学习手册 git: Git是一个开源的分布式版本控制系统,可以有效.高速的处理从很小到非常大的项目版本管理.[2] Git 是 Linus Torvalds 为了帮助管理 Linux内核开发而 ...

  6. jquery的$().each,$.each的区别

    在jquery中,遍历对象和数组,经常会用到$().each和$.each(),两个方法.两个方法是有区别的,从而这两个方法在针对不同的操作上,显示了各自的特点. $().each,对于这个方法,在d ...

  7. openfire使用自定义用户表

    转自:http://blog.csdn.net/nomousewch/article/details/7546083 在最近的项目中使用openfire服务器实现消息推送功能,如果使用openfire ...

  8. iOS:崩溃统计工具Crashlytics的使用

    一.介绍 随着苹果在世界火热起来,移动端app的开发如火如荼,同时催生出了一批对app进行统计的开发工具,诸如:国内的友盟统计.国外的Flurry移动端统计.国外的Crashlytics统计等,Cra ...

  9. 英康手机订单系统APP使用说明

    1.登陆手机APP 输入卖家提供的账号和密码登陆APP. 2.商品购买列表 可以在全部商品.促销商品.收藏商品.最近订购.再次购买等几种商品列表下把商品加入购物车: 3.加入商品到购物车 点击商品列表 ...

  10. 设置文本框左边显示的View

    效果: