]> cat aescling's git repositories - mastodon.git/blob - app/lib/rss_builder.rb
Exclude unlisted, private and direct toots from affecting trends (#7686)
[mastodon.git] / app / lib / rss_builder.rb
1 # frozen_string_literal: true
2
3 class RSSBuilder
4 class ItemBuilder
5 def initialize
6 @item = Ox::Element.new('item')
7 end
8
9 def title(str)
10 @item << (Ox::Element.new('title') << str)
11
12 self
13 end
14
15 def link(str)
16 @item << Ox::Element.new('guid').tap do |guid|
17 guid['isPermalink'] = 'true'
18 guid << str
19 end
20
21 @item << (Ox::Element.new('link') << str)
22
23 self
24 end
25
26 def pub_date(date)
27 @item << (Ox::Element.new('pubDate') << date.to_formatted_s(:rfc822))
28
29 self
30 end
31
32 def description(str)
33 @item << (Ox::Element.new('description') << str)
34
35 self
36 end
37
38 def enclosure(url, type, size)
39 @item << Ox::Element.new('enclosure').tap do |enclosure|
40 enclosure['url'] = url
41 enclosure['length'] = size
42 enclosure['type'] = type
43 end
44
45 self
46 end
47
48 def to_element
49 @item
50 end
51 end
52
53 def initialize
54 @document = Ox::Document.new(version: '1.0')
55 @channel = Ox::Element.new('channel')
56
57 @document << (rss << @channel)
58 end
59
60 def title(str)
61 @channel << (Ox::Element.new('title') << str)
62
63 self
64 end
65
66 def link(str)
67 @channel << (Ox::Element.new('link') << str)
68
69 self
70 end
71
72 def image(str)
73 @channel << Ox::Element.new('image').tap do |image|
74 image << (Ox::Element.new('url') << str)
75 image << (Ox::Element.new('title') << '')
76 image << (Ox::Element.new('link') << '')
77 end
78
79 @channel << (Ox::Element.new('webfeeds:icon') << str)
80
81 self
82 end
83
84 def cover(str)
85 @channel << Ox::Element.new('webfeeds:cover').tap do |cover|
86 cover['image'] = str
87 end
88
89 self
90 end
91
92 def logo(str)
93 @channel << (Ox::Element.new('webfeeds:logo') << str)
94
95 self
96 end
97
98 def accent_color(str)
99 @channel << (Ox::Element.new('webfeeds:accentColor') << str)
100
101 self
102 end
103
104 def description(str)
105 @channel << (Ox::Element.new('description') << str)
106
107 self
108 end
109
110 def item
111 @channel << ItemBuilder.new.tap do |item|
112 yield item
113 end.to_element
114
115 self
116 end
117
118 def to_xml
119 ('<?xml version="1.0" encoding="UTF-8"?>' + Ox.dump(@document, effort: :tolerant)).force_encoding('UTF-8')
120 end
121
122 private
123
124 def rss
125 Ox::Element.new('rss').tap do |rss|
126 rss['version'] = '2.0'
127 rss['xmlns:webfeeds'] = 'http://webfeeds.org/rss/1.0'
128 end
129 end
130 end
This page took 0.1129 seconds and 4 git commands to generate.