offlineimap rev 499
"Automatic Subversion Change Mailer" <[email protected]> Wed, 16 Jul 2003 14:39:33 -0500 (CDT)
| Newsgroups | gmane.mail.imap.offlineimap.subversion |
|---|---|
| Message-ID | <[email protected]> |
You are receiving this message because
all commits get sent to this address.
Author: jgoerzen
Date: 2003-07-16 14:38:49 -0500 (Wed, 16 Jul 2003)
New Revision: 499
Modified:
imaplib/head/imap2/parser/GrammarClass.py
imaplib/head/imap2/parser/grammar.g
imaplib/head/imap2/parser/grammar.py
imaplib/head/imap2/parser/imap.g
imaplib/head/imap2/parser/imap.py
imaplib/head/imap2/parser/imapTest.py
Log:
Made a number of renames to make things work a little smoother.
Diff:
Added: imaplib/head/imap2/parser/GrammarClass.py
==============================================================================
--- imaplib/head/imap2/parser/GrammarClass.py 2003-07-16 19:33:05 UTC (rev 498)
+++ imaplib/head/imap2/parser/GrammarClass.py 2003-07-16 19:38:49 UTC (rev 499)
@@ -0,0 +1,26 @@
+# Implementation of grammar from RFC3501
+# $Id: imap.g 494 2003-07-16 18:38:03Z jgoerzen $
+
+# COPYRIGHT #
+# Copyright (C) 2002 John Goerzen
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# END OF COPYRIGHT #
+
+import grammar
+def parse(rule, text):
+ P = grammar.IMAP(grammar.IMAPScanner(text))
+ getattr(P, rule)()
+
Copied: imaplib/head/imap2/parser/grammar.g (from rev 498, imaplib/head/imap2/parser/imap.g)
Copied: imaplib/head/imap2/parser/grammar.py (from rev 498, imaplib/head/imap2/parser/imap.py)
Deleted: imaplib/head/imap2/parser/imap.g
==============================================================================
--- imaplib/head/imap2/parser/imap.g 2003-07-16 19:33:05 UTC (rev 498)
+++ imaplib/head/imap2/parser/imap.g 2003-07-16 19:38:49 UTC (rev 499)
@@ -1,535 +0,0 @@
-# Implementation of grammar from RFC3501
-# $Id$
-
-# COPYRIGHT #
-# Copyright (C) 2002 John Goerzen
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-# END OF COPYRIGHT #
-%%
-
-parser IMAP:
- token END: "$"
-
-
- # custom tokens
-
- token LPAREN: r'\('
- token RPAREN: r'\)'
- token PLUS: r'\+'
- token DASH: r'-'
- token BACKSLASH: r'\\'
- token ASTERISK: r'\*'
- token LBRACKET: r'\['
- token RBRACKET: r'\]'
- token PERIOD: r'\.'
- token PLUSMINUS: r'[+-]'
- token LT: r'<'
- token GT: r'>'
-
- # Tokens in RFC2060, missing from RFC3501, but used there.
- token ALPHA: r'[a-zA-Z]'
- token DQUOTE: r'"'
- token DIGIT: r'[0-9]'
- token DIGITx2: r'[0-9]{2}'
- token DIGITx4: r'[0-9]{4}'
- token SP: r'\ '
- token CRLF: r'\r\n'
- token CTL: r'[\x00-\x1f\x7f]'
-
- # Defined tokens
- token ATOM_CHAR: r'(?![(){ \x00-\x1f\x7f%*"\\\]])[\x01-\x7f]'
- token atom_specials_tok: r'[()}]'
- token base64_char: r'[a-zA-Z0-9+/]'
- token base64_char_x2: r'[a-zA-Z0-9+/]{2}'
- token base64_char_x3: r'[a-zA-Z0-9+/]{3}'
- token base64_char_x4: r'[a-zA-Z0-9+/]{4}'
- token CHAR8: r'[\x01-\xff]'
- token date_day: r'[0-9]{1,2}'
- token date_day_fixed: r'[ 0-9][0-9]'
- token date_month: r'(?i)(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)'
- token date_year: r'[0-9]{4}'
- token digit_nz: r'[1-9]'
- token flag_custom_base: r'(?i)\\(Answered|Flagged|Deleted|Seen|Draft)'
- token list_wildcards: r'[%*]'
- token mailbox_data_tok: r'(?i)(EXISTS|RECENT)'
- token mbx_list_sflag: r'(?i)\\(Noselect|Marked|Unmarked)'
- token media_basic_tok: r'(?i)(APPLICATION|AUDIO|IMAGE|MESSAGE|VIDEO)'
- token media_message: r'(?i)"MESSAGE" "RFC822"'
- token msg_att_static_tok: r'(?i)RFC822(\.HEADER|\.TEXT){0,1}'
- token msg_att_static_bodytok: r'(?i)BODY(STRUCTURE){0,1}'
- token number_tok: r'[0-9]+'
- token nz_number_tok: r'[1-9][0-9]*'
- token QUOTED_CHAR_TOK: r'(?![\n\r"\\])[\x01-\x7f]'
- token quoted_specials: r'["\\]'
- token resp_cond_auth_tok: r'(?i)(OK|PREAUTH)'
- token resp_cond_state_tok: r'(?i)(OK|NO|BAD)'
- token resp_specials: r'\]'
- token RESP_TEXT_CHAR: r'(?![\n\r\]])[\x01-\x7f]'
- token section_msgtext_tok: r'(?i)HEADER(\.FIELDS){0,1}(\.NOT){0,1}'
- token status_att: r'(?i)(MESSAGES|RECENT|UIDNEXT|UIDVALIDITY|UNSEEN)'
- token TAG_ATOM_CHAR: r'(?![+(){ \x00-\x1f\x7f%*"\\\]])[\x01-\x7f]'
- token TEXT_CHAR: r'(?![\n\r])[\x01-\x7f]'
-
-
- # ENTRY POINT
-
- rule goal: response END {{ return response }}
- rule goal_connect: response_data END {{ return response_data }}
-
- # Rules
-
- rule address: LPAREN addr_name SP addr_adl SP addr_mailbox SP addr_host
- RPAREN
- {{ return {'name': addr_name, 'adl': addr_adl, 'mailbox': addr_mailbox, 'host': addr_host} }}
-
- rule addr_adl: nstring {{ return nstring }}
- rule addr_host: nstring {{ return nstring }}
- rule addr_mailbox: nstring {{ return nstring }}
- rule addr_name: nstring {{ return nstring }}
- # append
- rule astring: string {{ return string }} |
- {{ v = '' }}
- ( ASTRING_CHAR {{ v += ASTRING_CHAR }} ) +
- {{ return v }}
- rule atom: {{ v = '' }} ( ATOM_CHAR {{ v += ATOM_CHAR }} ) + {{ return v }}
- rule ASTRING_CHAR: ATOM_CHAR {{ return ATOM_CHAR}}
- | resp_specials {{ return resp_specials }}
- rule atom_specials: atom_specials_tok {{ return atom_specials_tok }}
- | SP {{ return SP }}
- | CTL {{ return CTL }}
- | list_wildcards {{ return list_wildcards }}
- | quoted_specials {{ return quoted_specials }}
- | resp_specials {{ return resp_specials}}
- rule authenticate: "(?i)AUTHENTICATE" SP
- auth_type {{ v = {'auth_type': auth_type} }}
- [ CRLF base64 {{ v['base64'] = base64 }} ]
- {{ return v }}
- rule auth_type: atom {{ return atom }}
-
- ##############################
- # B
- ##############################
-
- rule base64: {{ v = '' }}
- (base64_char_x4 {{ v += base64_char_x4}} ) *
- [ base64_terminal {{ v += base64_terminal }} ]
- {{ return v }}
- rule base64_terminal: (base64_char_x2 "==" {{ return base64_char_x2 + "==" }}
- | base64_char_x3 "=" {{ return base64_char_x3 + "=" }}
- )
-
- rule body: LPAREN (body_type_1part {{ return body_type_1part }}
- | body_type_mpart {{ return body_type_mpart }} ) RPAREN
- rule body_extension: (nstring {{ v = nstring }}
- | number {{ v = number }}
- | (LPAREN body_extension {{ v = [body_extension] }}
- (SP body_extension {{ v.append(body_extension)}} ) * )
- )
- {{ return v }}
- rule body_ext_1part: body_fld_md5 {{ v = {'md5': body_fld_md5, 'extension': []} }}
- [SP body_fld_dsp {{ v['dsp'] = body_fld_dsp}}
- [SP body_fld_lang {{ v['lang'] = body_fld_lang}}
- [SP body_fld_loc {{ v['loc'] = body_fld_loc }}
- (SP body_extension {{ v['extension'].append(body_extension)}}) *
- ]
- ]
- ]
- {{ return v }}
- rule body_ext_mpart: body_fld_param {{ v = {'param': body_fld_param, 'extension': []} }}
- [SP body_fld_dsp {{ v['dsp'] = body_fld_dsp }}
- [SP body_fld_lang {{ v['lang'] = body_fld_lang}}
- [SP body_fld_loc {{ v['loc'] = body_fld_loc}}
- (SP body_extension {{ v['extension'].append(body_extension)}} )*
- ]
- ]
- ]
- {{ return v }}
- rule body_fields: body_fld_param SP body_fld_id SP body_fld_desc SP
- body_fld_enc SP body_fld_octets
- {{ return {'param': body_fld_param, 'id': body_fld_id, 'desc': body_fld_desc, 'enc': body_fld_enc, 'octets': body_fld_octets} }}
- rule body_fld_desc: nstring {{ return nstring }}
- rule body_fld_dsp: (nil {{ v = nil }}
- | LPAREN string SP body_fld_param RPAREN {{ v = [string, body_fld_param] }}
- )
- {{ return v }}
- rule body_fld_enc: string {{return string}}
- rule body_fld_id: nstring {{ return nstring }}
- rule body_fld_lang: ( nstring {{ v = [nstring] }}
- | LPAREN string {{ v = [string] }}
- (SP string {{ v.append(string) }} ) *
- ) {{ return v }}
- rule body_fld_loc: nstring {{ return nstring }}
- rule body_fld_lines: number {{ return number }}
- rule body_fld_md5: nstring {{ return nstring }}
- rule body_fld_octets: number {{ return number }}
- rule body_fld_param: (nil {{ v = nil }}
- |
- LPAREN {{ v = [] }}
- string {{ x = string }}
- SP string {{ v.append([x, string]) }}
- (SP string {{ x = string }}
- SP string {{ v.append([x, string]) }})*
- RPAREN ) {{ return v }}
-
- rule body_type_1part: (body_type_basic {{ v = [body_type_basic] }}
- | body_type_msg {{ v = [body_type_msg] }}
- | body_type_text {{ v = [body_type_text] }}
- )
- [SP body_ext_1part {{v.append(body_ext_1part) }} ]
- {{ return v}}
- rule body_type_basic: media_basic {{ v = {'media_basic': media_basic} }}
- SP body_fields {{ v['body_fields'] = body_fields }}
- {{ return v }}
- rule body_type_mpart: {{ v_body = []}} (body {{v_body.append(body)}} )+
- {{ v = {'body': v_body} }}
- SP media_subtype {{v['media_subtype'] = media_subtype}}
- [SP body_ext_mpart {{v['body_ext_mpart'] = body_ext_mpart}} ]
- {{ return v }}
- rule body_type_msg: media_message SP body_fields SP envelope SP
- body SP body_fld_lines
- {{ return {'media_message': media_message, 'body_fields': body_fields,'envelope': envelope, 'body': body, 'bofy_fld_lines': body_fld_lines} }}
- rule body_type_text: media_text SP body_fields SP body_fld_lines
- {{ return {'media_text': media_text, 'body_fields': body_fields, 'body_fld_lines': body_fld_lines} }}
-
- ##############################
- # C
- ##############################
-
- rule capability: ("(?i)AUTH=" auth_type {{ v = "AUTH=" + auth_type }}
- | atom {{ v = atom }} ) {{ return v }}
- rule capability_data: "(?i)CAPABILITY" {{ v = [] }}
- (SP capability {{ v.append(capability) }})*
- "(?i)IMAP4rev1" {{ v.append("IMAP4rev1") }}
- (SP capability {{ v.append(capability) }})*
- {{ return v }}
- #rule command:
- #rule command_any:
- #rule command_auth:
- #rule command_nonauth:
- #rule command_select:
-
- rule continue_req: PLUS SP (resp_text {{ v = resp_text}}
- | base64 {{ v = base64}} )
- CRLF {{ return v }}
- # rule copy:
- # rule create:
- rule date: (date_text | DQUOTE date_text DQUOTE) {{ return date_text }}
- rule date_text: date_day DASH date_month DASH date_year
- {{ return {'day': int(date_day), 'month': date_month, 'year': int(date_year)} }}
- rule date_time: DQUOTE date_day_fixed DASH date_month DASH date_year
- SP time SP zone DQUOTE {{ return {'day': int(date_day_fixed.strip()), 'month': date_month, 'year': int(date_year),'time': time, 'zone': zone} }}
- # rule delete:
-
- ##############################
- # E
- ##############################
-
- rule envelope: LPAREN env_date SP env_subject SP env_from SP
- env_sender SP env_reply_to SP env_to SP env_cc SP env_bcc SP
- env_in_reply_to SP env_message_id RPAREN
- {{ return {'date': env_date, 'subject': env_subject, 'from': env_from, 'sender': env_sender, 'reply_to': env_reply_to, 'to': env_to, 'cc': env_cc, 'bcc': env_bcc, 'in_reply_to': env_in_reply_to, 'message_id': env_message_id } }}
- rule env_custom_addrs: ( nil {{ v = [] }} |
- LPAREN {{ v = [] }}
- ( address {{ v.append(address) }} )+
- RPAREN) {{ return v }}
- rule env_bcc: env_custom_addrs {{ return env_custom_addrs }}
- rule env_cc: env_custom_addrs {{ return env_custom_addrs }}
- rule env_date: nstring {{ return nstring }}
- rule env_from: env_custom_addrs {{ return env_custom_addrs }}
- rule env_in_reply_to: nstring {{ return nstring }}
- rule env_message_id: nstring {{ return nstring }}
- rule env_reply_to: env_custom_addrs {{ return env_custom_addrs }}
- rule env_sender: env_custom_addrs {{ return env_custom_addrs }}
- rule env_subject: nstring {{ return nstring }}
- rule env_to: env_custom_addrs {{ return env_custom_addrs }}
-
- # rule examine:
-
- ##############################
- # F
- ##############################
-
- # rule fetch:
- # rule fetch-att
-
- rule flag: (flag_custom_base {{ v = flag_custom_base}}
- | flag_keyword {{ v = flag_keyword }}
- | flag_extension {{ v = flag_extension}} ) {{ return v }}
- rule flag_extension: BACKSLASH atom {{ return "\\" + atom }}
- rule flag_fetch: (flag {{ v = flag}}
- | r'(?i)\\Recent' {{ v = "\\Recent" }} ) {{ return v }}
- rule flag_keyword: atom {{ return atom }}
- rule flag_list: LPAREN {{ v = [] }}
- [flag {{ v.append(flag) }}
- (SP flag {{ v.append(flag) }} ) * ]
- RPAREN
- {{ return v }}
- rule flag_perm: (flag {{ v = flag }}) {{ return v }}
- # \* assumed in flag
- # | BACKSLASH ASTERISK {{ v = "\\*" }} ) {{ return v }}
-
- ##############################
- # G
- ##############################
- rule greeting: ASTERISK SP (resp_cond_auth {{ v = resp_cond_auth }}
- | resp_cond_bye {{ v = resp_cond_bye }} )
- CRLF {{ return v }}
-
- ##############################
- # H
- ##############################
-
- rule header_fld_name: astring {{ return astring }}
- rule header_list: LPAREN header_fld_name {{ v = [header_fld_name] }}
- (SP header_fld_name {{v.append(header_fld_name)}} )*
- RPAREN {{ return v }}
-
- ##############################
- # L
- ##############################
-
- # rule list:
- # rule list_mailbox:
- rule list_char: (ATOM_CHAR {{ v = ATOM_CHAR }}
- | list_wildcards {{ v = list_wildcards}}
- | resp_specials {{ v = resp_specials }} ) {{ return v }}
- rule literal: r'\{' number r'\}' CRLF literal_load<<number>> {{ return literal_load }}
- rule literal_load<<X>>: {{ count = 0 }} {{ data = '' }}
- ( {{ if count == X: break}}
- CHAR8 {{ count += 1 }} {{ data += CHAR8 }}
- )*
- {{ return data }}
-
- #rule login:
- #rule lsub:
-
- ##############################
- # M
- ##############################
-
- rule mailbox: ("INBOX" {{ v = "INBOX" }} | astring {{ v = astring }} )
- {{ return v }}
- rule mailbox_data: {{ v = {} }}
- ("(?i)FLAGS" SP flag_list {{ v['flags'] = flag_list}}
- | "(?i)(LIST|LSUB)" SP mailbox_list {{ v['list'] = mailbox_list}}
- | "(?i)SEARCH" {{ v['search'] = [] }}
- (SP nz_number {{ v['search'].append(nz_number) }} )*
- | "(?i)STATUS" SP mailbox {{ v['status'] = {'mailbox': mailbox} }}
- SP LPAREN [status_att_list {{v['status']['att'] = status_att_list }}
- ] RPAREN
- | number SP mailbox_data_tok {{ v[mailbox_data_tok.upper()] = number}}
- ) {{ return v }}
- rule mailbox_list: {{ v = {} }}
- LPAREN [mbx_list_flags {{ v['flags'] = mbx_list_flags }} ] RPAREN
- SP
- ( nil {{ v['data'] = nil }}
- | DQUOTE QUOTED_CHAR DQUOTE {{ v['data'] = QUOTED_CHAR }}
- )
- SP mailbox {{ v['mailbox'] = mailbox }}
- {{ return v }}
- # This rule does not enforce the exactly-one occurance of sflag as
- # specified in the RFC.
- rule mbx_list_flags: {{ v = [] }}
- (mbx_list_oflag {{ v.append(mbx_list_oflag)}}
- | mbx_list_sflag {{v.append(mbx_list_sflag)}})
- (SP (
- mbx_list_oflag {{ v.append(mbx_list_oflag) }}
- | mbx_list_sflag {{ v.append(mbx_list_sflag) }} )
- )* {{ return v }}
- rule mbx_list_oflag: flag_extension {{ return flag_extension }}
- # oflag skips the \Noinferiors in the RFC because
- # flag_extension captures it.
- rule media_basic: string SP media_subtype {{ return (string, media_subtype) }}
- rule media_subtype: string {{ return string }}
- rule media_text: DQUOTE r'(?i)TEXT' DQUOTE SP media_subtype
- {{ return ('TEXT', media_subtype) }}
-
- rule message_data: nz_number SP {{ v = [nz_number] }}
- (r'(?i)EXPUNGE' {{ v.append('EXPUNGE') }}
- | r'(?i)FETCH' SP msg_att {{ v.extend(['FETCH', msg_att]) }}
- ) {{ return v }}
- rule msg_att: LPAREN {{ v = {} }}
- (msg_att_dynamic {{ v.update(msg_att_dynamic) }}
- | msg_att_static {{ v.update(msg_att_static) }} )
- (SP
- (msg_att_dynamic {{ v.update(msg_att_dynamic) }}
- | msg_att_static {{ v.update(msg_att_static) }} )
- )*
- RPAREN {{ return v }}
- rule msg_att_dynamic: r'(?i)FLAGS' SP LPAREN
- {{ v = [] }}
- [flag_fetch {{ v.append(flag_fetch) }}
- (SP flag_fetch {{ v.append(flag_fetch) }} )* ]
- RPAREN {{ return {'FLAGS': v} }}
- rule msg_att_static:
- (
- r'(?i)ENVELOPE' SP envelope {{ t = 'ENVELOPE'}} {{ v = envelope }}
- | r'(?i)INTERNALDATE' SP date_time {{t = 'INTERNALDATE'}} {{v = date_time}}
- | msg_att_static_tok SP nstring {{t = msg_att_static_tok}} {{v=nstring}}
- | r'(?i)RFC822\.SIZE' SP number {{t = 'RFC822.SIZE'}} {{v=number}}
- | msg_att_static_bodytok SP body {{t=msg_att_static_bodytok}}{{v=body}}
- | r'(?i)BODY' {{t='BODYsect'}}
- section {{ v = {'section': section} }}
- [LT number GT {{v['number'] = number}}] SP nstring {{ v['nstring'] = nstring}}
- | r'(?i)UID' SP uniqueid {{t='UID'}} {{v = uniqueid}}
- ) {{ return {t: v} }}
-
- ##############################
- # N
- ##############################
-
- rule nil: r'(?i)NIL' {{ return None }}
- rule nstring: (string {{ v = string}} | nil {{ v = nil }} ) {{ return v }}
- rule number: number_tok {{ return long(number_tok) }}
- rule nz_number: nz_number_tok {{ return long(nz_number_tok) }}
-
- ##############################
- # P
- ##############################
-
- rule password: astring {{ return astring }}
-
- ##############################
- # Q
- ##############################
-
- rule quoted: "\"" {{v = ''}}
- ( QUOTED_CHAR {{ v += QUOTED_CHAR}} )*
- "\"" {{ return v }}
- rule QUOTED_CHAR: QUOTED_CHAR_TOK {{ return QUOTED_CHAR_TOK }}
- | ( "\\\\" quoted_specials {{ return quoted_specials}} )
-
- ##############################
- # R
- ##############################
-
- # rule rename:
-
- rule response: {{ v = [] }}
- (continue_req {{ v.append(continue_req)}}
- | response_data {{ v.append(response_data) }} )*
- response_done {{ return [response_done] + v }}
- rule response_data: ASTERISK SP (
- resp_cond_state {{ v = resp_cond_state }}
- | resp_cond_bye {{ v = resp_cond_bye}}
- | mailbox_data {{ v = mailbox_data }}
- | message_data {{ v = message_data }}
- | capability_data {{ v = capability_data}}) CRLF {{ return v }}
- rule response_done: (response_tagged {{ v = response_tagged}}
- | response_fatal {{ v = response_fatal}}) {{ return v}}
- rule response_fatal: ASTERISK SP resp_cond_bye CRLF {{ return resp_cond_bye}}
- rule response_tagged: tag SP resp_cond_state CRLF
- {{ return {'tag': tag, 'state': resp_cond_state} }}
- rule resp_cond_auth: resp_cond_auth_tok SP resp_text
- {{ return {'result': resp_cond_auth_tok, 'detail': resp_text} }}
- rule resp_cond_bye: r'(?i)BYE' SP resp_text
- {{ return {'result': BYE, 'detail': resp_text} }}
- rule resp_cond_state: resp_cond_state_tok SP resp_text
- {{ return {'result': resp_cond_state_tok, 'detail': resp_text} }}
- rule resp_text: {{ v = {} }}
- [LBRACKET resp_text_code RBRACKET SP {{v['code'] = resp_text_code}} ]
- text {{ v['text'] = text}} {{ return v}}
- rule resp_text_code: (
- r'(?i)ALERT' {{ v = ['ALERT'] }}
- | r'(?i)BADCHARSET' {{ v = ['BADCHARSET'] }}
- [SP LPAREN astring {{ v.append(astring) }}
- (SP astring {{ v.append(astring) }} )*
- RPAREN ]
- | capability_data {{ v = [capability_data] }}
- | r'(?i)PARSE' {{ v = ['PARSE'] }}
- | r'(?i)PERMANENTFLAGS' SP LPAREN {{ v = ['PERMANENTFLAGS'] }}
- [flag_perm {{ v.append(flag_perm) }}
- (SP flag_perm {{ v.append(flag_perm) }})*] RPAREN
- | r'(?i)READ-ONLY' {{ v = ['READ-ONLY'] }}
- | r'(?i)READ-WRITE' {{ v = ['READ-WRITE'] }}
- | r'(?i)TRYCREATE' {{ v = ['TRYCREATE'] }}
- | r'(?i)UIDNEXT' SP nz_number {{ v = ['UIDNEXT', nz_number] }}
- | r'(?i)UIDVALIDITY' SP nz_number {{ v = ['UIDVALIDITY', nz_number] }}
- | r'(?i)UNSEEN' SP nz_number {{ v = ['UNSEEN', nz_number] }}
- | atom {{v = [atom]}} [SP {{ v.append('') }}
- (RESP_TEXT_CHAR {{ v[1] += RESP_TEXT_CHAR}})+]
- ) {{ return v }}
-
- ##############################
- # S
- ##############################
-
- #rule search:
- #rule search_key:
-
- rule section: {{ v = None }} LBRACKET [section_spec {{ v = section_spec }} ]
- RBRACKET {{ return v }}
- rule section_msgtext: section_msgtext_tok {{ v = [section_msgtext_tok] }}
- SP (header_list {{ v.append(header_list) }}
- | r'(?i)TEXT' {{ v.append('TEXT') }} ) {{ return v }}
- rule section_part: nz_number {{ v = str(nz_number) }}
- (PERIOD nz_number {{ v += '.' + str(nz_number) }})* {{ return v }}
- rule section_spec: (section_msgtext {{ v = {'msgtext': section_msgtext} }}
- | section_part {{ v = {'part': section_part} }}
- [PERIOD section_text {{ v['text'] = section_text}} ]
- ) {{ return v }}
- rule section_text: (section_msgtext {{ v = section_msgtext}}
- | r'(?i)MIME' {{ v = 'MIME' }}) {{ return v }}
- # rule select:
- # rule seq_number:
- # rule seq_range:
- # rule sequence_set:
- # rule status:
- rule status_att_list: {{ v = {} }}
- status_att SP number {{ v[status_att] = number}}
- (SP status_att SP number {{ v[status_att] = number}})*
- {{ return v}}
- #rule store:
- #rule store_att_flags:
-
- rule string: (quoted {{ v = quoted }} | literal {{ v = literal }})
- {{ return v }}
- #rule subscribe:
-
- ##############################
- # T
- ##############################
-
- rule TAG_ASTRING_CHAR: TAG_ATOM_CHAR {{ return TAG_ATOM_CHAR}}
- | resp_specials {{ return resp_specials }}
- rule tag: {{ v = '' }} (TAG_ASTRING_CHAR {{ v += TAG_ASTRING_CHAR}})+
- {{ return v}}
- rule text: {{ v = '' }} (TEXT_CHAR {{ v += TEXT_CHAR }})+ {{ return v }}
-
-
- rule time: DIGITx2 {{ x = {'hours': DIGITx2} }}
- ":" DIGITx2 {{ x['minutes']= DIGITx2 }}
- ":" DIGITx2 {{ x['seconds']= DIGITx2 }} {{ return x }}
-
- ##############################
- # U
- ##############################
- # rule uid:
- rule uniqueid: nz_number {{ return nz_number }}
- # rule unsubscribe:
- rule userid: astring {{ return astring }}
-
- ##############################
- # X
- ##############################
-
- # rule x_command:
-
- ##############################
- # Z
- ##############################
-
- rule zone: PLUSMINUS DIGITx4 {{ return PLUSMINUS + DIGITx4 }}
Deleted: imaplib/head/imap2/parser/imap.py
==============================================================================
--- imaplib/head/imap2/parser/imap.py 2003-07-16 19:33:05 UTC (rev 498)
+++ imaplib/head/imap2/parser/imap.py 2003-07-16 19:38:49 UTC (rev 499)
@@ -1,1298 +0,0 @@
-# Implementation of grammar from RFC3501
-# $Id: imap.g 496 2003-07-16 19:11:53Z jgoerzen $
-
-# COPYRIGHT #
-# Copyright (C) 2002 John Goerzen
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-# END OF COPYRIGHT #
-
-from string import *
-import re
-from yappsrt import *
-
-class IMAPScanner(Scanner):
- patterns = [
- ('":"', re.compile(':')),
- ("r'(?i)MIME'", re.compile('(?i)MIME')),
- ("r'(?i)UNSEEN'", re.compile('(?i)UNSEEN')),
- ("r'(?i)UIDVALIDITY'", re.compile('(?i)UIDVALIDITY')),
- ("r'(?i)UIDNEXT'", re.compile('(?i)UIDNEXT')),
- ("r'(?i)TRYCREATE'", re.compile('(?i)TRYCREATE')),
- ("r'(?i)READ-WRITE'", re.compile('(?i)READ-WRITE')),
- ("r'(?i)READ-ONLY'", re.compile('(?i)READ-ONLY')),
- ("r'(?i)PERMANENTFLAGS'", re.compile('(?i)PERMANENTFLAGS')),
- ("r'(?i)PARSE'", re.compile('(?i)PARSE')),
- ("r'(?i)BADCHARSET'", re.compile('(?i)BADCHARSET')),
- ("r'(?i)ALERT'", re.compile('(?i)ALERT')),
- ("r'(?i)BYE'", re.compile('(?i)BYE')),
- ('"\\\\\\\\"', re.compile('\\\\')),
- ('"\\""', re.compile('"')),
- ("r'(?i)NIL'", re.compile('(?i)NIL')),
- ("r'(?i)UID'", re.compile('(?i)UID')),
- ("r'(?i)BODY'", re.compile('(?i)BODY')),
- ("r'(?i)RFC822\\.SIZE'", re.compile('(?i)RFC822\\.SIZE')),
- ("r'(?i)INTERNALDATE'", re.compile('(?i)INTERNALDATE')),
- ("r'(?i)ENVELOPE'", re.compile('(?i)ENVELOPE')),
- ("r'(?i)FLAGS'", re.compile('(?i)FLAGS')),
- ("r'(?i)FETCH'", re.compile('(?i)FETCH')),
- ("r'(?i)EXPUNGE'", re.compile('(?i)EXPUNGE')),
- ("r'(?i)TEXT'", re.compile('(?i)TEXT')),
- ('"(?i)STATUS"', re.compile('(?i)STATUS')),
- ('"(?i)SEARCH"', re.compile('(?i)SEARCH')),
- ('"(?i)(LIST|LSUB)"', re.compile('(?i)(LIST|LSUB)')),
- ('"(?i)FLAGS"', re.compile('(?i)FLAGS')),
- ('"INBOX"', re.compile('INBOX')),
- ("r'\\}'", re.compile('\\}')),
- ("r'\\{'", re.compile('\\{')),
- ("r'(?i)\\\\Recent'", re.compile('(?i)\\\\Recent')),
- ('"(?i)IMAP4rev1"', re.compile('(?i)IMAP4rev1')),
- ('"(?i)CAPABILITY"', re.compile('(?i)CAPABILITY')),
- ('"(?i)AUTH="', re.compile('(?i)AUTH=')),
- ('"="', re.compile('=')),
- ('"=="', re.compile('==')),
- ('"(?i)AUTHENTICATE"', re.compile('(?i)AUTHENTICATE')),
- ('END', re.compile('$')),
- ('LPAREN', re.compile('\\(')),
- ('RPAREN', re.compile('\\)')),
- ('PLUS', re.compile('\\+')),
- ('DASH', re.compile('-')),
- ('BACKSLASH', re.compile('\\\\')),
- ('ASTERISK', re.compile('\\*')),
- ('LBRACKET', re.compile('\\[')),
- ('RBRACKET', re.compile('\\]')),
- ('PERIOD', re.compile('\\.')),
- ('PLUSMINUS', re.compile('[+-]')),
- ('LT', re.compile('<')),
- ('GT', re.compile('>')),
- ('ALPHA', re.compile('[a-zA-Z]')),
- ('DQUOTE', re.compile('"')),
- ('DIGIT', re.compile('[0-9]')),
- ('DIGITx2', re.compile('[0-9]{2}')),
- ('DIGITx4', re.compile('[0-9]{4}')),
- ('SP', re.compile('\\ ')),
- ('CRLF', re.compile('\\r\\n')),
- ('CTL', re.compile('[\\x00-\\x1f\\x7f]')),
- ('ATOM_CHAR', re.compile('(?![(){ \\x00-\\x1f\\x7f%*"\\\\\\]])[\\x01-\\x7f]')),
- ('atom_specials_tok', re.compile('[()}]')),
- ('base64_char', re.compile('[a-zA-Z0-9+/]')),
- ('base64_char_x2', re.compile('[a-zA-Z0-9+/]{2}')),
- ('base64_char_x3', re.compile('[a-zA-Z0-9+/]{3}')),
- ('base64_char_x4', re.compile('[a-zA-Z0-9+/]{4}')),
- ('CHAR8', re.compile('[\\x01-\\xff]')),
- ('date_day', re.compile('[0-9]{1,2}')),
- ('date_day_fixed', re.compile('[ 0-9][0-9]')),
- ('date_month', re.compile('(?i)(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)')),
- ('date_year', re.compile('[0-9]{4}')),
- ('digit_nz', re.compile('[1-9]')),
- ('flag_custom_base', re.compile('(?i)\\\\(Answered|Flagged|Deleted|Seen|Draft)')),
- ('list_wildcards', re.compile('[%*]')),
- ('mailbox_data_tok', re.compile('(?i)(EXISTS|RECENT)')),
- ('mbx_list_sflag', re.compile('(?i)\\\\(Noselect|Marked|Unmarked)')),
- ('media_basic_tok', re.compile('(?i)(APPLICATION|AUDIO|IMAGE|MESSAGE|VIDEO)')),
- ('media_message', re.compile('(?i)"MESSAGE" "RFC822"')),
- ('msg_att_static_tok', re.compile('(?i)RFC822(\\.HEADER|\\.TEXT){0,1}')),
- ('msg_att_static_bodytok', re.compile('(?i)BODY(STRUCTURE){0,1}')),
- ('number_tok', re.compile('[0-9]+')),
- ('nz_number_tok', re.compile('[1-9][0-9]*')),
- ('QUOTED_CHAR_TOK', re.compile('(?![\\n\\r"\\\\])[\\x01-\\x7f]')),
- ('quoted_specials', re.compile('["\\\\]')),
- ('resp_cond_auth_tok', re.compile('(?i)(OK|PREAUTH)')),
- ('resp_cond_state_tok', re.compile('(?i)(OK|NO|BAD)')),
- ('resp_specials', re.compile('\\]')),
- ('RESP_TEXT_CHAR', re.compile('(?![\\n\\r\\]])[\\x01-\\x7f]')),
- ('section_msgtext_tok', re.compile('(?i)HEADER(\\.FIELDS){0,1}(\\.NOT){0,1}')),
- ('status_att', re.compile('(?i)(MESSAGES|RECENT|UIDNEXT|UIDVALIDITY|UNSEEN)')),
- ('TAG_ATOM_CHAR', re.compile('(?![+(){ \\x00-\\x1f\\x7f%*"\\\\\\]])[\\x01-\\x7f]')),
- ('TEXT_CHAR', re.compile('(?![\\n\\r])[\\x01-\\x7f]')),
- ]
- def __init__(self, str):
- Scanner.__init__(self,None,[],str)
-
-class IMAP(Parser):
- def goal(self):
- response = self.response()
- END = self._scan('END')
- return response
-
- def goal_connect(self):
- response_data = self.response_data()
- END = self._scan('END')
- return response_data
-
- def address(self):
- LPAREN = self._scan('LPAREN')
- addr_name = self.addr_name()
- SP = self._scan('SP')
- addr_adl = self.addr_adl()
- SP = self._scan('SP')
- addr_mailbox = self.addr_mailbox()
- SP = self._scan('SP')
- addr_host = self.addr_host()
- RPAREN = self._scan('RPAREN')
- return {'name': addr_name, 'adl': addr_adl, 'mailbox': addr_mailbox, 'host': addr_host}
-
- def addr_adl(self):
- nstring = self.nstring()
- return nstring
-
- def addr_host(self):
- nstring = self.nstring()
- return nstring
-
- def addr_mailbox(self):
- nstring = self.nstring()
- return nstring
-
- def addr_name(self):
- nstring = self.nstring()
- return nstring
-
- def astring(self):
- _token_ = self._peek('"\\""', "r'\\{'", 'ATOM_CHAR', 'resp_specials')
- if _token_ not in ['ATOM_CHAR', 'resp_specials']:
- string = self.string()
- return string
- else: # in ['ATOM_CHAR', 'resp_specials']
- v = ''
- while 1:
- ASTRING_CHAR = self.ASTRING_CHAR()
- v += ASTRING_CHAR
- if self._peek('ATOM_CHAR', 'resp_specials', 'SP', 'RPAREN', 'CRLF') not in ['ATOM_CHAR', 'resp_specials']: break
- return v
-
- def atom(self):
- v = ''
- while 1:
- ATOM_CHAR = self._scan('ATOM_CHAR')
- v += ATOM_CHAR
- if self._peek('ATOM_CHAR', 'SP', 'RESP_TEXT_CHAR', 'CRLF', 'RBRACKET', '"(?i)IMAP4rev1"', 'RPAREN') != 'ATOM_CHAR': break
- return v
-
- def ASTRING_CHAR(self):
- _token_ = self._peek('ATOM_CHAR', 'resp_specials')
- if _token_ == 'ATOM_CHAR':
- ATOM_CHAR = self._scan('ATOM_CHAR')
- return ATOM_CHAR
- else: # == 'resp_specials'
- resp_specials = self._scan('resp_specials')
- return resp_specials
-
- def atom_specials(self):
- _token_ = self._peek('atom_specials_tok', 'SP', 'CTL', 'list_wildcards', 'quoted_specials', 'resp_specials')
- if _token_ == 'atom_specials_tok':
- atom_specials_tok = self._scan('atom_specials_tok')
- return atom_specials_tok
- elif _token_ == 'SP':
- SP = self._scan('SP')
- return SP
- elif _token_ == 'CTL':
- CTL = self._scan('CTL')
- return CTL
- elif _token_ == 'list_wildcards':
- list_wildcards = self._scan('list_wildcards')
- return list_wildcards
- elif _token_ == 'quoted_specials':
- quoted_specials = self._scan('quoted_specials')
- return quoted_specials
- else: # == 'resp_specials'
- resp_specials = self._scan('resp_specials')
- return resp_specials
-
- def authenticate(self):
- self._scan('"(?i)AUTHENTICATE"')
- SP = self._scan('SP')
- auth_type = self.auth_type()
- v = {'auth_type': auth_type}
- if 1:
- CRLF = self._scan('CRLF')
- base64 = self.base64()
- v['base64'] = base64
- return v
-
- def auth_type(self):
- atom = self.atom()
- return atom
-
- def base64(self):
- v = ''
- while self._peek('base64_char_x4', 'base64_char_x2', 'base64_char_x3', 'CRLF') == 'base64_char_x4':
- self._scan('base64_char_x4')
- v += base64_char_x4
- if self._peek('base64_char_x2', 'base64_char_x3', 'CRLF') != 'CRLF':
- base64_terminal = self.base64_terminal()
- v += base64_terminal
- return v
-
- def base64_terminal(self):
- _token_ = self._peek('base64_char_x2', 'base64_char_x3')
- if _token_ == 'base64_char_x2':
- self._scan('base64_char_x2')
- self._scan('"=="')
- return base64_char_x2 + "=="
- else: # == 'base64_char_x3'
- self._scan('base64_char_x3')
- self._scan('"="')
- return base64_char_x3 + "="
-
- def body(self):
- LPAREN = self._scan('LPAREN')
- _token_ = self._peek('LPAREN', 'media_message', 'DQUOTE', '"\\""', "r'\\{'")
- if _token_ != 'LPAREN':
- body_type_1part = self.body_type_1part()
- return body_type_1part
- else: # == 'LPAREN'
- body_type_mpart = self.body_type_mpart()
- return body_type_mpart
- RPAREN = self._scan('RPAREN')
-
- def body_extension(self):
- _token_ = self._peek('LPAREN', "r'(?i)NIL'", 'number_tok', '"\\""', "r'\\{'")
- if _token_ not in ['LPAREN', 'number_tok']:
- nstring = self.nstring()
- v = nstring
- elif _token_ == 'number_tok':
- number = self.number()
- v = number
- else: # == 'LPAREN'
- LPAREN = self._scan('LPAREN')
- body_extension = self.body_extension()
- v = [body_extension]
- while self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- body_extension = self.body_extension()
- v.append(body_extension)
- return v
-
- def body_ext_1part(self):
- body_fld_md5 = self.body_fld_md5()
- v = {'md5': body_fld_md5, 'extension': []}
- if self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- body_fld_dsp = self.body_fld_dsp()
- v['dsp'] = body_fld_dsp
- if self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- body_fld_lang = self.body_fld_lang()
- v['lang'] = body_fld_lang
- if self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- body_fld_loc = self.body_fld_loc()
- v['loc'] = body_fld_loc
- while self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- body_extension = self.body_extension()
- v['extension'].append(body_extension)
- return v
-
- def body_ext_mpart(self):
- body_fld_param = self.body_fld_param()
- v = {'param': body_fld_param, 'extension': []}
- if self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- body_fld_dsp = self.body_fld_dsp()
- v['dsp'] = body_fld_dsp
- if self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- body_fld_lang = self.body_fld_lang()
- v['lang'] = body_fld_lang
- if self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- body_fld_loc = self.body_fld_loc()
- v['loc'] = body_fld_loc
- while self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- body_extension = self.body_extension()
- v['extension'].append(body_extension)
- return v
-
- def body_fields(self):
- body_fld_param = self.body_fld_param()
- SP = self._scan('SP')
- body_fld_id = self.body_fld_id()
- SP = self._scan('SP')
- body_fld_desc = self.body_fld_desc()
- SP = self._scan('SP')
- body_fld_enc = self.body_fld_enc()
- SP = self._scan('SP')
- body_fld_octets = self.body_fld_octets()
- return {'param': body_fld_param, 'id': body_fld_id, 'desc': body_fld_desc, 'enc': body_fld_enc, 'octets': body_fld_octets}
-
- def body_fld_desc(self):
- nstring = self.nstring()
- return nstring
-
- def body_fld_dsp(self):
- _token_ = self._peek('LPAREN', "r'(?i)NIL'")
- if _token_ == "r'(?i)NIL'":
- nil = self.nil()
- v = nil
- else: # == 'LPAREN'
- LPAREN = self._scan('LPAREN')
- string = self.string()
- SP = self._scan('SP')
- body_fld_param = self.body_fld_param()
- RPAREN = self._scan('RPAREN')
- v = [string, body_fld_param]
- return v
-
- def body_fld_enc(self):
- string = self.string()
- return string
-
- def body_fld_id(self):
- nstring = self.nstring()
- return nstring
-
- def body_fld_lang(self):
- _token_ = self._peek('LPAREN', "r'(?i)NIL'", '"\\""', "r'\\{'")
- if _token_ != 'LPAREN':
- nstring = self.nstring()
- v = [nstring]
- else: # == 'LPAREN'
- LPAREN = self._scan('LPAREN')
- string = self.string()
- v = [string]
- while self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- string = self.string()
- v.append(string)
- return v
-
- def body_fld_loc(self):
- nstring = self.nstring()
- return nstring
-
- def body_fld_lines(self):
- number = self.number()
- return number
-
- def body_fld_md5(self):
- nstring = self.nstring()
- return nstring
-
- def body_fld_octets(self):
- number = self.number()
- return number
-
- def body_fld_param(self):
- _token_ = self._peek('LPAREN', "r'(?i)NIL'")
- if _token_ == "r'(?i)NIL'":
- nil = self.nil()
- v = nil
- else: # == 'LPAREN'
- LPAREN = self._scan('LPAREN')
- v = []
- string = self.string()
- x = string
- SP = self._scan('SP')
- string = self.string()
- v.append([x, string])
- while self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- string = self.string()
- x = string
- SP = self._scan('SP')
- string = self.string()
- v.append([x, string])
- RPAREN = self._scan('RPAREN')
- return v
-
- def body_type_1part(self):
- _token_ = self._peek('media_message', 'DQUOTE', '"\\""', "r'\\{'")
- if _token_ not in ['media_message', 'DQUOTE']:
- body_type_basic = self.body_type_basic()
- v = [body_type_basic]
- elif _token_ == 'media_message':
- body_type_msg = self.body_type_msg()
- v = [body_type_msg]
- else: # == 'DQUOTE'
- body_type_text = self.body_type_text()
- v = [body_type_text]
- if self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- body_ext_1part = self.body_ext_1part()
- v.append(body_ext_1part)
- return v
-
- def body_type_basic(self):
- media_basic = self.media_basic()
- v = {'media_basic': media_basic}
- SP = self._scan('SP')
- body_fields = self.body_fields()
- v['body_fields'] = body_fields
- return v
-
- def body_type_mpart(self):
- v_body = []
- while 1:
- body = self.body()
- v_body.append(body)
- if self._peek('LPAREN', 'SP') != 'LPAREN': break
- v = {'body': v_body}
- SP = self._scan('SP')
- media_subtype = self.media_subtype()
- v['media_subtype'] = media_subtype
- if self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- body_ext_mpart = self.body_ext_mpart()
- v['body_ext_mpart'] = body_ext_mpart
- return v
-
- def body_type_msg(self):
- media_message = self._scan('media_message')
- SP = self._scan('SP')
- body_fields = self.body_fields()
- SP = self._scan('SP')
- envelope = self.envelope()
- SP = self._scan('SP')
- body = self.body()
- SP = self._scan('SP')
- body_fld_lines = self.body_fld_lines()
- return {'media_message': media_message, 'body_fields': body_fields,'envelope': envelope, 'body': body, 'bofy_fld_lines': body_fld_lines}
-
- def body_type_text(self):
- media_text = self.media_text()
- SP = self._scan('SP')
- body_fields = self.body_fields()
- SP = self._scan('SP')
- body_fld_lines = self.body_fld_lines()
- return {'media_text': media_text, 'body_fields': body_fields, 'body_fld_lines': body_fld_lines}
-
- def capability(self):
- _token_ = self._peek('"(?i)AUTH="', 'ATOM_CHAR')
- if _token_ == '"(?i)AUTH="':
- self._scan('"(?i)AUTH="')
- auth_type = self.auth_type()
- v = "AUTH=" + auth_type
- else: # == 'ATOM_CHAR'
- atom = self.atom()
- v = atom
- return v
-
- def capability_data(self):
- self._scan('"(?i)CAPABILITY"')
- v = []
- while self._peek('SP', '"(?i)IMAP4rev1"') == 'SP':
- SP = self._scan('SP')
- capability = self.capability()
- v.append(capability)
- self._scan('"(?i)IMAP4rev1"')
- v.append("IMAP4rev1")
- while self._peek('SP', 'RESP_TEXT_CHAR', 'CRLF', 'RBRACKET') == 'SP':
- SP = self._scan('SP')
- capability = self.capability()
- v.append(capability)
- return v
-
- def continue_req(self):
- PLUS = self._scan('PLUS')
- SP = self._scan('SP')
- _token_ = self._peek('base64_char_x4', 'CRLF', 'LBRACKET', 'base64_char_x2', 'base64_char_x3', 'TEXT_CHAR')
- if _token_ in ['LBRACKET', 'TEXT_CHAR']:
- resp_text = self.resp_text()
- v = resp_text
- else:
- base64 = self.base64()
- v = base64
- CRLF = self._scan('CRLF')
- return v
-
- def date(self):
- _token_ = self._peek('DQUOTE', 'date_day')
- if _token_ == 'date_day':
- date_text = self.date_text()
- else: # == 'DQUOTE'
- DQUOTE = self._scan('DQUOTE')
- date_text = self.date_text()
- DQUOTE = self._scan('DQUOTE')
- return date_text
-
- def date_text(self):
- date_day = self._scan('date_day')
- DASH = self._scan('DASH')
- date_month = self._scan('date_month')
- DASH = self._scan('DASH')
- date_year = self._scan('date_year')
- return {'day': int(date_day), 'month': date_month, 'year': int(date_year)}
-
- def date_time(self):
- DQUOTE = self._scan('DQUOTE')
- date_day_fixed = self._scan('date_day_fixed')
- DASH = self._scan('DASH')
- date_month = self._scan('date_month')
- DASH = self._scan('DASH')
- date_year = self._scan('date_year')
- SP = self._scan('SP')
- time = self.time()
- SP = self._scan('SP')
- zone = self.zone()
- DQUOTE = self._scan('DQUOTE')
- return {'day': int(date_day_fixed.strip()), 'month': date_month, 'year': int(date_year),'time': time, 'zone': zone}
-
- def envelope(self):
- LPAREN = self._scan('LPAREN')
- env_date = self.env_date()
- SP = self._scan('SP')
- env_subject = self.env_subject()
- SP = self._scan('SP')
- env_from = self.env_from()
- SP = self._scan('SP')
- env_sender = self.env_sender()
- SP = self._scan('SP')
- env_reply_to = self.env_reply_to()
- SP = self._scan('SP')
- env_to = self.env_to()
- SP = self._scan('SP')
- env_cc = self.env_cc()
- SP = self._scan('SP')
- env_bcc = self.env_bcc()
- SP = self._scan('SP')
- env_in_reply_to = self.env_in_reply_to()
- SP = self._scan('SP')
- env_message_id = self.env_message_id()
- RPAREN = self._scan('RPAREN')
- return {'date': env_date, 'subject': env_subject, 'from': env_from, 'sender': env_sender, 'reply_to': env_reply_to, 'to': env_to, 'cc': env_cc, 'bcc': env_bcc, 'in_reply_to': env_in_reply_to, 'message_id': env_message_id }
-
- def env_custom_addrs(self):
- _token_ = self._peek('LPAREN', "r'(?i)NIL'")
- if _token_ == "r'(?i)NIL'":
- nil = self.nil()
- v = []
- else: # == 'LPAREN'
- LPAREN = self._scan('LPAREN')
- v = []
- while 1:
- address = self.address()
- v.append(address)
- if self._peek('LPAREN', 'RPAREN') != 'LPAREN': break
- RPAREN = self._scan('RPAREN')
- return v
-
- def env_bcc(self):
- env_custom_addrs = self.env_custom_addrs()
- return env_custom_addrs
-
- def env_cc(self):
- env_custom_addrs = self.env_custom_addrs()
- return env_custom_addrs
-
- def env_date(self):
- nstring = self.nstring()
- return nstring
-
- def env_from(self):
- env_custom_addrs = self.env_custom_addrs()
- return env_custom_addrs
-
- def env_in_reply_to(self):
- nstring = self.nstring()
- return nstring
-
- def env_message_id(self):
- nstring = self.nstring()
- return nstring
-
- def env_reply_to(self):
- env_custom_addrs = self.env_custom_addrs()
- return env_custom_addrs
-
- def env_sender(self):
- env_custom_addrs = self.env_custom_addrs()
- return env_custom_addrs
-
- def env_subject(self):
- nstring = self.nstring()
- return nstring
-
- def env_to(self):
- env_custom_addrs = self.env_custom_addrs()
- return env_custom_addrs
-
- def flag(self):
- _token_ = self._peek('flag_custom_base', 'ATOM_CHAR', 'BACKSLASH')
- if _token_ == 'flag_custom_base':
- flag_custom_base = self._scan('flag_custom_base')
- v = flag_custom_base
- elif _token_ == 'ATOM_CHAR':
- flag_keyword = self.flag_keyword()
- v = flag_keyword
- else: # == 'BACKSLASH'
- flag_extension = self.flag_extension()
- v = flag_extension
- return v
-
- def flag_extension(self):
- BACKSLASH = self._scan('BACKSLASH')
- atom = self.atom()
- return "\\" + atom
-
- def flag_fetch(self):
- _token_ = self._peek('flag_custom_base', "r'(?i)\\\\Recent'", 'ATOM_CHAR', 'BACKSLASH')
- if _token_ != "r'(?i)\\\\Recent'":
- flag = self.flag()
- v = flag
- else: # == "r'(?i)\\\\Recent'"
- self._scan("r'(?i)\\\\Recent'")
- v = "\\Recent"
- return v
-
- def flag_keyword(self):
- atom = self.atom()
- return atom
-
- def flag_list(self):
- LPAREN = self._scan('LPAREN')
- v = []
- if self._peek('flag_custom_base', 'SP', 'RPAREN', 'ATOM_CHAR', 'BACKSLASH') not in ['SP', 'RPAREN']:
- flag = self.flag()
- v.append(flag)
- while self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- flag = self.flag()
- v.append(flag)
- RPAREN = self._scan('RPAREN')
- return v
-
- def flag_perm(self):
- flag = self.flag()
- v = flag
- return v
-
- def greeting(self):
- ASTERISK = self._scan('ASTERISK')
- SP = self._scan('SP')
- _token_ = self._peek('resp_cond_auth_tok', "r'(?i)BYE'")
- if _token_ == 'resp_cond_auth_tok':
- resp_cond_auth = self.resp_cond_auth()
- v = resp_cond_auth
- else: # == "r'(?i)BYE'"
- resp_cond_bye = self.resp_cond_bye()
- v = resp_cond_bye
- CRLF = self._scan('CRLF')
- return v
-
- def header_fld_name(self):
- astring = self.astring()
- return astring
-
- def header_list(self):
- LPAREN = self._scan('LPAREN')
- header_fld_name = self.header_fld_name()
- v = [header_fld_name]
- while self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- header_fld_name = self.header_fld_name()
- v.append(header_fld_name)
- RPAREN = self._scan('RPAREN')
- return v
-
- def list_char(self):
- _token_ = self._peek('ATOM_CHAR', 'list_wildcards', 'resp_specials')
- if _token_ == 'ATOM_CHAR':
- ATOM_CHAR = self._scan('ATOM_CHAR')
- v = ATOM_CHAR
- elif _token_ == 'list_wildcards':
- list_wildcards = self._scan('list_wildcards')
- v = list_wildcards
- else: # == 'resp_specials'
- resp_specials = self._scan('resp_specials')
- v = resp_specials
- return v
-
- def literal(self):
- self._scan("r'\\{'")
- number = self.number()
- self._scan("r'\\}'")
- CRLF = self._scan('CRLF')
- literal_load = self.literal_load(number)
- return literal_load
-
- def literal_load(self, X):
- count = 0
- data = ''
- while self._peek('CHAR8', 'SP', 'RPAREN', 'CRLF') == 'CHAR8':
- if count == X: break
- self._scan('CHAR8')
- count += 1
- data += CHAR8
- return data
-
- def mailbox(self):
- _token_ = self._peek('"INBOX"', '"\\""', "r'\\{'", 'ATOM_CHAR', 'resp_specials')
- if _token_ == '"INBOX"':
- self._scan('"INBOX"')
- v = "INBOX"
- else: # in ['"\\""', "r'\\{'", 'ATOM_CHAR', 'resp_specials']
- astring = self.astring()
- v = astring
- return v
-
- def mailbox_data(self):
- v = {}
- _token_ = self._peek('"(?i)FLAGS"', '"(?i)(LIST|LSUB)"', '"(?i)SEARCH"', '"(?i)STATUS"', 'number_tok')
- if _token_ == '"(?i)FLAGS"':
- self._scan('"(?i)FLAGS"')
- SP = self._scan('SP')
- flag_list = self.flag_list()
- v['flags'] = flag_list
- elif _token_ == '"(?i)(LIST|LSUB)"':
- self._scan('"(?i)(LIST|LSUB)"')
- SP = self._scan('SP')
- mailbox_list = self.mailbox_list()
- v['list'] = mailbox_list
- elif _token_ == '"(?i)SEARCH"':
- self._scan('"(?i)SEARCH"')
- v['search'] = []
- while self._peek('SP', 'CRLF') == 'SP':
- SP = self._scan('SP')
- nz_number = self.nz_number()
- v['search'].append(nz_number)
- elif _token_ == '"(?i)STATUS"':
- self._scan('"(?i)STATUS"')
- SP = self._scan('SP')
- mailbox = self.mailbox()
- v['status'] = {'mailbox': mailbox}
- SP = self._scan('SP')
- LPAREN = self._scan('LPAREN')
- if self._peek('RPAREN', 'status_att') == 'status_att':
- status_att_list = self.status_att_list()
- v['status']['att'] = status_att_list
- RPAREN = self._scan('RPAREN')
- else: # == 'number_tok'
- number = self.number()
- SP = self._scan('SP')
- mailbox_data_tok = self._scan('mailbox_data_tok')
- v[mailbox_data_tok.upper()] = number
- return v
-
- def mailbox_list(self):
- v = {}
- LPAREN = self._scan('LPAREN')
- if self._peek('RPAREN', 'mbx_list_sflag', 'BACKSLASH') != 'RPAREN':
- mbx_list_flags = self.mbx_list_flags()
- v['flags'] = mbx_list_flags
- RPAREN = self._scan('RPAREN')
- SP = self._scan('SP')
- _token_ = self._peek('DQUOTE', "r'(?i)NIL'")
- if _token_ == "r'(?i)NIL'":
- nil = self.nil()
- v['data'] = nil
- else: # == 'DQUOTE'
- DQUOTE = self._scan('DQUOTE')
- QUOTED_CHAR = self.QUOTED_CHAR()
- DQUOTE = self._scan('DQUOTE')
- v['data'] = QUOTED_CHAR
- SP = self._scan('SP')
- mailbox = self.mailbox()
- v['mailbox'] = mailbox
- return v
-
- def mbx_list_flags(self):
- v = []
- _token_ = self._peek('mbx_list_sflag', 'BACKSLASH')
- if _token_ == 'BACKSLASH':
- mbx_list_oflag = self.mbx_list_oflag()
- v.append(mbx_list_oflag)
- else: # == 'mbx_list_sflag'
- mbx_list_sflag = self._scan('mbx_list_sflag')
- v.append(mbx_list_sflag)
- while self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- _token_ = self._peek('mbx_list_sflag', 'BACKSLASH')
- if _token_ == 'BACKSLASH':
- mbx_list_oflag = self.mbx_list_oflag()
- v.append(mbx_list_oflag)
- else: # == 'mbx_list_sflag'
- mbx_list_sflag = self._scan('mbx_list_sflag')
- v.append(mbx_list_sflag)
- return v
-
- def mbx_list_oflag(self):
- flag_extension = self.flag_extension()
- return flag_extension
-
- def media_basic(self):
- string = self.string()
- SP = self._scan('SP')
- media_subtype = self.media_subtype()
- return (string, media_subtype)
-
- def media_subtype(self):
- string = self.string()
- return string
-
- def media_text(self):
- DQUOTE = self._scan('DQUOTE')
- self._scan("r'(?i)TEXT'")
- DQUOTE = self._scan('DQUOTE')
- SP = self._scan('SP')
- media_subtype = self.media_subtype()
- return ('TEXT', media_subtype)
-
- def message_data(self):
- nz_number = self.nz_number()
- SP = self._scan('SP')
- v = [nz_number]
- _token_ = self._peek("r'(?i)EXPUNGE'", "r'(?i)FETCH'")
- if _token_ == "r'(?i)EXPUNGE'":
- self._scan("r'(?i)EXPUNGE'")
- v.append('EXPUNGE')
- else: # == "r'(?i)FETCH'"
- self._scan("r'(?i)FETCH'")
- SP = self._scan('SP')
- msg_att = self.msg_att()
- v.extend(['FETCH', msg_att])
- return v
-
- def msg_att(self):
- LPAREN = self._scan('LPAREN')
- v = {}
- _token_ = self._peek("r'(?i)FLAGS'", "r'(?i)ENVELOPE'", "r'(?i)INTERNALDATE'", 'msg_att_static_tok', "r'(?i)RFC822\\.SIZE'", 'msg_att_static_bodytok', "r'(?i)BODY'", "r'(?i)UID'")
- if _token_ == "r'(?i)FLAGS'":
- msg_att_dynamic = self.msg_att_dynamic()
- v.update(msg_att_dynamic)
- else:
- msg_att_static = self.msg_att_static()
- v.update(msg_att_static)
- while self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- _token_ = self._peek("r'(?i)FLAGS'", "r'(?i)ENVELOPE'", "r'(?i)INTERNALDATE'", 'msg_att_static_tok', "r'(?i)RFC822\\.SIZE'", 'msg_att_static_bodytok', "r'(?i)BODY'", "r'(?i)UID'")
- if _token_ == "r'(?i)FLAGS'":
- msg_att_dynamic = self.msg_att_dynamic()
- v.update(msg_att_dynamic)
- else:
- msg_att_static = self.msg_att_static()
- v.update(msg_att_static)
- RPAREN = self._scan('RPAREN')
- return v
-
- def msg_att_dynamic(self):
- self._scan("r'(?i)FLAGS'")
- SP = self._scan('SP')
- LPAREN = self._scan('LPAREN')
- v = []
- if self._peek('flag_custom_base', "r'(?i)\\\\Recent'", 'SP', 'RPAREN', 'ATOM_CHAR', 'BACKSLASH') not in ['SP', 'RPAREN']:
- flag_fetch = self.flag_fetch()
- v.append(flag_fetch)
- while self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- flag_fetch = self.flag_fetch()
- v.append(flag_fetch)
- RPAREN = self._scan('RPAREN')
- return {'FLAGS': v}
-
- def msg_att_static(self):
- _token_ = self._peek("r'(?i)ENVELOPE'", "r'(?i)INTERNALDATE'", 'msg_att_static_tok', "r'(?i)RFC822\\.SIZE'", 'msg_att_static_bodytok', "r'(?i)BODY'", "r'(?i)UID'")
- if _token_ == "r'(?i)ENVELOPE'":
- self._scan("r'(?i)ENVELOPE'")
- SP = self._scan('SP')
- envelope = self.envelope()
- t = 'ENVELOPE'
- v = envelope
- elif _token_ == "r'(?i)INTERNALDATE'":
- self._scan("r'(?i)INTERNALDATE'")
- SP = self._scan('SP')
- date_time = self.date_time()
- t = 'INTERNALDATE'
- v = date_time
- elif _token_ == 'msg_att_static_tok':
- msg_att_static_tok = self._scan('msg_att_static_tok')
- SP = self._scan('SP')
- nstring = self.nstring()
- t = msg_att_static_tok
- v=nstring
- elif _token_ == "r'(?i)RFC822\\.SIZE'":
- self._scan("r'(?i)RFC822\\.SIZE'")
- SP = self._scan('SP')
- number = self.number()
- t = 'RFC822.SIZE'
- v=number
- elif _token_ == 'msg_att_static_bodytok':
- msg_att_static_bodytok = self._scan('msg_att_static_bodytok')
- SP = self._scan('SP')
- body = self.body()
- t=msg_att_static_bodytok
- v=body
- elif _token_ == "r'(?i)BODY'":
- self._scan("r'(?i)BODY'")
- t='BODYsect'
- section = self.section()
- v = {'section': section}
- if self._peek('LT', 'SP') == 'LT':
- LT = self._scan('LT')
- number = self.number()
- GT = self._scan('GT')
- v['number'] = number
- SP = self._scan('SP')
- nstring = self.nstring()
- v['nstring'] = nstring
- else: # == "r'(?i)UID'"
- self._scan("r'(?i)UID'")
- SP = self._scan('SP')
- uniqueid = self.uniqueid()
- t='UID'
- v = uniqueid
- return {t: v}
-
- def nil(self):
- self._scan("r'(?i)NIL'")
- return None
-
- def nstring(self):
- _token_ = self._peek("r'(?i)NIL'", '"\\""', "r'\\{'")
- if _token_ != "r'(?i)NIL'":
- string = self.string()
- v = string
- else: # == "r'(?i)NIL'"
- nil = self.nil()
- v = nil
- return v
-
- def number(self):
- number_tok = self._scan('number_tok')
- return long(number_tok)
-
- def nz_number(self):
- nz_number_tok = self._scan('nz_number_tok')
- return long(nz_number_tok)
-
- def password(self):
- astring = self.astring()
- return astring
-
- def quoted(self):
- self._scan('"\\""')
- v = ''
- while self._peek('"\\""', 'QUOTED_CHAR_TOK', '"\\\\\\\\"') != '"\\""':
- QUOTED_CHAR = self.QUOTED_CHAR()
- v += QUOTED_CHAR
- self._scan('"\\""')
- return v
-
- def QUOTED_CHAR(self):
- _token_ = self._peek('QUOTED_CHAR_TOK', '"\\\\\\\\"')
- if _token_ == 'QUOTED_CHAR_TOK':
- QUOTED_CHAR_TOK = self._scan('QUOTED_CHAR_TOK')
- return QUOTED_CHAR_TOK
- else: # == '"\\\\\\\\"'
- self._scan('"\\\\\\\\"')
- quoted_specials = self._scan('quoted_specials')
- return quoted_specials
-
- def response(self):
- v = []
- while self._peek('PLUS', 'ASTERISK', 'TAG_ATOM_CHAR', 'resp_specials') in ['PLUS', 'ASTERISK']:
- _token_ = self._peek('PLUS', 'ASTERISK')
- if _token_ == 'PLUS':
- continue_req = self.continue_req()
- v.append(continue_req)
- else: # == 'ASTERISK'
- response_data = self.response_data()
- v.append(response_data)
- response_done = self.response_done()
- return [response_done] + v
-
- def response_data(self):
- ASTERISK = self._scan('ASTERISK')
- SP = self._scan('SP')
- _token_ = self._peek('"(?i)FLAGS"', '"(?i)(LIST|LSUB)"', '"(?i)SEARCH"', '"(?i)STATUS"', '"(?i)CAPABILITY"', 'resp_cond_state_tok', "r'(?i)BYE'", 'number_tok', 'nz_number_tok')
- if _token_ == 'resp_cond_state_tok':
- resp_cond_state = self.resp_cond_state()
- v = resp_cond_state
- elif _token_ == "r'(?i)BYE'":
- resp_cond_bye = self.resp_cond_bye()
- v = resp_cond_bye
- elif _token_ not in ['"(?i)CAPABILITY"', 'nz_number_tok']:
- mailbox_data = self.mailbox_data()
- v = mailbox_data
- elif _token_ == 'nz_number_tok':
- message_data = self.message_data()
- v = message_data
- else: # == '"(?i)CAPABILITY"'
- capability_data = self.capability_data()
- v = capability_data
- CRLF = self._scan('CRLF')
- return v
-
- def response_done(self):
- _token_ = self._peek('ASTERISK', 'TAG_ATOM_CHAR', 'resp_specials')
- if _token_ != 'ASTERISK':
- response_tagged = self.response_tagged()
- v = response_tagged
- else: # == 'ASTERISK'
- response_fatal = self.response_fatal()
- v = response_fatal
- return v
-
- def response_fatal(self):
- ASTERISK = self._scan('ASTERISK')
- SP = self._scan('SP')
- resp_cond_bye = self.resp_cond_bye()
- CRLF = self._scan('CRLF')
- return resp_cond_bye
-
- def response_tagged(self):
- tag = self.tag()
- SP = self._scan('SP')
- resp_cond_state = self.resp_cond_state()
- CRLF = self._scan('CRLF')
- return {'tag': tag, 'state': resp_cond_state}
-
- def resp_cond_auth(self):
- resp_cond_auth_tok = self._scan('resp_cond_auth_tok')
- SP = self._scan('SP')
- resp_text = self.resp_text()
- return {'result': resp_cond_auth_tok, 'detail': resp_text}
-
- def resp_cond_bye(self):
- self._scan("r'(?i)BYE'")
- SP = self._scan('SP')
- resp_text = self.resp_text()
- return {'result': BYE, 'detail': resp_text}
-
- def resp_cond_state(self):
- resp_cond_state_tok = self._scan('resp_cond_state_tok')
- SP = self._scan('SP')
- resp_text = self.resp_text()
- return {'result': resp_cond_state_tok, 'detail': resp_text}
-
- def resp_text(self):
- v = {}
- if self._peek('LBRACKET', 'TEXT_CHAR') == 'LBRACKET':
- LBRACKET = self._scan('LBRACKET')
- resp_text_code = self.resp_text_code()
- RBRACKET = self._scan('RBRACKET')
- SP = self._scan('SP')
- v['code'] = resp_text_code
- text = self.text()
- v['text'] = text
- return v
-
- def resp_text_code(self):
- _token_ = self._peek("r'(?i)ALERT'", "r'(?i)BADCHARSET'", '"(?i)CAPABILITY"', "r'(?i)PARSE'", "r'(?i)PERMANENTFLAGS'", "r'(?i)READ-ONLY'", "r'(?i)READ-WRITE'", "r'(?i)TRYCREATE'", "r'(?i)UIDNEXT'", "r'(?i)UIDVALIDITY'", "r'(?i)UNSEEN'", 'ATOM_CHAR')
- if _token_ == "r'(?i)ALERT'":
- self._scan("r'(?i)ALERT'")
- v = ['ALERT']
- elif _token_ == "r'(?i)BADCHARSET'":
- self._scan("r'(?i)BADCHARSET'")
- v = ['BADCHARSET']
- if self._peek('SP', 'RESP_TEXT_CHAR', 'RBRACKET') == 'SP':
- SP = self._scan('SP')
- LPAREN = self._scan('LPAREN')
- astring = self.astring()
- v.append(astring)
- while self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- astring = self.astring()
- v.append(astring)
- RPAREN = self._scan('RPAREN')
- elif _token_ == '"(?i)CAPABILITY"':
- capability_data = self.capability_data()
- v = [capability_data]
- elif _token_ == "r'(?i)PARSE'":
- self._scan("r'(?i)PARSE'")
- v = ['PARSE']
- elif _token_ == "r'(?i)PERMANENTFLAGS'":
- self._scan("r'(?i)PERMANENTFLAGS'")
- SP = self._scan('SP')
- LPAREN = self._scan('LPAREN')
- v = ['PERMANENTFLAGS']
- if self._peek('flag_custom_base', 'SP', 'RPAREN', 'ATOM_CHAR', 'BACKSLASH') not in ['SP', 'RPAREN']:
- flag_perm = self.flag_perm()
- v.append(flag_perm)
- while self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- flag_perm = self.flag_perm()
- v.append(flag_perm)
- RPAREN = self._scan('RPAREN')
- elif _token_ == "r'(?i)READ-ONLY'":
- self._scan("r'(?i)READ-ONLY'")
- v = ['READ-ONLY']
- elif _token_ == "r'(?i)READ-WRITE'":
- self._scan("r'(?i)READ-WRITE'")
- v = ['READ-WRITE']
- elif _token_ == "r'(?i)TRYCREATE'":
- self._scan("r'(?i)TRYCREATE'")
- v = ['TRYCREATE']
- elif _token_ == "r'(?i)UIDNEXT'":
- self._scan("r'(?i)UIDNEXT'")
- SP = self._scan('SP')
- nz_number = self.nz_number()
- v = ['UIDNEXT', nz_number]
- elif _token_ == "r'(?i)UIDVALIDITY'":
- self._scan("r'(?i)UIDVALIDITY'")
- SP = self._scan('SP')
- nz_number = self.nz_number()
- v = ['UIDVALIDITY', nz_number]
- elif _token_ == "r'(?i)UNSEEN'":
- self._scan("r'(?i)UNSEEN'")
- SP = self._scan('SP')
- nz_number = self.nz_number()
- v = ['UNSEEN', nz_number]
- else: # == 'ATOM_CHAR'
- atom = self.atom()
- v = [atom]
- if self._peek('SP', 'RESP_TEXT_CHAR', 'RBRACKET') == 'SP':
- SP = self._scan('SP')
- v.append('')
- while 1:
- RESP_TEXT_CHAR = self._scan('RESP_TEXT_CHAR')
- v[1] += RESP_TEXT_CHAR
- if self._peek('RESP_TEXT_CHAR', 'RBRACKET') != 'RESP_TEXT_CHAR': break
- return v
-
- def section(self):
- v = None
- LBRACKET = self._scan('LBRACKET')
- if self._peek('RBRACKET', 'section_msgtext_tok', 'nz_number_tok') != 'RBRACKET':
- section_spec = self.section_spec()
- v = section_spec
- RBRACKET = self._scan('RBRACKET')
- return v
-
- def section_msgtext(self):
- section_msgtext_tok = self._scan('section_msgtext_tok')
- v = [section_msgtext_tok]
- SP = self._scan('SP')
- _token_ = self._peek('LPAREN', "r'(?i)TEXT'")
- if _token_ == 'LPAREN':
- header_list = self.header_list()
- v.append(header_list)
- else: # == "r'(?i)TEXT'"
- self._scan("r'(?i)TEXT'")
- v.append('TEXT')
- return v
-
- def section_part(self):
- nz_number = self.nz_number()
- v = str(nz_number)
- while self._peek('PERIOD', 'RBRACKET') == 'PERIOD':
- PERIOD = self._scan('PERIOD')
- nz_number = self.nz_number()
- v += '.' + str(nz_number)
- return v
-
- def section_spec(self):
- _token_ = self._peek('section_msgtext_tok', 'nz_number_tok')
- if _token_ == 'section_msgtext_tok':
- section_msgtext = self.section_msgtext()
- v = {'msgtext': section_msgtext}
- else: # == 'nz_number_tok'
- section_part = self.section_part()
- v = {'part': section_part}
- if self._peek('PERIOD', 'RBRACKET') == 'PERIOD':
- PERIOD = self._scan('PERIOD')
- section_text = self.section_text()
- v['text'] = section_text
- return v
-
- def section_text(self):
- _token_ = self._peek('section_msgtext_tok', "r'(?i)MIME'")
- if _token_ == 'section_msgtext_tok':
- section_msgtext = self.section_msgtext()
- v = section_msgtext
- else: # == "r'(?i)MIME'"
- self._scan("r'(?i)MIME'")
- v = 'MIME'
- return v
-
- def status_att_list(self):
- v = {}
- status_att = self._scan('status_att')
- SP = self._scan('SP')
- number = self.number()
- v[status_att] = number
- while self._peek('SP', 'RPAREN') == 'SP':
- SP = self._scan('SP')
- status_att = self._scan('status_att')
- SP = self._scan('SP')
- number = self.number()
- v[status_att] = number
- return v
-
- def string(self):
- _token_ = self._peek('"\\""', "r'\\{'")
- if _token_ == '"\\""':
- quoted = self.quoted()
- v = quoted
- else: # == "r'\\{'"
- literal = self.literal()
- v = literal
- return v
-
- def TAG_ASTRING_CHAR(self):
- _token_ = self._peek('TAG_ATOM_CHAR', 'resp_specials')
- if _token_ == 'TAG_ATOM_CHAR':
- TAG_ATOM_CHAR = self._scan('TAG_ATOM_CHAR')
- return TAG_ATOM_CHAR
- else: # == 'resp_specials'
- resp_specials = self._scan('resp_specials')
- return resp_specials
-
- def tag(self):
- v = ''
- while 1:
- TAG_ASTRING_CHAR = self.TAG_ASTRING_CHAR()
- v += TAG_ASTRING_CHAR
- if self._peek('TAG_ATOM_CHAR', 'resp_specials', 'SP') not in ['TAG_ATOM_CHAR', 'resp_specials']: break
- return v
-
- def text(self):
- v = ''
- while 1:
- TEXT_CHAR = self._scan('TEXT_CHAR')
- v += TEXT_CHAR
- if self._peek('TEXT_CHAR', 'CRLF') != 'TEXT_CHAR': break
- return v
-
- def time(self):
- self._scan('DIGITx2')
- x = {'hours': DIGITx2}
- self._scan('":"')
- self._scan('DIGITx2')
- x['minutes']= DIGITx2
- self._scan('":"')
- self._scan('DIGITx2')
- x['seconds']= DIGITx2
- return x
-
- def uniqueid(self):
- nz_number = self.nz_number()
- return nz_number
-
- def userid(self):
- astring = self.astring()
- return astring
-
- def zone(self):
- PLUSMINUS = self._scan('PLUSMINUS')
- self._scan('DIGITx4')
- return PLUSMINUS + DIGITx4
-
-
-def parse(rule, text):
- P = IMAP(IMAPScanner(text))
- return wrap_error_reporter(P, rule)
-
-if __name__=='__main__':
- from sys import argv, stdin
- if len(argv) >= 2:
- if len(argv) >= 3:
- f = open(argv[2],'r')
- else:
- f = stdin
- print parse(argv[1], f.read())
- else: print 'Args: <rule> [<filename>]'
Added: imaplib/head/imap2/parser/imapTest.py
==============================================================================
--- imaplib/head/imap2/parser/imapTest.py 2003-07-16 19:33:05 UTC (rev 498)
+++ imaplib/head/imap2/parser/imapTest.py 2003-07-16 19:38:49 UTC (rev 499)
@@ -0,0 +1,49 @@
+# Implementation of grammar from RFC3501
+# $Id: imap.g 494 2003-07-16 18:38:03Z jgoerzen $
+
+# COPYRIGHT #
+# Copyright (C) 2002 John Goerzen
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+# END OF COPYRIGHT #
+
+import unittest
+import GrammarClass
+
+def parse(text, goal = 'goal'):
+ return GrammarClass.parse('goal', text)
+
+class ParseTestCase(unittest.TestCase):
+ # These examples are from the RFC.
+ def test_ex_Connect(self):
+ result = parse("* OK IMAP4rev1 Service Ready\r\n", 'goal_connect')
+ self.assertEquals(result, [])
+
+ def test_ex_Login(self):
+ result = parse("a001 OK LOGIN completed\r\n")
+ self.assertEquals(result, [{'state': {'result': 'OK', 'detail': {'text': 'LOGIN completed'}}, 'tag': 'a001'}])
+
+ def test_ex_Select(self):
+ result = parse("* 18 EXISTS\r\n" + \
+ "* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)\r\n"+\
+ "* 2 RECENT\r\n" + \
+ "* OK [UNSEEN 17] Message 17 is the first unseen message\r\n" + \
+ "* OK [UIDVALIDITY 3857529045] UIDs valid\r\n" +
+ "a002 OK [READ-WRITE] SELECT completed\r\n")
+ self.assertEquals(result, [{'state': {'result': 'OK', 'detail': {'text': 'SELECT completed', 'code': ['READ-WRITE']}}, 'tag': 'a002'}, {'EXISTS': 18L}, {'flags': ['\\Answered', '\\Flagged', '\\Deleted', '\\Seen', '\\Draft']}, {'RECENT': 2L}, {'result': 'OK', 'detail': {'text': 'Message 17 is the first unseen message', 'code': ['UNSEEN', 17L]}}, {'result': 'OK', 'detail': {'text': 'UIDs valid', 'code': ['UIDVALIDITY', 3857529045L]}}])
+
+ def test_Courier_Connect(self):
+ result = parse("* OK [CAPABILITY IMAP4rev1 CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA IDLE AUTH=PLAIN] Courier-IMAP ready. Copyright 1998-2003 Double Precision, Inc. See COPYING for distribution information.\r\n", "goal_connect")
+ self.assertEquals(result, [])