OSDN Git Service

BugTrack-wiki/292 : rssプラグインで生成するリンクが不正になる
[fswiki/fswiki.git] / plugin / rss / RSS.pm
1 ###############################################################################
2 #
3 # <p>³°Éô¥µ¡¼¥Ð¤Ë¤¢¤ëRSS¤ò¼èÆÀ¤·¤Æ°ìÍ÷ɽ¼¨¤·¤Þ¤¹¡£</p>
4 # <pre>
5 # {{rss RSS¤ÎURL}}
6 # </pre>
7 #
8 ###############################################################################
9 package plugin::rss::RSS;
10 use strict;
11 #==============================================================================
12 # ¥³¥ó¥¹¥È¥é¥¯¥¿
13 #==============================================================================
14 sub new {
15         my $class = shift;
16         my $self = {};
17         return bless $self,$class;
18 }
19
20 #==============================================================================
21 # ¥Ñ¥é¥°¥é¥Õ¥á¥½¥Ã¥É
22 #==============================================================================
23 sub paragraph {
24         my $self = shift;
25         my $wiki = shift;
26         my $url  = shift;
27         
28         if($url eq ""){
29                 return &Util::paragraph_error("RSS¤ÎURL¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó¡£");
30         }
31         
32         # ¥­¥ã¥Ã¥·¥å¥Õ¥¡¥¤¥ë¤Î¹¹¿·»þ¹ï¤ò¥Á¥§¥Ã¥¯
33         my $filename = $url;
34         my $cache = $wiki->config('log_dir')."/".&Util::url_encode($filename).".rss";
35         my $readflag = 0;
36         if(-e $cache){
37                 my @status = stat($cache);
38                 if($status[9]+(60*60) > time()){
39                         $readflag = 1;
40                 }
41         }
42         
43         my $content = "";
44         if($readflag==0){
45                 # URL¤«¤éRSS¤ò¼èÆÀ
46                 $content = &Util::get_response($wiki,$url) or return &Util::paragraph_error($!);
47                 
48                 # EUC¤ËÊÑ´¹¡Ê½ÐÎϤ¹¤ë¤È¤­¤ËÊÑ´¹¤¹¤ë¤Î¤¬µÈ¡Ë
49                 #&Jcode::convert(\$content, "euc");
50                 
51                 # ¥­¥ã¥Ã¥·¥å
52                 open(RSS,">$cache") or return &Util::paragraph_error($!);
53                 print RSS $content;
54                 close(RSS);
55                 
56         } else {
57                 # ¥í¡¼¥«¥ë¤«¤éRSS¤ò¼èÆÀ
58                 open(RSS,$cache) or return &Util::paragraph_error($!);
59                 while(<RSS>){ $content .= $_; }
60                 close(RSS);
61         }
62         # XML¥Õ¥¡¥¤¥ë¤«¤É¤¦¤«¥Á¥§¥Ã¥¯
63         if($content !~ /<(\?xml|rss) version/i){
64                 return &Util::paragraph_error("XML¥Õ¥¡¥¤¥ë¤Ç¤Ï¤¢¤ê¤Þ¤»¤ó¡£");
65         }
66         my @status = stat($cache);
67         
68         # ¥Ñ¡¼¥¹¤·¤Æɽ¼¨
69         return $self->parse_rss(\$content);
70 }
71
72 #==============================================================================
73 # RSS¤ò¥Ñ¡¼¥¹¤·¤ÆHTML¤òÀ¸À®
74 #==============================================================================
75 sub parse_rss {
76         my $self    = shift;
77         my $content = shift;
78         my $charset = $self->get_charset($content);
79         my $buf     = "<ul>\n";
80         
81         my $version = "1.0";
82
83         if($$content =~ /<rss .*?version=\"(.*?)\"/i){
84         $version = $1;
85         }
86
87         if($version eq "1.0"){
88                 $$content =~ m#(/channel>|/language>)#si;
89         }
90         
91         my $count=0;
92         
93         while ($$content =~ m|<item[ >](.+?)</item|gsi) {
94                 
95                 my $item = $1;
96                 
97                 my $link  = "";
98                 my $title = "";
99                 my $date  = "";
100                 
101                 $item =~ m#title>([^<]+)</#si;
102                 $title = $1;
103                 
104                 $item =~ m#link>([^<]+)</#si;
105                 $link = $1;
106                 $link =~ s/\s".*//g; # ¥À¥Ö¥ë¥¯¥©¡¼¥Æ¡¼¥·¥ç¥ó°Ê¹ß¤òÀÚ¤êÍî¤È¤¹
107
108                 if ($version eq "2.0") {
109                         if ($item =~ m#pubDate>([^<]+)</#si) {
110                                 $date = $1;
111                         }
112                 }
113                 if ($version eq "1.0") {
114                         #if ($item =~ m#(description|dc\:date)>([^<]+)</#si) {
115                         if ($item =~ m#dc\:date>([^<]+)</#si) {
116                                 $date = $1;
117                         }
118                 }
119                 if ($version eq "0.91") {
120                         if($item =~ m#description>([^<]+)</#si){
121                                 $date = $1;
122                         }
123                 }
124                 
125                 # Ê¸»ú¥³¡¼¥É¤ÎÊÑ´¹
126                 &Jcode::convert(\$title,'euc',$charset);
127                 &Jcode::convert(\$date ,'euc',$charset);
128                 
129                 $buf .= "<li><a href=\"$link\">$title</a>";
130                 if($date ne ""){
131                         $buf .= " - $date";
132
133                 }
134                 $buf .= "</li>\n";
135                 
136                 $count++;
137                 if($count>50){ last; }
138         }
139         
140         return $buf."</ul>\n";
141 }
142
143 #==============================================================================
144 # XML¥Õ¥¡¥¤¥ë¤«¤é¥­¥ã¥é¥¯¥¿¥»¥Ã¥È¤ò¼èÆÀ¤·¤ÆJcode.pm¤Ç»ØÄê²Äǽ¤Êʸ»úÎó¤òÊֵѡ£
145 # »ØÄꤵ¤ì¤Æ¤¤¤Ê¤«¤Ã¤¿¾ì¹ç¤Ïundef¤¬ÊÖ¤ê¤Þ¤¹¡£
146 #==============================================================================
147 sub get_charset {
148         my $self    = shift;
149         my $content = shift;
150         my $charset = undef;
151         
152         # ¥¨¥ó¥³¡¼¥Ç¥£¥ó¥°¤¬»ØÄꤵ¤ì¤Æ¤¤¤¿¾ì¹ç
153         if($$content =~ /encoding="(.+?)"/){
154                 # ¤È¤ê¤¢¤¨¤ºÂçʸ»ú¤ËÊÑ´¹
155                 my $encode = uc($1);
156                 
157                 # Shift_JIS¤Î¾ì¹çsjis¤Ë
158                 if($encode eq "SHIFT_JIS" || $encode eq "SJIS" ||
159                    $encode eq "WINDOWS-31J" || $encode eq "MS932" || $encode eq "CP932"){
160                         $charset = "sjis";
161                         
162                 # EUC-JP¤Î¾ì¹çeuc¤Ë
163                 } elsif($encode eq "EUC-JP"){
164                         $charset = "euc";
165                         
166                 # UTF-8¤Î¾ì¹çutf8¤Ë
167                 } elsif($encode eq "UTF-8"){
168                         $charset = "utf8";
169                         
170                 # JIS¤Î¾ì¹çjis¤Ë
171                 } elsif($encode eq "ISO-2022-JP" || $encode eq "JIS"){
172                         $charset = "jis";
173                 }
174         }
175         
176         return $charset;
177 }
178
179 1;