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