Codebase list foomatic-db-engine / upstream/3.0.2-20050705 foomatic-printermap-to-gimp-print-xml.in
upstream/3.0.2-20050705

Tree @upstream/3.0.2-20050705 (Download .tar.gz)

foomatic-printermap-to-gimp-print-xml.in @upstream/3.0.2-20050705raw · history · blame

#!@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 <foomatic-printermap> ] \
                              [ -g <gimp-print.xml> ]
 -f <foomatic-printermap>: File src/foomatic/foomatic-printermap of
                    Gimp-Print source tarball (4.2.x or later). Default
                    is foomatic-printermap in the current directory

 -g <gimp-print.xml>: 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 = <PM>;
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("", <GPX>);
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  <!-- The following printers are listed in the current foomatic-printermap -->: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*<printer>\s*<id>\s*$printer\s*</id>.*?</printer>::s or
	$gimpprintxml =~ s:\s*<printer>\s*<id>\s*$printer\s*</id>.*?</printer>::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*<!--\s*Manually inserted printer entries\s*-->:$1:s;
$gimpprintxml =~ s:(\n\s*<\s*printers\s*>):$1\n  <!-- Manually inserted printer entries -->:s;

# Insert comment to mark the part of the list generated from
# foomatic-printermap
$gimpprintxml =~ s:\n  <!-- The following printers were deleted in the current foomatic-printermap -->::s;
$gimpprintxml =~ s:\n  <!-- The following printers are listed in the current foomatic-printermap -->::s;
$gimpprintxml =~ s:XXXXXXXXXX:\n  <!-- The following printers were deleted in the current foomatic-printermap -->:s;
$gimpprintxml =~ s:(\n\s*<\s*/\s*printers\s*>):\n  <!-- The following printers are listed in the current foomatic-printermap -->$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  <printer>\n   <id>$printer</id>\n  </printer>$1:s;
}
print STDERR "\n\n";

open GPX, "> $gimpprintxmlfile" or
    die "Cannot write $gimpprintxmlfile!\n";
print GPX $gimpprintxml;
close GPX;

exit 0;