From 5edfc2c02b71ac5f90ca55cfc3491671c3a6ee1c Mon Sep 17 00:00:00 2001
From: Martin Mares <mj@ucw.cz>
Date: Fri, 15 Jun 2012 16:56:29 +0200
Subject: [PATCH] PPD: Fonts

---
 ppd/PPD.pm | 43 ++++++++++++++++++++----
 ppd/gen-hp | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 134 insertions(+), 7 deletions(-)

diff --git a/ppd/PPD.pm b/ppd/PPD.pm
index f388547..00dc9e5 100644
--- a/ppd/PPD.pm
+++ b/ppd/PPD.pm
@@ -4,7 +4,7 @@ use strict;
 use warnings;
 
 use Exporter 'import';
-our @EXPORT = qw(define_group define_ui_group switch_group declare get set maybe_set option constrain gen_values generate);
+our @EXPORT = qw(define_group define_ui_group switch_group declare get set maybe_set option constrain gen_values fonts generate);
 
 ### PPD data model ###
 
@@ -18,6 +18,7 @@ our @EXPORT = qw(define_group define_ui_group switch_group declare get set maybe
 #	# For main keywords:
 #	Type => type,		# q=quoted, i=invocation, s=string (unquoted), b=boolean
 #	Value => string,
+#	Values => list,		# (if there are multiple values)
 #
 #	# For option keywords:
 #	Type => 'o',
@@ -29,7 +30,8 @@ our @EXPORT = qw(define_group define_ui_group switch_group declare get set maybe
 #	Values => [		# possible values (mandatory)
 #		{ Key => key,		# key (mandatory)
 #		  Name => key,		# descriptive name (default: same as Key)
-#		  PS => string,		# PS code to emit (mandatory)
+#		  PS => string,		# PS code invocation to emit
+#		  String => string,	# Unquoted string to emit instead of PS code
 #		  Default => 1,		# if this is the default value
 #		},
 #	],
@@ -145,8 +147,8 @@ sub option($) {
 	my $key = $o->{Key};
 	!defined $keywords{$key} or die "Keyword $key already known\n";
 	$keywords{$key} = $o;
-	my $g = $groups{$current_group_key};
-	$o->{Group} = $current_group_key;
+	$o->{Group} //= $current_group_key;
+	my $g = $groups{$o->{Group}};
 	$o->{Type} = 'o';
 	push @{$g->{Keywords}}, $o;
 }
@@ -189,6 +191,22 @@ sub gen_values($@) {
 	return \@values;
 }
 
+sub fonts($) {
+	my ($flist) = @_;
+	my @values = ();
+	for my $row (split /\n/, $flist) {
+		my ($key, $val) = ($row =~ /^(\S+):\s+(.*)$/) or die "Font line parse error: $row\n";
+		push @values, { Key => $key, String => $val };
+	}
+
+	option({
+		Key => 'Font',
+		Group => 'fonts',
+		Values => [ @values ],
+		Default => 'Courier',
+	});
+}
+
 ### Known main keywords ###
 
 # Group "f": file description
@@ -245,6 +263,9 @@ declare('j',
 	[ 'JCLEnd',			'q',	undef ],
 );
 
+# Group "fonts": Fonts
+define_group('fonts', { Name => 'Fonts' });
+
 ### Formatting of PPD ###
 
 sub format_value($$) {
@@ -299,9 +320,17 @@ sub emit_option($) {
 	print "*Default$key: ", get_default($o), "\n";
 	for my $v (@{$o->{Values}}) {
 		my $ps = $v->{PS};
-		# $ps = "\n$ps" unless $ps =~ /^\n/s;
-		# $ps = "$ps\n" unless $ps =~ /\n$/s;
-		print "*$key ", $v->{Key}, '/', ($v->{Name} // $v->{Key}), ': ', format_value('i', $ps), "\n";
+		print "*$key ", $v->{Key};
+		print '/', $v->{Name} if defined($v->{Name}) && $v->{Name} ne $v->{Key};
+		print ": ";
+		if (defined $ps) {
+			# $ps = "\n$ps" unless $ps =~ /^\n/s;
+			# $ps = "$ps\n" unless $ps =~ /\n$/s;
+			print format_value('i', $ps);
+		} else {
+			print format_value('s', $v->{String});
+		}
+		print "\n";
 	}
 	if (defined $o->{Choice}) { print "*${jcl}CloseUI *$key\n"; }
 	print "\n";
diff --git a/ppd/gen-hp b/ppd/gen-hp
index 600882e..89a3124 100755
--- a/ppd/gen-hp
+++ b/ppd/gen-hp
@@ -133,4 +133,102 @@ constrain(undef, 'Duplex', 'MediaType', sub {
 	return !($dp ne 'None' && $mt =~ /^(Labels|Transparency|Bond)$/);
 });
 
+# As reported by the printer
+# (versions set to "(1.0)", because the printer reports just "(.)")
+fonts( <<'AMEN' );
+Albertus-ExtraBold: Standard (1.0) Standard ROM
+Albertus-Medium: Standard (1.0) Standard ROM
+AntiqueOlive: Standard (1.0) Standard ROM
+AntiqueOlive-Bold: Standard (1.0) Standard ROM
+AntiqueOlive-Italic: Standard (1.0) Standard ROM
+Arial: Standard (1.0) Standard ROM
+Arial-Bold: Standard (1.0) Standard ROM
+Arial-BoldItalic: Standard (1.0) Standard ROM
+Arial-Italic: Standard (1.0) Standard ROM
+AvantGarde-Book: Standard (1.0) Standard ROM
+AvantGarde-BookOblique: Standard (1.0) Standard ROM
+AvantGarde-Demi: Standard (1.0) Standard ROM
+AvantGarde-DemiOblique: Standard (1.0) Standard ROM
+Bookman-Demi: Standard (1.0) Standard ROM
+Bookman-DemiItalic: Standard (1.0) Standard ROM
+Bookman-Light: Standard (1.0) Standard ROM
+Bookman-LightItalic: Standard (1.0) Standard ROM
+CGOmega: Standard (1.0) Standard ROM
+CGOmega-Bold: Standard (1.0) Standard ROM
+CGOmega-BoldItalic: Standard (1.0) Standard ROM
+CGOmega-Italic: Standard (1.0) Standard ROM
+CGTimes: Standard (1.0) Standard ROM
+CGTimes-Bold: Standard (1.0) Standard ROM
+CGTimes-BoldItalic: Standard (1.0) Standard ROM
+CGTimes-Italic: Standard (1.0) Standard ROM
+Clarendon-Condensed-Bold: Standard (1.0) Standard ROM
+Coronet: Standard (1.0) Standard ROM
+Courier: Standard (1.0) Standard ROM
+Courier-Bold: Standard (1.0) Standard ROM
+Courier-BoldOblique: Standard (1.0) Standard ROM
+Courier-Oblique: Standard (1.0) Standard ROM
+CourierHP: Standard (1.0) Standard ROM
+CourierHP-Bold: Standard (1.0) Standard ROM
+CourierHP-BoldItalic: Standard (1.0) Standard ROM
+CourierHP-Italic: Standard (1.0) Standard ROM
+Dorit: Standard (1.0) Standard ROM
+Dorit-Bold: Standard (1.0) Standard ROM
+Garamond-Antiqua: Standard (1.0) Standard ROM
+Garamond-Halbfett: Standard (1.0) Standard ROM
+Garamond-Kursiv: Standard (1.0) Standard ROM
+Garamond-KursivHalbfett: Standard (1.0) Standard ROM
+Helvetica: Standard (1.0) Standard ROM
+Helvetica-Bold: Standard (1.0) Standard ROM
+Helvetica-BoldOblique: Standard (1.0) Standard ROM
+Helvetica-Narrow: Standard (1.0) Standard ROM
+Helvetica-Narrow-Bold: Standard (1.0) Standard ROM
+Helvetica-Narrow-BoldOblique: Standard (1.0) Standard ROM
+Helvetica-Narrow-Oblique: Standard (1.0) Standard ROM
+Helvetica-Oblique: Standard (1.0) Standard ROM
+Koufi: Standard (1.0) Standard ROM
+Koufi-Bold: Standard (1.0) Standard ROM
+LetterGothic: Standard (1.0) Standard ROM
+LetterGothic-Bold: Standard (1.0) Standard ROM
+LetterGothic-Italic: Standard (1.0) Standard ROM
+Malka: Standard (1.0) Standard ROM
+Malka-Bold: Standard (1.0) Standard ROM
+Malka-Italic: Standard (1.0) Standard ROM
+Marigold: Standard (1.0) Standard ROM
+Naamit: Standard (1.0) Standard ROM
+Naamit-Bold: Standard (1.0) Standard ROM
+Naskh: Standard (1.0) Standard ROM
+Naskh-Bold: Standard (1.0) Standard ROM
+NewCenturySchlbk-Bold: Standard (1.0) Standard ROM
+NewCenturySchlbk-BoldItalic: Standard (1.0) Standard ROM
+NewCenturySchlbk-Italic: Standard (1.0) Standard ROM
+NewCenturySchlbk-Roman: Standard (1.0) Standard ROM
+Palatino-Bold: Standard (1.0) Standard ROM
+Palatino-BoldItalic: Standard (1.0) Standard ROM
+Palatino-Italic: Standard (1.0) Standard ROM
+Palatino-Roman: Standard (1.0) Standard ROM
+Ryadh: Standard (1.0) Standard ROM
+Ryadh-Bold: Standard (1.0) Standard ROM
+Symbol: Special (1.0) Special ROM
+SymbolMT: Special (1.0) Special ROM
+Times-Bold: Standard (1.0) Standard ROM
+Times-BoldItalic: Standard (1.0) Standard ROM
+Times-Italic: Standard (1.0) Standard ROM
+Times-Roman: Standard (1.0) Standard ROM
+TimesNewRoman: Standard (1.0) Standard ROM
+TimesNewRoman-Bold: Standard (1.0) Standard ROM
+TimesNewRoman-BoldItalic: Standard (1.0) Standard ROM
+TimesNewRoman-Italic: Standard (1.0) Standard ROM
+Univers-Bold: Standard (1.0) Standard ROM
+Univers-BoldItalic: Standard (1.0) Standard ROM
+Univers-Condensed-Bold: Standard (1.0) Standard ROM
+Univers-Condensed-BoldItalic: Standard (1.0) Standard ROM
+Univers-Condensed-Medium: Standard (1.0) Standard ROM
+Univers-Condensed-MediumItalic: Standard (1.0) Standard ROM
+Univers-Medium: Standard (1.0) Standard ROM
+Univers-MediumItalic: Standard (1.0) Standard ROM
+Wingdings-Regular: Special (1.0) Special ROM
+ZapfChancery-MediumItalic: Standard (1.0) Standard ROM
+ZapfDingbats: Special (1.0) Special ROM
+AMEN
+
 generate();
-- 
GitLab