#!/usr/bin/perl -w # log2art: translate LOG file into weblog entries. my $rcsid = '$Id: log2art,v 1.3 2007/10/16 19:12:27 vogelke Exp $'; use Getopt::Long; use Pod::Usage; use File::Basename; use Regexp::Common qw /URI/; 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 $date = ''; # from each dated entry. my $section = ''; # from each dated entry. my $flgtitle = 0; # FIXME: read this stuff somewhere. my $fullname = "Karl Vogel"; my $email = "vogelke\@pobox.com"; TOP: while (<>) { chomp; # save beginning as title /^BEGINNING OF LOG FOR\s+(.*)\s+==*$/ and do { prtitle($1, $fullname); $flgtitle = 1; next TOP; }; # begin dated entry; optional tab means skip date # multiple spaces means kill everything but date /^[0-9A-Z]/ and do { die "No title found" unless $flgtitle; if (/\t/) { ($date, $section) = split(/\t/); } elsif (/(.*?) /) { $section = $1; } else { $section = $_; } print "== $section ==\n"; next TOP; }; # preformatted text; leave it alone except # for command line prompts "me%" and "root#". /---------S$/ and do { die "No title found" unless $flgtitle; print "```\n"; while (<>) { chomp; $_ = prep ($_); s!^ !!; last if /---------E$/; print "$_\n"; } print "```\n"; next TOP; }; /^$/ and do { die "No title found" unless $flgtitle; print "\n"; next TOP; }; # Handle URIs, etc. $_ = prep ($_); print "$_\n"; } prfooter($email); exit (0); #--------------------------------------------------------------------- # Print title. sub prtitle { my ($title, $name) = @_; print <<"EndTitle"; $title $name \%\%mtime(\%a, \%d \%b \%Y \%T) = Introduction = Your intro goes here. EndTitle } #--------------------------------------------------------------------- # Print footer. sub prfooter { my ($email) = @_; my $rev = '//$' . 'Revision: 1.1 $' . '//'; print <<"EndFooter"; = Feedback = Feel free to send [comments mailto:$email]. ----------------------- //Generated from [\%\%infile \%\%infile] by// //[txt2tags http://txt2tags.sourceforge.net]//{br} $rev EndFooter } #--------------------------------------------------------------------- # 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; # no leading spaces needed. s!^\s*!!g; return $_; } #--------------------------------------------------------------------- __END__ =head1 NAME log2art - translate LOG file into a txt2tags-style article =head1 SYNOPSIS log2art [-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 Bwill read the LOGfile and write the contents to stdout in txt2tags format. The first line will be used for the title, each date-line will be written as an H2 header entry, and preformatted text will be preserved. Manual touchup will almost certainly be needed. =head1 AUTHOR Karl Vogel Sumaria Systems, Inc. =cut