content_type.treetop - mail-2.5.4 Documentation

module Mail

    grammar ContentType

      include RFC2822
      include RFC2045

      rule content_type
        main_type "/" sub_type param_hashes:(CFWS ";"* parameter CFWS)* {
          def parameters
            param_hashes.elements.map do |param|
              param.parameter.param_hash
            end
          end
        }
      end

      rule main_type
        discrete_type / composite_type
      end

      # This matches in a case insensitive way:
      #
      #   rule discrete_type
      #     "text" / "image" / "audio" / "video" / "application" / extension_token
      #   end
      rule discrete_type
        [tT] [eE] [xX] [tT] / [iI] [mM] [aA] [gG] [eE] / [aA] [uU] [dD] [iI] [oO] / [vV] [iI] [dD] [eE] [oO] / [aA] [pP] [pP] [lL] [iI] [cC] [aA] [tT] [iI] [oO] [nN] / extension_token
      end

      # This matches in a case insensitive way:
      #
      #   rule composite_type
      #     "message" / "multipart" / extension_token
      #   end
      rule composite_type
        [mM] [eE] [sS] [sS] [aA] [gG] [eE] / [mM] [uU] [lL] [tT] [iI] [pP] [aA] [rR] [tT] / extension_token
      end

      rule extension_token
        ietf_token / custom_x_token
      end

      rule sub_type
        extension_token / iana_token
      end

      rule parameter
        CFWS? attr:attribute "=" val:value CFWS? {
          def param_hash
            {attr.text_value => val.text_value}
          end
        }
      end

      rule attribute
        token+
      end

      rule value
        quoted_string {
          def text_value
            quoted_content.text_value
          end
        } / (token / [\x3d])+
      end

    end

end