#!/usr/bin/perl

# convert a ports INDEX file to HTML
#
# by John Fieber <jfieber@freebsd.org>
# Mon May 13 10:31:58 EST 1996
# $FreeBSD: www/ja/ports/portindex,v 1.32 2006/08/19 21:24:43 hrs Exp $
# The FreeBSD Japanese Documentation Project
# Original revision: 1.49

############################################################

# Load local config file. You can override in portindex.conf
# the variables for the default web and the ftp server. This
# make it easy to maintain a local web mirror and let the
# URL point to yourself and not to the standard FreeBSD FTP server.
$config = $0 . '.' . 'conf';
do $config if -f $config;

# This is the base of where we ftp stuff from
if ($ENV{'MASTER_FTP_SERVER'}) {
    $ftpserver = $ENV{'MASTER_FTP_SERVER'};
} else {
    $ftpserver = 'ftp://ftp.FreeBSD.org' if !$ftpserver;
}
$base = "" if !$base;
$baseHTTP = $base if !$baseHTTP;
$baseFTP = "$ftpserver/pub/FreeBSD/ports/ports";
my $baseCVSWEB = 'http://www.FreeBSD.org/cgi/cvsweb.cgi/';
$urlcgi = 'http://www.FreeBSD.org/cgi/url.cgi' if !$urlcgi;
$packagesURL = "$ftpserver/pub/FreeBSD/ports/i386/packages-stable/All/"
    if !$packagesURL;
# support tar on the fly or gzip'ed tar on the fly
$ftparchive = '';
$ftparchive = '.tar' if !defined $ftparchive;

# ports download sources script
$pds = 'http://www.FreeBSD.org/cgi/pds.cgi';

# better layout and link to the sources
if ($urlcgi) {
    $baseHTTP = $urlcgi . '?' . $baseHTTP;
}
 
$today = &getdate;

&packages_exist('packages.exists', *packages);
&category_description(($ARGV[1] || '.') . '/categories', *category_description);
&main;

sub getdate {
#    @months = ("January", "February", "March", "April", "May","June",
#	       "July", "August", "September", "October", "November", "December");
    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
    $year += 1900;
#    return "Last modified: $mday-$months[$mon]-$year";
    $mon++;
    return "最終更新日: $year 年 $mon 月 $mday 日";
}

sub header {
    local ($fh, $htext) = @_;
    print $fh "<!DOCTYPE html PUBLIC \"-//FreeBSD//DTD HTML 4.01 Transitional-Based Extension//EN\" [\n";
    print $fh "<!ENTITY base CDATA '..'>\n";
    print $fh "<!ENTITY date  \"<em>$today</em>\">\n";
    print $fh "<!ENTITY title '$htext'>\n";
    print $fh "<!ENTITY blurb  SYSTEM \"ports.inc\">\n";
    print $fh "<!ENTITY % navinclude.ports \"INCLUDE\">\n";
    print $fh "<!ENTITY email 'ports'>\n";
    print $fh "]>\n";
    print $fh "<html>&header;\n";
}

sub footer {
    local ($fh, $ftext) = @_;
    print $fh "\n$ftext\n";
    print $fh "&footer;\n";
    print $fh "</BODY>\n</HTML>\n";
}

sub packages_exist {
    local($file, *p) = @_;

    open(P, $file) || do {
       warn "open $file: $!\n";
       warn "Cannot create packages links\n";
       return 1;
    };

    while(<P>) {
       chop;
       $p{$_} = 1;
    }
    close P;
    return 0;
}

sub category_description {
    local($file, *p) = @_;

    open(P, $file) || do {
	warn "open $file: $!\n";
	warn "Cannot find category description\n";
	return 1;
    };

    local($category, $description);
    while(<P>) {
	# ignore comments
	next if /^\s*#/;

	($category, $description) = /^\s*"([^"]+)",\s*"([^"]+)/;
        $p{$category} = $description;
    }
    close P;
    return 0;
}

