mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
168 lines
4.8 KiB
Ruby
168 lines
4.8 KiB
Ruby
|
require "rss/maker/atom"
|
||
|
require "rss/maker/feed"
|
||
|
|
||
|
module RSS
|
||
|
module Maker
|
||
|
module Atom
|
||
|
class Entry < RSSBase
|
||
|
def initialize
|
||
|
super("1.0")
|
||
|
@feed_type = "atom"
|
||
|
@feed_subtype = "entry"
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def make_feed
|
||
|
::RSS::Atom::Entry.new(@version, @encoding, @standalone)
|
||
|
end
|
||
|
|
||
|
def setup_elements(entry)
|
||
|
setup_items(entry)
|
||
|
end
|
||
|
|
||
|
class Channel < ChannelBase
|
||
|
class SkipDays < SkipDaysBase
|
||
|
class Day < DayBase
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class SkipHours < SkipHoursBase
|
||
|
class Hour < HourBase
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class Cloud < CloudBase
|
||
|
end
|
||
|
|
||
|
Categories = Feed::Channel::Categories
|
||
|
Links = Feed::Channel::Links
|
||
|
Authors = Feed::Channel::Authors
|
||
|
Contributors = Feed::Channel::Contributors
|
||
|
|
||
|
class Generator < GeneratorBase
|
||
|
include AtomGenerator
|
||
|
|
||
|
def self.not_set_name
|
||
|
"maker.channel.generator"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
Copyright = Feed::Channel::Copyright
|
||
|
|
||
|
class Description < DescriptionBase
|
||
|
end
|
||
|
|
||
|
Title = Feed::Channel::Title
|
||
|
end
|
||
|
|
||
|
class Image < ImageBase
|
||
|
end
|
||
|
|
||
|
class Items < ItemsBase
|
||
|
def to_feed(entry)
|
||
|
(normalize.first || Item.new(@maker)).to_feed(entry)
|
||
|
end
|
||
|
|
||
|
class Item < ItemBase
|
||
|
def to_feed(entry)
|
||
|
set_default_values do
|
||
|
setup_values(entry)
|
||
|
entry.dc_dates.clear
|
||
|
setup_other_elements(entry)
|
||
|
unless have_required_values?
|
||
|
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 variable_is_set?
|
||
|
super or !authors.empty?
|
||
|
end
|
||
|
|
||
|
def not_set_required_variables
|
||
|
set_default_values do
|
||
|
vars = super
|
||
|
if authors.all? {|author| !author.have_required_values?}
|
||
|
vars << "author"
|
||
|
end
|
||
|
vars << "title" unless title.have_required_values?
|
||
|
vars
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def _set_default_values(&block)
|
||
|
keep = {
|
||
|
:authors => authors.to_a.dup,
|
||
|
:contributors => contributors.to_a.dup,
|
||
|
:categories => categories.to_a.dup,
|
||
|
:id => id,
|
||
|
:links => links.to_a.dup,
|
||
|
:rights => @rights,
|
||
|
:title => @title,
|
||
|
:updated => updated,
|
||
|
}
|
||
|
authors.replace(@maker.channel.authors) if keep[:authors].empty?
|
||
|
if keep[:contributors].empty?
|
||
|
contributors.replace(@maker.channel.contributors)
|
||
|
end
|
||
|
if keep[:categories].empty?
|
||
|
categories.replace(@maker.channel.categories)
|
||
|
end
|
||
|
self.id ||= link || @maker.channel.id
|
||
|
links.replace(@maker.channel.links) if keep[:links].empty?
|
||
|
unless keep[:rights].variable_is_set?
|
||
|
@rights = @maker.channel.rights
|
||
|
end
|
||
|
@title = @maker.channel.title unless keep[:title].variable_is_set?
|
||
|
self.updated ||= @maker.channel.updated
|
||
|
super(&block)
|
||
|
ensure
|
||
|
authors.replace(keep[:authors])
|
||
|
contributors.replace(keep[:contributors])
|
||
|
categories.replace(keep[:categories])
|
||
|
links.replace(keep[:links])
|
||
|
self.id = keep[:id]
|
||
|
@rights = keep[:rights]
|
||
|
@title = keep[:title]
|
||
|
self.updated = keep[:prev_updated]
|
||
|
end
|
||
|
|
||
|
Guid = Feed::Items::Item::Guid
|
||
|
Enclosure = Feed::Items::Item::Enclosure
|
||
|
Source = Feed::Items::Item::Source
|
||
|
Categories = Feed::Items::Item::Categories
|
||
|
Authors = Feed::Items::Item::Authors
|
||
|
Contributors = Feed::Items::Item::Contributors
|
||
|
Links = Feed::Items::Item::Links
|
||
|
Rights = Feed::Items::Item::Rights
|
||
|
Description = Feed::Items::Item::Description
|
||
|
Title = Feed::Items::Item::Title
|
||
|
Content = Feed::Items::Item::Content
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class Textinput < TextinputBase
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
add_maker("atom:entry", Atom::Entry)
|
||
|
add_maker("atom1.0:entry", Atom::Entry)
|
||
|
end
|
||
|
end
|