Dear list, It seems to me that quoted replies in emails are somewhat backwards. The following as an example:
| > > Instead of having higher levels of indentation for text that | > > came first | > | > it would make a lot more sense to reverse the indentation, | | especially when archiving mails that aren't going to be used by | a MUA to correspond. I'd say for a web archive, the following would make a lot more sense: | Text tha came first does not get indented, but instead serves to | as the main text and anchor | | for text which is in reply to the email, which is quotes | | which makes it a lot more obvious to the eye. This allows a reader to easily skip interjections simply by not following indentation levels, and with the proper bit of XHTML/JavaScript/CSS, replies could even become foldable. I had a brief look at mhonarc and found the plugin architecture that makes mhonarc a really cool tool. Unfortunately, my Perl-skills are non-existent. Fortunately, my girlfriend knows the language a bit better, and so she threw together the attached script yesterday, which takes a message and outputs HTML which does the inversion. It is proof-of-concept and several rough edges need to be smoothed out. Do you think it is possible to write a mhonarc plugin on the basis of this logic? Would anyone like to give it a shot? -- martin; (greetings from the heart of the sun.) \____ echo mailto: !#^."<*>"|tr "<*> mailto:" [EMAIL PROTECTED] obviously i was either onto something, or on something. -- larry wall on the creation of perl spamtraps: [EMAIL PROTECTED]
#!/usr/bin/perl -w
#
# mail2html-invert - converts a mail to HTML and inverts the quoting
#
# Copyright © 2008 Penny Leach <penny at mjollnir.org>
# Released under the GPLv2
#
use strict;
use warnings;
use Text::Quoted;
use HTML::Entities;
# configurable bits
my $printblockquotes = 1; # change this to 0 if you want <p class="leveln"> instead of <blockquote><blockquote> etc
my $title = 'email'; # this could helpfully extract the names in the email or such
my $raw; # raw body of message
my $bodystarted; # flag for end of headers
my @newstructure; # post-processed structure
my $maxlevel = 0; # for inverting indenting
print <<EOH;
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>$title</title>
</head>
<body>
<p class="headers">
EOH
while (<STDIN>) {
if (/^$/ && !$bodystarted) { # empty line, start processing body after this
$bodystarted = 1;
print "</p>\n"; # end the paragraph containing headers
next;
}
unless ($bodystarted) { # if we're still processing headers, just print them
chomp;
print encode_entities($_) . "<br />\n";
next;
}
$raw .= $_;
}
# convert the raw body to some whack datastructure provide but Text::Quoted
my $structure = extract($raw);
foreach my $item (@$structure) {
# process the weird format we have and turn it into something sensible and flatter
handleitem($item);
}
# each 'item' is basically one lump of text with an indent level, which we invert
foreach my $item (@newstructure) {
my $invertedlevel = $maxlevel - $item->{level};
my $escaped = encode_entities($item->{text});
unless ($printblockquotes) {
print '<p class="level' . $invertedlevel . '">' . $escaped . '</p>' . "\n";
next;
}
my $pre = '';
my $post = '';
for (1..$invertedlevel) { $pre .= '<blockquote>'; $post .= '</blockquote>'; }
print $pre . '<p>' . $escaped . '</p>' . $post . "\n";
}
print " </body>\n</html>\n";
# --------------------------------------------------
# extract gives us back a weird structure that contains an array of either hashes or arrays
# flatten it and add it into @newstructure with an indent level
sub handleitem {
my $item = shift;
my $level = shift || 0;
$maxlevel = $level if $maxlevel < $level;
if (ref $item eq 'HASH') {
return if $item->{empty};
push @newstructure, { 'text' => $item->{text}, 'level' => $level};
}
elsif (ref $item eq 'ARRAY') {
foreach my $newitem (@$item) {
handleitem($newitem, $level+1);
}
}
}
digital_signature_gpg.asc
Description: Digital signature (see http://martin-krafft.net/gpg/)
