Subversion Repositories wimsdev

Rev

Rev 975 | Rev 11931 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #!/usr/bin/perl
  2. #use Date::Format;
  3. use warnings;
  4. use strict;
  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.  
  15. my $wims_ref='http://127.0.0.1/wims';
  16. my $file='' ;
  17. my ($out, $modif, $text);
  18. push (@ARGV,split(' ', $ENV{'wims_exec_parm'})) if ($ENV{'wims_exec_parm'}) ;
  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. } ;
  28. $wims_ref =~ s,/wims.cgi,, ;
  29. my $head= "<\?xml version=\"1.0\" encoding=\"ISO-8859-1\"\?>
  30. <rss version=\"2.0\">
  31.    <channel>
  32.        <title>WIMS</title>
  33.        <link>$wims_ref</link>
  34.        <description>NEWS</description>
  35.        \n"
  36. ;
  37.  
  38. my $tail="</channel></rss>";
  39.  
  40. open(IN, "$file.$modif") or die $file ;
  41. my @lignes = <IN>;
  42. my ($cnt, $used)= (1,'') ;
  43. my @ta;
  44. foreach( reverse( @lignes ) ) {
  45.   my @l=split(":", $_)  ;
  46.   my $date= convdate($l[0]) ;
  47.   next if !($l[1]) ;
  48.   my @ta=split(" ", $l[1]) ;
  49.   next if !($l[1]) || ($used =~ /$l[1]/) || ($cnt > 100) ;
  50.   $cnt ++ ;
  51.   $used .= " " . $l[1] ;
  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>
  59. </item>\n" ;
  60. }
  61.  
  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/ ;
  66.      time2str(str2time($d));
  67. }
  68.  
  69. sub out { my ($bloc, $text) = @_ ;
  70.   open  (OUT, ">$bloc") || die $bloc ;
  71.   print OUT $text ; close OUT ;
  72. }
  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.  
  291.