Class: Protocol::Media::Range
- Inherits:
-
Object
- Object
- Protocol::Media::Range
- Defined in:
- lib/protocol/media/range.rb
Overview
A media range and its parameters.
Direct Known Subclasses
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
-
#parameters ⇒ Object
readonly
Returns the value of attribute parameters.
-
#subtype ⇒ Object
readonly
Returns the value of attribute subtype.
- #The subtype, e.g. `plain` or `*`.(subtype, e.g.`plain`) ⇒ Object readonly
- #The top-level type, e.g. `text` or `*`.(top-leveltype, e.g.`text`) ⇒ Object readonly
-
#type ⇒ Object
readonly
Returns the value of attribute type.
Class Method Summary collapse
-
.for(value) ⇒ Object
Parse strings into media ranges while preserving compatible objects.
-
.parse(text, normalize_whitespace = true) ⇒ Object
Parse a media range.
-
.parse_parameters(scanner, normalize_whitespace = true) ⇒ Object
Parse media type parameters from the scanner.
- .unquote(value, normalize_whitespace) ⇒ Object
Instance Method Summary collapse
-
#==(other) ⇒ Object
(also: #eql?)
Compare this media range with another media range.
-
#hash ⇒ Object
Generate a hash key consistent with #eql?.
-
#initialize(type, subtype = "*", parameters = {}) ⇒ Range
constructor
A new instance of Range.
-
#match?(other) ⇒ Boolean
(also: #===)
Whether this range matches the given media type or range.
-
#name ⇒ Object
(also: #mime_type)
The complete media range name.
- #The media range parameters.=(mediarangeparameters. = (value)) ⇒ Object
-
#to_s ⇒ Object
(also: #to_str)
Convert the media range and parameters to a string.
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
#parameters ⇒ Object (readonly)
Returns the value of attribute parameters.
82 83 84 |
# File 'lib/protocol/media/range.rb', line 82 def parameters @parameters end |
#subtype ⇒ Object (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 |
#type ⇒ Object (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 |
#hash ⇒ Object
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.
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 |
#name ⇒ Object 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_s ⇒ Object 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 |