annotate Lib/mailcap.py @ 5817:48b94de85bf3 legacy-trunk

Extensive changes by AMK.
author Guido van Rossum <guido@python.org>
date Thu, 17 Jul 1997 16:29:42 +0000
parents 9bf650f23da5
children fb4b4d069cc7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5216
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
1 """Mailcap file handling. See RFC 1524."""
3133
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
2
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 import os
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 import string
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
6
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
7 # Part 1: top-level interface.
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
9 def getcaps():
5216
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
10 """Return a dictionary containing the mailcap database.
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
11
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
12 The dictionary maps a MIME type (in all lowercase,
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
13 e.g. 'text/plain') to a list of corresponding mailcap entries.
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
14
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
15 """
3133
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
16 caps = {}
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
17 for mailcap in listmailcapfiles():
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
18 try:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
19 fp = open(mailcap, 'r')
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
20 except:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
21 continue
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
22 morecaps = readmailcapfile(fp)
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
23 fp.close()
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
24 for key in morecaps.keys():
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
25 if not caps.has_key(key):
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
26 caps[key] = morecaps[key]
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
27 else:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
28 caps[key] = caps[key] + morecaps[key]
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
29 return caps
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
30
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
31 def listmailcapfiles():
5216
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
32 """Return a list of all mailcap files found on the system."""
3133
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
33 # XXX Actually, this is Unix-specific
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
34 if os.environ.has_key('MAILCAPS'):
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
35 str = os.environ['MAILCAPS']
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
36 mailcaps = string.splitfields(str, ':')
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
37 else:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
38 if os.environ.has_key('HOME'):
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
39 home = os.environ['HOME']
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
40 else:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
41 # Don't bother with getpwuid()
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
42 home = '.' # Last resort
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
43 mailcaps = [home + '/.mailcap', '/etc/mailcap',
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
44 '/usr/etc/mailcap', '/usr/local/etc/mailcap']
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
45 return mailcaps
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
46
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
47
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
48 # Part 2: the parser.
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
49
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
50 def readmailcapfile(fp):
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
51 caps = {}
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
52 while 1:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
53 line = fp.readline()
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
54 if not line: break
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
55 # Ignore comments and blank lines
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
56 if line[0] == '#' or string.strip(line) == '':
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
57 continue
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
58 nextline = line
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
59 # Join continuation lines
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 while nextline[-2:] == '\\\n':
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 nextline = fp.readline()
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
62 if not nextline: nextline = '\n'
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
63 line = line[:-2] + nextline
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
64 # Parse the line
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
65 key, fields = parseline(line)
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
66 if not (key and fields):
4148
ab43715ef4ee typo (cotinue -> continue)
Guido van Rossum <guido@python.org>
parents: 3133
diff changeset
67 continue
3133
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
68 # Normalize the key
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 types = string.splitfields(key, '/')
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
70 for j in range(len(types)):
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
71 types[j] = string.strip(types[j])
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
72 key = string.lower(string.joinfields(types, '/'))
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 # Update the database
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
74 if caps.has_key(key):
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
75 caps[key].append(fields)
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 else:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
77 caps[key] = [fields]
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 return caps
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
79
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 def parseline(line):
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 fields = []
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
82 i, n = 0, len(line)
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
83 while i < n:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
84 field, i = parsefield(line, i, n)
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
85 fields.append(field)
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
86 i = i+1 # Skip semicolon
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
87 if len(fields) < 2:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 return None, None
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
89 key, view, rest = fields[0], fields[1], fields[2:]
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 fields = {'view': view}
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
91 for field in rest:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 i = string.find(field, '=')
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
93 if i < 0:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
94 fkey = field
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
95 fvalue = ""
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
96 else:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
97 fkey = string.strip(field[:i])
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
98 fvalue = string.strip(field[i+1:])
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
99 if fields.has_key(fkey):
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 # Ignore it
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
101 pass
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 else:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 fields[fkey] = fvalue
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
104 return key, fields
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
105
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
106 def parsefield(line, i, n):
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 start = i
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 while i < n:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
109 c = line[i]
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
110 if c == ';':
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
111 break
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
112 elif c == '\\':
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 i = i+2
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
114 else:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 i = i+1
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
116 return string.strip(line[start:i]), i
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
117
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
118
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
119 # Part 3: using the database.
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
120
5216
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
121 def findmatch(caps, MIMEtype, key='view', filename="/dev/null", plist=[]):
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
122 """Find a match for a mailcap entry.
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
123
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
124 Return a tuple containing the command line, and the mailcap entry
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
125 used; (None, None) if no match is found. This may invoke the
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
126 'test' command of several matching entries before deciding which
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
127 entry to use.
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
128
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
129 """
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
130 entries = lookup(caps, MIMEtype, key)
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
131 # XXX This code should somehow check for the needsterminal flag.
3133
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
132 for e in entries:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
133 if e.has_key('test'):
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
134 test = subst(e['test'], filename, plist)
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
135 if test and os.system(test) != 0:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
136 continue
5216
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
137 command = subst(e[key], MIMEtype, filename, plist)
3133
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
138 return command, e
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
139 return None, None
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
140
5216
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
141 def lookup(caps, MIMEtype, key=None):
3133
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
142 entries = []
5216
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
143 if caps.has_key(MIMEtype):
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
144 entries = entries + caps[MIMEtype]
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
145 MIMEtypes = string.splitfields(MIMEtype, '/')
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
146 MIMEtype = MIMEtypes[0] + '/*'
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
147 if caps.has_key(MIMEtype):
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
148 entries = entries + caps[MIMEtype]
3133
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
149 if key is not None:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
150 entries = filter(lambda e, key=key: e.has_key(key), entries)
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
151 return entries
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
152
5216
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
153 def subst(field, MIMEtype, filename, plist=[]):
3133
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
154 # XXX Actually, this is Unix-specific
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
155 res = ''
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 i, n = 0, len(field)
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
157 while i < n:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 c = field[i]; i = i+1
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
159 if c <> '%':
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
160 if c == '\\':
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
161 c = field[i:i+1]; i = i+1
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
162 res = res + c
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
163 else:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
164 c = field[i]; i = i+1
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
165 if c == '%':
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
166 res = res + c
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
167 elif c == 's':
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
168 res = res + filename
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
169 elif c == 't':
5216
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
170 res = res + MIMEtype
3133
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
171 elif c == '{':
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
172 start = i
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
173 while i < n and field[i] <> '}':
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 i = i+1
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
175 name = field[start:i]
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
176 i = i+1
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
177 res = res + findparam(name, plist)
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
178 # XXX To do:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
179 # %n == number of parts if type is multipart/*
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 # %F == list of alternating type and filename for parts
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
181 else:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
182 res = res + '%' + c
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
183 return res
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
184
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
185 def findparam(name, plist):
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
186 name = string.lower(name) + '='
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
187 n = len(name)
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
188 for p in plist:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
189 if string.lower(p[:n]) == name:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
190 return p[n:]
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
191 return ''
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
192
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
193
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
194 # Part 4: test program.
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
195
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
196 def test():
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 import sys
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
198 caps = getcaps()
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
199 if not sys.argv[1:]:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
200 show(caps)
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
201 return
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
202 for i in range(1, len(sys.argv), 2):
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
203 args = sys.argv[i:i+2]
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
204 if len(args) < 2:
5216
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
205 print "usage: mailcap [MIMEtype file] ..."
3133
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 return
5216
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
207 MIMEtype = args[0]
3133
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
208 file = args[1]
5216
9bf650f23da5 Change by Andrew Kuchling (edited by Guido):
Guido van Rossum <guido@python.org>
parents: 4148
diff changeset
209 command, e = findmatch(caps, MIMEtype, 'view', file)
3133
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
210 if not command:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
211 print "No viewer found for", type
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
212 else:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
213 print "Executing:", command
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
214 sts = os.system(command)
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
215 if sts:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
216 print "Exit status:", sts
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
217
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
218 def show(caps):
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
219 print "Mailcap files:"
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
220 for fn in listmailcapfiles(): print "\t" + fn
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
221 print
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
222 if not caps: caps = getcaps()
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
223 print "Mailcap entries:"
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
224 print
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
225 ckeys = caps.keys()
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
226 ckeys.sort()
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
227 for type in ckeys:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
228 print type
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
229 entries = caps[type]
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
230 for e in entries:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
231 keys = e.keys()
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
232 keys.sort()
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
233 for k in keys:
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
234 print " %-15s" % k, e[k]
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
235 print
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
236
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
237 if __name__ == '__main__':
591287a22ee5 Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
238 test()