On Wed, Sep 19, 2001 at 09:20:57AM -0400, Jean-Sebastien Morisset decreed:
> Hi all.
> 
> I often receive plain/text e-mails with URLs in them. Normally, I would
> call up urlview, select the url, and then lynx would start-up to display
> that page. My problem is that some of the URLs point to images. :-) If I
> use the standard urlview->lynx technique, lynx will download the image,
> start xv (my prefered image viewer), and then exit. When lynx exits, it
> removes the temporary file it downloaded, which causes xv to display an
> error about not finding the specified file. :-)

Apologies for hitting send too soon without adding the attachment!

--- original response ---

I tried urlview and decided that I prefered to see the entire email when
dealing with the links.  So I wrote my own script.

The attached Python script loads the entire email into a GUI browser as
HTML, with URLs made into real hyperlinks.

I have the following lines in my .muttrc to invoke it from Ctrl-b and
invoke the Opera browser.  It should be easy to adapt to other browsers.

macro index \cb "|email2html.py > /tmp/email.html; opera /tmp/email.html \n"
macro pager \cb "|email2html.py > /tmp/email.html; opera /tmp/email.html \n"

Let me know if this is useful enough to post somewhere.

Obviously enjoy it, but use it entirely at your own risk.

HTH and cheers,
Steve

-- 

                  \_O<  \_O<  \_O<
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 Steve Cooper          Redmond, WA
#!/usr/bin/env python2

import sys
import re

#=== Globals

# Regular expression for isolating URLs
reURL = re.compile('(((http|https|ftp|gopher)|mailto)[.:][^ >"\t]*|www\.[-a-z0-9.]+)')

# Colors
bgColor    = "#ffffff"
labelColor = "#5050e0"
textColor  = "#000000"

#=== Fix line function

def FixLine(line):
    line = line.strip()
    line = line.replace('<','&lt;')
    line = line.replace('>','&gt;')
    return line

#=== Header list class

class HeaderList:

    def __init__(self):
        self.headers = {}
        # Specification for desired visible headers
        # TODO: Un-hardcode this!
        self.reHeaders = re.compile('^[ \t]*(From|To|Date|Subject):[ \t]*(.*)$', 
re.IGNORECASE)

    def ScanLine(self, line):
        matchHeader = self.reHeaders.search(line)
        if matchHeader is not None:
            self.headers[matchHeader.group(1).lower()] = matchHeader.group(2)

    def OutputLine(self, name, label, size = "+0"):
        if self.headers.has_key(name):
            print '<b><font color="%s" size="%s">%s: </font></b>' % (labelColor, size, 
label)
            print '<font color="%s" size="%s">%s</font><br>' % (textColor, size, 
self.headers[name])

    def Output(self):
        # TODO: Un-hardcode this!
        self.OutputLine('from',    'From')
        self.OutputLine('to',      'To',      '-1')
        self.OutputLine('date',    'Date',    '-1')
        self.OutputLine('subject', 'Subject', '+1')
        print '<hr><br>'

print '<html>'

print '<head>'
print '<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">'
print '<title>Mutt Email</title>'
print '</head>'

print '<body bgcolor="%s">' % bgColor

#=== Scan headers

headers = HeaderList()

line = sys.stdin.readline()

while line:
    line = FixLine(line)
    # Assume first empty line is the end of the headers
    if not line:
        break
    headers.ScanLine(line)
    line = sys.stdin.readline()

#=== Format header lines

headers.Output()

#=== Scan and display body

print '<PRE>'
nLine = 0

line = sys.stdin.readline()

while line:

    line = FixLine(line)

    nLine = nLine + 1

    match = reURL.search(line)
    while match is not None:
        sub   = '<a href="%s">%s</a>' % (match.group(1), match.group(1))
        line  = line[:match.start(1)] + sub + line[match.end():]
        skip  = match.start() + len(sub)
        match = reURL.search(line, skip)

    print '%s' % line

    line = sys.stdin.readline()

print '</PRE>'
print '</body>'
print '</html>'

Reply via email to