Rev 11931 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
11931 | schaersvoo | 1 | #!/usr/bin/perl |
975 | bpr | 2 | #use Date::Format; |
4489 | bpr | 3 | use warnings; |
4 | use strict; |
||
975 | bpr | 5 | require Time::Local; |
6 | |||
7 | use vars qw(@DoW @MoY %MoY); |
||
8 | @DoW = qw(Sun Mon Tue Wed Thu Fri Sat); |
||
9 | @MoY = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); |
||
10 | @MoY{@MoY} = (1..12); |
||
11 | |||
12 | my %GMT_ZONE = (GMT => 1, UTC => 1, UT => 1, Z => 1); |
||
13 | |||
14 | |||
4489 | bpr | 15 | my $wims_ref='http://127.0.0.1/wims'; |
12452 | obado | 16 | my $file='' ; |
4489 | bpr | 17 | my ($out, $modif, $text); |
12452 | obado | 18 | push (@ARGV,split(' ', $ENV{'wims_exec_parm'})) if ($ENV{'wims_exec_parm'}) ; |
971 | bpr | 19 | |
20 | while ($_ = shift (@ARGV)) |
||
21 | { |
||
22 | last if (!/^--/); |
||
23 | if (/^--wims=(.*)$/) { $wims_ref = $1; } |
||
24 | elsif (/^--file=(.*)$/) { $file = $1 ; } |
||
25 | elsif (/^--out=(.*)$/) { $out = $1 . "/" ; } |
||
26 | elsif (/^--type=(.*)$/) { $modif = $1 ; } |
||
27 | } ; |
||
12452 | obado | 28 | $wims_ref =~ s,/wims.cgi,, ; |
4489 | bpr | 29 | my $head= "<\?xml version=\"1.0\" encoding=\"ISO-8859-1\"\?> |
971 | bpr | 30 | <rss version=\"2.0\"> |
31 | <channel> |
||
32 | <title>WIMS</title> |
||
33 | <link>$wims_ref</link> |
||
34 | <description>NEWS</description> |
||
35 | \n" |
||
36 | ; |
||
37 | |||
12452 | obado | 38 | my $tail="</channel></rss>"; |
971 | bpr | 39 | |
40 | open(IN, "$file.$modif") or die $file ; |
||
41 | my @lignes = <IN>; |
||
12452 | obado | 42 | my ($cnt, $used)= (1,'') ; |
4489 | bpr | 43 | my @ta; |
971 | bpr | 44 | foreach( reverse( @lignes ) ) { |
45 | my @l=split(":", $_) ; |
||
46 | my $date= convdate($l[0]) ; |
||
12452 | obado | 47 | next if !($l[1]) ; |
971 | bpr | 48 | my @ta=split(" ", $l[1]) ; |
12452 | obado | 49 | next if !($l[1]) || ($used =~ /$l[1]/) || ($cnt > 100) ; |
971 | bpr | 50 | $cnt ++ ; |
12452 | obado | 51 | $used .= " " . $l[1] ; |
971 | bpr | 52 | $text .= |
53 | "<item> |
||
54 | <title>$l[1]</title> |
||
55 | <link>$wims_ref/wims.cgi?module=$ta[0]</link> |
||
56 | <guid isPermaLink=\"true\">$wims_ref/wims.cgi?module=$ta[0]</guid> |
||
57 | <description>$ta[0] version $ta[1]</description> |
||
58 | <pubDate>$date</pubDate> |
||
4489 | bpr | 59 | </item>\n" ; |
971 | bpr | 60 | } |
4489 | bpr | 61 | |
971 | bpr | 62 | out("$out$modif.xml" , $head . $text . $tail) ; |
63 | |||
64 | sub convdate { my ($d)= @_ ; |
||
65 | $d =~ s/(\d{4,4})(\d{2,2})(\d{2,2})/$1-$2-$3 03:00:00/ ; |
||
12452 | obado | 66 | time2str(str2time($d)); |
971 | bpr | 67 | } |
68 | |||
69 | sub out { my ($bloc, $text) = @_ ; |
||
12452 | obado | 70 | open (OUT, ">$bloc") || die $bloc ; |
71 | print OUT $text ; close OUT ; |
||
971 | bpr | 72 | } |
975 | bpr | 73 | |
74 | |||
75 | ########################### from HTML::date.pm |
||
76 | sub time2str (;$) |
||
77 | { |
||
78 | my $time = shift; |
||
79 | $time = time unless defined $time; |
||
80 | my ($sec, $min, $hour, $mday, $mon, $year, $wday) = gmtime($time); |
||
81 | sprintf("%s, %02d %s %04d %02d:%02d:%02d GMT", |
||
82 | $DoW[$wday], |
||
83 | $mday, $MoY[$mon], $year+1900, |
||
84 | $hour, $min, $sec); |
||
85 | } |
||
86 | |||
87 | |||
88 | sub str2time ($;$) |
||
89 | { |
||
90 | my $str = shift; |
||
91 | return undef unless defined $str; |
||
92 | |||
93 | # fast exit for strictly conforming string |
||
94 | if ($str =~ /^[SMTWF][a-z][a-z], (\d\d) ([JFMAJSOND][a-z][a-z]) (\d\d\d\d) (\d\d):(\d\d):(\d\d) GMT$/) { |
||
95 | return eval { |
||
96 | my $t = Time::Local::timegm($6, $5, $4, $1, $MoY{$2}-1, $3-1900); |
||
97 | $t < 0 ? undef : $t; |
||
98 | }; |
||
99 | } |
||
100 | |||
101 | my @d = parse_date($str); |
||
102 | return undef unless @d; |
||
103 | $d[0] -= 1900; # year |
||
104 | $d[1]--; # month |
||
105 | |||
106 | my $tz = pop(@d); |
||
107 | unless (defined $tz) { |
||
108 | unless (defined($tz = shift)) { |
||
109 | return eval { my $t = Time::Local::timelocal(reverse @d); |
||
110 | $t < 0 ? undef : $t; |
||
111 | }; |
||
112 | } |
||
113 | } |
||
114 | |||
115 | my $offset = 0; |
||
116 | if ($GMT_ZONE{uc $tz}) { |
||
117 | # offset already zero |
||
118 | } |
||
119 | elsif ($tz =~ /^([-+])?(\d\d?):?(\d\d)?$/) { |
||
120 | $offset = 3600 * $2; |
||
121 | $offset += 60 * $3 if $3; |
||
122 | $offset *= -1 if $1 && $1 eq '-'; |
||
123 | } |
||
124 | else { |
||
125 | eval { require Time::Zone } || return undef; |
||
126 | $offset = Time::Zone::tz_offset($tz); |
||
127 | return undef unless defined $offset; |
||
128 | } |
||
129 | |||
130 | return eval { my $t = Time::Local::timegm(reverse @d); |
||
131 | $t < 0 ? undef : $t - $offset; |
||
132 | }; |
||
133 | } |
||
134 | |||
135 | |||
136 | sub parse_date ($) |
||
137 | { |
||
138 | local($_) = shift; |
||
139 | return unless defined; |
||
140 | |||
141 | # More lax parsing below |
||
142 | s/^\s+//; # kill leading space |
||
143 | s/^(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)[a-z]*,?\s*//i; # Useless weekday |
||
144 | |||
145 | my($day, $mon, $yr, $hr, $min, $sec, $tz, $ampm); |
||
146 | |||
147 | # Then we are able to check for most of the formats with this regexp |
||
148 | (($day,$mon,$yr,$hr,$min,$sec,$tz) = |
||
149 | /^ |
||
150 | (\d\d?) # day |
||
151 | (?:\s+|[-\/]) |
||
152 | (\w+) # month |
||
153 | (?:\s+|[-\/]) |
||
154 | (\d+) # year |
||
155 | (?: |
||
156 | (?:\s+|:) # separator before clock |
||
157 | (\d\d?):(\d\d) # hour:min |
||
158 | (?::(\d\d))? # optional seconds |
||
159 | )? # optional clock |
||
160 | \s* |
||
161 | ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+)? # timezone |
||
162 | \s* |
||
163 | (?:\(\w+\))? # ASCII representation of timezone in parens. |
||
164 | \s*$ |
||
165 | /x) |
||
166 | |||
167 | || |
||
168 | |||
169 | # Try the ctime and asctime format |
||
170 | (($mon, $day, $hr, $min, $sec, $tz, $yr) = |
||
171 | /^ |
||
172 | (\w{1,3}) # month |
||
173 | \s+ |
||
174 | (\d\d?) # day |
||
175 | \s+ |
||
176 | (\d\d?):(\d\d) # hour:min |
||
177 | (?::(\d\d))? # optional seconds |
||
178 | \s+ |
||
179 | (?:([A-Za-z]+)\s+)? # optional timezone |
||
180 | (\d+) # year |
||
181 | \s*$ # allow trailing whitespace |
||
182 | /x) |
||
183 | |||
184 | || |
||
185 | |||
186 | # Then the Unix 'ls -l' date format |
||
187 | (($mon, $day, $yr, $hr, $min, $sec) = |
||
188 | /^ |
||
189 | (\w{3}) # month |
||
190 | \s+ |
||
191 | (\d\d?) # day |
||
192 | \s+ |
||
193 | (?: |
||
194 | (\d\d\d\d) | # year |
||
195 | (\d{1,2}):(\d{2}) # hour:min |
||
196 | (?::(\d\d))? # optional seconds |
||
197 | ) |
||
198 | \s*$ |
||
199 | /x) |
||
200 | |||
201 | || |
||
202 | |||
203 | # ISO 8601 format '1996-02-29 12:00:00 -0100' and variants |
||
204 | (($yr, $mon, $day, $hr, $min, $sec, $tz) = |
||
205 | /^ |
||
206 | (\d{4}) # year |
||
207 | [-\/]? |
||
208 | (\d\d?) # numerical month |
||
209 | [-\/]? |
||
210 | (\d\d?) # day |
||
211 | (?: |
||
212 | (?:\s+|[-:Tt]) # separator before clock |
||
213 | (\d\d?):?(\d\d) # hour:min |
||
214 | (?::?(\d\d(?:\.\d*)?))? # optional seconds (and fractional) |
||
215 | )? # optional clock |
||
216 | \s* |
||
217 | ([-+]?\d\d?:?(:?\d\d)? |
||
218 | |Z|z)? # timezone (Z is "zero meridian", i.e. GMT) |
||
219 | \s*$ |
||
220 | /x) |
||
221 | |||
222 | || |
||
223 | |||
224 | # Windows 'dir' 11-12-96 03:52PM |
||
225 | (($mon, $day, $yr, $hr, $min, $ampm) = |
||
226 | /^ |
||
227 | (\d{2}) # numerical month |
||
228 | - |
||
229 | (\d{2}) # day |
||
230 | - |
||
231 | (\d{2}) # year |
||
232 | \s+ |
||
233 | (\d\d?):(\d\d)([APap][Mm]) # hour:min AM or PM |
||
234 | \s*$ |
||
235 | /x) |
||
236 | |||
237 | || |
||
238 | return; # unrecognized format |
||
239 | |||
240 | # Translate month name to number |
||
241 | $mon = $MoY{$mon} || |
||
242 | $MoY{"\u\L$mon"} || |
||
243 | ($mon >= 1 && $mon <= 12 && int($mon)) || |
||
244 | return; |
||
245 | |||
246 | # If the year is missing, we assume first date before the current, |
||
247 | # because of the formats we support such dates are mostly present |
||
248 | # on "ls -l" listings. |
||
249 | unless (defined $yr) { |
||
250 | my $cur_mon; |
||
251 | ($cur_mon, $yr) = (localtime)[4, 5]; |
||
252 | $yr += 1900; |
||
253 | $cur_mon++; |
||
254 | $yr-- if $mon > $cur_mon; |
||
255 | } |
||
256 | elsif (length($yr) < 3) { |
||
257 | # Find "obvious" year |
||
258 | my $cur_yr = (localtime)[5] + 1900; |
||
259 | my $m = $cur_yr % 100; |
||
260 | my $tmp = $yr; |
||
261 | $yr += $cur_yr - $m; |
||
262 | $m -= $tmp; |
||
263 | $yr += ($m > 0) ? 100 : -100 |
||
264 | if abs($m) > 50; |
||
265 | } |
||
266 | |||
267 | # Make sure clock elements are defined |
||
268 | $hr = 0 unless defined($hr); |
||
269 | $min = 0 unless defined($min); |
||
270 | $sec = 0 unless defined($sec); |
||
271 | |||
272 | # Compensate for AM/PM |
||
273 | if ($ampm) { |
||
274 | $ampm = uc $ampm; |
||
275 | $hr = 0 if $hr == 12 && $ampm eq 'AM'; |
||
276 | $hr += 12 if $ampm eq 'PM' && $hr != 12; |
||
277 | } |
||
278 | |||
279 | return($yr, $mon, $day, $hr, $min, $sec, $tz) |
||
280 | if wantarray; |
||
281 | |||
282 | if (defined $tz) { |
||
283 | $tz = "Z" if $tz =~ /^(GMT|UTC?|[-+]?0+)$/; |
||
284 | } else { |
||
285 | $tz = ""; |
||
286 | } |
||
287 | return sprintf("%04d-%02d-%02d %02d:%02d:%02d%s", |
||
288 | $yr, $mon, $day, $hr, $min, $sec, $tz); |
||
289 | } |
||
290 |