Admin/page/bin/genpage
changeset 8056 3c587e7b8fe5
child 9920 9734f2717203
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Admin/page/bin/genpage	Thu Dec 09 11:34:32 1999 +0100
@@ -0,0 +1,423 @@
+#!/bin/sh
+exec perl -x. $0 ${1+"$@"} 
+#
+#!perl -w
+
+# Genpage - Webpage Generator.
+#
+# Copyright (C) Joe Vaughan <joev@freddyfrog.com> 1998-1999
+# Some portions Copyright (C)  Ronan Waide <waider@waider.ie> 1999
+# Some portions Copyright (C)  Rocco Caputo <troc@netrus.net> 1999
+# 
+#   This program 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.
+#   
+#   This program 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 this program; if not, write to the Free Software
+#   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+$|=1;
+
+$version = "1.0b3";
+
+# following fix for Mac Perl submitted by Dair Grant <dair@webthing.net>
+# I shoulda thought of this, but I don't have a mac :) Thanks Dair.
+#  
+# dair, construct a path procedurally
+sub build_path
+{
+
+    # Retrieve our parameters
+    #
+    my $thePath = $_[0];
+    my $theItem = $_[1];
+
+
+
+    # If we're running on a Mac, munge the path/item/separator
+    #
+    if ($^O eq "MacOS")
+        {
+        $thePath =~ s/:$//;     # Strip off trailing ':'
+        $theItem =~ s/^:$//;    # Drop theItem == ':'
+        $pathDiv  = ":";        # Use Mac separator
+        }
+    else
+        {
+        $pathDiv = "/";         # Use Unix separator
+        }
+
+
+
+    # Return the path to the item
+    #
+    return($thePath . $pathDiv . $theItem);
+}
+
+
+
+# Some handy variables.
+$numfiles = 0;
+$numcontentfiles = 0;
+$numignoredfiles = 0;
+$numskippedfiles = 0;
+$numcpfiles = 0;
+$numdirfiles =0;
+
+use Getopt::Std;
+use File::Find;
+use File::Copy 'cp';
+
+# Current Working Dir.
+$pwd = `pwd`;
+chomp ($pwd);
+
+getopts('dt:c:o:fqhi:') || die "Invalid args, use $0 -h for help\n";
+
+# $opt_d is debug flag
+# $opt_t is template file. If not set, use standard template.
+# $opt_c is content directory. If not set, use standard content dir.
+# $opt_o is output dir, if not set, use standard output dir.
+# $opt_q sets quiet mode (no stdout output)
+# $opt_f sets a force flag - force generation even if output file is present
+#        and newer.
+# $opt_h runs usage and exits
+    
+# dair, build paths procedurally
+$opt_t ||= build_path("", "layout") . build_path("", "template.html");
+$opt_c ||= build_path("", "content");
+$opt_o ||= build_path("", "www");
+$opt_f ||= 0;
+$opt_d ||= 0;
+$opt_q ||= 0;
+$opt_h ||= 0;
+$opt_i ||= 'CVS|.*,v$';
+
+# dair, build paths procedurally
+$opt_t = build_path($pwd, $opt_t);
+$opt_c = build_path($pwd, $opt_c);
+$opt_o = build_path($pwd, $opt_o);
+
+
+if ($opt_h) { &usage; }
+
+if (!$opt_q) { 
+  print "Genpage, version $version starting run...\n";
+}
+
+if ($opt_d) { print "pwd = $pwd\n"; }
+
+#Swallow template file whole... 
+open( TEMPLATE, "<$opt_t" ) || die "Can\'t open template file $opt_t: $!\n";
+{ 
+local $/;
+undef $/;
+$template = <TEMPLATE>;
+close( TEMPLATE );
+}
+if (!$opt_q) {print "Using template file: $opt_t\n";}
+
+# Go through files in content dir and if it's a content file then 
+# process it otherwise, copy it (and it's dir structure) to the output dir.
+
+# if the output dir doesn't exist, create it.
+if (! -d $opt_o)
+{ 
+  mkdir $opt_o, 0755;
+  if (!$opt_q) 
+    {
+      print "Creating output directory: $opt_o\n"; 
+    }
+}
+
+if (!$opt_q) 
+  {
+    print "Processing files:\n"; 
+  }
+
+if (! -d $opt_c) { die "Can\'t open content dir\n" }
+
+find( \&process_file, $opt_c );
+
+if (!$opt_q) 
+  {
+    #numfiles reports one too many...
+    $numfiles--;
+    print "\nFinished.\n\n";
+    print "Run Summary.\n===========\n";
+    print "$numfiles total files and directories processed.\n";
+    print "$numcontentfiles content files parsed.\n";
+    print "$numskippedfiles content files skipped.\n"; 
+    print "$numcpfiles files copied.\n"; 
+    print "$numdirfiles directories created\n"; 
+    print "$numignoredfiles files or directories ignored.\n";
+  }
+
+exit;
+
+##############################################################################
+# Process_file the current file.
+##############################################################################
+sub process_file
+  {
+    if (!$opt_q) 
+      {
+	print "."; 
+      }
+
+    $numfiles++;
+    my $filename = $_;
+    my $dir = $File::Find::dir;
+    (undef,$reldir) = split( $opt_c, $dir);
+    if (!defined ($reldir) ) { $reldir = ""; }
+
+    # dair, build paths procedurally
+    $outdir  = build_path($opt_o,  $reldir);
+    $outfile = build_path($outdir, $filename);
+    $infile  = build_path($dir,    $filename);
+
+    # Ignore CVS stuff, ./ etc.
+    if ($infile =~ /$opt_i/) {
+      $numignoredfiles++;
+      return;
+    }
+
+    # Find returns ./ in each directory... avoid.
+
+    if ($infile =~ /\/.$/) {
+      return;
+    }
+    
+    # Ok, If the file is a dir, we create it (if necessary)
+    # if it's a content file, we parse it, otherwise, we
+    # copy it to the appropriate location.
+    
+    if ( -d $infile ) {
+      if ($opt_d) { print "Making dir $outfile\n"; };
+      mkdir $outfile, 0755 unless -d $outfile;
+      $numdirfiles++;
+      return;
+    }
+    
+    if ($filename =~ /^(.*)\.content$/) 
+      {
+
+    # dair, build paths procedurally
+    $outfile = build_path($outdir, "$1.html");
+
+	if ($opt_d) {print "Parsing: $infile\n Outputing to: $outfile\n";};
+	process_content($infile,$outfile);
+      }
+    else
+      {
+	if ($opt_d) { print "Copying: $infile => $outfile\n"; };
+	cp($infile,$outfile);
+	$numcpfiles++;
+      }
+    $_ = $filename; # because we broke it...
+  }
+
+##############################################################################
+# Process the tags in the template, substituting in the content file 
+# components and other things like inline function definitions and 
+# "include" directives
+##############################################################################
+ 
+sub process_content
+  {
+    
+    $inputfile = shift;
+    $outputfile = shift;
+    my @content = "";
+   
+    $temp = $template;
+
+    if ($opt_d) { print "processing $inputfile to $outputfile\n";}
+
+# Make-like check for last modification times to see if it's necessary
+# to re-gen this page.
+
+    if ( -f $outputfile) 
+      {
+	   
+	if (!$opt_f && ( -M $outputfile < -M $inputfile)) 
+	  {
+	    $numskippedfiles++;
+	    if ($opt_d) { 
+	      print "skipping $inputfile because $outputfile is newer\n";
+	    }
+	    return;
+	  }
+      }
+    # Read content file
+    open( CONTENT, "<$inputfile" ) || die $!;
+    @content = <CONTENT>;
+    close( CONTENT );
+
+    $numcontentfiles++;
+
+    undef %page;
+    undef $tag;
+    foreach $line ( @content )
+      {
+	if ( $line =~ /^\s*\%(.+)\%/ )
+	{
+	  $tag = $1;
+	  next;
+	}
+	next if !defined( $tag );
+	
+	 $line .= "\n" if $line !~ /\n$/;
+	
+	if ( defined( $page{ $tag } ))
+	  {
+	    $page{ $tag } .= $line;
+	  }
+	else
+	  {
+	    $page{ $tag } = $line;
+	  }
+      }
+    
+    open( HTML, ">$outputfile" ) || die $1;
+    
+    while ($temp =~ /^(.*?)<!--\s*_GP_\s*(.*?)\s*-->(.*)$/s)
+      {
+	local $replacement = "";
+	my ($left, $middle, $right) = ($1, $2, $3);
+        if (!defined($replacement = eval ($middle))) 
+	  { 
+	    $replacement = "";
+	  }
+	
+	if ($@) {
+          $middle =~ s/\s+/ /g;
+          print STDERR "error evaluating { $middle }: $@\n";
+        }
+        else {
+          if ($opt_d) {
+	    print "evaluation output: $replacement\n";
+	  }
+        }
+	
+	$temp = $left . $replacement . $right;
+      }
+    print HTML $temp;
+    close( HTML );
+  }
+
+
+sub include
+  {
+    my ($file) = shift;
+    my ($section) = shift;
+
+    if ($opt_d) { 
+      print "include: file = $file\n"; 
+    }
+    if (!open( INCLUDE, "<$file" )) { 
+      return "<!-- include: file not found: $file -->";
+    }
+    
+    if (defined($section)) {
+    undef %incpage;
+    undef $inctag;
+
+      @content = <INCLUDE>;
+      close (INCLUDE);
+
+      foreach $line ( @content )
+	{
+	  if ( $line =~ /^\s*\%(.+)\%/ )
+	    {
+	      $inctag = $1; 
+	      next;
+	    }
+	  next if !defined( $inctag );
+	  $line .= "\n" if $line !~ /\n$/;
+
+	  if ( defined( $incpage{ $inctag } ))
+	    {
+	      $incpage{ $inctag } .= $line;
+	    }
+	  else
+	    {
+	      $incpage{ $inctag } = $line;
+	    }
+	}
+      if (defined( $incpage{$section}) ) {
+	$inline = $incpage{$section};
+      }
+      else {
+	$inline = "<!-- include: no such section - $section - in $file -->";  
+      }
+    } 
+    else
+      {	
+	local $/;
+	undef $/;
+	$inline = <INCLUDE>;
+	close( INCLUDE );
+      }
+    return "$inline";
+  }
+
+sub content
+  {
+    my $tag = shift;
+
+    if ($opt_d) { print "content: tag = $tag\n"; }
+    if (defined( $page{ $tag } ))
+      {      
+	$output = $page { $tag };
+	if ($opt_d) { print "content: output = $output\n"; }
+	return "$output";
+      }
+    else
+      {
+	return "<!-- content: undefined tag: $tag -->";
+      }
+  }
+
+sub version
+  {
+    return ( "<a href=\"http://www.mnemonic.org/genpage/\">Genpage</a> - Version: $version" );
+  }
+
+sub usage
+  {
+    print <<EOT;
+usage: genpage [-dqfh] [-c <content dir>] [-o <output dir>] 
+               [-t <template file>] [ -i <ignore regexp> ]
+
+
+       -d debug mode.     Turn on debugging (very verbose!)
+       -q quiet mode.     Don't print anything while running.
+       -f force mode.     Force the parsing of content files.
+       -h help.           Print this help text.
+       -c <content dir>   The directory where your content tree exists.
+                          Defaults to ./content.
+       -o <output dir>    The directory to put the output website.
+                          Defaults to ./www
+       -t <template file> The template to use to generate the site.
+                          Defaults to ./layout/template.html
+       -i <ignore regexp> Regular expression telling genpage to ignore certain
+                          files or directories. defaults to "CVS|.*,v$"
+
+       Genpage $version Copyright (C) Joe Vaughan <joev\@mnemonic.org> 1999
+       This program is released under the terms of the GNU Public License
+       Please read the accompanying COPYING file for details.
+
+       For detailed instructions on how to use Genpage, please consult the 
+       accompanying documentation. If you have questions, comments or 
+       suggestions for Genpage please contact the author.
+EOT
+exit;
+}