yi_Xu
菜单
置顶

python3 实现 hugo 站点中的 front matter 的修改

将网站的生成器换成 hugo 之后,希望整改一下我的 front matter ,奈何文档有点多,怕改错了,改漏了,所以写了一个小文件,修订一下我的 front matter 的内容,也为以后批量设置 front matter 打下基础。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
# -*- coding: utf-8 -*-

__author__ = 'yi_Xu'

import os
import chardet
import yaml

def get_files_name(dir='./content'):
    content = os.walk(dir)
    for path,dir_list,file_list in content:
        for file_name in file_list:
            yield(os.path.join(path, file_name))

def get_charset(dir):
    with open(dir, "rb") as f:
        data = f.read()
    return chardet.detect(data)

def get_meta_data(dir='./content/'):
    for file in get_files_name(dir=dir):
        meta_data = ''
        with open(file, 'r', encoding=get_charset(file)['encoding']) as f:
            start = False
            for line in f:
                if start == False:
                    if ((line == '---\n') or (line == '---\r\n')):
                        start = True
                else:
                    if ((line == '---\n') or (line == '---\r\n')):
                        break
                    else:
                        meta_data += line
        yield file, yaml.load(meta_data)

def change_meta_data(file, change_meta_data=''):
    meta_data = ''
    data = ''
    with open(file, 'rU', encoding=get_charset(file)['encoding']) as f:
        start = False
        content = False
        for line in f:
            if content == True:
                data += line
            if start == False:
                if ((line == '---\n') or (line == '---\r\n')):
                    start = True
            else:
                if ((line == '---\n') or (line == '---\r\n')):
                    content = True
                    start = False
                else:
                    meta_data += line
    if change_meta_data != '':
        try:
            os.remove(file)
        except Exception:
            print("remove {file} fail ".format(file=file))
            raise
        with open(file, 'w', encoding='utf-8') as f:
            f.write('---\n')
            f.write('{meta_data}'.format(meta_data=change_meta_data))
            f.write('---\n\n')
            f.write('{content}'.format(content=data))

def delete_meta_key(key, meta):
    try:
        meta.pop(key)
    except KeyError:
        pass
    finally:
        return meta

if __name__ == "__main__":
    for data in get_meta_data():
        print(data[0])
        fix_meta = data[1]

        # delete categories, fancebox, toc, donate, type, comments
        fix_meta = delete_meta_key('categories',fix_meta)
        fix_meta = delete_meta_key('fancebox',fix_meta)
        fix_meta = delete_meta_key('toc',fix_meta)
        fix_meta = delete_meta_key('donate',fix_meta)
        fix_meta = delete_meta_key('type',fix_meta)
        fix_meta = delete_meta_key('comments',fix_meta)

        # change tags to []
        try:
            if type(fix_meta['tags']) != str:
                fix_meta['tags'] = ','.join(fix_meta['tags'])
        except KeyError:
            fix_meta['tags'] = ''
        finally:
            fix_meta['tags'] = fix_meta['tags'].lower()
            fix_meta['tags'] = fix_meta['tags'].split(',')
            if fix_meta['tags'] == ['']:
                fix_meta.pop('tags')
        meta_data = yaml.dump(fix_meta, allow_unicode=True, \
                              indent=2, default_flow_style=False)

        # write change to md
        change_meta_data(data[0], change_meta_data=meta_data)
        print(fix_meta)