From http://www.jwz.org/xscreensaver/xscreensaver-5.15.tar.gz
[xscreensaver] / OSX / update-info-plist.pl
index f3ae48283dbf024f40c493e4032ba3b002296e84..74778d43b9fedfd9b4ce7f24263650293f6750db 100755 (executable)
@@ -1,5 +1,5 @@
 #!/usr/bin/perl -w
-# Copyright © 2006 Jamie Zawinski <jwz@jwz.org>
+# Copyright © 2006-2011 Jamie Zawinski <jwz@jwz.org>
 #
 # Permission to use, copy, modify, distribute, and sell this software and its
 # documentation for any purpose is hereby granted without fee, provided that
 # Created:  8-Mar-2006.
 
 require 5;
-use diagnostics;
+#use diagnostics;      # Fails on some MacOS 10.5 systems
 use strict;
 
 my $progname = $0; $progname =~ s@.*/@@g;
-my $version = q{ $Revision: 1.6 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+my $version = q{ $Revision: 1.17 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+
+$ENV{PATH} = "/usr/local/bin:$ENV{PATH}";   # for seticon
+
 
 my $verbose = 1;
 
@@ -31,11 +34,10 @@ sub read_info_plist($) {
   my ($app_dir) = @_;
   my $file = "$app_dir/Contents/Info.plist";
   $file =~ s@/+@/@g;
-  local *IN;
-  my $body = '';
-  error ("$file: $!") unless open (IN, "<$file");
-  while (<IN>) { $body .= $_; }
-  close IN;
+  open (my $in, '<', $file) || error ("$file: $!");
+  local $/ = undef;  # read entire file
+  my $body = <$in>;
+  close $in;
   return ($file, $body);
 }
 
@@ -44,14 +46,18 @@ sub read_saver_xml($) {
   my ($app_dir) = @_;
   error ("$app_dir: no name") 
     unless ($app_dir =~ m@/([^/.]+).(app|saver)/?$@x);
-  my $name = lc($1);
-  my $file = "$app_dir/Contents/Resources/$name.xml";
+  my $name  = $1;
+  my $file  = "$app_dir/Contents/Resources/" . lc($name) . ".xml";
+  my $file2 = "$app_dir/Contents/PlugIns/$name.saver/Contents/Resources/" .
+              lc($name) . ".xml";
   $file =~ s@/+@/@g;
-  local *IN;
-  my $body = '';
-  error ("$file: $!") unless open (IN, "<$file");
-  while (<IN>) { $body .= $_; }
-  close IN;
+  my $in;
+  open ($in, '<', $file) || 
+  open ($in, '<', $file2) || 
+    error ("$file: $!");
+  local $/ = undef;  # read entire file
+  my $body = <$in>;
+  close $in;
   return ($file, $body);
 }
 
@@ -72,17 +78,19 @@ sub update_saver_xml($$) {
   $desc =~ s/\s*$//s;
 
   # in case it's done already...
+  $desc =~ s@<!--.*?-->@@gs;
   $desc =~ s/^.* version \d[^\n]*\n//s;
   $desc =~ s/^From the XScreenSaver.*\n//m;
   $desc =~ s@^http://www\.jwz\.org/xscreensaver.*\n@@m;
-  $desc =~ s/^Copyright [^ \r\n\t]+ (\d{4})(-\d{4})? (.*)\.$/Written $3; $1./m;
+  $desc =~
+       s/\nCopyright [^ \r\n\t]+ (\d{4})(-\d{4})? (.*)\.$/\nWritten $3; $1./s;
   $desc =~ s/^\n+//s;
 
   error ("$filename: description contains bad characters")
     if ($desc =~ m/([^\t\n -~]|[<>])/);
 
   error ("$filename: can't extract authors")
-    unless ($desc =~ m@^(.*)\nWritten by[ \t]+([^\n]+)$@s);
+    unless ($desc =~ m@^(.*)\nWritten by[ \t]+(.+)$@s);
   $desc = $1;
   my $authors = $2;
   $desc =~ s/\s*$//s;
@@ -93,6 +101,7 @@ sub update_saver_xml($$) {
     $year = $2;
   }
 
+  error ("$filename: can't extract year") unless $year;
   my $cyear = 1900 + ((localtime())[5]);
   $year = "$cyear" unless $year;
   if ($year && ! ($year =~ m/$cyear/)) {
@@ -106,24 +115,22 @@ sub update_saver_xml($$) {
   #
   my $curator = "Jamie Zawinski";
   if (! ($authors =~ m/$curator/si)) {
-    if ($authors =~ m@^(.*),? and (.*)$@s) {
+    if ($authors =~ m@^(.*?),? and (.*)$@s) {
       $authors = "$1, $2, and $curator";
     } else {
       $authors .= " and $curator";
     }
   }
 
-  my $cc = "\302\251";  # unicode "&copy;"
-
-  my $desc1 = ("$name, version $vers.\n\n" .
+  my $desc1 = ("$name, version $vers.\n\n" .           # savername.xml
                $desc . "\n" .
                "\n" . 
-               "From the XScreenSaver collection:\n" .
+               "From the XScreenSaver collection: " .
                "http://www.jwz.org/xscreensaver/\n" .
                "Copyright \251 $year by $authors.\n");
 
-  my $desc2 = ("$name $vers,\n" .
-               "$cc $year $authors.\n" .
+  my $desc2 = ("$name $vers,\n" .                      # Info.plist
+               "\302\251 $year $authors.\n" .
                "From the XScreenSaver collection:\n" .
                "http://www.jwz.org/xscreensaver/\n" .
                "\n" .
@@ -187,7 +194,8 @@ sub set_icon($) {
 
   # "seticon" is from osxutils, http://osxutils.sourceforge.net/
 
-  my $icon = "$app_dir/../../../XScreenSaver.icns";
+  my $icon = ($app_dir =~ m/\.saver$/ ? 'XScreenSaver' : 'SaverRunner');
+  $icon = "$app_dir/../../../$icon.icns";
   my @cmd = ("seticon", "-d", $icon, $app_dir);
   print STDERR "$progname: exec: " . join(' ', @cmd) . "\n"
     if ($verbose > 1);
@@ -216,6 +224,11 @@ sub update($) {
   my $copyright = "$1";
   $copyright =~ s/\b\d{4}-(\d{4})\b/$1/;
 
+  # Lose the Wikipedia URLs.
+  $info_str =~ s@http:.*?\b(wikipedia|mathworld)\b[^\s]+[ \t]*\n?@@gm;
+
+  $info_str =~ s/(\n\n)\n+/$1/gs;
+  $info_str =~ s/(^\s+|\s+$)//gs;
   $plist = set_plist_key ($filename, $plist, 
                           "NSHumanReadableCopyright", $copyright);
   $plist = set_plist_key ($filename, $plist,
@@ -254,13 +267,14 @@ sub usage() {
 }
 
 sub main() {
+
   my @files = ();
-  while ($#ARGV >= 0) {
-    $_ = shift @ARGV;
-    if ($_ eq "--verbose") { $verbose++; }
-    elsif (m/^-v+$/) { $verbose += length($_)-1; }
-    elsif (m/^-./) { usage; }
-    else { push @files, $_; }
+  while ($_ = $ARGV[0]) {
+    shift @ARGV;
+    if    (m/^--?verbose$/s)  { $verbose++; }
+    elsif (m/^-v+$/)          { $verbose += length($_)-1; }
+    elsif (m/^--?q(uiet)?$/s) { $verbose = 0; }
+    else                      { push @files, $_; }
   }
   usage() unless ($#files >= 0);
   foreach (@files) {