# $Id: ldp.pm,v 1.12 2009/05/18 13:32:00 mdk Exp $
package ldp;

#################################################################
# LDP の "sorted_howtos.dat" を読み込んで、いくつかのリスト/ハッシュへの
# リファレンスを返す。"sorted_howtos.dat" のフォーマットに依存しているので
# "sorted_howtos.dat" が大幅に書き換えられるようなことになったら、この script
# のこの関数は書き換える必要がある。
#
# 引数のリスト
#
# [0]: "sorted_howtos.dat" のファイルの所在
#
# 返り値となるもののリスト
#
# 1 : LDP に登録されている文書の BASENAME (文書名)のリスト
# 2 : 文書名をキーとした著者データへのハッシュ
# 3 : 文書名をキーとした文書の最終更新日時 (YYYY/MM/DD)へのハッシュ
# 4 : 文書名をキーとした文書の簡単な説明文へのハッシュ
# 5 : 文書名をキーとした文書の種類。HOWTO or MINI
#
# このうち、この script で実際につかっているのは 1, 3, 5 だけである。
# というか、4 はもともとのデータ (sorted_howtos.dat) に無いから
# 調べようがない
sub read_sorted_howtos{

    my $DATAFILE = shift;
    my (@NAMES, %title, %update, %type, %docbook, %authors, %desc);
    #
    # 変数の説明:
    #
    # @NAMES:   文書名を格納するリスト
    # %title:   文書名をキーとした文書のタイトルのハッシュ (未使用)
    # %update:  文書名をキーとした文書の最終更新日時
    # %type:    文書名をキーとした文書のタイプ (HOWTO or MINI)
    # %docbook: 文書名をキーとした文書フォーマットの種類 (d or l)
    # %authors: 文書名をキーとした文書の著者名 (未使用 & 空)
    # %desc:    文書名をキーとした文書の解説 (未使用 & 空)
    # $bn:      各データを格納する際にキーとなる文書名が入るスカラー変数
    #
    open(LDP, $DATAFILE) or die "can't open $DATAFILE";

    my $dummyline = "";

    while(<LDP>){
	chomp;

    # sorted_howto.dat で SUBTITLE を検索するとわかるけど、
    # 変な record が混じっている。このためにエラーになる ;_; 
    # 回避するために付加した部分がここから ----
	if (/<\/SUBTITLE$/) {
	  $dummyline = $_;
	  next;
	}
	$_ = $dummyline . $_;
	s/<SUBTITLE>.*<\/SUBTITLE>//;
	$dummyline = "";
    # ---------------------------------------- ここまで

	my($update, $dummy, $title, $url) = split("\t");

	my $docbook = "l"; # linuxdoc
	if ($url =~ /\/index\.html$/ or $url =~ /\/$/) {
	    $docbook = "d"; # docbook
	    $url =~ s/\/$//;
	    $url =~ s/\/index\.html$//;
	}

	my($bn) = ($url =~ m|([^/]+)$|);
	$bn  =~ s/\.html//;

	next unless length $bn;

	my $type = "HOWTO";
	if ($url =~ /^HOWTO\/mini\//) {
	    $type = "MINI";
	}

	### These documents have been renamed. ############

	$bn = 'Cipe+Masq' if $bn =~ /Cipe\+Masq/;
#        $bn = 'Partition_LONGNAME'
#	  if $bn eq 'Partition-Mass-Storage-Dummies-Linux-HOWTO';

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

	push(@NAMES, $bn);
	$type{$bn} = $type;
	$title{$bn} = $title;
	$docbook{$bn} = $docbook;

	# いちおうヌル文字列を入れておく
	$authors{$bn} = '';
	$desc{$bn} = '';

	$update =~ s|-|/|g;
	$update{$bn} = $update;
    }
    close LDP;
    return (\@NAMES, \%authors, \%update, \%desc, \%type, \%docbook);
}

#
# 以下は たぶん もう 使わない
#

