/tools/Ruby/lib/ruby/1.8/rss/maker/dublincore.rb

http://github.com/agross/netopenspace · Ruby · 124 lines · 106 code · 14 blank · 4 comment · 2 complexity · d1e274f9977e846b91408e0f03973cf2 MD5 · raw file

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