python解析Markdown標題生成帶目錄結構的文件(pyMd2Doc)
阿新 • • 發佈:2019-01-06
1. pyMd2Doc介紹(pip版本)
利用python將markdown轉換成帶可收縮,可跳轉到文字內容的目錄文件。
2. 使用方法
該程式所需python環境為python3或以上。
2.1 準備Markdown檔案
準備好需要轉成文件的Markdown檔案。
2.2 安裝pyMd2Doc
用pip install pyMd2Doc
安裝程式
2.3 開始轉換
- 新建
[yourFileName]
.py檔案,準備所需要轉換的markdown檔案,如myMarkdown.md
- 引入所需模組,呼叫函式並傳入需要轉換的markdown檔案,如下示例:
#固定寫法,需要引用pyMd2Doc的模組
from pymd2doc import createDoc
# 要轉換的markdown檔案,如myMarkdown.md
#雙引號內為要轉換的markdown檔名稱
createDoc.create("myMarkdown")
- 執行成功後會生成myMarkdown.html檔案
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