1require 'rss/1.0' 2require 'rss/dublincore' 3 4module RSS 5 6 IMAGE_PREFIX = 'image' 7 IMAGE_URI = 'http://purl.org/rss/1.0/modules/image/' 8 9 RDF.install_ns(IMAGE_PREFIX, IMAGE_URI) 10 11 IMAGE_ELEMENTS = [] 12 13 %w(item favicon).each do |name| 14 class_name = Utils.to_class_name(name) 15 BaseListener.install_class_name(IMAGE_URI, name, "Image#{class_name}") 16 IMAGE_ELEMENTS << "#{IMAGE_PREFIX}_#{name}" 17 end 18 19 module ImageModelUtils 20 def validate_one_tag_name(ignore_unknown_element, name, tags) 21 if !ignore_unknown_element 22 invalid = tags.find {|tag| tag != name} 23 raise UnknownTagError.new(invalid, IMAGE_URI) if invalid 24 end 25 raise TooMuchTagError.new(name, tag_name) if tags.size > 1 26 end 27 end 28 29 module ImageItemModel 30 include ImageModelUtils 31 extend BaseModel 32 33 def self.append_features(klass) 34 super 35 36 klass.install_have_child_element("item", IMAGE_URI, "?", 37 "#{IMAGE_PREFIX}_item") 38 klass.install_must_call_validator(IMAGE_PREFIX, IMAGE_URI) 39 end 40 41 class ImageItem < Element 42 include RSS10 43 include DublinCoreModel 44 45 @tag_name = "item" 46 47 class << self 48 def required_prefix 49 IMAGE_PREFIX 50 end 51 52 def required_uri 53 IMAGE_URI 54 end 55 end 56 57 install_must_call_validator(IMAGE_PREFIX, IMAGE_URI) 58 59 [ 60 ["about", ::RSS::RDF::URI, true], 61 ["resource", ::RSS::RDF::URI, false], 62 ].each do |name, uri, required| 63 install_get_attribute(name, uri, required, nil, nil, 64 "#{::RSS::RDF::PREFIX}:#{name}") 65 end 66 67 %w(width height).each do |tag| 68 full_name = "#{IMAGE_PREFIX}_#{tag}" 69 disp_name = "#{IMAGE_PREFIX}:#{tag}" 70 install_text_element(tag, IMAGE_URI, "?", 71 full_name, :integer, disp_name) 72 BaseListener.install_get_text_element(IMAGE_URI, tag, full_name) 73 end 74 75 alias width= image_width= 76 alias width image_width 77 alias height= image_height= 78 alias height image_height 79 80 def initialize(*args) 81 if Utils.element_initialize_arguments?(args) 82 super 83 else 84 super() 85 self.about = args[0] 86 self.resource = args[1] 87 end 88 end 89 90 def full_name 91 tag_name_with_prefix(IMAGE_PREFIX) 92 end 93 94 private 95 def maker_target(target) 96 target.image_item 97 end 98 99 def setup_maker_attributes(item) 100 item.about = self.about 101 item.resource = self.resource 102 end 103 end 104 end 105 106 module ImageFaviconModel 107 include ImageModelUtils 108 extend BaseModel 109 110 def self.append_features(klass) 111 super 112 113 unless klass.class == Module 114 klass.install_have_child_element("favicon", IMAGE_URI, "?", 115 "#{IMAGE_PREFIX}_favicon") 116 klass.install_must_call_validator(IMAGE_PREFIX, IMAGE_URI) 117 end 118 end 119 120 class ImageFavicon < Element 121 include RSS10 122 include DublinCoreModel 123 124 @tag_name = "favicon" 125 126 class << self 127 def required_prefix 128 IMAGE_PREFIX 129 end 130 131 def required_uri 132 IMAGE_URI 133 end 134 end 135 136 [ 137 ["about", ::RSS::RDF::URI, true, ::RSS::RDF::PREFIX], 138 ["size", IMAGE_URI, true, IMAGE_PREFIX], 139 ].each do |name, uri, required, prefix| 140 install_get_attribute(name, uri, required, nil, nil, 141 "#{prefix}:#{name}") 142 end 143 144 AVAILABLE_SIZES = %w(small medium large) 145 alias_method :set_size, :size= 146 private :set_size 147 def size=(new_value) 148 if @do_validate and !new_value.nil? 149 new_value = new_value.strip 150 unless AVAILABLE_SIZES.include?(new_value) 151 attr_name = "#{IMAGE_PREFIX}:size" 152 raise NotAvailableValueError.new(full_name, new_value, attr_name) 153 end 154 end 155 set_size(new_value) 156 end 157 158 alias image_size= size= 159 alias image_size size 160 161 def initialize(*args) 162 if Utils.element_initialize_arguments?(args) 163 super 164 else 165 super() 166 self.about = args[0] 167 self.size = args[1] 168 end 169 end 170 171 def full_name 172 tag_name_with_prefix(IMAGE_PREFIX) 173 end 174 175 private 176 def maker_target(target) 177 target.image_favicon 178 end 179 180 def setup_maker_attributes(favicon) 181 favicon.about = self.about 182 favicon.size = self.size 183 end 184 end 185 186 end 187 188 class RDF 189 class Channel; include ImageFaviconModel; end 190 class Item; include ImageItemModel; end 191 end 192 193end 194