#!/usr/bin/perl

use strict;

use File::Basename;
use File::Copy;
use File::Path;
use File::Spec;

#== get_available_fonts() =============================

sub get_available_fonts ($) {
	my $sourcedir = shift;
	my @fonts = ();
	my @subdirs = ();
	local *OPENDIR;
	opendir(*OPENDIR,"$sourcedir") or die("$sourcedir! $!\n");
	while (my $subfile = readdir(*OPENDIR)) {
		if (($subfile ne ".")&&($subfile ne "..")) {
			my $fullname = File::Spec->catfile("$sourcedir","$subfile");
			if (-d "$fullname") {
				push @subdirs, "$fullname";
			}
			elsif ($subfile =~ /\Q.ttf\E$/) {
				push @fonts, "$fullname";
			}
		}
	}
	closedir(*OPENDIR);

	foreach my $subdir (@subdirs) {
		my @other_fonts = get_available_fonts("$subdir");
		push @fonts, @other_fonts;
	}

	return @fonts;
}

#======================================================

#== read_hints() ======================================

sub read_hints ($) {
	my $filename = shift;
	my @hints = `defoma-hints --no-question truetype "$filename" 2>/dev/null`;
	shift @hints; # remove the category
	return join('',@hints);
}

#======================================================

my $sourcedir = $ARGV[0] or die("you must specify the source directory as first parameter\n");
my $prepareddir = $ARGV[1] or die("you must specify the target directory as second parameter\n");
my $hintsfile = $ARGV[2] or die("you must specify the hints file as third parameter\n");
my $packagename = $ARGV[3] or die("you must specify the package name as fourth parameter\n");

my @list = get_available_fonts("$sourcedir");

local *HINTS_OUTPUT;

open(*HINTS_OUTPUT, "> $hintsfile")
	or die("$hintsfile: $!\n");

if ( ! -d "$prepareddir" ) {
	mkpath("$prepareddir");
}

my $count = 0;

print HINTS_OUTPUT "category truetype\n";

foreach my $ttf_file (@list) {
	my $output_file = $ttf_file;
	my $basename = basename ("$output_file");

	my $hints = read_hints ("$ttf_file");
	if ($hints) {
		if ( $hints =~ /FontName\s*=\s*(.+)\s*\n/i ) {
			$basename = "$1.ttf";
			$basename =~ s/\\s+/-/g;
			$output_file = File::Spec->catfile('','usr','share','fonts',
							   'truetype',"$packagename",
							   "$basename");
			$hints =~ s/^begin\s+.+\n/begin $output_file\n/;
		}
		print HINTS_OUTPUT "$hints";

		copy("$ttf_file",File::Spec->catfile("$prepareddir","$basename"))
			or die "$ttf_file: $!\n";
	}

	$count ++;
	print STDOUT "[".int(($count*100)/@list).'%] '.basename("$ttf_file")." -> $basename\n";

}

close(*HINTS_OUTPUT);

1;
__END__
