readme目录自动生成

  • readme或markdown目录自动生成。
  • 使用脚本生成,可控。
"""
    module(main) - 生成readme的目录,脚本自动去掉第一个#以前的内容,并在开头添加目录.

    Main members:

        # __main__ - 主函数.
"""
import codecs
from collections import defaultdict
import re


def read_file_texts(file_name):
    """读取文件内容.

    Args:
        file_name: 文件名.

    Returns:
        文件内容列表,元素为每行.
    """
    with codecs.open(file_name, mode='r', encoding='utf8') as fr:
        texts = list()
        for line in fr:
            texts.append(line)
        return texts


def get_contents(file_texts):
    """ 获取内容列表,忽略掉开头的目录.

        @params:
            file_texts - 文件内容.

        @return:
            On success - 标题列表.
    """
    contents_lines = list()
    content_flag = False
    for row_data in file_texts:
        if not content_flag:
            # 正文开头判断,以单独的#作为开头
            re_obj = re.match('#+', row_data)
            if re_obj and len(re_obj.group()) == 1:
                content_flag = True
                contents_lines.append(row_data)
            continue
        contents_lines.append(row_data)
    return contents_lines


def get_head_texts(contents):
    """ 提取标题列表.

        @params:
            contents - 文件内容.

        @return:
            On success - 标题列表.
    """
    head_lines = list()
    code_line_flag = False
    # 提取标题文本,并对重复的文本自动补充后缀
    fixed_contents = list()
    head_count_dict = defaultdict(int)  # 初始化为 0
    for row_data in contents:
        # 代码注释判断
        if code_line_flag:
            if row_data.startswith('~~~'):
                code_line_flag = False
        elif row_data.startswith('~~~'):
            code_line_flag = True
        elif row_data.startswith('#'):
            head_count_dict[row_data] += 1
            head_count = head_count_dict[row_data]
            if head_count > 1:
                row_data = '{}-{}\n'.format(row_data.strip(), head_count)
            head_lines.append(row_data)
        fixed_contents.append(row_data)
    # 构造带有超链接的目录
    head_texts = list()
    for head_line in head_lines:
        level_chars = re.match('#+', head_line).group()
        head_text = head_line.lstrip(level_chars).strip()
        tab_str = ''.join(['  ' for i in range(len(level_chars)-1)])
        head_href_text = head_text.replace(' ', '-')
        head_texts.append('{}- [{}](#{})\n'.format(tab_str, head_text, head_href_text))
    return head_texts, fixed_contents


if __name__ == "__main__":
    """ readme生成目录.
    参考:https://github.com/houbb/markdown-toc/blob/master/doc/Github-MD-Href.md
    """
    file_ins = ['readme_tools.md', 'readme_model.md']
    for file_in in file_ins:
        file_texts = read_file_texts(file_in)
        contents = get_contents(file_texts)
        head_texts, contents = get_head_texts(contents)
        with codecs.open(file_in, mode='w', encoding='utf8') as fw:
            # 目录输出
            fw.write('**目录(Table of contents)**')
            fw.write('\n\n')
            for line in head_texts:
                fw.write(line)
                fw.write('\n')
            fw.write('\n')
            # 原始文本内容输出
            for line in contents:
                fw.write(line)
        print('{} 目录已更新完毕'.format(file_in))

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • width: 65%;border: 1px solid #ddd;outline: 1300px solid #...
    邵胜奥阅读 4,899评论 0 1
  • Home 关于Gitee Gitee 是开源中国社区[http://www.oschina.net]团队基于开源项...
    奋拓达阅读 2,293评论 0 3
  • Markdown[编辑]维基百科,自由的百科全书 本条目包含指南或教学内容。(2014年9月5日)请借由移除或重写...
    半片残枫阅读 876评论 0 1
  • 框架的介绍 框子:用一个规则来约束所有的程序员(就如同一个框,来存放同类物品,方便管理)架子:辅助程序员快速开发,...
    meteorites阅读 243评论 0 0
  • 一、接触灵性力量,渴望灵性成长 从大学毕业到进入工作状态、适应社会,我用了小5年的时间,这段时间,困惑、迷茫、焦虑...
    墨紫ya阅读 348评论 0 1