Creatable a => a -> IO b

Haskellと数学とちょびっと音楽

Haskellでスライドをいー感じに書く話

とんとご無沙汰してます。ちゅーんさんです。 仕事とかその他とか、なかなか更新するネタや切っ掛けが無かったんですが、 今日は半日くらいごにょごにょやってた進捗があるので書いときます。

Haskellでスライド書きたいんだーっていう変な人な人向きです。

何したか

Haskellでスライドを作りやすくした

なんで

もともと、Haskell高橋メソッドなスライドをちゃかちゃか作るべく、 Takashi Monad https://github.com/tokiwoousaka/takahashi とかいうライブラリを公開して、ドッグフーディングしていたのですが、 まず使いにくよねっていうのと、毎回ビルド出来るように色々設定するの面倒くさいよねーっていう問題を抱えてました。

勉強会に向けてのんびりスライド作るぶんには、それでも問題にならねーべーとか思ってたんですが、 名古屋に転職してからというもの、仕事で30分とか40分で資料作って発表せねば、みたいな事にしょっちゅうなるので、 テンポ良くスライドを作れる良い感じの仕組みが欲しくなったのです。

やったこと

  • githubに自分用のテンプレート置きました
  • いい感じの記法を実現するためのHackをしました

githubのテンプレート

とりあえず最小のスライド構成を次のリポジトリに追いてあります。

https://github.com/tokiwoousaka/takahashi_temp

このままだと完全にちゅーんさん向けテンプレートなので、 各自でフォークして好みにあわせて変更すると良い感じになるかもしれません。

ほんで、次のようなスクリプトを書いといて、新らしいスライドを作りたくなった時に叩けば 初回ビルドまで勝手にやってくれます。

#!/bin/sh
pname=$1

git clone https://github.com/tokiwoousaka/takahashi_temp.git
mv takahashi_temp $pname
cd $pname
stack build

後はapp/Main.hsをいー感じに書きかえて実行すればスライドが出来あがり。

いーかんじの記法

もともと、TakahashiMonadは、色々な関数名を覚えて組みあわせないといけなくて辛かったので、 何度も使ってみた経験から、良く使うページ構成をいー感に書くための演算子app/Common.hsに追加しました。

以前から使えそうなものをはこのモジュールにぶっこんでたので、そこに追加した感じです。

たまーに複雑な構成のページを作りたくなるかもしれませんが、 混ぜて使うことも出来るので、その時は以前までの書きかたで頑張れば良いです。

実際にこのCommon.hsを使って書いたapp/Main.hsのサンプルを以下に貼っておきます。 元々よりかはいくら読みやすいコードで書けるようになった気がします。

module Main where
import Common
import Control.Lens
import Control.Monad.Takahashi
import Control.Monad.State

main :: IO ()
main = do
  let fileName = "../slide.html"
  writeSlide fileName presentation
  putStrLn $ "Sucess : Output to '" ++ fileName ++ "'"

presentation :: Taka ()
presentation = do
  setOptions
  title "ラッパーテスト" 
    $  "2017/7/17 ちゅーん(@its_out_of_tune)"

  header "テスト" test

  slideTitle .= ""
  taka "ありがとうございました\n(๑•﹏•)"

test :: Taka ()
test = do
  "高橋メソッド" ==== 
    "ほげ"
  "高橋メソッド" ==== 
    "ぴよ"
  "高橋メソッド" ==== 
    "ふが"
  slideTitle .= "高橋メソッドは"
  taka "元の\n書きかたの方が"
  taka "いいかも\nしれない"
  "ちょっと長めの文章" ==== 
    Par
      "むかしむかし あるところに\n\
      \おじいさんと おじいさんが住んでいました\n\
      \二人は愛しあっていました\n\
      \めでたしめでたし"
  "リスト" ==== 
    [ "ゆい"
    , "ゆずこ"
    , "ゆかり"
    , "あいちん"
    , "ふみお"
    , "おかちー"
    ]
  "画像" ====
    Image HStretch "img/neko.png"
  "二段" ==== 
      "一段目"
    ~~~~
      "二段目"
  "三段" ==== 
      "一段目"
    ~~~~
      "二段目"
    ~~~~
      "三段目"
  "四段" ==== 
      "一段目"
    ~~~~
      "二段目"
    ~~~~
      "三段目"
    ~~~~
      "四段目"
  "縦分割" ==== 
    Par
      "ない\n\nあんま使わないから\n作らないかも"
  "コード" ====
      Par "コードの説明とか"
    ~~~~ 
      Code 
        "main :: IO ()\n\
        \main = putStrLn \"Hello, World!\""
  "二段 上広め" .===
      "ひろい"
    ~~~~
      "せまい"
  "二段 下広め" ===.
      "せまい"
    ~~~~
      "ひろい"

記法がまるっと変わってる気がしないでも無いですが、こーいう事がサクっと出来るのが言語内DSLの強みですね。

こんな感じのスライドが出来ます https://tokiwoousaka.github.io/slides/170707wrapper/slide.html

読み方とか書きかたは雰囲気でさっしてください。

ぶっちゃけハックなので、こいつをちゃんと綺麗にしてライブラリ化してとかはしないと思います。 っていうか、現状のTakahashiMonad自体あんまり良いつくりになっていないから、まるっと作りなおしたいと思ってます。