markdownからkeynoteを生成する「md2key」を作った

markdownからkeynoteを生成する奴作った

なんか昨日社内でLT頼まれててLTしたんだけど、前日に資料を作るモチベが沸かなすぎて資料を作る奴を作ってしまった。

使い方

  1. gem install md2keyでmd2keyをインストールしておく。
  2. キーノートを開いて好きなテーマを選んで新規作成。
  3. 一つ目のスライドが表紙のスライドになるので、好きなレイアウトのスライドに変える。
  4. 二つ目のスライドがコンテンツのスライドのレイアウトに使われるので、使いたいレイアウトのスライドを追加する。
  5. md2key **.mdを叩く。

markdownのフォーマット

# The presentation
@k0kubun

## Hello world
- I'm takashi kokubun
- This is a pen

## How are you?
- I'm fine thank you

みたいな奴が動く。最悪なことに現時点ではここに出てこない記法は全く対応してない。

Deckset互換性

giginet.hateblo.jp

僕がMarkdownからプレゼンを生成するときはいままではDecksetを使っていたので、最終的にはDecksetの記法を全部実装したいという気持ちである。(理想)

なので、---でスライドを区切るみたいな書き方に対応したい。でも---は不要では?と言われたので、現状は内部的には見出しでスライドを変えて---はただ無視している。

けど僕としては普通のMarkdownがいい感じに変換されることよりDecksetとの互換性のほうが重要度が高いので、いつか見出しが複数あるスライドを許容して必ず---で区切るようにするかもしれない。

どういう仕組みなの

2ヶ月くらい前も同じことを考えていたんだけど、AppleScriptでGUI操作してなんとかするというあまり現実的ではない && Keynoteを起動しなければならないダサい方法しか思いつかなかった。

絶対にAppleScriptを書きたくなくて、その日は https://github.com/obriensp/iWorkFileFormat を読みながらKeynoteファイルの中身を見ていたけど、xmlだったころのKeynote '09はともかく最新のKeynoteのフォーマットは生成するの大変だなあと思って諦めていた。

結局AppleScriptからKeynoteをGUI操作することにした

今週社内ですごいかっこいいKeynoteテンプレートが公開されて使いたくなったけど、GUI操作だけで1から資料作るの死ぬほどめんどくさいし本当にやりたくなかったので、もうこれはAppleScriptでなんとかするしかないと思った。

あまりにもKeynoteを操作したくなくて key2txt というmd2keyとは逆のことをやってる奴を見てたら、なんかTaskPaperというフォーマットからKeynoteを生成するスクリプトがあって、その中にスライドのタイトルとコンテンツにアクセスするコードと新しいスライドを作るコードがあったので、そのコードだけを組み合わせてmd2keyを作った。

作るの(AppleScriptの書き方調べるのが)めんどくさそうと思ってたけど結局このコードを見つけてから2時間くらいで書けてしまった…

markdownパーサ

Rubyでmarkdownをパースして(HTMLではなく)いい感じのASTを生成してくれるGemを探してたんだけど、たいていのmarkdown処理する奴はHTMLまで変換してしまっていて、そうじゃないのはRDoc::Markdownしか見つからなかった。RDoc::Markdownのパース結果がなんか使いづらそう(あんまちゃんと調べてないです)だったので、最初小学生並みのマークダウンパーサを書いた。

エゴサしてたら「*でリストかけないじゃん」という意見を見つけたので、マークダウンパーサ書くのしんどいし最終的にはRedcarpetからXHTMLに変換してOgaというXMLパーサを使って無理やりASTにした。

今後追加したい機能

  • 太字
  • リストのネスト
  • シンタックスハイライトされたコードの挿入

実装が簡単そうな順。プライオリティは逆順。これの開発にそこまで興味があるわけではないのでいますぐ拡張しようというモチベはなくて、次に自分が資料作りで困ったときに拡張すると思う。