#!/usr/bin/env bash
#
# font2svg - (c) 2002-2004 Niklas Peinecke, peinecke@gdv.uni-hannover.de
#
# This file is part of font2svg, an all font to svg-font converter.
#
# font2svg is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# font2svg is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with font2svg; see the file COPYING.  If not, write to
# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.

# set this to the directory where font2svg was unpacked
font2svg_home=/usr/local/share/font2svg

# set this to point to your GhostScript executeable
gs_exe=gs

VERSION=1.0

usage="font2svg $VERSION - (c) 2002-2004 Niklas Peinecke, peinecke@gdv.uni-hannover.de\n\
-----------------------------------------------------------------\n\
Usage: font2svg [options] fontname input-file output-file\n\n\
fontname specifies the name the font should be given in the svg-font.\n\
input-file can be any font ghostscript is able to render\n\
(.pfa, .pfb, .gsf, .ttf).\n\n\
options: -h : display this help\n\
         -e encoding: re-encode output with a different encoding\n\
			 (see file \"encodings\" for valid names)\n\
         -s list: write only the given list of symbols (e.g. \"0 1 2 254\")\n\
			-k use kpsewhich to expand filenames\n\
			-d encoding: before the output encoding is applied, use the specified\n\
			             dvips-encoding (use -x filename to load the encoding first)\n\
			-x filename: load the specified dvips encoding\n"

# default values
encoding="Default"
symbols="0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 \
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 \
40 41 42 43 44 45 46  47 48 49 50 51 52 53 54 55 56 57 58 59 \
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 \
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 \
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 \
120 \
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 \
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 \
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 \
181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 \
200 \
201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 \
221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 \
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 "
usekpsewhich=0
dvipsencoding="none"

# parse options:
# all long options go to long_opt, short ones to short_opt
# everything else to misc

while [ $1 ] ; do
	prefix=$(echo $1 | head -c 2)
	prefix2=$(echo $1 | head -c 1)
	if [ $prefix = "--" ] ; then
		
		case $1 in
			( "--version" )		long_opt=$(echo "$long_opt $1") ; shift ;;
			( "--help" )			long_opt=$(echo "$long_opt $1") ; shift ;;
			( "--encoding" )		long_opt=$(echo "$long_opt $1 $2") ; shift ; shift ;;
			( "--symbols" )		long_opt=$(echo "$long_opt $1 $2") ; shift ; shift ;;
			( "--kpsewhich" )		long_opt=$(echo "$long_opt $1") ; shift ;;
			( "--dviencoding" )	long_opt=$(echo "$long_opt $1 $2") ; shift ; shift ;;
			( "--execute" )		long_opt=$(echo "$long_opt $1 $2") ; shift ; shift ;;
			( * )						echo "font2svg: invalid option '$1'" > /dev/stderr; exit 1 ;;
		esac
	elif [ $prefix2 = "-" ] ; then
		case $1 in
			( "-h" )				short_opt=$(echo "$short_opt $1") ; shift ;;
			( "-e" )				short_opt=$(echo "$short_opt $1 $2") ; shift ; shift ;;
			( "-s" )				short_opt=$(echo "$short_opt $1 $2") ; shift ; shift ;;
			( "-k" )				short_opt=$(echo "$short_opt $1") ; shift ;;
			( "-d" )				short_opt=$(echo "$short_opt $1 $2") ; shift ; shift ;;
			( "-x" )				short_opt=$(echo "$short_opt $1 $2") ; shift ; shift ;;
			( -* )
				case $prefix in
					( "-h" )				short_opt=$(echo "$short_opt -h") ; TEMP=$1; shift; set -- $(echo -n "-"; echo $TEMP | tail -c +3) "$@" ;;
					( "-e" )				echo "font2svg: option '$prefix' missing an argument" > /dev/stderr; exit 1 ;;
					( "-s" )				echo "font2svg: option '$prefix' missing an argument" > /dev/stderr; exit 1 ;;
					( "-k" )				short_opt=$(echo "$short_opt -k") ; TEMP=$1; shift; set -- $(echo -n "-"; echo $TEMP | tail -c +3) "$@" ;;
					( "-d" )				echo "font2svg: option '$prefix' missing an argument" > /dev/stderr; exit 1 ;;
					( "-x" )				echo "font2svg: option '$prefix' missing an argument" > /dev/stderr; exit 1 ;;
					( "-*" )
				esac ;;
			( * )					echo "font2svg: invalid option '$1'" > /dev/stderr; exit 1 ;;
		esac
	else misc=$(echo "$misc $1"); shift ; fi
done

eval set -- "$long_opt $short_opt -- $misc"
while [ ! $1 = "--" ] ; do
	case $1 in
		( "--version" )							echo "font2svg $VERSION"; exit 0 ;;
		( "-h" | "--help" )						echo -e $usage; exit 0 ;;
		( "-e" | "--encoding" )					encoding=$2 ; shift ;;
		( "-s" | "--symbols" )					symbols=$2 ; shift ;;
		( "-k" | "--kpsewhich" )				usekpsewhich=1 ;;
		( "-d" | "--dviencoding" )				dvipsencoding=$2 ; shift ;;
		( "-x" | "--execute" )					dvipsfile=$2 ; shift ;;
	esac
	shift
done
shift

fontfile=$2
if [ ! $fontfile = "-" ] ; then
	if [ $usekpsewhich -eq 1 ] ; then
		fontfile2=$(kpsewhich $2) ;
		if [ -z $fontfile2 ] ; then
			echo "font2svg: kpsewhich could not locate file: \"$fontfile\"" > /dev/stderr ;
			exit 1 ;
		fi
		fontfile=$fontfile2 ;
	fi
fi

if [ -z $fontfile ] ; then echo "font2svg: Missing input filename" > /dev/stderr ; exit 1 ; fi
if [ ! -f $fontfile ] ; then echo "font2svg: Could not open file \"$fontfile\"" > /dev/stderr ; exit 1 ; fi

if [ $usekpsewhich -eq 1 -a "$dvipsfile" ] ; then
	dvipsfile2=$(kpsewhich $dvipsfile) ;
	if [ -z $dvipsfile2 ] ; then
		echo "font2svg: kpsewhich could not locate file \"$dvipsfile\"" > /dev/stderr ;
		exit 1 ;
	fi
	dvipsfile=$dvipsfile2 ;
fi

if [ ! -f $dvipsfile ] ; then echo "font2svg: Could not open file \"$dvipsfile\"" > /dev/stderr ; exit 1 ; fi


output=$3

echo "Converting \"$fontfile\" -> \"$output\""

$gs_exe -dNODISPLAY -dBATCH -dNOPAUSE -q -dQUIT -sFONTFILE="$fontfile" \
	-dTHEFONT="/$1" -dENCODING="/$encoding" -sSYMBOLS="[ $symbols ]" \
	-dDVIENC="/$dvipsencoding" -sDVIPSFILE="$dvipsfile" \
	-sHOME="${font2svg_home}" ${font2svg_home}/font2svg.ps > $output
