動機

已經有一年沒有動過這邊了,想來翻新一下。 但是想到過去與nodejs和hexo對抗的經驗,另外build一個site真的很久(超過10秒),所以決定換到hugo來

同時把架構簡化一下,之前category太複雜了

第一次嘗試: Stack

當下看theme覺得是最潮的,但是配置不好用(複雜),雖然後面有找到template直接改,但還是不懂怎麼加新的頁面,同時build site還是要花到好幾秒,我就放棄了

Now: PaperMod

配置簡單很多,但還是有一點坑

用module吧

主要是不想上submodule XD

加上

module:
  imports:
    path: github.com/adityatelange/hugo-PaperMod

之後拉mod

archive出現404

要自己生對應page的md

---
title: "Archive"
layout: "archives"
url: "/archives/"
summary: archives
---

自動把md改成page bundle

改成page bundle只要拿原本md的檔名改成folder name,之後mv md到folder/index.md就好

之前寫的leetcode要換category

之前寫的header大概長這樣

title: leetcode-61 - Rotate List
tags:
  - Two Pointers
  - Linked List
categories:
  - [Algorithm, Leetcode, seanprashad]
date: 2021-08-05 22:58:21

categories太複雜了,想把它放到tags去,變成

title: leetcode-61 - Rotate List
tags:
  - Two Pointers
  - Linked List
  - seanprashad
categories:
  - Leetcode
date: 2021-08-05 22:58:21

找了一輪沒有方便的md parser幫我做事,只好自己寫了 line by line處理的話就是就可以當成finite state machine來處理了

import re, sys

def trans(f,header, seenTop, cate):
    s = f.readline().strip()
    if s == '---':
        if seenTop:
            return
        else:
            trans(f,header, True, None)
    elif not s:
        trans(f,header, seenTop, cate)
    elif s[-1] == ':': # tags: , categories:
        header[s[:-1]] = []
        trans(f,header, seenTop, s[:-1])
    elif s[0] == ' ' or s[0] == '-':
        if ', Leetcode,' in s:
            pattern = r'\[.*,\s*([^]]*)\]'
        else:
            pattern = r'-\s*(.*)'
        header[cate].append(re.search(pattern, s).group(1))
        trans(f,header, seenTop, cate)
    else:
        ss = s.split(": ")
        header[ss[0]] = ss[1]
        trans(f,header, seenTop, None)

def mkHeader(h):
    title = f'title: {h["title"]}'
    date = f'date: {h["date"]}'
    tags = '\n'.join(["tags:"] + list(map(lambda x: "  - "+x, h["tags"]+h["categories"])))
    cate = f'categories:\n  - Leetcode'
    return f'---\n{title}\n{date}\n{cate}\n{tags}\n---'

with open(sys.argv[1]) as f:
    h={}
    trans(f, h, False, None)
    print(mkHeader(h))

之後就可以把新生出來的header用bash接到原本的檔案去了~~

等等,為什麼不在python直接append就好? 因為不知道為什麼python吐出來的東西會動到text encoding,會出現類似U+00a0之類的東西 所以只能用bash自己append

for p in $(ls *.md); do
	name=$(echo $p | cut -d'.' -f1)
	mkdir $name
	if [[ $name == leetcode* ]]; then
		python3 hi.py $p >> $p.tmp
		cat $p | awk '/^---$/ {if (!p) p=1; else p=0; next} !p' >> $p.tmp
		rm $p
		mv $p.tmp $p
	fi
	mv $p $name/index.md
done