#!/usr/bin/env python

# rip [from] & [to] addresses from a letter.tex to be used by Greg's
# Envelope Printer <http://freefall.homeip.net/>

# by TeknoHog, May 2001 <http://iki.fi/teknohog/>
# Updated for new style string methods on 2008-04-04
# and multiline-friendly regex search on 2008-04-05

envprinter = "envelope" # Greg's script, change according to your path

# take only this # lines from the 'from' address. I did this because
# there's stuff like phone, email after the address which don't need
# to be on the envelope. Set this to 0 to take all lines.
fromlines = 5

def ReadFile(file):
    File = open(file, "r")
    contents = File.read()
    File.close()
    return contents

def WriteFile(filename, content):
    File = open(filename, "w")
    File.write(content)
    File.close()

def Usage():
    print "Usage: " + sys.argv[0] + " letter.tex"
    sys.exit()

import sys, os, tempfile, re

if len(sys.argv) > 1:
    if sys.argv[1][-4:] == ".tex":
        letterfile = sys.argv[1]
    else:
        Usage()
else:
    Usage()

tmp = tempfile.mktemp(".txt")

letter = ReadFile(letterfile)

findpat = {"from": r'\\address{(.*?)}', \
           "to":  r'\\begin{letter}{(.*?)}', \
           }

address = {}

# for multiple lines, only S is really needed, but I'm also learning
# to combine flags as well :)

for item in findpat.keys():
    address[item] = re.findall(findpat[item], letter, re.S | re.M)[0]
    address[item] = re.sub(r'\\\\', '\n', address[item])
    address[item] = re.sub(r'\n+', '\n', address[item])

if fromlines:
    fromList = address["from"].split("\n")
    address["from"] = "\n".join(fromList[:fromlines])

envelope = "[from]\n" + address["from"] + "\n\n[to]\n" + address["to"]

#print envelope

WriteFile(tmp, envelope)
os.system(envprinter + " " + tmp)
os.remove(tmp)

