Links
...

Obsidian API におけるリンクまわりの言葉遣いや扱いについて。

linktext
...

Obsidian API では、リンクの文字列のことを linktext という名前で呼ぶことが多い。

  • たとえば [[note]] なら notelinktext になる。
  • Heading link の場合、たとえば [[note#heading]] なら note#heading
  • Block link の場合も同様に、たとえば [[note#^block-id]] なら note#^block-id

path (linkpath), subpath
...

linktext は、pathsubpath の2つの部分に分けられる。pathlinkpath と呼ばれることもある(getLinkpath, getFirstLinkpathDest)。

  • notepath: "note", subpath: ""
  • note#headingpath: "note", subpath: "#heading"
  • note#^block-idpath: "note", subpath: "#^block-id"

linktextpathsubpath に分割するには parseLinktext を使う。
linktext から path だけを得る(つまりファイルにしか興味がない)ときは getLinkpath を使う。

sourcePath
...

"New link format" 設定が "Shortest path when possible" (デフォルト) になっているとき、あるリンクがどのノートを指しているのかを決定する("resolve" する)には

  • リンクの文字列そのもの

に加え、

  • そのリンクがどのノート内に存在しているか

の情報も必要になる。これを表すのが sourcePath: string である。

Note

"source" は source/target あるいは source/destination の source。リンクの出どころ、リンクの出ている源という意味。

基本的にはそのリンクが存在しているノートの、vault 内における相対パスになる。

ただし、このリンクは特にどのノートから出ているってわけでもないなあという場合には空文字列になる。たとえば、Canvas の " 非埋め込みカード "(正式名称がわからない)の場合がこれにあたる。

CodeMirror での扱い
...

CodeMirror の extension を書いているときも、sourcePath に相当するものがほしくなるときがある。これは以下で取得できる。

const sourcePath = state.field(editorInfoField).file?.path ?? "";

リンクの解決
...

path のみの場合
...

subpath もある場合
...

export function resolveLinktext(app: App, linktext: string, sourcePath: string): { file: TFile, subpathResult: HeadingSubpathResult | BlockSubpathResult | null } | null {
    const { path, subpath } = parseLinktext(linktext);
    const targetFile = app.metadataCache.getFirstLinkpathDest(path, sourcePath);
    if (!targetFile) return null;
    const targetCache = app.metadataCache.getFileCache(targetFile);
    if (!targetCache) return null;
    const result = resolveSubpath(targetCache, subpath);
    return { file: targetFile, subpathResult: result };
}