2012/07/27


プログラム中に 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>
いや、エスケープとか全く考えてないけどね。

Posted at by



2012/07/26


キモトの関係で自分が発言したときに通知が欲しいですね


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;
        #warn Dump $tweet;
        #warn $tweet->{source};
        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 をどうやって取得するかは、プログラマなら知ってるはずなので頑張って下さい。
キモトwatcher
イベントで魚拓を取るも良し、メールするも良し、お役立て下さい。
Posted at by




以前から、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で。
Posted at by