Blame local/html-add-header-footer.pl

Packit fcad23
#!/usr/bin/perl -w
Packit fcad23
##############################################################################
Packit fcad23
#
Packit fcad23
# Alex Burger - Oct 28th, 2004
Packit fcad23
#
Packit fcad23
# Purpose:  Modify .html files to add a header and footer for use
Packit fcad23
#           on the Net-SNMP web site.
Packit fcad23
#
Packit fcad23
#           Can also be used to change the 'section' variable
Packit fcad23
#           for use in the menu system.
Packit fcad23
#
Packit fcad23
# Notes:    A backup of each file is made to *.old.
Packit fcad23
#
Packit fcad23
#           Any DOS newlines are removed from the destination file.
Packit fcad23
#
Packit fcad23
#           Permissions are maintained.
Packit fcad23
#
Packit fcad23
##############################################################################
Packit fcad23
#
Packit fcad23
use File::Copy;
Packit fcad23
use File::stat;
Packit fcad23
use Getopt::Long;
Packit fcad23
Packit fcad23
my $tidy_options = '-f /dev/null -m -i -asxhtml -wrap 130 -quiet --quote-nbsp n';
Packit fcad23
Packit fcad23
my $pattern = '';
Packit fcad23
my $section = '';
Packit fcad23
my $tidy = 0;
Packit fcad23
my $body = 0;
Packit fcad23
my $help = 0;
Packit fcad23
my @files = ();
Packit fcad23
Packit fcad23
GetOptions 	('pattern=s' => \$pattern, 
Packit fcad23
		'section=s' => \$section,
Packit fcad23
		'tidy' => \$tidy,
Packit fcad23
		'body' => \$body,
Packit fcad23
		'help' => \$help);  
Packit fcad23
Packit fcad23
if ($help == 1)
Packit fcad23
{
Packit fcad23
$USAGE = qq/
Packit fcad23
Usage:
Packit fcad23
    add-header-footer [<options>] file1 file2 file3 ...
Packit fcad23
Options:
Packit fcad23
    --section=       Menu section
Packit fcad23
    --tidy           Run tidy on input file before processing (turns on --body)
Packit fcad23
    --body           Remove everything before <body> and after <\/body>
Packit fcad23
    --help           Display this message
Packit fcad23
    
Packit fcad23
Examples:
Packit fcad23
Packit fcad23
    add-header-footer.pl --section=tutorial --body cat.html dog.html mouse.html
Packit fcad23
    
Packit fcad23
    find . -name '*.html' | add-header-footer.pl --section=tutorial --body
Packit fcad23
    
Packit fcad23
/;
Packit fcad23
  print $USAGE;
Packit fcad23
  exit 0;
Packit fcad23
}
Packit fcad23
             
