# Directives # ( none) # Start-up Actions { my $subpartCount = 0; my $partCount = 0; } # # Atoms TEXT: /^"TEXT"|^TEXT/i { $return = "TEXT" } PLAIN: /^"PLAIN"|^PLAIN/i { $return = "PLAIN" } HTML: /"HTML"|HTML/i { $return = "HTML" } MESSAGE: /^"MESSAGE"|^MESSAGE/i { $return = "MESSAGE" } RFC822: /^"RFC822"|^RFC822/i { $return = "RFC822" } NIL: /^NIL/i { $return = "NIL" } NUMBER: /^(\d+)/ { $return = $item[1]; $return||defined($return);} # Strings: SINGLE_QUOTED_STRING: "'" /(?:\\'|[^'])*/ "'" { $return = $item{__PATTERN1__} ; $return||defined($return); } DOUBLE_QUOTED_STRING: '"' /(?:\\"|[^"])*/ '"' { $return = $item{__PATTERN1__} ; $return||defined($return); } QUOTED_STRING: DOUBLE_QUOTED_STRING | SINGLE_QUOTED_STRING { $return = $item{DOUBLE_QUOTED_STRING}||$item{SINGLE_QUOTED_STRING} ; $return||defined($return); } BARESTRING: ...!/^[)('"]/ /^(?!\(|\))(?:\\ |\S)+/ { $return = $item{__PATTERN1__} ; $return||defined($return); } STRING: QUOTED_STRING | BARESTRING { $return = $item{QUOTED_STRING}||$item{BARESTRING} ; $return||defined($return); } OLDSTRING: /^"((?:[^"\\]|\\.)*)"/ | /^([^ \(\)]+)/ { $item{__PATTERN1__} =~ s/^"(.*)"$/$1/; $return = $item{__PATTERN1__} || $item{__PATTERN2__} ; $return||defined($return); } #BARESTRING: /^[^(]+\s+(?=\()/ # { $return = $item[1] ; $return||defined($return);} textlines: NIL | NUMBER { $return = $item[1] || $item[2]; $return||defined($return); } rfc822message: MESSAGE RFC822 { $return = "MESSAGE RFC822" } key: STRING { $return = $item{STRING} ; $return||defined($return);} value: NIL | '(' kvpair(s) ')'| NUMBER | STRING { $return = $item{NIL} || $item{NUMBER} || $item{STRING} || { map { (%$_) } @{$item{'kvpair(s)'}} } ; $return||defined($return); } kvpair: ...!")" key value { $return = { $item{key} => $item{value} }; $return||defined($return);} bodytype: STRING { $return = $item{STRING} ; $return||defined($return);} bodysubtype: PLAIN | HTML | NIL | STRING { $return = $item{PLAIN}||$item{HTML}||$item{NIL}||$item{STRING} ; $return||defined($return); } bodyparms: NIL | '(' kvpair(s) ')' { $return = $item{NIL} || { map { (%$_) } @{$item{'kvpair(s)'}} }; $return || defined($return); } bodydisp: NIL | '(' kvpair(s) ')' { $return = $item{NIL} || { map { (%$_) } @{$item{'kvpair(s)'}} }; $return || defined($return); } bodyid: ...!/[()]/ NIL | STRING { $return = $item{NIL} || $item{STRING} ; $return||defined($return);} bodydesc: ...!/[()]/ NIL | STRING { $return = $item{NIL} || $item{STRING} ; $return||defined($return);} bodyenc: NIL | STRING | '(' kvpair(s) ')' { $return = $item{NIL} || $item{STRING} || { map { (%$_) } @{$item{'kvpair(s)'}} }; $return||defined($return); } bodysize: ...!/[()]/ NIL | NUMBER { $return = $item{NIL} || $item{NUMBER} ;$return||defined($return);} bodyMD5: NIL | STRING { $return = $item{NIL} || $item{STRING} ;$return||defined($return);} bodylang: NIL | STRING | "(" STRING(s) ")" { $return = $item{NIL} || $item{'STRING(s)'} ;$return||defined($return);} personalname: NIL | STRING { $return = $item{NIL} || $item{STRING} ;$return||defined($return);} sourceroute: NIL | STRING { $return = $item{NIL} || $item{STRING} ;$return||defined($return);} mailboxname: NIL | STRING { $return = $item{NIL} || $item{STRING} ;$return||defined($return);} hostname: NIL | STRING { $return = $item{NIL} || $item{STRING} ;$return||defined($return);} addressstruct: "(" personalname sourceroute mailboxname hostname ")" { $return = { personalname => $item{personalname} , sourceroute => $item{sourceroute} , mailboxname => $item{mailboxname} , hostname => $item{hostname} , } ; bless($return, "Mail::IMAPClient::BodyStructure::Address"); } subject: NIL | STRING { $return = $item{NIL} || $item{STRING} ; $return||defined($return); } inreplyto: NIL | STRING { $return = $item{NIL} || $item{STRING} ;$return||defined($return);} messageid: NIL | STRING { $return = $item{NIL} || $item{STRING} ;$return||defined($return);} date: NIL | STRING { $return = $item{NIL} || $item{STRING} ;$return||defined($return);} cc: NIL | "(" addressstruct(s) ")" { $return = $item{NIL} || $item{'addressstruct(s)'} } bcc: NIL | "(" addressstruct(s) ")" { $return = $item{NIL} || $item{'addressstruct(s)'} } from: NIL | "(" addressstruct(s) ")" { $return = $item{NIL} || $item{'addressstruct(s)'} } replyto: NIL | "(" addressstruct(s) ")" { $return = $item{NIL} || $item{'addressstruct(s)'} } sender: NIL | "(" addressstruct(s) ")" { $return = $item{NIL} || $item{'addressstruct(s)'} } to: NIL | "(" addressstruct(s) ")" { $return = $item{NIL} || $item{'addressstruct(s)'} } envelopestruct: "(" date subject from sender replyto to cc bcc inreplyto messageid ")" { $return = {}; foreach my $what (qw/date subject from sender replyto to cc bcc inreplyto messageid/) { $return->{$what} = $item{$what}; } bless $return, "Mail::IMAPClient::BodyStructure::Envelope"; $return||defined($return); } basicfields: bodysubtype bodyparms bodyid(?) bodydesc(?) bodyenc(?) bodysize(?) { $return = { bodysubtype => $item{bodysubtype} , bodyparms => $item{bodyparms} , bodyid => (ref $item{'bodyid(?)'} ? $item{'bodyid(?)'}[0] : $item{'bodyid(?)'} ), 'bodydesc' => (ref $item{'bodydesc(?)'} ? $item{'bodydesc(?)'}[0] : $item{'bodydesc(?)'} ), 'bodyenc' => (ref $item{'bodyenc(?)'} ? $item{'bodyenc(?)'}[0] : $item{'bodyenc(?)'} ), 'bodysize' => (ref $item{'bodysize(?)'} ? $item{'bodysize(?)'}[0] : $item{'bodysize(?)'} ), }; $return; } textmessage: TEXT basicfields textlines(?) bodyMD5(?) bodydisp(?) bodylang(?) { $return = $item{basicfields}||{}; $return->{bodytype} = 'TEXT'; foreach my $what (qw/textlines(?) bodyMD5(?) bodydisp(?) bodylang(?)/) { my $k = $what; $k =~ s/\(\?\)$//; ref($item{$what}) and $return->{$k} = $item{$what}[0]; } $return||defined($return); } othertypemessage: bodytype basicfields bodyparms(?) bodydisp(?) bodylang(?) { $return = {}; foreach my $what (qw/bodytype bodyparms(?) bodydisp(?) bodylang(?)/) { my $k = $what; $k =~ s/\(\?\)$//; $return->{$k} = ref($item{$what})? $item{$what}[0] : $item{$what} ; } while ( my($k,$v) = each %{$item{basicfields}} ) { $return->{$k} = $v } $return||defined($return); } messagerfc822message: rfc822message bodyparms bodyid bodydesc bodyenc bodysize envelopestruct bodystructure textlines bodyMD5(?) bodydisp(?) bodylang(?) { $return = {}; foreach my $what (qw/ bodyparms bodyid bodydesc bodyenc bodysize envelopestruct bodystructure textlines bodyMD5(?) bodydisp(?) bodylang(?) / ) { my $k = $what; $k =~ s/\(\?\)$//; $return->{$k} = ref $item{$what} =~ 'ARRAY'? $item{$what}[0] : $item{$what}; } while ( my($k,$v) = each %{$item{bodystructure}[0]} ) { $return->{$k} = $v } while ( my($k,$v) = each %{$item{basicfields}} ) { $return->{$k} = $v } $return->{bodytype} = "MESSAGE" ; $return->{bodysubtype}= "RFC822" ; $return||defined($return); } subpart: "(" part ")" { $return = $item{part} ; $return||defined($return); } part: subpart(s) basicfields bodyparms(?) bodydisp(?) bodylang(?) { $return = bless($item{basicfields}, "Mail::IMAPClient::BodyStructure"); $return->{bodytype} = "MULTIPART"; $return->{bodystructure} = $item{'subpart(s)'}; foreach my $b (qw/bodyparms(?) bodydisp(?) bodylang(?)/) { my $k = $b; $k =~ s/\(\?\)$//; $return->{$k} = ref($item{$b}) ? $item{$b}[0] : $item{$b}; } $return||defined($return) ; } | textmessage { $return = bless $item{textmessage}, "Mail::IMAPClient::BodyStructure"; $return||defined($return); } | messagerfc822message { $return = bless $item{messagerfc822message}, "Mail::IMAPClient::BodyStructure"; $return||defined($return); } | othertypemessage { $return = bless $item{othertypemessage}, "Mail::IMAPClient::BodyStructure"; $return||defined($return); } bodystructure: "(" part(s) ")" { $return = $item{'part(s)'} ; $return||defined($return); } start: /.*\(.*BODYSTRUCTURE \(/i part(1) /\).*\)\r?\n?/ { #print STDERR "item = ",Data::Dumper->Dump([\%item],['$item']); $return = $item{'part(1)'}[0]; $return||defined($return); } envelope: /.*\(.*ENVELOPE/ envelopestruct /.*\)/ { $return = $item{envelopestruct} ; $return||defined($return) ; }