Gardenの設計 (メモ)
ページの識別子について
Morionでは、ページの識別子に3つの概念を用いている
path: ローカルにMarkdownとして保存する際のパス%\:|?<>"といった、Windowsでは不正とみなされる文字列、やURLとしての制御文字は使えない- スペースは使える
/はそのままディレクトリ階層として認識される- e.g.,
up/down/100% User Supported
- e.g.,
page唯一構造体に保存される
uri: URIとしてエスケープされたパス。pathから変換可能。- 1つ以上の空白文字は
_に、?#/%といったURIとしてinvalidな文字はエスケープされる
- 1つ以上の空白文字は
slug: ページの名前の同一性を検証するためのユニークキー。uri.toLowerCase()で小文字に変換される
slugが重複するページを作成することはできない
(slugは重複していないがuriが重複しているページは存在しないので、slugの重複だけで重複を検知できる)
ローカルのファイルシステム上で、ファイル名としては区別できるものの、slugが重複する場合は、後続して検知された方をリネームしない限りリモートに同期されないシステムにする
実装
- 新規ファイルを作る時は、ページタイトルを入力すると、
sanitizeTitleToPathでパスに変換される。 - URI → ページの名前解決をする際は、
normalizeUriToSlugでslugに変換した後、内部的にはslugを使って検索を行う。 - DBでやAPIでは常に
slugによって検索や更新、削除がなされる。 path→uri→slugの順に変換が可能。uriからpathを一度だけ逆算する際は、_を半角スペースに変換するというルールpath,uri、slugはそれぞれユニークである必要がある
