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 }