[ トップ | 一覧 | 更新履歴 ]
SOHO,在宅ワークの求人

Perl/Yaino/RSS

PerlCGI | HTML::Template.pm

RSSファイルの出力パッケージ

RSS出力

HTML::Template.pmを使ってRSSの書式を出力します。XMLだろうとHTML::Templateで出力。 Templateを別ファイルにするか悩みましたが、perlソース内にいれてしまいました。

出力はutf-8で固定にしてしまいました。

 %code = (euc  => 'EUC-JP',
          sjis => 'Shift_JIS',
          utf8 => 'UTF-8'
 );

みたいなテーブル使って、出力するcharsetと、Jcodeで変換するコードのハッシュを使って どれでも対応できるようにしてもよいでしょう。

仕様

オブジェクト生成

 $rss = new Yaino::RSS;

パラメータ設定

 $rss->param('rdf:about' => $rdf_url   ); # 出力するRSSファイルのURL
 $rss->param(title       => $site_title); # サイトのタイトル
 $rss->param(link        => $site_url  ); # サイトのURL
 # 記事のタイトル、url, 概要をハッシュにし、その参照を配列にする。
 $items = [
      {   title => $item_title1, link => $item_link1, description => $item_desc1 },
      {   title => $item_title2, link => $item_link2, description => $item_desc2 },
      ...
 ];
 $rss->param(items       => $items  );   # 記事一覧 
 $rss->param('image:flg' => 0       );   # サイトのアイコンを入れるなら1
 $rss->param('image:url' => $img_url);   # アイコン画像のURL

HTML::Templateのparam()ですから、ハッシュをまとめることもできます。

 $rss->param('rdf:about' => $rdf_url,
             title       => $site_title,
             link        => $site_url,
             ...
 );

出力

 $doc = $rss->output;
 print $doc; # print FH $doc など

ソース

    1:  package Yaino::RSS;
    2:  
    3:  ########################################################
    4:  #
    5:  #   $Id$
    6:  #
    7:  ########################################################
    8:  
    9:  require 5.002;
   10:  
   11:  use strict;
   12:  use vars    qw($RCSID $VERSION);
   13:  
   14:  $VERSION = do{
   15:      my  @r=(q$Revision$ =~ /\d+/g);
   16:      sprintf "%d."."%02d" x $#r, @r
   17:  };
   18:  
   19:  BEGIN{
   20:      use Exporter;
   21:      use Jcode;
   22:      use HTML::Template;
   23:  
   24:      use vars    qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
   25:      @ISA        =qw(HTML::Template Exporter);
   26:      @EXPORT     =();
   27:      @EXPORT_OK  =();
   28:      %EXPORT_TAGS=(all=>[@EXPORT_OK,@EXPORT]);
   29:  }
   30:  
   31:  use vars    qw(@EXPORT_OK);
   32:  
   33:  ########################################################
   34:  
   35:  #-------------------------------------------
   36:  #   param
   37:  #       rdf:about       rdf url
   38:  #       title           site title
   39:  #       link            site url
   40:  #       description     site description
   41:  #       item = [
   42:  #           {   title       item
   43:  #               link        item url
   44:  #               description item description
   45:  #           }
   46:  #       image:flg       image output flag
   47:  #       image:url       image url
   48:  #               
   49:  #-------------------------------------------
   50:  
   51:  #-------------------------------------------
   52:  #   new();
   53:  #-------------------------------------------
   54:  sub new
   55:  {
   56:      my  $class  =shift;
   57:      my  %para   =@_;
   58:  
   59:      my  $tmpl_rdf = <<EOS;
   60:  <?xml version="1.0" encoding="utf-8" ?>
   61:  <rdf:RDF 
   62:    xmlns="http://purl.org/rss/1.0/"
   63:    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
   64:    xml:lang="ja">
   65:  
   66:   <channel rdf:about="<TMPL_VAR name="rdf:about">">
   67:    <title><TMPL_VAR name="title"></title>
   68:    <link><TMPL_VAR name="link"></link>
   69:    <description><TMPL_VAR name="description"></description>
   70:    <items>
   71:     <rdf:Seq>
   72:  <TMPL_LOOP name="items">
   73:      <rdf:li rdf:resource="<TMPL_VAR name="link">" />
   74:  </TMPL_LOOP>
   75:     </rdf:Seq>
   76:    </items>
   77:  
   78:  <TMPL_IF name="image:flg">
   79:   <image rdf:resource="<TMPL_VAR name="image:url">" />
   80:  </TMPL_IF>
   81:  
   82:  </channel>
   83:  
   84:  <TMPL_LOOP name="items">
   85:   <item rdf:about="<TMPL_VAR name="link">">
   86:    <title><TMPL_VAR name="title"></title>
   87:    <link><TMPL_VAR name="link"></link>
   88:    <description><TMPL_VAR name="description"></description>
   89:   </item>
   90:  </TMPL_LOOP>
   91:  
   92:  <TMPL_IF name="image:flg">
   93:   <image rdf:about="<TMPL_VAR name="image:url">">
   94:    <title><TMPL_VAR name="title"></title>
   95:    <link><TMPL_VAR name="link"></link>
   96:    <url><TMPL_VAR name="image:url"></url>
   97:   </image>
   98:  </TMPL_IF>
   99:  
  100:  </rdf:RDF>
  101:  EOS
  102:      my  $self = new HTML::Template(
  103:                      scalarref           => \$tmpl_rdf,
  104:                      die_on_bad_params   => 0,
  105:                      %para
  106:      );
  107:  
  108:      bless $self,$class;
  109:  }
  110:  
  111:  #-------------------------------------------
  112:  #   output(override)
  113:  #-------------------------------------------
  114:  sub output
  115:  {
  116:      my  $self   =shift;
  117:      my  %para   =@_;
  118:  
  119:      my  $str = $self->SUPER::output;
  120:      Jcode->new($str)->h2z->utf8;
  121:  }
  122:  

解説

文字コード

60行目と120行目が出力文字コードに依存するところです。

114行目からのoutput()は、HTML::Templateのoutput()をオーバーライドしてます。 SUPERていうのをはじめて知りました。

 $self->SUPER

は、スーパークラスの名前を返してくれて、第1引数に$selfを渡してくれるようです。 参照ならば、

 $str = $self->SUPER->output();  # これはだめっぽい

と書きたいところでしたが。

今回の場合、

 $str = $self->SUPER::output();

は、

 $str = HTML::Template::output($self); # *1

と同じ動作をしてくれます。(*1)の場合、親クラスのメソッドを呼んでいるのかどうだか 一見分からないので、上の方が可読性がある、といえるのでしょうね。

今回のしおしお


GzuGzu (WikiWikiWeb descendant) ver 1.00 pre2
このページはGzuGzuで作成されました.
yaino.com