Extract orthographic features from a given token
    
    There are 11 kinds of orthographic features, take 'Windows10' as an example:

    1. shape: 'Aaaaaaa00'
    2. length: 9
    3. contains_a_letter: True
    4. contains_a_capital: True
    5. begins_with_capital: True
    6. all_capital: False
    7. contains_a_digit: True
    8. all_digit: False
    9. contains_a_punctuation: False
    10. consists_letters_n_digits: True
    11. consists_digits_n_punctuations: False

def orthographic(token):
    """
    Extract orthographic features from a given token
    
    There are 11 kinds of orthographic features, take 'Windows10' as an example:

    1. shape: 'Aaaaaaa00'
    2. length: 9
    3. contains_a_letter: True
    4. contains_a_capital: True
    5. begins_with_capital: True
    6. all_capital: False
    7. contains_a_digit: True
    8. all_digit: False
    9. contains_a_punctuation: False
    10. consists_letters_n_digits: True
    11. consists_digits_n_punctuations: False
    """

    return OrderedDict([
                    ('shape', _shape(token)), 
                    ('length', len(token)), 
                    ('contains_a_letter', _contains_a_letter(token)), 
                    ('contains_a_capital', _contains_a_capital(token)),
                    ('begins_with_capital', _begins_with_capital(token)), 
                    ('all_capital', _all_capital(token)), 
                    ('contains_a_digit', _contains_a_digit(token)),
                    ('all_digit', _all_digit(token)),
                    ('contains_a_punctuation', _contains_a_punctuation(token)),
                    ('consists_letters_n_digits', _consists_letters_n_digits(token)),
                    ('consists_digits_n_punctuations', _consists_digits_n_punctuations(token)),
                   ])