#!/Perl/5.00502/bin/MSWin32-x86-object/perl
########################################################################
# PWD: PW_Tools Documentarchive
########################################################################
# PW_Tools_Ver: 1.0, April 5 16:26 2001 by Peter Wieland
########################################################################
#
# Copyright 1999, 2000, 2001 Peter Wieland.
#
# This file is part of PW_Tools.
#
# PW_Tools is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# PW_Tools is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with PW_Tools; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
########################################################################
# How it works ...
#
# Put all NEW files in the directory ./New (Format must be as defined in the
#                                           Configuration part below)
# 
# Run the programme to get the Doc_Index.html right
#
# If errors in user input, edit the file ./Input/Doc_Index.txt to get 
# Author, Title and Date right 
# Edit the file ./Input/Doc_<Name>.txt to get Template Documents right 
#
# Run the programme again, to get the Doc_<Name>.html right
#
########################################################################
use File::Copy;
$VERBOSE=1;     # 0 is false, 1 is true

########################################################################
# CONFIGURATION, HAS TO BE EDITED ...
########################################################################

$HEADERCOLOR = "#33FFCC";

########################################################################
#    \w  Match a "word" character (alphanumeric plus "_")
#    \W  Match a non-word character
#    \s  Match a whitespace character
#    \S  Match a non-whitespace character
#    \d  Match a digit character
#    \D  Match a non-digit character
#
#The following standard quantifiers are recognized: 
#
#    *      Match 0 or more times
#    +      Match 1 or more times
#    ?      Match 1 or 0 times
#    {n}    Match exactly n times
#    {n,}   Match at least n times
#    {n,m}  Match at least n but not more than m times
########################################################################

$level_1= '\d';
$level_2= '\d\d';
$level_3= '\w';
$level_4= '\d\d\d\d';
$level_5= '\d\d';
$level_6= '\d';

$level1_6= "($level_1)-($level_2)-($level_3)-($level_4)-($level_5)-($level_6)";


#########################################################################
# DO NOT EDIT ABOVE THIS LINE
#########################################################################

$level1= "$level_1";
$level2= "$level_2";
$level3= "$level_3";
#$level1_6= "$level_1$separator$level_2$separator$level_3$separator$level_4$separator$level_5$separator$level_6";

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
    localtime(time);
$year += 1900;
$mon++;

$mytime = localtime;

$PWsign = "(<a href=\"http://www.iai.fzk.de/~wieland/PWtools/\">PW_Tools</a>)";

$InputFile="../PWD/Input/types.txt";
open (FromFILE,"< $InputFile") or die 
    "Can't open InputFile: $InputFile";

while ( <FromFILE> ){
    ($Abr,$Label) = split(/;/,$_);
    @TYPE{$Abr} = $Label; 	
}
close (FromFILE);

$InputFile="../PWD/Input/work_packages.txt";
open (FromFILE,"< $InputFile") or die 
    "Can't open InputFile: $InputFile";

while ( <FromFILE> ){
    ($Abr,$Label) = split(/;/,$_);
    @HEADER{$Abr} = $Label; 	
}
close (FromFILE);

&deliver;
&make_txt;
&merge_txt;

$InputFile="../PWD/Input/Doc_Index.txt";
open (FromFILE,"< $InputFile") or die 
    "Can't open InputFile: $InputFile";

while ( <FromFILE> ){
    ($File,$Path,$Name,$Author,$Date) = split(/;/,$_);
    @ID{$File} = $File; 	
    @PATH{$File} =$Path; 	
    @NAME{$File} = $Name;
    @AUTHOR{$File} =$Author; 	
    @DATE{$File} = $Date;
    $counter++;
}

close (FromFILE);

foreach $ref (keys %ID) {
    if ($ref =~  /^$level1_6/) {
	@HELPARRAY1{$ref} = "@AUTHOR{$ref}@DATE{$ref}";
    }
}
$OutFile="../PWD/Input/Doc_Author.txt";
open (ToFILE,"> $OutFile") or die 
    "Can't open OutFile: $OutFile";
    print ToFILE"Title;;Ref.Nr.\n";

foreach $File (sort {$HELPARRAY1{$a} cmp $HELPARRAY1{$b}} keys %HELPARRAY1) { 
    print ToFILE"$ID{$File};\n";
}
close (ToFILE);

foreach $ref (keys %ID) {
    if ($ref =~  /^$level1_6/) {
	@HELPARRAY2{$ref} = "$DATE{$ref}@ID{$ref}";
    }
}
$OutFile="../PWD/Input/Doc_Date.txt";
open (ToFILE,"> $OutFile") or die 
    "Can't open OutFile: $OutFile";
    print ToFILE"Title;;Ref.Nr.\n";

