A few people asked me for the Stefan Hornburg's script. I lost the names.
Duh --> me. So, I'm just forwarding it to the list. Hope no one minds.
Cut and Copy it somewhere ( I use /usr/local/bin) and add this line to
your .procmailrc:
: 0
* ^To:.freshmeat-news
| splitfmnews | formail -ds cat >> $HOME/mail/freshmeat
( remember to make it executable. )
---------- Forwarded message ----------
Date: 13 Jan 1999 19:50:17 +0100
From: Stefan Hornburg <[EMAIL PROTECTED]>
To: [EMAIL PROTECTED]
Subject: Re: splitfmnews
Hello !
Yes, I noticed the format change too, but I hadn't the time to adapt the
script (I'm programming a Webshop as hired programmer and designing a
Website for my one simultaneously). Furthermore, there was no feedback
on my script, so I assumed that no one used it. Anyway, below is the
new version.
#! /usr/bin/perl -w
#
# splitfmnews -- Perl script that slices Freshmeat newsletters
#
# Copyright (C) 1998, 1999 Stefan Hornburg
#
# Author: Stefan Hornburg <[EMAIL PROTECTED]>
# Maintainer: Stefan Hornburg <[EMAIL PROTECTED]>
# Version: 0.2.0
#
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2, or (at your option) any
# later version.
#
# This file is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this file; see the file COPYING. If not, write to the Free
# Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
#
# CHANGES
# Wed Jan 13 18:43:50 1999 Stefan Hornburg <[EMAIL PROTECTED]>
# * splitfmnews v0.2.0 released
# * adapted to new freshmeat format
# Thu Jul 2 15:36:28 1998 Stefan Hornburg <[EMAIL PROTECTED]>
# * splitfmnews v0.1.2 released
# * treat the equal sign as line continuation character
# Thu Jul 2 14:39:25 1998 Stefan Hornburg <[EMAIL PROTECTED]>
# * splitfmnews v0.1.1 released
# * pass original message only if necessary
# Thu Jul 2 12:56:01 1998 Stefan Hornburg <[EMAIL PROTECTED]>
# * splitfmnews v0.1 released
use strict;
require 5.002; # prototypes
# CONSTANTS
# Summary header and footer
my $sumheader = '[ article list ]';
my $sumfooter = '[ article details ]';
my $articlefooter = "that's it for today.";
# Separator between entries in the newsletter
my $sep = '--- - --- ------ - --- -- - - - -- -';
# STATE VARIABLES
# Line with subject found ?
my $subjectline;
# Number of first line within entry
my $firstline;
# Header of the mail
my ($header_before, $header_subject, $header_after);
# Text of current entry
my $entrytext;
# Hash with entries
my %entries;
# Body of the mail
my $contents;
# Errors
my @errors;
# Main program
# ============
# Record mail header
while (fetchline()) {
if (/^subject:\s+(.*?)\s*$/i) {
if (defined $header_subject) {
fault ("input line $.",
"duplicate subject found in the mailheader");
} else {
$header_subject = $1;
}
} else {
if (defined $header_subject) {
$header_after .= $_;
} else {
$header_before .= $_;
}
}
last if ! /\S/;
}
unless (defined $header_subject) {
fault ("no subject found in the mailheader");
}
# Skip to summary
while (fetchline()) {
$contents .= $_;
last if issepline ($sumheader);
}
# Fetch entry subjects from summary
while (fetchline()) {
$contents .= $_;
last if issepline ($sumfooter);
# skip blank lines
next if ! /\S/;
# check format
if (/^\s*o\s*(.*?)\s*$/) {
$entries{$1} = undef;
} else {
chomp;
fault ("input line $.",
"unexpected format (summary line assumed, found: $_)");
}
}
# Read entries
$firstline = $. + 1;
while (fetchline()) {
$contents .= $_;
# Check for new entries
if (issepline ($sep)) {
if (defined $subjectline) {
# Entry mentioned in summary ?
if (exists $entries{$subjectline}) {
$entrytext =~ s/^\s*//; $entrytext =~ s/\s*$//;
$entries{$subjectline} = $entrytext;
} else {
fault ($subjectline, "entry not mentioned in the
summary");
}
undef $subjectline;
} else {
fault ("input lines $firstline - $.", "invalid entry");
}
# Reset entry-local variables
$firstline = $. + 1;
undef $entrytext;
next;
}
# Check for subject lines
if (/^\s*subject:\s*(.*?)\s*$/) {
$subjectline = $1;
} else {
$entrytext .= $_;
}
# Check for end of mail
last if issepline ($articlefooter);
}
# Check for unresolved entries ...
if (defined $subjectline) {
fault ($subjectline, "incomplete entry detected");
}
# .. and create mails
my ($key, $value);
while (($key, $value) = each %entries) {
if (defined $value) {
print $header_before, "Subject: $key\n", $header_after, $value, "\n\n";
} else {
fault ($key, "entry appears only in the summary");
}
}
# create error message and pass through original message in case of errors
if ($#errors >= 0) {
print $header_before, "Subject: Error log for $header_subject\n",
$header_after, join ("\n", @errors), "\n\n";
print $header_before, "Subject: Erroneous $header_subject\n",
$header_after, $contents;
}
exit ($#errors != -1);
# ----------------------------------------------------
# FUNCTION: fetchline
#
# Gets one line from standard input. Concatenate lines
# terminating with a equal sign with the next line.
# ----------------------------------------------------
sub fetchline () {
my $line = ''; my $terminator;
while (<>) {
chomp;
if (($terminator = chop) eq '=') {
$line .= $_;
} else {
$line .= "$_$terminator\n";
last;
}
}
$_ = $line;
}
# ----------------------------------------------------------
# FUNCTION: issepline SEP
#
# Checks if the current line is a separator between entries.
# Trims first input line and compares than with SEP.
# ----------------------------------------------------------
sub issepline ($) {
my $sep = shift;
my $line = $_;
$line =~ s/^\s*//; $line =~ s/\s*$//;
$line eq $sep;
}
# ------------------------------------------------------
# FUNCTION: fault ARG ...
#
# Issues error message composed of the arguments and the
# script name, concatenated by the string `: '.
# ------------------------------------------------------
sub fault ($@) {
my $msg = join (': ', @_);
push (@errors, $msg);
print STDERR $0, ': ', $msg, "\n";
}
# Local Variables:
# mode: perl
# End:
--
Racke's Package and Resource Database (http://www.han.de/~racke/pard/)
486 packages, 60 resources, 10 distributions covered
-
To get out of this list, please send email to [EMAIL PROTECTED] with
this text in its body: unsubscribe suse-linux-e
Check out the SuSE-FAQ at http://www.suse.com/Support/Doku/FAQ/ and the
archiv at http://www.suse.com/Mailinglists/suse-linux-e/index.html