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 14import sys 15from cStringIO import StringIO 16 17 18 19# This function will become a method of the Message class 20def 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. 35def 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 47def 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 61def _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) 74