1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/lib/rss/dublincore.rb
kou 80861909e6 * lib/rss: backoported from HEAD.
* lib/rss: refactored.
  - gave a name to 'x'.
  - undef_method -> remove_method for avoiding a warning in ruby 1.6.


* lib/rss/parser.rb: @@setter -> @@setters.

* lib/rss/parser.rb
  (RSS::BaseListener.register_uri)
  (RSS::BaseListener.uri_registered?)
  (RSS::BaseListener.install_get_text_element):
  swapped the first argument and the second argument.

* lib/rss/taxonomy.rb: swapped the first argument and the second
  argument for RSS::BaseListener.install_get_text_element.
* lib/rss/image.rb: ditto.
* lib/rss/syndication.rb: ditto.
* lib/rss/dublincore.rb: ditto.
* lib/rss/parser.rb: ditto.
* lib/rss/1.0.rb: ditto.
* lib/rss/2.0.rb: ditto.
* lib/rss/0.9.rb: ditto.
* lib/rss/content.rb: ditto.

* lib/rss/parser.rb
  (RSS::BaseListener.install_setter)
  (RSS::BaseListener.register_uri): changed fallback way.

* lib/rss/parser.rb: added class name registry for complex model
  elements. (ex. have childlen elements, have some attributes and
  a child element and so on.)


* lib/rss/dublincore.rb: supported multiple Dublin Core items.
* lib/rss/maker/dublincore.rb: ditto.
* lib/rss/maker/image.rb: supproted new Dublin Core API.
* lib/rss/maker/base.rb: added default current_element implementation.
* lib/rss/trackback.rb (RSS::TrackBackUtils.new_with_value_if_need):
  moved to RSS::Utils.

* lib/rss/utils.rb (RSS::Utils.new_with_value_if_need):
  moved from RSS::TrackBackUtils.

* lib/rss/maker/image.rb: fixed invalid argument of
  add_need_initialize_variable bug.
* lib/rss/maker/trackback.rb: ditto.

* lib/rss/rss.rb (Hash#merge): added for ruby 1.6.
* lib/rss/rss.rb (RSS::BaseModel.date_writer): changed to accept nil
  for date value.


* test/test_dublincore.rb: added tests for plural accessor and
  multiple Dublin Core items.

* test/test_setup_maker_1.0.rb: fixed swapped actual and expected
  values.

* test/rss/rss-assertions.rb (assert_multiple_dublin_core): added
  an assertion for testing multiple Dublin Core items.

* test/rss/test_maker_dc.rb (test_rss10_multiple): added a test
  for making multiple Dublin Core items.

* test/rss/test_maker_dc.rb (test_date): added a test for #date=
  and #dc_date=.


* sample/rss/tdiary_plugin/rss-recent.rb:
  new option: @options['rss-recent.use-image-link']:
  use image as link instread of text if available.

* sample/rss/tdiary_plugin/rss-recent.rb (RSS_RECENT_VERSION):
  0.0.5 -> 0.0.6.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@8284 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2005-04-09 03:09:52 +00:00

160 lines
4.1 KiB
Ruby

require "rss/1.0"
module RSS
DC_PREFIX = 'dc'
DC_URI = "http://purl.org/dc/elements/1.1/"
RDF.install_ns(DC_PREFIX, DC_URI)
module BaseDublinCoreModel
def append_features(klass)
super
return if klass.instance_of?(Module)
DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name|
plural = plural_name || "#{name}s"
full_name = "#{DC_PREFIX}_#{name}"
full_plural_name = "#{DC_PREFIX}_#{plural}"
klass_name = "DublinCore#{Utils.to_class_name(name)}"
klass.module_eval(<<-EOC, *get_file_and_line_from_caller(0))
install_have_children_element(#{full_name.dump},
#{full_plural_name.dump})
remove_method :#{full_name}
remove_method :#{full_name}=
remove_method :set_#{full_name}
def #{full_name}
@#{full_name}.first and @#{full_name}.first.value
end
def #{full_name}=(new_value)
@#{full_name}[0] = Utils.new_with_value_if_need(#{klass_name}, new_value)
end
alias set_#{full_name} #{full_name}=
EOC
end
klass.module_eval(<<-EOC, *get_file_and_line_from_caller(0))
alias date #{DC_PREFIX}_date
alias date= #{DC_PREFIX}_date=
EOC
end
end
module DublinCoreModel
extend BaseModel
extend BaseDublinCoreModel
TEXT_ELEMENTS = {
"title" => nil,
"description" => nil,
"creator" => nil,
"subject" => nil,
"publisher" => nil,
"contributor" => nil,
"type" => nil,
"format" => nil,
"identifier" => nil,
"source" => nil,
"language" => nil,
"relation" => nil,
"coverage" => nil,
"rights" => "rightses" # FIXME
}
DATE_ELEMENTS = {
"date" => "w3cdtf",
}
ELEMENT_NAME_INFOS = DublinCoreModel::TEXT_ELEMENTS.to_a
DublinCoreModel::DATE_ELEMENTS.each do |name, |
ELEMENT_NAME_INFOS << [name, nil]
end
ELEMENTS = TEXT_ELEMENTS.keys + DATE_ELEMENTS.keys
ELEMENTS.each do |name, plural_name|
module_eval(<<-EOC, *get_file_and_line_from_caller(0))
class DublinCore#{Utils.to_class_name(name)} < Element
include RSS10
content_setup
class << self
def required_prefix
DC_PREFIX
end
def required_uri
DC_URI
end
end
@tag_name = #{name.dump}
alias_method(:value, :content)
alias_method(:value=, :content=)
def initialize(content=nil)
super()
self.content = content
end
def full_name
tag_name_with_prefix(DC_PREFIX)
end
def maker_target(target)
target.new_#{name}
end
def setup_maker_attributes(#{name})
#{name}.content = content
end
end
EOC
end
DATE_ELEMENTS.each do |name, type|
module_eval(<<-EOC, *get_file_and_line_from_caller(0))
class DublinCore#{Utils.to_class_name(name)} < Element
remove_method(:content=)
remove_method(:value=)
date_writer("content", #{type.dump}, #{name.dump})
alias_method(:value=, :content=)
end
EOC
end
def dc_validate(tags)
tags.each do |tag|
key = "#{DC_PREFIX}_#{tag}"
unless DublinCoreModel::ELEMENTS.include?(key)
raise UnknownTagError.new(tag, DC_URI)
end
end
end
end
# For backward compatibility
DublincoreModel = DublinCoreModel
class RDF
class Channel; include DublinCoreModel; end
class Image; include DublinCoreModel; end
class Item; include DublinCoreModel; end
class Textinput; include DublinCoreModel; end
end
DublinCoreModel::ELEMENTS.each do |name|
class_name = Utils.to_class_name(name)
BaseListener.install_class_name(DC_URI, name, "DublinCore#{class_name}")
end
DublinCoreModel::ELEMENTS.collect! {|name| "#{DC_PREFIX}_#{name}"}
end