sub get_LDP_list {
#
# LDP の "HOWTO-INDEX.sgml" を読み込んで、いくつかのリスト/ハッシュへの
# リファレンスを返す。"HOWTO-INDEX.sgml" のフォーマットに依存しているので
# "HOWTO-INDEX.sgml" が大幅に書き換えられるようなことになったら、この script
# のこの関数は書き換える必要がある。
#
# 引数のリスト
#
# [0]: "HOWTO-INDEX.sgml" のファイルの所在
# [1]: "HOWTO-INDEX.sgml" には、月の名前に幾つか typo がある。外部で定義した
#       ハッシュでそれらの名前から 月の数字列に変換することになる。
#
# 返り値となるもののリスト
#
# 1 : LDP に登録されている文書の BASENAME (文書名)のリスト
# 2 : 文書名をキーとした著者データへのハッシュ
# 3 : 文書名をキーとした文書の最終更新日時 (YYYY/MM/DD)へのハッシュ
# 4 : 文書名をキーとした文書の簡単な説明文へのハッシュ
# 5 : 文書名をキーとした文書の種類。HOWTO or MINI
#
# このうち、この script で実際につかっているのは 1, 3 だけである。残りは
# 別の拡張に役に立つこともあるかも(?)
#
#
  my ($LDPINDEX) = @_;

my $monthref = {
#
# LDP の HOWTO-INDEX.sgml には、いくつかの typo が存在しているので、
# 通常の月/数字変換ハッシュにそれらを加える必要があります。
#
# sorted_howtos.dat に移行が済んだら、このテーブルは不要
#
		"April"        =>   "04",
		"August"       =>   "08",
		"Dececember"   =>   "12",
		"December"     =>   "12",
		"February"     =>   "02",
		"January"      =>   "01",
		"July"         =>   "07",
		"June"         =>   "06",
		"March"        =>   "03",
		"May"          =>   "05",
		"November"     =>   "11",
		"October"      =>   "10",
		"September"    =>   "09",
		"Sep"          =>   "09",
};

  my @categ = ("", "HOWTO", "MINI", "SPEC", "");
  my $class = 0;
  my (@NAMES, %titl, %url, %authors, %desc, %update, %type, $bn) = ();
  #
  # 変数の説明:
  #
  # @NAMES:   文書名を格納するリスト
  # %titl:    文書名をキーとした文書のタイトルのハッシュ
  # %url:     文書名をキーとした文書の URL へのハッシュ (未使用)
  # %authors: 文書名をキーとした文書の著者名
  # %desc:    文書名をキーとした文書の解説
  # %update:  文書名をキーとした文書の最終更新日時
  # $bn:      各データを格納する際にキーとなる文書名が入るスカラー変数
  #
  open(LDP, $LDPINDEX) or die "can't open $LDPINDEX";
  while (<LDP>) {
    $class    = 1 if /^<sect1>HOWTOs$/i;  
    $class    = 2 if /^<sect1>mini-HOWTOs$/i;
    $class    = 3 if /^<sect1>Special HOWTOs$/i;
    $class    = 4 if /^<SECT1>Unmaintained HOWTOs and mini-HOWTOs$/i;
    
    next if $class < 1;
    next if $class > 3;

    s/&lt;/</g;
    s/&gt;/>/g;

    if (/^<item><htmlurl\s+url=\"(.*)\"\s*name=\"(.*)\">/) {
      $bn = $1;
      $bn =~ s,\.html,,;
      $bn =~ s,^mini/,,;

      ### This document has been renamed. ############
      $bn = "Visible-bell" if $bn eq "Visual-Bell";  
      $bn = "Cipe+Masq" if $bn =~ /Cipe\+Masq/;  
      ################################################

      push(@NAMES, $bn);
      $type{$bn} = $categ[$class];
      $titl{$bn} = $2;
      $url{$bn}  = $1;
      next;
    }

    if ($bn) {
      if ((($class == 1) &&  /^\s+(.*)[\.\s]+$/) || 
	  (($class == 2) &&  /^by\s+(.*)[\.\s]+$/)) {
	$authors{$bn} = $1;
	next;
      }
    }

    if ($bn && /(.*)\s+Updated*\s+(.*[12]\d\d\d).*$/) {
      chomp;
      $desc{$bn} =   $1;

      my ($day, $month, $year);
      my @p = split(" ", $2);

      shift @p if /dosemu/;

      if ($p[0] =~ /\d+/) {
	$day = $p[0];
	$month = $monthref->{$p[1]};
	$year = $p[2];
      } elsif ($p[1] =~ /^\d{1,2},$/) {
	$p[1] =~ s/,//;
	$day = $p[1];
	$month = $monthref->{$p[0]};
	$year = $p[2];
      } else {
	$day = "00";
	$month = $monthref->{$p[0]};
	$year = $p[1];
      }
      ################################
      if ($bn eq "Printing-HOWTO") {
	$year = 1999;
	$month = 11;
	$day   = 19;
      }
      ################################
      if ($day < 10) {
	$day =~ s/^0//;
	$day = "0" . $day;
      }
      $update{$bn} = "$year/$month/$day";
    } elsif ($bn && /\w+/) {
      chomp;
      $desc{$bn} .=   $_;
      next;
    } elsif ($bn && /^$/) {
      $update{$bn} = "(unknown)";
      #####################################
      if ($bn eq "Emacs-Beginner-HOWTO") {
	$update{$bn} = "1999/10/14";
      }
      #####################################
    }
    if ($bn && $desc{$bn} && $update{$bn}) {
      $bn = "";
      next;
    }
    next;
  }
  close LDP;
  return (\@NAMES, \%authors, \%update, \%desc, \%type);
}

1;
