#!/usr/bin/perl
#
#  Copyright (c) 1998
#   Sergey A. Babkin.  All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without
#  modification, are permitted provided that the following conditions
#  are met:
#  1. Redistributions of source code must retain the above copyright
#     notice, this list of conditions and the following disclaimer.
#  2. Redistributions in binary form must reproduce the above copyright
#     notice, this list of conditions and the following disclaimer in the
#     documentation and/or other materials provided with the distribution.
#
#  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
#  WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
#  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
#
#  Sergey A. Babkin (sab123@hotmail.com, babkin@bellatlantic.net)
#

#
# Script that reads the Type1 font files and prints out the fonts.scale
# lines for them
#

# other substrings (regexps) that are considered irrelevant
# and sould be removed from the font names:
@wrongstr= (
	"koi8r",
	"koi8",
	"cp1251",
	"ibm1251",
	"win1251",
	"cp866",
	"ibm866",
	"iso8859[1-9]",
	"iso8859",
	"isolatin[0-9]",
	"isolatin",
	"latin[0-9]",
	"^ER ",
	"^K8 ",
);

sub usage
{
	print STDERR "Use: \n";
	print STDERR "   t1fdir [-g] <foundry> <encoding>... [ -f <file>...]\n";
	print STDERR "or\n";
	print STDERR "   t1fdir -d fonts.scale fonts.alias <foundry> <encoding>... [ -f <file>...]\n";
}

$ghost=0;
if( $ARGV[0] eq "-g" ) {
	shift @ARGV;
	$ghost=1;
} elsif( $ARGV[0] eq "-d" ) {
	shift @ARGV;
	$files=1;
	$scalef=shift @ARGV;
	$aliasf=shift @ARGV;
}

if($#ARGV<2) {
	&usage();
	exit 1;
}

$foundry=$ARGV[0];
shift @ARGV;

while($#ARGV>=0) {
	if($ARGV[0] eq "-f") {
		shift @ARGV;
		last;
	}
	push(@encodings,$ARGV[0]);
	shift @ARGV;
}

if($files) {
	open(SCALEF, ">>$scalef") || die "Can't write to $scalef";
	open(ALIASF, ">>$aliasf") || die "Can't write to $aliasf";
}
for $name (@ARGV) {

	$familyname="";
	$fullname="";
	$fontname="";
	$weight="";
	$angle=0;

	open(FILE,"<$name") || die "Unable to open file $name\n";

	$type="p"; # by default

	while(<FILE>) {
		if(/eexec/) { last; }
		if(/^\/FamilyName.*\((.+)\)/ ) { $familyname= $1; }
		if(/^\/FullName.*\((.+)\)/ ) { $fullname= $1; }
		if(/^\/FontName.*\((.+)\)/ ) { $fontname= $1; }
		if(/^\/Weight.*\((.+)\)/ ) { $weight= $1; }
		if(/^\/ItalicAngle.*(\d+)/ ) { $angle= $1+0; }
		if(/^\/isFixedPitch/) {
			if(/true/) {
				$type="m";
			} else {
				$type="p";
			}
		}
	}

	# now try to interpret this information 

	$allinfo= $familyname ." ". $fullname ." ". $fontname ." ". $weight;
	$lcallinfo=$allinfo;
	$lcallinfo=~tr[A-Z][a-z];

	$familyname.="_"; # just a delimiter for substitutions
	$familyname=~s/Bold([^a-z])/$1/g;
	$familyname=~s/Italic([^a-z])/$1/g;
	$familyname=~s/Oblique([^a-z])/$1/g;
	$familyname=~s/Roman([^a-z])/$1/g;

	for $i (@wrongstr) { # for uppercase- and space- sensitive strings
		$familyname =~ s/$i//g;
	}

	$familyname=~tr[A-Z][a-z];
	$familyname=~tr[A-Za-z0-9][]cd;

	for $i (@wrongstr) { # for case-insensitive strings
		$familyname =~ s/$i//g;
	}

	if( $familyname eq "") {
		$familyname="unknown";
	}

	$fn=$name;
	$fn=~ s/.*\///g;

	$n=0;
	for $encoding (@encodings) {
		$n++;
		if($ghost) {
			printf("/%s-", uc(substr($familyname,0,1)).substr($familyname,1));

			$r=1;

			if( $allinfo =~ /Bold[^a-z]/
			|| $lcallinfo =~ /\bbold\b/ ) {
				printf("Bold");
				$r=0;
			}
			if( $allinfo =~ /Italic[^a-z]/
			|| $lcallinfo =~ /\bitalic\b/ 
			|| $angle>0 ) {
				printf("Italic");
				$r=0;
			} elsif( $allinfo =~ /Oblique[^a-z]/
			|| $lcallinfo =~ /\boblique\b/ 
			|| $angle<0 ) {
				printf("Oblique");
				$r=0;
			}

			if($r) {
				printf("Roman");
			}

			printf("-%s\t (%s)	;\n",$encoding,$fn);
		} else {
			$xenc=$encoding;
			$xenc =~ s/\-/_/g;

			$srec = sprintf("-%s-%s_%s-",$foundry,$familyname,$xenc);
			$arec = sprintf("-%s-%s-",$foundry,$familyname);

			if( $allinfo =~ /Bold[^a-z]/
			|| $lcallinfo =~ /\bbold\b/ ) {
				$srec .= "bold-";
				$arec .= "bold-";
			} else {
				$srec .= "medium-";
				$arec .= "medium-";
			}

			if( $allinfo =~ /Italic[^a-z]/
			|| $lcallinfo =~ /\bitalic\b/ 
			|| $angle>0 ) {
				$srec .= "i-";
				$arec .= "i-";
			} elsif( $allinfo =~ /Oblique[^a-z]/
			|| $lcallinfo =~ /\boblique\b/ 
			|| $angle<0 ) {
				$srec .= "o-";
				$arec .= "o-";
			} else {
				$srec .= "r-";
				$arec .= "r-";
			}

			$srec .= sprintf("normal--0-0-0-0-%s-0-adobe-fontspecific",$type,$encoding);
			$arec .= sprintf("normal--0-0-0-0-%s-0-%s",$type,$encoding);

			if($files) {
				if($n==1) {
					printf(SCALEF "%s %s\n",$fn,$srec);
					printf(ALIASF "%s %s\n",$arec,$srec);
					$srec1=$srec;
				} else {
					printf(ALIASF "%s %s\n",$arec,$srec1);
				}
			} else {
				printf("%s %s\n",$fn,$arec);
			}
		}
	}

	close(FILE);
}
if($files) {
	close(SCALEF);
	close(ALIASF);
}
