#!/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
# ǤޤХݡȤϰʲΥ᡼륢ɥ쥹ˤꤤޤ
#  δϺ ryutaroh@rmatsumoto.org
# ǽѹ: 2004ǯ811
# ¼ ŸǷ (http://www.nn.iij4u.or.jp/~tutimura/)perl 5.6
# Ȥä˷ٹ𤬽ФʤʤѥåĺΤǤƤå
# ѹʤ

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

use strict;
use Jcode;

# )ǳ줿ʸνõ
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 ($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 (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 Ѵ
  $newstr = Jcode::convert($newstr, 'ucs2', 'euc');

  # 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) != 0) {
  print STDERR "Usage: " . $0 . " <input-file >output-file\n";
  exit 1;
}
while (<STDIN>) { &process_1line($_); }
exit 0;