Packit fcad23
if ($ARGV[0]) {
Packit fcad23
  # Files listed on command line
Packit fcad23
  foreach my $arg (@ARGV) {
Packit fcad23
    chomp $arg;
Packit fcad23
    push @files, $arg;
Packit fcad23
    #print "$arg\n";
Packit fcad23
  }
Packit fcad23
}
Packit fcad23
else {
Packit fcad23
  # No arguments, so accept STDIN
Packit fcad23
  while (<STDIN>) {
Packit fcad23
    chomp;
Packit fcad23
    push @files, $_;
Packit fcad23
    #print "$_\n";
Packit fcad23
  }
Packit fcad23
}
Packit fcad23
Packit fcad23
if (! (@files) ) {
Packit fcad23
  exit 0;
Packit fcad23
}
Packit fcad23
Packit fcad23
#print "@files";
Packit fcad23
Packit fcad23
foreach my $file (@files) {
Packit fcad23
  chomp $file;
Packit fcad23
  print "Processing file: $file\n";
Packit fcad23
Packit fcad23
  # Grab current permissions
Packit fcad23
  my $sb = stat($file);
Packit fcad23
  my $stat_permissions = sprintf ("%04o", $sb->mode & 07777);
Packit fcad23
  my $stat_uid = $sb->uid;
Packit fcad23
  my $stat_gid = $sb->gid;
Packit fcad23
  
Packit fcad23
  my @old_file = ();
Packit fcad23
  my @new_file = ();
Packit fcad23
Packit fcad23
  my $body_count = 0;
Packit fcad23
Packit fcad23
  # Backup old file
Packit fcad23
  if (! (copy ("$file", "$file.old"))) {
Packit fcad23
    print "Could not backup existing file $file to $file.new.  Aborting.\n";
Packit fcad23
    next;
Packit fcad23
  }
Packit fcad23
  # Set permissions on old file to match original file
Packit fcad23
  chmod oct($stat_permissions), "$file.old";
Packit fcad23
  chown $stat_uid, $stat_uid, "$file.old";
Packit fcad23
Packit fcad23
Packit fcad23
  if ($tidy == 1) {
Packit fcad23
    $body = 1;          # Enable body, as tidy will add it in.
Packit fcad23
    my $tidy_command = "tidy $tidy_options $file";
Packit fcad23
    `$tidy_command`;
Packit fcad23
  }
Packit fcad23
   
Packit fcad23
  if (open (I, "<$file")) {
Packit fcad23
    # Load entire file
Packit fcad23
    while () {
Packit fcad23
      s/\015//g;          # Remove any DOS newlines
Packit fcad23
      chomp;
Packit fcad23
      push (@old_file, $_);
Packit fcad23
    }
Packit fcad23
  }
Packit fcad23
  else {
Packit fcad23
    print "Could not open file $file.  Aborting\n";
Packit fcad23
    next;
Packit fcad23
  }
Packit fcad23
Packit fcad23
  if (!@old_file) {
Packit fcad23
    print "Empty file.  Skipping\n";
Packit fcad23
    next;
Packit fcad23
  }
Packit fcad23
Packit fcad23
  # Remove empty lines at start
Packit fcad23
  while (1) {
Packit fcad23
    if ($old_file[0] eq "") {
Packit fcad23
      splice (@old_file, 0, 1);
Packit fcad23
    }
Packit fcad23
    else {
Packit fcad23
      last;
Packit fcad23
    }
Packit fcad23
  }
Packit fcad23
Packit fcad23
  # Remove empty lines at end
Packit fcad23
  while (1) {
Packit fcad23
    if ($old_file[$#old_file] eq "") {
Packit fcad23
      splice (@old_file, -1, 1);
Packit fcad23
    }
Packit fcad23
    else {
Packit fcad23
      last;
Packit fcad23
    }
Packit fcad23
  }
Packit fcad23
  
Packit fcad23
  if ($body == 1) {
Packit fcad23
    # Count the number of 
Packit fcad23
    for (my $i = 0; $i <= $#old_file; $i++) {
Packit fcad23
      if ($old_file[$i] =~ /
Packit fcad23
        $body_count++;
Packit fcad23
        next;
Packit fcad23
      }
Packit fcad23
    }
Packit fcad23
  
Packit fcad23
    # Remove anything before and including 
Packit fcad23
    while ($body_count > 0) {
Packit fcad23
      while (! ($old_file[0] =~ /
Packit fcad23
        splice (@old_file, 0, 1);
Packit fcad23
      }
Packit fcad23
      splice (@old_file, 0, 1);   # 
Packit fcad23
      $body_count--;
Packit fcad23
    }
Packit fcad23
  }
Packit fcad23
Packit fcad23
  # Start to build new file in memory with header
Packit fcad23
  push (@new_file, "\n");
Packit fcad23
  push (@new_file, '' . "\n");
Packit fcad23
  push (@new_file, '' . "\n");
Packit fcad23
Packit fcad23
  # Add in old file, skipping existing header and footer and stopping at <body/>
Packit fcad23
  for (my $i = 0; $i <= $#old_file; $i++) {
Packit fcad23
    if (!(defined($old_file[$i]))) { next; }
Packit fcad23
    if ($body == 1 && ($old_file[$i] =~ /<\/body>/)) { last; }  
Packit fcad23
    elsif ($old_file[$i] =~ /
Packit fcad23
    elsif ($old_file[$i] =~ //) { next; }
Packit fcad23
    elsif ($old_file[$i] =~ //) { next; }
Packit fcad23
    elsif ($old_file[$i] =~ //) { next; }
Packit fcad23
    elsif ($old_file[$i] =~ //) { next; }
Packit fcad23
    
Packit fcad23
    push (@new_file, $old_file[$i] . "\n");
Packit fcad23
  }
Packit fcad23
Packit fcad23
  # Finish to building new file in memory with footer
Packit fcad23
  push (@new_file, '' . "\n");
Packit fcad23
  push (@new_file, '' . "\n");
Packit fcad23
   
Packit fcad23
  # Save new file  
Packit fcad23
  if (open (O, ">$file")) {
Packit fcad23
    for (my $i = 0; $i <= $#new_file; $i++) {
Packit fcad23
      print O "$new_file[$i]";
Packit fcad23
    }
Packit fcad23
    print O "\n";
Packit fcad23
    close O;
Packit fcad23
    
Packit fcad23
    # Set permissions
Packit fcad23
    chmod oct($stat_permissions), $file;
Packit fcad23
    chown $stat_uid, $stat_uid, $file;
Packit fcad23
  }
Packit fcad23
  else {
Packit fcad23
    print "Could not create new file: $file.new\n"
Packit fcad23
  }
Packit fcad23
  close I;
Packit fcad23
}
Packit fcad23
Packit fcad23