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
|
import os
import re
import json
import urllib.parse
CONTENT_DIR = "content"
OUTPUT_FILE = "data/highlights.json"
# 匹配 Hugo 文章中的 ==高亮==
highlight_pattern = re.compile(r"==(.+?)==")
# 匹配 front matter(支持 yaml 格式)
title_pattern = re.compile(r'^title:\s*["\']?(.+?)["\']?\s*$', re.MULTILINE)
slug_pattern = re.compile(r'^slug:\s*["\']?(.+?)["\']?\s*$', re.MULTILINE)
results = []
for root, _, files in os.walk(CONTENT_DIR):
for f in files:
if f.endswith(".md"):
path = os.path.join(root, f)
with open(path, "r", encoding="utf-8") as file:
content = file.read()
# 提取 title
title_match = title_pattern.search(content)
title = title_match.group(1) if title_match else os.path.basename(path)
# 提取 slug(如果有就替换默认 URL)
slug_match = slug_pattern.search(content)
if slug_match:
slug = slug_match.group(1).strip("/")
# 用目录推断 section,比如 content/post/abc.md => /post/slug/
rel_dir = os.path.relpath(root, CONTENT_DIR).replace("\\", "/")
url = f"/{rel_dir}/{slug}/" if rel_dir != "." else f"/{slug}/"
else:
# 默认 Hugo URL 规则:相对路径去掉 .md
url = "/" + os.path.relpath(path, CONTENT_DIR).replace("\\", "/").replace(".md", "/")
# 提取高亮
highlights = highlight_pattern.findall(content)
if highlights:
highlight_links = []
for h in highlights:
encoded = urllib.parse.quote(h, safe="")
link = f"{url}#:~:text={encoded}"
highlight_links.append({"text": h, "link": link})
results.append({
"title": title,
"url": url,
"highlights": highlight_links
})
# 写入 data 文件夹
os.makedirs(os.path.dirname(OUTPUT_FILE), exist_ok=True)
with open(OUTPUT_FILE, "w", encoding="utf-8") as f:
json.dump(results, f, ensure_ascii=False, indent=2)
print(f"✔ 提取完成,共 {len(results)} 篇文章有高亮,已写入 {OUTPUT_FILE}")
|