python 實現 md文檔自動編號


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')



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM