Subversion Repositories wimsdev

Rev

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