1. 程式人生 > >python解析Markdown標題生成帶目錄結構的文件(pyMd2Doc)

python解析Markdown標題生成帶目錄結構的文件(pyMd2Doc)

1. pyMd2Doc介紹(pip版本)

利用python將markdown轉換成帶可收縮,可跳轉到文字內容的目錄文件。

2. 使用方法

該程式所需python環境為python3或以上。

2.1 準備Markdown檔案

準備好需要轉成文件的Markdown檔案。

2.2 安裝pyMd2Doc

pip install pyMd2Doc 安裝程式

2.3 開始轉換

  1. 新建[yourFileName].py檔案,準備所需要轉換的markdown檔案,如myMarkdown.md
  2. 引入所需模組,呼叫函式並傳入需要轉換的markdown檔案,如下示例:
#固定寫法,需要引用pyMd2Doc的模組
from pymd2doc import createDoc # 要轉換的markdown檔案,如myMarkdown.md #雙引號內為要轉換的markdown檔名稱 createDoc.create("myMarkdown")
  1. 執行成功後會生成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