Groovy で はてなダイアリー 書く Gradle で 準備する #gadvent2012

G*な皆さん、こんにちは!
G* Advent Calendar 2012、12/19担当の@nightmare_timです。前日は、@hideokuさんの、 Geb で JavaScript のテストをしてみた #gadvent2012でした^^
今年は、6月に転職という大きな波をくぐり抜け、やっと生活が落ち着いてきた感じがあります。ばたばたは相変わらずですけども、こうやってG* Advent Calendar 2012に参加できるのもうれしく思います。では、始めます。

今回のテーマ

今回のテーマは、 「Groovyではてなダイアリーを書く」です。ぶっちゃけ言うと、ただ HTMLBuilderを使ってHTMLを生成するだけなんですが(^^;本当はHatenaAPIとかを使って自動でアップデートまでやりたいとこですが、まずはコードで原文書いてそれをGitやMarcurialで管理したいのもあって、ローカルで作成手順を作りました。
きっかけは、以前行われた SCMBC NAGOYAの時に、@irofさんが言われていた 「Groovistだったら閉じタグのHTMLなんか面倒でしょ?」という発言をお聞きして、「ほう」と思ったことが始まりです。(もう8カ月も前の話xx)それまではてなダイアリーも普通にHTMLで書いていたので、「それだったらGroovyで書くかな」と思いはじめ始めました。
実際に最近は全てこの形式で書いていますので、その書き方を紹介します。後でその準備と、HTML作成してコピペベースを作るGradleスクリプトを紹介します。

GroovyでHTMLを書くHTMLBuilder

まず記述する時の書式を説明します。参考にしたのは@fumokmm(id:fumokmm)さんの記事 MarkupBuilderでHTML生成を試してみた です。
ヘッダー情報等の決まった構文部
以下の様に記述します。
import groovy.xml.MarkupBuilder      

def writer = new File('作成するファイル.html').newPrintWriter('UTF-8')
def html = new MarkupBuilder(writer)
html.doubleQuotes = true

html.html{
body{
//本文
}
}
本文
プレーンな記述は、以下のように書きます。
mkp.yield('プレーンな記述は、以下のように書きます。');
全てこの形で囲うようにしてください。このmkp.yieldで渡された文字列はすべて平文としてHTML内に配置されます。
色付き文字
こういった文字を書くには
font(color:'#00AA00','こういった文字を書くには');
リンク
G* Advent Calendar 2012
a(href:'http://atnd.org/events/34317','G* Advent Calendar 2012');
箇条書き
  • りんご
  • みかん
  • ぶどう
ul{      
li{mkp.yield('りんご');};
li{mkp.yield('みかん');};
li{mkp.yield('ぶどう');};
}
表組み
果物 価格
りんご 100
みかん 30
ぶどう 150
table(border:'1'){      
tr{th('果物');th('価格');}
tr{td('りんご');td('100');}
tr{td('みかん');td('30');}
tr{td('ぶどう');td('150');}
}
pre要素
個人的にはこれが一番 面倒です。上述の表組みのソースを示すpre要素の記述はこうなります。
pre{      
mkp.yield('table(border:\'1\'){');br();
mkp.yield(' tr{th(\'果物\');th(\'価格\');}');br();
mkp.yield(' tr{td(\'りんご\');td(\'100\');}');br();
mkp.yield(' tr{td(\'みかん\');td(\'30\');}');br();
mkp.yield(' tr{td(\'ぶどう\');td(\'150\');}');br();
mkp.yield('}');
}
pre要素の中に、mkp.yieldで囲った文章を列挙し、brもつける必要があります。また、 シングルクォーテーションやダブルクォーテーションはバックスラッシュでエスケープする必要があります。
ヘッダー要素
h5('ヘッダー要素')

注意点

  • 改行をしっかり入れる

  • はてなダイアリーは文章の改行コードをしっかり理解してくれるので、それに頼るとレイアウトがよく分からなくなりますので、改行はbrをしっかりつかいましょう。以下のメソッドを使います。
    br();
  • 閉じ中括弧の後に書かない

  • 意外にやってしまいますが、これはコンパイルエラーにならずにRuntimeExceptionになります。
        }br();    //エラーになります

記事全体

当記事の全体をgistに上げておきます。
ファイル全体

ビルド

HTMLと違ってGroovyコードは実行してHTMLコードを出力します。構文間違いなどはコンパイルエラーとして吐き出してくれるので、間違いが少なくなるのは間違いないのですが、やっぱり何度もやるのは骨が折れます。そこで Gradleさんの出番ですね!
行いたいこと
  • 決まった構文が入ったGroovyファイルを用意する。
  • (手動で)HTMLBuilderを使って本文を書く。
  • Groovyを実行してHTMLファイルを作成する。
  • 作成したHTMLファイルの改行を取り除く
  • チェック用のhtml要素とbody要素を抜いたコピペ用を作る。
作成したスクリプト
長くなりそうなので、リンクと使い方だけ説明しておきます。
作成したGradleスクリプトのbitbucket:Mercurialリポジトリ
上記リポジトリをクローンしてください。クローンすると以下のようなGradleスクリプトができます。
└── hatenadiarymakescript      
├── build.gradle
└── gradle_mkdir.gradle
以前作成した Gradle 標準ディレクトリ構造 自動作成をここでも使用しています。ただし、build.gradleの外部参照として定義してあります。手順は以下の様になります。
  1. GradleにGroovyファイルを準備させる。
  2. gradle ready
    これで、GradleのGroovy標準ディレクトリ構成が作成され、hatenadiary.groovyファイルが準備されます。すでに決まった構文部は記述された状態になります。
  3. 本文を書く
  4. もちろん、手動です^^
  5. Groovyの実行、改行の除去、チェック用HTMLとコピペ用ファイルを生成する。
  6. gradle hdmake
    Gradleが自動で実行、改行の除去、コピーの作成を行ってくれるので、ビルドが成功すると以下のようなファイルができるはずです。
    hatenadiary.html    hatenadiary.hd
    htmlファイルがチェック用HTML、hdファイルがコピペ用のファイルです。どちらも改行コードは抜けています。htmlファイルをブラウザで確認し、良ければ、hdファイルの内容をコピーして、はてなダイアリーにはってください。単純なHTMLですので、はてなブログにも問題なく使用できると思っています。 ※実行確認はLinuxで行っています。
タスクはもちろん以下のコマンドでも確認できます。
gradle tasks
特に、gradle hdmakeをこまめに実行して確認していくと、バグやエラーを発見しながら書いていく事ができます。

課題

今のところこれらは手動で…

まとめ

Gradleスクリプトケーススタディのために別で記事にしようと思います。次は@bikisukeさんですね^^楽しみです!今年もあっという間でしたが、皆さん、よいお年をお過ごしくださいm(_ _)m