プログラム中に HTML とか埋め込むためのテンプレートエンジン picotemplate を作った件 - kazuhoのメモ置き場
たとえばドキュメント生成ツールなんかを作ってると、HTML をプログラムの中で生成したい!ってことは良くあると思います。でも、そのためにいちいちテンプレートエンジンを使うのは大げさな場合も多いですよね。たとえば、ちょっとリストを出力するとき。以下のような感じのコードを書いたことがある人は多いと思います。
http://d.hatena.ne.jp/kazuhooku/20120726/1343290960
例えばこんなのどうだろう
#include <string>
#include <list>
#include <iostream>
#define _(...) std::string(#__VA_ARGS__)
int
main() {
std::list<std::string> list = {
"foo", "bar", "baz"
};
std::string code = _( <ul class="mylist">\n );
for (auto i = list.begin(); i != list.end(); ++i) {
code += _( <li class="mylist-item"> ) + *i + _( </li>\n );
}
code += _( </ul> );
std::cout << code << std::endl;
}
出力結果
<ul class="mylist">
<li class="mylist-item">foo</li>
<li class="mylist-item">bar</li>
<li class="mylist-item">baz</li>
</ul>
いや、エスケープとか全く考えてないけどね。
キモトの関係で自分が発言したときに通知が欲しいですね
https://twitter.com/bulkneets/statuses/222928161023868929
作りましょう!
#!perl
use strict;
use warnings;
use utf8;
use Config::Pit;
use AnyEvent::Twitter::Stream;
use Growl::Any;
use YAML::Syck;
my $icon = 'https://api.twitter.com/1/users/profile_image?screen_name=bulkneets';
my $growl = Growl::Any->new(appname => "キモトwatcher", events => ["ヤバイ"]);
my $done = AnyEvent->condvar;
my $config = pit_get("api.twitter.com", require => {
consumer_key => 'consumer key on twitter',
consumer_secret => 'consumer secret on twitter',
access_token => 'access token on twitter',
access_token_secret => 'access token secret on twitter',
});
binmode STDOUT, ":utf8";
my $streamer = AnyEvent::Twitter::Stream->new(
consumer_key => $config->{consumer_key},
consumer_secret => $config->{consumer_secret},
token => $config->{access_token},
token_secret => $config->{access_token_secret},
method => 'filter',
follow => '3523861',
on_tweet => sub {
my $tweet = shift;
if ($tweet->{source} =~ 'キモト') {
my $text = $tweet->{text};
$growl->notify("ヤバイ", "キモト", $text, $icon);
warn $text;
}
},
on_error => sub {
my $error = shift;
warn "ERROR: $error";
$done->send;
},
on_eof => sub {
$done->send;
},
);
$done->recv;
Windows の Growl For Windows でも動作します。
AnyEvent::Twitter::Stream の follow にスクリーンネームを渡していて少しハマったのは内緒。
token をどうやって取得するかは、プログラマなら知ってるはずなので頑張って下さい。
イベントで魚拓を取るも良し、メールするも良し、お役立て下さい。
以前から、CSVを一気にtableに出来たらいいなーと思ってたので実装してみた。
例えば以下の様なカンマ区切りのデータ行をビジュアル選択して
tokuhirom, geek, perl
kazuho, geek, jsx
hasegawayosuke, xss, javascript
<c-y>,
をタイプし、以下のクエリを入れる
|
はフィルタを開始する識別で、/
というフィルタに続いて,\s*
という分割する為の正規表現パラメータを渡す。フィルタは元々カンマで複数指定が可能なので、\,
という風に誤爆しないようにエスケープしてる。
Tag: table>tr*>td|/\,\s*
するとこうなる。
<table>
<tr>
<td>tokuhirom</td>
<td>geek</td>
<td>perl</td>
</tr>
<tr>
<td>kazuho</td>
<td>geek</td>
<td>jsx</td>
</tr>
<tr>
<td>hasegawayosuke</td>
<td>xss</td>
<td>javascript</td>
</tr>
</table>
まだ試作段階だけど使いたい人いたらどうぞ。要望などあればgithub issuesで。