python解析Markdown标题生成带目录结构的文档(pyMd2Doc)

用途:
将md格式转化为html格式,可用于一般md文档转html,md电子书转html,快速制作电子书。

github地址:
https://github.com/yuleMeng/pyMd2Doc

1. pyMd2Doc介紹(pip版本)

利用python将markdown转换成带可收缩,可跳转到文本内容的目录文档。

2. 使用方法

该程序所需python环境为python3或以上。

2.1 准备Markdown文件

准备好需要转成文档的Markdown文件。

2.2 安装pyMd2Doc

pip install pyMd2Doc 安装程序

2.3 开始转换

2.3.1 md文件转html

  1. 新建[yourFileName].py文件,准备所需要转换的markdown文件,如myMarkdown.md
  2. 引入所需模块,调用函数并传入需要转换的markdown文件,如下示例:
#固定写法,需要引用pyMd2Doc的模块
from pymd2doc import createDoc

# 要转换的markdown文件,如myMarkdown.md
#双引号内为要转换的markdown文件名称
createDoc.create("myMarkdown")

  1. 执行成功后会生成myMarkdown.html和static文件夹。

2.3.2 String型的md内容转html

  1. 引入所需模块,调用函数并传入String型的md内容,如下示例:
from pymd2doc import createDoc

str = u'''
	此处是String型的md内容
	'''
# param strs 传入MD字符串
# param myMarkdown 定义将要生成html文件名称
# return myMarkdown.html
createDoc.createByString(strs, "myMarkdown")

  1. 执行成功后会生成myMarkdown.html和static文件夹。

2.4 查看文档

用浏览器打开刚刚生成的myMarkdown.html文件。
点击目录可以跳转到相应文档内容。
左侧目录如果有子目录可以点击“+”或者“-”小图标进行目录的收缩和展开操作。

目前版本页面风格如下
在这里插入图片描述

原理解析:

markdown的文本中标题的级别用# 来区分,如下:

# 1. 一级标题
文本内容文本内容文本内容文本内容文本内容
## 1.1 二级标题
文本内容文本内容文本内容文本内容
## 1.2 二级标题
文本内容文本内容文本内容文本内容
### 1.2.1三级标题
文本内容文本内容文本内容文本内容
### 1.2.1三级标题
文本内容文本内容文本内容文本内容
## 1.3 二级标题
文本内容文本内容文本内容文本内容
# 2. 一级标题
文本内容文本内容文本内容文本内容
# 3. 一级标题
文本内容文本内容文本内容文本内容

我们需要解析它的目录关系得到父子关系的json, 解析json成可收缩的目录结构,并且给目录结构加上锚标记的超链接实现点击目录跳转到文本内容。

解析目录的方法如下:

def getMenu(filename):
    titles = []
    global heading
    headId = 1
    current = None
    preCurrent = '$'
    parentID = 0
    with open(filename, 'r', encoding='UTF-8') as f:
        for i in f.readlines():
            title = {}
            if not re.match(pattern, i.strip(' \t\n')):
                continue
            i = i.strip(' \t\n')
            current = i.split(' ')[0]
            # 当前标题级别比前一个小,则当前标题的父类标题是上一个的headId
            # 注释:#越多级别越小
            # 不论大多少个级别,只要父类级别大就是它的父类
            if len(current) > len(preCurrent):
                parentID = headId - 1
                # 更新当前级别父类
                updateHeading(current, parentID)
            # 当前级别比父类级别大,则去heading中寻找记录过的父类级别
            # 注释:#越少级别越大
            elif len(current) < len(preCurrent):
                length = len(current)
                # 当在文中出现一级标题的时候还原所有父类级别到初始值
                if length == 1:
                    formatHeading()
                    # 给当父类结果类赋值
                    parentID = 0
                else:
                    getVal = heading['heading%r' % length]
                    # 如果有记录过该级别的父类项
                    if getVal != -1:
                        parentID = getVal
                    # 改级别项没有记录则依次向上找父类,指导找到一级标题
                    else:
                        for j in range(length, 1, -1):
                            tempVal = heading['heading%r' % j]
                            if tempVal != -1:
                                parentID = tempVal
                                break
            titleName = i[len(current):].strip(' \t\n')
            title['titleName'] = titleName
            title['titleID'] = headId
            title['parentID'] = parentID
            titles.append(title)
            # print(headId, current, parentID)
            preCurrent = current
            headId += 1
    # print(titles)
    return titles
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值