更换原因

Hexo 作为博客引擎长期以来使用还是非常方便的。

但由于其本身是基于nodejsnpm,其中使用到的各种npm库的嵌套依赖关系十分杂乱。有可能因為某个子包出BUG而导致引用了该包的所有库均出现各种问题。

已经受够了长期以来明明没有更新文章,但本地却需要保持各种npm包为较新的版本所花费的额外精力。

所以干脆直接更换为基本没有三方依赖的 Hugo,并自己重写了自己使用的主题。

如果有Hugo用户恰好喜欢这款主题,欢迎使用: Fika theme for Hugo

Hexo文章 转 Hugo文章 的脚本

hexo_to_hugo.py

# pip install yaml
# usage: python hexo_to_hugo.py
import os
import re
import yaml

# fill default date with this GMT zone
GMT = '+08:00' # for SG time zone

HEADER_FLAG = '---\n'

def file_lines(fname):
    f = open(fname, "r", encoding='utf-8')
    ret = f.readlines()
    f.close()
    return ret


def parser_head_lines(lines: list[str]) -> list[str]:
    header_lines = list[str]([])
    in_header = False
    for i, line in enumerate(lines):
        if line == HEADER_FLAG:
            if not in_header:
                in_header = True
                continue
            else:  # header end flag founded
                break
        if in_header:
            header_lines.append(line)
    return header_lines


def revise_header_flag(lines):
    revised = False
    if len(lines) == 0:
        return lines, revised
    if lines[0] == HEADER_FLAG:
        return lines, revised
    lines.insert(0, HEADER_FLAG)
    revised = True
    return lines, revised


def revise_header_content(header_lines: list[str]):
    revised = False
    for i, line in enumerate(header_lines):
        # date line
        rdate = re.search(r'date:\s+(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})', line, re.M)
        if rdate:  # date line for need revise to TZ format
            header_lines[i] = f'date: {rdate.group(1)}-{rdate.group(2)}-{rdate.group(3)}T{rdate.group(4)}:{rdate.group(5)}:{rdate.group(6)}{GMT}\n'
            revised = True

    # revise for tags and categories to type list
    header_revised = False
    header = yaml.safe_load(''.join(header_lines))
    if 'categories' in header: # make sure categories are type list
        categories = header['categories']
        if not isinstance(categories, list):
            if categories == None:
                header['categories'] = []
            else:
                header['categories'] = [categories]
            header_revised = True

    if 'tags' in header: # make sure tags are type list
        tags = header['tags']
        if not isinstance(tags, list):
            if tags == None:
                header['tags'] = []
            else:
                header['tags'] = [tags]
            header_revised = True

    if header_revised:
        header_lines = yaml.dump(header, default_flow_style=False, allow_unicode=True).splitlines(True)
        revised = True
    return header_lines, revised


def save_file(fname, lines):
    f = open(fname, 'w', encoding='utf-8', newline='\n')
    f.writelines(lines)
    f.close()


def main():
    HEADER_FLAG = '---\n'
    print('--- starting revise for posts... ---')
    POST_PATH = os.path.join('content', 'posts')
    posts_count = 0
    header_flag_revised_count = 0
    header_revised_count = 0
    files = os.listdir(POST_PATH)
    for fname in files:
        fullpath = os.path.join(POST_PATH, fname)
        if not os.path.isfile(fullpath):
            continue
        lines = file_lines(fullpath)
        lines, header_flag_revised = revise_header_flag(lines)
        if header_flag_revised:
            print(f'revised header flag: {fname}')
            header_flag_revised_count += 1
        header_lines = parser_head_lines(lines)
        body_lines = lines[len(header_lines)+2:]  # skip two header flag lines
        header_lines, header_revised = revise_header_content(header_lines)
        if header_revised:
            print(f'revised date: {fname}')
            header_revised_count += 1
        if header_flag_revised or header_revised:
            print(f'save revised file: {fname}')
            header_lines.insert(0, HEADER_FLAG)
            header_lines.append(HEADER_FLAG)
            save_file(fullpath, header_lines + body_lines)
        posts_count += 1
    print(f'--- revise over. ---\nposts: {posts_count}\nheader flag revised: {header_flag_revised_count}\nheader revised: {header_revised_count}')


