#!/usr/bin/perl
#
# Slide to Rich Text Format converter
#

$RTFHEAD=<<'EOF';
{\rtf1\ansi{\fonttbl{\f1\froman\fcharset0 Times New Roman;}}
{\stylesheet{\s255 \plain\f1\fs44 \ql \level1 heading 1;}
{\s254 \plain\f1\fs32 \fi-270\li270\ql \level2 heading 2;}
{\s253 \plain\f1\fs28 \fi-225\li585\ql \level3 heading 3;}
{\s252 \plain\f1\fs24 \fi-180\li900\ql \level4 heading 4;}
{\s251 \plain\f1\fs20 \fi-180\li1260\ql \level5 heading 5;}
{\s250 \plain\f1\fs20 \fi-180\li1620\ql \level6 heading 6;}}
EOF

$RTFEND="}\n";

sub docmd {
    my $cmd = shift(@_);
    my $args = shift(@_);

    if (($cmd eq 'title') ||
	($cmd eq 'author') ||
	($cmd eq 'subject')) {
	$vars{$cmd} = $args;
	$vars{'_haveinfo'} = 1;
    } elsif ($cmd eq 'body') {
	if ($vars{'_done_body'} == 1) {
	    print "Warning: two .body commands not allowed!\n";
	} else {
	    $vars{'_done_body'} = 1;
	    print "$RTFHEAD";
	    undef $RTFHEAD;
	    if ($vars{'_haveinfo'} == 1) {
		print "{\\info";
		if ($vars{'title'}) {
		    print "{\\title $vars{'title'}}";
		}
		if ($vars{'author'}) {
		    print "{\\author $vars{'author'}}";
		}
		if ($vars{'subject'}) {
		    print "{\\subject $vars{'subject'}}";
		}
		print "}\n";
	    }
	    if ($vars{'title'}) {
		print "{\\pard\\s255\\qc $vars{'title'}\\par}\n";
		if ($vars{'author'}) {
		    print "{\\pard\\s254\\ql $vars{'author'}\\par}\n";
		}
	    }
	}
    } else {
	print "Warning: unrecognized command '$cmd', args '$args'\n";
    }
}

sub heading {
    my $num = shift(@_);
    my $test = shift(@_);
    my $style = 256 - $num;

    print "{\\pard\\s$style $text\\par}\n";
}

sub endit {
    print $RTFEND;
}

sub parse_line {
    my $line = 	my $name = shift(@_);

    if (($cmd, $args) = $line =~ /^\.([A-Za-z0-9]+)\s*(.*)/) {
	&docmd($cmd, $args);
    } elsif (($stars,$text) = $line =~ /^(\*+)\s*(.*)/) {
	&heading(length($stars), $text);
    }
}

{
    $buf="";
    while (<>) {
	chop;
	$firstchar=substr($_,0,1);
	if (($firstchar eq ".") || ($firstchar eq "*")) {
	    &parse_line($buf);
	    $buf=""
	}
	s/^\s*//;
	$buf =~ s/\s*$//;
	if ($buf ne "") {
	    $buf = $buf . " ";
	}
	$buf= $buf . $_;
    }
    if ($buf ne "") {
	&parse_line($buf);
    }
    &endit;
}

