You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

366 lines
7.9 KiB
Perl

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

#!/usr/local/bin/perl
#
# whatsnew.pl v1.1 (C) 1996 Iain Lea
# modified 26 Oct 1998 (c) 1998 Jacques Reynes
#
# ChangeLog
# 960321 IL Reversed sorting to show newest documents first
# 981026 JR Modified to work with Berkeley DB2.
# 980204 GRH Modified to work with changes in ht://Dig db format
#
# Produces a HTML 'Whats New' page with custom header and footer.
#
# Title
# Descriptions
# URL
# Last modification date (in ctime format)
#
# The date is specified as yyyymmdd
#
# Usage: whatsnew.pl [options]
# -h help
# -d date base date [default: $DefDate]
# -n days list documents newer than days old [default: $DefDays]
# -f file database index [default: $DefIndex]
# -F file HTML footer
# -H file HTML header
# -o file HTML generated file
# -v verbose
use BerkeleyDB;
require 'timelocal.pl';
require 'getopts.pl';
$DefIndex = ' your data base .docdb';
$DefOutputFile = ' your result file URL created in your web server whatsnew.html';
$TmpFile = "/tmp/whatsnew.$$";
$DefFooter = '';
$DefHeader = '';
$Verbose = 0;
$NewNum = 0;
$DefDays = 3;
chop (($DefDate = '19'.`date +%y%m%d`));
&ParseCmdLine;
$DefDate =~ /([0-9]{4})([0-9]{2})([0-9]{2})/;
$When = timelocal (0, 0, 0, $3, $2 - 1, $1 - 1900)- ($DefDays * 86400);
$NewDate = localtime ($When);
$dbfile = $DefIndex;
print "Generating 'Whats New' for documents newer than '$NewDate'...\n" if $Verbose;
&ReadDatabase ($DefIndex, $TmpFile);
&WriteWhatsNew ($TmpFile, $DefOutputFile, $DefHeader, $DefFooter);
exit 1;
#############################################################################
# Subroutines
#
sub ParseCmdLine
{
&Getopts ('d:f:F:hH:n:o:v');
if ($opt_h ne "") {
print <<EndOfHelp
Produce an HTML 'Whats New' page with custom header & footer for database.
Usage: $0 [options]
-h help
-d date base date [default: $DefDate]
-n days list documents newer than days old [default: $DefDays]
-f file database index [default: $DefIndex]
-F file HTML footer
-H file HTML header
-o file HTML generated file
-v verbose
EndOfHelp
;
exit 0;
}
$DefDate = $opt_d if ($opt_d ne "");
$DefDays = $opt_n if ($opt_n ne "");
$DefIndex = $opt_f if ($opt_f ne "");
$DefFooter = $opt_F if ($opt_H ne "");
$DefHeader = $opt_H if ($opt_H ne "");
$DefOutputFile = $opt_o if ($opt_o ne "");
$Verbose = 1 if ($opt_v ne "");
}
sub ReadDatabase
{
my ($Index, $TmpFile) = @_;
tie %docdb, 'BerkeleyDB::Btree', -Filename => $Index, -Flags => DB_RDONLY || die "Error: $Index - $!";
open (TMP, ">$TmpFile") || die "Error: $TmpFile - $!\n";
while (($key, $value) = each %docdb)
{
next if $key =~ /^nextDocID/;
%rec = parse_ref_record ($value);
if ($rec{'TIME'} >= $When)
{
$Line = "$rec{'TIME'}|$rec{'URL'}|$rec{'TITLE'}|$rec{'DESCRIPTIONS'}\n";
print $Line if $Verbose;
print TMP $Line;
$NewNum++;
}
}
close (TMP);
}
sub WriteWhatsNew
{
my ($InFile, $OutFile, $Header, $Footer) = @_;
open (URLS, "sort -r $InFile |") || die "Error: $InFile - $!\n";
open (HTML, ">$OutFile") || die "Error: $OutFile - $!\n";
&PrintBoilerPlate ($Header, 1);
while (<URLS>) {
chop;
($Time, $URL, $Title, $Description) = split ('\|');
$Ctime = localtime ($Time);
if ($Verbose) {
print <<EOT
Title: $Title
Description: $Description
URL: $URL
Modified: $Ctime
EOT
;
}
print HTML <<EOT
<strong>Title:</strong> <a href="$URL">$Title</a>
<strong>Description:</strong> $Description
<strong>URL:</strong> $URL
<strong>Modified:</strong> $Ctime
EOT
;
}
&PrintBoilerPlate ($Footer, 0);
close (HTML);
close (URLS);
unlink ($InFile);
}
sub PrintBoilerPlate
{
my ($File, $IsHeader) = @_;
if ($File ne "" && -e $File) {
open (FILE, $File) || die "Error: $File - $!\n";
while (<FILE>) {
print HTML;
}
close (FILE);
} else {
if ($IsHeader) {
print HTML <<EOT
<html>
<head>
<title>Whats New!</title>
</head>
<body>
<h2>Whats New!</h2>
<center>
<a href="/whatsnew.html"><img src="/new.gif"></a>
<a href="/"><img src="/home.gif"></a>
<a href="/intranet.html"><img src="/search.gif"></a>
<a href="mailto:Iain.Lea\@sbs.de"><img src="/contact.gif"></a>
</center>
<hr>
<strong>Found $NewNum documents newer than '$NewDate'</strong>
<pre>
EOT
;
} else {
print HTML <<EOT
</pre>
<hr>
<center>
<a href="/whatsnew.html"><img src="/new.gif"></a>
<a href="/"><img src="/home.gif"></a>
<a href="/intranet.html"><img src="/search.gif"></a>
<a href="mailto:Iain.Lea\@sbs.de"><img src="/contact.gif"></a>
</center>
</body>
</html>
EOT
;
}
}
}
sub parse_ref_record
{
local($value) = @_;
local(%rec, $length, $count, $result);
while (length($value) > 0)
{
$what = unpack("C", $value);
$value = substr($value, 1);
if ($what == 0)
{
# ID
$rec{"ID"} = unpack("i", $value);
$value = substr($value, 4);
}
elsif ($what == 1)
{
# TIME
$rec{"TIME"} = unpack("i", $value);
$value = substr($value, 4);
}
elsif ($what == 2)
{
# ACCESSED
$rec{"ACCESSED"} = unpack("i", $value);
$value = substr($value, 4);
}
elsif ($what == 3)
{
# STATE
$rec{"STATE"} = unpack("i", $value);
$value = substr($value, 4);
}
elsif ($what == 4)
{
# SIZE
$rec{"SIZE"} = unpack("i", $value);
$value = substr($value, 4);
}
elsif ($what == 5)
{
# LINKS
$rec{"LINKS"} = unpack("i", $value);
$value = substr($value, 4);
}
elsif ($what == 6)
{
# IMAGESIZE
$rec{"IMAGESIZE"} = unpack("i", $value);
$value = substr($value, 4);
}
elsif ($what == 7)
{
# HOPCOUNT
$rec{"HOPCOUNT"} = unpack("i", $value);
$value = substr($value, 4);
}
elsif ($what == 8)
{
# URL
$length = unpack("i", $value);
$rec{"URL"} = unpack("x4 A$length", $value);
$value = substr($value, 4 + $length);
}
elsif ($what == 9)
{
# HEAD
$length = unpack("i", $value);
$rec{"HEAD"} = unpack("x4 A$length", $value);
$value = substr($value, 4 + $length);
}
elsif ($what == 10)
{
# TITLE
$length = unpack("i", $value);
$rec{"TITLE"} = unpack("x4 A$length", $value);
$value = substr($value, 4 + $length);
}
elsif ($what == 11)
{
# DESCRIPTIONS
$count = unpack("i", $value);
$value = substr($value, 4);
$result = "";
foreach (1 .. $count)
{
$length = unpack("i", $value);
$result = $result . unpack("x4 A$length", $value) . "";
$value = substr($value, 4 + $length);
}
chop $result;
$rec{"DESCRIPTIONS"} = $result;
}
elsif ($what == 12)
{
# ANCHORS
$count = unpack("i", $value);
$value = substr($value, 4);
$result = "";
foreach (1 .. $count)
{
$length = unpack("i", $value);
$result = $result . unpack("x4 A$length", $value) . "";
$value = substr($value, 4 + $length);
}
chop $result;
$rec{"ANCHORS"} = $result;
}
elsif ($what == 13)
{
# EMAIL
$length = unpack("i", $value);
$rec{"EMAIL"} = unpack("x4 A$length", $value);
$value = substr($value, 4 + $length);
}
elsif ($what == 14)
{
# NOTIFICATION
$length = unpack("i", $value);
$rec{"NOTIFICATION"} = unpack("x4 A$length", $value);
$value = substr($value, 4 + $length);
}
elsif ($what == 15)
{
# SUBJECT
$length = unpack("i", $value);
$rec{"SUBJECT"} = unpack("x4 A$length", $value);
$value = substr($value, 4 + $length);
}
elsif ($what == 16)
{
# STRING (ignore, but unpack)
$length = unpack("i", $value);
$rec{"STRING"} = unpack("x4 A$length", $value);
$value = substr($value, 4 + $length);
}
elsif ($what == 17)
{
# METADSC
$length = unpack("i", $value);
$rec{"METADSC"} = unpack("x4 A$length", $value);
$value = substr($value, 4 + $length);
}
elsif ($what == 18)
{
# BACKLINKS
$rec{"BACKLINKS"} = unpack("i", $value);
$value = substr($value, 4);
}
elsif ($what == 19)
{
# SIGNATURE
$rec{"SIG"} = unpack("i", $value);
$value = substr($value, 4);
}
}
return %rec;
}