if __name__ == "__main__":
    main()

使用方法: 进入 Hugo 站点根目录运行

python hexo_to_hugo.py

脚本下载: hexo_to_hugo.py

最近用 Github 比较频繁,无意间点开 GitHub Pages 的代码库时发现一个大大的 Dependabot alerts 顶在上面

点开后发现最大的一个警告就是这个:

顺着这个 dependencies 一路追查发现是 hexo-prism-plugin 这个插件使用的 由于该插件太久没更新,而且发现 hexo.io 最新版本已经集成了 prism 的代码高亮功能 所以更新 Hexo 版本并启用自带的代码高亮功能应该就可以解决了

解决方法

  1. 卸载 hexo-prism-plugin 插件
  2. 更新所有相关 dependencies 到最新版本
  3. 配置 _config.yml
prismjs:
  enable: true
  preprocess: true
  line_number: true
  tab_replace: '    '
  1. 重新生成

引用文章: Syntax Highlighting | Hexo

突然心血来潮想把自己的笔记用阿里云CDN加速一下,但域名就需要备案。 而我本身的域名不想因为备案就迁回到国内的域名服务商(这里有一段在国内购买域名的黑历史) 所以干脆重新购买了一个新的域名 www.kaij.cn 用来备案

直接在阿里云上面买域名可以不用等迁移的时间 顺便一说,使用阿里云的快速备案服务来备案真的太方便了

但备案的时候遇到了一点小问题,之前起的博客名称无法用于备案,收到了提示:

网站名称“ 李略帅 ”不合格,个人网站名称不能涉及到行业、企业等信息,且个人网站名称请勿涉及个人姓名、地名,请不要用纯数字或字母组成,不能包含特殊符号,不能使用成语;网站名称请使用3个以上汉字命名,请不能使用XXX个人空间、资讯、网站、网络、网址、爱好者、作品展示、工作室、平台、主页、热线、社团、导航这种的格式命名;网站名称中不能带有博客、论坛、在线、社区、交流等字样,若要带有此类信息,需提交前置审批文;具体命名要求请参考专区文章:https://help.aliyun.com/knowledge_detail/36948.html#title-lhm-b1g-ehx

按照这些要求来说 XXX的个人博客XXX的个人主页 这类肯定是不行了。由于也禁止使用成语,所以想翻翻字典来找个合适的名字也不行。 想来想去似乎只有一句话类型的语言不容易触犯到这些规则。而经常有一些日系的电视电影起的名字我觉得就非常有创意。 刚好之前看过日本由百分之九十九的码农都会沉浸在她笑容里的公民老婆 Gakki(日文原名:新垣 結衣 出演的两部剧:

  • 《逃避虽然可耻但有用》(日文:逃げるは恥だが役に立つ)
  • 《胜利即是正义》(日文:リーガルハイ)

剧集给我的印象非常深刻。所以抱着试一试的心态填了一个,结果认证了我的猜想。像这样的一句话通常不会触犯到起名规则,可以顺利通过审核。

所以现在我的笔记多出了一个用于国内用户快速访问的通道 https://www.kaij.cn 国外用户依然可以使用之前的域名继续访问 https://www.leelib.com

毕竟出身一名程序员就不能少了使用 GitHub Pages 这样优秀的服务创建一个属于自己的小港湾,去记录一些生活中的点点滴滴。 (๑•̀ㅂ•́)و✧

之前的高亮插件支持的语言比较少,而且效果不是特别理想。特进行了一次修整,内容如下:

  • 由于hexo的更新导致之前的主题出现了一部分显示错误。目前已经修复
  • 启用 hexo-prism-plugin 插件
  • 重新过了一遍文章并重新优化 code-block 部分文章