try-pandoc-with-fileという, markdownをPDFなどに変換するwebサービスを書きました
pandoc
PandocというHaskellで書かれたソフトウェアがあります.
これはmarkdown・rst・HTML・Orgなどの豊富な入力を取り, HTML・PDF・Docxなどに変換出来るツールです.
参考:Pandoc ユーザーズガイド 日本語版 - Japanese Pandoc User's Association
超便利で, いつも使っています.
というか, このサイト自体Hakyllで作られているので, ガッツリpandocに依存しています.
web
さて, これをインストールせずにweb上から使えるサービスはあるのでしょうか, あります.
しかし, このTry pandoc!はHTMLや$\LaTeX$への変換はサポートしていますが, PDFやWordなどのテキストで表せないバイナリの出力はサポートしていません.
pandocのインストールはstack install pandoc
で簡単にできるので,
pandocのインストールに手間取るような人が$\LaTeX$のインストールが出来るとは到底思えず,
これではPDFの出力に使うのは難しいでしょう.
書いた
というわけで$\LaTeX$を出力するのではなく, PDFを直接出力してくれるサービスを書いてみました.
1日で書いたので, 多分バグだらけで, ヘタすれば$\TeX$への入力での脆弱性が存在するかもしれません. 誰か詳しい人教えてください.
この先どうするか
細かいことはGitHubのIssueに書きますが, 概略だけ.
需要が全く無いならそもそも何もしないかもしれない.
入力の種類を増やす
Docxなども純粋関数で取り扱えるため(safe haskellではないので本当に純粋かは微妙ですが), 安全に取り扱えるはずです.
他のファイル入力も増やしていきたいですね.
markdown
現状はMarkdownStrictだけ.
markdownの許容する拡張はデフォルトで多くても誰も困らない気がします.
webサービスで安全に動かせるものなら競合しない拡張ならなんでも入れていいと思うので, markdownの種類を増やすより拡張を増やしていきたいです.
出力の種類を増やす
私の想定している一番の使い方は, 学生がmarkdownでレポートを書くことなので, PDFだけではなくDocxやOdfには対応しておきたいです.
オプションを増やす
現在フォントすら選べません.
フォントや余白の大きさをpandocの変数機能を使って選べるようにしておきたい.
テキスト入力box
markdownなどのプレインテキストとして扱える入力はweb上でそのままテキストエリアに書けるようにしておきたいですね.
dockerの導入
今は適当にやっているので適当ですが, このソフトウェア周辺ツールに頼る以上めっちゃソフトウェアを必要としますし, ユーザの任意の入力を受け入れるのでセキュリティ的にヤバいので, dockerなどを導入したいと思います.
問題点
ジレンマは, 自分自身は手元でpandocを動かせるので, このサービスを使う意味が全く無いということです.
なので, 何もフィードバックが無ければやる気をなくしてやめてしまう可能性が高いです.
開発の感想
pandocもHaskellで書かれているので普通にHaskellで, そんなに動的な要素が必要なくスケールもそこまで必要ないのでYesodで書きました.
Updated Yesod Scaffolding によってyesodの流儀がかなり変わっていてかなり戸惑いました.
Haskellソースコードがsrc
ディレクトリに混ざったのは,
Haskellソースコード以外のtemplates
などを区別しやすくなるためgoodです.
language extensionsがズラズラ並んでるのは美しくないのでno goodです. しかし, 周辺ツールが全然cabalを読みに行かないような状況なので, 仕方ないと思います.
hpackを使えばcabalのexposed-modules
をずらずら手で書く必要がなくなりますし,
hpackのパッケージはcabalのような独自フォーマットではなくyamlになっていてとても良い.
全体的に急激に変わっていて戸惑いましたが, 良くはなってる変更なので受け入れられました.
デプロイトラブル
開発機で動くことを確認してからデプロイしたら以下のようなエラー.
lstat(./lualatex) failed ...
./lualatex: No such file or directory
lualatex: progname.c:316: remove_dots: Assertion `ret' failed.
lualatex
から/usr/bin/lualatex
の直接パス指定に切り替えて解決.
そしたら以下のエラー.
! ==> Fatal error occurred, no output PDF file produced!
Transcript written on input.log.
listingsを指定していないと他の機能でコードハイライトを別にやろうとして, その機能が入ってないためエラーが起きていました.
ところがそれを直しても変わらずエラー. サーバにpandocを入れて同じテンプレートを使ってもちゃんと動く. 手元だとweb版でもちゃんと動く.
こうなると違うのはketerの有無だけになりました. というわけでketerを外して直接サーバ側でビルドして動かすようにしたら動きました.
keterの何が悪かったかは謎です. http/2を高速に動かしたいので, nginxのproxyでhttpsを外さずにketerを使いたいのですが…