blob: c3cb902074399707b350a5cb2bfd4f368985f48d [file] [log] [blame]
#!/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;
}