Class: Protocol::Media::Range

Inherits:
Object
  • Object
show all
Defined in:
lib/protocol/media/range.rb

Overview

A media range and its parameters.

Direct Known Subclasses

Type

Constant Summary collapse

TOKEN =
/[!#$%&'*+\-.^_`|~0-9A-Z]+/i
QUOTED_STRING =
/"(?:.(?!(?<!\\)"))*.?"/
MEDIA_TYPE =
/(?<type>#{TOKEN})\/(?<subtype>#{TOKEN})/
PARAMETER =
/\s*;\s*(?<key>#{TOKEN})=((?<value>#{TOKEN})|(?<quoted_value>#{QUOTED_STRING}))/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(type, subtype = "*", parameters = {}) ⇒ Range

Returns a new instance of Range.



87
88
89
90
91
92
93
94
95
# File 'lib/protocol/media/range.rb', line 87

def initialize(type, subtype = "*", parameters = {})
	unless valid_wildcard?(type, subtype)
		raise ArgumentError, "Invalid wildcards in media range: #{type}/#{subtype}"
	end
	
	@type = type.downcase
	@subtype = subtype.downcase
	@parameters = parameters
end

Instance Attribute Details

#parametersObject (readonly)

Returns the value of attribute parameters.



82
83
84
# File 'lib/protocol/media/range.rb', line 82

def parameters
  @parameters
end

#subtypeObject (readonly)

Returns the value of attribute subtype.



79
80
81
# File 'lib/protocol/media/range.rb', line 79

def subtype
  @subtype
end

#The subtype, e.g. `plain` or `*`.(subtype, e.g.`plain`) ⇒ Object (readonly)



79
# File 'lib/protocol/media/range.rb', line 79

attr_reader :subtype

#The top-level type, e.g. `text` or `*`.(top-leveltype, e.g.`text`) ⇒ Object (readonly)



76
# File 'lib/protocol/media/range.rb', line 76

attr_reader :type

#typeObject (readonly)

Returns the value of attribute type.



76
77
78
# File 'lib/protocol/media/range.rb', line 76

def type
  @type
end

Class Method Details

.for(value) ⇒ Object

Parse strings into media ranges while preserving compatible objects.



23
24
25
26
27
28
29
# File 'lib/protocol/media/range.rb', line 23

def self.for(value)
	if value.is_a?(String)
		parse(value)
	else
		value
	end
end

.parse(text, normalize_whitespace = true) ⇒ Object

Parse a media range.



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/protocol/media/range.rb', line 36

def self.parse(text, normalize_whitespace = true)
	scanner = StringScanner.new(text)
	
	unless scanner.scan(MEDIA_TYPE)
		raise ArgumentError, "Invalid media range: #{text.inspect}"
	end
	
	type = scanner[:type]
	subtype = scanner[:subtype]
	parameters = parse_parameters(scanner, normalize_whitespace)
	
	unless scanner.eos?
		raise ArgumentError, "Invalid media range: #{text.inspect}"
	end
	
	new(type, subtype, parameters)
end

.parse_parameters(scanner, normalize_whitespace = true) ⇒ Object

Parse media type parameters from the scanner.



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/protocol/media/range.rb', line 59

def self.parse_parameters(scanner, normalize_whitespace = true)
	parameters = {}
	
	while scanner.scan(PARAMETER)
		key = scanner[:key]
		
		if value = scanner[:value]
			parameters[key] = value
		elsif quoted_value = scanner[:quoted_value]
			parameters[key] = unquote(quoted_value, normalize_whitespace)
		end
	end
	
	parameters
end

.unquote(value, normalize_whitespace) ⇒ Object



154
155
156
157
158
159
# File 'lib/protocol/media/range.rb', line 154

def self.unquote(value, normalize_whitespace)
	value = value[1...-1]
	value.gsub!(/\\(.)/, '\\1')
	value.gsub!(/[\r\n]+\s+/, " ") if normalize_whitespace
	value
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?

Compare this media range with another media range.



132
133
134
# File 'lib/protocol/media/range.rb', line 132

def ==(other)
	other.instance_of?(self.class) && @type == other.type && @subtype == other.subtype && @parameters == other.parameters
end

#hashObject

Generate a hash key consistent with #eql?.



141
142
143
# File 'lib/protocol/media/range.rb', line 141

def hash
	[self.class, @type, @subtype, @parameters].hash
end

#match?(other) ⇒ Boolean Also known as: ===

Whether this range matches the given media type or range.

Returns:

  • (Boolean)


121
122
123
124
# File 'lib/protocol/media/range.rb', line 121

def match?(other)
	(@type == "*" || other.type == "*" || @type == other.type) &&
		(@subtype == "*" || other.subtype == "*" || @subtype == other.subtype)
end

#nameObject Also known as: mime_type

The complete media range name.



100
101
102
# File 'lib/protocol/media/range.rb', line 100

def name
	"#{@type}/#{@subtype}"
end

#The media range parameters.=(mediarangeparameters. = (value)) ⇒ Object



82
# File 'lib/protocol/media/range.rb', line 82

attr_reader :parameters

#to_sObject Also known as: to_str

Convert the media range and parameters to a string.



109
110
111
112
113
# File 'lib/protocol/media/range.rb', line 109

def to_s
	name + @parameters.collect do |key, value|
		"; #{key}=#{quote(value.to_s)}"
	end.join
end