Created
December 16, 2012 14:22
-
-
Save nightmaretim/4307771 to your computer and use it in GitHub Desktop.
はてなダイアリー用のHTMLを作成したGroovyスクリプトです。Groovyの割にセミコロンが多いのは、1行に多くの事を書くからです。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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