Skip to content

Instantly share code, notes, and snippets.

@nightmaretim
Created December 16, 2012 14:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nightmaretim/4307771 to your computer and use it in GitHub Desktop.
Save nightmaretim/4307771 to your computer and use it in GitHub Desktop.
はてなダイアリー用のHTMLを作成したGroovyスクリプトです。Groovyの割にセミコロンが多いのは、1行に多くの事を書くからです。
import groovy.xml.MarkupBuilder
def writer = new File('hatenadiary.html').newPrintWriter('UTF-8')
def html = new MarkupBuilder(writer)
html.doubleQuotes = true
html.html{
body(){
//以下本文
font(color:'#00AA00',size:'4','G*な皆さん、こんにちは!');br();
a(href:'http://atnd.org/events/34317','G* Advent Calendar 2012');mkp.yield('、12/19担当の@nightmare_timです。');mkp.yield('今年は、6月に転職という大きな波をくぐり抜け、やっと生活が落ち着いてきた感じがあります。');mkp.yield('ばたばたは相変わらずですけども、こうやってG* Advent Calendar 2012に参加できるのもうれしく思います。');mkp.yield('では、始めます。');br();
h4('今回のテーマ')
mkp.yield('今回のテーマは、');font(color:'#00AA00','「Groovyではてなダイアリーを書く」');mkp.yield('です。');mkp.yield('ぶっちゃけ言うと、ただ');font(color:'#FF0000','HTMLBuilderを使ってHTMLを生成するだけ');mkp.yield('なんですが(^^;');mkp.yield('本当はHatenaAPIとかを使って自動でアップデートまでやりたいとこですが、まずはコードで原文書いてそれをGitやMarcurialで管理したいのもあって、ローカルで作成手順を作りました。');br();
mkp.yield('きっかけは、以前行われた');a(href:'http://kokucheese.com/event/index/32328/','SCMBC NAGOYA');mkp.yield('の時に、@irofさんが言われていた');font(color:'#00AA00','「Groovistだったら閉じタグのHTMLなんか面倒でしょ?」');mkp.yield('という発言をお聞きして、「ほう」と思ったことが始まりです。');mkp.yield('(もう8カ月も前の話xx)');mkp.yield('それまではてなダイアリーも普通にHTMLで書いていたので、「それだったらGroovyで書くかな」と思いはじめ始めました。');br();
mkp.yield('実際に最近は全てこの形式で書いていますので、その書き方を紹介します。');mkp.yield('後でその準備と、HTML作成してコピペベースを作るGradleスクリプトを紹介します。');br();
h4('GroovyでHTMLを書くHTMLBuilder')
mkp.yield('まず記述する時の書式を説明します。');mkp.yield('参考にしたのは@fumokmm(id:fumokmm)さんの記事');a(href:'http://npnl.hatenablog.jp/entry/20090131/1233428513','MarkupBuilderでHTML生成を試してみた ');mkp.yield('です。');br();
h5('ヘッダー情報等の決まった構文部')
mkp.yield('以下の様に記述します。');
pre{
mkp.yield('import groovy.xml.MarkupBuilder');br();
br();
mkp.yield('def writer = new File(\'作成するファイル.html\').newPrintWriter(\'UTF-8\')');br();
mkp.yield('def html = new MarkupBuilder(writer)');br();
mkp.yield('html.doubleQuotes = true');br();
br();
mkp.yield('html.html{');br();
mkp.yield(' body{');br();
mkp.yield(' //本文');br();
mkp.yield(' }');br();
mkp.yield('}');
}
h5('本文')
mkp.yield('プレーンな記述は、以下のように書きます。');
pre{
mkp.yield('mkp.yield(\'プレーンな記述は、以下のように書きます。\');');
}
mkp.yield('全てこの形で囲うようにしてください。');mkp.yield('このmkp.yieldで渡された文字列はすべて平文としてHTML内に配置されます。');
h5('色付き文字')
font(color:'#00AA00','こういった文字を書くには');
pre{
mkp.yield('font(color:\'#00AA00\',\'こういった文字を書くには\');');
}
h5('リンク')
a(href:'http://atnd.org/events/34317','G* Advent Calendar 2012');
pre{
mkp.yield('a(href:\'http://atnd.org/events/34317\',\'G* Advent Calendar 2012\');');
}
h5('箇条書き')
ul{
li{mkp.yield('りんご');};
li{mkp.yield('みかん');};
li{mkp.yield('ぶどう');};
}
pre{
mkp.yield('ul{');br();
mkp.yield(' li{mkp.yield(\'りんご\');};');br();
mkp.yield(' li{mkp.yield(\'みかん\');};');br();
mkp.yield(' li{mkp.yield(\'ぶどう\');};');br();
mkp.yield('}');
}
h5('表組み')
table(border:'1'){
tr{th('果物');th('価格');}
tr{td('りんご');td('100');}
tr{td('みかん');td('30');}
tr{td('ぶどう');td('150');}
}
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('}');
}
h5('pre要素')
mkp.yield('個人的にはこれが一番');font(color:'#FF0000','面倒です');mkp.yield('。上述の表組みのソースを示すpre要素の記述はこうなります。');
pre{
mkp.yield('pre{');br();
mkp.yield(' mkp.yield(\'table(border:\\\'1\\\'){\');br();');br();
mkp.yield(' mkp.yield(\' tr{th(\\\'果物\\\');th(\\\'価格\\\');}\');br();');br();
mkp.yield(' mkp.yield(\' tr{td(\\\'りんご\\\');td(\\\'100\\\');}\');br();');br();
mkp.yield(' mkp.yield(\' tr{td(\\\'みかん\\\');td(\\\'30\\\');}\');br();');br();
mkp.yield(' mkp.yield(\' tr{td(\\\'ぶどう\\\');td(\\\'150\\\');}\');br();');br();
mkp.yield(' mkp.yield(\'}\');');br();
mkp.yield('}');
}
mkp.yield('pre要素の中に、mkp.yieldで囲った文章を列挙し、brもつける必要があります。');mkp.yield('また、');font(color:'#FF0000','シングルクォーテーションやダブルクォーテーションはバックスラッシュでエスケープする必要があります。');
h5('ヘッダー要素')
pre{
mkp.yield('h5(\'ヘッダー要素\')');
}
br();
h4('注意点')
ul{
li{mkp.yield('改行をしっかり入れる');};
mkp.yield('はてなダイアリーは文章の改行コードをしっかり理解してくれるので、それに頼るとレイアウトがよく分からなくなりますので、改行はbrをしっかりつかいましょう。以下のメソッドを使います。');
pre{
mkp.yield('br();');
}
li{mkp.yield('閉じ中括弧の後に書かない');};
mkp.yield('意外にやってしまいますが、これはコンパイルエラーにならずにRuntimeExceptionになります。');
pre{
mkp.yield(' }br(); //エラーになります');
}
}
h4('記事全体')
mkp.yield('当記事の全体をgistに上げておきます。');br();
h4('ビルド')
mkp.yield('HTMLと違ってGroovyコードは実行してHTMLコードを出力します。');mkp.yield('構文間違いなどはコンパイルエラーとして吐き出してくれるので、間違いが少なくなるのは間違いないのですが、やっぱり何度もやるのは骨が折れます。');mkp.yield('そこで');a(href:'http://www.gradle.org/','Gradleさん');mkp.yield('の出番ですね!');
h5('行いたいこと')
ul{
li{mkp.yield('決まった構文が入ったGroovyファイルを用意する。');};
li{mkp.yield('(手動で)HTMLBuilderを使って本文を書く。');};
li{mkp.yield('Groovyを実行してHTMLファイルを作成する。');};
li{mkp.yield('作成したHTMLファイルの改行を取り除く');};
li{mkp.yield('チェック用のhtml要素とbody要素を抜いたコピペ用を作る。');};
}
h5('作成したスクリプト')
mkp.yield('長くなりそうなので、リンクと使い方だけ説明しておきます。');br();
a(href:'https://bitbucket.org/nightmare_tim/hatenadiarymakescript','作成したGradleスクリプトのbitbucket:Mercurialリポジトリ');br();
mkp.yield('上記リポジトリをクローンしてください。');mkp.yield('クローンすると以下のようなGradleスクリプトができます。');
pre{
mkp.yield('└── hatenadiarymakescript');br();
mkp.yield(' ├── build.gradle');br();
mkp.yield(' └── gradle_mkdir.gradle');
}
mkp.yield('以前作成した');a(href:'http://d.hatena.ne.jp/nightmare_tim/20110827/1314467399','Gradle 標準ディレクトリ構造 自動作成');mkp.yield('をここでも使用しています。');mkp.yield('ただし、build.gradleの外部参照として定義してあります。');mkp.yield('手順は以下の様になります。');
ol{
li{mkp.yield('GradleにGroovyファイルを準備させる。');};
pre{
mkp.yield('gradle ready');
}
mkp.yield('これで、GradleのGroovy標準ディレクトリ構成が作成され、hatenadiary.groovyファイルが準備されます。');mkp.yield('すでに決まった構文部は記述された状態になります。');
li{mkp.yield('本文を書く');};
mkp.yield('もちろん、手動です^^');
li{mkp.yield('Groovyの実行、改行の除去、チェック用HTMLとコピペ用ファイルを生成する。');};
pre{
mkp.yield('gradle hdmake');
}
mkp.yield('Gradleが自動で実行、改行の除去、コピーの作成を行ってくれるので、ビルドが成功すると以下のようなファイルができるはずです。');
pre{
mkp.yield('hatenadiary.html hatenadiary.hd');
}
mkp.yield('htmlファイルがチェック用HTML、hdファイルがコピペ用のファイルです。どちらも改行コードは抜けています。');mkp.yield('htmlファイルをブラウザで確認し、良ければ、hdファイルの内容をコピーして、はてなダイアリーにはってください。');mkp.yield('単純なHTMLですので、はてなブログにも問題なく使用できると思っています。');font(color:'#FF0000',size:'1','※注 改行コードはLFを抜いていますので、現状Linux等の環境向けです。GradleスクリプトのタスクremoveLFを修正すればCRLFの除去もできると思います。');
}
mkp.yield('タスクはもちろん以下のコマンドでも確認できます。');
pre{
mkp.yield('gradle tasks');
}
mkp.yield('特に、gradle hdmakeをこまめに実行して確認していくと、バグやエラーを発見しながら書いていく事ができます。');
h4('課題')
ul{
li{mkp.yield('はてなダイアリーに自動で上げれない。');};
li{mkp.yield('画像が貼れない。');};
li{mkp.yield('Amazonなどのアフィリエイトは使用できない。');}
li{mkp.yield('その他複雑な事はできない');};
}
mkp.yield('今のところこれらは手動で…');
h4('まとめ')
mkp.yield('Gradleスクリプトはケーススタディのために別で記事にしようと思います。');mkp.yield('次は@bikisukeさんですね^^');mkp.yield('楽しみです!');mkp.yield('今年もあっという間でしたが、皆さん、よいお年をお過ごしくださいm(_ _)m');
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment