Jazzと読書の日々

iPadを筆記具として使う方法を模索します

Obsidianで長い文章を執筆するために

PlaylistとSetlistの統合版。

Playlist

章ごとにファイルを作り、あとから1本にまとめる仕組み。 「プレイリスト」という目次を作り、それでファイル管理をします。 試しながら改良を重ねてきました。

ということで、現時点の安定版。

Playlist.md

Templaterスクリプトです。

Import Obsidian: Playlist

<%*
p = tp.file.folder(true) + "/"
q = "playlist"
const t = tp.file.title
if(t == "playlist"){
  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(/\t/mg, "    ")
      s = s.replace(/^ {4} +- /mg, "#### ")
      s = s.replace(/^ +- /mg, "### ")
      s = s.replace(/^- /mg, "## ")
    }
  }else{
    s = s.replace(/^#{4} /mg, "        - ")
    s = s.replace(/^#{3} /mg, "    - ")
    s = s.replace(/^#{2} /mg, "- ")
    s = s.replace(/\n+/g, "\n")
    s = s.replace(/\n/, "\n\n")
  }
}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 + "](" + p + "new) \n\n"
  s+= d.join("\n")
}
f = p + q + ".md"
p = app.vault.getAbstractFileByPath(f)
if(p){
  if(t != "playlist" && q == "playlist"){
    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スクリプトを実行すると、同じフォルダ内にあるファイルの目次を作成します。 チェックボックス付きのファイル一覧です。 これを「プレイリスト」と呼びます。

今回、初期状態ではチェックボックスを空ボックスにしました。 考えてみると、まだ何も書いていない。 未完了。 書き上げてからチェックするのがわかりやすい。

それと下位フォルダのファイルは表示しないようにしました。 書き換えたとき、古いほうをアーカイヴしておくとか、下位フォルダを使うことがあるので。

コンパイル

チェックボックスをチェックし、プレイリストでPlaylistスクリプトを実行すると、チェックされたファイルの中身を並んでいる順に連結します。 これを「コンパイル」と言います。 merge.mdというファイルが生成します。

新規作成

プレイリストの1行目にあるフォルダ名をタップすると、新しいファイルを作成します。

ファイルを書き換えてからPlaylistスクリプトを実行すると、そのファイルへのリンクをプレイリストに追加します。 これでどんどん書き進めていきます。

セットリスト

今回の大きな変更点は「セットリスト」です。 チェックがまだない状態でPlaylistを実行すると、プレイリストが「セットリスト」になります。

セットリストは見出し形式のリストで、右サイドパネルの「アウトライン」が使えます。 ドラッグで並べ替えできる。 段差も見出しのレベルを変えて対応。 折りたためる。

そのあと再びPlaylistを実行するとプレイリスト形式に変換します。

注意

Templaterからdataviewを呼び出す実験の副産物です。 プラグインの柔軟性に驚きますね。 何もなければ、自力で組み上げることは無理だったと思います。

なのでdataviewをインストールしてお使いください。

CheckOut.md

一気にチェックするスクリプトは下記になります。

<%*
s = tp.file.content
if(/- \[x\]/.test(s)){
  s = s.replace(/- \[x\]/mg, "- [ ]")
}else{
  s = s.replace(/- \[ \]/mg, "- [x]")
}
e = app.workspace.activeLeaf.view.editor
e.setValue(s)
%>

一つでもチェックがあると全部のチェックをリセットします。 トグルで。

まとめ

トンテンカン。 分割執筆は大工さん気分。

追記 9/9 21:00

エディタの設定で「タブの使用」がONになっていると段差の判定ができなくなることがわかりました。 それで、タブに対応したスクリプトに差し替えました。 申し訳ない。