1require "rss/1.0"
2require "rss/dublincore"
3
4module RSS
5
6  TAXO_PREFIX = "taxo"
7  TAXO_URI = "http://purl.org/rss/1.0/modules/taxonomy/"
8
9  RDF.install_ns(TAXO_PREFIX, TAXO_URI)
10
11  TAXO_ELEMENTS = []
12
13  %w(link).each do |name|
14    full_name = "#{TAXO_PREFIX}_#{name}"
15    BaseListener.install_get_text_element(TAXO_URI, name, full_name)
16    TAXO_ELEMENTS << "#{TAXO_PREFIX}_#{name}"
17  end
18
19  %w(topic topics).each do |name|
20    class_name = Utils.to_class_name(name)
21    BaseListener.install_class_name(TAXO_URI, name, "Taxonomy#{class_name}")
22    TAXO_ELEMENTS << "#{TAXO_PREFIX}_#{name}"
23  end
24
25  module TaxonomyTopicsModel
26    extend BaseModel
27
28    def self.append_features(klass)
29      super
30
31      klass.install_must_call_validator(TAXO_PREFIX, TAXO_URI)
32      %w(topics).each do |name|
33        klass.install_have_child_element(name, TAXO_URI, "?",
34                                         "#{TAXO_PREFIX}_#{name}")
35      end
36    end
37
38    class TaxonomyTopics < Element
39      include RSS10
40
41      Bag = ::RSS::RDF::Bag
42
43      class << self
44        def required_prefix
45          TAXO_PREFIX
46        end
47
48        def required_uri
49          TAXO_URI
50        end
51      end
52
53      @tag_name = "topics"
54
55      install_have_child_element("Bag", RDF::URI, nil)
56      install_must_call_validator('rdf', RDF::URI)
57
58      def initialize(*args)
59        if Utils.element_initialize_arguments?(args)
60          super
61        else
62          super()
63          self.Bag = args[0]
64        end
65        self.Bag ||= Bag.new
66      end
67
68      def full_name
69        tag_name_with_prefix(TAXO_PREFIX)
70      end
71
72      def maker_target(target)
73        target.taxo_topics
74      end
75
76      def resources
77        if @Bag
78          @Bag.lis.collect do |li|
79            li.resource
80          end
81        else
82          []
83        end
84      end
85    end
86  end
87
88  module TaxonomyTopicModel
89    extend BaseModel
90
91    def self.append_features(klass)
92      super
93      var_name = "#{TAXO_PREFIX}_topic"
94      klass.install_have_children_element("topic", TAXO_URI, "*", var_name)
95    end
96
97    class TaxonomyTopic < Element
98      include RSS10
99
100      include DublinCoreModel
101      include TaxonomyTopicsModel
102
103      class << self
104        def required_prefix
105          TAXO_PREFIX
106        end
107
108        def required_uri
109          TAXO_URI
110        end
111      end
112
113      @tag_name = "topic"
114
115      install_get_attribute("about", ::RSS::RDF::URI, true, nil, nil,
116                            "#{RDF::PREFIX}:about")
117      install_text_element("link", TAXO_URI, "?", "#{TAXO_PREFIX}_link")
118
119      def initialize(*args)
120        if Utils.element_initialize_arguments?(args)
121          super
122        else
123          super()
124          self.about = args[0]
125        end
126      end
127
128      def full_name
129        tag_name_with_prefix(TAXO_PREFIX)
130      end
131
132      def maker_target(target)
133        target.new_taxo_topic
134      end
135    end
136  end
137
138  class RDF
139    include TaxonomyTopicModel
140    class Channel
141      include TaxonomyTopicsModel
142    end
143    class Item; include TaxonomyTopicsModel; end
144  end
145end
146