#! @mgp_cv_path_perl@

# mgp2latex.pl
# converts MagicPoint input file to latex "seminar" style document.
# $Id: mgp2latex.pl.in,v 1.1.1.1 2001-03-14 11:57:55 thep Exp $
#
# Copyright (C) 1997 and 1998 WIDE Project.  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.
# 3. Neither the name of the project nor the names of its contributors
#    may be used to endorse or promote products derived from this software
#    without specific prior written permission.
# 
# THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.

@keywords = split(/\s+/, <<EOF);
@mgp_keywords@
EOF

$alignmode = '';
$outputsomething = 0;
$page = -1;
$line = 0;
$doimage = 0;
$nodefault = 0;
$ignoremode = 0;

&prologue;
while (<>) {
	s/\n$//;

	$_ = '' if (/^#/o);

	if ($_ eq '' || $_ =~ /^[^%]/) {
		$line++;
		if ($default[$line] && !$nodefault) {
			&cmds($default[$line]);
		}
		next if ($ignoremode);
		next if ($page == -1);
		&output($_);
		next;
	}

	&cmds($_);
}
&pageepilogue;
&epilogue;
exit 0;


sub cmds {
	local($_) = @_;

	# special directives
	if (/^%page/i) {
		if ($page != -1) {
			&alignreset;
			&pageepilogue;
		} else {
			$page = 0;
		}
		&pageprologue;
		$line = 0;
		$nodefault = 0;
		next;
	} elsif (/^%default/i) {
		$x = (split(/\s+/, $_))[1];
		$default[$x] = $_;
		$default[$x] =~ s/^%default\s+\d+\s+/\%/;
		next;
	} elsif (/^%%/) {
		&output('');
		next;
	}

	# parsed directives
	@dirs = split(/,\s*/, substr($_, 1));
	foreach $j (@dirs) {
		@dir = split(/\s+/, $j);
		$dir[0] =~ tr/A-Z/a-z/;
		if ($dir[0] eq 'image') {
#			if (!$doimage) {
#				# don't use images
#			} elsif (scalar(@dir) == 2 || scalar(@dir) == 3) {
#				print "<IMG SRC=\"$dir[1]\" ALT=\"$dir[1]\">\n";
#			} elsif (scalar(@dir) == 4) {
#				# interpretation wrong
#				print "<IMG SRC=\"$dir[1]\" WIDTH=$dir[3]% HEIGHT=$dir[3]% ALT=\"$dir[1]\">\n";
#			} elsif (scalar(@dir) >= 5) {
#				# interpretation wrong
#				print "<IMG SRC=\"$dir[1]\" WIDTH=$dir[3]% HEIGHT=$dir[4]% ALT=\"$dir[1]\">\n";
#			}
		} elsif ($dir[0] eq 'nodefault') {
			$nodefault++;
		} elsif ($dir[0] =~ /^(left|right|center)$/) {
			$dir[0] =~ tr/A-Z/a-z/;
			&alignreset;
			&alignmode($dir[0]);
		} elsif ($dir[0] =~ /^filter$/) {
			$ignoremode = 1;
		} elsif ($dir[0] =~ /^endfilter$/) {
			$ignoremode = 0;
		} elsif (grep($dir[0] eq $_, @keywords)) {
			# unsupported directive with 1 parameter
		} else {
			die "unsupported directive $dir[0]\n";
		}
	}
}

sub prologue {
	print <<EOF;
\\documentstyle{seminar}
\\begin{document}
EOF
}

sub epilogue {
	print <<EOF;
\\end{document}
EOF
}

sub pageprologue {
	print <<EOF
\\begin{slide}
EOF
}

sub pageepilogue {
	print <<EOF
\\end{slide}
EOF
}

sub output {
	local($str) = @_;

	if (length($str)) {
		print $str . "\\\\\n";
		$outputsomething++;
	} else {
		print "\\vspace{3mm}\n";
	}
}

sub alignreset {
	return if ($alignmode eq '');

	if (!$outputsomething) {
		print "\\quad\n";
	}
	if ($alignmode eq 'left') {
		print "\\end{flushleft}\n";
	} elsif ($alignmode eq 'right') {
		print "\\end{flushright}\n";
	} elsif ($alignmode eq 'center') {
		print "\\end{center}\n";
	} else {
		die "unknown alignment $alignmode\n";
	}

	$alignmode = '';
}

sub alignmode {
	local($mode) = @_;

	$alignmode = $mode;
	if ($alignmode eq 'left') {
		print "\\begin{flushleft}\n";
	} elsif ($alignmode eq 'right') {
		print "\\begin{flushright}\n";
	} elsif ($alignmode eq 'center') {
		print "\\begin{center}\n";
	} else {
		die "unknown alignment $mode\n";
	}
	$outputsomething = 0;
}
