有了一些後設資料的想法後,我們下一步就是思考「要如何在系統上建置?」
在我們的系統裡,絕大多數的節點,都會透過 Markdown 的檔案格式記錄下來。這時就可以提及 Markdown 的一個概念——Front Matter。也就是在文件開頭,用雙個 ---
包覆起來的區塊,在這個區塊裡面,我們就可以用 <key>: <value>
的方式建立一個個屬性作為後設資料。所以我們就可以如下的方式紀錄各個資料:
---
NumberTypeMetadata: 123456
StringTypeMetadata: "It is a sentence."
ArrayTypeMetadata: [TagA, "Tag B", tag-c]
DateTypeMetadata: 2022-09-24
---
Main Content
像是昨天提到的 MOC,我們就可以用 array 的方式去記錄這個節點會與哪些主題相關:
```markdown
---
Author: Yuehu
Topics: ["Obsidian", "Zattelkasten", "Bullet Journal]
CteatedAt: 2022-09-04
UpdatedAt: 2022-09-24
---
Main Content
如果是以一般 SSG 的做法,我們就可以用類似以下的程式自動生成 MOC 頁面:
let MOCTitle = node.title
let relativeNodeListByCreatedAt = {}
for all_nodes as node
let topics = node.frontMatter.Topics
if topics.contain(MOCTitle)
relativeNodeListByCreatedAt[node.title] = node
relativeNodeListByCreatedAt.sortBy(node => node.frontMatters.CreatedAt)
// Show links from relativeNodeListByCreatedAt
或是在 Gatsby.js 中,我們可以透過 GraphQL 去取得這些資料
const result = await graphql(`
query {
allMdx(sort: { fields: [frontmatter___CreatedAt], order: ASC }) {
edges {
node {
frontmatter {
CreatedAt
MOCTitle
}
}
}
}
}
`)
但身為一個 Obsidian 重度使用者,其實我也希望能夠透過在 Front Matter 區塊外、也就是主要內文中的 inline fields <Key>::<Value>
取得 Metadata,這可能就要再思考看看如何做到了。