1 module vibelog.rss;
2 
3 import vibe.stream.stream;
4 import vibe.http.common : toRFC822DateTimeString;
5 
6 import std.datetime;
7 
8 
9 class RssFeed {
10 	RssChannel[] channels;
11 
12 	void render(OutputStream dst)
13 	{
14 		dst.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n", false);
15 		dst.write("<rss version=\"2.0\">\n", false);
16 		foreach( ch; channels )
17 			ch.render(dst);
18 		dst.write("</rss>\n", false);
19 	}
20 }
21 
22 class RssChannel {
23 	string title;
24 	string link;
25 	string description;
26 	string language = "en-us";
27 	string copyright;
28 	SysTime pubDate;
29 
30 	string imageTitle;
31 	string imageUrl;
32 	string imageLink;
33 
34 	RssEntry[] entries;
35 
36 	void render(OutputStream dst)
37 	{
38 		dst.write("\t<channel>\n", false);
39 		dst.write("\t\t<title>", false); dst.write(title, false); dst.write("</title>\n", false);
40 		dst.write("\t\t<link>", false); dst.write(link, false); dst.write("</link>\n", false);
41 		dst.write("\t\t<description>", false); dst.write(description, false); dst.write("</description>\n", false);
42 		dst.write("\t\t<language>", false); dst.write(language, false); dst.write("</language>\n", false);
43 		dst.write("\t\t<copyright>", false); dst.write(copyright, false); dst.write("</copyright>\n", false);
44 		dst.write("\t\t<pubDate>", false); dst.write(toRFC822DateTimeString(pubDate), false); dst.write("</pubDate>\n", false);
45 		if( imageUrl.length ){
46 			dst.write("\t\t<image>\n", false);
47 			dst.write("\t\t\t<url>", false); dst.write(imageUrl, false); dst.write("</url>\n", false);
48 			dst.write("\t\t\t<title>", false); dst.write(imageTitle, false); dst.write("</title>\n", false);
49 			dst.write("\t\t\t<link>", false); dst.write(imageLink, false); dst.write("</link>\n", false);
50 			dst.write("\t\t</image>\n", false);
51 		}
52 		foreach( e; entries )
53 			e.render(dst);
54 		dst.write("\t</channel>\n", false);
55 	}
56 }
57 
58 class RssEntry {
59 	string title;
60 	string description;
61 	string link;
62 	string language = "en-us";
63 	string author;
64 	string guid;
65 	SysTime pubDate;
66 
67 	void render(OutputStream dst)
68 	{
69 		dst.write("\t\t<item>\n", false);
70 		dst.write("\t\t\t<title>", false); dst.write(title, false); dst.write("</title>\n", false);
71 		dst.write("\t\t\t<description>", false); dst.write(description, false); dst.write("</description>\n", false);
72 		dst.write("\t\t\t<link>", false); dst.write(link, false); dst.write("</link>\n", false);
73 		dst.write("\t\t\t<author>", false); dst.write(author, false); dst.write("</author>\n", false);
74 		dst.write("\t\t\t<guid>", false); dst.write(guid, false); dst.write("</guid>\n", false);
75 		dst.write("\t\t\t<pubDate>", false); dst.write(toRFC822DateTimeString(pubDate), false); dst.write("</pubDate>\n", false);
76 		dst.write("\t\t</item>\n", false);
77 	}
78 }