블로그 이미지
JEEN

서울에 사는 꽃청년의 IT찌질모험기

Rss feed Tistory
IT/Perl 2008.07.10 12:29

[ Perl ] Perl 의 Template Engine - Template Toolkit 을 알아보자(구요)!

사용자 삽입 이미지

 PHP 에는 Smarty 라는 것을 써봤는데, 요즘은 Template_ 라는 게 인기라더군요(s.*_cheeru님 曰)
 Perl 에는 Template Toolkit 이라는 녀석이 있습니다. Perl 의 대표적인 템플릿 엔진인데요.
 
 대부분 이런 템플릿 엔진을 사용하는 이유는, 역시 코드와 HTML 을 분리하기 위함이겠죠?
 아무래도 Perl 코드에 지저분하게 HTML 을 옹기종기 박아놓는 것은 저 역시도 맘에 들지 않습니다.

 요 근래의 업무중에 Feed를 만드는 일이  있었는데.. 여기에 Feed 의 Content 로 HTML 이 들어가는 경우가 있어서, Template Toolkit 을 가볍게 사용해보았습니다.

 (물론 Catalyst 같은 Perl 의 프레임워크의 기본적인 템플릿 엔진은 Template Toolkit 입니다. 여기서는 단지 프레임워크와는 동떨어져서 Template Toolkit 을 어떻게 하면 간편하게 이용하느냐에 초점을 맞추겠습니다.)

 일단 RSS Feed 를 만들기 위해 XML::Feed 라는 모듈을 사용합니다. 아, 물론 Template Toolkit 도 깔려 있어야되겠죠.

  - XML::Feed
  - Template

 위의 두 모듈을 CPAN 인스톨 합니다.
 물론 관련된 의존 모듈이 여러가지 깔리게 되므로... 다른 것은 언급하지 않겠습니다. :-) (XML::Atom 이라든가...)

 feed_gen.pl
use strict;
use warnings;
use DateTime;
use XML::Feed;
use Template;

my $feed = XML::Feed->new('Atom');

$feed->title("이빨까기 인형");
$feed->link("http://jeen.tistory.com/");
$feed->description("사이비 개발자의 이빨까기");
$feed->author("JEEN");
$feed->modified(DateTime::W3CDTF->parse_datetime(DateTime->now( time_zone => 'Asia/Seoul' ). '+09:00'));

# blahblah 어쩌고 저쩌고 해서 Feed 에 넣을 데이터 모집 :: 여기서는 그냥 파일로 왔다고 하겠습니다.

while(<>) {
  chomp;
  my @data = split /¥t/, $_;
  my $entry = XML::Feed::Entry->new('Atom');
  $entry->title($data[0]);
  $entry->link($data[1]);
  $entry->summary($data[2]);
  $entry->modified(DateTime->W3CDTF->parse_datetime(DateTime->now( time_zone => 'Asia/Seoul'). '+09:00'));
 $entry->issued(DateTime->W3CDTF->parse_datetime(DateTime->now( time_zone => 'Asia/Seoul'). '+09:00'));
  $entry->id($data[3]);
  my $content = XML::Feed::Content->new({ body => _make_content() });
  $entry->content($content);
  $feed->add_entry($entry);
}

open my $fh, ">", "test.xml";
print $fh $feed->as_xml;
close $fh;

sub _make_content {
  my $tt = Template->new;
  my $html;
  $tt->process('file.html', { action => 'attack', target => [qw/ saillinux whitecat /], }, ¥$html);
  $html;
}

 file.html (Template)
[% FOREACH d = target %]
[% d %] 를 [% action %] 하겠습니다.<br/>
[% END %]
 -- Perl방 평화유지위원회 JEEN --

 물론 코드의 테스트는 안해봤습니다. 즉석에서 그냥 이래저래 읊어봐서요. 문제가 있고, 수정을 해야된다면 그건 숙제로 남기겠습니다. :-)

 그러면 결과로는 test.xml 이 생성되고, 그 xml 은 위에서 언급한 포맷으로 구성이 되며, 적절한 RSS 리더로 읽어들이면 보일겁니다.

 일단 메인은 Template 에 대한 이야기니까... 이것에 대한 상세한 코드를 볼까요?
  my $tt = Template->new;
    # Template 의 인스턴스를 생성합니다.

  my $html;  # 템플릿 결과물을 담을 그릇이 됩니다.

  $tt->process('file.html', { action => 'attack', target => [qw/ saillinux whitecat /], }, ¥$html);
     # process 의 첫번째 인수는 템플릿 파일, 두번째 인수는 템플릿 변수(?) 입니다. 여기에서 템플릿에서 처리할 데이터들을 보내주면 되겠죠?, 세번째는 그 담길 그릇에 대한 레퍼런스가 필요합니다.

  print $html;  # 이 시점에서는 템플릿 결과가 나오게 됩니다.
  # saillinux 를 attack 하겠습니다.
  # whitecat 를 attack 하겠습니다.
  # -- Perl 방 평화유지위원회 JEEN --

 TT2 의 너무 간단한 사용법에 대한 이야기는 여기까지입니다.
 사실 TT2 하나 만으로도 이미 책 한권이 나와버렸거든요. 그만큼 문서화가 잘되어 있기 때문에 문제없이 사용하실 수 있으실 겁니다.
 
 이상입니다. 너무나도 허접한 코드와 대충대충 설명 죄송합니다. ;; 뭘해도 역시 문서를 읽는 수 밖에 없겠죠 ;-)

 충고나 질문등은 IRC 와 댓글을 이용해주시면 감사하겠습니다.

신고
TOTAL 483,766 TODAY 1

티스토리 툴바