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