Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

# Copyright (C) 2001-2006 Python Software Foundation 

# Author: Barry Warsaw 

# Contact: email-sig@python.org 

 

"""Various types of useful iterators and generators.""" 

 

__all__ = [ 

    'body_line_iterator', 

    'typed_subpart_iterator', 

    'walk', 

    # Do not include _structure() since it's part of the debugging API. 

    ] 

 

import sys 

from cStringIO import StringIO 

 

 

 

# This function will become a method of the Message class 

def walk(self): 

    """Walk over the message tree, yielding each subpart. 

 

    The walk is performed in depth-first order.  This method is a 

    generator. 

    """ 

    yield self 

    if self.is_multipart(): 

        for subpart in self.get_payload(): 

            for subsubpart in subpart.walk(): 

                yield subsubpart 

 

 

 

# These two functions are imported into the Iterators.py interface module. 

def body_line_iterator(msg, decode=False): 

    """Iterate over the parts, returning string payloads line-by-line. 

 

    Optional decode (default False) is passed through to .get_payload(). 

    """ 

    for subpart in msg.walk(): 

        payload = subpart.get_payload(decode=decode) 

        if isinstance(payload, basestring): 

            for line in StringIO(payload): 

                yield line 

 

 

def typed_subpart_iterator(msg, maintype='text', subtype=None): 

    """Iterate over the subparts with a given MIME type. 

 

    Use `maintype' as the main MIME type to match against; this defaults to 

    "text".  Optional `subtype' is the MIME subtype to match against; if 

    omitted, only the main type is matched. 

    """ 

    for subpart in msg.walk(): 

        if subpart.get_content_maintype() == maintype: 

            if subtype is None or subpart.get_content_subtype() == subtype: 

                yield subpart 

 

 

 

def _structure(msg, fp=None, level=0, include_default=False): 

    """A handy debugging aid""" 

    if fp is None: 

        fp = sys.stdout 

    tab = ' ' * (level * 4) 

    print >> fp, tab + msg.get_content_type(), 

    if include_default: 

        print >> fp, '[%s]' % msg.get_default_type() 

    else: 

        print >> fp 

    if msg.is_multipart(): 

        for subpart in msg.get_payload(): 

            _structure(subpart, fp, level+1, include_default)