abnf.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. 'use strict';
  2. const internals = {};
  3. /*
  4. From RFC 5321:
  5. Mailbox = Local-part "@" ( Domain / address-literal )
  6. Local-part = Dot-string / Quoted-string
  7. Dot-string = Atom *("." Atom)
  8. Atom = 1*atext
  9. atext = ALPHA / DIGIT / "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "/" / "=" / "?" / "^" / "_" / "`" / "{" / "|" / "}" / "~"
  10. Domain = sub-domain *("." sub-domain)
  11. sub-domain = Let-dig [Ldh-str]
  12. Let-dig = ALPHA / DIGIT
  13. Ldh-str = *( ALPHA / DIGIT / "-" ) Let-dig
  14. ALPHA = %x41-5A / %x61-7A ; a-z, A-Z
  15. DIGIT = %x30-39 ; 0-9
  16. From RFC 6531:
  17. sub-domain =/ U-label
  18. atext =/ UTF8-non-ascii
  19. UTF8-non-ascii = UTF8-2 / UTF8-3 / UTF8-4
  20. UTF8-2 = %xC2-DF UTF8-tail
  21. UTF8-3 = %xE0 %xA0-BF UTF8-tail /
  22. %xE1-EC 2( UTF8-tail ) /
  23. %xED %x80-9F UTF8-tail /
  24. %xEE-EF 2( UTF8-tail )
  25. UTF8-4 = %xF0 %x90-BF 2( UTF8-tail ) /
  26. %xF1-F3 3( UTF8-tail ) /
  27. %xF4 %x80-8F 2( UTF8-tail )
  28. UTF8-tail = %x80-BF
  29. Note: The following are not supported:
  30. RFC 5321: address-literal, Quoted-string
  31. RFC 5322: obs-*, CFWS
  32. */
  33. internals.atext = '[\\w!#\\$%&\'\\*\\+\\-/=\\?\\^`\\{\\|\\}~]'; // _ included in \w
  34. exports.atextRx = new RegExp(`^${internals.atext}+$`);
  35. exports.atomRx = new RegExp([
  36. internals.atext,
  37. // %xC2-DF UTF8-tail
  38. '(?:[\\xc2-\\xdf][\\x80-\\xbf])',
  39. // %xE0 %xA0-BF UTF8-tail %xE1-EC 2( UTF8-tail ) %xED %x80-9F UTF8-tail %xEE-EF 2( UTF8-tail )
  40. '(?:\\xe0[\\xa0-\\xbf][\\x80-\\xbf])|(?:[\\xe1-\\xec][\\x80-\\xbf]{2})|(?:\\xed[\\x80-\\x9f][\\x80-\\xbf])|(?:[\\xee-\\xef][\\x80-\\xbf]{2})',
  41. // %xF0 %x90-BF 2( UTF8-tail ) %xF1-F3 3( UTF8-tail ) %xF4 %x80-8F 2( UTF8-tail )
  42. '(?:\\xf0[\\x90-\\xbf][\\x80-\\xbf]{2})|(?:[\\xf1-\\xf3][\\x80-\\xbf]{3})|(?:\\xf4[\\x80-\\x8f][\\x80-\\xbf]{2})'
  43. ].join('|'));