
Obsidian Outliner を文章化するためのTemplaterスクリプトを作ってみた
初投稿です。よろしくお願いします。
コレは何?
masaki39様の📘アウトラインで英文を書くを改造させていただきました(勝手に拝借してしまい申し訳ありません🙇)。
Jazzと読書の日々さんのObsidianだと箱メソッドがわかりやすい - Jazzと読書の日々にも影響を受けていて、その別アプローチを考えたのがこれです。あと、最近Javascriptづいてるのもあります。
ヘッダー写真のようにアウトライナー形式で連ねた文章が、今お読みいただいているnoteのような形式に変換されます。
スタイルについて
日本語入力に特化した形に魔改造しています。原文のスクリプトを変更し、全角スペースを行頭に追加した上で空行をなくすことにより、日本語長文に最適化させました。
こちらのスクリプトは一段目をヘッダー化し、二段目の行頭に全角スペース、三段目は改行なしで続けるスタイルになっています。
一行目(ページの先頭行)については「+」という文字を行頭に置くと、仕様による行頭改行が入りません。この行頭記号についてはスクリプトをいじれば適宜改変可能です。使わなくても特に問題ないと思います。また、四段目以降は出力されないのでメモとして使ってください。
「これはカギカッコが入った文章です」
カギカッコは行頭空白が入らないような処理をしています。
使い方
Templaterスクリプトなので、Templaterプラグインを入れて、このスクリプトのファイルをホットキーに登録してお使いください。実行すると、出力結果をクリップボードにコピーします。僕はコミュニティプラグインの「Slash Commander」に登録して使ってます。
一応最終行を return finalResult; にしてやると出力してくれます。
なんで作ろうと思った?
アウトライナーって書くのが楽なんですよね。心理的に、ちゃんとしたものを作ろうと思わないでいいじゃないですか。だから作りました。
あと、Zoomプラグインで文章の一部をズームすることがあるんですが、Zoomプラグインは見出し化された文章よりも、こっちのほうが使いやすいというのもあります。アウトライナーなので、バレットポイントをクリックすれば一瞬でZoomできます。
注意点
作成者はJavascriptの超初心者のため、意図せぬトラブルが発生するおそれがあります。
ファイル内にあるすべての箇条書きを読み込んで処理するので、箇条書きは一塊にしておいてください。
また、リストをリストのまま出力することはできません。フロントマター内のリストも処理されてしまうようです。
なお、CSSについてはデフォルトだと日本語全角スペースをインデントしてしまう設定のため、別途スニペットによる設定が必要です。
また、鍵括弧を使用した文章のあとに段落をぶら下げても改行されない仕様になっているので、鍵括弧は必ず独立させてください。
課題
アウトライナー式に文章を書いていくことの功罪は意識する必要がありそうです。
段差と句読点区切りでセンテンスは明確化されるが、区切りが明確であるが故に曖昧なつながりが許されない厳格さも孕んでいます。
つながりが最初から明確であることを意識できている方法、つまりはプロットがあればいいんでしょうけれども。
使用用途
アウトライナー感覚で使えるので、普通の文章を入力することがしんどいとき、文章に対してメモを加えたいときにおすすめです。
スクリプト
<%*
// エディタからすべての行のリストを取得
const lines = tp.file.content.split('\n');
let result = [];
lines.forEach(line => {
if (line.startsWith( - 「)){
result.push(\n${line.trim().slice(2)});
} else if (line.startsWith(- +)){
result.push(${line.replace("- +","# ")});
} else if (line.startsWith(- )){
result.push(\n\n# ${line.trim().slice(2)});
} else if (line.startsWith( -)){
result.push(\n ${line.trim().slice(2)});
} else if (line.startsWith( -)) {
result.push(${line.trim().slice(2)});
}
});
const finalResult = result.join('');
navigator.clipboard.writeText(finalResult);
new Notice("文章をコピーしました")
%>
余談
ちなみに本家はプラグイン化されたよう(GitHub - masaki39/outline-converter: Convert outline to continuous text.)です。
僕は全然このスクリプトをプラグイン化する気がないので、していただける方がいたらぜひよろしくお願いします。
追記(2024 5/6)
改良版を出しました。こちらのほうが快適に使えます。