d.sunnyone.org
sunnyone.org

ページ

2015-02-11

PowerShellでCottleテンプレートエンジンを使う

Cottleは、テンプレート文字列にしたがってテキストを生成する.NET用のテンプレートエンジン。超ざっくり言うと、{}で囲ったところに変数名を書くと展開されたり、構文を書くと分岐ができたりする(文法の詳細はこちら)。今回はこれをPowerShellから使う話を書く。

1. ダウンロード

CottleのライブラリはNuGetからダウンロードするようになっているので、Installing NuGet のCommand-Line Utilityから「nuget.exe」をダウンロードする。そして、以下のコマンドを実行すれば、実行したディレクトリ配下にパッケージが展開されるのでdllを入手する。
> nuget install Cottle
(面倒だったら https://www.nuget.org/api/v2/package/Cottle/1.3.1 てな感じのURL に直接アクセスして拡張子を.zipにして展開すればdllが得られなくもない)

2. 呼び出す

dllの横にスクリプトを置いて、単にドキュメントの通りのメソッドを呼べばいい。一応関数にするとこんな感じ。
(…ほんとはモジュールにしないとね)

# https://www.nuget.org/packages/Cottle/
# https://www.nuget.org/api/v2/package/Cottle/1.3.1
Import-Module $PSScriptRoot\Cottle.dll
function Format-CottleTemplate {
param($Template, $Variables)
process {
$store = New-Object Cottle.Stores.BuiltinStore
foreach ($key in $Variables.Keys) {
$store[$key] = $Variables[$key]
}
$document = New-Object Cottle.Documents.SimpleDocument($Template)
$document.Render($store)
}
}
$tmpl = @"
実行結果
=========
結果: {if IsSuccess:成功|else:失敗}
ログ:
{Log}
"@
Format-CottleTemplate -Template $tmpl -Variables @{
IsSuccess = $false
Log = "Failed to write a file.`nNo space left on device."
}
view raw Cottle.ps1 hosted with ❤ by GitHub

これを実行すると、以下のように出力される。
実行結果
=========
結果: 失敗
ログ:
Failed to write a file.
No space left on device.

ifだけじゃなくいろいろな記法が使えるので、ドキュメントを参照してほしい。

前のPowerShell勉強会で、RazorEngineを使ってRazorテンプレートをPowerShellからレンダリングする話をしたのだけど、PowerShellから呼びやすくもなかったし、何よりRazorがHTML用すぎてPowerShellで使いそうなHTML以外のテキストに向いている文法ではないので、今回はCottleを紹介した。

0 件のコメント:

コメントを投稿