Admin/page/bin/genpage
author paulson
Wed, 25 Oct 2000 17:43:34 +0200
changeset 10325 76f318befccb
parent 9920 9734f2717203
permissions -rwxr-xr-x
Even numbers section of Inductive chapter
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9920
9734f2717203 improved WWW page generation (still somewhat experimental);
wenzelm
parents: 8056
diff changeset
     1
#!/usr/bin/perl -w
8056
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
     2
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
     3
# Genpage - Webpage Generator.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
     4
#
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
     5
# Copyright (C) Joe Vaughan <joev@freddyfrog.com> 1998-1999
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
     6
# Some portions Copyright (C)  Ronan Waide <waider@waider.ie> 1999
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
     7
# Some portions Copyright (C)  Rocco Caputo <troc@netrus.net> 1999
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
     8
# 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
     9
#   This program is free software; you can redistribute it and/or modify
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    10
#   it under the terms of the GNU General Public License as published by
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    11
#   the Free Software Foundation; either version 2 of the License, or
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    12
#   (at your option) any later version.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    13
#   
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    14
#   This program is distributed in the hope that it will be useful,
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    15
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    16
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    17
#   GNU General Public License for more details.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    18
#   
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    19
#   You should have received a copy of the GNU General Public License
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    20
#   along with this program; if not, write to the Free Software
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    21
#   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    22
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    23
$|=1;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    24
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    25
$version = "1.0b3";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    26
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    27
# following fix for Mac Perl submitted by Dair Grant <dair@webthing.net>
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    28
# I shoulda thought of this, but I don't have a mac :) Thanks Dair.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    29
#  
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    30
# dair, construct a path procedurally
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    31
sub build_path
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    32
{
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    33
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    34
    # Retrieve our parameters
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    35
    #
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    36
    my $thePath = $_[0];
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    37
    my $theItem = $_[1];
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    38
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    39
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    40
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    41
    # If we're running on a Mac, munge the path/item/separator
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    42
    #
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    43
    if ($^O eq "MacOS")
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    44
        {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    45
        $thePath =~ s/:$//;     # Strip off trailing ':'
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    46
        $theItem =~ s/^:$//;    # Drop theItem == ':'
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    47
        $pathDiv  = ":";        # Use Mac separator
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    48
        }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    49
    else
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    50
        {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    51
        $pathDiv = "/";         # Use Unix separator
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    52
        }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    53
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    54
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    55
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    56
    # Return the path to the item
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    57
    #
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    58
    return($thePath . $pathDiv . $theItem);
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    59
}
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    60
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    61
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    62
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    63
# Some handy variables.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    64
$numfiles = 0;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    65
$numcontentfiles = 0;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    66
$numignoredfiles = 0;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    67
$numskippedfiles = 0;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    68
$numcpfiles = 0;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    69
$numdirfiles =0;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    70
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    71
use Getopt::Std;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    72
use File::Find;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    73
use File::Copy 'cp';
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    74
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    75
# Current Working Dir.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    76
$pwd = `pwd`;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    77
chomp ($pwd);
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    78
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    79
getopts('dt:c:o:fqhi:') || die "Invalid args, use $0 -h for help\n";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    80
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    81
# $opt_d is debug flag
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    82
# $opt_t is template file. If not set, use standard template.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    83
# $opt_c is content directory. If not set, use standard content dir.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    84
# $opt_o is output dir, if not set, use standard output dir.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    85
# $opt_q sets quiet mode (no stdout output)
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    86
# $opt_f sets a force flag - force generation even if output file is present
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    87
#        and newer.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    88
# $opt_h runs usage and exits
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    89
    
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    90
# dair, build paths procedurally
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    91
$opt_t ||= build_path("", "layout") . build_path("", "template.html");
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    92
$opt_c ||= build_path("", "content");
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    93
$opt_o ||= build_path("", "www");
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    94
$opt_f ||= 0;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    95
$opt_d ||= 0;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    96
$opt_q ||= 0;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    97
$opt_h ||= 0;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    98
$opt_i ||= 'CVS|.*,v$';
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
    99
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   100
# dair, build paths procedurally
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   101
$opt_t = build_path($pwd, $opt_t);
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   102
$opt_c = build_path($pwd, $opt_c);
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   103
$opt_o = build_path($pwd, $opt_o);
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   104
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   105
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   106
if ($opt_h) { &usage; }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   107
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   108
if (!$opt_q) { 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   109
  print "Genpage, version $version starting run...\n";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   110
}
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   111
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   112
if ($opt_d) { print "pwd = $pwd\n"; }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   113
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   114
#Swallow template file whole... 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   115
open( TEMPLATE, "<$opt_t" ) || die "Can\'t open template file $opt_t: $!\n";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   116
{ 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   117
local $/;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   118
undef $/;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   119
$template = <TEMPLATE>;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   120
close( TEMPLATE );
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   121
}
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   122
if (!$opt_q) {print "Using template file: $opt_t\n";}
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   123
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   124
# Go through files in content dir and if it's a content file then 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   125
# process it otherwise, copy it (and it's dir structure) to the output dir.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   126
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   127
# if the output dir doesn't exist, create it.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   128
if (! -d $opt_o)
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   129
{ 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   130
  mkdir $opt_o, 0755;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   131
  if (!$opt_q) 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   132
    {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   133
      print "Creating output directory: $opt_o\n"; 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   134
    }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   135
}
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   136
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   137
if (!$opt_q) 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   138
  {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   139
    print "Processing files:\n"; 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   140
  }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   141
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   142
if (! -d $opt_c) { die "Can\'t open content dir\n" }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   143
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   144
find( \&process_file, $opt_c );
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   145
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   146
if (!$opt_q) 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   147
  {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   148
    #numfiles reports one too many...
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   149
    $numfiles--;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   150
    print "\nFinished.\n\n";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   151
    print "Run Summary.\n===========\n";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   152
    print "$numfiles total files and directories processed.\n";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   153
    print "$numcontentfiles content files parsed.\n";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   154
    print "$numskippedfiles content files skipped.\n"; 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   155
    print "$numcpfiles files copied.\n"; 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   156
    print "$numdirfiles directories created\n"; 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   157
    print "$numignoredfiles files or directories ignored.\n";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   158
  }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   159
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   160
exit;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   161
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   162
##############################################################################
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   163
# Process_file the current file.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   164
##############################################################################
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   165
sub process_file
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   166
  {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   167
    if (!$opt_q) 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   168
      {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   169
	print "."; 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   170
      }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   171
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   172
    $numfiles++;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   173
    my $filename = $_;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   174
    my $dir = $File::Find::dir;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   175
    (undef,$reldir) = split( $opt_c, $dir);
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   176
    if (!defined ($reldir) ) { $reldir = ""; }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   177
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   178
    # dair, build paths procedurally
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   179
    $outdir  = build_path($opt_o,  $reldir);
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   180
    $outfile = build_path($outdir, $filename);
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   181
    $infile  = build_path($dir,    $filename);
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   182
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   183
    # Ignore CVS stuff, ./ etc.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   184
    if ($infile =~ /$opt_i/) {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   185
      $numignoredfiles++;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   186
      return;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   187
    }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   188
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   189
    # Find returns ./ in each directory... avoid.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   190
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   191
    if ($infile =~ /\/.$/) {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   192
      return;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   193
    }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   194
    
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   195
    # Ok, If the file is a dir, we create it (if necessary)
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   196
    # if it's a content file, we parse it, otherwise, we
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   197
    # copy it to the appropriate location.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   198
    
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   199
    if ( -d $infile ) {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   200
      if ($opt_d) { print "Making dir $outfile\n"; };
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   201
      mkdir $outfile, 0755 unless -d $outfile;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   202
      $numdirfiles++;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   203
      return;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   204
    }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   205
    
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   206
    if ($filename =~ /^(.*)\.content$/) 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   207
      {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   208
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   209
    # dair, build paths procedurally
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   210
    $outfile = build_path($outdir, "$1.html");
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   211
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   212
	if ($opt_d) {print "Parsing: $infile\n Outputing to: $outfile\n";};
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   213
	process_content($infile,$outfile);
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   214
      }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   215
    else
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   216
      {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   217
	if ($opt_d) { print "Copying: $infile => $outfile\n"; };
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   218
	cp($infile,$outfile);
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   219
	$numcpfiles++;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   220
      }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   221
    $_ = $filename; # because we broke it...
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   222
  }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   223
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   224
##############################################################################
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   225
# Process the tags in the template, substituting in the content file 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   226
# components and other things like inline function definitions and 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   227
# "include" directives
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   228
##############################################################################
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   229
 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   230
