<filename>z.py
# -*- coding:utf-8 -*-

import argparse
import os
import re
import json
import datetime

BASE_DIR = os.path.dirname(os.path.abspath(__file__))  # 当前目录地址
ARTICLES_DIR = os.path.join(BASE_DIR, "articles")  # 日志目录
CONFIGJSON = 'config.json'
SUIYANVERSION = "1.0.0"  # 程序版本
# 匹配文章数据的正则
DIVRE = '<div class="blog-article">?([\s\S]*?)</div>'


def create_blog_data_Json(adir):
    '''
    递归获得当前目录及其子目录中所有的.md文件列表。
    并创建blog的data索引JSON
    :param adir: 文章日志所在目录
    :return: json字符串
    '''
    data_json = []
    # 当前目录下所有的文件、子目录、子目录下的文件。
    for root, dirs, files in os.walk(adir):
        # print(root)
        # print(dirs)
        # print(files)  
        for name in files:
            # 值读取.md
            if name.endswith('.md'):
                url = root.replace(ARTICLES_DIR, '') + '\\' + name.replace('.md', '')  # 最后需要组装的相对目录
                furl = os.path.join(root, name)  # 当前文件的绝对目录
                if getmd(furl):
                    datahtml = getmd(furl)  # 取回当前.md文件的HTML头部信息
                    f_data = getjson(datahtml)  # 获取.md的文章信息HTML转化成数组
                    f_data["url"] = url
                    data_json.append(f_data)  # 添加到需要返回的数据数组中

    data_json.sort(key=lambda x: x["time"], reverse=True)  # 对数组进行降序排序
    data_json_str = json.dumps(data_json, ensure_ascii=False)  # 转化为json字符串

    return data_json_str


def write_data_json(json_str):
    '''
    创建blog索引.json
    :param json_str: json 字符串
    :return:
    '''
    with open(os.path.join(os.path.dirname(__file__), 'blog_data.json'), mode='w', encoding='utf-8') as f:
        f.write(json_str)


def getmd(md):
    '''
    获得md文件内容，并返回md文件头部的文章信息HTML。
    :param md 文件地址
    :return: 存在则返回字符串，没有头部文件信息的返回flase
    '''
    # print(md)
    s = ""
    with open(os.path.join(md), encoding='utf-8') as f:
        s = f.read()
    if re.match(DIVRE, s) != None:
        return re.match(DIVRE, s).group()
    else:
        return False


def getjson(s):
    '''
    获取.md的文章信息HTML转化成数组
    :param s: 待解析的HTML字符串
    :return: 配置信息数组
    '''
    arr = re.findall('<.* class="(.*)">(.*?)</.*>', s)
    data = {}
    for a in arr:
        data[a[0]] = a[1]
    return data


def create_blog(title, author, pagename, tag):
    '''
    创建一篇空白的新blog
    :param title: blog标题
    :param author: blog作者默认为空的话前段渲染为站长昵称，转载可以添加佚名或是原作者。
    :param tag: 标签 默认为为分类
    :param dir 存放目录
    :param pagename: 当前页面的name 例如"hello188.md",如果为空默认为年月日时间字符串
    :return: 
    '''
    # 文章创建时间
    create_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
    if not tag:
        tag = '未分类'
    dir = tag
    if pagename == '':
        pagename = datetime.datetime.now().strftime("%Y%m%d%H%M")
    if author == '':
        # 从配置文件里加载站长为作者
        with open(os.path.join(os.path.dirname(__file__), CONFIGJSON), mode='r', encoding='utf-8') as f:
            data = json.load(f)
            author = data['blog_author']
    # print(author,tag,pagename)
    # 组装最后生成的文章保存目录
    # blogpath = os.path.join(ARTICLES_DIR, dir)
    # 最后需要生成的文件
    blogfile = os.path.join(ARTICLES_DIR, os.path.join(dir, pagename + '.md'))

    # 将文件路径分割出来
    file_dir = os.path.split(blogfile)[0]
    # 判断文件路径是否存在，如果不存在，则创建，此处是创建多级目录
    if not os.path.isdir(file_dir):
        os.makedirs(file_dir)

    article_url = '\\' + dir + '\\' + pagename
    # print(blogpath)
    bloghtml = '<div class="blog-article">\n\
    <h1><a href="p.html?p=' + article_url + '" class="title">' + title + '</a></h1>\n\
    <span class="author">' + author + '</span>\n\
    <span class="time">' + create_time + '</span>\n\
    <span><a href="tags.html?t=' + tag + '" class="tag">' + tag + '</a></span>\n\
    </div><br/>\n\n## 可以开始写blog啦(*￣︶￣)'

    if os.path.isfile(blogfile):
        print('文件存在相同名称，创建失败。')
        return False
    else:
        with open(blogfile, mode='w', encoding='utf-8') as f:
            f.write(bloghtml)
        print('blog文章.md创建成功！')
        return True
    # print(getjson(str))


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("-v", "--version", help="查询程序版本", action="store_true")
    parser.add_argument("-i", "--index", help="更新索引blog数据json", action="store_true")
    parser.add_argument("-n", "--newblog", help="创建新日志，请输入标题（必填）。", )
    parser.add_argument("-t", "--tag", default='Linux', help="请输入blog的标签TAG")
    parser.add_argument("-a", "--author", help="请输入文章作者，默认调用站长昵称", default='xiashuobad')
    parser.add_argument("-p", "--pagename", help="请输入文章地址页面名称", default='UOS系统(arm64)下从源码编译安装qt5.15.2')
    # parser.add_argument("-d", "--dir", help="请输入文章地址所属目录", default='')

    args = parser.parse_args()
    if args.version:
        print(SUIYANVERSION)
    elif args.newblog:
        is_or_not_success = create_blog(title=args.newblog, author=args.author, tag=args.tag, pagename=args.pagename)
        if is_or_not_success:
            jsonstr = create_blog_data_Json(ARTICLES_DIR)
            write_data_json(jsonstr)
            print("blog_data.json索引文件更新完毕！")
    elif args.index:
        jsonstr = create_blog_data_Json(ARTICLES_DIR)
        write_data_json(jsonstr)
        print("blog_data.json索引文件更新完毕！")
    else:
        print(parser.print_help())  # 默认打印帮助


