|
1 # Copyright (C) 2001-2006 Python Software Foundation |
|
2 # Author: Barry Warsaw |
|
3 # Contact: email-sig@python.org |
|
4 |
|
5 """Various types of useful iterators and generators.""" |
|
6 |
|
7 __all__ = [ |
|
8 'body_line_iterator', |
|
9 'typed_subpart_iterator', |
|
10 'walk', |
|
11 # Do not include _structure() since it's part of the debugging API. |
|
12 ] |
|
13 |
|
14 import sys |
|
15 from cStringIO import StringIO |
|
16 |
|
17 |
|
18 |
|
19 # This function will become a method of the Message class |
|
20 def walk(self): |
|
21 """Walk over the message tree, yielding each subpart. |
|
22 |
|
23 The walk is performed in depth-first order. This method is a |
|
24 generator. |
|
25 """ |
|
26 yield self |
|
27 if self.is_multipart(): |
|
28 for subpart in self.get_payload(): |
|
29 for subsubpart in subpart.walk(): |
|
30 yield subsubpart |
|
31 |
|
32 |
|
33 |
|
34 # These two functions are imported into the Iterators.py interface module. |
|
35 def body_line_iterator(msg, decode=False): |
|
36 """Iterate over the parts, returning string payloads line-by-line. |
|
37 |
|
38 Optional decode (default False) is passed through to .get_payload(). |
|
39 """ |
|
40 for subpart in msg.walk(): |
|
41 payload = subpart.get_payload(decode=decode) |
|
42 if isinstance(payload, basestring): |
|
43 for line in StringIO(payload): |
|
44 yield line |
|
45 |
|
46 |
|
47 def typed_subpart_iterator(msg, maintype='text', subtype=None): |
|
48 """Iterate over the subparts with a given MIME type. |
|
49 |
|
50 Use `maintype' as the main MIME type to match against; this defaults to |
|
51 "text". Optional `subtype' is the MIME subtype to match against; if |
|
52 omitted, only the main type is matched. |
|
53 """ |
|
54 for subpart in msg.walk(): |
|
55 if subpart.get_content_maintype() == maintype: |
|
56 if subtype is None or subpart.get_content_subtype() == subtype: |
|
57 yield subpart |
|
58 |
|
59 |
|
60 |
|
61 def _structure(msg, fp=None, level=0, include_default=False): |
|
62 """A handy debugging aid""" |
|
63 if fp is None: |
|
64 fp = sys.stdout |
|
65 tab = ' ' * (level * 4) |
|
66 print >> fp, tab + msg.get_content_type(), |
|
67 if include_default: |
|
68 print >> fp, '[%s]' % msg.get_default_type() |
|
69 else: |
|
70 print >> fp |
|
71 if msg.is_multipart(): |
|
72 for subpart in msg.get_payload(): |
|
73 _structure(subpart, fp, level+1, include_default) |