#!/usr/local/bin/perl
use strict;
use XML::XSLT;

print "Content-Type: text/html\n\n";

use vars qw/%MONTH %URI/;

%MONTH = qw(jan 1 feb 2 mar 3 apr 4 may 5 jun 6 jul 7 aug 8 sep 9 oct 10 nov 11 dec 12);

$URI{urn_to_url} = q*http://suika.fam.cx/uri-res/N2L?*;
$URI{local_reference_RFC} = q*reference.RFC.%04d.xml*;
$URI{local_reference_ja_RFC} = q*/home/suika/cvs/doc/rfc-ja/rfc%04d-ja.rfcja*;

my %SITE = (
  TXT => {
    'www.dnsbalance.ring.gr.jp' => {
      RFC => 'http://www.dnsbalance.ring.gr.jp/pub/doc/RFC/rfc%d.txt',
      BCP => 'http://www.dnsbalance.ring.gr.jp/pub/doc/RFC/bcp/bcp%d.txt',
      FYI => 'http://www.dnsbalance.ring.gr.jp/pub/doc/RFC/fyi/fyi%d.txt',
      STD => 'http://www.dnsbalance.ring.gr.jp/pub/doc/RFC/std/std%d.txt',
      ID  => 'http://www.dnsbalance.ring.gr.jp/pub/doc/internet-drafts/draft-%s.txt',
    },
    'www.t.ring.gr.jp' => {
      RFC => 'http://www.t.ring.gr.jp/pub/doc/RFC/rfc%d.txt',
      BCP => 'http://www.t.ring.gr.jp/pub/doc/RFC/bcp/bcp%d.txt',
      FYI => 'http://www.t.ring.gr.jp/pub/doc/RFC/fyi/fyi%d.txt',
      STD => 'http://www.t.ring.gr.jp/pub/doc/RFC/std/std%d.txt',
      ID  => 'http://www.t.ring.gr.jp/pub/doc/internet-drafts/draft-%s.txt',
    },
    'www.ietf.org' => {
      RFC => 'http://www.ietf.org/rfc/rfc%d.txt',
      #BCP => 'http://www.ietf.org/rfc/bcp/bcp%d.txt',
      #FYI => 'http://www.ietf.org/rfc/fyi/fyi%d.txt',
      #STD => 'http://www.ietf.org/rfc/std/std%d.txt',
      ID  => 'http://www.ietf.org/internet-drafts/draft-%s.txt',
    },
    'www.rfc-editor.org' => {
      RFC => 'http://www.rfc-editor.org/rfc/rfc%d.txt',
      BCP => 'http://www.rfc-editor.org/rfc/bcp/bcp%d.txt',
      FYI => 'http://www.rfc-editor.org/rfc/fyi/fyi%d.txt',
      STD => 'http://www.rfc-editor.org/rfc/std/std%d.txt',
      ID  => 'http://www.rfc-editor.org/internet-drafts/draft-%s.txt',
    },
    'ftp.isi.edu' => {
      RFC => 'ftp://ftp.isi.edu/in-notes/rfc%d.txt',
    },
  },
  PS => {
    'www.dnsbalance.ring.gr.jp' => {RFC=>'http://www.dnsbalance.ring.gr.jp/pub/doc/RFC/rfc%d.ps'},
    'www.t.ring.gr.jp' => {RFC=>'http://www.t.ring.gr.jp/pub/doc/RFC/rfc%d.ps'},
    'www.ietf.org' => {RFC=>'http://www.ietf.org/rfc/rfc%d.ps'},
  },
  XML => {
    'xml.resource.org' => {RFC=>'http://xml.resource.org/public/rfc/xml/rfc%04d.xml'},
  },
  HTML => {
    'xml.resource.org' => {RFC=>'http://xml.resource.org/public/rfc/html/rfc%04d.html'},
  },
  Xcite => {
    'xml.resource.org' => {
      RFC => 'http://xml.resource.org/public/rfc/bibxml/reference.RFC.%04d.xml',
      ID  => 'http://xml.resource.org/public/rfc/bibxml3/reference.I-D.%s.xml',
    },
  },
);

my %format_name = (
  HTML => 'HTML',
  PDF => 'PDF',
  PS => 'PS',
  TXT => 'plain-text',
  Xcite => 'XML citation',
  XML => 'XML',
);
my %available_format = (
  TXT => {RFC => 1, BCP=>1,STD=>1,FYI=>1,ID=>1},
  Xcite => {RFC=>1,ID=>1},
);
my %format_order;
{my $i = 0;
for (qw/TXT PS PDF XML HTML Xcite/) {
  $format_order{$_} = $i++;
}
}

my $type = 'RFC';
my $number = '1';
if ($main::ENV{PATH_INFO} =~ m#/([^/]+)/(?:draft-)?([^/]+)#) {
  ($type, $number) = (uc $1, $2);
}
my $ref_xml = sprintf $URI{'local_reference_ja_' . $type}, $number;
if (-e $ref_xml) {
  $available_format{XML_ja}->{$type} = 1;
} else {
  $ref_xml = sprintf $URI{'local_reference_' . $type}, $number;
}
die unless -e $ref_xml;

my $xsl = q(rfc-ref.xsl.u8);
my $xslt = XML::XSLT->new (Source => $xsl);
#$xslt->transform (q(reference.RFC.3349.xml));
$xslt->transform (&jc($ref_xml));
#$xslt->transform (&jc(q(/home/suika/cvs/doc/rfc-ja/rfc1796-ja.rfcja)));
my $s = $xslt->toString;

$s =~ s{<x-month-name>([^<]+)</x-month-name>}{
  $MONTH{ lc substr ($1, 0, 3) } || $1;
}gex;
$s =~ s{href="%urn%:}{
  q/href="/ . $URI{urn_to_url} . q/urn:/;
}gex;
$s =~ s{<x-format>([^<]+)</x-format>}{
  $available_format{ $1 }->{$type} = 1; '';
}gex;

print <<EOH;
<html xml:lang="ja">
<head>
<title>$type $number</title>
</head>
<body>
<h1>$type $number</h1>
<div class="links">
@{[&{sub{
my $r = '';
for my $cat (sort {$format_order{$a}<=>$format_order{$b}} keys %SITE) {
if ($available_format{$cat}->{$type}) {
  $r .= "<h2>$format_name{$cat}</h2><ul>";
  for (sort keys %{$SITE{$cat}}) {
    my $uri = sprintf $SITE{$cat}->{$_}->{$type}, $number;
    $r .= sprintf '<li><a href="%s" title="URI: &lt;%s&gt;">%s</a></li>',
                  $uri, $uri, $_;
  }
  $r .= '</ul>'."\n";
}}
$r}}]}
</div>
$s
</body></html>
EOH

sub jc ($) {
  my $file = shift;
  use lib qw^/home/local/maildir^;
  require Jcode;
  open SRC, $file;
    local $/ = undef;
    my $c = Jcode->new (<SRC>)->utf8;
  close SRC;
  $c =~ s%<\?xml ([^>]*?)encoding=.*?\?>%<?xml $1?>%;
  open TMP, '> .rfcja.tmp';
    print TMP $c;
  close TMP;
  '.rfcja.tmp';
}