foreach $File (sort {$HELPARRAY2{$a} cmp $HELPARRAY2{$b}} keys %HELPARRAY2) { 
    print ToFILE"$ID{$File};\n";
}
close (ToFILE);

&make_templates;
&make_html(%ID);

foreach $ref (keys %ID) {
    if ($ref =~  /^$level1_6/) {
	@TYPES{$ref} = "$3-$1-$2-$4-$5-$6";
    }
}

&make_sort_type(%TYPES);




## 
## READ NEW FILES AND DELIVER THEM -----------------------------------------------
##

sub deliver {

    opendir(DIRHANDLE_B, "../PWD/New");
    @template_files = grep(m/^$level1_6\.(.*)/, readdir(DIRHANDLE_B));
    closedir(DIRHANDLE_B);

    foreach $template_file ( @template_files ) {
	if ($template_file =~ m/^$level1_6/){
            $source = "../PWD/New/$template_file";
	    $dir1 = "../PWD/$1";
	    $dir2 = "$dir1/$2";
	    $dir3 = "$dir2/$3";
	    $dir4 = "$dir3/$1-$2-$3-$4-$5-$6";
            $dest = "$dir4/$template_file";
	    
	    if (!-d $dir1){mkdir  $dir1,755};
	    if (!-d $dir2){mkdir  $dir2,755};
	    if (!-d $dir3){mkdir  $dir3,755};
	    if (!-d $dir4){mkdir  $dir4,755};
	    
            if (-e $dest){
		print "$dest already in place ...\n";
		print "Press <RETURN> to continue ...\n";
		$tite = readline(*STDIN);
	    }
            else {
		move($source,$dest);
	    }
	}
    }
}

## 
## CREATE HTML OVERVIEW PAGE -----------------------------------------------
##

sub make_html {
    my %DOC_ARRAY = @_;

    $IndexFile="../PWD/Doc_Index.html";
    open (ToFILE,"> $IndexFile") or die 
	"Can't open InputFile: $InputFile";

    $HeaderFile="../Input/header.html";
    $PAGE_LEVEL="../..";
    open (HEADERFILE,"< $HeaderFile") or die 
	"Can't open HeaderFile: $HeaderFile";
    while ( <HEADERFILE> ){
	s/PAGE_LEVEL/$PAGE_LEVEL/g;
	print ToFILE"$_";
    }
    close (HEADERFILE);


    print ToFILE"<H2>Document-Archive (Ref. No. sorted)</H2>\n";
        
    print ToFILE"<p><A HREF=\"../../DocRef.html\">The Document Reference System</A></p>";

    foreach $header (sort keys %HEADER){
	print ToFILE"<A HREF=\"#$header\">$HEADER{$header}</A> | ";
    }
    print ToFILE"<p><table  border= \"0\">\n";
    
    $WE = -1;
    
    $counter = 0;
    
    foreach $File (sort keys %DOC_ARRAY) { 
	$counter++;
#	print "Process $counter: $File\n";
        if ($ID{$File} =~ m/^$level1_6/){
            $new = $1;
	    if (!($WE eq $new)){
		print ToFILE"<tr><A NAME=\"$new\"></a>";
		print ToFILE"<td bgcolor=\"$HEADERCOLOR\" valign=\"top\" width=\"15%\"><b>Ref. No.</b></td>";
		print ToFILE"<td bgcolor=\"$HEADERCOLOR\" valign=\"top\" width=\"40%\"><b>$HEADER{$new}</b></td>";
		print ToFILE"<td bgcolor=\"$HEADERCOLOR\" valign=\"top\" width=\"30%\"><b>Author</b></td>";
		print ToFILE"<td bgcolor=\"$HEADERCOLOR\" valign=\"top\" width=\"15%\"><b>Date</b></td>";
		print ToFILE"</tr>\n";
		$WE = $new;
	    }
	}
	print ToFILE"<tr><td valign=\"top\"> <a href=\"$PATH{$File}\">$ID{$File}</a></td><td valign=\"top\">$NAME{$File}</td><td valign=\"top\">$AUTHOR{$File}</td><td valign=\"top\">$DATE{$File}</td></tr>\n";
    }
    
    print ToFILE"</table>\n";
    print ToFILE"</p>Generated: <b>$mytime</b> by PWD.pl $PWsign\n";
    print ToFILE"</body>\n";
    
    close (ToFILE);
}

## 
## CREATE OTHER SORT ORDER OVERVIEW PAGES ------------------------------------
##

