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