ファイルをマージして長文を生成するスクリプトです。
Playlist
Playlistスクリプトを実行すると、フォルダ内のファイルを集めplaylist.mdを作ります。
playlist.mdでPlaylistスクリプトを実行すると、チェックされたファイルだけを連結しmerge.mdを生成します。 これをPDFやePubにすれば使い回ししやすい。
Playlist.md
Templaterスクリプトになります。 Commanderでタブバーに置くと便利。
<%* const PLAY = "playlist" const MERGE = "merge" p = tp.file.folder(true) + "/" q = PLAY const t = tp.file.title if(t == PLAY){ s = tp.file.content if(/[^!]\[\[.+?\]\]/m.test(s)){ if(/\- \[x\]/.test(s)){ q = MERGE const a = s.split("\n") s = "" for(i=0; i<a.length; i++){ if(/- \[x\] /.test(a[i])){ const m = a[i].split("- [x] ") s+= m[0].replace(/\t/g, " ").replace(/\s{4}/g, "#").replace(/\s+/g, "#") + "## " f = m[1].replace(/.*\[\[(.+?)\]\].*/, "$1") s+= f + "\n\n" f = p + f + ".md" b = app.vault.getAbstractFileByPath(f) if(b){ const c = await app.vault.read(b) s+= c.replace(/([^!])\[\[(.+?)\]\]/mg, "$1$2") + "\n" } } } }else{ s = s.replace(/(\[\[.*?\]\])/mg, "!$1") } }else{ s = s.replace(/!(\[\[.*?\]\])/mg, "$1") } }else{ const d = DataviewAPI.pages('') .filter(x => p == (x.file.folder + "/")) .filter(x => !x.file.name.includes(q)) .filter(x => !x.file.name.includes(MERGE)) .sort(x => x.file.name) .map(x => `- [ ] [[${x.file.name}]] `) s = `[${p}](obsidian://new?file=${encodeURI(p)}) \n\n` s+= d.join("\n") } f = p + q + ".md" p = app.vault.getAbstractFileByPath(f) if(p){ if(t != PLAY && q == PLAY){ s = await app.vault.read(p) if(t != MERGE && s.indexOf(`[[${t}]]`) < 0) s+= `\n- [ ] [[${t}]] ` } await app.vault.modify(p, s) }else{ p = await app.vault.create(f, s) } app.workspace.activeLeaf.openFile(p) %>
埋め込み対応
今回の変更点は「埋め込み」です。
playlist.mdでチェックがないときにPlaylistスクリプトを実行すると、表示が「埋め込み」に変更されます。 それぞれのファイル内容が確認できる。
この状態でチェックしてPlaylistを実行をすると、チェックを維持したまま、もとのリスト形式に戻ります。 リスト形式でPlaylistを実行するとマージされる仕組み。
従来は、チェックがないと見出し形式に変換する仕様でした。 それは項目を並べ替えるためでした。 でも、リスト形式のままでも「下の行と入れ替える」で並べ替えはできます。 すると、見出し形式の出番がない。
ということで、代わりに内容確認用の「埋め込み」にしました。
まとめ
printプラグインの紹介ありがとうございます。
こちら、iPadでObsidianを使っているため、このプラグインは対応していませんでした。 とても残念。
いまのところマークダウンのPDF化にはショートカットを使ってます。 まだまだタブレット環境ではデータの取り回しに苦労します。 マークダウンがあらゆる環境のデフォルトになるといいんですけどねぇ。