Obsidian Tips:カーソルがあるセクションをコピーするTemplaterスクリプト

 Androidで今カーソルがある章をボタン一発でコピーしたいな……と思うことがあったので、またTemplaterスクリプトを書きました。

 ここで言うセクション / 章は「#と#のあいだ」です。

 つまり、例によってObsidianで日本語小説を書く設定で紹介した「レベル1の見出しだけで構成されている単一ファイル」を前提としています。

スクリプト

 Templaterスクリプトとして登録してお使いください。

 ※Templaterプラグインの導入やスクリプトの使い方はObsidianで小説を書くTips:Templaterで章番号を自動挿入あたりを参照してください。

<%*
 const editor = this.app.workspace.activeLeaf.view.editor;
 const curCur = editor.getCursor();
 // Get start=current section
 let str = editor.getRange(editor.offsetToPos(0), curCur);
 const preSec = str.match(/(.*#\s).*?$/s);
 // Get the end of the current section
 str = editor.getRange(curCur, editor.offsetToPos(editor.getValue().length)); 
 const surSec = str.match(/(.*?)#\s.*$/s);
 // Set offset - if there are no sections, get the entire document
 let startOffset = 0;
 let endOffset = editor.getValue().length;
 if(preSec) { startOffset = preSec[1].length; }
 if(surSec) { endOffset = editor.posToOffset(curCur)+surSec[1].length; }
 // Get & Copy
 str = editor.getRange(editor.offsetToPos(startOffset), editor.offsetToPos(endOffset)); 
 navigator.clipboard.writeText(str);
 new Notice("Current section copied");
%>

(今更ですが見づらいのでコードブロック用のプラグイン入れてみました)

スクリプトの解説

 あんまり書くこともないですが一応。

  1. 今カーソルがあるところの直前の見出しを正規表現で探す
  2. その後で最初に現れる見出しを正規表現で探す
  3. 1,2から、章の始めと終わりのオフセット(ドキュメントの頭からの文字数)を計算する
  4. オフセットをEditorPositionに変換して間のテキストを取得
  5. コピー!

 APIを全部把握出来てるわけではない(ドキュメントがあまり詳しくないのでこの辺を眺めて書いてますが、もっといい調べ方があるのかな……?)ので、もっと効率の良いやり方があるのかなぁ……と思いつつ、とりあえず用は足せるので良いかなと。

 それではよきObsidianライフをʕ ·ᴥ·ʔ

 

コメント

タイトルとURLをコピーしました