summaryrefslogtreecommitdiff
path: root/lib/rss/xml-stylesheet.rb
blob: 7862c4f278a408edeb15f5f18105d7cfa6e0096d (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
82
83
84
85
86
87
88
89
90
91
92
93
94
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

		private
		def guess_type(filename)
			/\.([^.]+)/ =~ filename
			GUESS_TABLE[$1]
		end

	end
end