diff options
Diffstat (limited to 'local/html-add-header-footer.pl')
-rwxr-xr-x | local/html-add-header-footer.pl | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/local/html-add-header-footer.pl b/local/html-add-header-footer.pl new file mode 100755 index 0000000..c3cb902 --- /dev/null +++ b/local/html-add-header-footer.pl @@ -0,0 +1,212 @@ +#!/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 --quote-nbsp n'; + +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 [<options>] file1 file2 file3 ... +Options: + --section= Menu section + --tidy Run tidy on input file before processing (turns on --body) + --body Remove everything before <body> 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 (<STDIN>) { + 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 (<I>) { + 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 <body lines + for (my $i = 0; $i <= $#old_file; $i++) { + if ($old_file[$i] =~ /<body/) { + $body_count++; + next; + } + } + + # Remove anything before and including <body + while ($body_count > 0) { + while (! ($old_file[0] =~ /<body/)) { + splice (@old_file, 0, 1); + } + splice (@old_file, 0, 1); # <body line + $body_count--; + } + } + + # Start to build new file in memory with header + push (@new_file, "<!--#set var=\"section\" value=\"$section\" -->\n"); + push (@new_file, '<!--#include virtual="/page-top.html" -->' . "\n"); + push (@new_file, '<!-- CONTENT START -->' . "\n"); + + # Add in old file, skipping existing header and footer and stopping at <body/> + 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] =~ /<!--#set var="section" value=/) { next; } + elsif ($old_file[$i] =~ /<!--#include virtual="\/page-top.html" -->/) { next; } + elsif ($old_file[$i] =~ /<!-- CONTENT START -->/) { next; } + elsif ($old_file[$i] =~ /<!-- CONTENT END -->/) { next; } + elsif ($old_file[$i] =~ /<!--#include virtual="\/page-bottom.html" -->/) { next; } + + push (@new_file, $old_file[$i] . "\n"); + } + + # Finish to building new file in memory with footer + push (@new_file, '<!-- CONTENT END -->' . "\n"); + push (@new_file, '<!--#include virtual="/page-bottom.html" -->' . "\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; +} + + |