Obsidian BASE の仕様を見て 「今後はタグとかもプロパティに埋め込むのが標準になるなあ」と思い、 それから 2hop links のことを考え、くっつきました。
両方を活かせばいいわけだ。
Geminiの助けを借りて
以前作った「全修」の変形です。
プロンプトを「キーワードを抽出し、フロントマターの形式でtagsに設定してください」と決め打ちする。 生成AIでプロパティを設定しようという作戦です。
tagging.md
Geminiと交信するTemplaterスクリプト。
<%* // APIキーを https://aistudio.google.com/app/apikey で取得してください。 const api_key = 'QuuuuuuX' const url = 'https://generativelanguage.googleapis.com/v1beta/models/' const model = 'gemini-1.5-flash' prompt = "<content>からキーワードを抽出し、フロントマターの形式でtagsに設定してください。" if(!prompt) return const content = tp.file.content text = `<content>${content}</content>\n:${prompt}` end_point = `${url}${model}:generateContent?key=${api_key}` new Notice("tagging...") const data = { contents: [{ parts: [{ text: text }] }] } response = await fetch(end_point, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data) }) if(response.ok) { const result = await response.json() new Notice("プロパティに設定") s = result.candidates[0].content.parts[0].text if(s[0]=="\`") { s = s.replace(/^```.*\n/, "") s = s.replace("```", "") } if(content[0]=="-") { s = s.replace("---\n", "") d = content.split("---\n\n") a = d.shift() b = d.join("---\n\n") s = a + s + b } else { s = `${s}${content}` } e = app.workspace.activeLeaf.view.editor e.setValue(s) }else{ new Notice(response.statusText) } %>
api_keyを最初に設定してください。
使い方
TemplaterのHotKeyに設定して、ツールバーなどから実行。
プロパティが作成され、文中のキーワードがタグになって並びます。
2hop links も繋がりやすくなります。 これは行けそうな気がする。
たまにただのリストを返すときがありますが、 Undoして再実行するとプロパティに戻ります。 すでにプロパティがある場合も、 追記することで対応します。
まとめ
文中にスクリプトがあると、プロンプトを無視して 「このスクリプトは修正した方がいいよ」とお節介が始まります。
Gemini の困ったところだ。