зеркало из https://github.com/github/ruby.git
* 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:
Родитель
5ddcd35cf1
Коммит
d12dff187a
40
ChangeLog
40
ChangeLog
|
@ -1,3 +1,43 @@
|
||||||
|
Tue Apr 5 15:15:26 2005 Kouhei Sutou <kou@kono.cis.iwate-u.ac.jp>
|
||||||
|
|
||||||
|
* 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.
|
||||||
|
|
||||||
Mon Apr 4 23:17:52 2005 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
Mon Apr 4 23:17:52 2005 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
||||||
|
|
||||||
* ext/tk/lib/tk.rb (TkComm#array2tk_list): accept enc-mode argument to
|
* ext/tk/lib/tk.rb (TkComm#array2tk_list): accept enc-mode argument to
|
||||||
|
|
|
@ -7,41 +7,135 @@ module RSS
|
||||||
|
|
||||||
RDF.install_ns(DC_PREFIX, DC_URI)
|
RDF.install_ns(DC_PREFIX, DC_URI)
|
||||||
|
|
||||||
module DublinCoreModel
|
module BaseDublinCoreModel
|
||||||
|
def append_features(klass)
|
||||||
extend BaseModel
|
|
||||||
|
|
||||||
ELEMENTS = []
|
|
||||||
|
|
||||||
def self.append_features(klass)
|
|
||||||
super
|
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|
|
return if klass.instance_of?(Module)
|
||||||
install_date_element("\#{DC_PREFIX}_\#{x}", 'w3cdtf', x)
|
DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name|
|
||||||
end
|
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
|
||||||
alias date= #{DC_PREFIX}_date=
|
alias date= #{DC_PREFIX}_date=
|
||||||
EOC
|
EOC
|
||||||
end
|
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)
|
def dc_validate(tags)
|
||||||
counter = {}
|
|
||||||
ELEMENTS.each do |x|
|
|
||||||
counter[x] = 0
|
|
||||||
end
|
|
||||||
|
|
||||||
tags.each do |tag|
|
tags.each do |tag|
|
||||||
key = "#{DC_PREFIX}_#{tag}"
|
key = "#{DC_PREFIX}_#{tag}"
|
||||||
raise UnknownTagError.new(tag, DC_URI) unless counter.has_key?(key)
|
unless DublinCoreModel::ELEMENTS.include?(key)
|
||||||
counter[key] += 1
|
raise UnknownTagError.new(tag, DC_URI)
|
||||||
raise TooMuchTagError.new(tag, tag_name) if counter[key] > 1
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -57,9 +151,10 @@ module RSS
|
||||||
class Textinput; include DublinCoreModel; end
|
class Textinput; include DublinCoreModel; end
|
||||||
end
|
end
|
||||||
|
|
||||||
prefix_size = DC_PREFIX.size + 1
|
|
||||||
DublinCoreModel::ELEMENTS.each do |x|
|
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
|
end
|
||||||
|
|
||||||
|
DublinCoreModel::ELEMENTS.collect! {|x| "#{DC_PREFIX}_#{x}"}
|
||||||
end
|
end
|
||||||
|
|
|
@ -81,6 +81,10 @@ module RSS
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def current_element(rss)
|
||||||
|
rss
|
||||||
|
end
|
||||||
|
|
||||||
def setup_values(target)
|
def setup_values(target)
|
||||||
set = false
|
set = false
|
||||||
if have_required_values?
|
if have_required_values?
|
||||||
|
|
|
@ -7,16 +7,92 @@ module RSS
|
||||||
def self.append_features(klass)
|
def self.append_features(klass)
|
||||||
super
|
super
|
||||||
|
|
||||||
::RSS::DublinCoreModel::ELEMENTS.uniq.each do |element|
|
::RSS::DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name|
|
||||||
klass.add_need_initialize_variable(element)
|
plural_name ||= "#{name}s"
|
||||||
klass.add_other_element(element)
|
full_name = "#{RSS::DC_PREFIX}_#{name}"
|
||||||
klass.__send__(:attr_accessor, element)
|
full_plural_name = "#{RSS::DC_PREFIX}_#{plural_name}"
|
||||||
|
klass_name = Utils.to_class_name(name)
|
||||||
|
plural_klass_name = "DublinCore#{Utils.to_class_name(plural_name)}"
|
||||||
|
full_plural_klass_name = "self.class::#{plural_klass_name}"
|
||||||
|
full_klass_name = "#{full_plural_klass_name}::#{klass_name}"
|
||||||
|
klass.add_need_initialize_variable(full_plural_name,
|
||||||
|
"make_#{full_plural_name}")
|
||||||
|
klass.add_other_element(full_plural_name)
|
||||||
|
klass.__send__(:attr_accessor, full_plural_name)
|
||||||
klass.module_eval(<<-EOC, __FILE__, __LINE__)
|
klass.module_eval(<<-EOC, __FILE__, __LINE__)
|
||||||
def setup_#{element}(rss, current)
|
def make_#{full_plural_name}
|
||||||
if #{element} and current.respond_to?(:#{element}=)
|
#{full_plural_klass_name}.new(@maker)
|
||||||
current.#{element} = #{element}
|
end
|
||||||
|
|
||||||
|
def setup_#{full_plural_name}(rss, current)
|
||||||
|
@#{full_plural_name}.to_rss(rss, current)
|
||||||
|
end
|
||||||
|
|
||||||
|
def #{full_name}
|
||||||
|
@#{full_plural_name}[0] and @#{full_plural_name}[0].value
|
||||||
|
end
|
||||||
|
|
||||||
|
def #{full_name}=(new_value)
|
||||||
|
@#{full_plural_name}[0] = #{full_klass_name}.new(self)
|
||||||
|
@#{full_plural_name}[0].value = new_value
|
||||||
|
end
|
||||||
|
EOC
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
::RSS::DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name|
|
||||||
|
plural_name ||= "#{name}s"
|
||||||
|
klass_name = Utils.to_class_name(name)
|
||||||
|
plural_klass_name = "DublinCore#{Utils.to_class_name(plural_name)}"
|
||||||
|
module_eval(<<-EOC, __FILE__, __LINE__)
|
||||||
|
class #{plural_klass_name}Base
|
||||||
|
include Base
|
||||||
|
|
||||||
|
def_array_element(#{plural_name.dump})
|
||||||
|
|
||||||
|
def new_#{name}
|
||||||
|
#{name} = self.class::#{klass_name}.new(self)
|
||||||
|
@#{plural_name} << #{name}
|
||||||
|
#{name}
|
||||||
|
end
|
||||||
|
|
||||||
|
def to_rss(rss, current)
|
||||||
|
@#{plural_name}.each do |#{name}|
|
||||||
|
#{name}.to_rss(rss, current)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class #{klass_name}Base
|
||||||
|
include Base
|
||||||
|
|
||||||
|
attr_accessor :value
|
||||||
|
add_need_initialize_variable("value")
|
||||||
|
alias_method(:content, :value)
|
||||||
|
alias_method(:content=, :value=)
|
||||||
|
|
||||||
|
def have_required_values?
|
||||||
|
@value
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
EOC
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.install_dublin_core(klass)
|
||||||
|
::RSS::DublinCoreModel::ELEMENT_NAME_INFOS.each do |name, plural_name|
|
||||||
|
plural_name ||= "#{name}s"
|
||||||
|
klass_name = Utils.to_class_name(name)
|
||||||
|
plural_klass_name = "DublinCore#{Utils.to_class_name(plural_name)}"
|
||||||
|
klass.module_eval(<<-EOC, *Utils.get_file_and_line_from_caller(1))
|
||||||
|
class #{plural_klass_name} < #{plural_klass_name}Base
|
||||||
|
class #{klass_name} < #{klass_name}Base
|
||||||
|
def to_rss(rss, current)
|
||||||
|
if value and current.respond_to?(:dc_#{name})
|
||||||
|
current.dc_#{name} = value
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
EOC
|
EOC
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -24,7 +100,7 @@ EOC
|
||||||
|
|
||||||
class ChannelBase
|
class ChannelBase
|
||||||
include DublinCoreModel
|
include DublinCoreModel
|
||||||
|
|
||||||
undef_method(:dc_date)
|
undef_method(:dc_date)
|
||||||
undef_method(:dc_date=)
|
undef_method(:dc_date=)
|
||||||
alias_method(:dc_date, :date)
|
alias_method(:dc_date, :date)
|
||||||
|
@ -43,5 +119,45 @@ EOC
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
class TextinputBase; include DublinCoreModel; end
|
class TextinputBase; include DublinCoreModel; end
|
||||||
|
|
||||||
|
class RSS10
|
||||||
|
class Channel
|
||||||
|
DublinCoreModel.install_dublin_core(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
class Image
|
||||||
|
DublinCoreModel.install_dublin_core(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
class Items
|
||||||
|
class Item
|
||||||
|
DublinCoreModel.install_dublin_core(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Textinput
|
||||||
|
DublinCoreModel.install_dublin_core(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class RSS09
|
||||||
|
class Channel
|
||||||
|
DublinCoreModel.install_dublin_core(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
class Image
|
||||||
|
DublinCoreModel.install_dublin_core(self)
|
||||||
|
end
|
||||||
|
|
||||||
|
class Items
|
||||||
|
class Item
|
||||||
|
DublinCoreModel.install_dublin_core(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class Textinput
|
||||||
|
DublinCoreModel.install_dublin_core(self)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -30,8 +30,10 @@ EOC
|
||||||
include Maker::DublinCoreModel
|
include Maker::DublinCoreModel
|
||||||
|
|
||||||
attr_accessor :about, :resource, :image_width, :image_height
|
attr_accessor :about, :resource, :image_width, :image_height
|
||||||
add_need_initialize_variable(:about, :resource)
|
add_need_initialize_variable("about")
|
||||||
add_need_initialize_variable(:image_width, :image_height)
|
add_need_initialize_variable("resource")
|
||||||
|
add_need_initialize_variable("image_width")
|
||||||
|
add_need_initialize_variable("image_height")
|
||||||
alias width= image_width=
|
alias width= image_width=
|
||||||
alias width image_width
|
alias width image_width
|
||||||
alias height= image_height=
|
alias height= image_height=
|
||||||
|
@ -69,7 +71,8 @@ EOC
|
||||||
include Maker::DublinCoreModel
|
include Maker::DublinCoreModel
|
||||||
|
|
||||||
attr_accessor :about, :image_size
|
attr_accessor :about, :image_size
|
||||||
add_need_initialize_variable(:about, :image_size)
|
add_need_initialize_variable("about")
|
||||||
|
add_need_initialize_variable("image_size")
|
||||||
alias size image_size
|
alias size image_size
|
||||||
alias size= image_size=
|
alias size= image_size=
|
||||||
|
|
||||||
|
@ -89,10 +92,12 @@ EOC
|
||||||
class Items
|
class Items
|
||||||
class Item
|
class Item
|
||||||
class ImageItem < ImageItemBase
|
class ImageItem < ImageItemBase
|
||||||
|
DublinCoreModel.install_dublin_core(self)
|
||||||
def to_rss(rss, current)
|
def to_rss(rss, current)
|
||||||
if @about
|
if @about
|
||||||
item = ::RSS::ImageItemModel::Item.new(@about, @resource)
|
item = ::RSS::ImageItemModel::Item.new(@about, @resource)
|
||||||
setup_values(item)
|
setup_values(item)
|
||||||
|
setup_other_elements(item)
|
||||||
current.image_item = item
|
current.image_item = item
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -102,11 +107,13 @@ EOC
|
||||||
|
|
||||||
class Channel
|
class Channel
|
||||||
class ImageFavicon < ImageFaviconBase
|
class ImageFavicon < ImageFaviconBase
|
||||||
|
DublinCoreModel.install_dublin_core(self)
|
||||||
def to_rss(rss, current)
|
def to_rss(rss, current)
|
||||||
if @about and @image_size
|
if @about and @image_size
|
||||||
args = [@about, @image_size]
|
args = [@about, @image_size]
|
||||||
favicon = ::RSS::ImageFaviconModel::Favicon.new(*args)
|
favicon = ::RSS::ImageFaviconModel::Favicon.new(*args)
|
||||||
setup_values(favicon)
|
setup_values(favicon)
|
||||||
|
setup_other_elements(favicon)
|
||||||
current.image_favicon = favicon
|
current.image_favicon = favicon
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -118,6 +125,7 @@ EOC
|
||||||
class Items
|
class Items
|
||||||
class Item
|
class Item
|
||||||
class ImageItem < ImageItemBase
|
class ImageItem < ImageItemBase
|
||||||
|
DublinCoreModel.install_dublin_core(self)
|
||||||
def to_rss(*args)
|
def to_rss(*args)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -126,6 +134,7 @@ EOC
|
||||||
|
|
||||||
class Channel
|
class Channel
|
||||||
class ImageFavicon < ImageFaviconBase
|
class ImageFavicon < ImageFaviconBase
|
||||||
|
DublinCoreModel.install_dublin_core(self)
|
||||||
def to_rss(*args)
|
def to_rss(*args)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -56,7 +56,7 @@ module RSS
|
||||||
include Base
|
include Base
|
||||||
|
|
||||||
attr_accessor :value
|
attr_accessor :value
|
||||||
add_need_initialize_variable(:value)
|
add_need_initialize_variable("value")
|
||||||
|
|
||||||
alias_method(:resource, :value)
|
alias_method(:resource, :value)
|
||||||
alias_method(:resource=, :value=)
|
alias_method(:resource=, :value=)
|
||||||
|
|
|
@ -125,6 +125,7 @@ module RSS
|
||||||
|
|
||||||
@@setters = {}
|
@@setters = {}
|
||||||
@@registered_uris = {}
|
@@registered_uris = {}
|
||||||
|
@@class_names = {}
|
||||||
|
|
||||||
def install_setter(uri, tag_name, setter)
|
def install_setter(uri, tag_name, setter)
|
||||||
@@setters[uri] ||= {}
|
@@setters[uri] ||= {}
|
||||||
|
@ -146,16 +147,29 @@ module RSS
|
||||||
[]
|
[]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def register_uri(uri, name)
|
def register_uri(uri, name)
|
||||||
@@registered_uris[name] ||= {}
|
@@registered_uris[name] ||= {}
|
||||||
@@registered_uris[name][uri] = nil
|
@@registered_uris[name][uri] = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
def uri_registered?(uri, name)
|
def uri_registered?(uri, name)
|
||||||
@@registered_uris[name].has_key?(uri)
|
@@registered_uris[name].has_key?(uri)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def install_class_name(uri, tag_name, class_name)
|
||||||
|
@@class_names[uri] ||= {}
|
||||||
|
@@class_names[uri][tag_name] = class_name
|
||||||
|
end
|
||||||
|
|
||||||
|
def class_name(uri, tag_name)
|
||||||
|
begin
|
||||||
|
@@class_names[uri][tag_name]
|
||||||
|
rescue NameError
|
||||||
|
tag_name[0,1].upcase + tag_name[1..-1]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def install_get_text_element(uri, name, setter)
|
def install_get_text_element(uri, name, setter)
|
||||||
install_setter(uri, name, setter)
|
install_setter(uri, name, setter)
|
||||||
def_get_text_element(uri, name, *get_file_and_line_from_caller(1))
|
def_get_text_element(uri, name, *get_file_and_line_from_caller(1))
|
||||||
|
@ -275,13 +289,11 @@ module RSS
|
||||||
end
|
end
|
||||||
|
|
||||||
def start_else_element(local, prefix, attrs, ns)
|
def start_else_element(local, prefix, attrs, ns)
|
||||||
class_name = local[0,1].upcase << local[1..-1]
|
class_name = self.class.class_name(ns[prefix], local)
|
||||||
current_class = @last_element.class
|
current_class = @last_element.class
|
||||||
# begin
|
|
||||||
if current_class.constants.include?(class_name)
|
if current_class.constants.include?(class_name)
|
||||||
next_class = current_class.const_get(class_name)
|
next_class = current_class.const_get(class_name)
|
||||||
start_have_something_element(local, prefix, attrs, ns, next_class)
|
start_have_something_element(local, prefix, attrs, ns, next_class)
|
||||||
# rescue NameError
|
|
||||||
else
|
else
|
||||||
if @ignore_unknown_element
|
if @ignore_unknown_element
|
||||||
@proc_stack.push(nil)
|
@proc_stack.push(nil)
|
||||||
|
|
|
@ -51,6 +51,14 @@ module Enumerable
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class Hash
|
||||||
|
unless instance_methods.include?("merge")
|
||||||
|
def merge(other)
|
||||||
|
dup.update(other)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
require "English"
|
require "English"
|
||||||
require "rss/utils"
|
require "rss/utils"
|
||||||
require "rss/converter"
|
require "rss/converter"
|
||||||
|
@ -222,38 +230,7 @@ EOC
|
||||||
|
|
||||||
# accessor
|
# accessor
|
||||||
convert_attr_reader name
|
convert_attr_reader name
|
||||||
module_eval(<<-EOC, *get_file_and_line_from_caller(2))
|
date_writer(name, type, disp_name)
|
||||||
def #{name}=(new_value)
|
|
||||||
if new_value.kind_of?(Time)
|
|
||||||
@#{name} = new_value
|
|
||||||
else
|
|
||||||
if @do_validate
|
|
||||||
begin
|
|
||||||
@#{name} = Time.send('#{type}', new_value)
|
|
||||||
rescue ArgumentError
|
|
||||||
raise NotAvailableValueError.new('#{disp_name}', new_value)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
@#{name} = nil
|
|
||||||
if /\\A\\s*\\z/ !~ new_value.to_s
|
|
||||||
begin
|
|
||||||
@#{name} = Time.parse(new_value)
|
|
||||||
rescue ArgumentError
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
# Is it need?
|
|
||||||
if @#{name}
|
|
||||||
class << @#{name}
|
|
||||||
undef_method(:to_s)
|
|
||||||
alias_method(:to_s, :#{type})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
EOC
|
|
||||||
|
|
||||||
install_element(name) do |n, elem_name|
|
install_element(name) do |n, elem_name|
|
||||||
<<-EOC
|
<<-EOC
|
||||||
|
@ -301,6 +278,41 @@ EOC
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def date_writer(name, type, disp_name=name)
|
||||||
|
module_eval(<<-EOC, *get_file_and_line_from_caller(2))
|
||||||
|
def #{name}=(new_value)
|
||||||
|
if new_value.nil? or new_value.kind_of?(Time)
|
||||||
|
@#{name} = new_value
|
||||||
|
else
|
||||||
|
if @do_validate
|
||||||
|
begin
|
||||||
|
@#{name} = Time.send('#{type}', new_value)
|
||||||
|
rescue ArgumentError
|
||||||
|
raise NotAvailableValueError.new('#{disp_name}', new_value)
|
||||||
|
end
|
||||||
|
else
|
||||||
|
@#{name} = nil
|
||||||
|
if /\\A\\s*\\z/ !~ new_value.to_s
|
||||||
|
begin
|
||||||
|
@#{name} = Time.parse(new_value)
|
||||||
|
rescue ArgumentError
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Is it need?
|
||||||
|
if @#{name}
|
||||||
|
class << @#{name}
|
||||||
|
undef_method(:to_s)
|
||||||
|
alias_method(:to_s, :#{type})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
EOC
|
||||||
|
end
|
||||||
|
|
||||||
def def_children_accessor(accessor_name, plural_name)
|
def def_children_accessor(accessor_name, plural_name)
|
||||||
module_eval(<<-EOC, *get_file_and_line_from_caller(2))
|
module_eval(<<-EOC, *get_file_and_line_from_caller(2))
|
||||||
def #{plural_name}
|
def #{plural_name}
|
||||||
|
@ -660,8 +672,9 @@ EOC
|
||||||
klass = next_element.class
|
klass = next_element.class
|
||||||
prefix = ""
|
prefix = ""
|
||||||
prefix << "#{klass.required_prefix}_" if klass.required_prefix
|
prefix << "#{klass.required_prefix}_" if klass.required_prefix
|
||||||
if self.class.plural_forms.has_key?(tag_name)
|
key = "#{prefix}#{tag_name}"
|
||||||
ary = __send__("#{prefix}#{self.class.plural_forms[tag_name]}")
|
if self.class.plural_forms.has_key?(key)
|
||||||
|
ary = __send__("#{self.class.plural_forms[key]}")
|
||||||
ary << next_element
|
ary << next_element
|
||||||
else
|
else
|
||||||
__send__("#{prefix}#{tag_name}=", next_element)
|
__send__("#{prefix}#{tag_name}=", next_element)
|
||||||
|
|
|
@ -11,14 +11,6 @@ module RSS
|
||||||
|
|
||||||
module TrackBackUtils
|
module TrackBackUtils
|
||||||
private
|
private
|
||||||
def new_with_value_if_need(klass, value)
|
|
||||||
if value.is_a?(klass)
|
|
||||||
value
|
|
||||||
else
|
|
||||||
klass.new(value)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def trackback_validate(tags)
|
def trackback_validate(tags)
|
||||||
counter = {}
|
counter = {}
|
||||||
%w(ping about).each do |x|
|
%w(ping about).each do |x|
|
||||||
|
@ -60,7 +52,7 @@ module RSS
|
||||||
|
|
||||||
remove_method :#{var_name}=
|
remove_method :#{var_name}=
|
||||||
def #{var_name}=(value)
|
def #{var_name}=(value)
|
||||||
@#{var_name} = new_with_value_if_need(#{klass_name}, value)
|
@#{var_name} = Utils.new_with_value_if_need(#{klass_name}, value)
|
||||||
end
|
end
|
||||||
EOC
|
EOC
|
||||||
end
|
end
|
||||||
|
@ -88,16 +80,16 @@ module RSS
|
||||||
remove_method :set_#{var_name}
|
remove_method :set_#{var_name}
|
||||||
def #{var_name}=(*args)
|
def #{var_name}=(*args)
|
||||||
if args.size == 1
|
if args.size == 1
|
||||||
item = new_with_value_if_need(#{klass_name}, args[0])
|
item = Utils.new_with_value_if_need(#{klass_name}, args[0])
|
||||||
@#{var_name}.push(item)
|
@#{var_name}.push(item)
|
||||||
else
|
else
|
||||||
new_val = args.last
|
new_val = args.last
|
||||||
if new_val.is_a?(Array)
|
if new_val.is_a?(Array)
|
||||||
new_val = new_value.collect do |val|
|
new_val = new_value.collect do |val|
|
||||||
new_with_value_if_need(#{klass_name}, val)
|
Utils.new_with_value_if_need(#{klass_name}, val)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
new_val = new_with_value_if_need(#{klass_name}, new_val)
|
new_val = Utils.new_with_value_if_need(#{klass_name}, new_val)
|
||||||
end
|
end
|
||||||
@#{var_name}.send("[]=", *(args[0..-2] + [new_val]))
|
@#{var_name}.send("[]=", *(args[0..-2] + [new_val]))
|
||||||
end
|
end
|
||||||
|
|
|
@ -19,6 +19,13 @@ module RSS
|
||||||
end
|
end
|
||||||
alias h html_escape
|
alias h html_escape
|
||||||
|
|
||||||
|
def new_with_value_if_need(klass, value)
|
||||||
|
if value.is_a?(klass)
|
||||||
|
value
|
||||||
|
else
|
||||||
|
klass.new(value)
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -54,26 +54,35 @@ EOR
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_parser
|
def test_parser
|
||||||
|
|
||||||
assert_nothing_raised do
|
assert_nothing_raised do
|
||||||
Parser.parse(@rss_source)
|
Parser.parse(@rss_source)
|
||||||
end
|
end
|
||||||
|
|
||||||
@elems.each do |tag, value|
|
@elems.each do |tag, value|
|
||||||
assert_too_much_tag(tag.to_s, "channel") do
|
rss = nil
|
||||||
Parser.parse(make_RDF(<<-EOR, {@prefix => @uri}))
|
assert_nothing_raised do
|
||||||
|
rss = Parser.parse(make_RDF(<<-EOR, {@prefix => @uri}))
|
||||||
#{make_channel(("<" + @prefix + ":" + tag.to_s + ">" +
|
#{make_channel(("<" + @prefix + ":" + tag.to_s + ">" +
|
||||||
value.to_s +
|
value.to_s +
|
||||||
"</" + @prefix + ":" + tag.to_s + ">") * 2)}
|
"</" + @prefix + ":" + tag.to_s + ">") * 2)}
|
||||||
#{make_item}
|
#{make_item}
|
||||||
EOR
|
EOR
|
||||||
end
|
end
|
||||||
|
plural_reader = "dc_#{tag}" + (tag == :rights ? "es" : "s")
|
||||||
|
values = rss.channel.__send__(plural_reader).collect do |x|
|
||||||
|
val = x.value
|
||||||
|
if val.kind_of?(String)
|
||||||
|
CGI.escapeHTML(val)
|
||||||
|
else
|
||||||
|
val
|
||||||
|
end
|
||||||
|
end
|
||||||
|
assert_equal([value, value], values)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_accessor
|
def test_singular_accessor
|
||||||
|
|
||||||
new_value = "hoge"
|
new_value = "hoge"
|
||||||
|
|
||||||
@elems.each do |name, value|
|
@elems.each do |name, value|
|
||||||
|
@ -101,15 +110,58 @@ EOR
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_plural_accessor
|
||||||
|
new_value = "hoge"
|
||||||
|
|
||||||
|
@elems.each do |name, value|
|
||||||
|
@parents.each do |parent|
|
||||||
|
parsed_value = @rss.send(parent).send("dc_#{name}")
|
||||||
|
if parsed_value.kind_of?(String)
|
||||||
|
parsed_value = CGI.escapeHTML(parsed_value)
|
||||||
|
end
|
||||||
|
assert_equal(value, parsed_value)
|
||||||
|
|
||||||
|
plural_reader = "dc_#{name}" + (name == :rights ? "es" : "s")
|
||||||
|
klass_name = "DublinCore#{Utils.to_class_name(name.to_s)}"
|
||||||
|
klass = DublinCoreModel.const_get(klass_name)
|
||||||
|
if name == :date
|
||||||
|
t = Time.iso8601("2003-01-01T02:30:23+09:00")
|
||||||
|
class << t
|
||||||
|
alias_method(:to_s, :iso8601)
|
||||||
|
end
|
||||||
|
elems = @rss.send(parent).send(plural_reader)
|
||||||
|
elems << klass.new(t.iso8601)
|
||||||
|
values = @rss.send(parent).send(plural_reader).collect{|x| x.value}
|
||||||
|
assert_equal([@rss.send(parent).send("dc_#{name}"), t],
|
||||||
|
values)
|
||||||
|
else
|
||||||
|
elems = @rss.send(parent).send(plural_reader)
|
||||||
|
elems << klass.new(new_value)
|
||||||
|
values = @rss.send(parent).send(plural_reader).collect{|x| x.value}
|
||||||
|
assert_equal([@rss.send(parent).send("dc_#{name}"), new_value],
|
||||||
|
values)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_to_s
|
def test_to_s
|
||||||
|
|
||||||
@elems.each do |name, value|
|
@elems.each do |name, value|
|
||||||
excepted = "<#{@prefix}:#{name}>#{value}</#{@prefix}:#{name}>"
|
excepted = "<#{@prefix}:#{name}>#{value}</#{@prefix}:#{name}>"
|
||||||
@parents.each do |parent|
|
@parents.each do |parent|
|
||||||
assert_equal(excepted, @rss.send(parent).send("dc_#{name}_element"))
|
assert_equal(excepted, @rss.send(parent).send("dc_#{name}_elements"))
|
||||||
|
end
|
||||||
|
|
||||||
|
excepted = Array.new(2, excepted).join("\n")
|
||||||
|
@parents.each do |parent|
|
||||||
|
reader = "dc_#{name}" + (name == :rights ? "es" : "s")
|
||||||
|
elems = @rss.send(parent).send(reader)
|
||||||
|
klass_name = "DublinCore#{Utils.to_class_name(name.to_s)}"
|
||||||
|
klass = DublinCoreModel.const_get(klass_name)
|
||||||
|
elems << klass.new(@rss.send(parent).send("dc_#{name}"))
|
||||||
|
assert_equal(excepted, @rss.send(parent).send("dc_#{name}_elements"))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -117,12 +169,12 @@ EOR
|
||||||
if @parents.include?(parent.name)
|
if @parents.include?(parent.name)
|
||||||
parent.each_element do |elem|
|
parent.each_element do |elem|
|
||||||
if elem.namespace == @uri
|
if elem.namespace == @uri
|
||||||
assert_equal(CGI.escapeHTML(elem.text), @elems[elem.name.intern].to_s)
|
assert_equal(CGI.escapeHTML(elem.text),
|
||||||
|
@elems[elem.name.intern].to_s)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -84,11 +84,11 @@ module RSS
|
||||||
assert_nil(channel.textinput)
|
assert_nil(channel.textinput)
|
||||||
|
|
||||||
@dc_elems.each do |var, value|
|
@dc_elems.each do |var, value|
|
||||||
assert_equal(channel.__send__("dc_#{var}"), value)
|
assert_equal(value, channel.__send__("dc_#{var}"))
|
||||||
end
|
end
|
||||||
|
|
||||||
@sy_elems.each do |var, value|
|
@sy_elems.each do |var, value|
|
||||||
assert_equal(channel.__send__("sy_#{var}"), value)
|
assert_equal(value, channel.__send__("sy_#{var}"))
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
Загрузка…
Ссылка в новой задаче