summaryrefslogtreecommitdiff
path: root/lib/rss/syndication.rb
blob: 74bfbac8e1ce85a932e92968c6560306e4268aec (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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
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 = []
		
		%w(updatePeriod updateFrequency).each do |x|
			install_text_element("#{SY_PREFIX}_#{x}")
    end

		%w(updateBase).each do |x|
			install_date_element("#{SY_PREFIX}_#{x}", 'iso8601', x)
    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


		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)
			new_value = new_value.strip
			validate_sy_updateFrequency(new_value) if @do_validate
			self._sy_updateFrequency = new_value.to_i
		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)
			if SY_UPDATEFREQUENCY_AVAILABLE_RE !~ value
				raise NotAvailableValueError.new("updateFrequency", value)
			end
		end

	end

	class RDF
		class Channel; include SyndicationModel; end
	end

	if const_defined? :BaseListener
		prefix_size = SY_PREFIX.size + 1
		SyndicationModel::ELEMENTS.each do |x|
			BaseListener.install_get_text_element(x[prefix_size..-1], SY_URI, "#{x}=")
		end
	end

end