if __name__ == "__main__":
    main()

<filename>z.py
# -*- coding:utf-8 -*-

import argparse
import os
import re
import json
import datetime

BASE_DIR = os.path.dirname(os.path.abspath(__file__))  # 当前目录地址
ARTICLES_DIR = os.path.join(BASE_DIR, "articles")  # 日志目录
CONFIGJSON = 'config.json'
SUIYANVERSION = "1.0.0"  # 程序版本
# 匹配文章数据的正则
DIVRE = '<div class="blog-article">?([\s\S]*?)</div>'


def create_blog_data_Json(adir):
    '''
    递归获得当前目录及其子目录中所有的.md文件列表。
    并创建blog的data索引JSON
    :param adir: 文章日志所在目录
    :return: json字符串
    '''
    data_json = []
    # 当前目录下所有的文件、子目录、子目录下的文件。
    for root, dirs, files in os.walk(adir):
        # print(root)
        # print(dirs)
        # print(files)  
        for name in files:
            # 值读取.md
            if name.endswith('.md'):
                url = root.replace(ARTICLES_DIR, '') + '\\' + name.replace('.md', '')  # 最后需要组装的相对目录
                furl = os.path.join(root, name)  # 当前文件的绝对目录
                if getmd(furl):
                    datahtml = getmd(furl)  # 取回当前.md文件的HTML头部信息
                    f_data = getjson(datahtml)  # 获取.md的文章信息HTML转化成数组
                    f_data["url"] = url
                    data_json.append(f_data)  # 添加到需要返回的数据数组中

    data_json.sort(key=lambda x: x["time"], reverse=True)  # 对数组进行降序排序
    data_json_str = json.dumps(data_json, ensure_ascii=False)  # 转化为json字符串

    return data_json_str


def write_data_json(json_str):
    '''
    创建blog索引.json
    :param json_str: json 字符串
    :return:
    '''
    with open(os.path.join(os.path.dirname(__file__), 'blog_data.json'), mode='w', encoding='utf-8') as f:
        f.write(json_str)


def getmd(md):
    '''
    获得md文件内容，并返回md文件头部的文章信息HTML。
    :param md 文件地址
    :return: 存在则返回字符串，没有头部文件信息的返回flase
    '''
    # print(md)
    s = ""
    with open(os.path.join(md), encoding='utf-8') as f:
        s = f.read()
    if re.match(DIVRE, s) != None:
        return re.match(DIVRE, s).group()
    else:
        return False


def getjson(s):
    '''
    获取.md的文章信息HTML转化成数组
    :param s: 待解析的HTML字符串
    :return: 配置信息数组
    '''
    arr = re.findall('<.* class="(.*)">(.*?)</.*>', s)
    data = {}
    for a in arr:
        data[a[0]] = a[1]
    return data


