メインコンテンツへスキップ

ObsidianでRibbonに設定したボタンで特定のテンプレートのファイルを生成する

· loading · loading ·
kiitosu
著者
kiitosu
画像処理やデバイスドライバ、データ基盤構築からWebバックエンドまで、多様な領域に携わってきました。地図解析や地図アプリケーションの仕組みにも経験があり、幅広い技術を活かした開発に取り組んでいます。休日は草野球とランニングを楽しんでいます。
目次

概要
#

obsidianでzettelkastenを始めてみようと思う。 zettelkastenはアイディアのカードと書籍のカードを作るのがお作法。

この時アイディアや書籍のカードを簡単に作れるようにするため、ノートの名前は重複させないようにユニークノートクリエイターを使うのが定石らしい。 ということで、設定をして使ってみた、

しかしユニークノートクリエイターは単一の設定しかできないらしく、以下の点がで困った。

  • アイディアと書籍でFrontMatterの内容を変えたいが、できない
  • アイディア用のカードと書籍用のカードがファイル名で区別できない

アイディア用のカードを作ってからテンプレートの挿入で書籍拗音FrontMatterを上書きする方針でやってみたが、チョットめんどくさい。 ということで初めてのカスタムプラグインを作って対応してみた。

Ribbonアイコンクリックで特定のテンプレートのファイルを生成する。
#

最初はtemplaterをカスタムプラグインから呼び出して対応できるかと思い、方法を探してみたのですが、やり方がわかりませんでした。 ChatGPTにきいても存在しないAPIを呼びだすハルシネーション情報しか出してくれず困りました。

ということで、カッコ悪いですが、テンプレートはプラグイン内にconstで定義してファイルを作ることにしました。 必要なのは以下の2ファイル。これをvaultの.obsidian/pluginsにmy-add-book-plugin 等のディレクトリを作成して配置する。

.obsidian
├── plugins
│   ├── my-add-book-plugin
│   │   ├── main.js
│   │   └── manifest.json

main.js
#

const { Plugin } = require("obsidian");

const datetime = moment().format("YYYY-MM-DD HH:mm:ss");
// ファイルのテンプレート
const content = `---
alias:
date: ${datetime}
tags:
  - unknown
  - isbn-unknown

# 概要

# ためになったところ

# 残った疑問

# どう活かすか
`

class MyAddBookPlugin extends Plugin {
    async onload() {
        console.log("[MyAddBookPlugin] onload() が実行されました。");

        // リボンボタンを追加
        this.addRibbonIcon("book", "書籍メモ作成", async () => {
            console.log("[MyAddBookPlugin] ボタンがクリックされました!");

            // ノート作成のための情報
            const fileName = `book-${window.moment().format("YYYYMMDDHHmmss")}.md`; // ユニークなファイル名
            const folderPath = "temp"; // メモを保存するフォルダ
            const templatePath = "templater/book"; // 使用するテンプレートのパス

            // 新規ノートを作成
            const filePath = `${folderPath}/${fileName}`;
            const file = await this.app.vault.create(filePath, content);
            console.log(`[MyAddBookPlugin] 新規メモを作成: ${filePath}`);

            // 作成したノートをエディタで開く
            const leaf = this.app.workspace.getLeaf(true);
            await leaf.openFile(file);
            console.log("[MyAddBookPlugin] ノートをエディタで開きました");
        }); 

        console.log("[MyAddBookPlugin] リボンボタンの追加が完了しました。");
    }   

    onunload() {
        console.log("[MyAddBookPlugin] プラグインをアンロードしました。");
    }   
}

// Obsidian にプラグインとして登録
module.exports = MyAddBookPlugin;

manifest.json

{
    "id": "my-add-book-plugin",
    "name": "My add book plugin",
    "version": "1.0.0",
    "minAppVersion": "0.12.0",
    "author": "hoge",
    "description": "書籍ページ作成",
    "isDesktopOnly": true
}

こんな感じ
#

templateファイルを使うようにしたい! もっといい方法あったら教えて下さい 🙇

Reply by Email

関連記事

Android StudioでDrawioを使う
· loading · loading
Cloud Formation Stack Refactoring試してみた
· loading · loading
S3で静的サイトを公開するときのアクセス制御について。referer制限
· loading · loading