mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
653 lines
10 KiB
Ruby
653 lines
10 KiB
Ruby
|
require "rss/rss"
|
||
|
|
||
|
module RSS
|
||
|
|
||
|
module RSS10
|
||
|
NSPOOL = {}
|
||
|
ELEMENTS = []
|
||
|
end
|
||
|
|
||
|
class RDF < Element
|
||
|
|
||
|
include RSS10
|
||
|
|
||
|
class << self
|
||
|
|
||
|
def required_uri
|
||
|
URI
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
TAG_NAME.replace('RDF')
|
||
|
|
||
|
PREFIX = 'rdf'
|
||
|
URI = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||
|
|
||
|
install_ns('', ::RSS::URI)
|
||
|
install_ns(PREFIX, URI)
|
||
|
|
||
|
[
|
||
|
["channel", nil],
|
||
|
["image", "?"],
|
||
|
["item", "+"],
|
||
|
["textinput", "?"],
|
||
|
].each do |tag, occurs|
|
||
|
install_model(tag, occurs)
|
||
|
end
|
||
|
|
||
|
%w(channel image textinput).each do |x|
|
||
|
install_have_child_element(x)
|
||
|
end
|
||
|
|
||
|
install_have_children_element("item")
|
||
|
|
||
|
attr_accessor :rss_version, :version, :encoding, :standalone
|
||
|
|
||
|
def initialize(version=nil, encoding=nil, standalone=nil)
|
||
|
super()
|
||
|
@rss_version = '1.0'
|
||
|
@version = version || '1.0'
|
||
|
@encoding = encoding
|
||
|
@standalone = standalone
|
||
|
@output_encoding = nil
|
||
|
end
|
||
|
|
||
|
def output_encoding=(enc)
|
||
|
@output_encoding = enc
|
||
|
self.converter = Converter.new(@output_encoding, @encoding)
|
||
|
end
|
||
|
|
||
|
def to_s(convert=true)
|
||
|
rv = <<-EORDF
|
||
|
#{xmldecl}
|
||
|
<#{PREFIX}:RDF#{ns_declaration}>
|
||
|
#{channel_element(false)}
|
||
|
#{image_element(false)}
|
||
|
#{item_elements(false)}
|
||
|
#{textinput_element(false)}
|
||
|
#{other_element(false, "\t")}
|
||
|
</#{PREFIX}:RDF>
|
||
|
EORDF
|
||
|
rv = @converter.convert(rv) if convert and @converter
|
||
|
rv
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def xmldecl
|
||
|
rv = "<?xml version='#{@version}'"
|
||
|
if @output_encoding or @encoding
|
||
|
rv << " encoding='#{@output_encoding or @encoding}'"
|
||
|
end
|
||
|
rv << " standalone='#{@standalone}'" if @standalone
|
||
|
rv << '?>'
|
||
|
rv
|
||
|
end
|
||
|
|
||
|
def ns_declaration
|
||
|
rv = ''
|
||
|
self.class::NSPOOL.each do |prefix, uri|
|
||
|
prefix = ":#{prefix}" unless prefix.empty?
|
||
|
rv << %Q|\n\txmlns#{prefix}="#{html_escape(uri)}"|
|
||
|
end
|
||
|
rv
|
||
|
end
|
||
|
|
||
|
def rdf_validate(tags)
|
||
|
_validate(tags, [])
|
||
|
end
|
||
|
|
||
|
def children
|
||
|
[@channel, @image, @textinput, *@item]
|
||
|
end
|
||
|
|
||
|
def _tags
|
||
|
rv = [
|
||
|
[::RSS::URI, "channel"],
|
||
|
[::RSS::URI, "image"],
|
||
|
].delete_if {|x| send(x[1]).nil?}
|
||
|
@item.each do |x|
|
||
|
rv << [::RSS::URI, "item"]
|
||
|
end
|
||
|
rv << [::RSS::URI, "textinput"] if @textinput
|
||
|
rv
|
||
|
end
|
||
|
|
||
|
class Seq < Element
|
||
|
|
||
|
include RSS10
|
||
|
|
||
|
class << self
|
||
|
|
||
|
def required_uri
|
||
|
URI
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
TAG_NAME.replace('Seq')
|
||
|
|
||
|
install_have_children_element("li")
|
||
|
|
||
|
install_must_call_validator('rdf', ::RSS::RDF::URI)
|
||
|
|
||
|
def initialize(li=[])
|
||
|
super()
|
||
|
@li = li
|
||
|
end
|
||
|
|
||
|
def to_s(convert=true)
|
||
|
<<-EOT
|
||
|
<#{PREFIX}:Seq>
|
||
|
#{li_elements(convert, "\t\t\t\t\t")}
|
||
|
#{other_element(convert, "\t\t\t\t\t")}
|
||
|
</#{PREFIX}:Seq>
|
||
|
EOT
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def children
|
||
|
@li
|
||
|
end
|
||
|
|
||
|
def rdf_validate(tags)
|
||
|
_validate(tags, [["li", '*']])
|
||
|
end
|
||
|
|
||
|
def _tags
|
||
|
rv = []
|
||
|
@li.each do |x|
|
||
|
rv << [URI, "li"]
|
||
|
end
|
||
|
rv
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
class Li < Element
|
||
|
|
||
|
include RSS10
|
||
|
|
||
|
class << self
|
||
|
|
||
|
def required_uri
|
||
|
URI
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
[
|
||
|
["resource", nil, true]
|
||
|
].each do |name, uri, required|
|
||
|
install_get_attribute(name, uri, required)
|
||
|
end
|
||
|
|
||
|
def initialize(resource=nil)
|
||
|
super()
|
||
|
@resource = resource
|
||
|
end
|
||
|
|
||
|
def to_s(convert=true)
|
||
|
if @resource
|
||
|
rv = %Q!<#{PREFIX}:li resource="#{h @resource}" />!
|
||
|
rv = @converter.convert(rv) if convert and @converter
|
||
|
rv
|
||
|
else
|
||
|
''
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def _attrs
|
||
|
[
|
||
|
["resource", true]
|
||
|
]
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
class Channel < Element
|
||
|
|
||
|
include RSS10
|
||
|
|
||
|
class << self
|
||
|
|
||
|
def required_uri
|
||
|
::RSS::URI
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
[
|
||
|
["about", URI, true]
|
||
|
].each do |name, uri, required|
|
||
|
install_get_attribute(name, uri, required)
|
||
|
end
|
||
|
|
||
|
%w(title link description).each do |x|
|
||
|
install_text_element(x)
|
||
|
end
|
||
|
|
||
|
%w(image items textinput).each do |x|
|
||
|
install_have_child_element(x)
|
||
|
end
|
||
|
|
||
|
[
|
||
|
['title', nil],
|
||
|
['link', nil],
|
||
|
['description', nil],
|
||
|
['image', '?'],
|
||
|
['items', nil],
|
||
|
['textinput', '?'],
|
||
|
].each do |tag, occurs|
|
||
|
install_model(tag, occurs)
|
||
|
end
|
||
|
|
||
|
def initialize(about=nil)
|
||
|
super()
|
||
|
@about = about
|
||
|
end
|
||
|
|
||
|
def to_s(convert=true)
|
||
|
about = ''
|
||
|
about << %Q!#{PREFIX}:about="#{h @about}"! if @about
|
||
|
rv = <<-EOT
|
||
|
<channel #{about}>
|
||
|
#{title_element(false)}
|
||
|
#{link_element(false)}
|
||
|
#{description_element(false)}
|
||
|
#{image_element(false)}
|
||
|
#{items_element(false)}
|
||
|
#{textinput_element(false)}
|
||
|
#{other_element(false, "\t\t")}
|
||
|
</channel>
|
||
|
EOT
|
||
|
rv = @converter.convert(rv) if convert and @converter
|
||
|
rv
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def children
|
||
|
[@image, @items, @textinput]
|
||
|
end
|
||
|
|
||
|
def _tags
|
||
|
[
|
||
|
[::RSS::URI, 'title'],
|
||
|
[::RSS::URI, 'link'],
|
||
|
[::RSS::URI, 'description'],
|
||
|
[::RSS::URI, 'image'],
|
||
|
[::RSS::URI, 'items'],
|
||
|
[::RSS::URI, 'textinput'],
|
||
|
].delete_if do |x|
|
||
|
send(x[1]).nil?
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def _attrs
|
||
|
[
|
||
|
["about", true]
|
||
|
]
|
||
|
end
|
||
|
|
||
|
class Image < Element
|
||
|
|
||
|
include RSS10
|
||
|
|
||
|
class << self
|
||
|
|
||
|
def required_uri
|
||
|
::RSS::URI
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
[
|
||
|
["resource", URI, true]
|
||
|
].each do |name, uri, required|
|
||
|
install_get_attribute(name, uri, required)
|
||
|
end
|
||
|
|
||
|
def initialize(resource=nil)
|
||
|
super()
|
||
|
@resource = resource
|
||
|
end
|
||
|
|
||
|
def to_s(convert=true)
|
||
|
if @resource
|
||
|
rv = %Q!<image #{PREFIX}:resource="#{h @resource}" />!
|
||
|
rv = @converter.convert(rv) if convert and @converter
|
||
|
rv
|
||
|
else
|
||
|
''
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def _attrs
|
||
|
[
|
||
|
["resource", true]
|
||
|
]
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
class Textinput < Element
|
||
|
|
||
|
include RSS10
|
||
|
|
||
|
class << self
|
||
|
|
||
|
def required_uri
|
||
|
::RSS::URI
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
[
|
||
|
["resource", URI, true]
|
||
|
].each do |name, uri, required|
|
||
|
install_get_attribute(name, uri, required)
|
||
|
end
|
||
|
|
||
|
def initialize(resource=nil)
|
||
|
super()
|
||
|
@resource = resource
|
||
|
end
|
||
|
|
||
|
def to_s(convert=true)
|
||
|
if @resource
|
||
|
rv = %Q|<textinput #{PREFIX}:resource="#{h @resource}" />|
|
||
|
rv = @converter.convert(rv) if convert and @converter
|
||
|
rv
|
||
|
else
|
||
|
''
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def _attrs
|
||
|
[
|
||
|
["resource", true],
|
||
|
]
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
class Items < Element
|
||
|
|
||
|
include RSS10
|
||
|
|
||
|
Seq = ::RSS::RDF::Seq
|
||
|
class Seq
|
||
|
unless const_defined?(:Li)
|
||
|
Li = ::RSS::RDF::Li
|
||
|
end
|
||
|
end
|
||
|
|
||
|
class << self
|
||
|
|
||
|
def required_uri
|
||
|
::RSS::URI
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
install_have_child_element("Seq")
|
||
|
|
||
|
install_must_call_validator('rdf', ::RSS::RDF::URI)
|
||
|
|
||
|
def initialize(seq=Seq.new)
|
||
|
super()
|
||
|
@Seq = seq
|
||
|
end
|
||
|
|
||
|
def to_s(convert=true)
|
||
|
<<-EOT
|
||
|
<items>
|
||
|
#{Seq_element(convert)}
|
||
|
#{other_element(convert, "\t\t\t")}
|
||
|
</items>
|
||
|
EOT
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def children
|
||
|
[@Seq]
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def _tags
|
||
|
rv = []
|
||
|
rv << [URI, 'Seq'] unless @Seq.nil?
|
||
|
rv
|
||
|
end
|
||
|
|
||
|
def rdf_validate(tags)
|
||
|
_validate(tags, [["Seq", nil]])
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
class Image < Element
|
||
|
|
||
|
include RSS10
|
||
|
|
||
|
class << self
|
||
|
|
||
|
def required_uri
|
||
|
::RSS::URI
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
[
|
||
|
["about", URI, true]
|
||
|
].each do |name, uri, required|
|
||
|
install_get_attribute(name, uri, required)
|
||
|
end
|
||
|
|
||
|
%w(title url link).each do |x|
|
||
|
install_text_element(x)
|
||
|
end
|
||
|
|
||
|
[
|
||
|
['title', nil],
|
||
|
['url', nil],
|
||
|
['link', nil],
|
||
|
].each do |tag, occurs|
|
||
|
install_model(tag, occurs)
|
||
|
end
|
||
|
|
||
|
def initialize(about=nil)
|
||
|
super()
|
||
|
@about = about
|
||
|
end
|
||
|
|
||
|
def to_s(convert=true)
|
||
|
about = ''
|
||
|
about << %Q!#{PREFIX}:about="#{h @about}"! if @about
|
||
|
rv = <<-EOT
|
||
|
<image #{about}>
|
||
|
#{title_element(false)}
|
||
|
#{url_element(false)}
|
||
|
#{link_element(false)}
|
||
|
#{other_element(false, "\t\t")}
|
||
|
</image>
|
||
|
EOT
|
||
|
rv = @converter.convert(rv) if convert and @converter
|
||
|
rv
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def _tags
|
||
|
[
|
||
|
[::RSS::URI, 'title'],
|
||
|
[::RSS::URI, 'url'],
|
||
|
[::RSS::URI, 'link'],
|
||
|
].delete_if do |x|
|
||
|
send(x[1]).nil?
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def _attrs
|
||
|
[
|
||
|
["about", true],
|
||
|
]
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
class Item < Element
|
||
|
|
||
|
include RSS10
|
||
|
|
||
|
class << self
|
||
|
|
||
|
def required_uri
|
||
|
::RSS::URI
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
[
|
||
|
["about", URI, true]
|
||
|
].each do |name, uri, required|
|
||
|
install_get_attribute(name, uri, required)
|
||
|
end
|
||
|
|
||
|
%w(title link description).each do |x|
|
||
|
install_text_element(x)
|
||
|
end
|
||
|
|
||
|
[
|
||
|
["title", nil],
|
||
|
["link", nil],
|
||
|
["description", "?"],
|
||
|
].each do |tag, occurs|
|
||
|
install_model(tag, occurs)
|
||
|
end
|
||
|
|
||
|
def initialize(about=nil)
|
||
|
super()
|
||
|
@about = about
|
||
|
end
|
||
|
|
||
|
def to_s(convert=true)
|
||
|
about = ''
|
||
|
about << %Q!#{PREFIX}:about="#{h @about}"! if @about
|
||
|
rv = <<-EOT
|
||
|
<item #{about}>
|
||
|
#{title_element(false)}
|
||
|
#{link_element(false)}
|
||
|
#{description_element(false)}
|
||
|
#{other_element(false, "\t\t")}
|
||
|
</item>
|
||
|
EOT
|
||
|
rv = @converter.convert(rv) if convert and @converter
|
||
|
rv
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def _tags
|
||
|
[
|
||
|
[::RSS::URI, 'title'],
|
||
|
[::RSS::URI, 'link'],
|
||
|
[::RSS::URI, 'description'],
|
||
|
].delete_if do |x|
|
||
|
send(x[1]).nil?
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def _attrs
|
||
|
[
|
||
|
["about", true],
|
||
|
]
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
class Textinput < Element
|
||
|
|
||
|
include RSS10
|
||
|
|
||
|
class << self
|
||
|
|
||
|
def required_uri
|
||
|
::RSS::URI
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
[
|
||
|
["about", URI, true]
|
||
|
].each do |name, uri, required|
|
||
|
install_get_attribute(name, uri, required)
|
||
|
end
|
||
|
|
||
|
%w(title description name link).each do |x|
|
||
|
install_text_element(x)
|
||
|
end
|
||
|
|
||
|
[
|
||
|
["title", nil],
|
||
|
["description", nil],
|
||
|
["name", nil],
|
||
|
["link", nil],
|
||
|
].each do |tag, occurs|
|
||
|
install_model(tag, occurs)
|
||
|
end
|
||
|
|
||
|
def initialize(about=nil)
|
||
|
super()
|
||
|
@about = about
|
||
|
end
|
||
|
|
||
|
def to_s(convert=true)
|
||
|
about = ''
|
||
|
about << %Q!#{PREFIX}:about="#{h @about}"! if @about
|
||
|
rv = <<-EOT
|
||
|
<textinput #{about}>
|
||
|
#{title_element(false)}
|
||
|
#{description_element(false)}
|
||
|
#{name_element(false)}
|
||
|
#{link_element(false)}
|
||
|
#{other_element(false, "\t\t")}
|
||
|
</textinput>
|
||
|
EOT
|
||
|
rv = @converter.convert(rv) if convert and @converter
|
||
|
rv
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def _tags
|
||
|
[
|
||
|
[::RSS::URI, 'title'],
|
||
|
[::RSS::URI, 'description'],
|
||
|
[::RSS::URI, 'name'],
|
||
|
[::RSS::URI, 'link'],
|
||
|
].delete_if do |x|
|
||
|
send(x[1]).nil?
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def _attrs
|
||
|
[
|
||
|
["about", true],
|
||
|
]
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
end
|
||
|
|
||
|
if const_defined?(:BaseListener)
|
||
|
RSS10::ELEMENTS.each do |x|
|
||
|
BaseListener.install_get_text_element(x, URI, "#{x}=")
|
||
|
end
|
||
|
end
|
||
|
|
||
|
end
|