def create_blog(title, author, pagename, tag):
    '''
    创建一篇空白的新blog
    :param title: blog标题
    :param author: blog作者默认为空的话前段渲染为站长昵称，转载可以添加佚名或是原作者。
    :param tag: 标签 默认为为分类
    :param dir 存放目录
    :param pagename: 当前页面的name 例如"hello188.md",如果为空默认为年月日时间字符串
    :return: 
    '''
    # 文章创建时间
    create_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
    if not tag:
        tag = '未分类'
    dir = tag
    if pagename == '':
        pagename = datetime.datetime.now().strftime("%Y%m%d%H%M")
    if author == '':
        # 从配置文件里加载站长为作者
        with open(os.path.join(os.path.dirname(__file__), CONFIGJSON), mode='r', encoding='utf-8') as f:
            data = json.load(f)
            author = data['blog_author']
    # print(author,tag,pagename)
    # 组装最后生成的文章保存目录
    # blogpath = os.path.join(ARTICLES_DIR, dir)
    # 最后需要生成的文件
    blogfile = os.path.join(ARTICLES_DIR, os.path.join(dir, pagename + '.md'))

    # 将文件路径分割出来
    file_dir = os.path.split(blogfile)[0]
    # 判断文件路径是否存在，如果不存在，则创建，此处是创建多级目录
    if not os.path.isdir(file_dir):
        os.makedirs(file_dir)

    article_url = '\\' + dir + '\\' + pagename
    # print(blogpath)
    bloghtml = '<div class="blog-article">\n\
    <h1><a href="p.html?p=' + article_url + '" class="title">' + title + '</a></h1>\n\
    <span class="author">' + author + '</span>\n\
    <span class="time">' + create_time + '</span>\n\
    <span><a href="tags.html?t=' + tag + '" class="tag">' + tag + '</a></span>\n\
    </div><br/>\n\n## 可以开始写blog啦(*￣︶￣)'

    if os.path.isfile(blogfile):
        print('文件存在相同名称，创建失败。')
        return False
    else:
        with open(blogfile, mode='w', encoding='utf-8') as f:
            f.write(bloghtml)
        print('blog文章.md创建成功！')
        return True
    # print(getjson(str))


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("-v", "--version", help="查询程序版本", action="store_true")
    parser.add_argument("-i", "--index", help="更新索引blog数据json", action="store_true")
    parser.add_argument("-n", "--newblog", help="创建新日志，请输入标题（必填）。", )
    parser.add_argument("-t", "--tag", default='Linux', help="请输入blog的标签TAG")
    parser.add_argument("-a", "--author", help="请输入文章作者，默认调用站长昵称", default='xiashuobad')
    parser.add_argument("-p", "--pagename", help="请输入文章地址页面名称", default='UOS系统(arm64)下从源码编译安装qt5.15.2')
    # parser.add_argument("-d", "--dir", help="请输入文章地址所属目录", default='')

    args = parser.parse_args()
    if args.version:
        print(SUIYANVERSION)
    elif args.newblog:
        is_or_not_success = create_blog(title=args.newblog, author=args.author, tag=args.tag, pagename=args.pagename)
        if is_or_not_success:
            jsonstr = create_blog_data_Json(ARTICLES_DIR)
            write_data_json(jsonstr)
            print("blog_data.json索引文件更新完毕！")
    elif args.index:
        jsonstr = create_blog_data_Json(ARTICLES_DIR)
        write_data_json(jsonstr)
        print("blog_data.json索引文件更新完毕！")
    else:
        print(parser.print_help())  # 默认打印帮助


if __name__ == "__main__":
    main()

# -*- coding:utf-8 -*- # 当前目录地址 # 日志目录 # 程序版本 # 匹配文章数据的正则 递归获得当前目录及其子目录中所有的.md文件列表。     并创建blog的data索引JSON     :param adir: 文章日志所在目录     :return: json字符串 # 当前目录下所有的文件、子目录、子目录下的文件。 # print(root) # print(dirs) # print(files) # 值读取.md # 最后需要组装的相对目录 # 当前文件的绝对目录 # 取回当前.md文件的HTML头部信息 # 获取.md的文章信息HTML转化成数组 # 添加到需要返回的数据数组中 # 对数组进行降序排序 # 转化为json字符串 创建blog索引.json     :param json_str: json 字符串     :return: 获得md文件内容，并返回md文件头部的文章信息HTML。     :param md 文件地址     :return: 存在则返回字符串，没有头部文件信息的返回flase # print(md) 获取.md的文章信息HTML转化成数组     :param s: 待解析的HTML字符串     :return: 配置信息数组 创建一篇空白的新blog     :param title: blog标题     :param author: blog作者默认为空的话前段渲染为站长昵称，转载可以添加佚名或是原作者。     :param tag: 标签 默认为为分类     :param dir 存放目录     :param pagename: 当前页面的name 例如"hello188.md",如果为空默认为年月日时间字符串     :return: # 文章创建时间 # 从配置文件里加载站长为作者 # print(author,tag,pagename) # 组装最后生成的文章保存目录 # blogpath = os.path.join(ARTICLES_DIR, dir) # 最后需要生成的文件 # 将文件路径分割出来 # 判断文件路径是否存在，如果不存在，则创建，此处是创建多级目录 # print(blogpath) ## 可以开始写blog啦(*￣︶￣)' # print(getjson(str)) # parser.add_argument("-d", "--dir", help="请输入文章地址所属目录", default='') # 默认打印帮助