だるろぐ

明日できることは、今日しない。

WebMatrix + Markdown で手軽に更新できる(?)Webサイトを作る

指定したフォルダに Markdown 形式のプレーンテキストを配置して、 http://sample.com/Hoge にアクセスしたら、 Hoge.txt がHTMLへ整形のうえ表示できる……なんてWebサイトがあったら、テキストファイルをぽいぽい書いていくだけでページを更新できて楽かなぁ、なんて思いませんかね。

ちょっとやってみたのだけど、それに近いことができたので、ちょっと晒してみる。その前に、必要な NuGet を入れておこう。

  • Markdown Deep (最近気に入っている Markdown パーサ。MVC3 向けのサンプルもある)
  • Razor Engine (ちょっとあとで面白い機能を付けるために入れておく)

んで、 _Pages.cshtml_ に以下のコードを追加。

	@using System.IO

	@{
	    // Layout = "_SiteLayout.cshtml"; レイアウトを使うならコメントアウト

	    // http://sample.com/Pages/Hoge のうち、Hoge を取得
	    string id = UrlData[0];
	    if (string.IsNullOrEmpty(id)) { id = "Home"; }

	    Page.Title = id; // IDをページタイトルにセット。レイアウトで使う

	    // サーバー上の /Pages/Hoge.txt をロード
	    string path = Server.MapPath(string.Format("/Pages/{0}.txt", id));

	    if (!File.Exists(path)) // ファイルあらへん => 404を投げる
	    {
	        throw new HttpException(404, path + "is not found.");
	    }
	    
	    var content = File.ReadAllText(path);

	    // Markdown エンジン を用意
	    var markdown = new MarkdownDeep.Markdown()
	    {
	        ExtraMode = true,
	    };

	    // HTML へ変換
	    var body = content;
	    body = RazorEngine.Razor.Parse(body); // ※
	    body = markdown.Transform(body);
	}

	@Html.Raw(body) 

※ の部分を入れたお陰で、Markdown に埋め込んだ Razor コードが使える *1 。ただし、自分で作った Helper を追加したところ、呼び出すのは失敗。基本的なクラスなら使えるのだけど、あとから追加したのは RazorEngine に知らせてあげないといけないのかな? ちょっとそこまでは使い方がわからない。

ともあれ、これで http://sample.com/Pages/Hoge にアクセスしたら、 /Pages/Hoge.txt がHTMLとして表示される。_Pages_フォルダにテキストを追加していけば、ページをどんどん増やせる。

あんまりエラー処理していない *2 ので、実際に使う場合はもう少し手を加えなきゃいけないし、入力用のインターフェイスだってほしいかもしれない。「WebMatrix 2」は NuGet の導入も簡単になっているので、さっさと正式版におなりになっていただきたいものですね!

    • -

ほんとは Pages ってのも消したいのだけど、そこもわからなかった。 ASP.NET MVC3 ならば Routing をいじってって感じなのだけど、WebMatrix だとどうやればいいのかなぁ。

*1:たとえば、@DateTime.Now とか

*2:ファイル名として使えない文字が渡された場合など