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 }