1require 'rss/dublincore' 2require 'rss/maker/1.0' 3 4module RSS 5 module Maker 6 module DublinCoreModel 7 def self.append_features(klass) 8 super 9 10 ::RSS::DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name| 11 plural_name ||= "#{name}s" 12 full_name = "#{RSS::DC_PREFIX}_#{name}" 13 full_plural_name = "#{RSS::DC_PREFIX}_#{plural_name}" 14 plural_klass_name = "DublinCore#{Utils.to_class_name(plural_name)}" 15 klass.def_classed_elements(full_name, "value", plural_klass_name, 16 full_plural_name, name) 17 klass.module_eval(<<-EOC, __FILE__, __LINE__ + 1) 18 def new_#{full_name}(value=nil) 19 _#{full_name} = #{full_plural_name}.new_#{name} 20 _#{full_name}.value = value 21 if block_given? 22 yield _#{full_name} 23 else 24 _#{full_name} 25 end 26 end 27 EOC 28 end 29 30 klass.module_eval(<<-EOC, __FILE__, __LINE__ + 1) 31 # For backward compatibility 32 alias #{DC_PREFIX}_rightses #{DC_PREFIX}_rights_list 33 EOC 34 end 35 36 ::RSS::DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name| 37 plural_name ||= "#{name}s" 38 full_name ||= "#{DC_PREFIX}_#{name}" 39 full_plural_name ||= "#{DC_PREFIX}_#{plural_name}" 40 klass_name = Utils.to_class_name(name) 41 full_klass_name = "DublinCore#{klass_name}" 42 plural_klass_name = "DublinCore#{Utils.to_class_name(plural_name)}" 43 module_eval(<<-EOC, __FILE__, __LINE__ + 1) 44 class #{plural_klass_name}Base < Base 45 def_array_element(#{name.dump}, #{full_plural_name.dump}, 46 #{full_klass_name.dump}) 47 48 class #{full_klass_name}Base < Base 49 attr_accessor :value 50 add_need_initialize_variable("value") 51 alias_method(:content, :value) 52 alias_method(:content=, :value=) 53 54 def have_required_values? 55 @value 56 end 57 58 def to_feed(feed, current) 59 if value and current.respond_to?(:#{full_name}) 60 new_item = current.class::#{full_klass_name}.new(value) 61 current.#{full_plural_name} << new_item 62 end 63 end 64 end 65 #{klass_name}Base = #{full_klass_name}Base 66 end 67 EOC 68 end 69 70 def self.install_dublin_core(klass) 71 ::RSS::DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name| 72 plural_name ||= "#{name}s" 73 klass_name = Utils.to_class_name(name) 74 full_klass_name = "DublinCore#{klass_name}" 75 plural_klass_name = "DublinCore#{Utils.to_class_name(plural_name)}" 76 klass.module_eval(<<-EOC, __FILE__, __LINE__ + 1) 77 class #{plural_klass_name} < #{plural_klass_name}Base 78 class #{full_klass_name} < #{full_klass_name}Base 79 end 80 #{klass_name} = #{full_klass_name} 81 end 82EOC 83 end 84 end 85 end 86 87 class ChannelBase 88 include DublinCoreModel 89 end 90 91 class ImageBase; include DublinCoreModel; end 92 class ItemsBase 93 class ItemBase 94 include DublinCoreModel 95 end 96 end 97 class TextinputBase; include DublinCoreModel; end 98 99 makers.each do |maker| 100 maker.module_eval(<<-EOC, __FILE__, __LINE__ + 1) 101 class Channel 102 DublinCoreModel.install_dublin_core(self) 103 end 104 105 class Image 106 DublinCoreModel.install_dublin_core(self) 107 end 108 109 class Items 110 class Item 111 DublinCoreModel.install_dublin_core(self) 112 end 113 end 114 115 class Textinput 116 DublinCoreModel.install_dublin_core(self) 117 end 118 EOC 119 end 120 end 121end 122