1. 原理
正則匹配對相應字符串進行替換
2. 運行方法
python md_convert.py [a.md, b.md,...] # 轉換給定文檔
或
python md_convert.py # 轉換目錄下所有的md文檔
3. 效果
4. 代碼
#coding:utf-8 """ ---------------------------------------- description: md文檔格式化處理類 為md文檔自動生成標題編號; 如已有編號,更新之; 支持 1-6 級標題; 標題格式:##,###,####,#####,###### 如給定參數則轉換給定文件; 如未給定參數則轉換目錄下所有md文檔。 author: sss date: ---------------------------------------- change: ---------------------------------------- """ __author__ = 'sss' import os import sys import re # 工具對象 def pr_type(i, info=''): print(info, i, type(i)) class MdDocProcessing(object): """ md文檔格式化處理類 為md文檔自動生成標題編號; 如已有編號,自動更新; 更新1-6 級標題; 標題格式支持:##,###,####,#####,###### 如給定參數則轉換給定文件; 如未給定參數則轉換目錄下所有md文檔。 """ def __init__(self): pass def start_processing(self, *ar): #self._command_check() doc_list = sys.argv[1:] if len(doc_list) == 0: doc_list = [x for x in os.listdir() if x.endswith('.md')] res = input("將轉換以下文檔:\n%s\nY(回車)/N?:" % doc_list) if res in 'yY': pass else: return #print(doc_list) for _ in doc_list: if not _.endswith(r'.md'): print('參數格式錯誤: %s '%(_), '\n請輸入.md格式文件。') return for _ in doc_list: self.title_style_convert(_) print("文檔<%s>轉換完成。"%(_, )) def title_style_convert(self, file_name): """ 標題自動編號 編號格式為: 1.1.1. 標題 :param file_name: :return: """ title_num_cur = [0]*6 # 匹配正則表達式 reg = r'^((#{2,6})[\s\d\.]{0,})(.*)$' pattern = re.compile(reg) # 輸出文件對象 res_file = open('_' + file_name, 'w', encoding='utf-8') with open(file_name, 'r', encoding='utf-8') as fi: line = fi.readline() while line: res = re.match(pattern, line) if res: length = len(res.group(2)) title_num_cur, title_str = self._title_nuber_process(title_num_cur, length) line = res.group(2) + ' ' + title_str + res.group(3) + '\n' res_file.write(line) line = fi.readline() # 關閉輸出文件 res_file.close() #os.rename(file_name, file_name + '.tmp') # 刪除原文件 os.remove(file_name) # 將輸出文件改為原文件名 os.rename('_' + file_name, file_name) return def _command_check(self): #print(sys.argv) cmd_params = sys.argv[1:] if len(cmd_params) <= 0: self.help() exit() def _title_nuber_process(self, title_num, length=0): """ 根據目錄級別及前一標題編號返回新編號 :param title_num: 前一標題編號 list :param length: 標題級別 int :return: res: 標號 str """ if length == 0: return '' title_num_z = [0]*6 title_num[length-2] += 1 title_num = title_num[:length-1] + title_num_z[length-1:] res = '.'.join(str(x) if x else '1' for x in title_num[:length-1]) + '. ' return (title_num, res) @staticmethod 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]) def start(): so = MdDocProcessing() so.start_processing() def _test(): so = MdDocProcessing() so.start_processing() pass if __name__ == '__main__': #_test() start() pass # pr_type('s')