diff options
Diffstat (limited to 'lib/rss')
| -rw-r--r-- | lib/rss/0.9.rb | 661 | ||||
| -rw-r--r-- | lib/rss/1.0.rb | 650 | ||||
| -rw-r--r-- | lib/rss/2.0.rb | 167 | ||||
| -rw-r--r-- | lib/rss/content.rb | 52 | ||||
| -rw-r--r-- | lib/rss/converter.rb | 155 | ||||
| -rw-r--r-- | lib/rss/dublincore.rb | 64 | ||||
| -rw-r--r-- | lib/rss/maker.rb | 35 | ||||
| -rw-r--r-- | lib/rss/maker/0.9.rb | 224 | ||||
| -rw-r--r-- | lib/rss/maker/1.0.rb | 202 | ||||
| -rw-r--r-- | lib/rss/maker/2.0.rb | 168 | ||||
| -rw-r--r-- | lib/rss/maker/base.rb | 522 | ||||
| -rw-r--r-- | lib/rss/maker/content.rb | 29 | ||||
| -rw-r--r-- | lib/rss/maker/dublincore.rb | 47 | ||||
| -rw-r--r-- | lib/rss/maker/syndication.rb | 27 | ||||
| -rw-r--r-- | lib/rss/maker/trackback.rb | 126 | ||||
| -rw-r--r-- | lib/rss/parser.rb | 402 | ||||
| -rw-r--r-- | lib/rss/rexmlparser.rb | 47 | ||||
| -rw-r--r-- | lib/rss/rss.rb | 858 | ||||
| -rw-r--r-- | lib/rss/syndication.rb | 85 | ||||
| -rw-r--r-- | lib/rss/taxonomy.rb | 32 | ||||
| -rw-r--r-- | lib/rss/trackback.rb | 298 | ||||
| -rw-r--r-- | lib/rss/utils.rb | 17 | ||||
| -rw-r--r-- | lib/rss/xml-stylesheet.rb | 101 | ||||
| -rw-r--r-- | lib/rss/xmlparser.rb | 91 | ||||
| -rw-r--r-- | lib/rss/xmlscanner.rb | 102 |
25 files changed, 0 insertions, 5162 deletions
diff --git a/lib/rss/0.9.rb b/lib/rss/0.9.rb deleted file mode 100644 index 797a46ca3b..0000000000 --- a/lib/rss/0.9.rb +++ /dev/null @@ -1,661 +0,0 @@ -require "rss/parser" - -module RSS - - module RSS09 - NSPOOL = {} - ELEMENTS = [] - - def self.append_features(klass) - super - - klass.install_must_call_validator('', nil) - end - end - - class Rss < Element - - include RSS09 - include RootElementMixin - include XMLStyleSheetMixin - - [ - ["channel", nil], - ].each do |tag, occurs| - install_model(tag, occurs) - end - - %w(channel).each do |x| - install_have_child_element(x) - end - - attr_accessor :rss_version, :version, :encoding, :standalone - - def initialize(rss_version, version=nil, encoding=nil, standalone=nil) - super - end - - def items - if @channel - @channel.items - else - [] - end - end - - def image - if @channel - @channel.image - else - nil - end - end - - def textinput - if @channel - @channel.textInput - else - nil - end - end - - def to_s(convert=true, indent=calc_indent) - rv = tag(indent, ns_declarations) do |next_indent| - [ - channel_element(false, next_indent), - other_element(false, next_indent), - ] - end - rv = @converter.convert(rv) if convert and @converter - rv - end - - private - def children - [@channel] - end - - def _tags - [ - [nil, 'channel'], - ].delete_if {|x| send(x[1]).nil?} - end - - def _attrs - [ - ["version", true, "rss_version"], - ] - end - - class Channel < Element - - include RSS09 - - [ - ["title", nil], - ["link", nil], - ["description", nil], - ["language", nil], - ["copyright", "?"], - ["managingEditor", "?"], - ["webMaster", "?"], - ["rating", "?"], - ["docs", "?"], - ].each do |x, occurs| - install_text_element(x) - install_model(x, occurs) - end - - [ - ["pubDate", "?"], - ["lastBuildDate", "?"], - ].each do |x, occurs| - install_date_element(x, 'rfc822') - install_model(x, occurs) - end - - [ - ["skipDays", "?"], - ["skipHours", "?"], - ["image", nil], - ["textInput", "?"], - ].each do |x, occurs| - install_have_child_element(x) - install_model(x, occurs) - end - - [ - ["cloud", "?"] - ].each do |x, occurs| - install_have_attribute_element(x) - install_model(x, occurs) - end - - [ - ["item", "*"] - ].each do |x, occurs| - install_have_children_element(x) - install_model(x, occurs) - end - - def initialize() - super() - end - - def to_s(convert=true, indent=calc_indent) - rv = tag(indent) do |next_indent| - [ - title_element(false, next_indent), - link_element(false, next_indent), - description_element(false, next_indent), - language_element(false, next_indent), - copyright_element(false, next_indent), - managingEditor_element(false, next_indent), - webMaster_element(false, next_indent), - rating_element(false, next_indent), - pubDate_element(false, next_indent), - lastBuildDate_element(false, next_indent), - docs_element(false, next_indent), - cloud_element(false, next_indent), - skipDays_element(false, next_indent), - skipHours_element(false, next_indent), - image_element(false, next_indent), - item_elements(false, next_indent), - textInput_element(false, next_indent), - other_element(false, next_indent), - ] - end - rv = @converter.convert(rv) if convert and @converter - rv - end - - private - def children - [@skipDays, @skipHours, @image, @textInput, @cloud, *@item] - end - - def _tags - rv = [ - "title", - "link", - "description", - "language", - "copyright", - "managingEditor", - "webMaster", - "rating", - "docs", - "skipDays", - "skipHours", - "image", - "textInput", - "cloud", - ].delete_if do |x| - send(x).nil? - end.collect do |elem| - [nil, elem] - end - - @item.each do - rv << [nil, "item"] - end - - rv - end - - def maker_target(maker) - maker.channel - end - - def setup_maker_elements(channel) - super - [ - [skipDays, "day"], - [skipHours, "hour"], - ].each do |skip, key| - if skip - skip.__send__("#{key}s").each do |val| - target_skips = channel.__send__("skip#{key.capitalize}s") - new_target = target_skips.__send__("new_#{key}") - new_target.content = val.content - end - end - end - end - - class SkipDays < Element - include RSS09 - - [ - ["day", "*"] - ].each do |x, occurs| - install_have_children_element(x) - install_model(x, occurs) - end - - def to_s(convert=true, indent=calc_indent) - rv = tag(indent) do |next_indent| - [ - day_elements(false, next_indent) - ] - end - rv = @converter.convert(rv) if convert and @converter - rv - end - - private - def children - @day - end - - def _tags - @day.compact.collect do - [nil, "day"] - end - end - - class Day < Element - include RSS09 - - content_setup - - def initialize(content=nil) - super() - @content = content - end - - end - - end - - class SkipHours < Element - include RSS09 - - [ - ["hour", "*"] - ].each do |x, occurs| - install_have_children_element(x) - install_model(x, occurs) - end - - def to_s(convert=true, indent=calc_indent) - rv = tag(indent) do |next_indent| - [ - hour_elements(false, next_indent) - ] - end - rv = @converter.convert(rv) if convert and @converter - rv - end - - private - def children - @hour - end - - def _tags - @hour.compact.collect do - [nil, "hour"] - end - end - - class Hour < Element - include RSS09 - - content_setup - - def initialize(content=nil) - super() - @content = content - end - - remove_method :content= - def content=(value) - @content = value.to_i - end - - end - - end - - class Image < Element - - include RSS09 - - %w(url title link).each do |x| - install_text_element(x) - install_model(x, nil) - end - %w(width height description).each do |x| - install_text_element(x) - install_model(x, "?") - end - - def to_s(convert=true, indent=calc_indent) - rv = tag(indent) do |next_indent| - [ - url_element(false, next_indent), - title_element(false, next_indent), - link_element(false, next_indent), - width_element(false, next_indent), - height_element(false, next_indent), - description_element(false, next_indent), - other_element(false, next_indent), - ] - end - rv = @converter.convert(rv) if convert and @converter - rv - end - - private - def _tags - %w(url title link width height description).delete_if do |x| - send(x).nil? - end.collect do |elem| - [nil, elem] - end - end - - def maker_target(maker) - maker.image - end - end - - class Cloud < Element - - include RSS09 - - [ - ["domain", nil, true], - ["port", nil, true], - ["path", nil, true], - ["registerProcedure", nil, true], - ["protocol", nil ,true], - ].each do |name, uri, required| - install_get_attribute(name, uri, required) - end - - def initialize(domain=nil, port=nil, path=nil, rp=nil, protocol=nil) - super() - @domain = domain - @port = port - @path = path - @registerProcedure = rp - @protocol = protocol - end - - def to_s(convert=true, indent=calc_indent) - rv = tag(indent) - rv = @converter.convert(rv) if convert and @converter - rv - end - - private - def _attrs - %w(domain port path registerProcedure protocol).collect do |attr| - [attr, true] - end - end - - end - - class Item < Element - - include RSS09 - - %w(title link description).each do |x| - install_text_element(x) - end - - %w(source enclosure).each do |x| - install_have_child_element(x) - end - - [ - %w(category categories), - ].each do |name, plural_name| - install_have_children_element(name, plural_name) - end - - [ - ["title", '?'], - ["link", '?'], - ["description", '?'], - ["category", '*'], - ["source", '?'], - ["enclosure", '?'], - ].each do |tag, occurs| - install_model(tag, occurs) - end - - def to_s(convert=true, indent=calc_indent) - rv = tag(indent) do |next_indent| - [ - title_element(false, next_indent), - link_element(false, next_indent), - description_element(false, next_indent), - category_elements(false, next_indent), - source_element(false, next_indent), - enclosure_element(false, next_indent), - other_element(false, next_indent), - ] - end - rv = @converter.convert(rv) if convert and @converter - rv - end - - private - def children - [@source, @enclosure, *@category].compact - end - - def _tags - rv = %w(title link description author comments - source enclosure).delete_if do |x| - send(x).nil? - end.collect do |x| - [nil, x] - end - - @category.each do - rv << [nil, "category"] - end - - rv - end - - def maker_target(maker) - maker.items.new_item - end - - def setup_maker_element(item) - super - @enclosure.setup_maker(item) if @enclosure - @source.setup_maker(item) if @source - end - - class Source < Element - - include RSS09 - - [ - ["url", nil, true] - ].each do |name, uri, required| - install_get_attribute(name, uri, required) - end - - content_setup - - def initialize(url=nil, content=nil) - super() - @url = url - @content = content - end - - private - def _tags - [] - end - - def _attrs - [ - ["url", true] - ] - end - - - def maker_target(item) - item.source - end - - def setup_maker_attributes(source) - source.url = url - source.content = content - end - end - - class Enclosure < Element - - include RSS09 - - [ - ["url", nil, true], - ["length", nil, true], - ["type", nil, true], - ].each do |name, uri, required| - install_get_attribute(name, uri, required) - end - - def initialize(url=nil, length=nil, type=nil) - super() - @url = url - @length = length - @type = type - end - - def to_s(convert=true, indent=calc_indent) - rv = tag(indent) - rv = @converter.convert(rv) if convert and @converter - rv - end - - private - def _attrs - [ - ["url", true], - ["length", true], - ["type", true], - ] - end - - def maker_target(item) - item.enclosure - end - - def setup_maker_attributes(enclosure) - enclosure.url = url - enclosure.length = length - enclosure.type = type - end - end - - class Category < Element - - include RSS09 - - [ - ["domain", nil, true] - ].each do |name, uri, required| - install_get_attribute(name, uri, required) - end - - content_setup - - def initialize(domain=nil, content=nil) - super() - @domain = domain - @content = content - end - - private - def _attrs - [ - ["domain", true] - ] - end - - def maker_target(item) - item.new_category - end - - def setup_maker_attributes(category) - category.domain = domain - category.content = content - end - - end - - end - - class TextInput < Element - - include RSS09 - - %w(title description name link).each do |x| - install_text_element(x) - install_model(x, nil) - end - - def to_s(convert=true, indent=calc_indent) - rv = tag(indent) do |next_indent| - [ - title_element(false, next_indent), - description_element(false, next_indent), - name_element(false, next_indent), - link_element(false, next_indent), - other_element(false, next_indent), - ] - end - rv = @converter.convert(rv) if convert and @converter - rv - end - - private - def _tags - %w(title description name link).each do |x| - send(x).nil? - end.collect do |elem| - [nil, elem] - end - end - - def maker_target(maker) - maker.textinput - end - end - - end - - end - - RSS09::ELEMENTS.each do |x| - BaseListener.install_get_text_element(x, nil, "#{x}=") - end - - module ListenerMixin - private - def start_rss(tag_name, prefix, attrs, ns) - check_ns(tag_name, prefix, ns, nil) - - @rss = Rss.new(attrs['version'], @version, @encoding, @standalone) - @rss.do_validate = @do_validate - @rss.xml_stylesheets = @xml_stylesheets - @last_element = @rss - @proc_stack.push Proc.new { |text, tags| - @rss.validate_for_stream(tags) if @do_validate - } - end - - end - -end diff --git a/lib/rss/1.0.rb b/lib/rss/1.0.rb deleted file mode 100644 index 0e3e66ea95..0000000000 --- a/lib/rss/1.0.rb +++ /dev/null @@ -1,650 +0,0 @@ -require "rss/parser" - -module RSS - - module RSS10 - NSPOOL = {} - ELEMENTS = [] - - def self.append_features(klass) - super - - klass.install_must_call_validator('', ::RSS::URI) - end - - end - - class RDF < Element - - include RSS10 - include RootElementMixin - - class << self - - def required_uri - URI - end - - end - - @tag_name = '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('1.0', version, encoding, standalone) - end - - def full_name - tag_name_with_prefix(PREFIX) - end - - def to_s(convert=true, indent=calc_indent) - rv = tag(indent, ns_declarations) do |next_indent| - [ - channel_element(false, next_indent), - image_element(false, next_indent), - item_elements(false, next_indent), - textinput_element(false, next_indent), - other_element(false, next_indent), - ] - end - rv = @converter.convert(rv) if convert and @converter - rv - end - - private - 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 = '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, indent=calc_indent) - tag(indent) do |next_indent| - [ - li_elements(convert, next_indent), - other_element(convert, next_indent), - ] - end - end - - def full_name - tag_name_with_prefix(PREFIX) - 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", [URI, nil], true] - ].each do |name, uri, required| - install_get_attribute(name, uri, required) - end - - def initialize(resource=nil) - super() - @resource = resource - end - - def full_name - tag_name_with_prefix(PREFIX) - end - - def to_s(convert=true, indent=calc_indent) - rv = tag(indent) - rv = @converter.convert(rv) if convert and @converter - rv - 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, indent=calc_indent) - rv = tag(indent) do |next_indent| - [ - title_element(false, next_indent), - link_element(false, next_indent), - description_element(false, next_indent), - image_element(false, next_indent), - items_element(false, next_indent), - textinput_element(false, next_indent), - other_element(false, next_indent), - ] - end - 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 - [ - ["#{PREFIX}:about", true, "about"] - ] - end - - def maker_target(maker) - maker.channel - end - - def setup_maker_attributes(channel) - channel.about = self.about - 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, indent=calc_indent) - rv = tag(indent) - rv = @converter.convert(rv) if convert and @converter - rv - end - - private - def _attrs - [ - ["#{PREFIX}:resource", true, "resource"] - ] - 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, indent=calc_indent) - rv = tag(indent) - rv = @converter.convert(rv) if convert and @converter - rv - end - - private - def _attrs - [ - ["#{PREFIX}:resource", true, "resource"] - ] - 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, indent=calc_indent) - rv = tag(indent) do |next_indent| - [ - Seq_element(convert, next_indent), - other_element(convert, next_indent), - ] - end - 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, indent=calc_indent) - rv = tag(indent) do |next_indent| - [ - title_element(false, next_indent), - url_element(false, next_indent), - link_element(false, next_indent), - other_element(false, next_indent), - ] - end - 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 - [ - ["#{PREFIX}:about", true, "about"] - ] - end - - def maker_target(maker) - maker.image - 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, indent=calc_indent) - rv = tag(indent) do |next_indent| - [ - title_element(false, next_indent), - link_element(false, next_indent), - description_element(false, next_indent), - other_element(false, next_indent), - ] - end - 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 - [ - ["#{PREFIX}:about", true, "about"] - ] - end - - def maker_target(maker) - maker.items.new_item - 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, indent=calc_indent) - rv = tag(indent) do |next_indent| - [ - title_element(false, next_indent), - description_element(false, next_indent), - name_element(false, next_indent), - link_element(false, next_indent), - other_element(false, next_indent), - ] - end - 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 - [ - ["#{PREFIX}:about", true, "about"] - ] - end - - def maker_target(maker) - maker.textinput - end - end - - end - - RSS10::ELEMENTS.each do |x| - BaseListener.install_get_text_element(x, URI, "#{x}=") - end - - module ListenerMixin - private - def start_RDF(tag_name, prefix, attrs, ns) - check_ns(tag_name, prefix, ns, RDF::URI) - - @rss = RDF.new(@version, @encoding, @standalone) - @rss.do_validate = @do_validate - @rss.xml_stylesheets = @xml_stylesheets - @last_element = @rss - @proc_stack.push Proc.new { |text, tags| - @rss.validate_for_stream(tags) if @do_validate - } - end - end - -end diff --git a/lib/rss/2.0.rb b/lib/rss/2.0.rb deleted file mode 100644 index 19cb487d79..0000000000 --- a/lib/rss/2.0.rb +++ /dev/null @@ -1,167 +0,0 @@ -require "rss/0.9" - -module RSS - - class Rss - - class Channel - - %w(generator ttl).each do |x| - install_text_element(x) - install_model(x, '?') - end - - remove_method :ttl= - def ttl=(value) - @ttl = value.to_i - end - - [ - %w(category categories), - ].each do |name, plural_name| - install_have_children_element(name, plural_name) - install_model(name, '*') - end - - [ - ["image", "?"], - ["language", "?"], - ].each do |x, occurs| - install_model(x, occurs) - end - - def other_element(convert, indent) - rv = <<-EOT -#{category_elements(convert, indent)} -#{generator_element(convert, indent)} -#{ttl_element(convert, indent)} -EOT - rv << super - end - - private - alias children09 children - def children - children09 + @category.compact - end - - alias _tags09 _tags - def _tags - rv = %w(generator ttl).delete_if do |x| - send(x).nil? - end.collect do |elem| - [nil, elem] - end + _tags09 - - @category.each do - rv << [nil, "category"] - end - - rv - end - - Category = Item::Category - - class Item - - [ - ["comments", "?"], - ["author", "?"], - ].each do |x, occurs| - install_text_element(x) - install_model(x, occurs) - end - - [ - ["pubDate", '?'], - ].each do |x, occurs| - install_date_element(x, 'rfc822') - install_model(x, occurs) - end - - [ - ["guid", '?'], - ].each do |x, occurs| - install_have_child_element(x) - install_model(x, occurs) - end - - def other_element(convert, indent) - rv = [ - super, - *%w(author comments pubDate guid).collect do |name| - __send__("#{name}_element", false, indent) - end - ].reject do |value| - /\A\s*\z/.match(value) - end - rv.join("\n") - end - - private - alias children09 children - def children - children09 + [@guid].compact - end - - alias _tags09 _tags - def _tags - %w(comments author pubDate guid).delete_if do |x| - send(x).nil? - end.collect do |elem| - [nil, elem] - end + _tags09 - end - - alias _setup_maker_element setup_maker_element - def setup_maker_element(item) - _setup_maker_element(item) - @guid.setup_maker(item) if @guid - end - - class Guid < Element - - include RSS09 - - [ - ["isPermaLink", nil, false] - ].each do |name, uri, required| - install_get_attribute(name, uri, required) - end - - content_setup - - def initialize(isPermaLink=nil, content=nil) - super() - @isPermaLink = isPermaLink - @content = content - end - - private - def _attrs - [ - ["isPermaLink", false] - ] - end - - def maker_target(item) - item.guid - end - - def setup_maker_attributes(guid) - guid.isPermaLink = isPermaLink - guid.content = content - end - end - - end - - end - - end - - RSS09::ELEMENTS.each do |x| - BaseListener.install_get_text_element(x, nil, "#{x}=") - end - -end diff --git a/lib/rss/content.rb b/lib/rss/content.rb deleted file mode 100644 index 280bbb8d6b..0000000000 --- a/lib/rss/content.rb +++ /dev/null @@ -1,52 +0,0 @@ -require "rss/1.0" - -module RSS - - CONTENT_PREFIX = 'content' - CONTENT_URI = "http://purl.org/rss/1.0/modules/content/" - - RDF.install_ns(CONTENT_PREFIX, CONTENT_URI) - - module ContentModel - - extend BaseModel - - ELEMENTS = [] - - def self.append_features(klass) - super - - klass.module_eval(<<-EOC, *get_file_and_line_from_caller(1)) - %w(encoded).each do |x| - install_text_element("\#{CONTENT_PREFIX}_\#{x}") - end - EOC - end - - def content_validate(tags) - counter = {} - ELEMENTS.each do |x| - counter[x] = 0 - end - - tags.each do |tag| - key = "#{CONTENT_PREFIX}_#{tag}" - raise UnknownTagError.new(tag, CONTENT_URI) unless counter.has_key?(key) - counter[key] += 1 - raise TooMuchTagError.new(tag, tag_name) if counter[key] > 1 - end - end - - end - - class RDF - class Item; include ContentModel; end - end - - prefix_size = CONTENT_PREFIX.size + 1 - ContentModel::ELEMENTS.uniq! - ContentModel::ELEMENTS.each do |x| - BaseListener.install_get_text_element(x[prefix_size..-1], CONTENT_URI, "#{x}=") - end - -end diff --git a/lib/rss/converter.rb b/lib/rss/converter.rb deleted file mode 100644 index 7ad79db318..0000000000 --- a/lib/rss/converter.rb +++ /dev/null @@ -1,155 +0,0 @@ -require "rss/utils" - -module RSS - - class Converter - - include Utils - - def initialize(to_enc, from_enc=nil) - normalized_to_enc = to_enc.downcase.gsub(/-/, '_') - from_enc ||= 'utf-8' - normalized_from_enc = from_enc.downcase.gsub(/-/, '_') - if normalized_to_enc == normalized_from_enc - def_same_enc() - else - def_diff_enc = "def_to_#{normalized_to_enc}_from_#{normalized_from_enc}" - if respond_to?(def_diff_enc) - __send__(def_diff_enc) - else - def_else_enc(to_enc, from_enc) - end - end - end - - def convert(value) - value - end - - def def_convert(depth=0) - instance_eval(<<-EOC, *get_file_and_line_from_caller(depth)) - def convert(value) - if value.kind_of?(String) - #{yield('value')} - else - value - end - end - EOC - end - - def def_iconv_convert(to_enc, from_enc, depth=0) - begin - require "iconv" - @iconv = Iconv.new(to_enc, from_enc) - def_convert(depth+1) do |value| - <<-EOC - begin - @iconv.iconv(#{value}) - rescue Iconv::Failure - raise ConversionError.new(#{value}, "#{to_enc}", "#{from_enc}") - end - EOC - end - rescue LoadError, ArgumentError, SystemCallError - raise UnknownConversionMethodError.new(to_enc, from_enc) - end - end - - def def_else_enc(to_enc, from_enc) - def_iconv_convert(to_enc, from_enc, 0) - end - - def def_same_enc() - def_convert do |value| - value - end - end - - def def_uconv_convert_if_can(meth, to_enc, from_enc) - begin - require "uconv" - def_convert(1) do |value| - <<-EOC - begin - Uconv.#{meth}(#{value}) - rescue Uconv::Error - raise ConversionError.new(#{value}, "#{to_enc}", "#{from_enc}") - end - EOC - end - rescue LoadError - def_iconv_convert(to_enc, from_enc, 1) - end - end - - def def_to_euc_jp_from_utf_8 - def_uconv_convert_if_can('u8toeuc', 'EUC-JP', 'UTF-8') - end - - def def_to_utf_8_from_euc_jp - def_uconv_convert_if_can('euctou8', 'UTF-8', 'EUC-JP') - end - - def def_to_shift_jis_from_utf_8 - def_uconv_convert_if_can('u8tosjis', 'Shift_JIS', 'UTF-8') - end - - def def_to_utf_8_from_shift_jis - def_uconv_convert_if_can('sjistou8', 'UTF-8', 'Shift_JIS') - end - - def def_to_euc_jp_from_shift_jis - require "nkf" - def_convert do |value| - "NKF.nkf('-Se', #{value})" - end - end - - def def_to_shift_jis_from_euc_jp - require "nkf" - def_convert do |value| - "NKF.nkf('-Es', #{value})" - end - end - - def def_to_euc_jp_from_iso_2022_jp - require "nkf" - def_convert do |value| - "NKF.nkf('-Je', #{value})" - end - end - - def def_to_iso_2022_jp_from_euc_jp - require "nkf" - def_convert do |value| - "NKF.nkf('-Ej', #{value})" - end - end - - def def_to_utf_8_from_iso_8859_1 - def_convert do |value| - "#{value}.unpack('C*').pack('U*')" - end - end - - def def_to_iso_8859_1_from_utf_8 - def_convert do |value| - <<-EOC - array_utf8 = #{value}.unpack('U*') - array_enc = [] - array_utf8.each do |num| - if num <= 0xFF - array_enc << num - else - array_enc.concat "&\#\#{num};".unpack('C*') - end - end - array_enc.pack('C*') - EOC - end - end - - end - -end diff --git a/lib/rss/dublincore.rb b/lib/rss/dublincore.rb deleted file mode 100644 index 7ea9cf31dd..0000000000 --- a/lib/rss/dublincore.rb +++ /dev/null @@ -1,64 +0,0 @@ -require "rss/1.0" - -module RSS - - DC_PREFIX = 'dc' - DC_URI = "http://purl.org/dc/elements/1.1/" - - RDF.install_ns(DC_PREFIX, DC_URI) - - module DublinCoreModel - - extend BaseModel - - ELEMENTS = [] - - def self.append_features(klass) - 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| - install_date_element("\#{DC_PREFIX}_\#{x}", 'w3cdtf', x) - end - EOC - end - - def dc_validate(tags) - counter = {} - ELEMENTS.each do |x| - counter[x] = 0 - end - - tags.each do |tag| - key = "#{DC_PREFIX}_#{tag}" - raise UnknownTagError.new(tag, DC_URI) unless counter.has_key?(key) - counter[key] += 1 - raise TooMuchTagError.new(tag, tag_name) if counter[key] > 1 - end - end - - end - - # For backward compatibility - DublincoreModel = DublinCoreModel - - class RDF - class Channel; include DublinCoreModel; end - class Image; include DublinCoreModel; end - class Item; include DublinCoreModel; end - class Textinput; include DublinCoreModel; end - end - - prefix_size = DC_PREFIX.size + 1 - DublinCoreModel::ELEMENTS.uniq! - DublinCoreModel::ELEMENTS.each do |x| - BaseListener.install_get_text_element(x[prefix_size..-1], DC_URI, "#{x}=") - end - -end diff --git a/lib/rss/maker.rb b/lib/rss/maker.rb deleted file mode 100644 index 66c3bc2928..0000000000 --- a/lib/rss/maker.rb +++ /dev/null @@ -1,35 +0,0 @@ -require "rss/rss" - -module RSS - - module Maker - - MAKERS = {} - - class << self - def make(version, &block) - maker(version).make(&block) - end - - def maker(version) - MAKERS[version] - end - - def add_maker(version, maker) - MAKERS[version] = maker - end - - def filename_to_version(filename) - File.basename(filename, ".*") - end - end - end - -end - -require "rss/maker/1.0" -require "rss/maker/2.0" -require "rss/maker/content" -require "rss/maker/dublincore" -require "rss/maker/syndication" -require "rss/maker/trackback" diff --git a/lib/rss/maker/0.9.rb b/lib/rss/maker/0.9.rb deleted file mode 100644 index b82585fb96..0000000000 --- a/lib/rss/maker/0.9.rb +++ /dev/null @@ -1,224 +0,0 @@ -require "rss/0.9" - -require "rss/maker/base" - -module RSS - module Maker - - class RSS09 < RSSBase - - def initialize(rss_version="0.91") - super - end - - private - def make_rss - Rss.new(@rss_version, @version, @encoding, @standalone) - end - - def setup_elements(rss) - setup_channel(rss) - end - - class Channel < ChannelBase - - def to_rss(rss) - channel = Rss::Channel.new - set = setup_values(channel) - if set - rss.channel = channel - setup_items(rss) - setup_image(rss) - setup_textinput(rss) - setup_other_elements(rss) - if rss.channel.image - rss - else - nil - end - elsif variable_is_set? - raise NotSetError.new("maker.channel", not_set_required_variables) - end - end - - def have_required_values? - @title and @link and @description and @language - end - - private - def setup_items(rss) - @maker.items.to_rss(rss) - end - - def setup_image(rss) - @maker.image.to_rss(rss) - end - - def setup_textinput(rss) - @maker.textinput.to_rss(rss) - end - - def variables - super + ["pubDate"] - end - - def required_variable_names - %w(title link description language) - end - - class SkipDays < SkipDaysBase - def to_rss(rss, channel) - unless @days.empty? - skipDays = Rss::Channel::SkipDays.new - channel.skipDays = skipDays - @days.each do |day| - day.to_rss(rss, skipDays.days) - end - end - end - - class Day < DayBase - def to_rss(rss, days) - day = Rss::Channel::SkipDays::Day.new - set = setup_values(day) - if set - days << day - setup_other_elements(rss) - end - end - - def have_required_values? - @content - end - end - end - - class SkipHours < SkipHoursBase - def to_rss(rss, channel) - unless @hours.empty? - skipHours = Rss::Channel::SkipHours.new - channel.skipHours = skipHours - @hours.each do |hour| - hour.to_rss(rss, skipHours.hours) - end - end - end - - class Hour < HourBase - def to_rss(rss, hours) - hour = Rss::Channel::SkipHours::Hour.new - set = setup_values(hour) - if set - hours << hour - setup_other_elements(rss) - end - end - - def have_required_values? - @content - end - end - end - - class Cloud < CloudBase - def to_rss(*args) - end - end - - class Categories < CategoriesBase - def to_rss(*args) - end - - class Category < CategoryBase - end - end - end - - class Image < ImageBase - def to_rss(rss) - image = Rss::Channel::Image.new - set = setup_values(image) - if set - image.link = link - rss.channel.image = image - setup_other_elements(rss) - end - end - - def have_required_values? - @url and @title and link - end - end - - class Items < ItemsBase - def to_rss(rss) - if rss.channel - normalize.each do |item| - item.to_rss(rss) - end - setup_other_elements(rss) - end - end - - class Item < ItemBase - def to_rss(rss) - item = Rss::Channel::Item.new - set = setup_values(item) - if set - rss.items << item - setup_other_elements(rss) - end - end - - private - def have_required_values? - @title and @link - end - - class Guid < GuidBase - def to_rss(*args) - end - end - - class Enclosure < EnclosureBase - def to_rss(*args) - end - end - - class Source < SourceBase - def to_rss(*args) - end - end - - class Categories < CategoriesBase - def to_rss(*args) - end - - class Category < CategoryBase - end - end - - end - end - - class Textinput < TextinputBase - def to_rss(rss) - textInput = Rss::Channel::TextInput.new - set = setup_values(textInput) - if set - rss.channel.textInput = textInput - setup_other_elements(rss) - end - end - - private - def have_required_values? - @title and @description and @name and @link - end - end - end - - add_maker(filename_to_version(__FILE__), RSS09) - add_maker(filename_to_version(__FILE__) + "1", RSS09) - end -end diff --git a/lib/rss/maker/1.0.rb b/lib/rss/maker/1.0.rb deleted file mode 100644 index e38a2f89e0..0000000000 --- a/lib/rss/maker/1.0.rb +++ /dev/null @@ -1,202 +0,0 @@ -require "rss/1.0" - -require "rss/maker/base" - -module RSS - module Maker - - class RSS10 < RSSBase - - def initialize - super("1.0") - end - - private - def make_rss - RDF.new(@version, @encoding, @standalone) - end - - def setup_elements(rss) - setup_channel(rss) - setup_image(rss) - setup_items(rss) - setup_textinput(rss) - end - - class Channel < ChannelBase - - def to_rss(rss) - set = false - if @about - channel = RDF::Channel.new(@about) - set = setup_values(channel) - if set - rss.channel = channel - setup_items(rss) - setup_image(rss) - setup_textinput(rss) - setup_other_elements(rss) - end - end - - if (!@about or !set) and variable_is_set? - raise NotSetError.new("maker.channel", not_set_required_variables) - end - end - - def have_required_values? - @about and @title and @link and @description - end - - private - def setup_items(rss) - items = RDF::Channel::Items.new - seq = items.Seq - @maker.items.normalize.each do |item| - seq.lis << RDF::Channel::Items::Seq::Li.new(item.link) - end - rss.channel.items = items - end - - def setup_image(rss) - if @maker.image.have_required_values? - rss.channel.image = RDF::Channel::Image.new(@maker.image.url) - end - end - - def setup_textinput(rss) - if @maker.textinput.have_required_values? - textinput = RDF::Channel::Textinput.new(@maker.textinput.link) - rss.channel.textinput = textinput - end - end - - def required_variable_names - %w(about title link description) - end - - class SkipDays < SkipDaysBase - def to_rss(*args) - end - - class Day < DayBase - end - end - - class SkipHours < SkipHoursBase - def to_rss(*args) - end - - class Hour < HourBase - end - end - - class Cloud < CloudBase - def to_rss(*args) - end - end - - class Categories < CategoriesBase - def to_rss(*args) - end - - class Category < CategoryBase - end - end - end - - class Image < ImageBase - def to_rss(rss) - if @url - image = RDF::Image.new(@url) - set = setup_values(image) - if set - rss.image = image - setup_other_elements(rss) - end - end - end - - def have_required_values? - @url and @title and link and @maker.channel.have_required_values? - end - - private - def variables - super + ["link"] - end - end - - class Items < ItemsBase - def to_rss(rss) - if rss.channel - normalize.each do |item| - item.to_rss(rss) - end - setup_other_elements(rss) - end - end - - class Item < ItemBase - def to_rss(rss) - if @link - item = RDF::Item.new(@link) - set = setup_values(item) - if set - rss.items << item - setup_other_elements(rss) - end - end - end - - def have_required_values? - @title and @link - end - - class Guid < GuidBase - def to_rss(*args) - end - end - - class Enclosure < EnclosureBase - def to_rss(*args) - end - end - - class Source < SourceBase - def to_rss(*args) - end - end - - class Categories < CategoriesBase - def to_rss(*args) - end - - class Category < CategoryBase - end - end - end - end - - class Textinput < TextinputBase - def to_rss(rss) - if @link - textinput = RDF::Textinput.new(@link) - set = setup_values(textinput) - if set - rss.textinput = textinput - setup_other_elements(rss) - end - end - end - - def have_required_values? - @title and @description and @name and @link and - @maker.channel.have_required_values? - end - end - end - - add_maker(filename_to_version(__FILE__), RSS10) - end -end diff --git a/lib/rss/maker/2.0.rb b/lib/rss/maker/2.0.rb deleted file mode 100644 index a958661614..0000000000 --- a/lib/rss/maker/2.0.rb +++ /dev/null @@ -1,168 +0,0 @@ -require "rss/2.0" - -require "rss/maker/0.9" - -module RSS - module Maker - - class RSS20 < RSS09 - - def initialize(rss_version="2.0") - super - end - - class Channel < RSS09::Channel - - def have_required_values? - @title and @link and @description - end - - def required_variable_names - %w(title link description) - end - - class SkipDays < RSS09::Channel::SkipDays - class Day < RSS09::Channel::SkipDays::Day - end - end - - class SkipHours < RSS09::Channel::SkipHours - class Hour < RSS09::Channel::SkipHours::Hour - end - end - - class Cloud < RSS09::Channel::Cloud - def to_rss(rss, channel) - cloud = Rss::Channel::Cloud.new - set = setup_values(cloud) - if set - channel.cloud = cloud - setup_other_elements(rss) - end - end - - def have_required_values? - @domain and @port and @path and - @registerProcedure and @protocol - end - end - - class Categories < RSS09::Channel::Categories - def to_rss(rss, channel) - @categories.each do |category| - category.to_rss(rss, channel) - end - end - - class Category < RSS09::Channel::Categories::Category - def to_rss(rss, channel) - category = Rss::Channel::Category.new - set = setup_values(category) - if set - channel.categories << category - setup_other_elements(rss) - end - end - - def have_required_values? - @content - end - end - end - - end - - class Image < RSS09::Image - end - - class Items < RSS09::Items - - class Item < RSS09::Items::Item - - def have_required_values? - @title or @description - end - - private - def variables - super + ["pubDate"] - end - - class Guid < RSS09::Items::Item::Guid - def to_rss(rss, item) - guid = Rss::Channel::Item::Guid.new - set = setup_values(guid) - if set - item.guid = guid - setup_other_elements(rss) - end - end - - def have_required_values? - @content - end - end - - class Enclosure < RSS09::Items::Item::Enclosure - def to_rss(rss, item) - enclosure = Rss::Channel::Item::Enclosure.new - set = setup_values(enclosure) - if set - item.enclosure = enclosure - setup_other_elements(rss) - end - end - - def have_required_values? - @url and @length and @type - end - end - - class Source < RSS09::Items::Item::Source - def to_rss(rss, item) - source = Rss::Channel::Item::Source.new - set = setup_values(source) - if set - item.source = source - setup_other_elements(rss) - end - end - - def have_required_values? - @url and @content - end - end - - class Categories < RSS09::Items::Item::Categories - def to_rss(rss, item) - @categories.each do |category| - category.to_rss(rss, item) - end - end - - class Category < RSS09::Items::Item::Categories::Category - def to_rss(rss, item) - category = Rss::Channel::Item::Category.new - set = setup_values(category) - if set - item.categories << category - setup_other_elements(rss) - end - end - - def have_required_values? - @content - end - end - end - end - - end - - class Textinput < RSS09::Textinput - end - end - - add_maker(filename_to_version(__FILE__), RSS20) - end -end diff --git a/lib/rss/maker/base.rb b/lib/rss/maker/base.rb deleted file mode 100644 index 93f668beff..0000000000 --- a/lib/rss/maker/base.rb +++ /dev/null @@ -1,522 +0,0 @@ -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) - subclass.const_set("OTHER_ELEMENTS", []) - subclass.const_set("NEED_INITIALIZE_VARIABLES", []) - - subclass.module_eval(<<-EOEOC, __FILE__, __LINE__) - def self.other_elements - const_get("OTHER_ELEMENTS") + super - end - - def self.need_initialize_variables - const_get("NEED_INITIALIZE_VARIABLES") + super - end - EOEOC - end - - def self.add_other_element(variable_name) - const_get("OTHER_ELEMENTS") << variable_name - end - - def self.other_elements - OTHER_ELEMENTS - end - - def self.add_need_initialize_variable(variable_name, init_value="nil") - const_get("NEED_INITIALIZE_VARIABLES") << [variable_name, init_value] - end - - def self.need_initialize_variables - NEED_INITIALIZE_VARIABLES - end - - def self.def_array_element(name) - include Enumerable - extend Forwardable - - def_delegators("@\#{name}", :<<, :[], :[]=, :first, :last) - def_delegators("@\#{name}", :push, :pop, :shift, :unshift) - def_delegators("@\#{name}", :each) - - add_need_initialize_variable(name, "[]") - end - EOC - end - - def initialize(maker) - @maker = maker - initialize_variables - end - - def have_required_values? - true - end - - private - def initialize_variables - self.class.need_initialize_variables.each do |variable_name, init_value| - instance_eval("@#{variable_name} = #{init_value}", __FILE__, __LINE__) - end - end - - def setup_other_elements(rss) - self.class.other_elements.each do |element| - __send__("setup_#{element}", rss, current_element(rss)) - end - end - - def setup_values(target) - set = false - if have_required_values? - variables.each do |var| - setter = "#{var}=" - if target.respond_to?(setter) - value = self.__send__(var) - if value - target.__send__(setter, value) - set = true - end - end - end - end - set - end - - def variables - self.class.need_initialize_variables.find_all do |name, init| - "nil" == init - end.collect do |name, init| - name - end - end - - def variable_is_set? - variables.find {|var| !__send__(var).nil?} - end - - 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 - - end - - class RSSBase - include Base - - class << self - def make(&block) - new.make(&block) - end - end - - %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 - def setup_#{element}(rss) - @#{element}.to_rss(rss) - end - - def make_#{element} - self.class::#{element[0,1].upcase}#{element[1..-1]}.new(self) - end -EOC - end - - attr_reader :rss_version - attr_accessor :version, :encoding, :standalone - - def initialize(rss_version) - super(self) - @rss_version = rss_version - @version = "1.0" - @encoding = "UTF-8" - @standalone = nil - end - - def make - if block_given? - yield(self) - to_rss - else - nil - end - end - - def to_rss - rss = make_rss - setup_xml_stylesheets(rss) - setup_elements(rss) - setup_other_elements(rss) - if rss.channel - rss - else - nil - end - end - - def current_element(rss) - rss - end - - private - remove_method :make_xml_stylesheets - def make_xml_stylesheets - XMLStyleSheets.new(self) - end - - end - - class XMLStyleSheets - include Base - - def_array_element("xml_stylesheets") - - def to_rss(rss) - @xml_stylesheets.each do |xss| - xss.to_rss(rss) - end - end - - def new_xml_stylesheet - xss = XMLStyleSheet.new(@maker) - @xml_stylesheets << xss - xss - end - - class XMLStyleSheet - include Base - - ::RSS::XMLStyleSheet::ATTRIBUTES.each do |attribute| - attr_accessor attribute - add_need_initialize_variable(attribute) - end - - def to_rss(rss) - xss = ::RSS::XMLStyleSheet.new - guess_type_if_need(xss) - set = setup_values(xss) - if set - rss.xml_stylesheets << xss - end - end - - def have_required_values? - @href and @type - end - - private - def guess_type_if_need(xss) - if @type.nil? - xss.href = @href - @type = xss.type - end - end - end - end - - class ChannelBase - include Base - - %w(cloud categories skipDays skipHours).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}(rss, current) - @#{element}.to_rss(rss, current) - end - - def make_#{element} - self.class::#{element[0,1].upcase}#{element[1..-1]}.new(@maker) - end -EOC - end - - %w(about title link description language copyright - managingEditor webMaster rating docs date - lastBuildDate generator ttl).each do |element| - attr_accessor element - add_need_initialize_variable(element) - end - - alias_method(:pubDate, :date) - alias_method(:pubDate=, :date=) - - def current_element(rss) - rss.channel - end - - class SkipDaysBase - include Base - - def_array_element("days") - - def new_day - day = self.class::Day.new(@maker) - @days << day - day - end - - def current_element(rss) - rss.channel.skipDays - end - - class DayBase - include Base - - %w(content).each do |element| - attr_accessor element - add_need_initialize_variable(element) - end - - def current_element(rss) - rss.channel.skipDays.last - end - - end - end - - class SkipHoursBase - include Base - - def_array_element("hours") - - def new_hour - hour = self.class::Hour.new(@maker) - @hours << hour - hour - end - - def current_element(rss) - rss.channel.skipHours - end - - class HourBase - include Base - - %w(content).each do |element| - attr_accessor element - add_need_initialize_variable(element) - end - - def current_element(rss) - rss.channel.skipHours.last - end - - end - end - - class CloudBase - include Base - - %w(domain port path registerProcedure protocol).each do |element| - attr_accessor element - add_need_initialize_variable(element) - end - - def current_element(rss) - rss.channel.cloud - end - - end - - class CategoriesBase - include Base - - def_array_element("categories") - - def new_category - category = self.class::Category.new(@maker) - @categories << category - category - end - - class CategoryBase - include Base - - %w(domain content).each do |element| - attr_accessor element - add_need_initialize_variable(element) - end - end - end - end - - class ImageBase - include Base - - %w(title url width height description).each do |element| - attr_accessor element - add_need_initialize_variable(element) - end - - def link - @maker.channel.link - end - - def current_element(rss) - rss.image - end - end - - class ItemsBase - include Base - - def_array_element("items") - - attr_accessor :do_sort, :max_size - - def initialize(maker) - super - @do_sort = false - @max_size = -1 - end - - def normalize - sort_if_need[0..@max_size] - end - - def current_element(rss) - rss.items - end - - def new_item - item = self.class::Item.new(@maker) - @items << item - item - end - - private - def sort_if_need - if @do_sort.respond_to?(:call) - @items.sort do |x, y| - @do_sort.call(x, y) - end - elsif @do_sort - @items.sort do |x, y| - y <=> x - end - else - @items - end - end - - class ItemBase - include Base - - %w(guid enclosure source categories).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}(rss, current) - @#{element}.to_rss(rss, current) - end - - def make_#{element} - self.class::#{element[0,1].upcase}#{element[1..-1]}.new(@maker) - end -EOC - end - - %w(title link description date author comments).each do |element| - attr_accessor element - add_need_initialize_variable(element) - end - - alias_method(:pubDate, :date) - alias_method(:pubDate=, :date=) - - def <=>(other) - if @date and other.date - @date <=> other.date - elsif @date - 1 - elsif other.date - -1 - else - 0 - end - end - - def current_element(rss) - rss.items.last - end - - class GuidBase - include Base - - %w(isPermaLink content).each do |element| - attr_accessor element - add_need_initialize_variable(element) - end - end - - class EnclosureBase - include Base - - %w(url length type).each do |element| - attr_accessor element - add_need_initialize_variable(element) - end - end - - class SourceBase - include Base - - %w(url content).each do |element| - attr_accessor element - add_need_initialize_variable(element) - end - end - - CategoriesBase = ChannelBase::CategoriesBase - - end - end - - class TextinputBase - include Base - - %w(title description name link).each do |element| - attr_accessor element - add_need_initialize_variable(element) - end - - def current_element(rss) - rss.textinput - end - - end - - end -end diff --git a/lib/rss/maker/content.rb b/lib/rss/maker/content.rb deleted file mode 100644 index 96f3ccb6d9..0000000000 --- a/lib/rss/maker/content.rb +++ /dev/null @@ -1,29 +0,0 @@ -require 'rss/content' -require 'rss/maker/1.0' - -module RSS - module Maker - module ContentModel - def self.append_features(klass) - super - - ::RSS::ContentModel::ELEMENTS.each do |element| - klass.add_need_initialize_variable(element) - klass.add_other_element(element) - klass.__send__(:attr_accessor, element) - klass.module_eval(<<-EOC, __FILE__, __LINE__) - def setup_#{element}(rss, current) - if #{element} and current.respond_to?(:#{element}=) - current.#{element} = @#{element} if @#{element} - end - end - EOC - end - end - end - - class ItemsBase - class ItemBase; include ContentModel; end - end - end -end diff --git a/lib/rss/maker/dublincore.rb b/lib/rss/maker/dublincore.rb deleted file mode 100644 index a9b8d58715..0000000000 --- a/lib/rss/maker/dublincore.rb +++ /dev/null @@ -1,47 +0,0 @@ -require 'rss/dublincore' -require 'rss/maker/1.0' - -module RSS - module Maker - module DublinCoreModel - def self.append_features(klass) - super - - ::RSS::DublinCoreModel::ELEMENTS.each do |element| - klass.add_need_initialize_variable(element) - klass.add_other_element(element) - klass.__send__(:attr_accessor, element) - klass.module_eval(<<-EOC, __FILE__, __LINE__) - def setup_#{element}(rss, current) - if #{element} and current.respond_to?(:#{element}=) - current.#{element} = #{element} - end - end -EOC - end - end - end - - class ChannelBase - include DublinCoreModel - - undef_method(:dc_date) - undef_method(:dc_date=) - alias_method(:dc_date, :date) - alias_method(:dc_date=, :date=) - end - - class ImageBase; include DublinCoreModel; end - class ItemsBase - class ItemBase - include DublinCoreModel - - undef_method(:dc_date) - undef_method(:dc_date=) - alias_method(:dc_date, :date) - alias_method(:dc_date=, :date=) - end - end - class TextinputBase; include DublinCoreModel; end - end -end diff --git a/lib/rss/maker/syndication.rb b/lib/rss/maker/syndication.rb deleted file mode 100644 index 72d00c63ea..0000000000 --- a/lib/rss/maker/syndication.rb +++ /dev/null @@ -1,27 +0,0 @@ -require 'rss/syndication' -require 'rss/maker/1.0' - -module RSS - module Maker - module SyndicationModel - def self.append_features(klass) - super - - ::RSS::SyndicationModel::ELEMENTS.each do |element| - klass.add_need_initialize_variable(element) - klass.add_other_element(element) - klass.__send__(:attr_accessor, element) - klass.module_eval(<<-EOC, __FILE__, __LINE__) - def setup_#{element}(rss, current) - if #{element} and current.respond_to?(:#{element}=) - current.#{element} = @#{element} if @#{element} - end - end - EOC - end - end - end - - class ChannelBase; include SyndicationModel; end - end -end diff --git a/lib/rss/maker/trackback.rb b/lib/rss/maker/trackback.rb deleted file mode 100644 index ef78bf2f20..0000000000 --- a/lib/rss/maker/trackback.rb +++ /dev/null @@ -1,126 +0,0 @@ -require 'rss/trackback' -require 'rss/maker/1.0' -require 'rss/maker/2.0' - -module RSS - module Maker - module TrackBackModel - def self.append_features(klass) - super - - name = "#{RSS::TRACKBACK_PREFIX}_ping" - klass.add_need_initialize_variable(name) - klass.add_other_element(name) - klass.__send__(:attr_accessor, name) - klass.module_eval(<<-EOC, __FILE__, __LINE__) - def setup_#{name}(rss, current) - if #{name} and current.respond_to?(:#{name}=) - current.#{name} = #{name} - end - end - EOC - - name = "#{RSS::TRACKBACK_PREFIX}_abouts" - klass.add_need_initialize_variable(name, "make_#{name}") - klass.add_other_element(name) - klass.__send__(:attr_accessor, name) - klass.module_eval(<<-EOC, __FILE__, __LINE__) - def make_#{name} - self.class::TrackBackAbouts.new(self) - end - - def setup_#{name}(rss, current) - @#{name}.to_rss(rss, current) - end - EOC - end - - class TrackBackAboutsBase - include Base - - def_array_element("abouts") - - def new_about - about = self.class::About.new(@maker) - @abouts << about - about - end - - def to_rss(rss, current) - @abouts.each do |about| - about.to_rss(rss, current) - end - end - - class AboutBase - include Base - - attr_accessor :value - add_need_initialize_variable(:value) - - alias_method(:resource, :value) - alias_method(:resource=, :value=) - alias_method(:content, :value) - alias_method(:content=, :value=) - - def have_required_values? - @value - end - - end - end - end - - class ItemsBase - class ItemBase; include TrackBackModel; end - end - - class RSS10 - class Items - class Item - class TrackBackAbouts < TrackBackAboutsBase - class About < AboutBase - def to_rss(rss, current) - if resource - about = ::RSS::TrackBackModel10::About.new(resource) - current.trackback_abouts << about - end - end - end - end - end - end - end - - class RSS09 - class Items - class Item - class TrackBackAbouts < TrackBackAboutsBase - def to_rss(*args) - end - class About < AboutBase - end - end - end - end - end - - class RSS20 - class Items - class Item - class TrackBackAbouts < TrackBackAboutsBase - class About < AboutBase - def to_rss(rss, current) - if content - about = ::RSS::TrackBackModel20::About.new(content) - current.trackback_abouts << about - end - end - end - end - end - end - end - - end -end diff --git a/lib/rss/parser.rb b/lib/rss/parser.rb deleted file mode 100644 index 1030c8f5d4..0000000000 --- a/lib/rss/parser.rb +++ /dev/null @@ -1,402 +0,0 @@ -require "forwardable" - -require "rss/rss" - -module RSS - - class NotWellFormedError < Error - attr_reader :line, :element - def initialize(line=nil, element=nil) - message = "This is not well formed XML" - if element or line - message << "\nerror occurred" - message << " in #{element}" if element - message << " at about #{line} line" if line - end - message << "\n#{yield}" if block_given? - super(message) - end - end - - class XMLParserNotFound < Error - def initialize - super("available XML parser does not found in " << - "#{AVAILABLE_PARSER_LIBRARIES.inspect}.") - end - end - - class NotValidXMLParser < Error - def initialize(parser) - super("#{parser} is not available XML parser. " << - "available XML parser is " << - "#{AVAILABLE_PARSERS.inspect}.") - end - end - - class NSError < InvalidRSSError - attr_reader :tag, :prefix, :uri - def initialize(tag, prefix, require_uri) - @tag, @prefix, @uri = tag, prefix, require_uri - super("prefix <#{prefix}> doesn't associate uri " << - "<#{require_uri}> in tag <#{tag}>") - end - end - - class Parser - - extend Forwardable - - class << self - - @@default_parser = nil - - def default_parser - @@default_parser || AVAILABLE_PARSERS.first - end - - def default_parser=(new_value) - if AVAILABLE_PARSERS.include?(new_value) - @@default_parser = new_value - else - raise NotValidXMLParser.new(new_value) - end - end - - def parse(rss, do_validate=true, ignore_unknown_element=true, parser_class=default_parser) - parser = new(rss, parser_class) - parser.do_validate = do_validate - parser.ignore_unknown_element = ignore_unknown_element - parser.parse - end - - end - - def_delegators(:@parser, :parse, :rss, - :ignore_unknown_element, - :ignore_unknown_element=, :do_validate, - :do_validate=) - - def initialize(rss, parser_class=self.class.default_parser) - @parser = parser_class.new(rss) - end - end - - class BaseParser - - def initialize(rss) - @listener = listener.new - @rss = rss - end - - def rss - @listener.rss - end - - def ignore_unknown_element - @listener.ignore_unknown_element - end - - def ignore_unknown_element=(new_value) - @listener.ignore_unknown_element = new_value - end - - def do_validate - @listener.do_validate - end - - def do_validate=(new_value) - @listener.do_validate = new_value - end - - def parse - if @listener.rss.nil? - _parse - end - @listener.rss - end - - end - - class BaseListener - - extend Utils - - class << self - - @@setter = {} - @@registered_uris = {} - - def install_setter(uri, tag_name, setter) - @@setter[uri] = {} unless @@setter.has_key?(uri) - @@setter[uri][tag_name] = setter - end - - def register_uri(name, uri) - @@registered_uris[name] = {} unless @@registered_uris.has_key?(name) - @@registered_uris[name][uri] = nil - end - - def uri_registered?(name, uri) - @@registered_uris[name].has_key?(uri) - end - - def setter(uri, tag_name) - begin - @@setter[uri][tag_name] - rescue NameError - nil - end - end - - def available_tags(uri) - begin - @@setter[uri].keys - rescue NameError - [] - end - end - - def install_get_text_element(name, uri, setter) - install_setter(uri, name, setter) - def_get_text_element(uri, name, *get_file_and_line_from_caller(1)) - end - - private - - def def_get_text_element(uri, name, file, line) - register_uri(name, uri) - unless private_instance_methods(false).include?("start_#{name}") - module_eval(<<-EOT, file, line) - def start_#{name}(name, prefix, attrs, ns) - uri = ns[prefix] - if self.class.uri_registered?(#{name.inspect}, uri) - if @do_validate - tags = self.class.available_tags(uri) - unless tags.include?(name) - raise UnknownTagError.new(name, uri) - end - end - start_get_text_element(name, prefix, ns, uri) - else - start_else_element(name, prefix, attrs, ns) - end - end - EOT - send("private", "start_#{name}") - end - end - - end - - end - - module ListenerMixin - - attr_reader :rss - - attr_accessor :ignore_unknown_element - attr_accessor :do_validate - - def initialize - @rss = nil - @ignore_unknown_element = true - @do_validate = true - @ns_stack = [{}] - @tag_stack = [[]] - @text_stack = [''] - @proc_stack = [] - @last_element = nil - @version = @encoding = @standalone = nil - @xml_stylesheets = [] - end - - def xmldecl(version, encoding, standalone) - @version, @encoding, @standalone = version, encoding, standalone - end - - def instruction(name, content) - if name == "xml-stylesheet" - params = parse_pi_content(content) - if params.has_key?("href") - @xml_stylesheets << XMLStyleSheet.new(*params) - end - end - end - - def tag_start(name, attributes) - @text_stack.push('') - - ns = @ns_stack.last.dup - attrs = {} - attributes.each do |n, v| - if n =~ /\Axmlns:?/ - ns[$POSTMATCH] = v - else - attrs[n] = v - end - end - @ns_stack.push(ns) - - prefix, local = split_name(name) - @tag_stack.last.push([ns[prefix], local]) - @tag_stack.push([]) - if respond_to?("start_#{local}", true) - send("start_#{local}", local, prefix, attrs, ns.dup) - else - start_else_element(local, prefix, attrs, ns.dup) - end - end - - def tag_end(name) - if DEBUG - p "end tag #{name}" - p @tag_stack - end - text = @text_stack.pop - tags = @tag_stack.pop - pr = @proc_stack.pop - pr.call(text, tags) unless pr.nil? - end - - def text(data) - @text_stack.last << data - end - - private - - CONTENT_PATTERN = /\s*([^=]+)=(["'])([^\2]+?)\2/ - def parse_pi_content(content) - params = {} - content.scan(CONTENT_PATTERN) do |name, quote, value| - params[name] = value - end - params - end - - def start_else_element(local, prefix, attrs, ns) - class_name = local[0,1].upcase << local[1..-1] - current_class = @last_element.class -# begin - if current_class.constants.include?(class_name) - next_class = current_class.const_get(class_name) - start_have_something_element(local, prefix, attrs, ns, next_class) -# rescue NameError - else - if @ignore_unknown_element - @proc_stack.push(nil) - else - parent = "ROOT ELEMENT???" - if current_class.tag_name - parent = current_class.tag_name - end - raise NotExceptedTagError.new(local, parent) - end - end - end - - NAMESPLIT = /^(?:([\w:][-\w\d.]*):)?([\w:][-\w\d.]*)/ - def split_name(name) - name =~ NAMESPLIT - [$1 || '', $2] - end - - def check_ns(tag_name, prefix, ns, require_uri) - if @do_validate - if ns[prefix] == require_uri - #ns.delete(prefix) - else - raise NSError.new(tag_name, prefix, require_uri) - end - end - end - - def start_get_text_element(tag_name, prefix, ns, required_uri) - @proc_stack.push Proc.new {|text, tags| - setter = self.class.setter(required_uri, tag_name) - setter ||= "#{tag_name}=" - if @last_element.respond_to?(setter) - @last_element.send(setter, text.to_s) - else - if @do_validate and not @ignore_unknown_element - raise NotExceptedTagError.new(tag_name, @last_element.tag_name) - end - end - } - end - - def start_have_something_element(tag_name, prefix, attrs, ns, klass) - - check_ns(tag_name, prefix, ns, klass.required_uri) - - args = [] - - klass.get_attributes.each do |a_name, a_uri, required| - - if a_uri.is_a?(String) or !a_uri.respond_to?(:include?) - a_uri = [a_uri] - end - unless a_uri == [nil] - for prefix, uri in ns - if a_uri.include?(uri) - val = attrs["#{prefix}:#{a_name}"] - break if val - end - end - end - if val.nil? and a_uri.include?(nil) - val = attrs[a_name] - end - - if @do_validate and required and val.nil? - unless a_uri.include?(nil) - for prefix, uri in ns - if a_uri.include?(uri) - a_name = "#{prefix}:#{a_name}" - end - end - end - raise MissingAttributeError.new(tag_name, a_name) - end - - args << val - end - - previous = @last_element - next_element = klass.send(:new, *args) - next_element.do_validate = @do_validate - prefix = "" - prefix << "#{klass.required_prefix}_" if klass.required_prefix - previous.__send__(:set_next_element, prefix, tag_name, next_element) - @last_element = next_element - @proc_stack.push Proc.new { |text, tags| - p(@last_element.class) if DEBUG - @last_element.content = text if klass.have_content? - @last_element.validate_for_stream(tags) if @do_validate - @last_element = previous - } - end - - end - - unless const_defined? :AVAILABLE_PARSER_LIBRARIES - AVAILABLE_PARSER_LIBRARIES = [ - ["rss/xmlparser", :XMLParserParser], - ["rss/xmlscanner", :XMLScanParser], - ["rss/rexmlparser", :REXMLParser], - ] - end - - AVAILABLE_PARSERS = [] - - AVAILABLE_PARSER_LIBRARIES.each do |lib, parser| - begin - require lib - AVAILABLE_PARSERS.push(const_get(parser)) - rescue LoadError - end - end - - if AVAILABLE_PARSERS.empty? - raise XMLParserNotFound - end -end diff --git a/lib/rss/rexmlparser.rb b/lib/rss/rexmlparser.rb deleted file mode 100644 index 73e352a731..0000000000 --- a/lib/rss/rexmlparser.rb +++ /dev/null @@ -1,47 +0,0 @@ -require "rexml/document" -require "rexml/streamlistener" - -/\A(\d+)\.(\d+)(?:\.\d+)+\z/ =~ REXML::Version -if ([$1.to_i, $2.to_i] <=> [2, 5]) < 0 - raise LoadError, "needs REXML 2.5 or later (#{REXML::Version})" -end - -module RSS - - class REXMLParser < BaseParser - - private - - def listener - REXMLListener - end - - def _parse - begin - REXML::Document.parse_stream(@rss, @listener) - rescue RuntimeError => e - raise NotWellFormedError.new{e.message} - rescue REXML::ParseException => e - context = e.context - line = context[0] if context - raise NotWellFormedError.new(line){e.message} - end - end - - end - - class REXMLListener < BaseListener - - include REXML::StreamListener - include ListenerMixin - - def xmldecl(version, encoding, standalone) - super(version, encoding, standalone == "yes") - # Encoding is converted to UTF-8 when REXML parse XML. - @encoding = 'UTF-8' - end - - alias_method(:cdata, :text) - end - -end diff --git a/lib/rss/rss.rb b/lib/rss/rss.rb deleted file mode 100644 index 11fe6d6dd1..0000000000 --- a/lib/rss/rss.rb +++ /dev/null @@ -1,858 +0,0 @@ -# Copyright (c) 2003-2004 Kouhei Sutou. You can redistribute it and/or -# modify it under the same terms as Ruby. -# -# Author:: Kouhei Sutou <kou@cozmixng.org> -# Tutorial:: http://www.cozmixng.org/~rwiki/?cmd=view;name=RSS+Parser%3A%3ATutorial.en - - -require "time" - -class Time - class << self - unless respond_to?(:w3cdtf) - def w3cdtf(date) - if /\A\s* - (-?\d+)-(\d\d)-(\d\d) - (?:T - (\d\d):(\d\d)(?::(\d\d))? - (\.\d+)? - (Z|[+-]\d\d:\d\d)?)? - \s*\z/ix =~ date and (($5 and $8) or (!$5 and !$8)) - datetime = [$1.to_i, $2.to_i, $3.to_i, $4.to_i, $5.to_i, $6.to_i] - datetime << $7.to_f * 1000000 if $7 - if $8 - Time.utc(*datetime) - zone_offset($8) - else - Time.local(*datetime) - end - else - raise ArgumentError.new("invalid date: #{date.inspect}") - end - end - end - end - - unless instance_methods.include?("w3cdtf") - alias w3cdtf iso8601 - end -end - -module Enumerable - unless instance_methods.include?("sort_by") - def sort_by - collect do |x| - [yield(x), x] - end.sort do |x, y| - x[0] <=> y[0] - end.collect! do |x| - x[1] - end - end - end -end - -require "English" -require "rss/utils" -require "rss/converter" -require "rss/xml-stylesheet" - -module RSS - - VERSION = "0.1.2" - - URI = "http://purl.org/rss/1.0/" - - DEBUG = false - - class Error < StandardError; end - - class OverlappedPrefixError < Error - attr_reader :prefix - def initialize(prefix) - @prefix = prefix - end - end - - class InvalidRSSError < Error; end - - class MissingTagError < InvalidRSSError - attr_reader :tag, :parent - def initialize(tag, parent) - @tag, @parent = tag, parent - super("tag <#{tag}> is missing in tag <#{parent}>") - end - end - - class TooMuchTagError < InvalidRSSError - attr_reader :tag, :parent - def initialize(tag, parent) - @tag, @parent = tag, parent - super("tag <#{tag}> is too much in tag <#{parent}>") - end - end - - class MissingAttributeError < InvalidRSSError - attr_reader :tag, :attribute - def initialize(tag, attribute) - @tag, @attribute = tag, attribute - super("attribute <#{attribute}> is missing in tag <#{tag}>") - end - end - - class UnknownTagError < InvalidRSSError - attr_reader :tag, :uri - def initialize(tag, uri) - @tag, @uri = tag, uri - super("tag <#{tag}> is unknown in namespace specified by uri <#{uri}>") - end - end - - class NotExceptedTagError < InvalidRSSError - attr_reader :tag, :parent - def initialize(tag, parent) - @tag, @parent = tag, parent - super("tag <#{tag}> is not expected in tag <#{parent}>") - end - end - - class NotAvailableValueError < InvalidRSSError - attr_reader :tag, :value - def initialize(tag, value) - @tag, @value = tag, value - super("value <#{value}> of tag <#{tag}> is not available.") - end - end - - class UnknownConversionMethodError < Error - attr_reader :to, :from - def initialize(to, from) - @to = to - @from = from - super("can't convert to #{to} from #{from}.") - end - end - # for backward compatibility - UnknownConvertMethod = UnknownConversionMethodError - - class ConversionError < Error - attr_reader :string, :to, :from - def initialize(string, to, from) - @string = string - @to = to - @from = from - super("can't convert #{@string} to #{to} from #{from}.") - end - end - - class NotSetError < Error - attr_reader :name, :variables - def initialize(name, variables) - @name = name - @variables = variables - super("required variables of #{@name} are not set: #{@variables.join(', ')}") - end - end - - module BaseModel - - include Utils - - def install_have_child_element(name) - add_need_initialize_variable(name) - - attr_accessor name - install_element(name) do |n, elem_name| - <<-EOC - if @#{n} - "\#{@#{n}.to_s(convert, indent)}" - else - '' - end -EOC - end - end - alias_method(:install_have_attribute_element, :install_have_child_element) - - def install_have_children_element(name, plural_name=nil) - plural_name ||= "#{name}s" - add_have_children_element(name, plural_name) - add_plural_form(name, plural_name) - - def_children_accessor(name, plural_name) - install_element(name, "s") do |n, elem_name| - <<-EOC - rv = [] - @#{n}.each do |x| - value = "\#{x.to_s(convert, indent)}" - rv << value if /\\A\\s*\\z/ !~ value - end - rv.join("\n") -EOC - end - end - - def install_text_element(name) - self::ELEMENTS << name - add_need_initialize_variable(name) - - attr_writer name - convert_attr_reader name - install_element(name) do |n, elem_name| - <<-EOC - if @#{n} - rv = "\#{indent}<#{elem_name}>" - value = html_escape(@#{n}) - if convert and @converter - rv << @converter.convert(value) - else - rv << value - end - rv << "</#{elem_name}>" - rv - else - '' - end -EOC - end - end - - def install_date_element(name, type, disp_name=name) - self::ELEMENTS << name - add_need_initialize_variable(name) - - # accessor - convert_attr_reader name - module_eval(<<-EOC, *get_file_and_line_from_caller(2)) - 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| - <<-EOC - if @#{n} - rv = "\#{indent}<#{elem_name}>" - value = html_escape(@#{n}.#{type}) - if convert and @converter - rv << @converter.convert(value) - else - rv << value - end - rv << "</#{elem_name}>" - rv - else - '' - end -EOC - end - - end - - private - def install_element(name, postfix="") - elem_name = name.sub('_', ':') - module_eval(<<-EOC, *get_file_and_line_from_caller(2)) - def #{name}_element#{postfix}(convert=true, indent='') - #{yield(name, elem_name)} - end - private :#{name}_element#{postfix} -EOC - end - - def convert_attr_reader(*attrs) - attrs.each do |attr| - attr = attr.id2name if attr.kind_of?(Integer) - module_eval(<<-EOC, *get_file_and_line_from_caller(2)) - def #{attr} - if @converter - @converter.convert(@#{attr}) - else - @#{attr} - end - end -EOC - end - end - - def def_children_accessor(accessor_name, plural_name) - module_eval(<<-EOC, *get_file_and_line_from_caller(2)) - def #{plural_name} - @#{accessor_name} - end - - def #{accessor_name}(*args) - if args.empty? - @#{accessor_name}.first - else - @#{accessor_name}.send("[]", *args) - end - end - - def #{accessor_name}=(*args) - warn("Warning:\#{caller.first.sub(/:in `.*'\z/, '')}: " \ - "Don't use `#{accessor_name} = XXX'/`set_#{accessor_name}(XXX)'. " \ - "Those APIs are not sense of Ruby. " \ - "Use `#{plural_name} << XXX' instead of them.") - if args.size == 1 - @#{accessor_name}.push(args[0]) - else - @#{accessor_name}.send("[]=", *args) - end - end - alias_method(:set_#{accessor_name}, :#{accessor_name}=) -EOC - end - - def def_content_only_to_s - module_eval(<<-EOC, *get_file_and_line_from_caller(2)) - def to_s(convert=true, indent=calc_indent) - if @content - rv = tag(indent) do |next_indent| - h(@content) - end - rv = @converter.convert(rv) if convert and @converter - rv - else - "" - end - end -EOC - end - - end - - class Element - - extend BaseModel - include Utils - - INDENT = " " - - class << self - - def inherited(klass) - klass.module_eval(<<-EOC) - public - - @tag_name = name.split(/::/).last - @tag_name[0,1] = @tag_name[0,1].downcase - @indent_size = name.split(/::/).size - 2 - - @@must_call_validators = {} - - def self.must_call_validators - @@must_call_validators - end - - def self.install_must_call_validator(prefix, uri) - @@must_call_validators[uri] = prefix - end - - @@model = [] - - def self.model - @@model - end - - def self.install_model(tag, occurs=nil) - if m = @@model.find {|t, o| t == tag} - m[1] = occurs - else - @@model << [tag, occurs] - end - end - - @@get_attributes = [] - - def self.get_attributes() - @@get_attributes - end - - def self.install_get_attribute(name, uri, required=true) - attr_writer name - convert_attr_reader name - @@get_attributes << [name, uri, required] - end - - @@have_content = false - - def self.content_setup - attr_writer :content - convert_attr_reader :content - def_content_only_to_s - @@have_content = true - end - - def self.have_content? - @@have_content - end - - @@have_children_elements = [] - - def self.have_children_elements - @@have_children_elements - end - - def self.add_have_children_element(variable_name, plural_name) - @@have_children_elements << [variable_name, plural_name] - end - - @@need_initialize_variables = [] - - def self.add_need_initialize_variable(variable_name) - @@need_initialize_variables << variable_name - end - - def self.need_initialize_variables - @@need_initialize_variables - end - - @@plural_forms = {} - - def self.add_plural_form(singular, plural) - @@plural_forms[singular] = plural - end - - def self.plural_forms - @@plural_forms - end - - EOC - end - - def required_prefix - nil - end - - def required_uri - nil - end - - def install_ns(prefix, uri) - if self::NSPOOL.has_key?(prefix) - raise OverlappedPrefixError.new(prefix) - end - self::NSPOOL[prefix] = uri - end - - def tag_name - @tag_name - end - - def indent_size - @indent_size - end - - end - - attr_accessor :do_validate - - def initialize(do_validate=true) - @converter = nil - @do_validate = do_validate - initialize_variables - end - - def tag_name - self.class.tag_name - end - - def full_name - tag_name - end - - def indent_size - self.class.indent_size - end - - def converter=(converter) - @converter = converter - children.each do |child| - child.converter = converter unless child.nil? - end - end - - def validate - validate_attribute - __validate - end - - def validate_for_stream(tags) - validate_attribute - __validate(tags, false) - end - - def setup_maker(maker) - target = maker_target(maker) - unless target.nil? - setup_maker_attributes(target) - setup_maker_element(target) - setup_maker_elements(target) - end - end - - private - def initialize_variables - self.class.need_initialize_variables.each do |variable_name| - instance_eval("@#{variable_name} = nil") - end - initialize_have_children_elements - @content = "" if self.class.have_content? - end - - def initialize_have_children_elements - self.class.have_children_elements.each do |variable_name, plural_name| - instance_eval("@#{variable_name} = []") - end - end - - def tag(indent, additional_attrs=[], &block) - next_indent = indent + INDENT - - attrs = collect_attrs - return "" if attrs.nil? - - attrs += additional_attrs - start_tag = make_start_tag(indent, next_indent, attrs) - - if block - content = block.call(next_indent) - else - content = [] - end - - if content.is_a?(String) - content = [content] - start_tag << ">" - end_tag = "</#{full_name}>" - else - content = content.reject{|x| x.empty?} - if content.empty? - end_tag = "/>" - else - start_tag << ">\n" - end_tag = "\n#{indent}</#{full_name}>" - end - end - - start_tag + content.join("\n") + end_tag - end - - def make_start_tag(indent, next_indent, attrs) - start_tag = ["#{indent}<#{full_name}"] - unless attrs.empty? - start_tag << attrs.collect do |key, value| - %Q[#{h key}="#{h value}"] - end.join("\n#{next_indent}") - end - start_tag.join(" ") - end - - def collect_attrs - _attrs.collect do |name, required, alias_name| - value = __send__(alias_name || name) - return nil if required and value.nil? - [name, value] - end.reject do |name, value| - value.nil? - end - end - - def tag_name_with_prefix(prefix) - "#{prefix}:#{tag_name}" - end - - def calc_indent - INDENT * (self.class.indent_size) - end - - def maker_target(maker) - nil - end - - def setup_maker_attributes(target) - end - - def setup_maker_element(target) - self.class.need_initialize_variables.each do |var| - setter = "#{var}=" - if target.respond_to?(setter) - target.__send__(setter, __send__(var)) - end - end - end - - def setup_maker_elements(parent) - self.class.have_children_elements.each do |name, plural_name| - real_name = name.sub(/^[^_]+_/, '') - if parent.respond_to?(plural_name) - target = parent.__send__(plural_name) - __send__(plural_name).each do |elem| - elem.__send__("setup_maker", target) - end - end - end - end - - def set_next_element(prefix, tag_name, next_element) - klass = next_element.class - prefix = "" - prefix << "#{klass.required_prefix}_" if klass.required_prefix - if self.class.plural_forms.has_key?(tag_name) - ary = __send__("#{prefix}#{self.class.plural_forms[tag_name]}") - ary << next_element - else - __send__("#{prefix}#{tag_name}=", next_element) - end - end - - # not String class children. - def children - [] - end - - # default #validate() argument. - def _tags - [] - end - - def _attrs - [] - end - - def __validate(tags=_tags, recursive=true) - if recursive - children.compact.each do |child| - child.validate - end - end - must_call_validators = self.class.must_call_validators - tags = tag_filter(tags.dup) - p tags if DEBUG - self.class::NSPOOL.each do |prefix, uri| - if tags.has_key?(uri) and !must_call_validators.has_key?(uri) - meth = "#{prefix}_validate" - send(meth, tags[uri]) if respond_to?(meth, true) - end - end - must_call_validators.each do |uri, prefix| - send("#{prefix}_validate", tags[uri]) - end - end - - def validate_attribute - _attrs.each do |a_name, required, alias_name| - if required and __send__(alias_name || a_name).nil? - raise MissingAttributeError.new(tag_name, a_name) - end - end - end - - def other_element(convert, indent='') - rv = [] - private_methods.each do |meth| - if /\A([^_]+)_[^_]+_elements?\z/ =~ meth and - self.class::NSPOOL.has_key?($1) - res = __send__(meth, convert) - rv << "#{indent}#{res}" if /\A\s*\z/ !~ res - end - end - rv.join("\n") - end - - def _validate(tags, model=self.class.model) - count = 1 - do_redo = false - not_shift = false - tag = nil - element_names = model.collect {|elem| elem[0]} - if tags - tags_size = tags.size - tags = tags.sort_by {|x| element_names.index(x) || tags_size} - end - - model.each_with_index do |elem, i| - - if DEBUG - p "before" - p tags - p elem - end - - if not_shift - not_shift = false - elsif tags - tag = tags.shift - end - - if DEBUG - p "mid" - p count - end - - case elem[1] - when '?' - if count > 2 - raise TooMuchTagError.new(elem[0], tag_name) - else - if elem[0] == tag - do_redo = true - else - not_shift = true - end - end - when '*' - if elem[0] == tag - do_redo = true - else - not_shift = true - end - when '+' - if elem[0] == tag - do_redo = true - else - if count > 1 - not_shift = true - else - raise MissingTagError.new(elem[0], tag_name) - end - end - else - if elem[0] == tag - if model[i+1] and model[i+1][0] != elem[0] and - tags and tags.first == elem[0] - raise TooMuchTagError.new(elem[0], tag_name) - end - else - raise MissingTagError.new(elem[0], tag_name) - end - end - - if DEBUG - p "after" - p not_shift - p do_redo - p tag - end - - if do_redo - do_redo = false - count += 1 - redo - else - count = 1 - end - - end - - if !tags.nil? and !tags.empty? - raise NotExceptedTagError.new(tag, tag_name) - end - - end - - def tag_filter(tags) - rv = {} - tags.each do |tag| - rv[tag[0]] = [] unless rv.has_key?(tag[0]) - rv[tag[0]].push(tag[1]) - end - rv - end - - end - - module RootElementMixin - - include XMLStyleSheetMixin - - attr_reader :output_encoding - - def initialize(rss_version, version=nil, encoding=nil, standalone=nil) - super() - @rss_version = rss_version - @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 setup_maker(maker) - maker.version = version - maker.encoding = encoding - maker.standalone = standalone - - xml_stylesheets.each do |xss| - xss.setup_maker(maker) - end - - setup_maker_elements(maker) - end - - private - def tag(indent, attrs, &block) - rv = xmldecl + xml_stylesheet_pi - rv << super(indent, attrs, &block) - rv - end - - def xmldecl - rv = %Q[<?xml version="#{@version}"] - if @output_encoding or @encoding - rv << %Q[ encoding="#{@output_encoding or @encoding}"] - end - rv << %Q[ standalone="yes"] if @standalone - rv << "?>\n" - rv - end - - def ns_declarations - self.class::NSPOOL.collect do |prefix, uri| - prefix = ":#{prefix}" unless prefix.empty? - ["xmlns#{prefix}", uri] - end - end - - def setup_maker_elements(maker) - channel.setup_maker(maker) if channel - image.setup_maker(maker) if image - textinput.setup_maker(maker) if textinput - items.each do |item| - item.setup_maker(maker) - end - end - end - -end diff --git a/lib/rss/syndication.rb b/lib/rss/syndication.rb deleted file mode 100644 index c274ff8c82..0000000000 --- a/lib/rss/syndication.rb +++ /dev/null @@ -1,85 +0,0 @@ -require "rss/1.0" - -module RSS - - SY_PREFIX = 'sy' - SY_URI = "http://purl.org/rss/1.0/modules/syndication/" - - RDF.install_ns(SY_PREFIX, SY_URI) - - module SyndicationModel - - extend BaseModel - - ELEMENTS = [] - - def self.append_features(klass) - super - - klass.module_eval(<<-EOC, *get_file_and_line_from_caller(1)) - %w(updatePeriod updateFrequency).each do |x| - install_text_element("\#{SY_PREFIX}_\#{x}") - end - - %w(updateBase).each do |x| - install_date_element("\#{SY_PREFIX}_\#{x}", 'w3cdtf', x) - end - - alias_method(:_sy_updatePeriod=, :sy_updatePeriod=) - def sy_updatePeriod=(new_value) - new_value = new_value.strip - validate_sy_updatePeriod(new_value) if @do_validate - self._sy_updatePeriod = new_value - end - - alias_method(:_sy_updateFrequency=, :sy_updateFrequency=) - def sy_updateFrequency=(new_value) - validate_sy_updateFrequency(new_value) if @do_validate - self._sy_updateFrequency = new_value.to_i - end - EOC - end - - def sy_validate(tags) - counter = {} - ELEMENTS.each do |x| - counter[x] = 0 - end - - tags.each do |tag| - key = "#{SY_PREFIX}_#{tag}" - raise UnknownTagError.new(tag, SY_URI) unless counter.has_key?(key) - counter[key] += 1 - raise TooMuchTagError.new(tag, tag_name) if counter[key] > 1 - end - end - - private - SY_UPDATEPERIOD_AVAILABLE_VALUES = %w(hourly daily weekly monthly yearly) - def validate_sy_updatePeriod(value) - unless SY_UPDATEPERIOD_AVAILABLE_VALUES.include?(value) - raise NotAvailableValueError.new("updatePeriod", value) - end - end - - SY_UPDATEFREQUENCY_AVAILABLE_RE = /\A\s*\+?\d+\s*\z/ - def validate_sy_updateFrequency(value) - value = value.to_s.strip - if SY_UPDATEFREQUENCY_AVAILABLE_RE !~ value - raise NotAvailableValueError.new("updateFrequency", value) - end - end - - end - - class RDF - class Channel; include SyndicationModel; end - end - - prefix_size = SY_PREFIX.size + 1 - SyndicationModel::ELEMENTS.uniq! - SyndicationModel::ELEMENTS.each do |x| - BaseListener.install_get_text_element(x[prefix_size..-1], SY_URI, "#{x}=") - end - -end diff --git a/lib/rss/taxonomy.rb b/lib/rss/taxonomy.rb deleted file mode 100644 index bec6ea3c17..0000000000 --- a/lib/rss/taxonomy.rb +++ /dev/null @@ -1,32 +0,0 @@ -# Experimental - -require "rss/1.0" - -module RSS - - TAXO_PREFIX = "taxo" - TAXO_NS = "http://purl.org/rss/1.0/modules/taxonomy/" - - Element.install_ns(TAXO_PREFIX, TAXO_NS) - - TAXO_ELEMENTS = [] - - %w(link).each do |x| - if const_defined? :Listener - Listener.install_get_text_element(x, TAXO_NS, "#{TAXO_PREFIX}_#{x}=") - end - TAXO_ELEMENTS << "#{TAXO_PREFIX}_#{x}" - end - - module TaxonomyModel - attr_writer(*%w(title description creator subject publisher - contributor date format identifier source - language relation coverage rights).collect{|x| "#{TAXO_PREFIX}_#{x}"}) - end - - class Channel; extend TaxonomyModel; end - class Item; extend TaxonomyModel; end - class Image; extend TaxonomyModel; end - class TextInput; extend TaxonomyModel; end - -end diff --git a/lib/rss/trackback.rb b/lib/rss/trackback.rb deleted file mode 100644 index 8bc1ee5ad5..0000000000 --- a/lib/rss/trackback.rb +++ /dev/null @@ -1,298 +0,0 @@ -require 'rss/1.0' -require 'rss/2.0' - -module RSS - - TRACKBACK_PREFIX = 'trackback' - TRACKBACK_URI = 'http://madskills.com/public/xml/rss/module/trackback/' - - RDF.install_ns(TRACKBACK_PREFIX, TRACKBACK_URI) - Rss.install_ns(TRACKBACK_PREFIX, TRACKBACK_URI) - - module TrackBackUtils - 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) - counter = {} - %w(ping about).each do |x| - counter["#{TRACKBACK_PREFIX}_#{x}"] = 0 - end - - tags.each do |tag| - key = "#{TRACKBACK_PREFIX}_#{tag}" - raise UnknownTagError.new(tag, TRACKBACK_URI) unless counter.has_key?(key) - counter[key] += 1 - if tag != "about" and counter[key] > 1 - raise TooMuchTagError.new(tag, tag_name) - end - end - - if counter["#{TRACKBACK_PREFIX}_ping"].zero? and - counter["#{TRACKBACK_PREFIX}_about"].nonzero? - raise MissingTagError.new("#{TRACKBACK_PREFIX}:ping", tag_name) - end - end - end - - module BaseTrackBackModel - def append_features(klass) - super - - unless klass.class == Module - klass.__send__(:include, TrackBackUtils) - - %w(ping).each do |x| - var_name = "#{TRACKBACK_PREFIX}_#{x}" - klass_name = x.capitalize - klass.install_have_child_element(var_name) - klass.module_eval(<<-EOC, __FILE__, __LINE__) - remove_method :#{var_name} - def #{var_name} - @#{var_name} and @#{var_name}.value - end - - remove_method :#{var_name}= - def #{var_name}=(value) - @#{var_name} = new_with_value_if_need(#{klass_name}, value) - end - EOC - end - - [%w(about s)].each do |name, postfix| - var_name = "#{TRACKBACK_PREFIX}_#{name}" - klass_name = name.capitalize - klass.install_have_children_element(var_name) - klass.module_eval(<<-EOC, __FILE__, __LINE__) - remove_method :#{var_name} - def #{var_name}(*args) - if args.empty? - @#{var_name}.first and @#{var_name}.first.value - else - ret = @#{var_name}.send("[]", *args) - if ret.is_a?(Array) - ret.collect {|x| x.value} - else - ret.value - end - end - end - - remove_method :#{var_name}= - remove_method :set_#{var_name} - def #{var_name}=(*args) - if args.size == 1 - item = new_with_value_if_need(#{klass_name}, args[0]) - @#{var_name}.push(item) - else - new_val = args.last - if new_val.is_a?(Array) - new_val = new_value.collect do |val| - new_with_value_if_need(#{klass_name}, val) - end - else - new_val = new_with_value_if_need(#{klass_name}, new_val) - end - @#{var_name}.send("[]=", *(args[0..-2] + [new_val])) - end - end - alias set_#{var_name} #{var_name}= - EOC - end - end - end - end - - module TrackBackModel10 - extend BaseModel - extend BaseTrackBackModel - - class Ping < Element - include RSS10 - - class << self - - def required_prefix - TRACKBACK_PREFIX - end - - def required_uri - TRACKBACK_URI - end - - end - - [ - ["resource", ::RSS::RDF::URI, true] - ].each do |name, uri, required| - install_get_attribute(name, uri, required) - end - - alias_method(:value, :resource) - alias_method(:value=, :resource=) - - def initialize(resource=nil) - super() - @resource = resource - end - - def full_name - tag_name_with_prefix(TRACKBACK_PREFIX) - end - - def to_s(convert=true, indent=calc_indent) - rv = tag(indent) - rv = @converter.convert(rv) if convert and @converter - rv - end - - private - def _attrs - [ - ["#{::RSS::RDF::PREFIX}:resource", true, "resource"], - ] - end - - end - - class About < Element - include RSS10 - - class << self - - def required_prefix - TRACKBACK_PREFIX - end - - def required_uri - TRACKBACK_URI - end - - end - - [ - ["resource", ::RSS::RDF::URI, true] - ].each do |name, uri, required| - install_get_attribute(name, uri, required) - end - - alias_method(:value, :resource) - alias_method(:value=, :resource=) - - def initialize(resource=nil) - super() - @resource = resource - end - - def full_name - tag_name_with_prefix(TRACKBACK_PREFIX) - end - - def to_s(convert=true, indent=calc_indent) - rv = tag(indent) - rv = @converter.convert(rv) if convert and @converter - rv - end - - private - def _attrs - [ - ["#{::RSS::RDF::PREFIX}:resource", true, "resource"], - ] - end - - def maker_target(abouts) - abouts.new_about - end - - def setup_maker_attributes(about) - about.resource = self.resource - end - - end - end - - module TrackBackModel20 - extend BaseModel - extend BaseTrackBackModel - - class Ping < Element - include RSS09 - - content_setup - - class << self - - def required_prefix - TRACKBACK_PREFIX - end - - def required_uri - TRACKBACK_URI - end - - end - - alias_method(:value, :content) - alias_method(:value=, :content=) - - def initialize(content=nil) - super() - @content = content - end - - def full_name - tag_name_with_prefix(TRACKBACK_PREFIX) - end - - end - - class About < Element - include RSS09 - - content_setup - - class << self - - def required_prefix - TRACKBACK_PREFIX - end - - def required_uri - TRACKBACK_URI - end - - end - - alias_method(:value, :content) - alias_method(:value=, :content=) - - def initialize(content=nil) - super() - @content = content - end - - def full_name - tag_name_with_prefix(TRACKBACK_PREFIX) - end - - end - end - - class RDF - class Item; include TrackBackModel10; end - end - - class Rss - class Channel - class Item; include TrackBackModel20; end - end - end - -end diff --git a/lib/rss/utils.rb b/lib/rss/utils.rb deleted file mode 100644 index 1c30ae74bc..0000000000 --- a/lib/rss/utils.rb +++ /dev/null @@ -1,17 +0,0 @@ -module RSS - - module Utils - - def get_file_and_line_from_caller(i=0) - file, line, = caller[i].split(':') - [file, line.to_i] - end - - def html_escape(s) - s.to_s.gsub(/&/, "&").gsub(/\"/, """).gsub(/>/, ">").gsub(/</, "<") - end - alias h html_escape - - end - -end diff --git a/lib/rss/xml-stylesheet.rb b/lib/rss/xml-stylesheet.rb deleted file mode 100644 index 05602eee9b..0000000000 --- a/lib/rss/xml-stylesheet.rb +++ /dev/null @@ -1,101 +0,0 @@ -require "rss/utils" - -module RSS - - module XMLStyleSheetMixin - attr_accessor :xml_stylesheets - def initialize(*args) - super - @xml_stylesheets = [] - end - - private - def xml_stylesheet_pi - xsss = @xml_stylesheets.collect do |xss| - pi = xss.to_s - pi = nil if /\A\s*\z/ =~ pi - pi - end.compact - xsss.push("") unless xsss.empty? - xsss.join("\n") - end - end - - class XMLStyleSheet - - include Utils - - ATTRIBUTES = %w(href type title media charset alternate) - - GUESS_TABLE = { - "xsl" => "text/xsl", - "css" => "text/css", - } - - attr_accessor(*ATTRIBUTES) - attr_accessor(:do_validate) - def initialize(*attrs) - @do_validate = true - ATTRIBUTES.each do |attr| - self.send("#{attr}=", nil) - end - vars = ATTRIBUTES.dup - vars.unshift(:do_validate) - attrs.each do |name, value| - if vars.include?(name.to_s) - self.send("#{name}=", value) - end - end - end - - def to_s - rv = "" - if @href - rv << %Q[<?xml-stylesheet] - ATTRIBUTES.each do |name| - if self.send(name) - rv << %Q[ #{name}="#{h self.send(name)}"] - end - end - rv << %Q[?>] - end - rv - end - - remove_method(:href=) - def href=(value) - @href = value - if @href and @type.nil? - @type = guess_type(@href) - end - @href - end - - remove_method(:alternate=) - def alternate=(value) - if value.nil? or /\A(?:yes|no)\z/ =~ value - @alternate = value - else - if @do_validate - args = ["?xml-stylesheet?", %Q[alternate="#{value}"]] - raise NotAvailableValueError.new(*args) - end - end - @alternate - end - - def setup_maker(maker) - xss = maker.xml_stylesheets.new_xml_stylesheet - ATTRIBUTES.each do |attr| - xss.__send__("#{attr}=", __send__(attr)) - end - end - - private - def guess_type(filename) - /\.([^.]+)$/ =~ filename - GUESS_TABLE[$1] - end - - end -end diff --git a/lib/rss/xmlparser.rb b/lib/rss/xmlparser.rb deleted file mode 100644 index 64737b821b..0000000000 --- a/lib/rss/xmlparser.rb +++ /dev/null @@ -1,91 +0,0 @@ -begin - require "xml/parser" -rescue LoadError - require "xmlparser" -end - -begin - require "xml/encoding-ja" -rescue LoadError - require "xmlencoding-ja" - if defined?(Kconv) - module XMLEncoding_ja - class SJISHandler - include Kconv - end - end - end -end - -module XML - class Parser - unless defined?(Error) - Error = ::XMLParserError - end - end -end - -module RSS - - class REXMLLikeXMLParser < ::XML::Parser - - include ::XML::Encoding_ja - - def listener=(listener) - @listener = listener - end - - def startElement(name, attrs) - @listener.tag_start(name, attrs) - end - - def endElement(name) - @listener.tag_end(name) - end - - def character(data) - @listener.text(data) - end - - def xmlDecl(version, encoding, standalone) - @listener.xmldecl(version, encoding, standalone == 1) - end - - def processingInstruction(target, content) - @listener.instruction(target, content) - end - - end - - class XMLParserParser < BaseParser - - private - def listener - XMLParserListener - end - - def _parse - begin - parser = REXMLLikeXMLParser.new - parser.listener = @listener - parser.parse(@rss) - rescue ::XML::Parser::Error => e - raise NotWellFormedError.new(parser.line){e.message} - end - end - - end - - class XMLParserListener < BaseListener - - include ListenerMixin - - def xmldecl(version, encoding, standalone) - super - # Encoding is converted to UTF-8 when XMLParser parses XML. - @encoding = 'UTF-8' - end - - end - -end diff --git a/lib/rss/xmlscanner.rb b/lib/rss/xmlscanner.rb deleted file mode 100644 index c5a11bad18..0000000000 --- a/lib/rss/xmlscanner.rb +++ /dev/null @@ -1,102 +0,0 @@ -require 'xmlscan/scanner' - -module RSS - - class XMLScanParser < BaseParser - - private - def listener - XMLScanListener - end - - def _parse - begin - XMLScan::XMLScanner.new(@listener).parse(@rss) - rescue XMLScan::Error => e - raise NotWellFormedError.new(e.lineno){e.message} - end - end - - end - - class XMLScanListener < BaseListener - - include XMLScan::Visitor - include ListenerMixin - - ENTITIES = { - 'lt' => '<', - 'gt' => '>', - 'amp' => '&', - 'quot' => '"', - 'apos' => '\'' - } - - def on_xmldecl_version(str) - @version = str - end - - def on_xmldecl_encoding(str) - @encoding = str - end - - def on_xmldecl_standalone(str) - @standalone = str - end - - def on_xmldecl_end - xmldecl(@version, @encoding, @standalone == "yes") - end - - alias_method(:on_pi, :instruction) - alias_method(:on_chardata, :text) - alias_method(:on_cdata, :text) - - def on_etag(name) - tag_end(name) - end - - def on_entityref(ref) - text(ENTITIES[ref]) - end - - def on_charref(code) - text([code].pack('U')) - end - - alias_method(:on_charref_hex, :on_charref) - - def on_stag(name) - @attrs = {} - end - - def on_attribute(name) - @attrs[name] = @current_attr = '' - end - - def on_attr_value(str) - @current_attr << str - end - - def on_attr_entityref(ref) - @current_attr << ENTITIES[ref] - end - - def on_attr_charref(code) - @current_attr << [code].pack('U') - end - - alias_method(:on_attr_charref_hex, :on_attr_charref) - - def on_stag_end(name) - tag_start(name, @attrs) - end - - def on_stag_end_empty(name) - tag_start(name, @attrs) - tag_end(name) - end - - end - -end |
