コンテンツにスキップ

starlight-obsidianでvaultのコピー先をルートノードに変更する

starlight-obsidianプラグインにより、Obsidian Vaultは src/content/docs/notes にコピーされる挙動がデフォルトとなっている。

その結果、サイドバーのUI表示やURLのパス表記上、ルートから1階層下にある状態となっており、Obsidian側で見ている時とディレクトリ構造と1階層分の差異が出てしまう。

これを解決したい。

  • Vaultのコピー先を src/content/docs 直下にする
  • サイドバーをObsidian Vaultの階層構造と合わせる
  • Obsidian
  • @astrojs/starlight
  • starlight-obsidian

を利用している

Vaultのコピー先を src/content 直下にする

Section titled “Vaultのコピー先を src/content 直下にする”

これは比較的簡単。

まずは、src/content/docs配下を空にする。

rm -rf ./src/content/docs/**/*

次に、astro.config.mjs をいじって設定を変更する。

astro.config.mjs
import starlight from '@astrojs/starlight'
import { defineConfig } from 'astro/config'
import starlightObsidian, { obsidianSidebarGroup } from 'starlight-obsidian'
export default defineConfig({
integrations: [
starlight({
plugins: [
starlightObsidian({
output: '.'
}),
],
title: 'My Docs',
}),
],
})

サイドバーをObsidian Vaultの階層構造と合わせる

Section titled “サイドバーをObsidian Vaultの階層構造と合わせる”

こちらはGithubのIssueが起票されているが、@astrojs/starlight側の仕様に合わせるために、プラグインとしては現時点で対応しない方針となっている。

Option to make Obsidian the entire sidebar without requiring a root node. · Issue #5 · HiDeoo/starlight-obsidian

なので、starlight-obsidianが生成するobsidianSidebarGroupを使わずに、独自実装でディレクトリ構造を作るように対応する。

Terminal window
touch sidebar.config.mjs
sidebar.config.mjs
import path from 'node:path';
import fs from 'node:fs/promises';
const CONTENT_DIR = path.resolve(process.cwd(), 'src/content/docs');
export async function generateSidebar() {
const entries = await fs.readdir(CONTENT_DIR, { withFileType: true });
const dirs = entries.filter(v => v.isDirectory() && !v.name.startsWith("."));
/** @type {import{'@astrojs/starlight/types'}.StarlightUserConfig} */
const config = {
sidebar: dirs.map(v => ({
label: v.name,
autogenerate: {
directory: v.name
}
}))
}
return config.sidebar
}
astro.config.mjs
import starlight from '@astrojs/starlight'
import { defineConfig } from 'astro/config'
import starlightObsidian, { obsidianSidebarGroup } from 'starlight-obsidian'
import { generateSidebar } from './sidebar.config.mjs'
const sidebar = await generateSidebar();
export default defineConfig({
integrations: [
starlight({
plugins: [
starlightObsidian({
output: '.'
}),
],
title: 'My Docs',
sidebar
}),
],
})