mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/rss/dublincore.rb: supported multiple DublinCore items.
* 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/maker/base.rb: added default current_element implementation. * lib/rss/maker/dublincore.rb: supported multiple DublinCore items. * lib/rss/maker/image.rb: supproted new DublinCore API. * 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 DublinCore items. * test/test_setup_maker_1.0.rb: fixed swapped actual and expected values. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8252 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
5ddcd35cf1
commit
d12dff187a
12 changed files with 442 additions and 102 deletions
|
@ -7,41 +7,135 @@ module RSS
|
|||
|
||||
RDF.install_ns(DC_PREFIX, DC_URI)
|
||||
|
||||
module DublinCoreModel
|
||||
|
||||
extend BaseModel
|
||||
|
||||
ELEMENTS = []
|
||||
|
||||
def self.append_features(klass)
|
||||
module BaseDublinCoreModel
|
||||
def append_features(klass)
|
||||
super
|
||||
|
||||
klass.module_eval(<<-EOC, *get_file_and_line_from_caller(1))
|
||||
%w(title description creator subject publisher
|
||||
contributor type format identifier source
|
||||
language relation coverage rights).each do |x|
|
||||
install_text_element("\#{DC_PREFIX}_\#{x}")
|
||||
end
|
||||
|
||||
%w(date).each do |x|
|
||||
install_date_element("\#{DC_PREFIX}_\#{x}", 'w3cdtf', x)
|
||||
end
|
||||
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 |x, plural_name|
|
||||
module_eval(<<-EOC, *get_file_and_line_from_caller(0))
|
||||
class DublinCore#{Utils.to_class_name(x)} < Element
|
||||
include RSS10
|
||||
|
||||
content_setup
|
||||
|
||||
class << self
|
||||
def required_prefix
|
||||
DC_PREFIX
|
||||
end
|
||||
|
||||
def required_uri
|
||||
DC_URI
|
||||
end
|
||||
end
|
||||
|
||||
@tag_name = #{x.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_#{x}
|
||||
end
|
||||
|
||||
def setup_maker_attributes(#{x})
|
||||
#{x}.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
|
||||
undef_method(:content=)
|
||||
undef_method(:value=)
|
||||
|
||||
date_writer("content", #{type.dump}, #{name.dump})
|
||||
|
||||
alias_method(:value=, :content=)
|
||||
end
|
||||
EOC
|
||||
end
|
||||
|
||||
def dc_validate(tags)
|
||||
counter = {}
|
||||
ELEMENTS.each do |x|
|
||||
counter[x] = 0
|
||||
end
|
||||
|
||||
tags.each do |tag|
|
||||
key = "#{DC_PREFIX}_#{tag}"
|
||||
raise UnknownTagError.new(tag, DC_URI) unless counter.has_key?(key)
|
||||
counter[key] += 1
|
||||
raise TooMuchTagError.new(tag, tag_name) if counter[key] > 1
|
||||
unless DublinCoreModel::ELEMENTS.include?(key)
|
||||
raise UnknownTagError.new(tag, DC_URI)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -57,9 +151,10 @@ module RSS
|
|||
class Textinput; include DublinCoreModel; end
|
||||
end
|
||||
|
||||
prefix_size = DC_PREFIX.size + 1
|
||||
DublinCoreModel::ELEMENTS.each do |x|
|
||||
BaseListener.install_get_text_element(DC_URI, x[prefix_size..-1], "#{x}=")
|
||||
class_name = Utils.to_class_name(x)
|
||||
BaseListener.install_class_name(DC_URI, x, "DublinCore#{class_name}")
|
||||
end
|
||||
|
||||
DublinCoreModel::ELEMENTS.collect! {|x| "#{DC_PREFIX}_#{x}"}
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue