#!/usr/bin/perl -w # log2blog: translate LOG file into weblog entries. my $rcsid = '$Id: log2blog,v 1.1 2006/05/21 23:37:11 vogelke Exp $'; use Getopt::Long; use Pod::Usage; use File::Basename; use Regexp::Common qw /URI/; use Time::ParseDate; use Carp; use strict; use diagnostics; use subs qw/prep usage version/; $ENV{'PATH'} = join ":", qw(/bin /usr/bin /usr/local/bin); my $myname = basename($0); $myname =~ s/\.\w*$//; # strip any extension # # Command-line options. # my %options; my @getopt_args = ( 'h|?', # print usage 'm', # print manpage 'v', # print version 'u=s', # output format ); Getopt::Long::config("noignorecase", "bundling"); usage() unless GetOptions(\%options, @getopt_args); manpage() if $options{'m'}; version() if $options{'v'}; usage() if $options{'h'} || !@ARGV; # # Real work starts here. # my $preformat = 0; # found a
 line?
my $wasdated = 0;    # was the previous line a dated entry?
my $ofh = undef;     # output filehandle.
my $date = '';       # from each dated entry.
my $title = '';      # from each dated entry.

TOP: while (<>) {
    chomp;

    # ignore section header
    /^BEGINNING OF LOG FOR\s+(.*)\s+==*$/ and do {
        next TOP;
    };

    # begin dated entry
    /^[0-9A-Z]/ and do {
        if (defined($ofh)) {
	    close($ofh);
	}
	($date, $title) = split(/\t/);
        my $d = parsedate($date);
	die "$date: can't parse\n" unless $d;

	open ($ofh, "> $d.txt") or die "$d.txt: can't write: $!\n";
	print $ofh "$title\n";
        $wasdated = 1;
        next TOP;
    };

    # preformatted section; leave it alone except
    # for command line prompts "me%" and "root#".

    /---------S$/ and do {
        print $ofh "
\n";
        while (<>) {
            chomp;
            $_ = prep ($_);
            s!^    !!;
            s!me\%!me%!;
            s!user\%!user%!;
            s!root#!root#!;

            last if /---------E$/;
            print $ofh "$_\n";
        }
        print $ofh "
\n"; $wasdated = 0; next TOP; }; /^$/ and do { print $ofh "\n" unless $wasdated; next TOP; }; # 2 spaces after periods. $wasdated = 0; $_ = prep ($_); s!^\s*!!g; s!\. !.\ \ !g; print $ofh "$_\n"; } if (defined($ofh)) { close($ofh); } exit (0); #--------------------------------------------------------------------- # Print a usage message from the comment header and exit. sub usage { my ($emsg) = @_; require Pod::Usage; import Pod::Usage qw(pod2usage); warn "$emsg\n" if defined $emsg; pod2usage(-verbose => 1); } sub manpage { require Pod::Usage; import Pod::Usage qw(pod2usage); pod2usage(-exitstatus => 0, -verbose => 2); } #--------------------------------------------------------------------- # Print the current version and exit. sub version { $_ = $rcsid; s/,v / /; @_ = split; print "$myname v$_[2] $_[3] $_[4]\n"; exit(0); } #--------------------------------------------------------------------- # Prepare string by expanding tabs, etc. sub prep { local($_) = shift; 1 while s/\t+/' ' x (length($&) * 5 - length($`) % 5)/e; # Special characters? s!\&!\&!g; s!!\>!g; # Test for lines containing only URIs. my $addbr = 0; /^\s*$RE{URI}{HTTP}\s*$/ and $addbr = 1; # URIs? # FIXME: use common regexes for this? s#\[URL:(.*)\]#$1#g; # embedded URL s#(http://\S+)#$1#g; s#(https://\S+)#$1#g; s#(ftp://\S+)#$1#g; # Add breaks after lines containing only URIs. $addbr and $_ = "
$_
"; return $_; } #--------------------------------------------------------------------- __END__ =head1 NAME log2blog - translate LOG file into weblog entries. =head1 SYNOPSIS log2blog [-hmv] logfile =head1 OPTIONS =over 4 =item B<-h> Print a brief help message and exit. =item B<-m> Print the manual page and exit. =item B<-v> Prints the version and exits. =back =head1 DESCRIPTION B will read the LOGfile and write a series of separate Bloxsom-style log entries in the current directory. Each entry will be named using the Unix epoch time, with a .txt extension. =head1 AUTHOR Karl Vogel Sumaria Systems, Inc. =cut