mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/rss, test/rss:
- supported Atom. - bumped version 0.1.6 to 0.1.7. * sample/rss/convert.rb: added new sample. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12087 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
53cbab0484
commit
966a25465a
71 changed files with 10254 additions and 3045 deletions
429
lib/rss/maker/feed.rb
Normal file
429
lib/rss/maker/feed.rb
Normal file
|
@ -0,0 +1,429 @@
|
|||
require "rss/maker/atom"
|
||||
|
||||
module RSS
|
||||
module Maker
|
||||
module Atom
|
||||
class Feed < RSSBase
|
||||
def initialize
|
||||
super("1.0")
|
||||
@feed_type = "atom"
|
||||
@feed_subtype = "feed"
|
||||
end
|
||||
|
||||
private
|
||||
def make_feed
|
||||
::RSS::Atom::Feed.new(@version, @encoding, @standalone)
|
||||
end
|
||||
|
||||
def setup_elements(feed)
|
||||
setup_channel(feed)
|
||||
setup_image(feed)
|
||||
setup_items(feed)
|
||||
end
|
||||
|
||||
class Channel < ChannelBase
|
||||
def to_feed(feed)
|
||||
set_default_values do
|
||||
setup_values(feed)
|
||||
feed.dc_dates.clear
|
||||
setup_other_elements(feed)
|
||||
if image_favicon.about
|
||||
icon = feed.class::Icon.new
|
||||
icon.content = image_favicon.about
|
||||
feed.icon = icon
|
||||
end
|
||||
unless have_required_values?
|
||||
raise NotSetError.new("maker.channel",
|
||||
not_set_required_variables)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def have_required_values?
|
||||
super and
|
||||
(!authors.empty? or
|
||||
@maker.items.any? {|item| !item.authors.empty?})
|
||||
end
|
||||
|
||||
private
|
||||
def required_variable_names
|
||||
%w(id updated)
|
||||
end
|
||||
|
||||
def variables
|
||||
super + %w(id updated)
|
||||
end
|
||||
|
||||
def variable_is_set?
|
||||
super or !authors.empty?
|
||||
end
|
||||
|
||||
def not_set_required_variables
|
||||
vars = super
|
||||
if authors.empty? and
|
||||
@maker.items.all? {|item| item.author.to_s.empty?}
|
||||
vars << "author"
|
||||
end
|
||||
vars << "title" unless title.have_required_values?
|
||||
vars
|
||||
end
|
||||
|
||||
def _set_default_values(&block)
|
||||
keep = {
|
||||
:id => id,
|
||||
:updated => updated,
|
||||
}
|
||||
self.id ||= about
|
||||
self.updated ||= dc_date
|
||||
super(&block)
|
||||
ensure
|
||||
self.id = keep[:id]
|
||||
self.updated = keep[:updated]
|
||||
end
|
||||
|
||||
class SkipDays < SkipDaysBase
|
||||
def to_feed(*args)
|
||||
end
|
||||
|
||||
class Day < DayBase
|
||||
end
|
||||
end
|
||||
|
||||
class SkipHours < SkipHoursBase
|
||||
def to_feed(*args)
|
||||
end
|
||||
|
||||
class Hour < HourBase
|
||||
end
|
||||
end
|
||||
|
||||
class Cloud < CloudBase
|
||||
def to_feed(*args)
|
||||
end
|
||||
end
|
||||
|
||||
class Categories < CategoriesBase
|
||||
class Category < CategoryBase
|
||||
include AtomCategory
|
||||
|
||||
def self.not_set_name
|
||||
"maker.channel.category"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class Links < LinksBase
|
||||
class Link < LinkBase
|
||||
include AtomLink
|
||||
|
||||
def self.not_set_name
|
||||
"maker.channel.link"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
AtomPersons.def_atom_persons(self, "author", "maker.channel.author")
|
||||
AtomPersons.def_atom_persons(self, "contributor",
|
||||
"maker.channel.contributor")
|
||||
|
||||
class Generator < GeneratorBase
|
||||
include AtomGenerator
|
||||
|
||||
def self.not_set_name
|
||||
"maker.channel.generator"
|
||||
end
|
||||
end
|
||||
|
||||
AtomTextConstruct.def_atom_text_construct(self, "rights",
|
||||
"maker.channel.copyright",
|
||||
"Copyright")
|
||||
AtomTextConstruct.def_atom_text_construct(self, "subtitle",
|
||||
"maker.channel.description",
|
||||
"Description")
|
||||
AtomTextConstruct.def_atom_text_construct(self, "title",
|
||||
"maker.channel.title")
|
||||
end
|
||||
|
||||
class Image < ImageBase
|
||||
def to_feed(feed)
|
||||
logo = feed.class::Logo.new
|
||||
class << logo
|
||||
alias url= content=
|
||||
end
|
||||
set = setup_values(logo)
|
||||
class << logo
|
||||
undef url=
|
||||
end
|
||||
if set
|
||||
feed.logo = logo
|
||||
set_parent(logo, feed)
|
||||
setup_other_elements(feed, logo)
|
||||
elsif variable_is_set?
|
||||
raise NotSetError.new("maker.image", not_set_required_variables)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def required_variable_names
|
||||
%w(url)
|
||||
end
|
||||
end
|
||||
|
||||
class Items < ItemsBase
|
||||
def to_feed(feed)
|
||||
normalize.each do |item|
|
||||
item.to_feed(feed)
|
||||
end
|
||||
setup_other_elements(feed, feed.entries)
|
||||
end
|
||||
|
||||
class Item < ItemBase
|
||||
def to_feed(feed)
|
||||
set_default_values do
|
||||
entry = feed.class::Entry.new
|
||||
set = setup_values(entry)
|
||||
setup_other_elements(feed, entry)
|
||||
if set
|
||||
feed.entries << entry
|
||||
set_parent(entry, feed)
|
||||
elsif variable_is_set?
|
||||
raise NotSetError.new("maker.item", not_set_required_variables)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def have_required_values?
|
||||
set_default_values do
|
||||
super and title.have_required_values?
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def required_variable_names
|
||||
%w(id updated)
|
||||
end
|
||||
|
||||
def variables
|
||||
super + ["updated"]
|
||||
end
|
||||
|
||||
def not_set_required_variables
|
||||
vars = super
|
||||
vars << "title" unless title.have_required_values?
|
||||
vars
|
||||
end
|
||||
|
||||
def _set_default_values(&block)
|
||||
keep = {
|
||||
:id => id,
|
||||
:updated => updated,
|
||||
}
|
||||
self.id ||= link
|
||||
self.updated ||= dc_date
|
||||
super(&block)
|
||||
ensure
|
||||
self.id = keep[:id]
|
||||
self.updated = keep[:updated]
|
||||
end
|
||||
|
||||
class Guid < GuidBase
|
||||
def to_feed(feed, current)
|
||||
end
|
||||
end
|
||||
|
||||
class Enclosure < EnclosureBase
|
||||
def to_feed(feed, current)
|
||||
end
|
||||
end
|
||||
|
||||
class Source < SourceBase
|
||||
def to_feed(feed, current)
|
||||
source = current.class::Source.new
|
||||
setup_values(source)
|
||||
current.source = source
|
||||
set_parent(source, current)
|
||||
setup_other_elements(feed, source)
|
||||
current.source = nil if source.to_s == "<source/>"
|
||||
end
|
||||
|
||||
private
|
||||
def required_variable_names
|
||||
[]
|
||||
end
|
||||
|
||||
def variables
|
||||
super + ["updated"]
|
||||
end
|
||||
|
||||
AtomPersons.def_atom_persons(self, "author",
|
||||
"maker.item.source.author")
|
||||
AtomPersons.def_atom_persons(self, "contributor",
|
||||
"maker.item.source.contributor")
|
||||
|
||||
class Categories < CategoriesBase
|
||||
class Category < CategoryBase
|
||||
include AtomCategory
|
||||
|
||||
def self.not_set_name
|
||||
"maker.item.source.category"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class Generator < GeneratorBase
|
||||
include AtomGenerator
|
||||
|
||||
def self.not_set_name
|
||||
"maker.item.source.generator"
|
||||
end
|
||||
end
|
||||
|
||||
class Icon < IconBase
|
||||
def to_feed(feed, current)
|
||||
icon = current.class::Icon.new
|
||||
class << icon
|
||||
alias url= content=
|
||||
end
|
||||
set = setup_values(icon)
|
||||
class << icon
|
||||
undef url=
|
||||
end
|
||||
if set
|
||||
current.icon = icon
|
||||
set_parent(icon, current)
|
||||
setup_other_elements(feed, icon)
|
||||
elsif variable_is_set?
|
||||
raise NotSetError.new("maker.item.source.icon",
|
||||
not_set_required_variables)
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def required_variable_names
|
||||
%w(url)
|
||||
end
|
||||
end
|
||||
|
||||
class Links < LinksBase
|
||||
class Link < LinkBase
|
||||
include AtomLink
|
||||
|
||||
def self.not_set_name
|
||||
"maker.item.source.link"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class Logo < LogoBase
|
||||
include AtomLogo
|
||||
|
||||
def self.not_set_name
|
||||
"maker.item.source.logo"
|
||||
end
|
||||
end
|
||||
|
||||
maker_name_base = "maker.item.source."
|
||||
maker_name = "#{maker_name_base}rights"
|
||||
AtomTextConstruct.def_atom_text_construct(self, "rights",
|
||||
maker_name)
|
||||
maker_name = "#{maker_name_base}subtitle"
|
||||
AtomTextConstruct.def_atom_text_construct(self, "subtitle",
|
||||
maker_name)
|
||||
maker_name = "#{maker_name_base}title"
|
||||
AtomTextConstruct.def_atom_text_construct(self, "title",
|
||||
maker_name)
|
||||
end
|
||||
|
||||
class Categories < CategoriesBase
|
||||
class Category < CategoryBase
|
||||
include AtomCategory
|
||||
|
||||
def self.not_set_name
|
||||
"maker.item.category"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
AtomPersons.def_atom_persons(self, "author", "maker.item.author")
|
||||
AtomPersons.def_atom_persons(self, "contributor",
|
||||
"maker.item.contributor")
|
||||
|
||||
class Links < LinksBase
|
||||
class Link < LinkBase
|
||||
include AtomLink
|
||||
|
||||
def self.not_set_name
|
||||
"maker.item.link"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
AtomTextConstruct.def_atom_text_construct(self, "rights",
|
||||
"maker.item.rights")
|
||||
AtomTextConstruct.def_atom_text_construct(self, "summary",
|
||||
"maker.item.description",
|
||||
"Description")
|
||||
AtomTextConstruct.def_atom_text_construct(self, "title",
|
||||
"maker.item.title")
|
||||
|
||||
class Content < ContentBase
|
||||
def to_feed(feed, current)
|
||||
content = current.class::Content.new
|
||||
if setup_values(content)
|
||||
content.src = nil if content.src and content.content
|
||||
current.content = content
|
||||
set_parent(content, current)
|
||||
setup_other_elements(feed, content)
|
||||
elsif variable_is_set?
|
||||
raise NotSetError.new("maker.item.content",
|
||||
not_set_required_variables)
|
||||
end
|
||||
end
|
||||
|
||||
alias_method(:xml, :xml_content)
|
||||
|
||||
private
|
||||
def required_variable_names
|
||||
if out_of_line?
|
||||
%w(type)
|
||||
elsif xml_type?
|
||||
%w(xml_content)
|
||||
else
|
||||
%w(content)
|
||||
end
|
||||
end
|
||||
|
||||
def variables
|
||||
if out_of_line?
|
||||
super
|
||||
elsif xml_type?
|
||||
super + %w(xml)
|
||||
else
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
def xml_type?
|
||||
_type = type
|
||||
return false if _type.nil?
|
||||
_type == "xhtml" or
|
||||
/(?:\+xml|\/xml)$/i =~ _type or
|
||||
%w(text/xml-external-parsed-entity
|
||||
application/xml-external-parsed-entity
|
||||
application/xml-dtd).include?(_type.downcase)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class Textinput < TextinputBase
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
add_maker("atom", Atom::Feed)
|
||||
add_maker("atom:feed", Atom::Feed)
|
||||
add_maker("atom1.0", Atom::Feed)
|
||||
add_maker("atom1.0:feed", Atom::Feed)
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue