自動化拆分筆記,釋放 Zettelkasten 筆記法的真正力量
背景
在這個資訊爆炸的時代,管理和整理知識變得尤為重要。Zettelkasten 筆記法提倡將知識分割成最小的單位來促進學習和創新。這種方法強調將大量的資訊分解成易於管理和檢索的小部分。然而,當面對一份龐大的 Markdown 文件時,手動將其拆分成多個小單位既耗時又低效。因此,開發一個自動化工具來分割 Markdown 文件變得非常必要,以便更好地遵循 Zettelkasten 的原則。
方法
在這裡,我們介紹了一個名為split_by_h2
的 Python 腳本,由 Hsieh-Ting Lin 開發。這個腳本的目的是自動化地將一份 Markdown 文件分割成由二級標題(H2)定義的多個小單位。這個過程大致可以分為以下幾個步驟:
- 讀取 Markdown 文件:腳本首先讀取指定的 Markdown 文件,並將其內容儲存起來。
- 處理內容:通過正則表達式的應用,腳本刪除特定的段落(例如,與同級標題相關的內容),並根據一級和二級標題分割文件內容。
- 生成新的 Markdown 文件:對於每個二級標題及其相應的內容,腳本創建一個新的 Markdown 文件。每個新文件包括一個 YAML 頭部、來源信息、標題和內容,並在文末添加與其他文件的連接列表,以促進相互之間的聯繫。
- 更新原文件:在原始 Markdown 文件中,腳本更新一級標題下的內容,並在底部添加一個連接到新創建文件的列表,方便跨文件導航。
import os
import re
from datetime import datetime
class MarkdownProcessor:
def __init__(self, file_path):
self.file_path = file_path
self.original_filename = os.path.basename(file_path).replace(".md", "")
self.content = self._read_markdown_file()
def _read_markdown_file(self):
with open(self.file_path, "r", encoding="utf-8") as f:
return f.read()
def _create_new_md_file(self, title, content, yaml_extra=""):
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
yaml_header = f"""---
title: "{title}"
date: "{current_time}"
enableToc: false
tags:
- building
---
"""
info_block = f"> [!info]\n>\n> 🌱來自:[[{self.original_filename}]]\n\n"
return yaml_header + info_block + f"# {title}\n\n{content}"
def _search_siblings_to_next_heading(
self, pattern=r"### Siblings.*?(?=\n[#]+ |$)", flags=re.DOTALL
):
match = re.search(pattern, self.content, flags=flags)
return match.group(0).strip() if match else ""
def _delete_siblings_from_text(
self, pattern=r"### Siblings.*?(?=\n[#]+ |$)", flags=re.DOTALL
):
self.content = re.sub(pattern, "", self.content, flags=flags)
def _get_content_before_first_h2(self):
match = re.search(r"##(?!#)", self.content)
if match:
return self.content[: match.start()].strip()
else:
return self.content.strip()
# def _process_markdown_content(self):
# self._delete_siblings_from_text()
# pre_h1_content, h1_and_following_content = self.content.split("# ", 1)
# h1_title, post_h1_content = h1_and_following_content.split("\n", 1)
# between_h1_h2 = self._get_content_before_first_h2()
# level_2_heading_pattern = re.compile(r"## (.+?)\n(.*?)(?=\n## |\Z)", re.DOTALL)
# level_2_headings = level_2_heading_pattern.findall(post_h1_content)
# return pre_h1_content, h1_title, between_h1_h2, level_2_headings
def _process_markdown_content(self):
self._delete_siblings_from_text()
# 使用正則表達式直接分割和提取所需內容
pre_h1_content, h1_title, post_h1_content = re.split(
r"#\s(.+?)\n", self.content, 1
)
between_h1_h2 = self._get_content_before_first_h2()
# 提取二級標題及其後的內容
level_2_headings = re.findall(
r"##\s(.+?)\n(.*?)(?=\n## |\Z)", post_h1_content, re.DOTALL
)
return pre_h1_content, h1_title, between_h1_h2, level_2_headings
def save_new_markdown_files(self):
pre_h1_content, h1_title, between_h1_h2, level_2_headings = (
self._process_markdown_content()
)
new_md_files = {
heading: self._create_new_md_file(heading, content)
for heading, content in level_2_headings
}
wikilink_list = "\n".join(
[
f"- [[{heading.lower().replace(' ', '_')}.md|{heading}]]"
for heading in new_md_files
]
)
for filename, content in new_md_files.items():
with open(
f"{filename.lower().replace(' ', '_')}.md", "w", encoding="utf-8"
) as f:
to_write = f"{content}\n\n### Siblings\n\n{wikilink_list}\n\n"
f.write(to_write)
main_content_updated = (
f"{pre_h1_content}# {h1_title}\n{between_h1_h2}\n\n{wikilink_list}\n\n"
)
self._update_original_file(main_content_updated)
def _update_original_file(self, content):
with open(self.file_path, "w", encoding="utf-8") as f:
f.write(content)
if __name__ == "__main__":
import sys
if len(sys.argv) < 2:
print("Usage: python script.py <input_file>")
sys.exit(1)
file_path = sys.argv[1]
processor = MarkdownProcessor(file_path)
processor.save_new_markdown_files()
討論
使用split_by_h2
腳本自動化分割 Markdown 文件具有多方面的好處。首先,它加速了將大文件拆分成 Zettelkasten 方法推薦的小單位的過程,從而節省了大量時間和精力。其次,這種方法增強了資訊的可檢索性和可連接性,使得知識的組織和管理更加高效。最後,自動化工具的使用減少了人為錯誤,確保了分割過程的一致性和準確性。
結論
split_by_h2
腳本是一個強大的工具,用於將大型 Markdown 文件自動化地分割成遵循 Zettelkasten 筆記法的小單位。通過簡化分割過程,它不僅提高了知識管理的效率,而且還增強了學習和創新的能力。此腳本對於那些尋求優化他們的筆記和知識管理系統的人來說,是一個有價值的資源。