+# Author:: Stanislav Karchebny <berkus@madfire.net>\r
+# Author:: Ian Monroe <ian@monroe.nu>\r
+# Author:: Mark Kretschmann <markey@web.de>\r
+# Author:: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>\r
+#\r
+# Copyright:: (C) 2004 Stanislav Karchebny\r
+# Copyright:: (C) 2005 Ian Monroe, Mark Kretschmann\r
+# Copyright:: (C) 2006-2007 Giuseppe Bilotta\r
+#\r
+# License:: MIT license\r
+\r
+require 'rss'\r
+\r
+module ::RSS\r
+\r
+ # Make an 'unique' ID for a given item, based on appropriate bot options\r
+ # Currently only suppored is bot.config['rss.show_updated']: when true, the\r
+ # description is included in the uid hashing, otherwise it's not\r
+ #\r
+ def RSS.item_uid_for_bot(item, opts={})\r
+ options = { :show_updated => true}.merge(opts)\r
+ desc = options[:show_updated] ? item.description : nil\r
+ [item.title, item.link, desc].hash\r
+ end\r
+\r
+ # Add support for Slashdot namespace in RDF. The code is just an adaptation\r
+ # of the DublinCore code.\r
+ unless defined?(SLASH_PREFIX)\r
+ SLASH_PREFIX = 'slash'\r
+ SLASH_URI = "http://purl.org/rss/1.0/modules/slash/"\r
+\r
+ RDF.install_ns(SLASH_PREFIX, SLASH_URI)\r
+\r
+ module BaseSlashModel\r
+ def append_features(klass)\r
+ super\r
+\r
+ return if klass.instance_of?(Module)\r
+ SlashModel::ELEMENT_NAME_INFOS.each do |name, plural_name|\r
+ plural = plural_name || "#{name}s"\r
+ full_name = "#{SLASH_PREFIX}_#{name}"\r
+ full_plural_name = "#{SLASH_PREFIX}_#{plural}"\r
+ klass_name = "Slash#{Utils.to_class_name(name)}"\r
+\r
+ # This will fail with older version of the Ruby RSS module\r
+ begin\r
+ klass.install_have_children_element(name, SLASH_URI, "*",\r
+ full_name, full_plural_name)\r
+ klass.install_must_call_validator(SLASH_PREFIX, SLASH_URI)\r
+ rescue ArgumentError\r
+ klass.module_eval("install_have_children_element(#{full_name.dump}, #{full_plural_name.dump})")\r
+ end\r
+\r
+ klass.module_eval(<<-EOC, *get_file_and_line_from_caller(0))\r
+ remove_method :#{full_name} if method_defined? :#{full_name}\r
+ remove_method :#{full_name}= if method_defined? :#{full_name}=\r
+ remove_method :set_#{full_name} if method_defined? :set_#{full_name}\r
+\r
+ def #{full_name}\r
+ @#{full_name}.first and @#{full_name}.first.value\r
+ end\r
+\r
+ def #{full_name}=(new_value)\r
+ @#{full_name}[0] = Utils.new_with_value_if_need(#{klass_name}, new_value)\r
+ end\r
+ alias set_#{full_name} #{full_name}=\r
+ EOC\r
+ end\r
+ end\r
+ end\r
+\r
+ module SlashModel\r
+ extend BaseModel\r
+ extend BaseSlashModel\r
+\r
+ TEXT_ELEMENTS = {\r
+ "department" => nil,\r
+ "section" => nil,\r
+ "comments" => nil,\r
+ "hit_parade" => nil\r
+ }\r
+\r
+ ELEMENT_NAME_INFOS = SlashModel::TEXT_ELEMENTS.to_a\r
+\r
+ ELEMENTS = TEXT_ELEMENTS.keys\r
+\r
+ ELEMENTS.each do |name, plural_name|\r
+ module_eval(<<-EOC, *get_file_and_line_from_caller(0))\r
+ class Slash#{Utils.to_class_name(name)} < Element\r
+ include RSS10\r
+\r
+ content_setup\r
+\r
+ class << self\r
+ def required_prefix\r
+ SLASH_PREFIX\r
+ end\r
+\r
+ def required_uri\r
+ SLASH_URI\r
+ end\r
+ end\r
+\r
+ @tag_name = #{name.dump}\r
+\r
+ alias_method(:value, :content)\r
+ alias_method(:value=, :content=)\r
+\r
+ def initialize(*args)\r
+ begin\r
+ if Utils.element_initialize_arguments?(args)\r
+ super\r
+ else\r
+ super()\r
+ self.content = args[0]\r
+ end\r
+ # Older Ruby RSS module\r
+ rescue NoMethodError\r
+ super()\r
+ self.content = args[0]\r
+ end\r
+ end\r
+\r
+ def full_name\r
+ tag_name_with_prefix(SLASH_PREFIX)\r
+ end\r
+\r
+ def maker_target(target)\r
+ target.new_#{name}\r
+ end\r
+\r
+ def setup_maker_attributes(#{name})\r
+ #{name}.content = content\r
+ end\r
+ end\r
+ EOC\r
+ end\r
+ end\r
+\r
+ class RDF\r
+ class Item; include SlashModel; end\r
+ end\r
+\r
+ SlashModel::ELEMENTS.each do |name|\r
+ class_name = Utils.to_class_name(name)\r
+ BaseListener.install_class_name(SLASH_URI, name, "Slash#{class_name}")\r
+ end\r
+\r
+ SlashModel::ELEMENTS.collect! {|name| "#{SLASH_PREFIX}_#{name}"}\r
+ end\r
+end\r
+\r