#! /usr/local/bin/perl

# Author: Harlan Stenn <stenn@ntp.org>

# texi2txt: translate texi tokens into displayable text.
# This means:
# - overstrikes (boldface)
# - underscores (italics)

use strict;
use warnings;

my $oc = 3;			# Number of times to overstrike
my $BS = chr(8);		# backspace character

# For each character in $src:
# - emit the character, a BS, and the character, $oc times (total)
sub OverStrike ($$$) {
  my ($pre, $src, $post) = @_;
  my @src = split(//, $src);
  my $tgt;

  # We don't need to overstrike any BS chars.
  for my $c ( @src ) {
    $tgt = $tgt.$c;
    if ($BS ne $c) {
      for (my $i = $oc; $i > 0; $i--) {
	$tgt = $tgt.$BS.$c;
      }
    }
  }

  return "$pre$tgt$post";
};

# For each character in $src:
# - emit an underscore, a BS, and the character.
sub UnderLine ($$$) {
  my ($pre, $src, $post) = @_;
  my @src = split(//, $src);
  my $tgt = "";

  # We don't need to underline any BS chars.
  for my $c ( @src ) {
    if ($BS eq $c) {
      $tgt = $tgt.$c;
    } else {
      $tgt = $tgt."_".$BS.$c;
    }
  }

  return "$pre$tgt$post";
};

sub ProcessToken ($) { #line
  my ($line) = @_;
  $_ = $line;

  my $oldline;
  do {
    $oldline = $_;

    $_ = UnderLine($1,$3,$4)
      if (/(.*)@(i|file|emph){([^}]*)}(.*)/);

    $_ = OverStrike($1,$3,$4)
      if (/(.*)@(code|var|option|samp|strong){([^}]*)}(.*)/);

  } until ($_ eq $oldline);

  return $_;
}

### Main program

while (<STDIN>)
{
  print ProcessToken($_);
};
