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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章