#!/usr/local/bin/perl5 -w

# Comments are in EUC Kanji code.

# hyperref.stypLaTeX2eˤ줿ܸPDF bookmark
# ޤPostScriptɬפʬUnicodeѴ륹ץȤǤ
# ɸϤϤѴɸϤ˽񤭽Фޤ

# PostScript/Title (ʸ)/Author (ʸ)Ρ(ʸ)פʬ
# ѴޤʸפEUCɤˤʤäƤʤȤޤưޤ

# ǿǤ http://www.rmatsumoto.org/tex-ps-pdf/hyperref.ja.html
# ǤޤХݡȤϰʲΥ᡼륢ɥ쥹ˤꤤޤ
#  δϺ
# ǽѹ: 2006ǯ67
# ¼ ŸǷ (http://www.nn.iij4u.or.jp/~tutimura/)perl 5.6
# Ȥä˷ٹ𤬽ФʤʤѥåĺΤǤƤå
# ѹʤ
# Ʊ¼ᤫ顢Perl 5.8Ƴ줿Encode⥸塼Jcode
# ˻ȤѥåĺΤƤޤΥѥå
# EUCȥեJISؤ褦ˤʤä

# ץ
#
# /Title ޤ /Author Ȥʸͭä顢ΤȤ³ () ǳ
# 줿ʸλϤȽ $start_of_string  $end_of_string ˥å
# 롣Τʸ substr ڤФ \ ΰ̣PostScriptε
# 줿褦˲ᤷUnicodeѴơ16ʿɽѴ롣
# 16ʿɽˤʤAcrobat Distillerǥ顼뤳Ȥͭä

use strict;
use Encode;

my $sjis = 0;  # EUC
#my $sjis = 1;  # SJIS

# SJIS 1ХȤᤫɤ
sub iskanji1 {
    my ($char) = @_;
    my $c = ord($char);
    return (($c>=0x81 && $c<=0x9f) || ($c>=0xe0 && $c<=0xfc));
}

# )ǳ줿ʸνõ
sub find_end {
  my ($line, $start) = @_;
  my ($i, $open_paren, $char);

  $open_paren = 0; # Ƥ̤ο
  for ($i = $start; $i < length($line); ++$i) {
    $char = substr($line, $i, 1);
    if ($sjis && iskanji1($char)) {
      # SJISʤ2Хȿʤ
      ++$i;
    } elsif ($char eq "\\") {
      # \( ʤɤ̵
      ++$i;
    } elsif ($char eq "(") {
      ++$open_paren;
    } elsif ($char eq ")") {
      if (-1 == --$open_paren) {
        return $i - 1;
      }
    }
  }
  return (-1);
}

sub convert_string {
  my ($str) = @_;
  my ($i, $newstr, $hexstr);

  # \ ᤹.
  $newstr = "";
  for ($i=0; $i < length($str); ++$i) {
    if ($sjis && iskanji1(substr($str, $i, 1))) {
      $newstr .= substr($str, $i, 2);
      ++$i; next; # SJISʤ2Хȿʤ
    }
    if (substr($str, $i, 1) ne "\\") {
      $newstr .= substr($str, $i, 1);
      next;
    }
    if (substr($str, $i+1, 1) =~ /[0-3]/) {
      # 38ʿ
      $newstr .= sprintf('%c', oct(substr($str, $i+1, 3)));
      $i += 3;
      next;
    }

    # \ Τ CRޤLFޤCRLF³̵뤹
    if (substr($str, $i+1, 2) eq "\r\n") {
      $i += 2;
      next;
    } elsif (substr($str, $i+1, 1) eq "\n" || substr($str, $i+1, 1) eq "\r") {
      ++$i;
      next
    }

    # \n, \r, \t, \f, \b βperlˤ餻
    if (substr($str, $i+1, 1) =~ /[nrtbf]/) {
      $newstr .= eval('"' . substr($str, $i, 2) . '"');
      ++$i;
      next;
    }

    # ʳΤΤ \ θʸ򤽤Τޤ޻äƤ.
    $newstr .= substr($str, $i+1, 1);
    $i++;
  }
#  print (STDERR  $newstr . "\n");

  # Unicode Ѵ
  if ($sjis) { Encode::from_to($newstr, "shiftjis", "UCS-2"); }
  else       { Encode::from_to($newstr, "euc-jp",   "UCS-2"); }

  # 16ʿľ
  $hexstr = '';
  for ($i=0; $i < length($newstr); ++$i) {
    $hexstr .= sprintf("%02X", ord(substr($newstr, $i, 1)));
  }

  # <>PostScriptʸ16ɽƤ뤳Ȥ򼨤
  # FEFFʸUnicodeǤ뤳Ȥ򼨤
  return "<FEFF" . $hexstr . ">";
}

# 1Խؿ
sub process_1line {
  my ($line) = @_;
  my ($author, $title, $tmp, $start_of_string, $end_of_string,
        $start);

  if ($line !~ /\/Title|\/Author/) {
    print $line;
    return;
  }

  $author = index($line, '/Author', 0);
  $title = index($line, '/Title', 0);

  if ($author == -1) { $author = length($line)-1; }
  if ($title == -1) { $title = length($line)-1; }
  if ($author < $title) { $start = $author + length('/Author'); }
  else { $start = $title + length('/Title'); }

  while (($start_of_string = index($line, '(', $start)) == -1) {
    $tmp = <STDIN>;
    $line = $line . $tmp;
  }
  ++$start_of_string; # (μʸΤϤˤ

  while (($end_of_string = &find_end($line, $start_of_string)) == -1) {
    $tmp = <STDIN>;
    $line = $line . $tmp;
  }

  print substr($line, 0, $start_of_string-1) . # ̤μޤǽ
        &convert_string(substr($line, $start_of_string,
          $end_of_string-$start_of_string+1));

  # Ĥʬ
  &process_1line(substr($line, $end_of_string+2,
                 length($line)-($end_of_string+2)));
}

if (scalar(@ARGV) > 1) {
  print STDERR "Usage: $0 [euc|sjis] <input-file >output-file\n";
  exit 1;
}

if (scalar(@ARGV) == 1) {
  if ($ARGV[0] =~ /^euc$/i) {
    $sjis = 0;
  } elsif ($ARGV[0] =~ /^sjis$/i) {
    $sjis = 1;
  } else {
    print STDERR "$0: Unknown option '$ARGV[0]'\n";
    exit 1;
  }
}
while (<STDIN>) { &process_1line($_); }
exit 0;
