RssAnalyze関数

「#--RssAnalyze」で検索すると確実にヒットします。

この関数は、更新もとのRSSファイルを取得し、どんな要素が使用されているのかを調べ、同じ入力欄を作成します。

引数はありませんが、指定されたURLを使用します。

戻り値は、定義した入力エリアが格納された連想配列リファレンスです。

それでは、処理の流れを見ていきましょう。

RSSの取得

まずは、更新もとのRSSファイルを取得します。

指定されたURLからFeed::FindでRSSURLを取得する部分や…。

RSSファイルの取得に、LWP::UserAgentとHTTP::Requestを使用する部分…。

RSSファイルの大きさを測定しリミッターをかける部分…。

取得したRSSファイルの分析に、XML::RSSを使用する部分…。

ここまでは、RSSリーダーのAnalyze関数と同じなので、詳しくはそちらを参照してください。

ここからは、更新もとのRSSファイルから、各種入力欄を作成していきます。

チャンネル

チャンネルの入力欄を定義します。

my @channel = (
{title => "<input type=\"text\" name=\"channel_title\" size=\"40\" value=\"$XML__RSS->{'channel'}->{'title'}\" />"},
{link => "<input type=\"text\" name=\"channel_link\" size=\"40\" value=\"$XML__RSS->{'channel'}->{'link'}\" />"},
{description => "<input type=\"text\" name=\"channel_description\" size=\"40\" value=\"$XML__RSS->{'channel'}->{'description'}\" />"},
);

タイトル(title)、リンク先(link)と概要(description)の1行入力欄を定義します。

この3つは最低限必要な項目なので、更新もとのRSSファイルをチェックする必要はありません。

次に、それ以外の項目があるかをチェックし、情報を引き継げるように入力欄を作成します。

my %channel_etc = ();
if ($edit_field{'version'} eq "1.0") {
%channel_etc = %{$XML__RSS->{'channel'}->{'dc'}};
} elsif ($edit_field{'version'} eq "2.0") {
%channel_etc = %{$XML__RSS->{'channel'}};
}

まず、RSSのバージョンに関係なく、チャンネル内のその他の要素をチェックできるように準備します。

RSS1.0では、連想配列「%{$XML__RSS->{'channel'}->{'dc'}}」に、チャンネル内でのその他の要素がまとめられています。

RSS2.0では、連想配列「%{$XML__RSS->{'channel'}}」に、タイトル、リンク先や概要と一緒にまとめられています。

なので、新たに連想配列「%channel_etc」を作成し、それぞれの値を代入しそろえておきます。

次に、先ほど作成した連想配列「%channel_etc」に対して、forループをかけてすべての値をチェックします。

for my $key (sort keys %channel_etc) {
my $value = $channel_etc{$key};
next if (($key eq '') or ($value eq ''));
next if (($key =~ /^title$/i) or ($key =~ /^link$/i) or ($key =~ /^description$/i) or ($key =~ /^channel$/i));
if (($key =~ /^date/i) or ($key =~ /date$/i)) {
$edit_field{'channel_dc_date'} = $key;
next;
}
push @channel, {$key => "<input type=\"text\" name=\"channel_dc_$key\" size=\"40\" value=\"$value\" />"};
}

未定義の値や、すでに作成済みの入力欄であった場合には、next関数で次へ飛ばします。

日付情報が記述されていた場合には、日付情報が存在していたことのみ明示しておきます。

日付情報に関しては、RSSファイル更新時に追加するからです。

残りは追加すべき情報なので、チャンネルの入力欄をまとめて格納している配列「@channel」に、1行入力ができる入力エリアという形で代入していきます。

イメージ

イメージの入力欄を定義します。

my @image = (
{logo => "<input type=\"text\" name=\"image_url\" size=\"40\" value=\"$XML__RSS->{'image'}->{'url'}\" />"},
);

サイトバナーのURLが入力できる1行入力エリアを定義します。

アイテム

アイテムの入力欄を定義します。

変数名が違うだけで、前述のチャンネルと同じ流れで、各入力欄を定義します。

統合

チャンネル、イメージとアイテムの入力欄が定義できたら、各変数を統合します。

$edit_field{'channel'} = [@channel];
$edit_field{'image'} = [@image];
$edit_field{'item'} = [@item];

これで連想配列「%edit_field」に、更新もとのRSSファイルの情報がすべて格納されました。

return \%edit_field;

最後にリファレンス形式で値を返し、この関数を終了します。