#!/usr/bin/perl # This script updates the printer list of the driver XML file of # Gimp-Print (db/source/driver/gimp-print.xml in foomatic-db package) # according to the file src/foomatic/foomatic-printermap of the source # tarball of Gimp-Print 4.2.x or later. # # Remarks: # # - Manually added printer entries will not be removed. They drop out # to the beginning of the printer list during the update. The same # happens to printers which are removed from the new foomatic-printermap # # - All printers of foomatic-printermap are put to the end of the list, # the order of foomatic-printermap is preserved. # # - The user will be informed by screen messages if the new # foomatic-printermap contains new printers which were neither in the # previous foomatic-printermap nor under the manually added printers. # # - A printer which was added manually before and is in foomatic-printermap # now will be removed from the list of manually added printers and added # to the list of printers from foomatic-printermap. #use strict; # Read out the program name with which we were called, but discard the path $0 =~ m!/([^/]+)\s*$!; my $progname = $1; my $debug = 0; my ($opt_f, $opt_g, $opt_h); use Getopt::Std; getopts("f:g:h") or $opt_h = 1; if ($opt_h) { print " foomatic-printermap-to-gimp-print-xml [ -f ] \ [ -g ] -f : File src/foomatic/foomatic-printermap of Gimp-Print source tarball (4.2.x or later). Default is foomatic-printermap in the current directory -g : File gimp-print.xml whose printer list should be updated. Default is the gimp-print.xml of the Foomatic database currently in use. This program updates the printer list of the driver XML file of Gimp-Print (db/source/driver/gimp-print.xml in foomatic-db package) according to the file src/foomatic/foomatic-printermap of the source tarball of Gimp-Print 4.2.x or later. "; exit 0; } # Determine gimp-print.xml file my $gimpprintxmlfile = $opt_g; if (!$gimpprintxmlfile) { use Foomatic::Defaults; $gimpprintxmlfile = "$libdir/db/source/driver/gimp-print.xml"; } # Determine foomatic-printermap file my $foomaticprintermapfile = $opt_f; if (!$foomaticprintermapfile) { $foomaticprintermapfile = "./foomatic-printermap"; } # Read list of printer IDs from Gimp-Print's foomatic-printermap open PM, "< $foomaticprintermapfile" or die "Cannot read $foomaticprintermapfile!\n"; my @printermap = ; close PM; (s/^\s*\S+\s+\S+\s+(\S+)\s*$/$1/) foreach @printermap; #print $#printermap; # Read gimp-print.xml open GPX, "< $gimpprintxmlfile" or die "Cannot read $gimpprintxmlfile!\n"; my $gimpprintxml = join("", ); close GPX; # Remove printer list #$gimpprintxml =~ s!(<\s*printers\s*>).*(\n\s*<\s*/\s*printers\s*>)!$1$2!s; # Mark beginning of printer list from foomatic-printermap before deleting # these printer entries $gimpprintxml =~ s:\n :XXXXXXXXXX:s; # Remove only those printers which are in foomatic-printermap. We # re-add them in the next step, this way we have all printers of # foomatic-printermap together and in the order of # foomatic-printermap, and we have all manually added printers in the # beginning of the list, before the printers of foomatic-printermap # are listed. print STDERR "Removing old printer entries "; foreach my $printer (@printermap) { print STDERR "."; $gimpprintxml =~ s:\s*<\!\-\-[^<>]*?\-\->\s*\s*\s*$printer\s*.*?::s or $gimpprintxml =~ s:\s*\s*\s*$printer\s*.*?::s or print STDERR "\n\nNew printer: $printer\n\n"; } print STDERR "\n\n"; # Insert comment to mark the part of the list set up manually $gimpprintxml =~ s:(\n\s*<\s*printers\s*>)\n\s*:$1:s; $gimpprintxml =~ s:(\n\s*<\s*printers\s*>):$1\n :s; # Insert comment to mark the part of the list generated from # foomatic-printermap $gimpprintxml =~ s:\n ::s; $gimpprintxml =~ s:\n ::s; $gimpprintxml =~ s:XXXXXXXXXX:\n :s; $gimpprintxml =~ s:(\n\s*<\s*/\s*printers\s*>):\n $1:s; # Insert printers of foomatic-printermap to the end of the list print STDERR "Inserting printer entries of foomatic-printermap "; foreach my $printer (@printermap) { print STDERR "."; $gimpprintxml =~ s:(\n\s*<\s*/\s*printers\s*>):\n \n $printer\n $1:s; } print STDERR "\n\n"; open GPX, "> $gimpprintxmlfile" or die "Cannot write $gimpprintxmlfile!\n"; print GPX $gimpprintxml; close GPX; exit 0;