sub process_content
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   231
  {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   232
    
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   233
    $inputfile = shift;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   234
    $outputfile = shift;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   235
    my @content = "";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   236
   
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   237
    $temp = $template;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   238
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   239
    if ($opt_d) { print "processing $inputfile to $outputfile\n";}
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   240
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   241
# Make-like check for last modification times to see if it's necessary
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   242
# to re-gen this page.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   243
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   244
    if ( -f $outputfile) 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   245
      {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   246
	   
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   247
	if (!$opt_f && ( -M $outputfile < -M $inputfile)) 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   248
	  {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   249
	    $numskippedfiles++;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   250
	    if ($opt_d) { 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   251
	      print "skipping $inputfile because $outputfile is newer\n";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   252
	    }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   253
	    return;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   254
	  }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   255
      }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   256
    # Read content file
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   257
    open( CONTENT, "<$inputfile" ) || die $!;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   258
    @content = <CONTENT>;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   259
    close( CONTENT );
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   260
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   261
    $numcontentfiles++;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   262
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   263
    undef %page;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   264
    undef $tag;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   265
    foreach $line ( @content )
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   266
      {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   267
	if ( $line =~ /^\s*\%(.+)\%/ )
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   268
	{
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   269
	  $tag = $1;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   270
	  next;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   271
	}
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   272
	next if !defined( $tag );
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   273
	
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   274
	 $line .= "\n" if $line !~ /\n$/;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   275
	
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   276
	if ( defined( $page{ $tag } ))
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   277
	  {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   278
	    $page{ $tag } .= $line;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   279
	  }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   280
	else
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   281
	  {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   282
	    $page{ $tag } = $line;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   283
	  }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   284
      }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   285
    
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   286
    open( HTML, ">$outputfile" ) || die $1;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   287
    
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   288
    while ($temp =~ /^(.*?)<!--\s*_GP_\s*(.*?)\s*-->(.*)$/s)
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   289
      {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   290
	local $replacement = "";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   291
	my ($left, $middle, $right) = ($1, $2, $3);
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   292
        if (!defined($replacement = eval ($middle))) 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   293
	  { 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   294
	    $replacement = "";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   295
	  }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   296
	
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   297
	if ($@) {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   298
          $middle =~ s/\s+/ /g;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   299
          print STDERR "error evaluating { $middle }: $@\n";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   300
        }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   301
        else {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   302
          if ($opt_d) {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   303
	    print "evaluation output: $replacement\n";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   304
	  }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   305
        }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   306
	
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   307
	$temp = $left . $replacement . $right;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   308
      }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   309
    print HTML $temp;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   310
    close( HTML );
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   311
  }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   312
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   313
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   314
sub include
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   315
  {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   316
    my ($file) = shift;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   317
    my ($section) = shift;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   318
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   319
    if ($opt_d) { 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   320
      print "include: file = $file\n"; 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   321
    }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   322
    if (!open( INCLUDE, "<$file" )) { 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   323
      return "<!-- include: file not found: $file -->";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   324
    }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   325
    
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   326
    if (defined($section)) {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   327
    undef %incpage;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   328
    undef $inctag;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   329
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   330
      @content = <INCLUDE>;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   331
      close (INCLUDE);
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   332
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   333
      foreach $line ( @content )
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   334
	{
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   335
	  if ( $line =~ /^\s*\%(.+)\%/ )
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   336
	    {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   337
	      $inctag = $1; 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   338
	      next;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   339
	    }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   340
	  next if !defined( $inctag );
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   341
	  $line .= "\n" if $line !~ /\n$/;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   342
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   343
	  if ( defined( $incpage{ $inctag } ))
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   344
	    {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   345
	      $incpage{ $inctag } .= $line;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   346
	    }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   347
	  else
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   348
	    {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   349
	      $incpage{ $inctag } = $line;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   350
	    }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   351
	}
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   352
      if (defined( $incpage{$section}) ) {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   353
	$inline = $incpage{$section};
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   354
      }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   355
      else {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   356
	$inline = "<!-- include: no such section - $section - in $file -->";  
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   357
      }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   358
    } 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   359
    else
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   360
      {	
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   361
	local $/;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   362
	undef $/;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   363
	$inline = <INCLUDE>;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   364
	close( INCLUDE );
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   365
      }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   366
    return "$inline";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   367
  }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   368
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   369
sub content
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   370
  {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   371
    my $tag = shift;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   372
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   373
    if ($opt_d) { print "content: tag = $tag\n"; }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   374
    if (defined( $page{ $tag } ))
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   375
      {      
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   376
	$output = $page { $tag };
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   377
	if ($opt_d) { print "content: output = $output\n"; }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   378
	return "$output";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   379
      }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   380
    else
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   381
      {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   382
	return "<!-- content: undefined tag: $tag -->";
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   383
      }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   384
  }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   385
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   386
sub version
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   387
  {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   388
    return ( "<a href=\"http://www.mnemonic.org/genpage/\">Genpage</a> - Version: $version" );
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   389
  }
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   390
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   391
sub usage
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   392
  {
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   393
    print <<EOT;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   394
usage: genpage [-dqfh] [-c <content dir>] [-o <output dir>] 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   395
               [-t <template file>] [ -i <ignore regexp> ]
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   396
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   397
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   398
       -d debug mode.     Turn on debugging (very verbose!)
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   399
       -q quiet mode.     Don't print anything while running.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   400
       -f force mode.     Force the parsing of content files.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   401
       -h help.           Print this help text.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   402
       -c <content dir>   The directory where your content tree exists.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   403
                          Defaults to ./content.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   404
       -o <output dir>    The directory to put the output website.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   405
                          Defaults to ./www
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   406
       -t <template file> The template to use to generate the site.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   407
                          Defaults to ./layout/template.html
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   408
       -i <ignore regexp> Regular expression telling genpage to ignore certain
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   409
                          files or directories. defaults to "CVS|.*,v$"
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   410
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   411
       Genpage $version Copyright (C) Joe Vaughan <joev\@mnemonic.org> 1999
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   412
       This program is released under the terms of the GNU Public License
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   413
       Please read the accompanying COPYING file for details.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   414
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   415
       For detailed instructions on how to use Genpage, please consult the 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   416
       accompanying documentation. If you have questions, comments or 
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   417
       suggestions for Genpage please contact the author.
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   418
EOT
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   419
exit;
3c587e7b8fe5 new webpage layout
kleing
parents:
diff changeset
   420
}