summaryrefslogtreecommitdiff
path: root/lib/rss/dublincore.rb
blob: 4b5daf507658f817bd1771083f01c9eb02457bf1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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.included(mod)
			mod.module_eval(<<-EOC)
				%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}", 'iso8601', 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