| 525 | |
| 526 | |
| 527 | class AddrSpec(TokenList): |
| 528 | |
| 529 | token_type = 'addr-spec' |
| 530 | as_ew_allowed = False |
| 531 | |
| 532 | @property |
| 533 | def local_part(self): |
| 534 | return self[0].local_part |
| 535 | |
| 536 | @property |
| 537 | def domain(self): |
| 538 | if len(self) < 3: |
| 539 | return None |
| 540 | return self[-1].domain |
| 541 | |
| 542 | @property |
| 543 | def value(self): |
| 544 | if len(self) < 3: |
| 545 | return self[0].value |
| 546 | return self[0].value.rstrip()+self[1].value+self[2].value.lstrip() |
| 547 | |
| 548 | @property |
| 549 | def addr_spec(self): |
| 550 | nameset = set(self.local_part) |
| 551 | if len(nameset) > len(nameset-DOT_ATOM_ENDS): |
| 552 | lp = quote_string(self.local_part) |
| 553 | else: |
| 554 | lp = self.local_part |
| 555 | if self.domain is not None: |
| 556 | return lp + '@' + self.domain |
| 557 | return lp |
| 558 | |
| 559 | |
| 560 | class ObsLocalPart(TokenList): |