Jeen - Yet anothere techlog

STFUAWSC

Export Facebook Event Attending List - Perl-kr TeaTime

지난번 1회 티타임때의 문제가 제대로 참가비 징수를 못해서 비용정산에 어려움이 있었는데, 이 문제를 해결하기 위해서 간단하게 참가자 리스트를 A4 용지로 뽑아내서 체크하도록 하는 건 어떨까 하는 생각이 있었습니다.

아무튼 그런 생각을 잠깐 했다가 해볼까 해서 아래처럼 코드를 써넣었습니다.

~~~ use strict; use warnings; use Text::Xslate; use Data::Section::Simple; use Facebook::Graph;

my $fb = Facebook::Graph->new; $fb->access_token(“YOUR ACCESS TOKEN”); my $r = $fb->fetch(‘466164950078338/attending’); my @attendees; for my $person (@{ $r->{data} }) {

my $f = $fb->fetch($person->{id});
$f->{profile_image} = $fb->picture($person->{id})->get_large->uri_as_string;  
push @attendees, $f;

} push @attendees, {} for (1..3);

my $tx = Text::Xslate->new(

syntax => 'TTerse',
module => \[ 'Text::Xslate::Bridge::TT2Like' \],
path => \[
    Data::Section::Simple->new()->get_data_section()
\],

);

print $tx->render(‘template.tx’, { attendees => \@attendees });

DATA

@@ template.tx #perl-kr 티타임 #2

※ #perl-kr 티타임 #2

 <thead>
   <tr>
     <th class="span1">&nbsp;</th>
     <th class="span1">&nbsp;</th>
     <th class="span2">Name</th> 
     <th class="span1">Attend?</th>
   </tr>
 </thead>
 <tbody>
   \[% FOREACH p IN attendees %\]
   <tr>
     <td>\[% loop.count %\]</td>
     <td><img src="\[% p.profile_image %\]" width="30" height="30" /></td>
     <td>\[% p.name %\]\[% IF p.username %\](\[% p.username %\])\[% END %\]</td> 
     <td></td>
   </tr>
   \[% END %\] 
 </tbody>

@@ css.tx table { max-width: 100%; border-collapse: collapse; border-spacing: 0; }

.table { width: 100%; margin-bottom: 18px; } .table th, .table td { padding: 8px; line-height: 18px; text-align: left; vertical-align: top; border-top: 1px solid #ddd; } .table th { font-weight: bold; } .table thead th { vertical-align: bottom; } .table thead:first-child tr th, .table thead:first-child tr td { border-top: 0; } .table tbody + tbody { border-top: 2px solid #ddd; } .table-condensed th, .table-condensed td { padding: 4px 5px; }

.table-bordered { border: 1px solid #ddd; border-collapse: separate; *border-collapse: collapsed; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .table-bordered th + th, .table-bordered td + td, .table-bordered th + td, .table-bordered td + th { border-left: 1px solid #ddd; } .table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child td { border-top: 0; } .table-bordered thead:first-child tr:first-child th:first-child, .table-bordered tbody:first-child tr:first-child td:first-child { -webkit-border-radius: 4px 0 0 0; -moz-border-radius: 4px 0 0 0; border-radius: 4px 0 0 0; } .table-bordered thead:first-child tr:first-child th:last-child, .table-bordered tbody:first-child tr:first-child td:last-child { -webkit-border-radius: 0 4px 0 0; -moz-border-radius: 0 4px 0 0; border-radius: 0 4px 0 0; } .table-bordered thead:last-child tr:last-child th:first-child, .table-bordered tbody:last-child tr:last-child td:first-child { -webkit-border-radius: 0 0 0 4px; -moz-border-radius: 0 0 0 4px; border-radius: 0 0 0 4px; } .table-bordered thead:last-child tr:last-child th:last-child, .table-bordered tbody:last-child tr:last-child td:last-child { -webkit-border-radius: 0 0 4px 0; -moz-border-radius: 0 0 4px 0; border-radius: 0 0 4px 0; } .table-striped tbody tr:nth-child(odd) td, .table-striped tbody tr:nth-child(odd) th { background-color: #f9f9f9; }

.table tbody tr:hover td, .table tbody tr:hover th { background-color: #f5f5f5; }

table .span1 { float: none; width: 44px; margin-left: 0; } table .span2 { float: none; width: 124px; margin-left: 0; } table .span3 { float: none; width: 204px; margin-left: 0; } table .span4 { float: none; width: 284px; margin-left: 0; } table .span5 { float: none; width: 364px; margin-left: 0; } table .span6 { float: none; width: 444px; margin-left: 0; } table .span7 { float: none; width: 524px; margin-left: 0; } table .span8 { float: none; width: 604px; margin-left: 0; } table .span9 { float: none; width: 684px; margin-left: 0; } table .span10 { float: none; width: 764px; margin-left: 0; } table .span11 { float: none; width: 844px; margin-left: 0; }

table .span12 { float: none; width: 924px; margin-left: 0; } ~~~

급작스레 한 작업이라 그냥 간단히 HTML 로 뽑아버렸지만… 사실 꿈은 좀 더 아름다운 레이아웃으로 뙇하고 나와줬으면 했었지요.

일단 예정 참가자 이외에 예상치못한 참가자가 있을 것을 염두해서 3개정도의 행을 더 추가해주었구요;;

Text::Xslate + Data::Section::Simple 의 조합은 파일하나에 우걱우걱 템플릿까지 끼워넣고 이럴 경우에는 아주 좋았습니다.

CSS 도 그냥 별도의 섹션으로 나눠서 INCLUDE 해버릴 수도 있으니 :–)

Facebook::Graph 모듈은 생각보다 좀 변태같습니다. 그 이유는 Facebook Graph API 도 변태같다는 근본적인 …. 그리고 Access Token 은 뭐 적당하게 Developer 페이지 가서 줏어서 넣었습니다. :–)

Comments