sub make_sort_type {
    my %DOC_ARRAY = @_;

    $IndexFile="../PWD/Doc_Type.html";
    open (ToFILE,"> $IndexFile") or die 
	"Can't open InputFile: $InputFile";

    $HeaderFile="../Input/header.html";
    $PAGE_LEVEL="../..";
    open (HEADERFILE,"< $HeaderFile") or die 
	"Can't open HeaderFile: $HeaderFile";
    while ( <HEADERFILE> ){
    s/PAGE_LEVEL/$PAGE_LEVEL/g;
	print ToFILE"$_";
    }
    close (HEADERFILE);


    print ToFILE"<H2>Document-Archive (Type sorted)</H2>\n";
    
    print ToFILE"<p><A HREF=\"../../DocRef.html\">The Document Reference System</A></p>";

    foreach $header (sort keys %TYPE){
	print ToFILE"<A HREF=\"#$header\">$TYPE{$header}</A> | ";
    }
    print ToFILE"<p><table  border= \"0\">\n";
    
    $WE = -1;
#    $WE = 0;
    
    $counter = 0;
    
    foreach $File (sort {$DOC_ARRAY{$a} cmp $DOC_ARRAY{$b}} keys %DOC_ARRAY) { 
	$counter++;
#	print "Process $counter: $File\n";
        if ($ID{$File} =~ m/^$level1_6/){
            $new = $3;
	    if (!($WE eq $new)){
		print ToFILE"<tr><A NAME=\"$new\"></a>";
		print ToFILE"<td bgcolor=\"$HEADERCOLOR\" valign=\"top\" width=\"15%\"><b>Ref. No.</b></td>";
		print ToFILE"<td bgcolor=\"$HEADERCOLOR\" valign=\"top\" width=\"40%\"><b>$TYPE{$new}</b></td>";
		print ToFILE"<td bgcolor=\"$HEADERCOLOR\" valign=\"top\" width=\"30%\"><b>Author</b></td>";
		print ToFILE"<td bgcolor=\"$HEADERCOLOR\" valign=\"top\" width=\"15%\"><b>Date</b></td>";
		print ToFILE"</tr>\n";
		$WE = $new;
	    }
	}
	print ToFILE"<tr><td valign=\"top\"> <a href=\"$PATH{$File}\">$ID{$File}</a></td><td valign=\"top\">$NAME{$File}</td><td valign=\"top\">$AUTHOR{$File}</td><td valign=\"top\">$DATE{$File}</td></tr>\n";
    }
    
    print ToFILE"</table>\n";
    print ToFILE"</p>Generated: <b>$mytime</b> by PWD.pl $PWsign \n";
    print ToFILE"</body>\n";
    
    close (ToFILE);
      
}

## 
## CREATE OTHER OVERVIEW PAGES -----------------------------------------------
##

sub make_templates {


    opendir(DIRHANDLE_A, "../PWD/Input/");
    @TEMPLATES = grep(m/^Doc_(\w*)\.txt$/, readdir(DIRHANDLE_A));
    closedir(DIRHANDLE_A);
    
    foreach $template (@TEMPLATES) {
	print "Process: $template \n";
	
	if ($template =~ m/^Doc_(\w*)\.txt/ ){
	    $header = $1;
	}
	
	$InputFile="../PWD/Input/$template";
	open (FromFILE,"< $InputFile") or die 
	    "Can't open InputFile: $InputFile";
	
	
	$IndexFile="../PWD/$template";
	$IndexFile=~ s/.txt/.html/;
	
	open (ToFILE,"> $IndexFile") or die 
	    "Can't open InputFile: $InputFile";
	
	$HeaderFile="../Input/header.html";
    	$PAGE_LEVEL="../..";
	open (HEADERFILE,"< $HeaderFile") or die 
	    "Can't open HeaderFile: $HeaderFile";
	while ( <HEADERFILE> ){
	    s/PAGE_LEVEL/$PAGE_LEVEL/g;
	    print ToFILE"$_";
	}
	close (HEADERFILE);
	
	print ToFILE"<p><A HREF=\"../../DocRef.html\">The Document Reference System</A></p>";
	
	print ToFILE"<H2>$header</H2>\n";
	
	print ToFILE"<p><table  border= \"0\">\n";
	
	$WE = 0;
	
	$counter = 0;
	
	while ( <FromFILE> ){
	    ($File,$Path,$Name,$Author,$Date) = split(/;/,$_);
	    $counter++;
#	    print "Process $counter: $_\n";
	    if ($File =~ m/^$level1_6/){
		print ToFILE"<tr><td valign=\"top\"><a href=\"$PATH{$File}\">$File</a></td><td valign=\"top\">$NAME{$File}</td><td valign=\"top\"> $AUTHOR{$File}</td><td valign=\"top\"> $DATE{$File}</td></tr>\n";
	    }
	    else
	    {
		print ToFILE"<tr><A NAME=\"$run\"></a>";
		print ToFILE"<td bgcolor=\"$HEADERCOLOR\" valign=\"top\" width=\"15%\"><b>$Name</b></td>";
		print ToFILE"<td bgcolor=\"$HEADERCOLOR\" valign=\"top\" width=\"40%\"><b>$File  $Path</b></td>";
		print ToFILE"<td bgcolor=\"$HEADERCOLOR\" valign=\"top\" width=\"30%\"><b>Author</b></td>";
		print ToFILE"<td bgcolor=\"$HEADERCOLOR\" valign=\"top\" width=\"15%\"><b>Date</b></td>";
		print ToFILE"</tr>\n";
	    }
	}
	
	print ToFILE"</table>\n";
	print ToFILE"</p>Generated: <b>$mytime</b> by PWD.pl $PWsign \n";
	print ToFILE"</body>\n";
    
	close (ToFILE);
	close (FromFILE);
    }
    
}

