youtube logo

たつをさんのYouTube plugin 4 charlowにインスパイヤされて、こんなの作ってみた。

[を] YouTubeプラグイン
## YouTube
# usage: {{youtube('ID', 'size:1<2<3<4<5(default)<6<7<...')}}
# Ex. {{youtube("e9-L68H0AHU", 2)}}
sub youtube {
    my ($id, $size) = @_;
    $size = 5 if (not defined $size or $size < 1);
    my $url = "http://www.youtube.com/v/$id";
    my ($w, $h) = (85 * $size, 70 * $size);
    qq(<param name="movie" value="$url"></param>).
    qq(<embed src="$url" type="application/x-shockwave-flash" ).
    qq(width="$w" height="$h"></embed></object>\n);
}

要は、たつをさんのpluginをJavaScript化したもの。こないだの梅田-吉岡対談のように、続きモノの動画を扱うのに手頃かもしれない。なお、ここでは各Videoのタイトルは、吉岡さんのentryの方から援用した。IDはこちらの方がコピペしやすかったので。

番組: 縮尺:

以上を実装するのに使用したソースは、HTML部分も含めて以下のとおり。<select>タグの中身だけ変えれば、他でも簡単に使えるだろう。

インスパイヤのお礼に蛇足ながら元となったperl scriptも添削してみた。

直してみたい箇所は以下のとおり。

  1. $sizeの初期化について
  2. http://www.youtube.com/v/を関数の中にHardcodeするのってどうよ?
  3. $w$hは一行づつ
  4. 折角perlなのだから、Here Textを

まず$sizeの初期化なのだけど、

$size = 5 if (not defined $size or $size < 1);

ってのは無駄が多い。

$size = 5 if $size < 1;

で充分。なぜかというと、not definedが成立した場合、$sizeは数値では0になるので、$size < 1が自動的に成立するから。

次のhttp://www.youtube.com/v/なのだけど、こういった定数は本来なるべく関数定義中では定義したくない。まあ今回はpluginなので、ファイル全体が何百行もあるということは考えにくいのだけど、それでもこういった定数はなるべくロジックから分離しておきたい。

次の$w$hもそれに通じる。85と70という数字は、やはりロジックから分離しておきたいものだし、双方がscalarの場合の初期化をlist contextで行うのも疑問。

最後のHere Textは趣味が分かれるところかも知れない。Here Textを使うと、インデントが崩れてしまうという欠点があって、これはRubyで解決済み、Perl6でもインデントを考慮したHere Textが導入予定ではあるけれども、そもそも今回はHTMLをrenderするので、インデントは入っていてもいいのだよね。

というわけで、以上を反映させると、youtube()はこんな感じになる。

Readonly $youtube_base     => 'http://www.youtube.com/v/';
Readonly $youtube_w_factor => 85;
Readonly $youtube_h_factor => 70;

sub youtube {
    my ($id, $scale) = @_;
    $scale = 5 if $scale < 1;
    my $uri    = $youtube_base . $id;
    my $width  = $youtube_w_factor * $scale;
    my $height = $youtube_h_factor * $scale;
return << "EOT";
<object width="$width" height="$height">
  <param name="movie" value="$uri"></param>
  <embed src="$uri" type="application/x-shockwave-flash"
   width="$width" height="$height"></embed>
</object>
EOT
}

Dan the YouTubist