// -----------------------------------------------------------------------
//
// Copyright (C) 2003-2006 Angel Marin
//
// This file is part of SharpMimeTools
//
// SharpMimeTools is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// SharpMimeTools 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
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with SharpMimeTools; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//
// -----------------------------------------------------------------------
using System;
namespace anmar.SharpMimeTools
{
///
///
///
public sealed class ABNF {
///
///
///
public const string CRLF = "\r\n";
///
///
///
public const string ALPHA = @"A-Za-z";
///
///
///
public const string DIGIT = @"0-9";
///
/// RFC 2822 Section 2.2.2
///
public const string WSP = @"\x20\x09";
///
/// RFC 2822 Section 3.2.1
///
public const string NO_WS_CTL = @"\x01-\x08\x0B\x0C\x0E-\x1F\x7F";
///
/// RFC 2822 Section 3.2.1
///
// FIXME: add obs-text
public const string text = @"\x01-\x09\x0B\x0C\x0E-\x7F";
///
/// RFC 2822 Section 3.2.2
///
// FIXME: add obs-qp
public const string quoted_pair = @"[\x5C][" + text + "]";
///
/// RFC 2822 Section 3.2.3
///
// FIXME: add obs-FWS
public const string FWS = @"(?:(?:[" + WSP + @"]*\r\n)?[" + WSP + @"]+)";
///
/// RFC 2822 Section 3.2.3
///
public const string ctext = NO_WS_CTL + @"\x21-\x27\x2A-\x5B\x5D-\x7E";
///
/// RFC 2822 Section 3.2.3
///
public const string ccontent = "(?:" + ctext + "|" + quoted_pair + ")";
///
/// RFC 2822 Section 3.2.3
///
public const string comment = @"\((" + FWS + "?" + ccontent + ")*" + FWS + @"?\)";
///
/// RFC 2822 Section 3.2.3
///
// FIXME: Correct this simplification
public const string CFWS = "(?:(?:" + FWS + "?" + comment + ")*(?:" + FWS + "?" + comment + "|" + FWS + "))";
///
/// RFC 2822 Section 3.2.4
///
public const string atext = ALPHA + DIGIT + @"\x21\x23-\x27\x2A\x2B\x2D\x2F\x3D\x3F\x5E\x5F\x60\x7B-\x7E";
///
/// RFC 2822 Section 3.2.4
///
public const string atom = CFWS + @"?[" + atext + @"]" + CFWS + "?";
///
/// RFC 2822 Section 3.2.4
///
public const string dot_atom = CFWS + @"?" + dot_atom_text + CFWS + "?";
///
/// RFC 2822 Section 3.2.4
///
public const string dot_atom_text = @"[" + atext + @"]+(?:[.][" + atext + @"]+)*";
///
/// RFC 2822 Section 3.2.5
///
public const string DQUOTE = @"\x22";
///
/// RFC 2822 Section 3.2.5
///
public const string qtext = NO_WS_CTL + @"\x21\x23-\x5A\x5B\x5D-\x7E";
///
/// RFC 2822 Section 3.2.5
///
public const string qcontent = @"(?:[" + qtext + @"]|" + quoted_pair + @")";
///
/// RFC 2822 Section 3.2.5
///
public const string quoted_string = CFWS + "?" + DQUOTE + @"(?:" + FWS + "?" + qcontent + ")*" + FWS + "?" + DQUOTE + CFWS + "?";
///
/// RFC 2822 Section 3.2.6
///
public const string word = @"(?:" + atom + @"|" + quoted_string + @")";
///
/// RFC 2822 Section 3.2.6
///
// FIXME: add obs-phrase
public const string phrase = word + @"+";
///
/// RFC 2822 Section 3.4
///
public const string address = @"(?:" + mailbox + @"|" + group + @")";
///
/// RFC 2822 Section 3.4
///
public const string mailbox = @"(?:" + addr_spec + @"|" + name_addr + @")";
///
/// RFC 2822 Section 3.4
///
public const string name_addr = @"(?:(?:" + phrase + @")?(?:" + angle_addr + @"))";
///
/// RFC 2822 Section 3.4
///
// FIXME: add obs-angle-addr
public const string angle_addr = CFWS + @"?[\x3C]" + addr_spec + @"[\x3E]" + CFWS + "?";
///
/// RFC 2822 Section 3.4
///
public const string group = phrase + @":(?:" + mailbox_list + @"|" + CFWS + @")?[;]" + CFWS + "?";
///
/// RFC 2822 Section 3.4
///
public const string mailbox_list = @"(?:" + mailbox + @"(?:[,]" + mailbox + @")*)";
///
/// RFC 2822 Section 3.4
///
public const string address_list = @"(?:" + address + @"(?:[,]" + address + @")*)";
///
/// RFC 2822 Section 3.4.1
///
// FIXME: add obs-local-part
public const string local_part = @"(?:" + dot_atom + @"|" + quoted_string + @")";
///
/// RFC 2822 Section 3.4.1
///
// FIXME: add obs-domain
public const string domain = @"(?:" + dot_atom + @"|" + domain_literal + @")";
///
/// RFC 2822 Section 3.4.1
///
public const string domain_literal = CFWS + @"?[\[](?:" + FWS + "?" + dcontent + @")*" + FWS + @"?[\]]" + CFWS + "?";
///
/// RFC 2822 Section 3.4.1
///
public const string dtext = NO_WS_CTL + @"\x21-\x5A\x5E-\x7E";
///
/// RFC 2822 Section 3.4.1
///
public const string dcontent = @"(?:[" + dtext + @"]|" + quoted_pair + @")";
///
/// RFC 2822 Section 3.4.1
///
public const string addr_spec = local_part + "[@]" + domain;
///
/// Regular Expression for address (RFC 2822 Section 3.4) definition
///
public static System.Text.RegularExpressions.Regex address_regex = new System.Text.RegularExpressions.Regex(@"(" + anmar.SharpMimeTools.ABNF.address + @")", System.Text.RegularExpressions.RegexOptions.Singleline);
}
}