2004-10-31 09:14:21 -05:00
|
|
|
require 'forwardable'
|
|
|
|
|
|
|
|
require 'rss/rss'
|
|
|
|
|
|
|
|
module RSS
|
|
|
|
module Maker
|
|
|
|
module Base
|
|
|
|
def self.append_features(klass)
|
|
|
|
super
|
|
|
|
|
|
|
|
klass.module_eval(<<-EOC, __FILE__, __LINE__)
|
|
|
|
|
|
|
|
OTHER_ELEMENTS = []
|
|
|
|
NEED_INITIALIZE_VARIABLES = []
|
|
|
|
|
|
|
|
def self.inherited(subclass)
|
2004-11-03 01:43:18 -05:00
|
|
|
subclass.const_set("OTHER_ELEMENTS", [])
|
|
|
|
subclass.const_set("NEED_INITIALIZE_VARIABLES", [])
|
|
|
|
|
|
|
|
subclass.module_eval(<<-EOEOC, __FILE__, __LINE__)
|
|
|
|
def self.other_elements
|
2005-01-14 23:46:20 -05:00
|
|
|
OTHER_ELEMENTS + super
|
2004-11-03 01:43:18 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def self.need_initialize_variables
|
2005-01-14 23:46:20 -05:00
|
|
|
NEED_INITIALIZE_VARIABLES + super
|
2004-11-03 01:43:18 -05:00
|
|
|
end
|
|
|
|
EOEOC
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def self.add_other_element(variable_name)
|
2005-01-14 23:46:20 -05:00
|
|
|
OTHER_ELEMENTS << variable_name
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
2004-11-03 01:43:18 -05:00
|
|
|
|
2004-10-31 09:14:21 -05:00
|
|
|
def self.other_elements
|
2004-11-03 01:43:18 -05:00
|
|
|
OTHER_ELEMENTS
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
|
|
|
|
2004-11-19 03:25:25 -05:00
|
|
|
def self.add_need_initialize_variable(variable_name, init_value="nil")
|
2005-01-14 23:46:20 -05:00
|
|
|
NEED_INITIALIZE_VARIABLES << [variable_name, init_value]
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
2004-11-03 01:43:18 -05:00
|
|
|
|
2004-10-31 09:14:21 -05:00
|
|
|
def self.need_initialize_variables
|
2004-11-03 01:43:18 -05:00
|
|
|
NEED_INITIALIZE_VARIABLES
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
2004-11-19 03:25:25 -05:00
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
def self.def_array_element(name, plural=nil, klass=nil)
|
2004-11-19 03:25:25 -05:00
|
|
|
include Enumerable
|
|
|
|
extend Forwardable
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
plural ||= "\#{name}s"
|
|
|
|
klass ||= "self.class::\#{Utils.to_class_name(name)}"
|
|
|
|
|
|
|
|
def_delegators("@\#{plural}", :<<, :[], :[]=, :first, :last)
|
|
|
|
def_delegators("@\#{plural}", :push, :pop, :shift, :unshift)
|
|
|
|
def_delegators("@\#{plural}", :each, :size, :empty?, :clear)
|
|
|
|
|
|
|
|
add_need_initialize_variable(plural, "[]")
|
|
|
|
|
|
|
|
module_eval(<<-EOM, __FILE__, __LINE__ + 1)
|
|
|
|
def new_\#{name}
|
|
|
|
\#{name} = \#{klass}.new(@maker)
|
|
|
|
@\#{plural} << \#{name}
|
|
|
|
if block_given?
|
|
|
|
yield \#{name}
|
|
|
|
else
|
|
|
|
\#{name}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
alias new_child new_\#{name}
|
|
|
|
|
|
|
|
def to_feed(*args)
|
|
|
|
@\#{plural}.each do |\#{name}|
|
|
|
|
\#{name}.to_feed(*args)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def replace(elements)
|
|
|
|
@\#{plural}.replace(elements.to_a)
|
|
|
|
end
|
|
|
|
EOM
|
2004-11-19 03:25:25 -05:00
|
|
|
end
|
2004-10-31 09:14:21 -05:00
|
|
|
EOC
|
|
|
|
end
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
attr_reader :maker
|
2004-10-31 09:14:21 -05:00
|
|
|
def initialize(maker)
|
|
|
|
@maker = maker
|
2007-03-17 06:13:25 -04:00
|
|
|
@default_values_are_set = false
|
2004-10-31 09:14:21 -05:00
|
|
|
initialize_variables
|
|
|
|
end
|
|
|
|
|
|
|
|
def have_required_values?
|
2007-03-17 06:13:25 -04:00
|
|
|
not_set_required_variables.empty?
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
2007-03-17 06:13:25 -04:00
|
|
|
|
|
|
|
def variable_is_set?
|
|
|
|
variables.any? {|var| not __send__(var).nil?}
|
|
|
|
end
|
|
|
|
|
2004-10-31 09:14:21 -05:00
|
|
|
private
|
|
|
|
def initialize_variables
|
2004-11-19 03:25:25 -05:00
|
|
|
self.class.need_initialize_variables.each do |variable_name, init_value|
|
|
|
|
instance_eval("@#{variable_name} = #{init_value}", __FILE__, __LINE__)
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
def setup_other_elements(feed, current=nil)
|
|
|
|
current ||= current_element(feed)
|
2004-10-31 09:14:21 -05:00
|
|
|
self.class.other_elements.each do |element|
|
2007-03-17 06:13:25 -04:00
|
|
|
__send__("setup_#{element}", feed, current)
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
def current_element(feed)
|
|
|
|
feed
|
2005-04-05 02:42:03 -04:00
|
|
|
end
|
2007-03-17 06:13:25 -04:00
|
|
|
|
|
|
|
def set_default_values(&block)
|
|
|
|
return yield if @default_values_are_set
|
|
|
|
|
|
|
|
begin
|
|
|
|
@default_values_are_set = true
|
|
|
|
_set_default_values(&block)
|
|
|
|
ensure
|
|
|
|
@default_values_are_set = false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def _set_default_values(&block)
|
|
|
|
yield
|
|
|
|
end
|
|
|
|
|
2004-10-31 09:14:21 -05:00
|
|
|
def setup_values(target)
|
|
|
|
set = false
|
|
|
|
if have_required_values?
|
|
|
|
variables.each do |var|
|
|
|
|
setter = "#{var}="
|
|
|
|
if target.respond_to?(setter)
|
2005-11-23 04:49:02 -05:00
|
|
|
value = __send__(var)
|
2004-10-31 09:14:21 -05:00
|
|
|
if value
|
|
|
|
target.__send__(setter, value)
|
|
|
|
set = true
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
set
|
|
|
|
end
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
def set_parent(target, parent)
|
|
|
|
target.parent = parent if target.class.need_parent?
|
|
|
|
end
|
|
|
|
|
2004-10-31 09:14:21 -05:00
|
|
|
def variables
|
2004-11-19 03:25:25 -05:00
|
|
|
self.class.need_initialize_variables.find_all do |name, init|
|
|
|
|
"nil" == init
|
|
|
|
end.collect do |name, init|
|
|
|
|
name
|
|
|
|
end
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
2004-11-28 01:53:41 -05:00
|
|
|
|
|
|
|
def not_set_required_variables
|
|
|
|
required_variable_names.find_all do |var|
|
|
|
|
__send__(var).nil?
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def required_variables_are_set?
|
|
|
|
required_variable_names.each do |var|
|
|
|
|
return false if __send__(var).nil?
|
|
|
|
end
|
|
|
|
true
|
|
|
|
end
|
2007-03-17 06:13:25 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
module AtomPersonConstructBase
|
|
|
|
def self.append_features(klass)
|
|
|
|
super
|
|
|
|
|
|
|
|
klass.class_eval(<<-EOC, __FILE__, __LINE__ + 1)
|
|
|
|
%w(name uri email).each do |element|
|
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
|
|
|
EOC
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
module AtomTextConstructBase
|
|
|
|
module EnsureXMLContent
|
|
|
|
def ensure_xml_content(content)
|
|
|
|
xhtml_uri = ::RSS::Atom::XHTML_URI
|
|
|
|
unless content.is_a?(RSS::XML::Element) and
|
|
|
|
["div", xhtml_uri] == [content.name, content.uri]
|
|
|
|
children = content
|
|
|
|
children = [children] unless content.is_a?(Array)
|
|
|
|
children = set_xhtml_uri_as_default_uri(children)
|
|
|
|
content = RSS::XML::Element.new("div", nil, xhtml_uri,
|
|
|
|
{"xmlns" => xhtml_uri},
|
|
|
|
children)
|
|
|
|
end
|
|
|
|
content
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
def set_xhtml_uri_as_default_uri(children)
|
|
|
|
children.collect do |child|
|
|
|
|
if child.is_a?(RSS::XML::Element) and
|
|
|
|
child.prefix.nil? and child.uri.nil?
|
|
|
|
RSS::XML::Element.new(child.name, nil, ::RSS::Atom::XHTML_URI,
|
|
|
|
child.attributes.dup,
|
|
|
|
set_xhtml_uri_as_default_uri(child.children))
|
|
|
|
else
|
|
|
|
child
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.append_features(klass)
|
|
|
|
super
|
|
|
|
|
|
|
|
klass.class_eval(<<-EOC, __FILE__, __LINE__ + 1)
|
|
|
|
include EnsureXMLContent
|
|
|
|
|
|
|
|
%w(type content xml_content).each do |element|
|
|
|
|
attr element, element != "xml_content"
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
|
|
|
|
|
|
|
def xml_content=(content)
|
|
|
|
@xml_content = ensure_xml_content(content)
|
|
|
|
end
|
|
|
|
|
|
|
|
alias_method(:xhtml, :xml_content)
|
|
|
|
alias_method(:xhtml=, :xml_content=)
|
|
|
|
EOC
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
module SetupDefaultDate
|
|
|
|
private
|
|
|
|
def _set_default_values(&block)
|
|
|
|
keep = {
|
|
|
|
:date => date,
|
|
|
|
:dc_dates => dc_dates.to_a.dup,
|
|
|
|
}
|
|
|
|
_date = date
|
|
|
|
if _date and !dc_dates.any? {|dc_date| dc_date.value == _date}
|
|
|
|
dc_date = self.class::DublinCoreDates::Date.new(self)
|
|
|
|
dc_date.value = _date.dup
|
|
|
|
dc_dates.unshift(dc_date)
|
|
|
|
end
|
|
|
|
self.date ||= self.dc_date
|
|
|
|
super(&block)
|
|
|
|
ensure
|
|
|
|
date = keep[:date]
|
|
|
|
dc_dates.replace(keep[:dc_dates])
|
|
|
|
end
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
2004-11-03 01:43:18 -05:00
|
|
|
|
2004-10-31 09:14:21 -05:00
|
|
|
class RSSBase
|
|
|
|
include Base
|
2004-11-03 01:43:18 -05:00
|
|
|
|
2004-10-31 09:14:21 -05:00
|
|
|
class << self
|
|
|
|
def make(&block)
|
|
|
|
new.make(&block)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2004-11-28 01:53:41 -05:00
|
|
|
%w(xml_stylesheets channel image items textinput).each do |element|
|
|
|
|
attr_reader element
|
|
|
|
add_need_initialize_variable(element, "make_#{element}")
|
|
|
|
module_eval(<<-EOC, __FILE__, __LINE__)
|
|
|
|
private
|
2007-03-17 06:13:25 -04:00
|
|
|
def setup_#{element}(feed)
|
|
|
|
@#{element}.to_feed(feed)
|
2004-11-28 01:53:41 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def make_#{element}
|
2005-02-03 10:31:57 -05:00
|
|
|
self.class::#{Utils.to_class_name(element)}.new(self)
|
2004-11-28 01:53:41 -05:00
|
|
|
end
|
|
|
|
EOC
|
|
|
|
end
|
2004-10-31 09:14:21 -05:00
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
attr_reader :feed_version
|
|
|
|
alias_method(:rss_version, :feed_version)
|
2004-10-31 09:14:21 -05:00
|
|
|
attr_accessor :version, :encoding, :standalone
|
2007-03-17 06:13:25 -04:00
|
|
|
|
|
|
|
def initialize(feed_version)
|
2004-10-31 09:14:21 -05:00
|
|
|
super(self)
|
2007-03-17 06:13:25 -04:00
|
|
|
@feed_type = nil
|
|
|
|
@feed_subtype = nil
|
|
|
|
@feed_version = feed_version
|
2004-10-31 09:14:21 -05:00
|
|
|
@version = "1.0"
|
|
|
|
@encoding = "UTF-8"
|
|
|
|
@standalone = nil
|
|
|
|
end
|
|
|
|
|
2004-11-28 01:53:41 -05:00
|
|
|
def make
|
|
|
|
if block_given?
|
|
|
|
yield(self)
|
2007-03-17 06:13:25 -04:00
|
|
|
to_feed
|
2004-11-28 01:53:41 -05:00
|
|
|
else
|
|
|
|
nil
|
|
|
|
end
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
def to_feed
|
|
|
|
feed = make_feed
|
|
|
|
setup_xml_stylesheets(feed)
|
|
|
|
setup_elements(feed)
|
|
|
|
setup_other_elements(feed)
|
|
|
|
if feed.valid?
|
|
|
|
feed
|
2004-11-28 01:53:41 -05:00
|
|
|
else
|
|
|
|
nil
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2004-10-31 09:14:21 -05:00
|
|
|
private
|
2004-11-28 01:59:34 -05:00
|
|
|
remove_method :make_xml_stylesheets
|
2004-10-31 09:14:21 -05:00
|
|
|
def make_xml_stylesheets
|
|
|
|
XMLStyleSheets.new(self)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class XMLStyleSheets
|
|
|
|
include Base
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
def_array_element("xml_stylesheet", nil, "XMLStyleSheet")
|
2004-11-01 08:30:08 -05:00
|
|
|
|
|
|
|
class XMLStyleSheet
|
|
|
|
include Base
|
|
|
|
|
|
|
|
::RSS::XMLStyleSheet::ATTRIBUTES.each do |attribute|
|
|
|
|
attr_accessor attribute
|
|
|
|
add_need_initialize_variable(attribute)
|
|
|
|
end
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
def to_feed(feed)
|
2004-11-01 08:30:08 -05:00
|
|
|
xss = ::RSS::XMLStyleSheet.new
|
2004-11-03 01:43:18 -05:00
|
|
|
guess_type_if_need(xss)
|
2004-11-01 08:30:08 -05:00
|
|
|
set = setup_values(xss)
|
|
|
|
if set
|
2007-03-17 06:13:25 -04:00
|
|
|
feed.xml_stylesheets << xss
|
2004-11-01 08:30:08 -05:00
|
|
|
end
|
|
|
|
end
|
2004-11-03 01:43:18 -05:00
|
|
|
|
|
|
|
private
|
|
|
|
def guess_type_if_need(xss)
|
|
|
|
if @type.nil?
|
|
|
|
xss.href = @href
|
|
|
|
@type = xss.type
|
|
|
|
end
|
|
|
|
end
|
2007-03-17 06:13:25 -04:00
|
|
|
|
|
|
|
def required_variable_names
|
|
|
|
%w(href type)
|
|
|
|
end
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class ChannelBase
|
|
|
|
include Base
|
2007-03-17 06:13:25 -04:00
|
|
|
include SetupDefaultDate
|
2004-10-31 09:14:21 -05:00
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
%w(cloud categories skipDays skipHours links authors
|
|
|
|
contributors generator copyright description
|
|
|
|
title).each do |element|
|
2004-11-19 03:25:25 -05:00
|
|
|
attr_reader element
|
|
|
|
add_other_element(element)
|
|
|
|
add_need_initialize_variable(element, "make_#{element}")
|
|
|
|
module_eval(<<-EOC, __FILE__, __LINE__)
|
|
|
|
private
|
2007-03-17 06:13:25 -04:00
|
|
|
def setup_#{element}(feed, current)
|
|
|
|
@#{element}.to_feed(feed, current)
|
2004-11-19 03:25:25 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def make_#{element}
|
2005-02-03 10:31:57 -05:00
|
|
|
self.class::#{Utils.to_class_name(element)}.new(@maker)
|
2004-11-19 03:25:25 -05:00
|
|
|
end
|
|
|
|
EOC
|
|
|
|
end
|
2004-10-31 09:14:21 -05:00
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
%w(id about language
|
2004-11-19 03:25:25 -05:00
|
|
|
managingEditor webMaster rating docs date
|
2007-03-17 06:13:25 -04:00
|
|
|
lastBuildDate ttl).each do |element|
|
2004-10-31 09:14:21 -05:00
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
def pubDate
|
|
|
|
date
|
|
|
|
end
|
|
|
|
|
|
|
|
def pubDate=(date)
|
|
|
|
self.date = date
|
|
|
|
end
|
|
|
|
|
|
|
|
def updated
|
|
|
|
date
|
|
|
|
end
|
|
|
|
|
|
|
|
def updated=(date)
|
|
|
|
self.date = date
|
|
|
|
end
|
|
|
|
|
|
|
|
def link
|
|
|
|
_link = links.first
|
|
|
|
_link ? _link.href : nil
|
|
|
|
end
|
|
|
|
|
|
|
|
def link=(href)
|
|
|
|
_link = links.first || links.new_link
|
|
|
|
_link.rel = "self"
|
|
|
|
_link.href = href
|
|
|
|
end
|
|
|
|
|
|
|
|
def author
|
|
|
|
_author = authors.first
|
|
|
|
_author ? _author.name : nil
|
|
|
|
end
|
|
|
|
|
|
|
|
def author=(name)
|
|
|
|
_author = authors.first || authors.new_author
|
|
|
|
_author.name = name
|
|
|
|
end
|
|
|
|
|
|
|
|
def contributor
|
|
|
|
_contributor = contributors.first
|
|
|
|
_contributor ? _contributor.name : nil
|
|
|
|
end
|
|
|
|
|
|
|
|
def contributor=(name)
|
|
|
|
_contributor = contributors.first || contributors.new_contributor
|
|
|
|
_contributor.name = name
|
|
|
|
end
|
|
|
|
|
|
|
|
def generator=(content)
|
|
|
|
@generator.content = content
|
|
|
|
end
|
|
|
|
|
|
|
|
def copyright=(content)
|
|
|
|
@copyright.content = content
|
|
|
|
end
|
|
|
|
|
|
|
|
alias_method(:rights, :copyright)
|
|
|
|
alias_method(:rights=, :copyright=)
|
|
|
|
|
|
|
|
def description=(content)
|
|
|
|
@description.content = content
|
|
|
|
end
|
|
|
|
|
|
|
|
alias_method(:subtitle, :description)
|
|
|
|
alias_method(:subtitle=, :description=)
|
|
|
|
|
|
|
|
def title=(content)
|
|
|
|
@title.content = content
|
|
|
|
end
|
2004-11-03 01:43:18 -05:00
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
def icon
|
|
|
|
image_favicon.about
|
|
|
|
end
|
|
|
|
|
|
|
|
def icon=(url)
|
|
|
|
image_favicon.about = url
|
|
|
|
end
|
|
|
|
|
|
|
|
def logo
|
|
|
|
maker.image.url
|
|
|
|
end
|
|
|
|
|
|
|
|
def logo=(url)
|
|
|
|
maker.image.url = url
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
|
|
|
|
2004-11-19 03:25:25 -05:00
|
|
|
class SkipDaysBase
|
|
|
|
include Base
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
def_array_element("day")
|
2004-11-19 03:25:25 -05:00
|
|
|
|
|
|
|
class DayBase
|
|
|
|
include Base
|
|
|
|
|
|
|
|
%w(content).each do |element|
|
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class SkipHoursBase
|
|
|
|
include Base
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
def_array_element("hour")
|
2004-11-19 03:25:25 -05:00
|
|
|
|
|
|
|
class HourBase
|
|
|
|
include Base
|
|
|
|
|
|
|
|
%w(content).each do |element|
|
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
|
|
|
end
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
class CloudBase
|
|
|
|
include Base
|
|
|
|
|
|
|
|
%w(domain port path registerProcedure protocol).each do |element|
|
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
|
|
|
end
|
2004-11-19 03:25:25 -05:00
|
|
|
|
|
|
|
class CategoriesBase
|
|
|
|
include Base
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
def_array_element("category", "categories")
|
2004-11-19 03:25:25 -05:00
|
|
|
|
|
|
|
class CategoryBase
|
|
|
|
include Base
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
%w(domain content label).each do |element|
|
2004-11-19 03:25:25 -05:00
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
2007-03-17 06:13:25 -04:00
|
|
|
|
|
|
|
alias_method(:term, :domain)
|
|
|
|
alias_method(:term=, :domain=)
|
|
|
|
alias_method(:scheme, :content)
|
|
|
|
alias_method(:scheme=, :content=)
|
2004-11-19 03:25:25 -05:00
|
|
|
end
|
|
|
|
end
|
2007-03-17 06:13:25 -04:00
|
|
|
|
|
|
|
class LinksBase
|
|
|
|
include Base
|
|
|
|
|
|
|
|
def_array_element("link")
|
|
|
|
|
|
|
|
class LinkBase
|
|
|
|
include Base
|
|
|
|
|
|
|
|
%w(href rel type hreflang title length).each do |element|
|
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class AuthorsBase
|
|
|
|
include Base
|
|
|
|
|
|
|
|
def_array_element("author")
|
|
|
|
|
|
|
|
class AuthorBase
|
|
|
|
include Base
|
|
|
|
include AtomPersonConstructBase
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class ContributorsBase
|
|
|
|
include Base
|
|
|
|
|
|
|
|
def_array_element("contributor")
|
|
|
|
|
|
|
|
class ContributorBase
|
|
|
|
include Base
|
|
|
|
include AtomPersonConstructBase
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class GeneratorBase
|
|
|
|
include Base
|
|
|
|
|
|
|
|
%w(uri version content).each do |element|
|
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class CopyrightBase
|
|
|
|
include Base
|
|
|
|
include AtomTextConstructBase
|
|
|
|
end
|
|
|
|
|
|
|
|
class DescriptionBase
|
|
|
|
include Base
|
|
|
|
include AtomTextConstructBase
|
|
|
|
end
|
|
|
|
|
|
|
|
class TitleBase
|
|
|
|
include Base
|
|
|
|
include AtomTextConstructBase
|
|
|
|
end
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
class ImageBase
|
|
|
|
include Base
|
|
|
|
|
|
|
|
%w(title url width height description).each do |element|
|
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
2007-03-17 06:13:25 -04:00
|
|
|
|
2004-10-31 09:14:21 -05:00
|
|
|
def link
|
|
|
|
@maker.channel.link
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class ItemsBase
|
|
|
|
include Base
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
def_array_element("item")
|
|
|
|
|
2004-11-27 03:47:28 -05:00
|
|
|
attr_accessor :do_sort, :max_size
|
2004-10-31 09:14:21 -05:00
|
|
|
|
|
|
|
def initialize(maker)
|
|
|
|
super
|
2004-11-03 01:43:18 -05:00
|
|
|
@do_sort = false
|
2004-11-27 03:47:28 -05:00
|
|
|
@max_size = -1
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def normalize
|
2005-09-16 19:48:17 -04:00
|
|
|
if @max_size >= 0
|
|
|
|
sort_if_need[0...@max_size]
|
|
|
|
else
|
|
|
|
sort_if_need[0..@max_size]
|
|
|
|
end
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
def sort_if_need
|
2004-11-03 01:43:18 -05:00
|
|
|
if @do_sort.respond_to?(:call)
|
2004-10-31 09:14:21 -05:00
|
|
|
@items.sort do |x, y|
|
2004-11-03 01:43:18 -05:00
|
|
|
@do_sort.call(x, y)
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
2004-11-03 01:43:18 -05:00
|
|
|
elsif @do_sort
|
2004-10-31 09:14:21 -05:00
|
|
|
@items.sort do |x, y|
|
|
|
|
y <=> x
|
|
|
|
end
|
|
|
|
else
|
|
|
|
@items
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class ItemBase
|
|
|
|
include Base
|
2007-03-17 06:13:25 -04:00
|
|
|
include SetupDefaultDate
|
|
|
|
|
|
|
|
%w(guid enclosure source categories authors links
|
|
|
|
contributors rights description content title).each do |element|
|
2004-10-31 09:14:21 -05:00
|
|
|
attr_reader element
|
|
|
|
add_other_element(element)
|
2004-11-19 03:25:25 -05:00
|
|
|
add_need_initialize_variable(element, "make_#{element}")
|
2004-10-31 09:14:21 -05:00
|
|
|
module_eval(<<-EOC, __FILE__, __LINE__)
|
|
|
|
private
|
2007-03-17 06:13:25 -04:00
|
|
|
def setup_#{element}(feed, current)
|
|
|
|
@#{element}.to_feed(feed, current)
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def make_#{element}
|
2005-02-03 10:31:57 -05:00
|
|
|
self.class::#{Utils.to_class_name(element)}.new(@maker)
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
|
|
|
EOC
|
|
|
|
end
|
2007-03-17 06:13:25 -04:00
|
|
|
|
|
|
|
%w(date comments id published).each do |element|
|
2004-10-31 09:14:21 -05:00
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
def pubDate
|
|
|
|
date
|
|
|
|
end
|
|
|
|
|
|
|
|
def pubDate=(date)
|
|
|
|
self.date = date
|
|
|
|
end
|
|
|
|
|
|
|
|
def updated
|
|
|
|
date
|
|
|
|
end
|
|
|
|
|
|
|
|
def updated=(date)
|
|
|
|
self.date = date
|
|
|
|
end
|
|
|
|
|
|
|
|
def author
|
|
|
|
_link = authors.first
|
|
|
|
_link ? _author.name : nil
|
|
|
|
end
|
|
|
|
|
|
|
|
def author=(name)
|
|
|
|
_author = authors.first || authors.new_author
|
|
|
|
_author.name = name
|
|
|
|
end
|
|
|
|
|
|
|
|
def link
|
|
|
|
_link = links.first
|
|
|
|
_link ? _link.href : nil
|
|
|
|
end
|
|
|
|
|
|
|
|
def link=(href)
|
|
|
|
_link = links.first || links.new_link
|
|
|
|
_link.rel = "alternate"
|
|
|
|
_link.href = href
|
|
|
|
end
|
|
|
|
|
|
|
|
def rights=(content)
|
|
|
|
@rights.content = content
|
|
|
|
end
|
|
|
|
|
|
|
|
def description=(content)
|
|
|
|
@description.content = content
|
|
|
|
end
|
|
|
|
|
|
|
|
alias_method(:summary, :description)
|
|
|
|
alias_method(:summary=, :description=)
|
|
|
|
|
|
|
|
def title=(content)
|
|
|
|
@title.content = content
|
|
|
|
end
|
2004-11-03 01:43:18 -05:00
|
|
|
|
2004-10-31 09:14:21 -05:00
|
|
|
def <=>(other)
|
2007-03-17 06:13:25 -04:00
|
|
|
_date = date || dc_date
|
|
|
|
_other_date = other.date || other.dc_date
|
|
|
|
if _date and _other_date
|
|
|
|
_date <=> _other_date
|
|
|
|
elsif _date
|
2004-10-31 09:14:21 -05:00
|
|
|
1
|
2007-03-17 06:13:25 -04:00
|
|
|
elsif _other_date
|
2004-10-31 09:14:21 -05:00
|
|
|
-1
|
|
|
|
else
|
|
|
|
0
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class GuidBase
|
|
|
|
include Base
|
|
|
|
|
|
|
|
%w(isPermaLink content).each do |element|
|
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
|
|
|
end
|
2007-03-17 06:13:25 -04:00
|
|
|
|
2004-10-31 09:14:21 -05:00
|
|
|
class EnclosureBase
|
|
|
|
include Base
|
|
|
|
|
|
|
|
%w(url length type).each do |element|
|
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
|
|
|
end
|
2007-03-17 06:13:25 -04:00
|
|
|
|
2004-10-31 09:14:21 -05:00
|
|
|
class SourceBase
|
|
|
|
include Base
|
|
|
|
|
2007-03-17 06:13:25 -04:00
|
|
|
%w(authors categories contributors generator icon
|
|
|
|
links logo rights subtitle title).each do |element|
|
|
|
|
attr_reader element
|
|
|
|
add_other_element(element)
|
|
|
|
add_need_initialize_variable(element, "make_#{element}")
|
|
|
|
module_eval(<<-EOC, __FILE__, __LINE__)
|
|
|
|
private
|
|
|
|
def setup_#{element}(feed, current)
|
|
|
|
@#{element}.to_feed(feed, current)
|
|
|
|
end
|
|
|
|
|
|
|
|
def make_#{element}
|
|
|
|
self.class::#{Utils.to_class_name(element)}.new(@maker)
|
|
|
|
end
|
|
|
|
EOC
|
|
|
|
end
|
|
|
|
|
|
|
|
%w(id content date).each do |element|
|
2004-10-31 09:14:21 -05:00
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
2007-03-17 06:13:25 -04:00
|
|
|
|
|
|
|
def url
|
|
|
|
link = links.first
|
|
|
|
link ? link.href : nil
|
|
|
|
end
|
|
|
|
|
|
|
|
def url=(value)
|
|
|
|
link = links.first || links.new_link
|
|
|
|
link.href = value
|
|
|
|
end
|
|
|
|
|
|
|
|
def updated
|
|
|
|
date
|
|
|
|
end
|
|
|
|
|
|
|
|
def updated=(date)
|
|
|
|
self.date = date
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
AuthorsBase = ChannelBase::AuthorsBase
|
|
|
|
CategoriesBase = ChannelBase::CategoriesBase
|
|
|
|
ContributorsBase = ChannelBase::ContributorsBase
|
|
|
|
GeneratorBase = ChannelBase::GeneratorBase
|
|
|
|
|
|
|
|
class IconBase
|
|
|
|
include Base
|
|
|
|
|
|
|
|
%w(url).each do |element|
|
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
LinksBase = ChannelBase::LinksBase
|
|
|
|
|
|
|
|
class LogoBase
|
|
|
|
include Base
|
|
|
|
|
|
|
|
%w(uri).each do |element|
|
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class RightsBase
|
|
|
|
include Base
|
|
|
|
include AtomTextConstructBase
|
|
|
|
end
|
|
|
|
|
|
|
|
class SubtitleBase
|
|
|
|
include Base
|
|
|
|
include AtomTextConstructBase
|
|
|
|
end
|
|
|
|
|
|
|
|
class TitleBase
|
|
|
|
include Base
|
|
|
|
include AtomTextConstructBase
|
|
|
|
end
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
2007-03-17 06:13:25 -04:00
|
|
|
|
2004-11-19 03:25:25 -05:00
|
|
|
CategoriesBase = ChannelBase::CategoriesBase
|
2007-03-17 06:13:25 -04:00
|
|
|
AuthorsBase = ChannelBase::AuthorsBase
|
|
|
|
LinksBase = ChannelBase::LinksBase
|
|
|
|
ContributorsBase = ChannelBase::ContributorsBase
|
|
|
|
|
|
|
|
class RightsBase
|
|
|
|
include Base
|
|
|
|
include AtomTextConstructBase
|
|
|
|
end
|
|
|
|
|
|
|
|
class DescriptionBase
|
|
|
|
include Base
|
|
|
|
include AtomTextConstructBase
|
|
|
|
end
|
|
|
|
|
|
|
|
class ContentBase
|
|
|
|
include Base
|
|
|
|
include AtomTextConstructBase::EnsureXMLContent
|
|
|
|
|
|
|
|
%w(type src content xml_content).each do |element|
|
|
|
|
attr element, element != "xml_content"
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
|
|
|
|
|
|
|
def xml_content=(content)
|
|
|
|
content = ensure_xml_content(content) if inline_xhtml?
|
|
|
|
@xml_content = content
|
|
|
|
end
|
|
|
|
|
|
|
|
alias_method(:xhtml, :xml_content)
|
|
|
|
alias_method(:xhtml=, :xml_content=)
|
|
|
|
|
|
|
|
alias_method(:xml, :xml_content)
|
|
|
|
alias_method(:xml=, :xml_content=)
|
|
|
|
|
|
|
|
private
|
|
|
|
def inline_text?
|
|
|
|
[nil, "text", "html"].include?(@type)
|
|
|
|
end
|
|
|
|
|
|
|
|
def inline_html?
|
|
|
|
@type == "html"
|
|
|
|
end
|
|
|
|
|
|
|
|
def inline_xhtml?
|
|
|
|
@type == "xhtml"
|
|
|
|
end
|
|
|
|
|
|
|
|
def inline_other?
|
|
|
|
!out_of_line? and ![nil, "text", "html", "xhtml"].include?(@type)
|
|
|
|
end
|
|
|
|
|
|
|
|
def inline_other_text?
|
|
|
|
return false if @type.nil? or out_of_line?
|
|
|
|
/\Atext\//i.match(@type) ? true : false
|
|
|
|
end
|
|
|
|
|
|
|
|
def inline_other_xml?
|
|
|
|
return false if @type.nil? or out_of_line?
|
|
|
|
/[\+\/]xml\z/i.match(@type) ? true : false
|
|
|
|
end
|
|
|
|
|
|
|
|
def inline_other_base64?
|
|
|
|
return false if @type.nil? or out_of_line?
|
|
|
|
@type.include?("/") and !inline_other_text? and !inline_other_xml?
|
|
|
|
end
|
|
|
|
|
|
|
|
def out_of_line?
|
|
|
|
not @src.nil? and @content.nil?
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class TitleBase
|
|
|
|
include Base
|
|
|
|
include AtomTextConstructBase
|
|
|
|
end
|
2004-10-31 09:14:21 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class TextinputBase
|
|
|
|
include Base
|
|
|
|
|
|
|
|
%w(title description name link).each do |element|
|
|
|
|
attr_accessor element
|
|
|
|
add_need_initialize_variable(element)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|