## 
## SCAN DIRECTORY AND CREATE FILES_FOUND.TXT FILE  -----------------------------------------------
##


sub make_txt {

    $IndexFile="../PWD/Input/Files_Found.txt";
    open (ToFILE,"> $IndexFile") or die 
	"Can't open InputFile: $InputFile";
    
    opendir(DIRHANDLE_A, "../PWD/");
    @WE = grep(m/^$level1/, readdir(DIRHANDLE_A));
    
    foreach $we (@WE) {
#    print "Work Element: $we\n";
	opendir(DIRHANDLE_B, "../PWD/$we/");
	@TASK = grep(m/^$level2/, readdir(DIRHANDLE_B));
	
	foreach $task (@TASK) {
#	    print "  Task: $task\n";
	    opendir(DIRHANDLE_C, "../PWD/$we/$task/");
	    @GROUP = grep(m/^$level3/, readdir(DIRHANDLE_C));
	    
	    foreach $group (@GROUP) {
#	    print "    Group: $group\n";
		opendir(DIRHANDLE_D, "../PWD/$we/$task/$group/");
		@DIR = grep(m/^$level1_6/, readdir(DIRHANDLE_D));
		
		foreach $dir (@DIR) {
#		    print "      Dir: $dir\n";
		    print ToFILE"$dir;./$we/$task/$group/$dir\n";
		}
		closedir(DIRHANDLE_D);
	    }
	    closedir(DIRHANDLE_C);
	}
	closedir(DIRHANDLE_B);   
    }
    closedir(DIRHANDLE_A);
    
    close(ToFILE);
}

## 
## MERGE ALL FOUND DOCUMENTS WITH OLD ONES KNOWN SO FAR ---------------------------
##

sub merge_txt {
    $FoundFile="../PWD/Input/Files_Found.txt";
    open (FOUNDFILE,"< $FoundFile") or die 
	"Can't open InputFile: $InputFile";
    
    $IndexFile="../PWD/Input/Doc_Index.txt";
    open (INDEXFILE,"< $IndexFile") or die 
	"Can't open InputFile: $InputFile";
    
    while ( <INDEXFILE> ){
        chop $_;
	($File,$Path,$Name,$Author,$Date) = split(/;/,$_);
        @INDEX{$File} =$Path; 	
        @NAME{$File} = $Name;
        @AUTHOR{$File} =$Author; 	
        @DATE{$File} = $Date;
    }
    
    $TempFile="../PWD/Input/Doc_Temp.txt";
    open (TMPFILE,"> $TempFile") or die 
	"Can't open InputFile: $InputFile";
    
    
    while ( <FOUNDFILE> ){
        chop $_;
	($File,$Path) = split(/;/,$_);
        if (length(@INDEX{$File}) > 0) {
	    print TMPFILE"$File;@INDEX{$File};@NAME{$File};@AUTHOR{$File};@DATE{$File}\n";
	}
	else
	{
	    print "Information for Document $File\n";
            print "Title: ";
            $tite = readline(*STDIN);
            chop $tite;
            print "Author: ";
            $auth = readline(*STDIN);
            chop $auth;
            print "Date (YYYY-MM-DD): ";
            $dat = readline(*STDIN);
            chop $dat;
            print TMPFILE"$File;$Path;$tite;$auth;$dat\n";
            
	}
    }
 
   
    close (TMPFILE);
    close (INDEXFILE);
    close (FOUNDFILE);
    $BACKUPFILE="$IndexFile.bak";
    move ($IndexFile,$BACKUPFILE);
    move ($TempFile,$IndexFile);
    
}



