F# Formattingでドキュメントを生成してみる
Tomas Petricekさんが開発されている、F# Formatting を試してみました。
GitHub : https://github.com/tpetricek/FSharp.Formatting
Documents : http://tpetricek.github.com/FSharp.Formatting/index.html
このツールはF# Snippetsでも使われていますので、F#erにはお馴染みですね。
シンタックス・ハイライトのみならず、マウスオーバーでメンバの情報まで表示される優れものです。
またこのツールは、文芸的プログラミング(Literate programming)にも対応しています。
http://tpetricek.github.com/FSharp.Formatting/demo.html
使ってみた感想ですが、とても良い感じです。
OSSの開発にはかなり便利なのではないでしょうか。
みなさんにも使ってみて頂きたいので、簡単なサンプルをご用意しました。
本題
このツールを使ってドキュメントを生成し、GitHub Pagesで公開するところまでを簡単にご紹介したいと思います。
生成されたドキュメント : http://nobuhisa.github.com/DocSample/Script.html
サンプルプロジェクト : https://github.com/Nobuhisa/DocSample
ページを公開するまでの流れですが、
0. 下準備(NuGetでFSharp.Formattingを追加、リポジトリの準備 等)
1. F# でオープンソースなプログラムを書く
2. 使い方などを示す、サンプルスクリプト(.fsx)を用意する
3. サンプルに解説を付け加える*1
4. F# Formattingを使ってドキュメントを生成!
5. GitHub Pages(gh-paegs)を使って、公開してみる
このような感じです。
順に見ていきます。
FSharp.Formatting の準備
Visual Studioをお使いの場合は、NuGetから簡単にインストールできます。
"FSharp.Formatting"で検索してみてください。
インストールが完了すると、packages以下にいくつかのスクリプトファイルも合わせて配置されます。
(このような感じ)
その中のliterate.fsxが核になります。とりあえず準備はここまで。
プログラムを書く
サンプルとして、以下のような素晴らしいプログラムを用意しました。
https://github.com/Nobuhisa/DocSample/blob/master/DocSample/Library1.fs
namespace DocSample module Sample = /// あいさつ関数です。 let hello () = printfn "hello, world" /// サンプルクラスです。 type Sample() = /// サンプルメソッドです。 member this.Sample () = printfn "F#!F#!"
とても胸が熱くなるサンプルです。
サンプルスクリプトの用意
以下のようなスクリプトファイルを用意したことにしましょう。
#load "Library1.fs" open DocSample Sample.hello () let s = Sample.Sample() s.Sample()
使い方を示すような、そんなスクリプトです。
文芸的プログラミング!
誰が文豪になるか?君でしょう!
用意したスクリプトを、以下のように書き換えます。
これはF# Formattingのルールに沿って記述します。
https://github.com/Nobuhisa/DocSample/blob/master/DocSample/Script.fsx
(** THIS IS A SAMPLE ================ 吾輩はサンプルである。名前はまだない。 Sub Title --------- - sakurai - suzuki - _tahara_ - nakagawa `コミュニティ` - [F# User Group - Japan](https://github.com/Nobuhisa/FSUG_JP/wiki) *) (*** hide ***) // この部分を隠したい時 #load "Library1.fs" open DocSample (** ### Usage: この素晴らしいサンプルは以下のように使用します。 *) Sample.hello () let s = Sample.Sample() s.Sample() (** おわりに ------- Good job, Tomas! *)
内容は適当なので気にしないでください。
追記した部分はコメントになっていますので、スクリプトの実行には影響しません。
ドキュメソトを生成する
packagesに配置されたliterate.fsxを使って生成するのですが、直接使用するのは大変なので、
以下のようなビルドスクリプトを用意してみました。
流用して頂いても構いません。(環境に合わせてパスを変更してください)
サンプルでは、literate.fsxと同じフォルダに配置しています。
build.fsx
#I "../lib/net40" #load "literate.fsx" open FSharp.Literate let processDirectory () = let path = __SOURCE_DIRECTORY__ let dir = path + @"..\..\..\..\DocSample" let template = path + @"\templates\template-project.html" let projectInfo = [ "page-description", "My Sample Document" "page-author", "Nobuhisa" "github-link", "https://github.com/Nobuhisa" "project-name", "DocSample" ] Literate.ProcessDirectory(dir, template, outputDirectory = dir + "\\docs", replacements = projectInfo) do printfn "Start..." processDirectory () printfn "finish!" #if INTERACTIVE #else System.Console.ReadKey() |> ignore #endif
Visual Studioをお使いの方は、Alt + Enterで実行してみてください。
問題がなければドキュメントが生成されます。
サンプルでは、プロジェクトのフォルダにdocsというフォルダを追加し、そこにファイルを生成します。
生成されていない場合は、プログラムやパスの指定に問題があるか、日頃の行いに問題があるかのどちらかです。
なお、このdocsフォルダには必要なスタイルシート、jsファイルが含まれていませんので、
packages以下にあるcontentというフォルダをコピーしてきてください。
まずはローカル環境でHTMLファイルがきちんと表示できるか確認してみてください。
GitHub Pages にて公開
以下のようになります。
http://nobuhisa.github.com/DocSample/Script.html
GitHub Pagesの公開方法は沢山出回っていますので、詳細は省きます。
リポジトリに"gh-pages"というブランチを作って、そこにファイルを配置するだけです。
(こんな感じ)
配置してから表示可能になるまで、少し時間がかかるようです。焦らず数分待ってみてください。
Tomasさんが用意されている以下のドキュメント、
http://tpetricek.github.com/FSharp.Formatting/demo.html
これも、スクリプト(demo.fsx)から生成されています。
まとめ
疲れた!
*1:F# Formattingのルールに沿って記述します