#!/usr/bin/perl
#-*-Perl-*-

#--------------------------------------------------------#
$description =
"Syntax: dn2tex [options] [file...]

Dn2tex converts TeX files containing passages in Indian
languages using the DN Devanagari script conventions used
by Frans Velthuis's devnag and John Smith's jtex into
accented Roman script. By default it operates only on
passages beginning with `{\\DN' or `{\\JP' and ending
with a balancing `}', but it can be run `raw' on whole
files. If no input file is specified, dn2tex reads from
standard input. Certain characters (particularly `|')
are untranslated, since they have no one correct
equivalent.

-h option prints this help.
-r option invokes `raw' mode, i.e. processes the entire
          file rather than only passages inside {\\DN ... }
          or {\\JP ... }.
-s option translates anusvara as `\\.m', not as tilde.
";
#--------------------------------------------------------#

require 'getopts.pl';
Getopts(':rsh');
if ($opt_h) {
    print STDERR $description;
    exit 1;
}

$nagari = 0;
$bracelevel = 0;

if ($opt_r) {
    while (<>) {
	print &dn2tex($_);
    }
}
else {
    while (<>) {
	&unpackage($_);
    }
}
exit 0;

sub unpackage {
    local ($string) = $_[0];
    if ($nagari) {
	if ($string !~ /[%\\}{]/) {
	    print &dn2tex($string);
	}
	elsif ($string =~ /^([^%\\}{]*)(\{)/) {
	    print &dn2tex($1) . $2;
	    $bracelevel += 1;
	    &unpackage($');
	}
	elsif ($string =~ /^([^%\\}{]*)(\})/) {
	    print &dn2tex($1) . $2;
	    $bracelevel -= 1;
	    $nagari = 0 if $bracelevel == 0;
	    &unpackage($');
	}
	elsif ($string =~ /(^[^%\\}{]*)(\\[a-zA-Z]+)($|[^a-zA-Z])/) {
	    print &dn2tex($1) . $2;
	    &unpackage($3.$');
	}
	elsif ($string =~ /(^[^%\\}{]*)(\\[^a-zA-Z])/) {
	    print &dn2tex($1) . $2;
	    &unpackage($');
	}
	elsif ($string =~ /(^[^%\\}{]*)(%)/) {
	    print &dn2tex($1) . $2 . $';
	}
    }
    else {
	if ($string =~ /^(.*?)(\{\\(DN|JP))([^a-zA-Z])/) {
	    print $1 . $2;
	    $nagari = 1;
	    $bracelevel += 1;
	    &unpackage($4.$');
	}
	else {
	    print $string;
	}
    }
}

sub dn2tex {
    local ($string) = $_[0];
    return $string if $string eq "";
    #
    # Sort out anusvara/avagraha combination
    #
    $string =~ s/([eo])\.m( ?\.a)/$1$2.m/g;
    #
    $string =~ s/\.([RL])/\\=\l$1/g;
    $string =~ s/([aiu])\1\.m/\\!$1/g unless $opt_s;
    $string =~ s/([AIU])\.m/\\!\l$1/g unless $opt_s;
    $string =~ s/([aiu])\1/\\=$1/g;
    $string =~ s/([AIU])/\\=\l$1/g;
    $string =~ s/E/ai/g;
    $string =~ s/O/au/g;
    $string =~ s/([KGCJTDPB])/\l$1h/g;
    $string =~ s/\.a/\'/g;
    $string =~ s/\.kh/x/g;
    $string =~ s/\.g/\\:g/g;
    $string =~ s/(.)\.m/\\~$1/g unless $opt_s;
    $string =~ s/\.o/o.m/g;
    $string =~ s/\.([a-z])/\\.$1/g;
    $string =~ s/([RLMH])/\\.\l$1/g;
    $string =~ s/\"n/\\:n/g;
    $string =~ s/\"s/\\\'s/g;
    $string =~ s/~n/\\~n/g;
    $string =~ s/\//\\:m/g;
    return $string;
}