sub main {

    $sep = "<B>:</B>";

    # 'COMMENT' translation database
    if (open(COMF, "comments.ja")) {
	while (<COMF>) {
	    ($a, $b) = split('\|');
	    next if !defined($b);
	    chop($b);
	    $b =~ s/&/&amp;/g;
	    $b =~ s/</&lt;/g;
	    $b =~ s/>/&gt;/g;
	    $descLANG{$a} = $b;
	}
    }

    open(INDEX, $ARGV[0]);
    while (<INDEX>) {
	chop;
	s/&/&amp;/g;
    	s/</&lt;/g;
    	s/>/&gt;/g;

    	# Read a record
	($name, $loc, $prefix, $desc, $ldesc, $owner, $cats, 
	    $bdep, $rdep, $www) = split('\|');

	# Check for double hyphens in the name (--).
	$name =~ s/--/-/g;

    	# Split the categories into an array
	@cat = split("[ \t]+", $cats);

    	$catkey{$name} = $cat[0];

	local($sourcepath) = $loc;
	$sourcepath =~ s%/usr/%%;

	# desc translation
	($lloc = $loc) =~ s@^/usr/ports/@@;
	$desc = $descLANG{$lloc}
	    if ($descLANG{$lloc} ne '');

	foreach $i (@cat) {

	    $stats{$i}++;

    	    # figure out the FTP url
	    $loc =~ s/\/usr\//$baseCVSWEB/;
	    $ldesc =~ s/\/usr\//$baseHTTP/;

    	    # The name description and maintainer
	    $data{$i} .= "<DT><B><A NAME=\"$name\"></A><A HREF=\"${loc}${ftparchive}\">$name</A></B> ";

	    $data{$i} .= "<DD>$desc<BR><A HREF=\"$ldesc\">詳しい説明</A>";
	    if ($packages{"$name.tbz"}) { 
		$data{$i} .= qq{ | <a href="$packagesURL$name.tbz">パッケージ</a>};
	    } elsif ($packages{"$name.tgz"}) {
		$data{$i} .= qq{ | <a href="$packagesURL$name.tgz">パッケージ</a>};
	    }

	    $data{$i} .= qq{ | <A HREF="$pds?$sourcepath">ソース</A>};

	    if ($www ne "") {
		$data{$i} .= qq{ | <a href="$www">Main Web Site</a>};
	    }

    	    $ownerurl = $owner;
    	    $ownerurl =~ s/&lt;/</g;
    	    $owenrurl =~ s/&gt;/>/g;
	    $data{$i} .= 
		"<BR><I>保守担当者:</I> <A HREF=\"mailto:$ownerurl\">$owner</A>";

    	    # If there are any dependencies, list them
    	    if ($bdep ne "" || $rdep ne "") {
    	    	$data{$i} .= "<BR><I>必要なもの:</I> ";
    	    	@dep = split(/ /, "$bdep $rdep");
		local($last) = '';
		foreach $j (sort @dep) {
		    next if $j eq $last;
		    $last = $j;
     	    	    $data{$i} .= " <A HREF=\"##$j##.html#$j\">$j</A>,";
    	    	}
    	    	# remove the trailing comma
    	    	chop $data{$i};
    	    }

    	    # If the port is listed in more than one category, throw
    	    # in some cross references
    	    if ($#cat > 0) {
    	    	$data{$i} .= "<BR><EM>ここにも含まれています:</EM> ";
    	    	foreach $j (@cat) {
    	    	    if ($j ne $i) {
			if ($j eq $cat[0]) {
			    $data{$i} .= " <STRONG><A HREF=\"$j.html#$name\">\u$j</A></STRONG>,";
			}
			else {
			    $data{$i} .= " <A HREF=\"$j.html#$name\">\u$j</A>,";
			}
    	    	    }
    	    	}
    	    	# remove the trailing comma
    	    	chop($data{$i});
    	    }
    	    $data{$i} .= "<P></P></DD>\n"
	}

    	# Add an entry to the master index

	# workaround for SGML bug, `--' is not allowed in comments
	local($sname) = $name; 
	$sname =~ s/--/-=/g;
    	$master[$portnumber] = 
    	    "<!-- $sname --><STRONG><A HREF=\"$cat[0].html#$name\">$name</A></STRONG> " .
    	    " -- <EM>$desc</EM><BR>\n";
	$portnumber++;
    }

    open(MOUTF, ">index.sgml");

    &header(MOUTF, "FreeBSD Ports");
#    print MOUTF "<!--#include virtual=\"./ports.inc\" -->\n";
    print MOUTF "&blurb;";
    print MOUTF "<hr><P>FreeBSD Ports Collection には、現時点で $portnumber 個の ports が提供されています。<br> <A HREF=\"$baseFTP/ports.tar.gz\">$portnumber 個すべての ports を tar でまとめて gzip したもの</A> (およそ 21 メガバイト) をダウンロードするか、以下の分類からたどってください。\n";

    print MOUTF "<UL>\n";

    @foos = sort(keys %stats);
    foreach $key  (@foos) {
	# For the master file...
	print MOUTF 
	    "<LI><A HREF=\"$key.html\">\u$key</A> <em>($stats{$key})</em>";
	if ($category_description{$key}) {
	    print MOUTF " -- " . $category_description{$key};
	}

        # Someone forgot to add a category to the description file
        # or there is a typo in the category field.
#       else {
#           warn "No description found for category: ``$key''!\n";
#           warn "Please fix me or send an E-Mail to doc\@FreeBSD.org\a\n";
#           sleep(3);
#       }
	print MOUTF "</LI>\n";

	# Create the category file
	open(OUTF, ">$key.sgml");
	&header(OUTF, "FreeBSD Ports: \u$key");
	if ($category_description{$key}) {
	    print OUTF "<h3>", $category_description{$key}, "</h3>\n";
	}
	print OUTF "<DL>\n";
	$d = join("\n", sort(split(/\n/, $data{$key})));
    	$d =~ s/##([^#]*)##/$catkey{$1}/g;
	print OUTF $d;
	print OUTF "</DL>\n";
	&footer(OUTF, "<p></p><A HREF=\"index.html\">Port の分類</A>" .
	    " -- <A HREF=\"master-index.html\">一覧</A>");
	close(OUTF);

    }
    print MOUTF "</UL>\n";
    print MOUTF 
    	"<UL><LI><A HREF=\"master-index.html\">$portnumber 個の ports 全てをアルファベット順に並べた一覧</A></LI></UL>\n";
    &footer(MOUTF, "");
    close(MOUTF);

    # Create the master index file
    open(MINDEX, ">master-index.sgml");
    &header(MINDEX, "FreeBSD Ports Collection 一覧");
    print MINDEX "<P>\n";
    print MINDEX sort @master;
    print MINDEX "</P>";
    &footer(MINDEX, "<A HREF=\"index.html\">Port の分類</A>");
    close(MINDEX);

    close(INDEX);
}
